home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / snobol / v311.sil < prev    next >
Text File  |  1986-07-29  |  245KB  |  6,581 lines

  1.        TITLE   'Table of Contents'
  2. *
  3. *
  4. *           E32 (DECEMBER 18, 1969)                V3.7
  5. *           UPDATED TO VERSION 3.10, NOV. 1, 1972        V3.10
  6. *
  7. *           UPDATED TO VERSION 3.11, MAY 19, 1975.        V3.11
  8. *           RESEQUENCED DECEMBER 20, 1980.            V3.11
  9. *           Corrected April 10, 1985 (lines 3393 and 5033).
  10. *      1.   Linkage and Equivalences 
  11. *           Linkage 
  12. *           Machine Dependent Parameters
  13. *           Constants 
  14. *           Equivalences
  15. *           Data Type Codes 
  16. *      2.   Program Initialization 
  17. *      3.   Compilation and Interpreter Invocation 
  18. *      4.   Support Procedures 
  19. *           AUGATL
  20. *           CODSKP
  21. *           DTREP 
  22. *           FINDEX
  23. *      5.   Storage Allocation and Regeneration Procedures 
  24. *           BLOCK 
  25. *           GENVAR
  26. *           GNVARI
  27. *           CONVAR
  28. *           GNVARS
  29. *           GC
  30. *           GCM 
  31. *           SPLIT 
  32. *      6.   Compilation Procedures 
  33. *           BINOP 
  34. *           CMPILE
  35. *           ELEMNT
  36. *           EXPR
  37. *           FORWRD
  38. *           NEWCRD
  39. *           TREPUB
  40. *           UNOP
  41. *      7.   Interpreter Executive and Control Procedures 
  42. *           BASE
  43. *           GOTG
  44. *           GOTL
  45. *           GOTO
  46. *           INIT
  47. *           INTERP
  48. *           INVOKE
  49. *      8.   Argument Evaluation Procedures 
  50. *           ARGVAL
  51. *           EXPVAL
  52. *           EXPEVL
  53. *           EVAL
  54. *           INTVAL
  55. *           PATVAL
  56. *           VARVAL
  57. *           XYARGS
  58. *      9.   Arithmetic Operations, Predicates and Functions
  59. *           ADD 
  60. *           DIV 
  61. *           EXP 
  62. *           MPY 
  63. *           SUB 
  64. *           EQ
  65. *           GE
  66. *           GT
  67. *           LE
  68. *           LT
  69. *           NE
  70. *           REMDR 
  71. *           INTGER
  72. *           MNS 
  73. *           PLS 
  74. *      10.   Pattern-Valued Functions and Operations 
  75. *           ANY 
  76. *           BREAK 
  77. *           NOTANY
  78. *           SPAN
  79. *           LEN 
  80. *           POS 
  81. *           RPOS
  82. *           RTAB
  83. *           TAB 
  84. *           ARBNO 
  85. *           ATOP (Cursor Position)
  86. *           NAM (Value Assignment)
  87. *           OR
  88. *      11.  Pattern Matching Procedures
  89. *           SCAN
  90. *           SJSR (Scan and Replace) 
  91. *           SCNR (Basic Scanner)
  92. *           ANYC
  93. *           BRKC
  94. *           NNYC
  95. *           SPNC
  96. *           LNTH
  97. *           POSI
  98. *           RPSI
  99. *           RTB 
  100. *           TB
  101. *           ARBN (ARBNO)
  102. *           FARB (ARB Backup) 
  103. *           ATP (Cursor Position) 
  104. *           BAL 
  105. *           CHAR
  106. *           STAR (Unevaluated Expression) 
  107. *           DSAR
  108. *           FNCE
  109. *           NME (Value Assignment)
  110. *           ENME
  111. *           DNME
  112. *           ENMI (Immediate Value Assignment) 
  113. *           SUCE (SUCCEED)
  114. *      12.  Defined Functions
  115. *           DEFINE
  116. *           DEFFNC (Invoke Defined Function)
  117. *      13.  External Functions 
  118. *           LOAD
  119. *           UNLOAD
  120. *           LNKFNC (Link to External Function)
  121. *      14.  Arrays, Tables, and Defined Data Objects 
  122. *           ARRAY 
  123. *           ASSOC (TABLE) 
  124. *           DATDEF (DATA) 
  125. *           PROTO 
  126. *           ITEM (Array and Table References) 
  127. *           DEFDAT (Create Data Object) 
  128. *           FIELD 
  129. *      15.  Input and Output 
  130. *           READ (INPUT)
  131. *           PRINT (OUTPUT)
  132. *           BKSPCE
  133. *           ENFILE
  134. *           REWIND
  135. *           DETACH
  136. *           PUTIN 
  137. *           PUTOUT
  138. *      16.  Tracing Procedures and Functions 
  139. *           TRACE 
  140. *           STOPTR
  141. *           FENTR (Call Tracing)
  142. *           FENTR2
  143. *           KEYTR 
  144. *           TRPHND (Trace Handler)
  145. *           VALTR 
  146. *           FNEXT2
  147. *      17.  Other Operations 
  148. *           ASGN (=)
  149. *           CON (Concatenation) 
  150. *           IND (Indirect Reference)
  151. *           KEYWRD
  152. *           LIT 
  153. *           NAME
  154. *           NMD (Value Assignment)
  155. *           STR (Unevaluated Expression)
  156. *      18.  Other Predicates 
  157. *           DIFFER
  158. *           IDENT 
  159. *           LGT 
  160. *           NEG 
  161. *           QUES (?)
  162. *      19.  Other Functions
  163. *           APPLY 
  164. *           ARG 
  165. *           LOCAL 
  166. *           FIELDS
  167. *           CLEAR 
  168. *           COLECT
  169. *           COPY
  170. *           CNVRT 
  171. *           DATE
  172. *           DT
  173. *           DMP 
  174. *           DUMP
  175. *           DUPL
  176. *           OPSYN 
  177. *           RPLACE
  178. *           SIZE
  179. *           TIME
  180. *           TRIM
  181. *      20.  Common Code
  182. *      21.  Termination
  183. *           END 
  184. *           FTLEND
  185. *           SYSCUT
  186. *      22.  Error Handling 
  187. *      23.  Data 
  188. *           Pair Lists
  189. *           Data Type Pairs 
  190. *           Switches
  191. *           Constants 
  192. *           Pointers to Patterns
  193. *           Function Descriptors
  194. *           Miscellaneous Data
  195. *           Program Pointers
  196. *           Pointers to Specifiers
  197. *           Permanent Pair List Pointers
  198. *           Specifiers for Compilation
  199. *           Strings and Specifiers
  200. *           Character Buffers 
  201. *           Pointers to Pair Lists
  202. *           Scratch Descriptors 
  203. *           System Descriptors
  204. *           Compiler Descriptors
  205. *           Data Pointers 
  206. *           Specifiers
  207. *           Allocator Data
  208. *           Machine Dependent Data
  209. *           Function Table
  210. *           Function Pair List
  211. *           Function Initialization Data
  212. *           Pointers to Initialization Data 
  213. *           System Arrays 
  214. *           String Storage Bin List 
  215. *           Pattern-Matching History List 
  216. *           System Stack
  217. *           Primitive Patterns
  218. *           Code Skeleton for TRACE 
  219. *           Fatal Error Message Pointers
  220. *           Fatal Error Messages
  221. *           Compiler Error Messages 
  222. *           Formats 
  223. *
  224.        TITLE   'Linkage and Equivalences'
  225.        COPY    MLINK           Linkage segment
  226.        COPY    PARMS           Machine-dependent parameters
  227. *
  228. *      Constants
  229. *
  230. ATTRIB EQU     2*DESCR           Offset of label in string structure
  231. LNKFLD EQU     3*DESCR           Offset of link in string structure
  232. BCDFLD EQU     4*DESCR           Offset of string in string structure
  233. FATHER EQU     DESCR           Offset of father in code node
  234. LSON   EQU     2*DESCR           Offset of left son in code node
  235. RSIB   EQU     3*DESCR           Offset of right sibling in code node
  236. CODE   EQU     4*DESCR           Offset of code in code node
  237. ESASIZ EQU     50           Limit on number of syntactic errors
  238. FBLKSZ EQU     10*DESCR        Size of function descriptor block
  239. ARRLEN EQU     20           Limit on length of array print image
  240. CARDSZ EQU     80           Width of compiler input
  241. SEQSIZ EQU     8           Width of sequence field
  242. STNOSZ EQU     8           Length of statement number field
  243. DSTSZ  EQU     2*STNOSZ        Space for left and right numbering
  244. CNODSZ EQU     4*DESCR           Size of code node
  245. DATSIZ EQU     1000           Limit on number of defined data type
  246. EXTSIZ EQU     10           Default allocation for tables
  247. NAMLSZ EQU     20           Growth quantum for name list
  248. NODESZ EQU     3*DESCR           Size of pattern node
  249. OBSIZ  EQU     256           Number of bin headers
  250. OBARY  EQU     OBSIZ+3           Total number for bins
  251. OCASIZ EQU     1500           Descriptors of initial object code
  252. SPDLSZ EQU     1000           Descriptors of pattern stack
  253. STSIZE EQU     1000           Descriptors of interpreter stack
  254. SPDR   EQU     SPEC+DESCR       Descriptor plus specifier
  255. OBOFF  EQU     OBSIZ-2           Offset length in bins
  256. SPDLDR EQU     SPDLSZ*DESCR       Size of pattern stack
  257. *
  258. *      Equivalences
  259. *
  260. ARYTYP EQU     7           Array reference
  261. CLNTYP EQU     5           Goto field
  262. CMATYP EQU     2           Comma
  263. CMTTYP EQU     2           Comment card
  264. CNTTYP EQU     4           Continue card
  265. CTLTYP EQU     3           Control card
  266. DIMTYP EQU     1           Dimension separator
  267. EOSTYP EQU     6           End of statement
  268. EQTYP  EQU     4           Equal sign
  269. FGOTYP EQU     3           Failure goto
  270. FTOTYP EQU     6           Failure direct goto
  271. FLITYP EQU     6           Literal real
  272. FNCTYP EQU     5           Function call
  273. ILITYP EQU     2           Literal integer
  274. LPTYP  EQU     1           Left parenthesis
  275. NBTYP  EQU     1           Nonbreak character
  276. NEWTYP EQU     1           New statement
  277. NSTTYP EQU     4           Parenthesized expression
  278. QLITYP EQU     1           Quoted literal
  279. RBTYP  EQU     7           Right bracket
  280. RPTYP  EQU     3           Right parenthesis
  281. SGOTYP EQU     2           Success goto
  282. STOTYP EQU     5           Success direct goto
  283. UGOTYP EQU     1           Unconditional goto
  284. UTOTYP EQU     4           Unconditional direct goto
  285. VARTYP EQU     3           Variable
  286. *
  287. *      Data type Codes
  288. *
  289. A      EQU     4           ARRAY
  290. B      EQU     2           BLOCK (internal)
  291. C      EQU     8           CODE
  292. E      EQU     11           EXPRESSION
  293. I      EQU     6           INTEGER
  294. K      EQU     10           KEYWORD (NAME)
  295. L      EQU     12           LINKED STRING (internal)
  296. N      EQU     9           NAME
  297. P      EQU     3           PATTERN
  298. R      EQU     7           REAL
  299. S      EQU     1           STRING
  300. T      EQU     5           TABLE
  301. *---------------------------------------------------------------------*
  302.        TITLE   'Program Initialization'
  303. BEGIN  INIT    ,           Initialize system
  304.        ISTACK  ,           Initialize stack
  305.        OUTPUT  OUTPUT,TITLEF       Title listing
  306.        OUTPUT  OUTPUT,SOURCF       Print attribution
  307.        MSTIME  TIMECL           Time in compiler
  308.        RCALL   SCBSCL,BLOCK,OCALIM Allocate block for object code
  309.        MOVD    OCSVCL,SCBSCL       Save object code pointer
  310.        RESETF  SCBSCL,PTR       Clear pointer flag
  311.        GETSIZ  YCL,INITLS       Get size of initialization list
  312. SPCNVT GETD    XPTR,INITLS,YCL       Get pointer to list
  313.        GETSIZ  XCL,XPTR        Get size of list
  314. SPCNV1 GETD    ZPTR,XPTR,XCL       Get pointer to specifier
  315.        AEQLC   ZPTR,0,,SPCNV2       Skip dummy zero entries
  316.        RCALL   ZPTR,GENVAR,ZPTR    Convert specifier to structure
  317.        PUTD    XPTR,XCL,ZPTR       Replace pointer to specifier
  318. SPCNV2 DECRA   XCL,2*DESCR       Decrement to next pair
  319.        ACOMPC  XCL,0,SPCNV1       Continue if one remains
  320.        DECRA   YCL,DESCR       Decrement to next list
  321.        ACOMPC  YCL,0,SPCNVT       Continue if one remains
  322. INITD1 GETDC   XPTR,INITB,0       Get specifier to convert
  323.        RCALL   YPTR,GENVAR,(XPTR)  Convert it to string structure
  324.        GETDC   ZPTR,INITB,DESCR    Get location to put it
  325.        PUTDC   ZPTR,0,YPTR       Place pointer to string structure
  326.        INCRA   INITB,2*DESCR       Decrement to next pair
  327.        ACOMP   INITB,INITE,,,INITD1
  328. *                   Compare with end
  329. *
  330.        PUTDC   ABRTKY,DESCR,ABOPAT Initial value of ABORT
  331.        PUTDC   ARBKY,DESCR,ARBPAT  Initial value of ARB
  332.        PUTDC   BALKY,DESCR,BALPAT  Initial value of BAL
  333.        PUTDC   FAILKY,DESCR,FALPAT Initial value of FAIL
  334.        PUTDC   FNCEKY,DESCR,FNCPAT Initial value of FENCE
  335.        PUTDC   REMKY,DESCR,REMPAT  Initial value of REM
  336.        PUTDC   SUCCKY,DESCR,SUCPAT Initial value of SUCCEED
  337. *
  338.        SETAC   VARSYM,0        Set count of variables to zero
  339.        RCALL   NBSPTR,BLOCK,NMOVER Allocate block for value assignment
  340.        MOVD    CMBSCL,SCBSCL       Set up pointer for compiler
  341.        MOVD    UNIT,INPUT       Set up input unit
  342.        MOVD    OCBSCL,CMBSCL       Project base for interpreter
  343.        SUM     OCLIM,CMBSCL,OCALIM Compute end of code block
  344.        DECRA   OCLIM,5*DESCR       Leave room for overflow
  345.        SETAC   INICOM,1        SIGNAL COMPLETION        E3.10.6
  346.        BRANCH  XLATRN
  347. *_
  348. *---------------------------------------------------------------------*
  349.        TITLE   'Compilation and Interpreter Invocation'
  350. XLATRD AEQLC   LISTCL,0,,XLATRN    Skip print if list is off
  351.        STPRNT  IOKEY,OUTBLK,LNBFSP Print line image
  352. XLATRN STREAD  INBFSP,UNIT,XLATRN,COMP5
  353.        SETSP   TEXTSP,NEXTSP       Read card and set up line
  354.        STREAM  XSP,TEXTSP,CARDTB,COMP3,COMP3
  355. *                   Determine type of card
  356.        RCALL   ,NEWCRD,,(XLATRD,,) Process card type
  357. XLATNX RCALL   ,CMPILE,,(COMP3,,XLATNX)
  358. *                   Compile statement
  359.        INCRA   CMOFCL,DESCR       Increment offset
  360.        PUTD    CMBSCL,CMOFCL,ENDCL Insert END function
  361.        AEQLC   LISTCL,0,,XLATP       Skip print if list is off
  362.        STPRNT  IOKEY,OUTBLK,LNBFSP Print last line image
  363. XLATP  AEQLC   STYPE,EOSTYP,,XLAEND
  364. *                   Finish on end of statement
  365.        STREAM  XSP,TEXTSP,IBLKTB,COMP3,XLAEND
  366. *                   Analyze END card
  367.        AEQLC   STYPE,EOSTYP,,XLAEND
  368. *                   Finish on end of statement
  369.        AEQLC   STYPE,NBTYP,COMP7   Error if break character
  370.        STREAM  XSP,TEXTSP,LBLTB,COMP7,COMP7
  371. *                   Analyze END label
  372.        RCALL   XPTR,GENVAR,(XSPPTR)
  373. *                   Generate variable for label
  374.        GETDC   OCBSCL,XPTR,ATTRIB  Get start for interpreter
  375.        AEQLC   OCBSCL,0,,COMP7       Error if not attribute
  376.        AEQLC   STYPE,EOSTYP,,XLAEND
  377. *                   Finish on end of statement
  378.        STREAM  XSP,TEXTSP,IBLKTB,COMP7,,COMP7
  379. *                   Analyze remainder of card
  380. XLAEND AEQLC   ESAICL,0,,XLATSC    Were there any compilation errors?
  381.        OUTPUT  OUTPUT,ERRCF       Print message of errors
  382.        BRANCH  XLATND
  383. *_
  384. XLATSC OUTPUT  OUTPUT,SUCCF       Print message of no errors
  385. XLATND SETAC   UNIT,0           Reset input unit
  386.        SETAC   LPTR,0           Reset last label pointer
  387.        SETAC   OCLIM,0           Reset limit on object code
  388.        ZERBLK  COMREG,COMDCT       Clear compiler descriptors
  389.        SUM     XCL,CMBSCL,CMOFCL   Compute end of object code
  390.        RCALL   ,SPLIT,(XCL)       Split of unused part of block
  391.        SETAC   LISTCL,0        Turn off listing switch
  392.        MSTIME  ETMCL           Time out compiler
  393.        SUBTRT  TIMECL,ETMCL,TIMECL Compute elapsed time
  394.        SETAC   CNSLCL,1        Permit label redefinition
  395.        RCALL   ,INTERP,,(MAIN1,MAIN1,MAIN1)
  396. *                   Call interpreter
  397. *_
  398. *---------------------------------------------------------------------*
  399.        TITLE   'Support Procedures'
  400. *
  401. *      Augmentation of Pair Lists
  402. *
  403. AUGATL PROC    ,           Procedure to augment pair lists
  404.        POP     (A1PTR,A2PTR,A3PTR) List, type and value
  405.        LOCAPT  A4PTR,A1PTR,ZEROCL,AUG1
  406. *                   Look for hole in list
  407.        PUTDC   A4PTR,DESCR,A2PTR   Insert type descriptor
  408.        PUTDC   A4PTR,2*DESCR,A3PTR Insert value descriptor
  409.        MOVD    A5PTR,A1PTR       Set up return pointer
  410.        BRANCH  A5RTN           Return pair list
  411. *_
  412. AUG1   GETSIZ  A4PTR,A1PTR       Get size of present list
  413.        INCRA   A4PTR,2*DESCR       Add two more descriptors
  414.        SETVC   A4PTR,B           Insert BLOCK data type
  415.        RCALL   A5PTR,BLOCK,A4PTR   Allocate new block
  416.        PUTD    A5PTR,A4PTR,A3PTR   Insert value descriptor at end
  417.        DECRA   A4PTR,DESCR       Decrement
  418.        PUTD    A5PTR,A4PTR,A2PTR   Insert type descriptor above
  419. AUGMOV DECRA   A4PTR,DESCR       Adjust size
  420.        MOVBLK  A5PTR,A1PTR,A4PTR   Copy old list at top
  421.        BRANCH  A5RTN           Return new list
  422. *_
  423. *---------------------------------------------------------------------*
  424. *
  425. *      Code Skipping Procedure
  426. *
  427. CODSKP PROC    ,           Procedure to skip object code
  428.        POP     YCL           Restore number of items to skip
  429. CODCNT INCRA   OCICL,DESCR       Increment offset
  430.        GETD    XCL,OCBSCL,OCICL    Get object code descriptor
  431.        TESTF   XCL,FNC,,CODFNC       Check for function
  432. CODECR DECRA   YCL,1           Count down
  433.        ACOMPC  YCL,0,CODCNT,RTN1,INTR10
  434. *                   Check for end
  435. *_
  436. CODFNC PUSH    YCL           Save number to skip
  437.        SETAV   YCL,XCL           Get arguments to skip
  438.        RCALL   ,CODSKP,(YCL)       Call self recursively
  439.        POP     YCL           Restore number to skip
  440.        BRANCH  CODECR           Go around again
  441. *_
  442. *---------------------------------------------------------------------*
  443. *
  444. *      Data Type Representation
  445. *
  446. DTREP  PROC    ,           Procedure to represent data type
  447.        POP     A2PTR           Restore object
  448.        VEQLC   A2PTR,A,,DTARRY       Is is ARRAY?
  449.        VEQLC   A2PTR,T,,DTABLE       Is it TABLE?
  450.        VEQLC   A2PTR,R,DTREP1       Is it REAL?
  451.        REALST  DPSP,A2PTR       Convert REAL to STRING
  452.        BRANCH  DTREPR           Join end processing
  453. *_
  454. DTARRY GETDC   A3PTR,A2PTR,DESCR   Get prototype
  455.        LOCSP   ZSP,A3PTR       Get specifier
  456.        GETLG   A3PTR,ZSP       Get length
  457.        ACOMPC  A3PTR,ARRLEN,DTREP1 Check for excessive length
  458.        SETLC   DTARSP,0        Clear specifier
  459.        APDSP   DTARSP,ARRSP       Append ARRAY
  460.        APDSP   DTARSP,LPRNSP       Append '('
  461.        APDSP   DTARSP,QTSP       Append quote
  462.        APDSP   DTARSP,ZSP       Append prototype
  463.        APDSP   DTARSP,QTSP       Append quote
  464. DTARTB APDSP   DTARSP,RPRNSP       Append ')'
  465.        SETSP   DPSP,DTARSP       Move specifier
  466.        BRANCH  DTREPR           Return
  467. *_
  468. DTABLE GETSIZ  A3PTR,A2PTR                    E3.2.3
  469.        GETD    A1PTR,A2PTR,A3PTR                E3.2.3
  470.        DECRA   A3PTR,DESCR                    E3.2.3
  471.        GETD    A2PTR,A2PTR,A3PTR                E3.2.3
  472. DTABL1 AEQLC   A1PTR,1,,DTABL2                    E3.2.3
  473.        SUM     A3PTR,A3PTR,A2PTR                E3.2.3
  474.        DECRA   A3PTR,2*DESCR                    E3.2.3
  475.        GETD    A1PTR,A1PTR,A2PTR                E3.2.3
  476.        BRANCH  DTABL1                        E3.2.3
  477. *_                                E3.2.3
  478. DTABL2 DECRA   A3PTR,DESCR                    E3.2.3
  479.        DECRA   A2PTR,2*DESCR                    E3.2.3
  480.        DIVIDE  A3PTR,A3PTR,DSCRTW  Divide to get item count
  481.        INTSPC  ZSP,A3PTR       Convert to string
  482.        SETLC   DTARSP,0        Clear specifier
  483.        APDSP   DTARSP,ASSCSP       Append TABLE
  484.        APDSP   DTARSP,LPRNSP       Append '('
  485.        APDSP   DTARSP,ZSP       Append size
  486.        APDSP   DTARSP,CMASP       Append comma
  487.        DIVIDE  A2PTR,A2PTR,DSCRTW                E3.2.3
  488.        INTSPC  ZSP,A2PTR                    E3.2.3
  489.        APDSP   DTARSP,ZSP       Append extent
  490.        BRANCH  DTARTB           Join common processing
  491. *_
  492. DTREP1 MOVV    DT1CL,A2PTR       Insert data type
  493.        LOCAPT  A3PTR,DTATL,DT1CL,DTREPE
  494. *                   Look for data type name
  495.        GETDC   A3PTR,A3PTR,2*DESCR Get data type name
  496.        LOCSP   DPSP,A3PTR       Get specifier
  497. DTREPR RRTURN  DPSPTR,1        Return pointer to specifier
  498. *_
  499. DTREPE SETSP   DPSP,EXDTSP       Set up EXTERNAL specifier
  500.        BRANCH  DTREPR           Return
  501. *_
  502. *---------------------------------------------------------------------*
  503. *
  504. *      Location of Function Descriptor
  505. *
  506. FINDEX PROC    ,           Procedure to get function descriptor
  507.        POP     F1PTR           Restore name
  508.        LOCAPV  F2PTR,FNCPL,F1PTR,FATNF
  509. *                   Look for function pair
  510.        GETDC   F2PTR,F2PTR,DESCR   Get function descriptor
  511. FATBAK RRTURN  F2PTR,1           Return
  512. *_
  513. FATNF  INCRA   NEXFCL,2*DESCR       Increment function block offset
  514.        ACOMPC  NEXFCL,FBLKSZ,FATBLK
  515. *                   Check for end
  516. FATNXT SUM     F2PTR,FBLOCK,NEXFCL Compute position
  517.        RCALL   FNCPL,AUGATL,(FNCPL,F2PTR,F1PTR)
  518. *                   Augment function pair list
  519.        PUTDC   F2PTR,0,UNDFCL       Insert undefined function
  520.        PUTDC   F2PTR,DESCR,F1PTR   Insert name
  521.        BRANCH  FATBAK           Join return
  522. *_
  523. FATBLK RCALL   FBLOCK,BLOCK,FBLKRQ Allocate new function block
  524.        SETF    FBLOCK,FNC       Insert function flag
  525.        SETVC   FBLOCK,0        Clear data type
  526.        SETAC   NEXFCL,DESCR       Initialize offset
  527.        BRANCH  FATNXT           Join processing
  528. *_
  529. *---------------------------------------------------------------------*
  530.        TITLE   'Storage Allocation and Regeneration Procedures'
  531. *
  532. *      Allocation of Block
  533. *
  534. BLOCK  PROC    ,           Procedure to allocate blocks
  535.        POP     ARG1CL           Restore size to allocate
  536.        ACOMP   ARG1CL,SIZLMT,SIZERR,SIZERR
  537. *                   Check against size limit
  538. BLOCK1 MOVD    BLOCL,FRSGPT       Position pointer to title
  539.        MOVV    BLOCL,ARG1CL       Move data type
  540.        INCRA   FRSGPT,DESCR       Leave room for title
  541.        SUM     FRSGPT,FRSGPT,ARG1CL
  542. *                   Move position pointer past end
  543.        ACOMP   TLSGP1,FRSGPT,,,BLOGC
  544. *                   Check for end of region
  545.        ZERBLK  BLOCL,ARG1CL       Clear block
  546.        PUTAC   BLOCL,0,BLOCL       Set up self-pointer in title
  547.        SETFI   BLOCL,TTL       Insert title flag
  548.        SETSIZ  BLOCL,ARG1CL       Insert block size
  549.        RRTURN  BLOCL,1           Return pointer to block
  550. *_
  551. BLOGC  MOVA    FRSGPT,BLOCL       Restore position pointer
  552.        RCALL   ,GC,(ARG1CL),(ALOC2,BLOCK1)
  553. *                   Regenerate storage
  554. *_
  555. *---------------------------------------------------------------------*
  556. *
  557. *      Generation of Natural Variables
  558. *
  559. GENVAR PROC    ,           Procedure to generate variable
  560.        SETAC   CONVSW,0        Note GENVAR entry
  561.        POP     AXPTR           Resotre pointer to specifier
  562.        GETSPC  SPECR1,AXPTR,0       Get specifier
  563.        LEQLC   SPECR1,0,,RT1NUL    Avoid null string
  564. LOCA1  VARID   EQUVCL,SPECR1       Compute bin and ascension numbers
  565.        SUM     BUKPTR,OBPTR,EQUVCL Find bin
  566. LOCA2  MOVD    LSTPTR,BUKPTR       Save working copy
  567.        GETAC   BUKPTR,BUKPTR,LNKFLD
  568. *                   Get link descriptor
  569.        AEQLC   BUKPTR,0,,LOCA5       Check for end of chain
  570.        VCMPIC  BUKPTR,LNKFLD,EQUVCL,LOCA5,,LOCA2
  571. *                   Compare ascension numbers
  572.        LOCSP   SPECR2,BUKPTR       Get specifier to string in storage
  573.        LEXCMP  SPECR1,SPECR2,LOCA2,,LOCA2
  574. *                   Compare strings
  575.        MOVD    LCPTR,BUKPTR       Return string in storage
  576.        BRANCH  LOCRET
  577. *_
  578. LOCA5  GETLG   AXPTR,SPECR1       Get length of string
  579.        GETLTH  BKLTCL,AXPTR       Compute space required
  580.        ACOMP   BKLTCL,SIZLMT,SIZERR
  581. *                   Check against size limit
  582. LOCA7  MOVD    LCPTR,FRSGPT       Point to position in storage
  583.        SETVC   LCPTR,S           Set data type to STRING
  584.        INCRA   FRSGPT,DESCR       Leave space for title
  585.        SUM     FRSGPT,FRSGPT,BKLTCL
  586. *                   Skip required space
  587.        ACOMP   TLSGP1,FRSGPT,,,LOCA4
  588. *                   Check for end of region
  589.        PUTDC   LCPTR,0,ZEROCL       Clear title
  590.        PUTAC   LCPTR,0,LCPTR       Point title to self
  591.        SETFI   LCPTR,TTL+STTL       Set string and title flags
  592.        SETSIZ  LCPTR,AXPTR       Insert size of string
  593.        AEQLC   CONVSW,0,LOCA6       Check for GENVAR entry
  594.        PUTDC   LCPTR,DESCR,NULVCL  Set value to null string
  595.        PUTDC   LCPTR,ATTRIB,ZEROCL Set label attribute to zero
  596.        LOCSP   SPECR2,LCPTR       Get specifier to string structure
  597.        SETLC   SPECR2,0        Clear length
  598.        APDSP   SPECR2,SPECR1       Move new string in
  599. LOCA6  PUTVC   LCPTR,LNKFLD,EQUVCL Insert ascension number
  600.        PUTAC   LCPTR,LNKFLD,BUKPTR Insert link pointer
  601.        PUTAC   LSTPTR,LNKFLD,LCPTR Link to last structure
  602.        INCRA   VARSYM,1        Increment count of new variables
  603. LOCRET RRTURN  LCPTR,1           Return pointer to structure
  604. *_
  605. LOCA4  MOVA    FRSGPT,LCPTR       Restore position pointer
  606.        RCALL   ,GC,(BKLTCL),(ALOC2,LOCA7)
  607. *                   Regenerate storage
  608. *_
  609. *---------------------------------------------------------------------*
  610. *
  611. *      Generation of Variable from Integer
  612. *
  613. GNVARI PROC    GENVAR           Procedure to generate string
  614.        SETAC   CONVSW,0        Note GENVAR entry
  615.        POP     AXPTR           Restore integer
  616.        INTSPC  SPECR1,AXPTR       Convert to string
  617.        BRANCH  LOCA1           Join processing
  618. *_
  619. *---------------------------------------------------------------------*
  620. *
  621. *      Allocation of Space for Variable
  622. *
  623. CONVAR PROC    GENVAR           Procedure to get space for variable
  624.        POP     AXPTR           Restore length
  625.        AEQLC   AXPTR,0,,RT1NUL       Avoid null string
  626.        SETAC   CONVSW,1        Note CONVAR entry
  627.        GETLTH  BKLTCL,AXPTR       Get space required
  628.        ACOMP   BKLTCL,SIZLMT,SIZERR
  629. *                   Check against size limit
  630.        SUM     TEMPCL,FRSGPT,BKLTCL
  631. *                   Skip required space
  632.        INCRA   TEMPCL,DESCR       Save space for title
  633.        ACOMP   TLSGP1,TEMPCL,,,CONVR4
  634. *                   Check for end of region
  635. CONVR5 PUTDC   FRSGPT,0,ZEROCL       Clear title
  636.        PUTAC   FRSGPT,0,FRSGPT       Set up self pointer
  637.        SETFI   FRSGPT,TTL+STTL       Set string and title flags
  638.        SETSIZ  FRSGPT,AXPTR       Insert tentative size of string
  639.        PUTDC   FRSGPT,DESCR,NULVCL Insert null string as value
  640.        PUTDC   FRSGPT,ATTRIB,ZEROCL
  641. *                   Set label to zero
  642.        MOVA    BKLTCL,FRSGPT                    E3.3.2
  643.        RRTURN  BKLTCL,1                     E3.3.2
  644. *_
  645. CONVR4 RCALL   ,GC,BKLTCL,(ALOC2,CONVR5)
  646. *                   Regenerate storage
  647. *_
  648. *---------------------------------------------------------------------*
  649. *
  650. *      Generation of Variable in Place
  651. *
  652. GNVARS PROC    GENVAR           Procedure to entry string
  653.        POP     AXPTR           Restore length
  654.        AEQLC   AXPTR,0,,RT1NUL       Avoid null string
  655.        LOCSP   SPECR1,FRSGPT       Get specifier to position
  656.        PUTLG   SPECR1,AXPTR       Insert final length
  657.        SETSIZ  FRSGPT,AXPTR       Insert size in title
  658.        BRANCH  LOCA1           Join processing
  659. *_
  660. *---------------------------------------------------------------------*
  661. *
  662. *      Storage Regeneration
  663. *
  664. GC     PROC    ,           Storage regeneration procedure
  665.        POP     GCREQ           Restore space required
  666.        PSTACK  BLOCL           Post stack position
  667.        SUBTRT  BLOCL,BLOCL,STKPTR  Compute stack length used
  668.        SETSIZ  STKPTR,BLOCL       Set stack size
  669.        MOVD    BKDXU,PRMDX       Number of resident blocks
  670. GCT    GETD    GCMPTR,PRMPTR,BKDXU Get next resident block
  671.        AEQLC   GCMPTR,0,,GCTDWN    Skip nonpointers
  672.        RCALL   ,GCM,(GCMPTR)       Scan resident block
  673. GCTDWN DECRA   BKDXU,DESCR       Decrement block count
  674.        AEQLC   BKDXU,0,GCT       Test for end of loop
  675.        SETAC   BKPTR,OBLIST-DESCR  Set up pointer to bins
  676. GCBA1  ACOMP   BKPTR,OBEND,GCLAD   Check for end of bins
  677.        INCRA   BKPTR,DESCR       Increment bin pointer
  678.        MOVD    ST1PTR,BKPTR       Get working copy
  679. GCBA2  GETAC   ST1PTR,ST1PTR,LNKFLD
  680. *                   Get link pointer
  681.        AEQLC   ST1PTR,0,,GCBA1       Test for end of chain
  682.        TESTFI  ST1PTR,MARK,,GCBA2  Test for marked structure
  683.        GETDC   ST2PTR,ST1PTR,DESCR Get value descriptor
  684.        DEQL    ST2PTR,NULVCL,GCBA4 Mark if nonnull
  685.        AEQLIC  ST1PTR,ATTRIB,0,,GCBA2
  686. *                   Test attribute also
  687. GCBA4  PUTDC   GCBLK,DESCR,ST1PTR  Set up pseudoblock
  688.        RCALL   ,GCM,(GCBLK),GCBA2  Mark string structure
  689. *_
  690. GCLAD  MOVD    CPYCL,HDSGPT       Initialize target pointer
  691.        MOVD    TTLCL,HDSGPT       Initialize block pointer
  692. GCLAD0 BKSIZE  BKDX,TTLCL       Get size of block
  693.        TESTFI  TTLCL,MARK,GCLAD7   Is the block marked?
  694.        SUM     CPYCL,CPYCL,BKDX    Is block marked?
  695.        SUM     TTLCL,TTLCL,BKDX    Update block pointer
  696.        AEQL    TTLCL,FRSGPT,GCLAD0,GCBB1
  697. *                   Check for end of region
  698. *_
  699. GCLAD7 MOVD    MVSGPT,TTLCL       Update compression barrier
  700. GCLAD4 SUM     TTLCL,TTLCL,BKDX    Update block pointer
  701.        AEQL    TTLCL,FRSGPT,,GCBB1 Check for end of region
  702.        BKSIZE  BKDX,TTLCL       Get size of block
  703.        TESTFI  TTLCL,MARK,GCLAD4   Is block marked?
  704.        PUTAC   TTLCL,0,CPYCL       Point title to target
  705.        SUM     CPYCL,CPYCL,BKDX    Update target pointer
  706.        BRANCH  GCLAD4           Continue
  707. *_
  708. GCBB1  SETAC   BKPTR,OBLIST-DESCR  Set up pointer to bins
  709.        SETAC   NODPCL,1        No dump while reorganizing
  710. GCBB2  ACOMP   BKPTR,OBEND,GCLAP   Check for end of bins
  711.        INCRA   BKPTR,DESCR       Increment bin pointer
  712.        MOVD    ST1PTR,BKPTR       Get work copy
  713. GCBB3  MOVD    ST2PTR,ST1PTR       Save pointer to be linked
  714. GCBB4  GETAC   ST1PTR,ST1PTR,LNKFLD
  715. *                   Get link pointer
  716.        AEQLC   ST1PTR,0,,GCBB5       Check for end of chain
  717.        TESTFI  ST1PTR,MARK,GCBB4   Is string marked?
  718.        GETAC   BLOCL,ST1PTR,0       Get target address
  719.        PUTAC   ST2PTR,LNKFLD,BLOCL Set link to target
  720.        BRANCH  GCBB3           Continue
  721. *_
  722. GCBB5  PUTAC   ST2PTR,LNKFLD,ZEROCL
  723. *                   Set last link to zero
  724.        BRANCH  GCBB2           Continue
  725. *_
  726. GCLAP  MOVD    TTLCL,HDSGPT       Initialize target pointer
  727. GCLAP0 BKSIZE  BKDXU,TTLCL       Get size of block
  728.        TESTFI  TTLCL,STTL,,GCLAP1  Check for string
  729.        MOVD    BKDX,BKDXU       Working copy of block size
  730.        BRANCH  GCLAP2
  731. *_
  732. GCLAP1 SETAC   BKDX,3*DESCR       Three descriptors for string
  733. GCLAP2 TESTFI  TTLCL,MARK,GCLAP5   Is block marked?
  734.        DECRA   BKDX,DESCR       Decrement offset
  735. GCLAP3 GETD    DESCL,TTLCL,BKDX    Get next descriptor in block
  736.        TESTF   DESCL,PTR,GCLAP4    Is it a pointer?
  737.        ACOMP   DESCL,MVSGPT,,,GCLAP4
  738. *                   Is it above compression barrier?
  739.        TOP     TOPCL,OFSET,DESCL   Compute offset to target
  740.        ADJUST  DESCL,TOPCL,OFSET   Adjust pointer to target
  741.        PUTD    TTLCL,BKDX,DESCL    Put descriptor back in block
  742. GCLAP4 DECRA   BKDX,DESCR       Decrement offset
  743.        AEQLC   BKDX,0,GCLAP3       Check for end of block
  744. GCLAP5 SUM     TTLCL,TTLCL,BKDXU   Move to next block
  745.        AEQL    TTLCL,FRSGPT,GCLAP0 Check for end of region
  746.        MOVD    BKDXU,PRMDX       Number of resident blocks
  747. GCLAT1 GETD    TTLCL,PRMPTR,BKDXU  Get next resident block
  748.        AEQLC   TTLCL,0,,GCLAT4       Skip nonpointer
  749.        GETSIZ  BKDX,TTLCL       Get size of block
  750. GCLAT2 GETD    DESCL,TTLCL,BKDX    Get descriptor from block
  751.        TESTF   DESCL,PTR,GCLAT3    Is it a pointer?
  752.        ACOMP   DESCL,MVSGPT,,,GCLAT3
  753. *                   Is it above compression barrier?
  754.        TOP     TOPCL,OFSET,DESCL   Compute offset to target
  755.        ADJUST  DESCL,TOPCL,OFSET   Adjust pointer to target
  756.        PUTD    TTLCL,BKDX,DESCL    Put descriptor back in block
  757. GCLAT3 DECRA   BKDX,DESCR       Decrement offset
  758.        AEQLC   BKDX,0,GCLAT2       Check for end of block
  759. GCLAT4 DECRA   BKDXU,DESCR       Decrement count of resident blocks
  760.        AEQLC   BKDXU,0,GCLAT1       Check for end of resident blocks
  761.        MOVD    TTLCL,HDSGPT       Set up target pointer
  762. GCLAM0 BKSIZE  BKDXU,TTLCL       Get size of block
  763.        ACOMP   TTLCL,MVSGPT,GCLAM5,GCLAM5
  764. *                   Has compression barrier been reached
  765.        GETAC   TOPCL,TTLCL,0       Get target position
  766.        MOVDIC  TOPCL,0,TTLCL,0       Move title to target position
  767.        RSETFI  TOPCL,MARK       Clear mark flag
  768.        BRANCH  GCLAM4           Continue
  769. *_
  770. GCLAM5 MOVA    BKDX,BKDXU       Working copy of block size
  771.        DECRA   BKDX,DESCR       Size to be moved
  772.        TESTFI  TTLCL,MARK,GCLAM4   Is block marked?
  773.        GETAC   TOPCL,TTLCL,0       Get target position
  774.        MOVDIC  TOPCL,0,TTLCL,0       Move title
  775.        RSETFI  TOPCL,MARK       Clear mark flag
  776.        MOVBLK  TOPCL,TTLCL,BKDX    Move block itself
  777. GCLAM4 SUM     TTLCL,TTLCL,BKDXU   Get to next block
  778.        AEQL    TTLCL,FRSGPT,GCLAM0 Check for end of region
  779.        INCRA   GCNO,1           Increment count of regenerations
  780.        SETAC   NODPCL,0        Permit dump
  781.        BKSIZE  BKDX,TOPCL       Get size of last block
  782.        SUM     FRSGPT,TOPCL,BKDX   Compute new allocation pointer
  783.        RESETF  FRSGPT,FNC       Clear possible function flag
  784.        SUBTRT  GCGOT,TLSGP1,FRSGPT Compute amount reclaimed
  785.        DECRA   GCGOT,DESCR
  786.        RESETF  GCGOT,PTR       Clear pointer flag
  787.        ACOMP   GCREQ,GCGOT,FAIL    Compare with amount required
  788.        RRTURN  GCGOT,2
  789. *_
  790. *---------------------------------------------------------------------*
  791. *
  792. *      Block Marking
  793. *
  794. GCM    PROC    ,           Procedure to mark blocks
  795.        POP     BK1CL           Restore block to mark from
  796.        PUSH    ZEROCL           Save end marker
  797. GCMA1  GETSIZ  BKDX,BK1CL       Get size of block
  798. GCMA2  GETD    DESCL,BK1CL,BKDX    Get descriptor
  799.        TESTF   DESCL,PTR,GCMA3       Is it a pointer?
  800.        AEQLC   DESCL,0,,GCMA3       Is address zero?
  801.        TOP     TOPCL,OFSET,DESCL   Get to title of block pointed to
  802.        TESTFI  TOPCL,MARK,GCMA4    Is block marked?
  803. GCMA3  DECRA   BKDX,DESCR       Decrement offset
  804.        AEQLC   BKDX,0,GCMA2       Check for end of block
  805.        POP     BK1CL           Restore block pushed
  806.        AEQLC   BK1CL,0,,RTN1       Check for end
  807.        SETAV   BKDX,BK1CL       Get size remaining
  808.        BRANCH  GCMA2           Continue processing
  809. *_
  810. GCMA4  DECRA   BKDX,DESCR       Decrement offset
  811.        AEQLC   BKDX,0,,GCMA9       Check for end
  812.        SETVA   BK1CL,BKDX       Insert offset
  813.        PUSH    BK1CL           Save current block
  814. GCMA9  MOVD    BK1CL,TOPCL       Set poiner to new block
  815.        SETFI   BK1CL,MARK       Mark block
  816.        TESTFI  BK1CL,STTL,GCMA1    Is it a string?
  817.        MOVD    BKDX,TWOCL       Set size of string to 2
  818.        BRANCH  GCMA2           Join processing
  819. *_
  820. *---------------------------------------------------------------------*
  821. *
  822. *      Procedure to Split Blocks
  823. SPLIT  PROC    ,           Procedure to split blocks
  824.        POP     A4PTR           Restore pointer to middle of block
  825.        TOP     A5PTR,A6PTR,A4PTR   Get title and offset
  826.        AEQLC   A6PTR,0,,RTN1       Avoid block of zero length
  827.        GETSIZ  A7PTR,A5PTR       Get present block size
  828.        SUBTRT  A7PTR,A7PTR,A6PTR   Subtract offset
  829.        DECRA   A7PTR,DESCR       Decrement for title
  830.        ACOMPC  A7PTR,0,,RTN1,RTN1  Avoid block of zero length
  831.        SETSIZ  A5PTR,A6PTR       Reset size of old block
  832.        INCRA   A4PTR,DESCR       Adjust pointer to middle
  833.        PUTDC   A4PTR,0,ZEROCL
  834.        PUTAC   A4PTR,0,A4PTR
  835.        SETFI   A4PTR,TTL       Insert title flag
  836.        SETSIZ  A4PTR,A7PTR       Insert size fo new block
  837.        BRANCH  RTN1           Return
  838. *_
  839. *---------------------------------------------------------------------*
  840.        TITLE   'Compilation Procedures'
  841. *
  842. *      Binary Operator Analysis
  843. *
  844. BINOP  PROC    ,           Compiler binary operator analysis
  845.        RCALL   ,FORBLK,,BINOP1       Test for initial blank
  846.        AEQLC   BRTYPE,NBTYP,RTN2   If so, fail on break
  847.        STREAM  XSP,TEXTSP,BIOPTB,BINCON
  848.        MOVD    ZPTR,STYPE       Move function descriptor
  849.        BRANCH  RTZPTR           Return function descriptor
  850. *_
  851. BINOP1 RCALL   ,FORWRD,,COMP3       If no blank, find character
  852.        SELBRA  BRTYPE,(,RTN2,RTN2,,,RTN2,RTN2)
  853. BINERR SETAC   EMSGCL,ILLBIN       Set up error message
  854.        BRANCH  RTN1           Take error return
  855. *_
  856. BINCON MOVD    ZPTR,CONCL       No operator, concatenation
  857.        BRANCH  RTZPTR           Return function descriptor
  858. *_
  859. BINEOS SETAC   EMSGCL,ILLEOS       Set up error message
  860.        BRANCH  RTN1           Error return
  861. *_
  862. *---------------------------------------------------------------------*
  863. *
  864. *      Statement Compilation
  865. *
  866. CMPILE PROC    ,           Procedure to compile statement
  867.        SETAC   BRTYPE,0        Clear break indicator
  868.        MOVD    BOSCL,CMOFCL       Set statement beginning offset
  869.        INCRA   CSTNCL,1        Increment statement number
  870.        STREAM  XSP,TEXTSP,LBLTB,CERR1
  871. *                   Break out label
  872.        LEQLC   XSP,0,,CMPILA       Check for no label
  873.        INCRA   CMOFCL,DESCR       Increment offset
  874.        PUTD    CMBSCL,CMOFCL,BASECL
  875. *                   Insert BASE function
  876.        SUM     CMBSCL,CMBSCL,CMOFCL
  877. *                   Add offset to base
  878.        ACOMP   CMBSCL,OCLIM,,,CMPILO
  879. *                   Check for end of object code
  880.        RCALL   XCL,BLOCK,CODELT    Get block for more
  881.        PUTDC   CMBSCL,0,GOTGCL       Replace BASE with direct goto
  882.        PUTDC   CMBSCL,DESCR,LIT1CL                E3.7.1
  883.        PUTDC   CMBSCL,2*DESCR,XCL  Aim at new block
  884.        MOVD    CMBSCL,XCL       Set up base of new region
  885.        SUM     OCLIM,CMBSCL,CODELT Compute end of new block
  886.        DECRA   OCLIM,5*DESCR       Leave safety factor
  887.        PUTDC   CMBSCL,DESCR,BASECL Set BASE function in new region
  888.        INCRA   CMBSCL,DESCR       Increment base
  889. CMPILO SETAC   CMOFCL,0        Zero offset
  890.        SETAC   BOSCL,0           Zero base offset
  891.        RCALL   LPTR,GENVAR,XSPPTR  Get variable for label
  892.        AEQLIC  LPTR,ATTRIB,0,,CMPILC
  893. *                   Check for previous definition
  894.        AEQLC   CNSLCL,0,,CERR2       Check for label redefinition
  895. CMPILC PUTDC   LPTR,ATTRIB,CMBSCL  Insert label attribute
  896.        DEQL    LPTR,ENDPTR,,RTN2   Check for END
  897. CMPILA RCALL   ,FORBLK,,CERR12       Get to next character
  898.        AEQLC   BRTYPE,EOSTYP,,RTN3 Was end of statement founc?
  899.        INCRA   CMOFCL,DESCR       Increment offset
  900.        PUTD    CMBSCL,CMOFCL,INITCL
  901. *                   Insert INIT function
  902.        INCRA   CMOFCL,DESCR       Increment offset
  903.        MOVD    FRNCL,CMOFCL       Save offset for failure position
  904.        AEQLC   BRTYPE,NBTYP,,CMPSUB
  905. *                   Check for nonbreak
  906.        AEQLC   BRTYPE,CLNTYP,CERR3,CMPGO
  907. *                   Check for goto field
  908. *_
  909. CMPSUB RCALL   SUBJND,ELEMNT,,(CDIAG,COMP3)
  910. *                   Compiler subject
  911.        RCALL   ,FORBLK,,CERR5       Get to next character
  912.        AEQLC   BRTYPE,NBTYP,,CMPATN
  913. *                   Check for nonbreak
  914.        AEQLC   BRTYPE,EQTYP,,CMPFRM
  915. *                   Check for assignment
  916.        RCALL   ,TREPUB,(SUBJND)    Copy subject into object code
  917.        AEQLC   BRTYPE,CLNTYP,,CMPGO
  918. *                   Check for goto
  919.        AEQLC   BRTYPE,EOSTYP,CERR5,CMPNGO
  920. *                   Check for end of statement
  921. *_
  922. CMPATN RCALL   PATND,EXPR,,CDIAG   Compile pattern
  923.        AEQLC   BRTYPE,EQTYP,,CMPASP
  924. *                   Check for replacement
  925.        INCRA   CMOFCL,DESCR       Increment offset
  926.        PUTD    CMBSCL,CMOFCL,SCANCL
  927. *                   Insert SCAN function
  928.        RCALL   ,TREPUB,(SUBJND)    Copy subject into object code
  929.        RCALL   ,TREPUB,(PATND)       Copy pattern into object code
  930. CMPTGO AEQLC   BRTYPE,EOSTYP,,CMPNGO
  931. *                   Check for end of statement
  932.        AEQLC   BRTYPE,CLNTYP,CERR5,CMPGO
  933. *                   Check for end of statement
  934. *_
  935. CMPFRM RCALL   FORMND,EXPR,,CDIAG  Compile object
  936.        INCRA   CMOFCL,DESCR       Increment offset
  937.        PUTD    CMBSCL,CMOFCL,ASGNCL
  938. *                   Insert ASGN function
  939.        RCALL   ,TREPUB,(SUBJND)    Copy subject into object code
  940.        BRANCH  CMPFT           Join object publication
  941. *_
  942. CMPASP RCALL   FORMND,EXPR,,CDIAG  Compile object
  943.        INCRA   CMOFCL,DESCR       Increment offset
  944.        PUTD    CMBSCL,CMOFCL,SJSRCL
  945. *                   Insert SJSR function
  946.        RCALL   ,TREPUB,(SUBJND)    Copy subject into object code
  947.        RCALL   ,TREPUB,(PATND)       Copy pattern into object code
  948. CMPFT  RCALL   ,TREPUB,FORMND,CMPTGO
  949. *                   Copy object into object code
  950. *_
  951. CMPNGO SETVA   CSTNCL,CMOFCL       Set up offset for failure
  952.        PUTD    CMBSCL,FRNCL,CSTNCL Insert argument of INIT
  953.        BRANCH  RTN3           Statement compilation is done
  954. *_                   Get to next character
  955. CMPGO  RCALL   ,FORWRD,,COMP3       Check for end of statement
  956.        AEQLC   BRTYPE,EOSTYP,,CMPNGO
  957. *                   Check for nonbreak
  958.        AEQLC   BRTYPE,NBTYP,CERR11
  959.        STREAM  XSP,TEXTSP,GOTOTB,CERR11,CERR12
  960. *                   Analyze goto field
  961.        MOVD    GOGOCL,GOTLCL       Predict GOTL
  962.        SETAC   GOBRCL,RPTYP       Set up predicted closing break
  963.        ACOMP   STYPE,GTOCL,,CMPGG,CMPGG
  964. *                   Check for direct goto
  965.        MOVD    GOGOCL,GOTGCL       Set up direct goto
  966.        SETAC   GOBRCL,RBTYP       Set up closing break
  967. CMPGG  SELBRA  STYPE,(,CMPSGO,CMPFGO,,CMPSGO,CMPFGO)
  968. *                   Branch on type
  969. CMPUGO SETVA   CSTNCL,CMOFCL       Set up offset for failure
  970.        PUTD    CMBSCL,FRNCL,CSTNCL Insert argument of INIT
  971.        RCALL   GOTOND,EXPR,,CDIAG  Compile goto
  972.        AEQL    BRTYPE,GOBRCL,CERR11
  973. *                   Verify closing break
  974.        INCRA   CMOFCL,DESCR       Increment offset
  975.        PUTD    CMBSCL,CMOFCL,GOGOCL
  976. *                   Insert goto function
  977.        RCALL   ,TREPUB,(GOTOND)    Copy goto into object code
  978.        RCALL   ,FORWRD,,COMP3       Get to next character
  979.        AEQLC   BRTYPE,EOSTYP,CERR11,RTN3
  980. *                   Check for end of statement
  981. *_
  982. CMPSGO RCALL   SGOND,EXPR,,CDIAG   Compile success goto
  983.        AEQL    BRTYPE,GOBRCL,CERR11
  984. *                   Verify break character
  985.        INCRA   CMOFCL,DESCR       Increment offset
  986.        PUTD    CMBSCL,CMOFCL,GOGOCL
  987. *                   Insert goto function
  988.        RCALL   ,TREPUB,(SGOND)       Copy goto into object code
  989.        RCALL   ,FORWRD,,COMP3       Get to next character
  990.        AEQLC   BRTYPE,EOSTYP,CMPILL
  991. *                   Check for end of statement
  992.        SETVA   CSTNCL,CMOFCL       Set up offset for failure
  993.        PUTD    CMBSCL,FRNCL,CSTNCL Insert argument of INIT
  994.        BRANCH  RTN3           Compilation is complete, return
  995. *_
  996. CMPILL AEQLC   BRTYPE,NBTYP,CERR11 Check for nonbreak
  997.        STREAM  XSP,TEXTSP,GOTOTB,CERR11,CERR12
  998. *                   Analyze goto field
  999.        AEQLC   STYPE,FGOTYP,CMPFTC Check for failure goto
  1000.        MOVD    GOGOCL,GOTLCL       Set up goto
  1001.        SETAC   GOBRCL,RPTYP       Set up closing break
  1002.        BRANCH  CMPUGO           Join processing
  1003. *_
  1004. CMPFTC AEQLC   STYPE,FTOTYP,CERR11 Verify failure goto
  1005.        MOVD    GOGOCL,GOTGCL       Set up goto
  1006.        SETAC   GOBRCL,RBTYP       Set up closing break
  1007.        BRANCH  CMPUGO           Join processing
  1008. *_
  1009. CMPFGO RCALL   FGOND,EXPR,,CDIAG   Compile failure goto
  1010.        AEQL    BRTYPE,GOBRCL,CERR11
  1011. *                   Verify failure goto
  1012.        RCALL   ,FORWRD,,COMP3       Get to next character
  1013.        AEQLC   BRTYPE,EOSTYP,CMPILM
  1014. *                   Check for end of statement
  1015.        INCRA   CMOFCL,DESCR       Increment offset
  1016.        PUTD    CMBSCL,CMOFCL,GOTOCL
  1017. *                   Insert goto function
  1018.        INCRA   CMOFCL,DESCR       Increment offset
  1019.        MOVD    SRNCL,CMOFCL       Save location for success
  1020.        SETVA   CSTNCL,CMOFCL       Set up failure offset
  1021.        PUTD    CMBSCL,FRNCL,CSTNCL Insert argument of INIT
  1022.        INCRA   CMOFCL,DESCR       Increment offset
  1023.        PUTD    CMBSCL,CMOFCL,GOGOCL
  1024. *                   Insert goto function
  1025.        RCALL   ,TREPUB,(FGOND)       Copy goto into object code
  1026.        PUTD    CMBSCL,SRNCL,CMOFCL Insert success offset into code
  1027.        BRANCH  RTN3           Compilation is complete, return
  1028. *_
  1029. CMPILM AEQLC   BRTYPE,NBTYP,CERR11 Verify nonbreak
  1030.        STREAM  XSP,TEXTSP,GOTOTB,CERR11,CERR12
  1031. *                   Analyze goto field
  1032.        AEQLC   STYPE,SGOTYP,CMPSTC Check for success goto
  1033.        PUSH    GOTLCL           Save goto type
  1034.        SETAC   GOBRCL,RPTYP       Set up closing break
  1035.        BRANCH  CMPILN           Join processing
  1036. *_
  1037. CMPSTC AEQLC   STYPE,STOTYP,CERR11 Verify success goto
  1038.        PUSH    GOTGCL           Save goto type
  1039.        SETAC   GOBRCL,RBTYP       Set up closing break
  1040. CMPILN RCALL   SGOND,EXPR,,CDIAG   Compile success goto
  1041.        AEQL    BRTYPE,GOBRCL,CERR11
  1042. *                   Verify closing break
  1043.        RCALL   ,FORWRD,,COMP3       Get to next character
  1044.        AEQLC   BRTYPE,EOSTYP,CERR11
  1045. *                   Verify end of statement
  1046.        INCRA   CMOFCL,DESCR       Increment offset
  1047.        POP     WCL           Restore goto type
  1048.        PUTD    CMBSCL,CMOFCL,WCL   Insert goto function
  1049.        RCALL   ,TREPUB,(SGOND)       Copy goto into object code
  1050.        SETVA   CSTNCL,CMOFCL       Set up failure offset
  1051.        PUTD    CMBSCL,FRNCL,CSTNCL Insert argument of INIT
  1052.        INCRA   CMOFCL,DESCR       Increment offset
  1053.        PUTD    CMBSCL,CMOFCL,GOGOCL
  1054. *                   Insert goto function
  1055.        RCALL   ,TREPUB,(FGOND),RTN3
  1056. *                   Copy goto into object code
  1057. *_
  1058. CERR1  SETAC   EMSGCL,EMSG1       Erroneous label
  1059.        BRANCH  CDIAG
  1060. *_
  1061. CERR2  SETAC   EMSGCL,EMSG2       Multidefined label
  1062.        BRANCH  CDIAG
  1063. *_
  1064. CERR3  SETAC   EMSGCL,EMSG3       Break character before subject
  1065.        BRANCH  CDIAG
  1066. *_
  1067. CERR5  SETAC   EMSGCL,ILLBRK       Illegal character after pattern
  1068.        BRANCH  CDIAG
  1069. *_
  1070. CERR12 SETAC   EMSGCL,ILLEOS       Illegal statement termination
  1071.        BRANCH  CDIAG
  1072. *_
  1073. CERR11 SETAC   EMSGCL,EMSG14       Characters after goto
  1074. CDIAG  INCRA   BOSCL,DESCR       Increment offset of beginning
  1075.        PUTD    CMBSCL,BOSCL,ERORCL Insert ERROR function
  1076.        INCRA   BOSCL,DESCR       Increment offset
  1077.        PUTD    CMBSCL,BOSCL,CSTNCL Insert argument of ERROR
  1078.        MOVD    CMOFCL,BOSCL       Reposition offset
  1079.        INCRA   ESAICL,DESCR       Increment count of errors
  1080.        ACOMP   ESAICL,ESALIM,COMP9 Test for excessive errors
  1081.        AEQLC   LISTCL,0,,CDIAG1    Check for listing mode
  1082.        MOVD    YCL,ERRBAS       Set up length of error vector
  1083.        AEQLC   BRTYPE,EOSTYP,,CDIAG3
  1084. *                   Check for end of statement
  1085.        GETLG   XCL,TEXTSP       Get length remaining
  1086.        SUBTRT  YCL,YCL,XCL       Compute position for marker
  1087. CDIAG3 PUTLG   ERRSP,YCL       Insert length
  1088.        APDSP   ERRSP,QTSP       Set in marker
  1089.        AEQLC   BRTYPE,EOSTYP,,CDIAG2
  1090. *                   Check for end of statement
  1091.        STPRNT  IOKEY,OUTBLK,LNBFSP Print statement
  1092. CDIAG2 STPRNT  IOKEY,OUTBLK,ERRSP  Print error marker
  1093.        PUTLG   ERRSP,YCL       Insert length in marker
  1094.        APDSP   ERRSP,BLSP       Blank out marker
  1095.        GETSPC  TSP,EMSGCL,0       Get error message
  1096.        SETLC   CERRSP,0        Clear specifier
  1097.        APDSP   CERRSP,STARSP       Append attention getter
  1098.        APDSP   CERRSP,TSP       Append error message
  1099.        STPRNT  IOKEY,OUTBLK,CERRSP Print error message
  1100.        STPRNT  IOKEY,OUTBLK,BLSP   Print blank line
  1101. CDIAG1 AEQLC   UNIT,0,,RTN1                    E3.0.1
  1102.        AEQLC   BRTYPE,EOSTYP,,RTN3                E3.0.1
  1103.        STREAM  XSP,TEXTSP,EOSTB,COMP3,,RTN3
  1104. *                   Get to end of statement
  1105. DIAGRN STREAD  INBFSP,UNIT,DIAGRN,COMP5
  1106. *                   Read card image
  1107.        SETSP   TEXTSP,NEXTSP       Set up new line
  1108.        STREAM  XSP,TEXTSP,CARDTB,COMP3,COMP3
  1109. *                   Analyze card type
  1110.        RCALL   ,NEWCRD,,(,,RTN3)   Process card image
  1111.        AEQLC   LISTCL,0,,DIAGRN
  1112.        STPRNT  IOKEY,OUTBLK,LNBFSP Print out bypassed card
  1113.        BRANCH  DIAGRN
  1114. *_
  1115. *---------------------------------------------------------------------*
  1116. *
  1117. *      Element Analysis
  1118. *
  1119. ELEMNT PROC    ,           Element analysis procedure
  1120.        RCALL   ELEMND,UNOP,,RTN2   Get tree of unary operators
  1121.        STREAM  XSP,TEXTSP,ELEMTB,ELEICH,ELEILI
  1122. *                   Break out element
  1123. ELEMN9 SELBRA  STYPE,(,ELEILT,ELEVBL,ELENST,ELEFNC,ELEFLT,ELEARY)
  1124. *                   Branch on element type
  1125.        FSHRTN  XSP,1           Delete initial quote
  1126.        SHORTN  XSP,1           Remove terminal quote
  1127.        RCALL   XPTR,GENVAR,(XSPPTR)
  1128. *                   Generate variable for literal
  1129. ELEMN5 RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1130.        PUTDC   ELEXND,CODE,LITCL   Insert literal function
  1131.        RCALL   ELEYND,BLOCK,CNDSIZ Allocate block for tree node
  1132.        PUTDC   ELEYND,CODE,XPTR    Insert literal value
  1133.        ADDSON  ELEXND,ELEYND       Add node as son
  1134. ELEMN1 AEQLC   ELEMND,0,ELEMN6       Check for empty tree
  1135.        MOVD    ZPTR,ELEXND       Set up return
  1136.        BRANCH  ELEMRR           Join return processing
  1137. *_
  1138. ELEMN6 ADDSON  ELEMND,ELEXND       Add as son of present tree
  1139. ELEMNR MOVD    ZPTR,ELEMND       Move tree to return
  1140. ELEMRR AEQLIC  ZPTR,FATHER,0,,RTZPTR
  1141. *                   Is pointer at top of tree?
  1142.        GETDC   ZPTR,ZPTR,FATHER    Move back to father
  1143.        BRANCH  ELEMRR           Continue up tree
  1144. *_
  1145. ELEILT SPCINT  XPTR,XSP,ELEINT,ELEMN5
  1146. *                   Convert string to integer
  1147. *_
  1148. ELEFLT SPREAL  XPTR,XSP,ELEDEC,ELEMN5
  1149. *                   Convert string to real
  1150. *_
  1151. ELEVBL RCALL   XPTR,GENVAR,(XSPPTR)
  1152. *                   Generate variable
  1153.        RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1154.        PUTDC   ELEXND,CODE,XPTR    Insert name
  1155.        BRANCH  ELEMN1           Join exit processing
  1156. *_
  1157. ELENST PUSH    ELEMND           Save current tree
  1158.        RCALL   ELEXND,EXPR,,RTN1   Evaluate nested expression
  1159.        POP     ELEMND           Restore tree
  1160.        AEQLC   BRTYPE,RPTYP,ELECMA,ELEMN1
  1161. *                   Verify right parenthesis
  1162. *_
  1163. ELEFNC SHORTN  XSP,1           Delete open parenthesis
  1164.        RCALL   XPTR,GENVAR,(XSPPTR)
  1165. *                   Generate variable for function name
  1166.        RCALL   XCL,FINDEX,(XPTR)   Find function descriptor
  1167.        RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1168.        PUTDC   ELEXND,CODE,XCL       Insert function descriptor in node
  1169.        AEQLC   ELEMND,0,,ELEMN7    Is tree empty?
  1170.        ADDSON  ELEMND,ELEXND       Add node as son to tree
  1171. ELEMN7 PUSH    ELEXND           Save current node
  1172.        RCALL   ELEXND,EXPR,,RTN1   Evaluate argument of function
  1173.        POP     ELEMND           Resotre current node
  1174.        ADDSON  ELEMND,ELEXND       Add argument as son
  1175.        MOVD    ELEMND,ELEXND       Move to new node
  1176. ELEMN2 AEQLC   BRTYPE,RPTYP,,ELEMN3
  1177. *                   Check for left parenthesis
  1178.        AEQLC   BRTYPE,CMATYP,ELECMA
  1179. *                   Verify comma
  1180.        PUSH    ELEMND           Save current node
  1181.        RCALL   ELEXND,EXPR,,RTN1   Evaluate next argument
  1182.        POP     ELEMND           Restore current node
  1183.        ADDSIB  ELEMND,ELEXND       Add argument as sibling
  1184.        MOVD    ELEMND,ELEXND       Move to new node
  1185.        BRANCH  ELEMN2           Continue
  1186. *_
  1187. ELEMN3 GETDC   ELEXND,ELEMND,FATHER
  1188. *                   Get father of current node
  1189.        GETDC   XCL,ELEXND,CODE       Get function descriptor
  1190.        GETDC   YCL,XCL,0       Get procedure descriptor
  1191.        TESTF   YCL,FNC,,ELEMNR       Check for fixed number requirement
  1192.        SETAV   XCL,XCL           Get number of arguments given
  1193.        SETAV   YCL,YCL           Get number of arguments expected
  1194. ELEMN4 ACOMP   XCL,YCL,ELEMNR,ELEMNR
  1195. *                   Compare given and expected
  1196.        RCALL   ELEYND,BLOCK,CNDSIZ Allocate block for tree node
  1197.        PUTDC   ELEYND,CODE,LITCL   Insert literal function
  1198.        RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1199.        PUTDC   ELEXND,CODE,NULVCL  Insert null string value
  1200.        ADDSON  ELEYND,ELEXND       Add null as son of literal
  1201.        ADDSIB  ELEMND,ELEYND       Add literal as extra argument
  1202.        MOVD    ELEMND,ELEYND       Move to new node
  1203.        INCRA   XCL,1           Increment argument count
  1204.        BRANCH  ELEMN4           Continue
  1205. *_
  1206. ELEARY SHORTN  XSP,1           Remove left bracket
  1207.        RCALL   XPTR,GENVAR,(XSPPTR)
  1208. *                   Generate variable for array or table
  1209.        RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1210.        PUTDC   ELEXND,CODE,ITEMCL  Insert ITEM function
  1211.        AEQLC   ELEMND,0,,ELEMN8    Is tree empty?
  1212.        ADDSON  ELEMND,ELEXND       Add as son to tree
  1213. ELEMN8 MOVD    ELEMND,ELEXND       Move to new node
  1214.        RCALL   ELEXND,BLOCK,CNDSIZ Allocate block for tree node
  1215.        PUTDC   ELEXND,CODE,XPTR    Insert array or table name
  1216.        ADDSON  ELEMND,ELEXND       Add as son to tree
  1217.        MOVD    ELEMND,ELEXND       Move to new node
  1218. ELEAR1 PUSH    ELEMND           Save current node
  1219.        RCALL   ELEXND,EXPR,,RTN1   Evaluate argument
  1220.        POP     ELEMND           Restore current node
  1221.        ADDSIB  ELEMND,ELEXND       Add as sibling to tree
  1222.        MOVD    ELEMND,ELEXND       Move to new node
  1223.        AEQLC   BRTYPE,RBTYP,,ELEMNR
  1224. *                   Check for right bracket
  1225.        AEQLC   BRTYPE,CMATYP,ELECMA,ELEAR1
  1226. *                   Verify comma
  1227. *_
  1228. ELEICH SETAC   EMSGCL,ILCHAR       'ILLEGAL CHARACTER IN ELEMENT'
  1229.        BRANCH  RTN1           Error return
  1230. *_
  1231. ELEILI AEQLC   STYPE,QLITYP,ELEMN9 Check cause of run out
  1232.        SETAC   EMSGCL,OPNLIT       'UNCLOSED LITERAL'
  1233.        BRANCH  RTN1           Error return
  1234. *_
  1235. ELEINT SETAC   EMSGCL,ILLINT       'ILLEGAL INTEGER'
  1236.        BRANCH  RTN1           Error return
  1237. *_
  1238. ELEDEC SETAC   EMSGCL,ILLDEC       'ILLEGAL REAL'
  1239.        BRANCH  RTN1           Error return
  1240. *_
  1241. ELECMA SETAC   EMSGCL,ILLBRK       'ILLEGAL BREAK CHARACTER'
  1242.        BRANCH  RTN1           Error return
  1243. *_
  1244. *---------------------------------------------------------------------*
  1245. *
  1246. *      Expression Analysis
  1247. *
  1248. EXPR   PROC    ,           Procedure to compile expression
  1249.        RCALL   EXELND,ELEMNT,,(RTN1,EXPNUL)
  1250. *                   Compile element
  1251.        SETAC   EXPRND,0        Zero expression tree
  1252.        BRANCH  EXPR2           Join main processing
  1253. *_
  1254. EXPR1  PUSH    EXPRND           Save expression tree
  1255.        RCALL   EXELND,ELEMNT,,(RTN1,EXPERR)
  1256. *                   Compile element
  1257.        POP     EXPRND           Restore expression tree
  1258. EXPR2  RCALL   EXOPCL,BINOP,,(RTN1,EXPR7)
  1259. *                   Get binary operator
  1260.        RCALL   EXOPND,BLOCK,CNDSIZ Allocate block for tree node
  1261.        PUTDC   EXOPND,CODE,EXOPCL  Insert binary operator
  1262.        AEQLC   EXPRND,0,EXPR3       Check for empty tree
  1263.        ADDSON  EXOPND,EXELND       Add node as son
  1264.        MOVD    EXPRND,EXELND       Move to new node
  1265.        BRANCH  EXPR1           Continue processing
  1266. *_
  1267. EXPR3  GETDC   EXOPCL,EXOPCL,2*DESCR
  1268. *                   Get precedence descriptor
  1269.        SETAV   EXOPCL,EXOPCL       Get left precedence
  1270.        GETDC   EXEXND,EXPRND,FATHER
  1271. *                   Get father of node
  1272.        GETDC   XPTR,EXEXND,CODE    Get function descriptor
  1273.        GETDC   XPTR,XPTR,2*DESCR   Get precedence descriptor
  1274.        ACOMP   XPTR,EXOPCL,EXPR4   Compare precedences
  1275.        ADDSIB  EXPRND,EXOPND       Add node as sibling
  1276.        MOVD    EXPRND,EXOPND       Move to new node
  1277.        ADDSON  EXPRND,EXELND       Put current node as son
  1278.        MOVD    EXPRND,EXELND       Move to new node
  1279.        BRANCH  EXPR1           Continue processing
  1280. *_
  1281. EXPR4  ADDSIB  EXPRND,EXELND       Add current node as sibling
  1282. EXPR5  AEQLIC  EXPRND,FATHER,0,,EXPR11
  1283. *                   Check for root node
  1284.        GETDC   EXPRND,EXPRND,FATHER
  1285. *                   Get father node
  1286.        AEQLIC  EXPRND,FATHER,0,,EXPR11
  1287. *                   Check for root node
  1288.        GETDC   EXEXND,EXPRND,FATHER
  1289. *                   Get father node
  1290.        GETDC   XPTR,EXEXND,CODE    Get function descriptor
  1291.        GETDC   XPTR,XPTR,2*DESCR   Get precedence descriptor
  1292.        ACOMP   XPTR,EXOPCL,EXPR5   Compare precedences
  1293.        INSERT  EXPRND,EXOPND       Insert node above
  1294.        BRANCH  EXPR1           Continue processing
  1295. *_
  1296. EXPR7  AEQLC   EXPRND,0,EXPR10       Check for empty tree
  1297.        MOVD    XPTR,EXELND       Set up for return
  1298.        BRANCH  EXPR9           Join end processing
  1299. *_
  1300. EXPR10 ADDSIB  EXPRND,EXELND       Add node as sibling
  1301.        MOVD    XPTR,EXPRND       Set up for return
  1302. EXPR9  AEQLIC  XPTR,FATHER,0,,RTXNAM
  1303. *                   Check for root node
  1304.        GETDC   XPTR,XPTR,FATHER    Go back to father
  1305.        BRANCH  EXPR9           Continue up tree
  1306. *_
  1307. EXPR11 ADDSON  EXOPND,EXPRND       Add node as son
  1308.        BRANCH  EXPR1           Continue processing
  1309. *_
  1310. EXPNUL RCALL   EXPRND,BLOCK,CNDSIZ Allocate block for tree node
  1311.        PUTDC   EXPRND,CODE,LITCL   Insert literal function
  1312.        RCALL   EXEXND,BLOCK,CNDSIZ Allocate block for tree node
  1313.        PUTDC   EXEXND,CODE,NULVCL  Insert null string as value
  1314.        ADDSON  EXPRND,EXEXND       Add node as son
  1315.        MOVD    XPTR,EXPRND       Set up for return
  1316.        BRANCH  RTXNAM
  1317. *_
  1318. EXPERR SETAC   EMSGCL,ILLEOS       'ILLEGAL END OF STATEMENT'
  1319.        BRANCH  RTN1           Take error return
  1320. *_
  1321. *---------------------------------------------------------------------*
  1322. *
  1323. *      Location of Next Nonblank Character
  1324. *
  1325. FORWRD PROC    ,           Procedure to get to next character
  1326.        STREAM  XSP,TEXTSP,FRWDTB,COMP3,FORRUN
  1327. *                   Break for next nonblank
  1328. FORJRN MOVD    BRTYPE,STYPE       Set up break type
  1329.        BRANCH  RTN2           Return
  1330. *_
  1331. FORRUN AEQLC   UNIT,0,,FOREOS       Check for input stream
  1332.        AEQLC   LISTCL,0,,FORRUR    Check listing switch
  1333.        STPRNT  IOKEY,OUTBLK,LNBFSP Print card image
  1334. FORRUR STREAD  INBFSP,UNIT,FORRUR,COMP5
  1335. *                   Read new card iamge
  1336.        SETSP   TEXTSP,NEXTSP       Set up new line
  1337.        STREAM  XSP,TEXTSP,CARDTB,COMP3,COMP3
  1338. *                   Determine card type
  1339.        RCALL   ,NEWCRD,,(FORRUN,FORWRD)
  1340. *                   Process new card
  1341. FOREOS MOVD    BRTYPE,EOSCL       Set up end-of-card
  1342.        BRANCH  RTN2           Return
  1343. *_
  1344. FORBLK PROC    FORWRD           Procedure to get to nonblank
  1345.        STREAM  XSP,TEXTSP,IBLKTB,RTN1,FORRUN,FORJRN
  1346. *                   Break out nonblank from blank
  1347. *_
  1348. *---------------------------------------------------------------------*
  1349. *
  1350. *      Card Image Processing
  1351. *
  1352. NEWCRD PROC    ,           Process new card image
  1353.        SELBRA  STYPE,(,CMTCRD,CTLCRD,CNTCRD)
  1354. *                   Branch on card type
  1355.        AEQLC   LISTCL,0,,RTN3       Return if listing is off
  1356.        MOVD    XCL,CSTNCL       Copy of statement number
  1357.        INCRA   XCL,1           Increment number
  1358.        INTSPC  TSP,XCL           Convert it to STRING
  1359.        AEQLC   LLIST,0,CARDL       Check for left listing
  1360.        SETLC   RNOSP,0           Clear right specifier
  1361.        APDSP   RNOSP,TSP       Set to statement number
  1362.        BRANCH  RTN3
  1363. *_
  1364. CARDL  SETLC   LNOSP,0           Clear left specifier
  1365.        APDSP   LNOSP,TSP       Set to statement number
  1366.        BRANCH  RTN3
  1367. *_
  1368. CMTCRD AEQLC   LISTCL,0,,RTN1       Return if listing is off
  1369. CMTCLR SETLC   LNOSP,0           Clear left specifier
  1370.        SETLC   RNOSP,0           Clear right specifier
  1371.        APDSP   LNOSP,BLNSP       Blank left specifier
  1372.        APDSP   RNOSP,BLNSP       Blank right specifier
  1373.        BRANCH  RTN1
  1374. *_
  1375. CNTCRD FSHRTN  TEXTSP,1        Remove continue character
  1376.        AEQLC   LISTCL,0,,RTN2       Return if listing is off
  1377.        INTSPC  TSP,CSTNCL       Get specifier for number
  1378.        AEQLC   LLIST,0,CARDLL       Check for left listing
  1379.        SETLC   RNOSP,0           Clear right specifier
  1380.        APDSP   RNOSP,TSP       Set to statement number
  1381.        BRANCH  RTN2
  1382. *_
  1383. CARDLL SETLC   LNOSP,0           Clear left specifier
  1384.        APDSP   LNOSP,TSP       Set to statement number
  1385.        BRANCH  RTN2
  1386. *_
  1387. CTLCRD FSHRTN  TEXTSP,1        Delete control character
  1388.        STREAM  XSP,TEXTSP,FRWDTB,COMP3,CMTCRD
  1389. *                   Get to next nonblank character
  1390.        AEQLC   STYPE,NBTYP,CMTCRD  Verify nonbreak
  1391.        STREAM  XSP,TEXTSP,LBLXTB,CMTCLR,CMTCLR
  1392. *                   Break out command
  1393.        LEXCMP  XSP,UNLSP,CTLCR1,,CTLCR1
  1394. *                   Is it UNLIST?
  1395.        SETAC   LISTCL,0        Zero listing switch
  1396.        BRANCH  RTN1           Return
  1397. *_
  1398. CTLCR1 LEXCMP  XSP,LISTSP,CTLCR3,,CTLCR3
  1399. *                   Is it LIST?
  1400.        SETAC   LISTCL,1        Turn on listing
  1401.        STREAM  XSP,TEXTSP,FRWDTB,COMP3,CMTCLR
  1402. *                   Get to next nonblank character
  1403.        AEQLC   STYPE,NBTYP,CMTCLR  Verify nonbreak
  1404.        STREAM  XSP,TEXTSP,LBLXTB,CMTCLR,CMTCLR
  1405. *                   Get type of listing
  1406.        LEXCMP  XSP,LEFTSP,CTLCR2,,CTLCR2
  1407. *                   Is it LEFT?
  1408.        SETAC   LLIST,1           Set left listing switch
  1409.        BRANCH  CMTCLR           Join terminal processing
  1410. *_
  1411. CTLCR2 SETAC   LLIST,0           Zero left listing as default
  1412.        BRANCH  CMTCLR           Join terminal processing
  1413. *_
  1414. CTLCR3 LEXCMP  XSP,EJCTSP,CMTCLR,,CMTCLR
  1415. *                   Is it EJECT?
  1416.        AEQLC   LISTCL,0,,CMTCLR    Skip eject if not listing
  1417.        OUTPUT  OUTPUT,EJECTF       Eject page
  1418.        BRANCH  CMTCLR           Join terminal processing
  1419. *_
  1420. *---------------------------------------------------------------------*
  1421. *
  1422. *      Publication of Code Trees
  1423. *
  1424. TREPUB PROC    ,           Publish code tree
  1425.        POP     YPTR           Restore root node
  1426. TREPU1 GETDC   XPTR,YPTR,CODE       Get code descriptor
  1427.        INCRA   CMOFCL,DESCR       Increment offset
  1428.        PUTD    CMBSCL,CMOFCL,XPTR  Insert code descriptor
  1429.        SUM     ZPTR,CMBSCL,CMOFCL  Compute total position
  1430.        ACOMP   ZPTR,OCLIM,TREPU5   Check against limit
  1431. TREPU4 AEQLIC  YPTR,LSON,0,,TREPU2 Is there a left son?
  1432.        GETDC   YPTR,YPTR,LSON       Get left son
  1433.        BRANCH  TREPU1           Continue
  1434. *_
  1435. TREPU2 AEQLIC  YPTR,RSIB,0,,TREPU3 Is there a right sibling?
  1436.        GETDC   YPTR,YPTR,RSIB       Get right sibling
  1437.        BRANCH  TREPU1           Continue
  1438. *_
  1439. TREPU3 AEQLIC  YPTR,FATHER,0,,RTN1 Is there a father?
  1440.        GETDC   YPTR,YPTR,FATHER    Get father
  1441.        BRANCH  TREPU2           Continue
  1442. *_
  1443. TREPU5 SUM     ZPTR,CMOFCL,CODELT  Compute additional to get
  1444.        SETVC   ZPTR,C           Insert CODE data type
  1445.        RCALL   XCL,BLOCK,ZPTR       Allocate new code block
  1446.        AEQLC   LPTR,0,,TREPU6       Is there a last label?
  1447.        PUTDC   LPTR,ATTRIB,XCL       Insert new code position
  1448. TREPU6 MOVBLK  XCL,CMBSCL,CMOFCL   Move old code
  1449.        PUTDC   CMBSCL,DESCR,GOTGCL Insert direct goto
  1450.        PUTDC   CMBSCL,2*DESCR,LIT1CL                E3.7.1
  1451. *                   Insert literal function
  1452.        PUTDC   CMBSCL,3*DESCR,XCL  Insert pointer to new code
  1453.        INCRA   CMBSCL,3*DESCR       Update end pointer
  1454.        RCALL   ,SPLIT,(CMBSCL)       Split off old portion
  1455.        MOVD    CMBSCL,XCL       Set up new compiler base pointer
  1456.        SUM     OCLIM,CMBSCL,ZPTR   Compute new limit
  1457.        DECRA   OCLIM,5*DESCR       Leave safety factor
  1458.        BRANCH  TREPU4           Rejoin processing
  1459. *_
  1460. *---------------------------------------------------------------------*
  1461. *
  1462. *      Unary Operator Analysis
  1463. *
  1464. UNOP   PROC    ,           Unary operator analysis
  1465.        RCALL   ,FORWRD,,COMP3       Get to next nonblank character
  1466.        SETAC   XPTR,0           Zero code tree
  1467.        AEQLC   BRTYPE,NBTYP,RTN1   Verify nonbreak
  1468. UNOPA  STREAM  XSP,TEXTSP,UNOPTB,RTXNAM,RTN1            E3.4.3
  1469. *                   Break out unary operator
  1470.        RCALL   YPTR,BLOCK,CNDSIZ   Allocate block for tree node
  1471.        PUTDC   YPTR,CODE,STYPE       Insert function descriptor
  1472.        AEQLC   XPTR,0,,UNOPB       Is tree empty
  1473.        ADDSON  XPTR,YPTR       Add new node as son
  1474. UNOPB  MOVD    XPTR,YPTR       Move to new node
  1475.        BRANCH  UNOPA           Continue
  1476. *_
  1477. *---------------------------------------------------------------------*
  1478.        TITLE   'Interpreter Executive and Control Procedures'
  1479. *
  1480. *      Code Basing
  1481. *
  1482. BASE   PROC    ,           Interpreter code basing procedure
  1483.        SUM     OCBSCL,OCBSCL,OCICL Add offset to base
  1484.        SETAC   OCICL,0           Zero offset
  1485.        BRANCH  RTNUL3
  1486. *_
  1487. *---------------------------------------------------------------------*
  1488. *
  1489. *      Direct Goto
  1490. *
  1491. GOTG   PROC    ,           :<X>
  1492.        RCALL   OCBSCL,ARGVAL,,INTR5
  1493. *                   Get code pointer
  1494.        VEQLC   OCBSCL,C,INTR4       Must have CODE data type
  1495.        SETAC   OCICL,0           Zero offset
  1496.        BRANCH  RTNUL3
  1497. *_
  1498. *---------------------------------------------------------------------*
  1499. *
  1500. *      Label Goto
  1501. *
  1502. GOTL   PROC    ,           :(X)
  1503.        INCRA   OCICL,DESCR       Increment offset
  1504.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1505.        TESTF   XPTR,FNC,,GOTLC       Test for function
  1506. GOTLV  ACOMPC  TRAPCL,0,,GOTLV1,GOTLV1
  1507. *                   Check &TRACE
  1508.        LOCAPT  ATPTR,TLABL,XPTR,GOTLV1
  1509. *                   Look for LABEL trace
  1510.        PUSH    XPTR           Save variable
  1511.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  1512. *                   Perform trace
  1513.        POP     XPTR           Restore variable
  1514. GOTLV1 DEQL    XPTR,RETCL,GOTL1    Compare with RETURN
  1515.        RRTURN  ,6           Return by value
  1516. *_
  1517. GOTL1  DEQL    XPTR,FRETCL,GOTL2   Compare with FRETURN
  1518.        RRTURN  ,4           Fail
  1519. *_
  1520. GOTL2  DEQL    XPTR,NRETCL,GOTL3   Compare with NRETURN
  1521.        RRTURN  ,5           Return by name
  1522. *_
  1523. GOTL3  GETDC   OCBSCL,XPTR,ATTRIB  Get object code base
  1524.        AEQLC   OCBSCL,0,,INTR4       Must not be zero
  1525.        SETAC   OCICL,0           Zero offset
  1526.        BRANCH  RTNUL3           Return
  1527. *_
  1528. GOTLC  RCALL   XPTR,INVOKE,XPTR,(INTR5,,INTR4)            E3.10.3
  1529. *                   Evaluate goto
  1530.        VEQLC   XPTR,S,INTR4,GOTLV  Variable must be STRING
  1531. *_
  1532. *---------------------------------------------------------------------*
  1533. *
  1534. *      Internal Goto
  1535. *
  1536. GOTO   PROC    ,           Interpreter goto procedure
  1537.        INCRA   OCICL,DESCR       Increment offset
  1538.        GETD    OCICL,OCBSCL,OCICL  Get offset
  1539.        BRANCH  RTNUL3           Return
  1540. *_
  1541. *---------------------------------------------------------------------*
  1542. *
  1543. *      Statement Initialization
  1544. *
  1545. INIT   PROC    ,           Statement initialization procedure
  1546.        MOVD    LSTNCL,STNOCL       Update &LASTNO
  1547.        INCRA   OCICL,DESCR       Increment offset
  1548.        GETD    XCL,OCBSCL,OCICL    Get statement data
  1549.        MOVA    STNOCL,XCL       Update &STNO
  1550.        SETAV   FRTNCL,XCL       Set up failure offset
  1551.        ACOMP   EXNOCL,EXLMCL,EXEX,EXEX
  1552. *                   Check &STLIMIT
  1553.        INCRA   EXNOCL,1        Increment &STCOUNT
  1554.        ACOMPC  TRAPCL,0,,RTNUL3,RTNUL3
  1555. *                   Check &TRACE
  1556.        LOCAPT  ATPTR,TKEYL,STCTKY,RTNUL3
  1557.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  1558. *                   Perform trace
  1559.        BRANCH  RTNUL3
  1560. *_
  1561. *---------------------------------------------------------------------*
  1562. *
  1563. *      Basic Interpreter Procedure
  1564. *
  1565. INTERP PROC    ,           Interpreter core procedure
  1566.        INCRA   OCICL,DESCR       Increment offset
  1567.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1568.        TESTF   XPTR,FNC,INTERP       Test for function
  1569.        RCALL   XPTR,INVOKE,(XPTR),(,INTERP,INTERP,RTN1,RTN2,RTN3)
  1570.        MOVD    OCICL,FRTNCL       Set offset for failure
  1571.        INCRA   FALCL,1           Increment &STFCOUNT
  1572.        ACOMPC  TRAPCL,0,,INTERP,INTERP
  1573. *                   Check &TRACE
  1574.        LOCAPT  ATPTR,TKEYL,FALKY,INTERP
  1575.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  1576. *                   Perform trace
  1577.        BRANCH  INTERP
  1578. *_
  1579. *---------------------------------------------------------------------*
  1580. *
  1581. *      Procedure Invocation
  1582. *
  1583. INVOKE PROC    ,           Invokation procedure
  1584.        POP     INCL           Get function index
  1585.        GETDC   XPTR,INCL,0       Get procedure descriptor
  1586.        VEQL    INCL,XPTR,INVK2       Check argument counts
  1587. INVK1  BRANIC  INCL,0           If equal, branch indirect
  1588. *_
  1589. INVK2  TESTF   XPTR,FNC,ARGNER,INVK1
  1590. *                   Check for variable argument number
  1591. *_
  1592. *---------------------------------------------------------------------*
  1593.        TITLE   'Argument Evaluation Procedures'
  1594. *
  1595. *      Argument Evaluation
  1596. *
  1597. ARGVAL PROC    ,           Procedure to evaluate argument
  1598.        INCRA   OCICL,DESCR       Increment interpreter offset
  1599.        GETD    XPTR,OCBSCL,OCICL   Get argument
  1600.        TESTF   XPTR,FNC,,ARGVC       Test for function descriptor
  1601. ARGV1  AEQLC   INSW,0,,ARGV2       Check &INPUT
  1602.        LOCAPV  ZPTR,INATL,XPTR,ARGV2
  1603. *                   Look for input association
  1604.        GETDC   ZPTR,ZPTR,DESCR       Get input descriptor
  1605.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),(FAIL,RTXNAM)
  1606. *_
  1607. ARGVC  RCALL   XPTR,INVOKE,(XPTR),(FAIL,ARGV1,RTXNAM)
  1608. *_
  1609. ARGV2  GETDC   XPTR,XPTR,DESCR       Get value from name
  1610.        BRANCH  RTXNAM
  1611. *_
  1612. *---------------------------------------------------------------------*
  1613. *
  1614. *      Evaluation of Unevaluated Expressions
  1615. *
  1616. EXPVAL PROC    ,           Procedure to evaluate expression
  1617.        SETAC   SCL,1           Note procedure entrance
  1618. EXPVJN POP     XPTR           Restore pointer to object code
  1619. EXPVJ2 PUSH    (OCBSCL,OCICL,PATBCL,PATICL,WPTR,XCL,YCL,TCL)
  1620.        PUSH    (MAXLEN,LENFCL,PDLPTR,PDLHED,NAMICL,NHEDCL)
  1621. *                   Save system state descriptors
  1622.        SPUSH   (HEADSP,TSP,TXSP,XSP)
  1623. *                   Save system state specifiers
  1624.        MOVD    OCBSCL,XPTR       Set up new code base
  1625.        SETAC   OCICL,DESCR       Initialize offset
  1626.        MOVD    PDLHED,PDLPTR       Set up new history list header
  1627.        MOVD    NHEDCL,NAMICL       Set up new name list header
  1628.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1629.        TESTF   XPTR,FNC,,EXPVC       Check for function
  1630. EXPV11 AEQLC   SCL,0,,EXPV6       Check procedure entry
  1631.        AEQLC   INSW,0,,EXPV4       Check &INPUT
  1632.        LOCAPV  ZPTR,INATL,XPTR,EXPV4
  1633. *                   Look for input association
  1634.        GETDC   ZPTR,ZPTR,DESCR       Get input association
  1635.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),(EXPV1,EXPV6)
  1636. *                   Perform input
  1637. *_
  1638. EXPV4  GETDC   XPTR,XPTR,DESCR       Get value
  1639. EXPV6  SETAC   SCL,2           Set up exit
  1640.        BRANCH  EXPV7           Join processing
  1641. *_
  1642. EXPV9  POP     SCL           Popoff switch
  1643. EXPV1  SETAC   SCL,1           Set new exit switch
  1644. EXPV7  SPOP    (XSP,TXSP,TSP,HEADSP)
  1645. *                   Restore system specifiers
  1646.        POP     (NHEDCL,NAMICL,PDLHED,PDLPTR,LENFCL,MAXLEN)
  1647.        POP     (TCL,YCL,XCL,WPTR,PATICL,PATBCL,OCICL,OCBSCL)
  1648. *                   Restore system descriptors
  1649.        SELBRA  SCL,(FAIL,RTXNAM,RTZPTR)
  1650. *                   Select exit
  1651. *_
  1652. EXPVC  PUSH    SCL           Save entrance indicator
  1653.        RCALL   XPTR,INVOKE,XPTR,(EXPV9,EXPV5,)
  1654. *                   Evaluate function
  1655.        POP     SCL           Restore entrance indicator
  1656.        AEQLC   SCL,0,EXPV6       Check entry indicator
  1657.        SETAC   SCL,3           Set exit switch
  1658.        MOVD    ZPTR,XPTR       Set up value
  1659.        BRANCH  EXPV7           Join end processing
  1660. *_
  1661. EXPV5  POP     SCL           Restore entry indicator
  1662.        BRANCH  EXPV11           Join processing with name
  1663. *_
  1664. EXPEVL PROC    EXPVAL           Procedure to get expression value
  1665.        SETAC   SCL,0           Set entry indicator
  1666.        BRANCH  EXPVJN           Join processing
  1667. *_
  1668. EVAL   PROC    EXPVAL           EVAL(X)
  1669.        RCALL   XPTR,ARGVAL,,FAIL   Get argument
  1670.        VEQLC   XPTR,E,,EVAL1       Is it EXPRESSION?
  1671.        VEQLC   XPTR,I,,RTXPTR       INTEGER is idempotent
  1672.        VEQLC   XPTR,R,,RTXPTR       REAL is idempotent
  1673.        VEQLC   XPTR,S,INTR1       Is it STRING?
  1674.        LOCSP   XSP,XPTR        Get specifier
  1675.        LEQLC   XSP,0,,RTXPTR                    E3.1.4
  1676.        SPCINT  XPTR,XSP,,RTXPTR    Convert to INTEGER
  1677.        SPREAL  XPTR,XSP,,RTXPTR    Convert to REAL
  1678.        MOVD    ZPTR,XPTR       Set up to convert to EXPRESSION
  1679.        RCALL   XPTR,CONVE,,(FAIL,INTR10)
  1680. *                   Convert to EXPRESSION
  1681. EVAL1  SETAC   SCL,0           Set up entry indicator
  1682.        BRANCH  EXPVJ2           Join processing
  1683. *_
  1684. *---------------------------------------------------------------------*
  1685. *
  1686. *      Evaluation of Integer Argument
  1687. *
  1688. INTVAL PROC    ,           Integer argument procedure
  1689.        INCRA   OCICL,DESCR       Increment offset
  1690.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1691.        TESTF   XPTR,FNC,,INTVC       Check for function
  1692. INTV1  AEQLC   INSW,0,,INTV3       Check &INPUT
  1693.        LOCAPV  ZPTR,INATL,XPTR,INTV3
  1694. *                   Look for input association
  1695.        GETDC   ZPTR,ZPTR,DESCR       Get association
  1696.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),FAIL
  1697. *                   Perform input
  1698. INTV   LOCSP   XSP,XPTR        Get specifier for string
  1699.        SPCINT  XPTR,XSP,INTR1,RTXNAM
  1700. *                   Convert to integer
  1701. *_
  1702. INTV3  GETDC   XPTR,XPTR,DESCR       Get value
  1703. INTV2  VEQLC   XPTR,I,,RTXNAM       INTEGER desired
  1704.        VEQLC   XPTR,S,INTR1,INTV   STRING must be converted
  1705. *_
  1706. INTVC  RCALL   XPTR,INVOKE,(XPTR),(FAIL,INTV1,INTV2)
  1707. *_
  1708. *---------------------------------------------------------------------*
  1709. *
  1710. *      Evaluation of Argument as Pattern
  1711. *
  1712. PATVAL PROC    ,           Evaluate argument as pattern
  1713.        INCRA   OCICL,DESCR       Increment offset
  1714.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1715.        TESTF   XPTR,FNC,,PATVC       Check for function descriptor
  1716. PATV1  AEQLC   INSW,0,,PATV2       Check &INPUT
  1717.        LOCAPV  ZPTR,INATL,XPTR,PATV2
  1718. *                   Look for input association
  1719.        GETDC   ZPTR,ZPTR,DESCR       Get association
  1720.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),(FAIL,RTXNAM)
  1721. *                   Perform input
  1722. *_
  1723. PATVC  RCALL   XPTR,INVOKE,(XPTR),(FAIL,PATV1,PATV3)
  1724. *                   Evaluate argument
  1725. *_
  1726. PATV2  GETDC   XPTR,XPTR,DESCR       Get value
  1727. PATV3  VEQLC   XPTR,P,,RTXNAM       Is it PATTERN?
  1728.        VEQLC   XPTR,S,,RTXNAM       Is it STRING?
  1729.        VEQLC   XPTR,I,,GENVIX       Is it INTEGER?
  1730.        VEQLC   XPTR,R,,PATVR       Is it REAL?
  1731.        VEQLC   XPTR,E,INTR1       Is it EXPRESSION?
  1732.        RCALL   TPTR,BLOCK,STARSZ   Allocate block for pattern
  1733.        MOVBLK  TPTR,STRPAT,STARSZ  Copy pattern for expression
  1734.        PUTDC   TPTR,4*DESCR,XPTR   Insert expression
  1735.        MOVD    XPTR,TPTR       Set up value
  1736.        BRANCH  RTXNAM           Return
  1737. *_
  1738. PATVR  REALST  XSP,XPTR        Convert REAL to STRING
  1739.        RCALL   XPTR,GENVAR,XSPPTR,RTXNAM
  1740. *                   Generate variable
  1741. *_
  1742. *---------------------------------------------------------------------*
  1743. *
  1744. *      Evaluation of Argument as String
  1745. *
  1746. VARVAL PROC    ,           Evaluate argument as string
  1747.        INCRA   OCICL,DESCR       Increment offset
  1748.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  1749.        TESTF   XPTR,FNC,,VARVC       Check for function
  1750. VARV1  AEQLC   INSW,0,,VARV4       Check &INPUT
  1751.        LOCAPV  ZPTR,INATL,XPTR,VARV4
  1752. *                   Look for input association
  1753.        GETDC   ZPTR,ZPTR,DESCR       Get input association
  1754.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),(FAIL,RTXNAM)
  1755. *                   Perform input
  1756. *_
  1757. VARV4  GETDC   XPTR,XPTR,DESCR       Get value
  1758. VARV2  VEQLC   XPTR,S,,RTXNAM       Is it STRING?
  1759.        VEQLC   XPTR,I,INTR1,GENVIX Convert INTEGER to STRING
  1760. *_
  1761. VARVC  RCALL   XPTR,INVOKE,(XPTR),(FAIL,VARV1,VARV2)
  1762. *                   Evaluate function
  1763. *_
  1764. *---------------------------------------------------------------------*
  1765. *
  1766. *      Evaluation of Argument Pair
  1767. *
  1768. XYARGS PROC    ,           Procedure to evaluate argument pair
  1769.        SETAC   SCL,0           Note first argument
  1770. XYN    INCRA   OCICL,DESCR       Increment offset
  1771.        GETD    YPTR,OCBSCL,OCICL   Get object code descriptor
  1772.        TESTF   YPTR,FNC,,XYC       Check for function
  1773. XY1    AEQLC   INSW,0,,XY2       Check &INPUT
  1774.        LOCAPV  ZPTR,INATL,YPTR,XY2 Look for input association
  1775.        GETDC   ZPTR,ZPTR,DESCR       Get input association
  1776.        RCALL   YPTR,PUTIN,(ZPTR,YPTR),FAIL
  1777. *                   Perform input
  1778. XY3    AEQLC   SCL,0,RTN2       Check for completion
  1779.        SETAC   SCL,1           Note seconf argument
  1780.        MOVD    XPTR,YPTR       Set up first argument
  1781.        BRANCH  XYN           Go around again
  1782. *_
  1783. XY2    GETDC   YPTR,YPTR,DESCR       Get value
  1784.        BRANCH  XY3           Continue
  1785. *_
  1786. XYC    PUSH    (SCL,XPTR)       Save indicator and argument
  1787.        RCALL   YPTR,INVOKE,(YPTR),(FAIL,XY4)
  1788. *                   Evaluate function
  1789.        POP     (XPTR,SCL)       Restore indicator and argument
  1790.        BRANCH  XY3           Join processing
  1791. *_
  1792. XY4    POP     (XPTR,SCL)       Restore indicator and argument
  1793.        BRANCH  XY1           Join processing
  1794. *_
  1795. *---------------------------------------------------------------------*
  1796.        TITLE   'Arithmetic Operations, Predicates, and Functions'
  1797. ADD    PROC    ,           X + Y
  1798.        SETAC   SCL,1
  1799.        BRANCH  ARITH
  1800. *_
  1801. DIV    PROC    ADD           X / Y
  1802.        SETAC   SCL,2
  1803.        BRANCH  ARITH
  1804. *_
  1805. EXP    PROC    ADD           X ** Y and X ^ Y
  1806.        SETAC   SCL,3
  1807.        BRANCH  ARITH
  1808. *_
  1809. MPY    PROC    ADD           X * Y
  1810.        SETAC   SCL,4
  1811.        BRANCH  ARITH
  1812. *_
  1813. SUB    PROC    ADD           X - Y
  1814.        SETAC   SCL,5
  1815.        BRANCH  ARITH
  1816. *_
  1817. EQ     PROC    ADD           EQ(X,Y)
  1818.        SETAC   SCL,6
  1819.        BRANCH  ARITH
  1820. *_
  1821. GE     PROC    ADD           GE(X,Y)
  1822.        SETAC   SCL,7
  1823.        BRANCH  ARITH
  1824. *_
  1825. GT     PROC    ADD           GT(X,Y)
  1826.        SETAC   SCL,8
  1827.        BRANCH  ARITH
  1828. *_
  1829. LE     PROC    ADD           LE(X,Y)
  1830.        SETAC   SCL,9
  1831.        BRANCH  ARITH
  1832. *_
  1833. LT     PROC    ADD           LT(X,Y)
  1834.        SETAC   SCL,10
  1835.        BRANCH  ARITH
  1836. *_
  1837. NE     PROC    ADD           NE(X,Y)
  1838.        SETAC   SCL,11
  1839.        BRANCH  ARITH
  1840. *_
  1841. REMDR  PROC    ADD           REMDR(X,Y)
  1842.        SETAC   SCL,12
  1843.        BRANCH  ARITH
  1844. *_
  1845. ARITH  PUSH    SCL           Save procedure switch
  1846.        RCALL   ,XYARGS,,FAIL       Evaluate arguments
  1847.        POP     SCL           Restore procedure switch
  1848.        SETAV   DTCL,XPTR       Set up data type pair
  1849.        MOVV    DTCL,YPTR
  1850.        DEQL    DTCL,IIDTP,,ARTHII  INTEGER-INTEGER
  1851.        DEQL    DTCL,IVDTP,,ARTHIV  INTEGER-STRING
  1852.        DEQL    DTCL,VIDTP,,ARTHVI  STRING-INTEGER
  1853.        DEQL    DTCL,VVDTP,,ARTHVV  STRING-STRING
  1854.        DEQL    DTCL,RRDTP,,ARTHRR  REAL-REAL
  1855.        DEQL    DTCL,IRDTP,,ARTHIR  INTEGER-REAL
  1856.        DEQL    DTCL,RIDTP,,ARTHRI  REAL-INTEGER
  1857.        DEQL    DTCL,VRDTP,,ARTHVR  STRING-REAL
  1858.        DEQL    DTCL,RVDTP,INTR1,ARTHRV
  1859. *                   REAL-STRING
  1860. *_
  1861. ARTHII SELBRA  SCL,(AD,DV,EX,MP,SB,CEQ,CGE,CGT,CLE,CLT,CNE,RM)
  1862. *_
  1863. ARTHVI LOCSP   XSP,XPTR        Get specifier
  1864.        SPCINT  XPTR,XSP,,ARTHII    Convert string to integer
  1865.        SPREAL  XPTR,XSP,INTR1,ARTHRI
  1866. *                   Convert to real if possible
  1867. *_
  1868. ARTHIV LOCSP   YSP,YPTR        Get specifier
  1869.        SPCINT  YPTR,YSP,,ARTHII    Convert string to integer
  1870.        SPREAL  YPTR,YSP,INTR1,ARTHIR
  1871. *                   Convert to real if possible
  1872. *_
  1873. ARTHVV LOCSP   XSP,XPTR        Get specifier
  1874.        SPCINT  XPTR,XSP,,ARTHIV    Convert string to integer
  1875.        SPREAL  XPTR,XSP,INTR1,ARTHRV
  1876. *                   Convert to real if possible
  1877. *_
  1878. ARTHRR SELBRA  SCL,(AR,DR,EXR,MR,SR,REQ,RGE,RGT,RLE,RLT,RNE,INTR1)
  1879. *_
  1880. ARTHIR INTRL   XPTR,XPTR       Convert integer to real
  1881.        BRANCH  ARTHRR
  1882. *_
  1883. ARTHRI INTRL   YPTR,YPTR       Convert integer to real
  1884.        BRANCH  ARTHRR
  1885. *_
  1886. ARTHVR LOCSP   XSP,XPTR        Get spedifier
  1887.        SPCINT  XPTR,XSP,,ARTHIR    Convert string to integer
  1888.        SPREAL  XPTR,XSP,INTR1,ARTHRR
  1889. *                   Convert to real if possible
  1890. *_
  1891. ARTHRV LOCSP   YSP,YPTR
  1892.        SPCINT  YPTR,YSP,,ARTHRI    Convert string to integer
  1893.        SPREAL  YPTR,YSP,INTR1,ARTHRR
  1894. *                   Convert to real if possible
  1895. *_
  1896. AD     SUM     ZPTR,XPTR,YPTR,AERROR,ARTN
  1897. *_
  1898. DV     DIVIDE  ZPTR,XPTR,YPTR,AERROR,ARTN
  1899. *_
  1900. EX     EXPINT  ZPTR,XPTR,YPTR,AERROR,ARTN
  1901. *_
  1902. MP     MULT    ZPTR,XPTR,YPTR,AERROR,ARTN
  1903. *_
  1904. SB     SUBTRT  ZPTR,XPTR,YPTR,AERROR,ARTN
  1905. *_
  1906. CEQ    AEQL    XPTR,YPTR,FAIL,RETNUL
  1907. *_
  1908. CGE    ACOMP   XPTR,YPTR,RETNUL,RETNUL,FAIL
  1909. *_
  1910. CGT    ACOMP   XPTR,YPTR,RETNUL,FAIL,FAIL
  1911. *_
  1912. CLE    ACOMP   XPTR,YPTR,FAIL,RETNUL,RETNUL
  1913. *_
  1914. CLT    ACOMP   XPTR,YPTR,FAIL,FAIL,RETNUL
  1915. *_
  1916. CNE    AEQL    XPTR,YPTR,RETNUL,FAIL
  1917. *_
  1918. AR     ADREAL  ZPTR,XPTR,YPTR,AERROR,ARTN
  1919. *_
  1920. DR     DVREAL  ZPTR,XPTR,YPTR,AERROR,ARTN
  1921. *_
  1922. EXR    EXREAL  ZPTR,XPTR,YPTR,AERROR,ARTN
  1923. *_
  1924. MR     MPREAL  ZPTR,XPTR,YPTR,AERROR,ARTN
  1925. *_
  1926. SR     SBREAL  ZPTR,XPTR,YPTR,AERROR,ARTN
  1927. *_
  1928. REQ    RCOMP   XPTR,YPTR,FAIL,RETNUL,FAIL
  1929. *_
  1930. RGE    RCOMP   XPTR,YPTR,RETNUL,RETNUL,FAIL
  1931. *_
  1932. RGT    RCOMP   XPTR,YPTR,RETNUL,FAIL,FAIL
  1933. *_
  1934. RLE    RCOMP   XPTR,YPTR,FAIL,RETNUL,RETNUL
  1935. *_
  1936. RLT    RCOMP   XPTR,YPTR,FAIL,FAIL,RETNUL
  1937. *_
  1938. RNE    RCOMP   XPTR,YPTR,RETNUL,FAIL,RETNUL
  1939. *_
  1940. RM     DIVIDE  ZPTR,XPTR,YPTR,AERROR
  1941. *                   First divide
  1942.        MULT    WPTR,ZPTR,YPTR       Multiply truncated part
  1943.        SUBTRT  ZPTR,XPTR,WPTR       Get difference
  1944.        BRANCH  ARTN
  1945. *_
  1946. *---------------------------------------------------------------------*
  1947. *
  1948. *      INTEGER(X)
  1949. *
  1950. INTGER PROC    ,           INTEGER(X)
  1951.        RCALL   XPTR,ARGVAL,,FAIL   Get argument
  1952.        VEQLC   XPTR,I,,RETNUL       INTEGER succeeds
  1953.        VEQLC   XPTR,S,FAIL       STRING must be checked
  1954.        LOCSP   XSP,XPTR        Get specifier
  1955.        SPCINT  XPTR,XSP,FAIL,RETNUL
  1956. *                   Try conversion to INTEGER
  1957. *_
  1958. *---------------------------------------------------------------------*
  1959. *
  1960. *      Arithmetic Negative
  1961. *
  1962. MNS    PROC    ,           -X
  1963.        RCALL   XPTR,ARGVAL,,FAIL   Get argument
  1964.        VEQLC   XPTR,I,,MNSM       INTEGER acceptable
  1965.        VEQLC   XPTR,S,,MNSV       STRING must be converted
  1966.        VEQLC   XPTR,R,INTR1,MNSR   REAL is acceptable
  1967. *_
  1968. MNSM   MNSINT  ZPTR,XPTR,AERROR,ARTN
  1969. *                   Form negative of integer
  1970. *_
  1971. MNSV   LOCSP   XSP,XPTR        Get specifier for string
  1972.        SPCINT  XPTR,XSP,,MNSM       Convert to INTEGER
  1973.        SPREAL  XPTR,XSP,INTR1       Convert to REAL
  1974. MNSR   MNREAL  ZPTR,XPTR       Form negative of real
  1975.        BRANCH  ARTN
  1976. *_
  1977. *---------------------------------------------------------------------*
  1978. *
  1979. *      Unary Plus Operator
  1980. *
  1981. PLS    PROC    ,           +X
  1982.        RCALL   ZPTR,ARGVAL,,FAIL   Get argument
  1983.        VEQLC   ZPTR,I,,ARTN       Is it INTEGER?
  1984.        VEQLC   ZPTR,S,,PLSV       Is it STRING?
  1985.        VEQLC   ZPTR,R,INTR1,ARTN   Is it REAL?
  1986. *_
  1987. PLSV   LOCSP   XSP,ZPTR        Get specifier
  1988.        SPCINT  ZPTR,XSP,,ARTN       Convert STRING to INTEGER
  1989.        SPREAL  ZPTR,XSP,INTR1,ARTN Convert STRING to REAL
  1990. *_
  1991. *---------------------------------------------------------------------*
  1992.        TITLE   'Pattern-valued Functions and Operations'
  1993. ANY    PROC    ,           ANY(S)
  1994.        PUSH    ANYCCL           Save function descriptor
  1995.        BRANCH  CHARZ           Join common processing
  1996. *_
  1997. BREAK  PROC    ANY           BREAK(S)
  1998.        PUSH    BRKCCL           Save function descriptor
  1999.        PUSH    ZEROCL           Save minimum length of zero
  2000.        BRANCH  ABNSND           Join common processing
  2001. *_
  2002. NOTANY PROC    ANY           NOTANY(S)
  2003.        PUSH    NNYCCL           Save function descriptor
  2004.        BRANCH  CHARZ
  2005. *_
  2006. SPAN   PROC    ANY           SPAN(S)
  2007.        PUSH    SPNCCL           Save function descriptor
  2008. CHARZ  PUSH    CHARCL           Save minimum length of one
  2009. ABNSND RCALL   XPTR,ARGVAL,,FAIL   Evaluate argument
  2010.        POP     (ZCL,YCL)       Restore descriptor and length
  2011.        VEQLC   XPTR,S,,PATNOD       STRING is acceptable argument
  2012.        VEQLC   XPTR,E,,PATNOD       So is EXPRESSION
  2013.        VEQLC   XPTR,I,INTR1       INTEGER must be converted
  2014.        RCALL   XPTR,GNVARI,XPTR
  2015. PATNOD DEQL    XPTR,NULVCL,,NONAME                E3.5.4
  2016.        RCALL   TPTR,BLOCK,LNODSZ                E3.5.4
  2017.        MAKNOD  ZPTR,TPTR,ZCL,ZEROCL,YCL,XPTR
  2018. *                   Construct the pattern
  2019.        BRANCH  RTZPTR
  2020. *_
  2021. LEN    PROC    ANY           LEN(N)
  2022.        PUSH    LNTHCL           Save function descriptor
  2023.        BRANCH  LPRTND
  2024. *_
  2025. POS    PROC    ANY           POS(N)
  2026.        PUSH    POSICL           Save function descriptor
  2027.        BRANCH  LPRTND
  2028. *_
  2029. RPOS   PROC    ANY           RPOS(N)
  2030.        PUSH    RPSICL           Save function descriptor
  2031.        BRANCH  LPRTND
  2032. *_
  2033. RTAB   PROC    ANY           RTAB(N)
  2034.        PUSH    RTBCL           Save function descriptor
  2035.        BRANCH  LPRTND
  2036. *_
  2037. TAB    PROC    ANY           TAB(N)
  2038.        PUSH    TBCL           Save function descriptor
  2039. LPRTND RCALL   XPTR,ARGVAL,,FAIL   Evaluate argument
  2040.        POP     YCL           Restore function descriptor
  2041.        MOVD    ZCL,ZEROCL       Predict minimum length of zero
  2042.        VEQLC   XPTR,I,,LPRTNI       If INTEGER check for LEN
  2043.        VEQLC   XPTR,E,,PATNOD       EXPRESSION is acceptable
  2044.        VEQLC   XPTR,S,INTR1       STRING must be converted to INTEGER
  2045.        LOCSP   ZSP,XPTR        Get specifier
  2046.        SPCINT  XPTR,ZSP,INTR1       Convert to INTEGER
  2047. LPRTNI ACOMPC  XPTR,0,,,LENERR                    E3.6.1
  2048.        DEQL    YCL,LNTHCL,PATNOD                E3.6.1
  2049.        MOVA    ZCL,XPTR        If so, use value of integer
  2050.        BRANCH  PATNOD           Go form pattern
  2051. *_
  2052. *---------------------------------------------------------------------*
  2053. *
  2054. *      ARBNO(P)
  2055. *
  2056. ARBNO  PROC    ,           ARBNO(P)
  2057.        RCALL   XPTR,PATVAL,,FAIL   Evaluate argument as pattern
  2058.        VEQLC   XPTR,P,,ARBP       PATTERN is desired form
  2059.        VEQLC   XPTR,S,INTR1       STRING must be made into PATTERN
  2060.        LOCSP   TSP,XPTR        Get specifier
  2061.        GETLG   TMVAL,TSP       Get length of string
  2062.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for argument
  2063.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  2064. ARBP   GETSIZ  XSIZ,XPTR       Get size of pattern
  2065.        SUM     TSIZ,XSIZ,ARBSIZ    Add additional space for ARBNO node
  2066.        SETVC   TSIZ,P           Insert PATTERN data type
  2067.        RCALL   TPTR,BLOCK,TSIZ       Allocate block for pattern
  2068.        MOVD    ZPTR,TPTR       Save pointer to return
  2069.        GETSIZ  TSIZ,ARHEAD       Set up copy for heading node
  2070.        CPYPAT  TPTR,ARHEAD,ZEROCL,ZEROCL,ZEROCL,TSIZ
  2071.        SUM     ZSIZ,XSIZ,TSIZ
  2072.        CPYPAT  TPTR,XPTR,ZEROCL,TSIZ,ZSIZ,XSIZ
  2073.        SUM     TSIZ,NODSIZ,NODSIZ  Set up size for trailing node
  2074.        CPYPAT  TPTR,ARTAIL,ZEROCL,ZSIZ,ZEROCL,TSIZ
  2075.        SUM     ZSIZ,TSIZ,ZSIZ       Set up size for backup node
  2076.        CPYPAT  TPTR,ARBACK,ZEROCL,ZSIZ,TSIZ,TSIZ
  2077.        BRANCH  RTZPTR
  2078. *_
  2079. *---------------------------------------------------------------------*
  2080. *
  2081. *      @X
  2082. *
  2083. ATOP   PROC    ,           @X
  2084.        INCRA   OCICL,DESCR       Increment interpreter offset
  2085.        GETD    YPTR,OCBSCL,OCICL   Get object code descriptor
  2086.        TESTF   YPTR,FNC,ATOP1       Test for function descriptor
  2087.        RCALL   YPTR,INVOKE,YPTR,(FAIL,ATOP1,)
  2088.        VEQLC   YPTR,E,NEMO       Only EXPRESSION can be value
  2089. ATOP1  RCALL   TPTR,BLOCK,LNODSZ   Allocate pattern node
  2090.        MAKNOD  ZPTR,TPTR,ZEROCL,ZEROCL,ATOPCL,YPTR
  2091.        BRANCH  RTZPTR
  2092. *_
  2093. *---------------------------------------------------------------------*
  2094. *
  2095. *      Value Assignment Operators
  2096. *
  2097. NAM    PROC    ,           X . Y
  2098.        PUSH    ENMECL           Save function descriptor
  2099.        BRANCH  NAM5           Join processing
  2100. *_
  2101. DOL    PROC    NAM           X $ Y
  2102.        PUSH    ENMICL           Save function descritpor
  2103. NAM5   RCALL   XPTR,PATVAL,,FAIL   Get pattern for first argument
  2104.        INCRA   OCICL,DESCR       Increment offset
  2105.        GETD    YPTR,OCBSCL,OCICL   Get object code descriptor
  2106.        TESTF   YPTR,FNC,,NAMC2       Check for function
  2107. NAM3   VEQLC   XPTR,S,,NAMV       Is first argument STRING?
  2108.        VEQLC   XPTR,P,INTR1,NAMP   Is it PATTERN?
  2109. *_
  2110. NAMC2  PUSH    XPTR           Save first argument
  2111.        RCALL   YPTR,INVOKE,YPTR,(FAIL,NAM4,)
  2112. *                   Evaluate second argument
  2113.        VEQLC   YPTR,E,NEMO       Verify EXPRESSION
  2114. NAM4   POP     XPTR           Restore first argument
  2115.        BRANCH  NAM3           Join processing
  2116. *_
  2117. NAMV   LOCSP   TSP,XPTR        Get specifier
  2118.        GETLG   TMVAL,TSP       Get length
  2119.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for pattern
  2120.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  2121. *                   Make pattern node
  2122. NAMP   RCALL   TPTR,BLOCK,SNODSZ   Allocate block for pattern
  2123.        MAKNOD  WPTR,TPTR,ZEROCL,ZEROCL,NMECL
  2124. *                   Make node for naming
  2125.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for  pattern
  2126.        POP     TVAL           Restore function descriptor
  2127.        MAKNOD  YPTR,TPTR,ZEROCL,ZEROCL,TVAL,YPTR
  2128. *                   Make pattern for backup
  2129.        GETSIZ  XSIZ,XPTR       Get size of first pattern
  2130.        SUM     YSIZ,XSIZ,NODSIZ    Compute total size
  2131.        GETSIZ  TSIZ,YPTR       Get size of naming node
  2132.        SUM     ZSIZ,YSIZ,TSIZ       Compute total
  2133.        SETVC   ZSIZ,P           Insert PATTERN data type
  2134.        RCALL   TPTR,BLOCK,ZSIZ       Allocate block for total pattern
  2135.        MOVD    ZPTR,TPTR       Save copy
  2136.        LVALUE  TVAL,XPTR       Get least value
  2137.        CPYPAT  TPTR,WPTR,TVAL,ZEROCL,NODSIZ,NODSIZ
  2138. *                   Copy three patterns
  2139.        CPYPAT  TPTR,XPTR,ZEROCL,NODSIZ,YSIZ,XSIZ
  2140.        CPYPAT  TPTR,YPTR,ZEROCL,YSIZ,ZEROCL,TSIZ
  2141.        BRANCH  RTZPTR           Return pattern as value
  2142. *_
  2143. *---------------------------------------------------------------------*
  2144. *
  2145. *      Binary Alternation Operator
  2146. *
  2147. OR     PROC    ,           X | Y
  2148.        RCALL   XPTR,PATVAL,,FAIL   Get first argument
  2149.        PUSH    XPTR           Save first argument
  2150.        RCALL   YPTR,PATVAL,,FAIL   Get second argument
  2151.        POP     XPTR           Restore first argument
  2152.        SETAV   DTCL,XPTR       Get first data type
  2153.        MOVV    DTCL,YPTR       Insert second data type
  2154.        DEQL    DTCL,VVDTP,,ORVV    Is it STRING-STRING?
  2155.        DEQL    DTCL,VPDTP,,ORVP    Is it STRING-PATTERN?
  2156.        DEQL    DTCL,PVDTP,,ORPV    Is it PATTERN-STRING?
  2157.        DEQL    DTCL,PPDTP,INTR1,ORPP
  2158. *                   Is it PATTERN_PATTERN?
  2159. *_
  2160. ORVV   LOCSP   XSP,XPTR        Get specifier
  2161.        GETLG   TMVAL,XSP       Get length
  2162.        RCALL   TPTR,BLOCK,LNODSZ   Get block for pattern
  2163.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  2164. *                   Construct pattern
  2165. ORPV   LOCSP   YSP,YPTR        Get specifier
  2166.        GETLG   TMVAL,YSP       Get length
  2167.        RCALL   TPTR,BLOCK,LNODSZ   Get block for pattern
  2168.        MAKNOD  YPTR,TPTR,TMVAL,ZEROCL,CHRCL,YPTR
  2169. *                   Construct pattern
  2170. ORPP   GETSIZ  XSIZ,XPTR       Get size of first pattern
  2171.        GETSIZ  YSIZ,YPTR       Get size of second pattern
  2172.        SUM     TSIZ,XSIZ,YSIZ       Compute total size
  2173.        SETVC   TSIZ,P           Insert PATTERN data type
  2174.        RCALL   TPTR,BLOCK,TSIZ       Allocate block for pattern
  2175.        MOVD    ZPTR,TPTR       Save copy
  2176.        CPYPAT  TPTR,XPTR,ZEROCL,ZEROCL,ZEROCL,XSIZ
  2177. *                   Copy first pattern
  2178.        CPYPAT  TPTR,YPTR,ZEROCL,XSIZ,ZEROCL,YSIZ
  2179. *                   Copy second pattern
  2180.        LINKOR  ZPTR,XSIZ       Link alternatives
  2181.        BRANCH  RTZPTR           Return pattern as value
  2182. *_
  2183. ORVP   LOCSP   XSP,XPTR        Get specifier
  2184.        GETLG   TMVAL,XSP       Get length
  2185.        RCALL   TPTR,BLOCK,LNODSZ   Get block for pattern
  2186.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  2187. *                   Construct pattern
  2188.        BRANCH  ORPP           Join processing
  2189. *_
  2190. *---------------------------------------------------------------------*
  2191.        TITLE   'Pattern Matching Procedures'
  2192. *
  2193. *      Simple Pattern Matching
  2194. *
  2195. SCAN   PROC    ,           Pattern Matching
  2196.        RCALL   XPTR,ARGVAL,,FAIL   Get subject
  2197.        PUSH    XPTR           Save subject
  2198.        RCALL   YPTR,PATVAL,,FAIL   Get pattern
  2199.        POP     XPTR           Restore subject
  2200.        SETAV   DTCL,XPTR       Set up data type pair
  2201.        MOVV    DTCL,YPTR
  2202.        INCRA   SCNCL,1           Increment count of scanner entries
  2203.        DEQL    DTCL,VVDTP,,SCANVV  Is it STRING-STRING?
  2204.        DEQL    DTCL,VPDTP,,SCANVP  Is it STRING-PATTERN?
  2205.        DEQL    DTCL,IVDTP,,SCANIV  Is it INTEGER-STRING?
  2206.        DEQL    DTCL,RVDTP,,SCANRV  Is it REAL-STRING?
  2207.        DEQL    DTCL,RPDTP,,SCANRP  Is it REAL-PATTERN?
  2208.        DEQL    DTCL,IPDTP,INTR1,SCANIP
  2209. *                   Is it INTEGER-PATTERN?
  2210. *_
  2211. SCANVV LOCSP   XSP,XPTR        Get specifier for subject
  2212.        LOCSP   YSP,YPTR        Get specifier for pattern
  2213. SCANVB SUBSP   TSP,YSP,XSP,FAIL    Get part to compare
  2214.        LEXCMP  TSP,YSP,,RETNUL       Compare strings
  2215.        AEQLC   ANCCL,0,FAIL       Check &ANCHOR
  2216.        FSHRTN  XSP,1           Delete lead character
  2217.        BRANCH  SCANVB           Try again
  2218. *_
  2219. SCANIV RCALL   XPTR,GNVARI,XPTR    Generate variable for integer
  2220.        BRANCH  SCANVV           Join processing
  2221. *_
  2222. SCANVP LOCSP   XSP,XPTR        Get specifier for subject
  2223.        RCALL   ,SCNR,,(FAIL,,FAIL) Call scanner
  2224.        RCALL   ,NMD,,(FAIL,RTN2)   Perform naming
  2225. *_
  2226. SCANIP RCALL   XPTR,GNVARI,XPTR    Generate variable for integer
  2227.        BRANCH  SCANVP           Join processing
  2228. *_
  2229. SCANRV REALST  XSP,XPTR        Convert REAL to STRING
  2230.        RCALL   XPTR,GENVAR,XSPPTR,SCANVV
  2231. *_
  2232. SCANRP REALST  XSP,XPTR        Convert REAL to STRING
  2233.        RCALL   XPTR,GENVAR,XSPPTR,SCANVP
  2234. *                   Generate variable
  2235. *_
  2236. *_
  2237. *---------------------------------------------------------------------*
  2238. *
  2239. *      Pattern Matching with Replacement
  2240. *
  2241. SJSR   PROC    ,           Pattern matching with replacement
  2242.        INCRA   OCICL,DESCR       Increment offset
  2243.        GETD    WPTR,OCBSCL,OCICL   Get object code descriptor
  2244.        TESTF   WPTR,FNC,,SJSRC1    Check for function
  2245. SJSR1  AEQLC   INSW,0,,SJSR1A       Check &INPUT
  2246.        LOCAPV  ZPTR,INATL,WPTR,SJSR1A
  2247. *                   Look of input association
  2248.        GETDC   ZPTR,ZPTR,DESCR       Get association
  2249.        RCALL   XPTR,PUTIN,(ZPTR,WPTR),(FAIL,SJSR1B)
  2250. *                   Perform input
  2251. *_
  2252. SJSR1A GETDC   XPTR,WPTR,DESCR       Get value
  2253. SJSR1B PUSH    (WPTR,XPTR)       Save name and value
  2254.        RCALL   YPTR,PATVAL,,FAIL   Get pattern
  2255.        POP     XPTR           Restore value
  2256.        SETAV   DTCL,XPTR       Set up data type pair
  2257.        MOVV    DTCL,YPTR
  2258.        INCRA   SCNCL,1           Increment count of scanner calls
  2259.        DEQL    DTCL,VVDTP,,SJSSVV  Is it STRING-PATTERN?
  2260.        DEQL    DTCL,VPDTP,,SJSSVP  Is it INTEGER-STRING?
  2261.        DEQL    DTCL,IVDTP,,SJSSIV  Is it INTEGER-PATTERN?
  2262.        DEQL    DTCL,RVDTP,,SJSSRV  Is it REAL-STRING?
  2263.        DEQL    DTCL,RPDTP,,SJSSRP  Is it REAL-PATTERN?
  2264.        DEQL    DTCL,IPDTP,INTR1,SJSSIP
  2265. *_
  2266. SJSRC1 RCALL   WPTR,INVOKE,(WPTR),(FAIL,SJSR1,NEMO)
  2267. *                   Evaluate subject
  2268. *_
  2269. SJSSVP LOCSP   XSP,XPTR        Get specifier
  2270.        RCALL   ,SCNR,,(FAIL,,FAIL) Call scanner
  2271.        SETAC   NAMGCL,1        Set naming switch
  2272.        REMSP   TAILSP,XSP,TXSP       Get tail of subject
  2273.        BRANCH  SJSS1           Join common processing
  2274. *_
  2275. SJSSIP RCALL   XPTR,GNVARI,XPTR    Generate STRING from INTEGER
  2276.        BRANCH  SJSSVP           Join common processing
  2277. *_
  2278. SJSSIV RCALL   XPTR,GNVARI,XPTR    Generate STRING from INTEGER
  2279.        BRANCH  SJSSVV           Join common processing
  2280. *_
  2281. SJSSRV REALST  XSP,XPTR        Convert REAL to STRING
  2282.        RCALL   XPTR,GENVAR,XSPPTR,SJSSVV
  2283. *                   Generate variable
  2284. *_
  2285. SJSSRP REALST  XSP,XPTR        Convert REAL to STRING
  2286.        RCALL   XPTR,GENVAR,XSPPTR,SJSSVP
  2287. *                   Generate variable
  2288. *_
  2289. SJVVON AEQLC   ANCCL,0,FAIL       Check &ANCHOR
  2290.        ADDLG   HEADSP,ONECL       Increment length of head
  2291.        FSHRTN  XSP,1           Delete head character
  2292.        BRANCH  SJSSV2           Join common processing
  2293. *_
  2294. SJSSVV LOCSP   XSP,XPTR        Get specifier for subject
  2295.        LOCSP   YSP,YPTR        Get specifier for pattern
  2296.        SETSP   HEADSP,XSP       Set up head specifier
  2297.        SETLC   HEADSP,0        Initialize zero length
  2298. SJSSV2 SUBSP   TSP,YSP,XSP,FAIL    Get common length
  2299.        LEXCMP  TSP,YSP,SJVVON,,SJVVON
  2300. *                   Compare strings
  2301.        SETAC   NAMGCL,0        Clear naming switch
  2302.        REMSP   TAILSP,XSP,TSP       Get tail of subject
  2303. SJSS1  SPUSH   (TAILSP,HEADSP)       Save head and tail
  2304.        AEQLC   NAMGCL,0,,SJSS1A    Check naming switch
  2305.        RCALL   ,NMD,,FAIL       Perform naming
  2306. SJSS1A RCALL   ZPTR,ARGVAL,,FAIL   Get object
  2307.        SPOP    (HEADSP,TAILSP)       Restore head and tail
  2308.        POP     WPTR           Restore name of subject
  2309.        LEQLC   HEADSP,0,SJSSDT       Check for null head
  2310.        LEQLC   TAILSP,0,,SJSRV1    Check for null tail
  2311. SJSSDT VEQLC   ZPTR,S,,SJSRV       Is object STRING?
  2312.        VEQLC   ZPTR,P,,SJSRP       Is object PATTERN?
  2313.        VEQLC   ZPTR,I,,SJSRI       Is object INTEGER?
  2314.        VEQLC   ZPTR,R,,SJSRR       Is object REAL?
  2315.        VEQLC   ZPTR,E,INTR1       Is object EXPRESSION?
  2316.        RCALL   TPTR,BLOCK,STARSZ   Allocate block for pattern
  2317.        MOVBLK  TPTR,STRPAT,STARSZ  Set up pattern for expression
  2318.        PUTDC   TPTR,4*DESCR,ZPTR   Insert object
  2319.        MOVD    ZPTR,TPTR       Set up converted value
  2320. SJSRP  SETSP   XSP,HEADSP       Copy specifier
  2321.        RCALL   XPTR,GENVAR,(XSPPTR)
  2322. *                   Generate variable for head
  2323.        GETLG   TMVAL,HEADSP       Get length of head
  2324.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for pattern
  2325.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  2326. *                   Make pattern node
  2327.        SETSP   YSP,TAILSP       Set up tail specifier
  2328.        RCALL   YPTR,GENVAR,(YSPPTR)
  2329. *                   Generate variable for tail
  2330.        GETLG   TMVAL,TAILSP       Get length of tail
  2331.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for pattern
  2332.        MAKNOD  YPTR,TPTR,TMVAL,ZEROCL,CHRCL,YPTR
  2333. *                   Make pattern node
  2334.        GETSIZ  XSIZ,XPTR       Get size of head node
  2335.        GETSIZ  YSIZ,YPTR       Get size of tail node
  2336.        GETSIZ  ZSIZ,ZPTR       Get size of object
  2337.        SUM     TSIZ,XSIZ,ZSIZ       Compute total size
  2338.        SUM     TSIZ,TSIZ,YSIZ       Get size of new pattern
  2339.        SETVC   TSIZ,P           Insert PATTERN data type
  2340.        RCALL   TPTR,BLOCK,TSIZ       Allocate block for total pattern
  2341.        MOVD    VVAL,TPTR       Get working copy
  2342.        LVALUE  TVAL,ZPTR       Get least value of replacement
  2343.        CPYPAT  TPTR,XPTR,TVAL,ZEROCL,XSIZ,XSIZ
  2344. *                   Copy in head
  2345.        LVALUE  TVAL,YPTR       Get least value of tail
  2346.        SUM     TSIZ,XSIZ,ZSIZ       Get size of first two
  2347.        CPYPAT  TPTR,ZPTR,TVAL,XSIZ,TSIZ,ZSIZ
  2348. *                   Copy in object
  2349.        CPYPAT  TPTR,YPTR,ZEROCL,TSIZ,ZEROCL,YSIZ
  2350. *                   Copy in tail
  2351.        MOVD    ZPTR,VVAL       Set up return value
  2352.        BRANCH  SJSRV1           Join common processing
  2353. *_
  2354. SJSRV  LOCSP   ZSP,ZPTR
  2355. SJSRS  GETLG   XPTR,TAILSP       Get length of tail
  2356.        GETLG   YPTR,HEADSP       Get length of tail
  2357.        GETLG   ZPTR,ZSP        Get length of object
  2358.        SUM     XPTR,XPTR,YPTR       Compute total length
  2359.        SUM     XPTR,XPTR,ZPTR
  2360.        ACOMP   XPTR,MLENCL,INTR8   Check &MAXLNGTH
  2361.        RCALL   ZPTR,CONVAR,(XPTR)  Allocate storage for string
  2362.        LOCSP   TSP,ZPTR        Get specifier
  2363.        SETLC   TSP,0           Clear length
  2364.        APDSP   TSP,HEADSP       Append head
  2365.        APDSP   TSP,ZSP           Append object
  2366.        APDSP   TSP,TAILSP       Append tail
  2367.        RCALL   ZPTR,GNVARS,XPTR    Enter string into storage
  2368. SJSRV1 PUTDC   WPTR,DESCR,ZPTR       Assign value to subject name
  2369.        AEQLC   OUTSW,0,,SJSRV2       Check &OUTPUT
  2370.        LOCAPV  YPTR,OUTATL,WPTR,SJSRV2
  2371. *                   Look for output association
  2372.        GETDC   YPTR,YPTR,DESCR       Get output association
  2373.        RCALL   ,PUTOUT,(YPTR,ZPTR) Perform output
  2374. SJSRV2 ACOMPC  TRAPCL,0,,RTN3,RTN3 Check &TRACE
  2375.        LOCAPT  ATPTR,TVALL,WPTR,RTN3
  2376. *                   Look for VALUE trace
  2377.        RCALL   ,TRPHND,ATPTR,RTN3                E3.3.1
  2378. *                   Perform trace
  2379. *_
  2380. SJSRI  INTSPC  ZSP,ZPTR        Convert INTEGER
  2381.        BRANCH  SJSRS
  2382. *_
  2383. SJSRR  REALST  ZSP,ZPTR        Convert REAL
  2384.        BRANCH  SJSRS
  2385. *_
  2386. *---------------------------------------------------------------------*
  2387. *
  2388. *      Basic Scanning Procedure
  2389. *
  2390. SCNR   PROC    ,           Scanning procedure
  2391.        GETLG   MAXLEN,XSP       Get maximum length
  2392.        LVALUE  YSIZ,YPTR       Get least value
  2393.        AEQLC   FULLCL,0,SCNR1       Check &FULLSCAN
  2394.        ACOMP   YSIZ,MAXLEN,FAIL    CHeck maximum against minimum
  2395. SCNR1  SETSP   TXSP,XSP        Set up working specifier for head
  2396.        SETLC   TXSP,0           Zero length
  2397.        MOVD    PDLPTR,PDLHED       Initialize history list
  2398.        MOVD    NAMICL,NHEDCL       Initialize name list
  2399.        AEQLC   ANCCL,0,SCNR3       Check &ANCHOR
  2400.        AEQLC   FULLCL,0,,SCNR4       Check &FULLSCAN
  2401.        MOVD    YSIZ,MAXLEN       Set up length
  2402.        BRANCH  SCNR5           Join processing
  2403. *_
  2404. SCNR4  SUBTRT  YSIZ,MAXLEN,YSIZ    Get difference of lengths
  2405. SCNR5  SUM     YSIZ,YSIZ,CHARCL    Add one
  2406. SCNR2  PUSH    (YPTR,YSIZ)       Save pattern and length
  2407.        SETSP   HEADSP,TXSP       Set up head specifier
  2408.        INCRA   PDLPTR,3*DESCR       Make room for history entry
  2409.        ACOMP   PDLPTR,PDLEND,INTR31
  2410. *                   Check for overflow
  2411.        SETAC   LENFCL,1        Set length failure
  2412.        PUTDC   PDLPTR,DESCR,SCONCL Insert scan function
  2413.        GETLG   TMVAL,TXSP       Get cursor position
  2414.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2415. *                   Insert on history list
  2416.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2417. *                   Insert length failure
  2418.        BRANCH  SCIN1           Join common scanning
  2419. *_
  2420. SCNR3  INCRA   PDLPTR,3*DESCR       Make room for history entry
  2421.        ACOMP   PDLPTR,PDLEND,INTR31
  2422. *                   Check for overflow
  2423.        SETLC   HEADSP,0        Zero length of head
  2424.        PUTDC   PDLPTR,DESCR,SCFLCL Insert scan failure function
  2425.        GETLG   TMVAL,TXSP       Get cursor position
  2426.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2427. *                   Insert on history list
  2428.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2429. *                   Insert length failure
  2430.        BRANCH  SCIN1           Join common scanning
  2431. *_
  2432. SCIN   PROC    SCNR
  2433. SCIN1  MOVD    PATBCL,YPTR       Set up pattern base pointer
  2434.        SETAC   PATICL,0        Zero offset
  2435. SCIN2  SETAC   LENFCL,1        Set length failure
  2436. SCIN3  INCRA   PATICL,DESCR       Increment offset
  2437.        GETD    ZCL,PATBCL,PATICL   Get function descriptor
  2438.        INCRA   PATICL,DESCR       Increment offset
  2439.        GETD    XCL,PATBCL,PATICL   Get then-or descriptor
  2440.        INCRA   PATICL,DESCR       Increment offset
  2441.        GETD    YCL,PATBCL,PATICL   Get value-residual descriptor
  2442.        INCRA   PDLPTR,3*DESCR       Make room for history entry
  2443.        ACOMP   PDLPTR,PDLEND,INTR31
  2444. *                   Check for overflow
  2445.        PUTDC   PDLPTR,DESCR,XCL    Insert then-or descriptor
  2446.        GETLG   TMVAL,TXSP       Get cursor position
  2447.        MOVV    TMVAL,YCL       Insert residual
  2448.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2449. *                   Insert on history list
  2450.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2451. *                   Insert length failure
  2452.        AEQLC   FULLCL,0,SCIN4       Check &FULLSCAN
  2453.        CHKVAL  MAXLEN,YCL,TXSP,SALT1
  2454. *                   Check values
  2455. SCIN4  BRANIC  ZCL,0           Branch to procedure
  2456. *_
  2457. SALF   PROC    SCNR           Nonlength failure procedure
  2458. SALF1  SETAC   LENFCL,0        Clear length failure
  2459.        BRANCH  SALT2           Join common processing
  2460. *_
  2461. SALT   PROC    SCNR           Length failure procedure
  2462. SALT1  GETDC   LENFCL,PDLPTR,3*DESCR
  2463. *                   Get length failure from history
  2464. SALT2  GETDC   XCL,PDLPTR,DESCR    Get then-or descriptor
  2465.        GETDC   YCL,PDLPTR,2*DESCR  Get value-residual
  2466.        DECRA   PDLPTR,3*DESCR       Back over history entry
  2467.        MOVD    PATICL,XCL       Set offset to OR link
  2468.        AEQLC   PATICL,0,,SALT3       Check for none
  2469.        PUTLG   TXSP,YCL        Insert old length of head
  2470.        TESTF   PATICL,FNC,SCIN3    Check for function
  2471.        BRANIC  PATICL,0        Branch to procedure
  2472. *_
  2473. SALT3  AEQLC   LENFCL,0,SALT1       Check length failure
  2474.        BRANCH  SALF1           Go to nonlength failure
  2475. *_
  2476. SCOK   PROC    SCNR           Successful scanning procedure
  2477.        SETAV   PATICL,XCL       Set offset from THEN link
  2478.        AEQLC   PATICL,0,SCIN2,RTN2 Check for none
  2479. *_
  2480. SCON   PROC    SCNR
  2481.        AEQLC   FULLCL,0,SCON1       Check &FULLSCAN
  2482.        AEQLC   LENFCL,0,FAIL       Check length failure
  2483. SCON1  POP     (YSIZ,YPTR)       Restore save descriptors
  2484.        DECRA   YSIZ,1           Decrement possible count
  2485.        ACOMPC  YSIZ,0,,FAIL,INTR13 CHeck for end
  2486.        ADDLG   TXSP,ONECL       Increment length of head
  2487.        BRANCH  SCNR2           Continue
  2488. *_
  2489. UNSC   PROC    SCNR           Backout procedure
  2490.        MOVD    PATBCL,YPTR       Reset pattern base
  2491.        BRANCH  SALT3           Join processing
  2492. *_
  2493. *---------------------------------------------------------------------*
  2494. *
  2495. *      ANY, BREAK, NOTANY, SPAN
  2496. *
  2497. ANYC   PROC    ,           Matching procedure for ANY(S)
  2498.        SETAC   SCL,1           Post entry
  2499. ABNS   INCRA   PATICL,DESCR       Increment offset
  2500.        GETD    XPTR,PATBCL,PATICL  Get argument
  2501.        PUSH    SCL           Save processor switch
  2502. ABNS1  VEQLC   XPTR,S,,ABNSV                    E3.5.5
  2503.        VEQLC   XPTR,E,,ABNSE       EXPRESSION must be evaluated
  2504.        VEQLC   XPTR,I,,ABNSI                    E3.5.6
  2505.        POP     SCL                        E3.5.6
  2506.        BRANCH  SCDTER                        E3.5.6
  2507. *_                                E3.5.6
  2508. ABNSE  RCALL   XPTR,EXPVAL,XPTR,(ABNSF,ABNS1)            E3.5.5
  2509. *_                                E3.5.5
  2510. ABNSF  POP     SCL                        E3.5.5
  2511.        BRANCH  TSALF                        E3.5.5
  2512. *_                                E3.5.5
  2513. ABNSI  RCALL   XPTR,GNVARI,XPTR
  2514. ABNSV  POP     SCL           Restore procedure switch
  2515.        AEQLC   XPTR,0,,SCNAME                    E3.5.5
  2516.        SELBRA  SCL,(,BRKV,NNYV,SPNV)
  2517. *                   Select processor
  2518. ANYV   DEQL    XPTR,TBLCS,ANYC2    Was last argument the same?
  2519.        AEQL    TBLFNC,ANYCCL,,ANYC3
  2520. *                   If so, was last procedure for ANY(S)
  2521. ANYC2  CLERTB  SNABTB,ERROR       If not, clear stream table
  2522.        LOCSP   YSP,XPTR
  2523.        PLUGTB  SNABTB,STOP,YSP       Plug entries for characters
  2524.        MOVD    TBLCS,XPTR       Save argument to check next time
  2525.        MOVD    TBLFNC,ANYCCL       Save procedure to check next time
  2526. ANYC3  SETSP   VSP,XSP           Set up working specifier
  2527.        AEQLC   FULLCL,0,ANYC4       Leave length alone in FULLSCAN mode
  2528.        PUTLG   VSP,MAXLEN       Else insert maximum length
  2529.        LCOMP   VSP,TXSP,,,TSALT    Length failure if too short
  2530.        CHKVAL  MAXLEN,ZEROCL,XSP,,ANYC4,ANYC4            E3.5.7
  2531.        ADDLG   VSP,ONECL                    E3.5.7
  2532. ANYC4  REMSP   YSP,VSP,TXSP       Get specifier to unscanned portion
  2533.        STREAM  ZSP,YSP,SNABTB,TSALF,TSALT
  2534.        GETLG   XPTR,ZSP        Get length accepted
  2535.        ADDLG   TXSP,XPTR       Add to length matched
  2536.        BRANCH  SCOK,SCNR       Return to success point
  2537. *_
  2538. BRKC   PROC    ANYC           Matching procedure for BREAK(S)
  2539.        SETAC   SCL,2           Post entry
  2540.        BRANCH  ABNS
  2541. *_
  2542. BRKV   DEQL    XPTR,TBLCS,BRKC2    Was last argument the same?
  2543.        AEQL    TBLFNC,BRKCCL,,ANYC3
  2544. *                   Was the last procedure for BREAK
  2545. BRKC2  CLERTB  SNABTB,CONTIN       If not, clear stream table
  2546.        LOCSP   YSP,XPTR
  2547.        PLUGTB  SNABTB,STOPSH,YSP   Plug entries for characters
  2548.        MOVD    TBLCS,XPTR       Save argument to check next time
  2549.        MOVD    TBLFNC,BRKCCL       Save procedure to check next time
  2550.        BRANCH  ANYC3           Proceed
  2551. *_
  2552. NNYC   PROC    ANYC           Matching procedure for NOTANY(S)
  2553.        SETAC   SCL,3           Post entry
  2554.        BRANCH  ABNS
  2555. *_
  2556. NNYV   DEQL    XPTR,TBLCS,NNYC2    Was last argument the same?
  2557.        AEQL    TBLFNC,NNYCCL,,ANYC3
  2558. *                   Was the last procedure for NOTANY?
  2559. NNYC2  CLERTB  SNABTB,STOP       If not, clear stream table
  2560.        LOCSP   YSP,XPTR
  2561.        PLUGTB  SNABTB,ERROR,YSP    Plug entries for characters
  2562.        MOVD    TBLCS,XPTR       Save argument to check next time
  2563.        MOVD    TBLFNC,NNYCCL       Save procedure to check next time
  2564.        BRANCH  ANYC3           Proceed
  2565. *_
  2566. SPNC   PROC    ANYC           Matching procedure for SPAN(S)
  2567.        SETAC   SCL,4           Post entry
  2568.        BRANCH  ABNS
  2569. *_
  2570. SPNV   DEQL    XPTR,TBLCS,SPNC2    Was last argument the same?
  2571.        AEQL    TBLFNC,SPNCCL,,SPNC3
  2572. *                   Was the last procedure for SPAN?
  2573. SPNC2  CLERTB  SNABTB,STOPSH       If not, clear stream table
  2574.        LOCSP   YSP,XPTR
  2575.        PLUGTB  SNABTB,CONTIN,YSP   Plug entries for characters
  2576.        MOVD    TBLCS,XPTR       Save argument to check next time
  2577.        MOVD    TBLFNC,SPNCCL       Save procedure to check next time
  2578. SPNC3  LCOMP   XSP,TXSP,,TSALT,TSALT
  2579. *                   Length failure if too short
  2580.        REMSP   YSP,XSP,TXSP       Get specifier to unscanned portion
  2581.        STREAM  ZSP,YSP,SNABTB,TSALF
  2582.        LEQLC   ZSP,0,,TSALF       Failure if length accepted is zero
  2583.        GETLG   XPTR,ZSP        Get length of accepted portion
  2584.        AEQLC   FULLCL,0,SPNC5       Skip length check in FULLSCAN mode
  2585.        CHKVAL  MAXLEN,XPTR,TXSP,TSALT
  2586. SPNC5  ADDLG   TXSP,XPTR       Add length accepted
  2587.        BRANCH  SCOK,SCNR
  2588. *_
  2589. *---------------------------------------------------------------------*
  2590. *
  2591. *      LEN, POS, RPOS, RTAB, TAB
  2592. *
  2593. LNTH   PROC    ,           Matching procedure for LEN(N)
  2594.        SETAC   SCL,1           Note entry
  2595. LPRRT  INCRA   PATICL,DESCR       Increment offset
  2596.        GETD    XPTR,PATBCL,PATICL  Get argument
  2597.        PUSH    SCL           Save entry indicator
  2598. *
  2599. LPRRT1 VEQLC   XPTR,I,,LPRRTI       Is it INTEGER?
  2600.        VEQLC   XPTR,E,,LPRRTE       Is it EXPRESSION?
  2601.        VEQLC   XPTR,S,,LPRRTV                    E3.5.6
  2602.        POP     SCL                        E3.5.6
  2603.        BRANCH  SCDTER                        E3.5.6
  2604. *                   Is it STRING?
  2605. LPRRTE RCALL   XPTR,EXPVAL,XPTR,(,LPRRT1)            E3.2.1
  2606.        POP     SCL                        E3.2.1
  2607.        BRANCH  TSALF                        E3.2.1
  2608. *_                                E3.2.1
  2609. *                   Evaluate EXPRESSION
  2610. LPRRTV LOCSP   ZSP,XPTR        Get specifier
  2611.        SPCINT  XPTR,ZSP,SCDTER       Convert to INTEGER
  2612. LPRRTI POP     SCL           Restore entry indicator
  2613.        SELBRA  SCL,(,POSII,RPSII,RTBI,TBI)
  2614. *                   Select matching procedure
  2615.        ACOMPC  XPTR,0,,,SCLENR       Check for negative length
  2616.        CHKVAL  MAXLEN,XPTR,TXSP,TSALT
  2617. *                   Compare with maximum length
  2618.        ADDLG   TXSP,XPTR       Add to length matched
  2619.        BRANCH  SCOK,SCNR       Return successful match
  2620. *_
  2621. POSII  ACOMPC  XPTR,0,,,SCLENR       Check for negative position
  2622.        GETLG   NVAL,TXSP       Get cursor position
  2623.        ACOMP   XPTR,MAXLEN,TSALT   Check desired against maximum
  2624.        ACOMP   XPTR,NVAL,TSALF,TSCOK
  2625. *                   Ceck against cursor position
  2626.        BRANCH  SALT,SCNR
  2627. *_
  2628. RPSII  ACOMPC  XPTR,0,,,SCLENR       Check for negative position
  2629.        GETLG   NVAL,XSP        Get total length
  2630.        SUBTRT  TVAL,NVAL,XPTR       Find desired position
  2631.        GETLG   NVAL,TXSP       Get cursor position
  2632.        ACOMP   NVAL,TVAL,TSALT,TSCOK,TSALF
  2633. *                   Compare two positions
  2634. *_
  2635. RTBI   ACOMPC  XPTR,0,,,SCLENR       Check for negative length
  2636.        GETLG   NVAL,XSP        Get total length
  2637.        SUBTRT  TVAL,NVAL,XPTR       Find desired position
  2638.        GETLG   NVAL,TXSP       Get current position
  2639.        ACOMP   NVAL,TVAL,TSALT       Compare two positions
  2640.        AEQLC   FULLCL,0,RTBII       Check &FULLSCAN
  2641.        SETAV   NVAL,YCL        Get residual
  2642.        SUBTRT  NVAL,MAXLEN,NVAL    Find maximum allowed position
  2643.        ACOMP   NVAL,TVAL,,,TSALT   Compare with desired position
  2644. RTBII  PUTLG   TXSP,TVAL       Update length of string matched
  2645.        BRANCH  SCOK,SCNR
  2646. *_
  2647. TBI    ACOMPC  XPTR,0,,,SCLENR       Check for negative length
  2648.        GETLG   NVAL,TXSP       Get cursor position
  2649.        ACOMP   NVAL,XPTR,TSALT       Check against desired position
  2650.        ACOMP   XPTR,MAXLEN,TSALT   Check for tab beyond end
  2651.        PUTLG   TXSP,XPTR       Update length of string matched
  2652.        BRANCH  SCOK,SCNR
  2653. *_
  2654. POSI   PROC    LNTH           Matching procedure for POS(N)
  2655.        SETAC   SCL,2           Note entry
  2656.        BRANCH  LPRRT           Join common processing
  2657. *_
  2658. RPSI   PROC    LNTH           Matching procedure for RPOS(N)
  2659.        SETAC   SCL,3           Note entry
  2660.        BRANCH  LPRRT           Join common processing
  2661. *_
  2662. RTB    PROC    LNTH           Matching procedure for RTAB(N)
  2663.        SETAC   SCL,4           Note entry
  2664.        BRANCH  LPRRT           Join common processing
  2665. *_
  2666. TB     PROC    LNTH           Matching procedure for TAB(N)
  2667.        SETAC   SCL,5           Note entry
  2668.        BRANCH  LPRRT           Join common processing
  2669. *_
  2670. *---------------------------------------------------------------------*
  2671. *
  2672. *      ARBNO
  2673. *
  2674. ARBN   PROC    ,           Matching for ARBNO(P)
  2675.        GETLG   TMVAL,TXSP       Get cursor position
  2676.        PUSH    TMVAL           Save cursor position
  2677.        BRANCH  SCOK,SCNR       Return matching successfully
  2678. *_
  2679. ARBF   PROC    ARBN           Backup matching for ARBNO(P)
  2680.        POP     (TMVAL)           Restore cursor position
  2681.        BRANCH  ONAR2           Join common processing
  2682. *_
  2683. EARB   PROC    ARBN
  2684.        POP     (TMVAL)           Restore cursor position
  2685.        PUTDC   PDLPTR,DESCR,TMVAL  Insert on history list
  2686.        GETLG   TMVAL,TXSP       Get cursor position
  2687.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2688.        PUTDC   PDLPTR,3*DESCR,ZEROCL
  2689.        BRANCH  SCOK,SCNR       Return matching successfully
  2690. *_
  2691. ONAR   PROC    ARBN
  2692.        AEQLC   FULLCL,0,TSCOK       Check &FULLSCAN
  2693.        MOVD    TVAL,ZEROCL
  2694.        GETAC   TVAL,PDLPTR,-2*DESCR
  2695. *                   Get old cursor position
  2696.        GETLG   TMVAL,TXSP       Get current cursor position
  2697.        ACOMP   TVAL,TMVAL,TSCOK,,TSCOK
  2698. *                   Compare positions
  2699. ONAR1  PUSH    TVAL           Save cursor position
  2700.        DECRA   PDLPTR,6*DESCR       Delete history entries
  2701. ONAR2  AEQLC   LENFCL,0,TSALT       Check length failure
  2702.        BRANCH  SALF,SCNR       Return matching failure
  2703. *_
  2704. ONRF   PROC    ARBN
  2705.        MOVD    TVAL,ZEROCL
  2706.        GETAC   TVAL,PDLPTR,-2*DESCR
  2707. *                   Get old cursor position
  2708.        BRANCH  ONAR1           Join processing
  2709. *_
  2710. FARB   PROC    ,
  2711.        AEQLC   FULLCL,0,,FARB2       Check &FULLSCAN
  2712.        SETAC   NVAL,0           Set residual length to 0
  2713.        BRANCH  FARB3           Join processing
  2714. *_
  2715. FARB2  AEQLC   LENFCL,0,FARB1       Check for length failure
  2716.        SETAV   NVAL,YCL        Get residual length
  2717. FARB3  GETLG   TVAL,TXSP       Get cursor position
  2718.        SUM     TVAL,TVAL,NVAL       Add them
  2719.        ACOMP   TVAL,MAXLEN,FARB1,FARB1
  2720. *                   Check against maximum
  2721.        ADDLG   TXSP,ONECL       Add one for ARB
  2722.        GETLG   TVAL,TXSP       Get length matched
  2723.        PUTAC   PDLPTR,2*DESCR,TVAL Insert on history list
  2724.        BRANCH  SCOK,SCNR       Return successful match
  2725. *_
  2726. FARB1  DECRA   PDLPTR,3*DESCR       Back over history entry
  2727.        BRANCH  SALT,SCNR
  2728. *_
  2729. *---------------------------------------------------------------------*
  2730. *
  2731. *      @X
  2732. *
  2733. ATP    PROC    ,           Matching procedure for @X
  2734.        INCRA   PATICL,DESCR       Increment pattern offset
  2735.        GETD    XPTR,PATBCL,PATICL  Get argument
  2736. ATP1   VEQLC   XPTR,E,,ATPEXN       EXPRESSION must be evaluated
  2737.        GETLG   NVAL,TXSP       Get length of text matched
  2738.        SETVC   NVAL,I           Set INTEGER data type
  2739.        PUTDC   XPTR,DESCR,NVAL       Assign as value of variable X
  2740.        AEQLC   OUTSW,0,,ATP2       Check &OUTPUT
  2741.        LOCAPV  ZPTR,OUTATL,XPTR,ATP2
  2742. *                   Look for output association
  2743.        GETDC   ZPTR,ZPTR,DESCR       Get output association descriptor
  2744.        RCALL   ,PUTOUT,(ZPTR,NVAL) Perform output
  2745. ATP2   AEQLC   TRAPCL,0,,TSCOK       Check &TRACE
  2746.        LOCAPT  ATPTR,TVALL,XPTR,TSCOK
  2747. *                   Look for trace association
  2748.        PUSH    (PATBCL,PATICL,WPTR,XCL,YCL)
  2749.        PUSH    (MAXLEN,LENFCL,PDLPTR,PDLHED,NAMICL,NHEDCL)
  2750.        SPUSH   (HEADSP,TSP,TXSP,XSP)
  2751.        MOVD    PDLHED,PDLPTR       Set new stack heading
  2752.        MOVD    NHEDCL,NAMICL       Set new name list heading
  2753.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  2754. *                   Perform tracing
  2755.        SPOP    (XSP,TXSP,TSP,HEADSP)
  2756.        POP     (NHEDCL,NAMICL,PDLHED,PDLPTR,LENFCL,MAXLEN)
  2757.        POP     (YCL,XCL,WPTR,PATICL,PATBCL)
  2758.        BRANCH  SCOK,SCNR
  2759. *_
  2760. ATPEXN RCALL   XPTR,EXPEVL,XPTR,(TSALF,ATP1,SCNEMO)        E3.4.4
  2761. *_
  2762. *---------------------------------------------------------------------*
  2763. *
  2764. *      BAL
  2765. *
  2766. BAL    PROC    ,           Matching procedure for BAL
  2767. BALF1  AEQLC   FULLCL,0,,BALF4       Check &FULLSCAN
  2768.        SETAC   NVAL,0           Set length to zero
  2769.        BRANCH  BALF2
  2770. *_
  2771. BALF4  SETAV   NVAL,YCL
  2772. BALF2  GETLG   TVAL,TXSP       Get length of text matched so far
  2773.        SUM     TVAL,TVAL,NVAL       Add remainder possible
  2774.        ACOMP   TVAL,MAXLEN,BAL1,BAL1
  2775. *                   Compare to maximum
  2776.        SUBTRT  TVAL,MAXLEN,TVAL    Get maximum length for BAL
  2777.        GETBAL  TXSP,TVAL,BAL1       Get balanced string
  2778.        GETLG   TVAL,TXSP       Get length matched
  2779.        PUTAC   PDLPTR,2*DESCR,TVAL Insert history entry
  2780.        BRANCH  SCOK,SCNR       Successful match
  2781. *_
  2782. BAL1   DECRA   PDLPTR,3*DESCR       Back over history entry
  2783.        ACOMP   PDLPTR,PDLHED,TSALF,TSALF,INTR13
  2784. *_
  2785. BALF   PROC    BAL           Matching procedure for BAL retry
  2786.        AEQLC   FULLCL,0,,BALF3       Check &FULLSCAN
  2787.        SETAC   NVAL,0           If off, set length to zero
  2788.        BRANCH  BALF2           Reenter balanced matching
  2789. *_
  2790. BALF3  AEQLC   LENFCL,0,BAL1,BALF1 If on, test for length failure
  2791. *_
  2792. *---------------------------------------------------------------------*
  2793. *
  2794. *      Matching for String
  2795. *
  2796. CHR    PROC    ,           Matching character string
  2797.        INCRA   PATICL,DESCR       Increment offset
  2798.        GETD    YPTR,PATBCL,PATICL  Get argument
  2799. CHR1   LOCSP   TSP,YPTR        Get specifier
  2800. CHR2   REMSP   VSP,XSP,TXSP       Remove part matched
  2801.        SUBSP   VSP,TSP,VSP,TSALT   Get part to match
  2802.        LEXCMP  VSP,TSP,TSALF,,TSALF
  2803. *                   Compare strings
  2804.        GETLG   YPTR,TSP        Get length
  2805.        ADDLG   TXSP,YPTR       Update string matched
  2806.        BRANCH  SCOK,SCNR       Return successful match
  2807. *_
  2808. *---------------------------------------------------------------------*
  2809. *
  2810. *      *X
  2811. *
  2812. STAR   PROC    CHR           Matching procedure for expressions
  2813.        INCRA   PATICL,DESCR       Increment offset
  2814.        GETD    YPTR,PATBCL,PATICL  Get argument expression
  2815. STAR2  RCALL   YPTR,EXPVAL,YPTR,TSALF
  2816. *                   Evaluate argument
  2817.        VEQLC   YPTR,E,,STAR2       Is is EXPRESSION?
  2818.        SUM     XPTR,PATBCL,PATICL  Compute pointer to argument
  2819.        PUTDC   XPTR,7*DESCR,YPTR   Insert pointer in backup node
  2820.        VEQLC   YPTR,S,,CHR1       Is it STRING?
  2821.        VEQLC   YPTR,P,,STARP       Is it  PATTERN?
  2822.        VEQLC   YPTR,I,SCDTER       Is it INTEGER?
  2823.        INTSPC  TSP,YPTR        Get specifier for integer
  2824.        BRANCH  CHR2           Join processing
  2825. *_
  2826. STARP  AEQLC   FULLCL,0,,STARP1    Check &FULLSCAN
  2827.        SETAC   NVAL,0           Zero length
  2828.        BRANCH  STARP4           Join processing
  2829. *_
  2830. STARP1 SETAV   NVAL,YCL        Get length
  2831. STARP4 SUBTRT  NVAL,MAXLEN,NVAL    Compute residual
  2832.        ACOMPC  NVAL,0,,,TSALT
  2833.        LVALUE  TSIZ,YPTR       Check &FULLSCAN
  2834.        AEQLC   FULLCL,0,STARP6
  2835.        ACOMP   TSIZ,NVAL,TSALT       Check against length
  2836. STARP6 INCRA   PDLPTR,3*DESCR       Make room for history
  2837.        ACOMP   PDLPTR,PDLEND,INTR31
  2838. *                   Check for overflow
  2839.        PUTDC   PDLPTR,DESCR,SCFLCL Insert failure function
  2840.        GETLG   TMVAL,TXSP       Get cursor position
  2841.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2842. *                   Insert on history list
  2843.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2844. *                   Insert length failure
  2845.        PUSH    (MAXLEN,PATBCL,PATICL,XCL,YCL)
  2846. *                   Save scanner state
  2847.        MOVD    MAXLEN,NVAL       Set up new maximum
  2848.        RCALL   ,SCIN,,(STARP5,,RTNUL3)
  2849. *                   Call the scanner
  2850. STARP2 POP     (YCL,XCL,PATICL,PATBCL,MAXLEN)
  2851. *                   Restore scanner state
  2852.        BRANCH  SCOK,SCNR       Return matching successfully
  2853. *_
  2854. STARP5 POP     (YCL,XCL,PATICL,PATBCL,MAXLEN)
  2855. *                   Restore scanner state
  2856. STARP3 AEQLC   LENFCL,0,TSALT       Check length failure
  2857.        BRANCH  SALF,SCNR       Return matching failure
  2858. *_
  2859. DSAR   PROC    CHR           Backup matching for expression
  2860.        INCRA   PATICL,DESCR       Increment offset
  2861.        GETD    YPTR,PATBCL,PATICL  Get argument
  2862.        VEQLC   YPTR,S,,STARP3       Is it STRING?
  2863.        VEQLC   YPTR,P,,DSARP       Is it PATTERN?
  2864.        VEQLC   YPTR,I,SCDTER,STARP3
  2865. *                   Is it INTEGER?
  2866. *_
  2867. DSARP  AEQLC   FULLCL,0,,DSARP1    Check &FULLSCAN
  2868.        SETAC   NVAL,0           Zero length
  2869.        BRANCH  DSARP2           Join processing
  2870. *_
  2871. DSARP1 SETAV   NVAL,YCL        Get length
  2872. DSARP2 SUBTRT  NVAL,MAXLEN,NVAL    Compute residual
  2873.        PUSH    (MAXLEN,PATBCL,PATICL,XCL,YCL)
  2874. *                   Save scanner state
  2875.        MOVD    MAXLEN,NVAL       Set up new maximum
  2876.        RCALL   ,UNSC,,(STARP5,STARP2,RTNUL3)
  2877. *                   Call unscanning procedure
  2878. *_
  2879. *---------------------------------------------------------------------*
  2880. *
  2881. *      FENCE
  2882. *
  2883. FNCE   PROC    ,           Procedure for matching FENCE
  2884.        INCRA   PDLPTR,3*DESCR       Create new history entry
  2885.        ACOMP   PDLPTR,PDLEND,INTR31
  2886. *                   Check for overflow
  2887.        PUTDC   PDLPTR,DESCR,FNCFCL Insert FENCE failure function
  2888.        GETLG   TMVAL,TXSP       Get length
  2889.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2890. *                   Save length
  2891.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2892. *                   Save length failure switch
  2893.        SETAC   LENFCL,1        Set length failure switch
  2894.        BRANIC  SCOKCL,0        Return matching
  2895. *_
  2896. *---------------------------------------------------------------------*
  2897. *
  2898. *      X . Y and X $ Y
  2899. *
  2900. NME    PROC    ,           Matching procedure for naming
  2901.        INCRA   PDLPTR,3*DESCR       Make room for history entry
  2902.        ACOMP   PDLPTR,PDLEND,INTR31
  2903. *                   Check for end of list
  2904.        PUTDC   PDLPTR,DESCR,FNMECL Insert backup function
  2905.        GETLG   TMVAL,TXSP       Get cursor position
  2906.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2907. *                   Put on history list
  2908.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2909. *                   Put length failure indicator
  2910.        PUSH    (TMVAL)           Save cursor
  2911.        SETAC   LENFCL,1        Set length failure indicator
  2912.        BRANCH  SCOK,SCNR       Return matching successfully
  2913. *_
  2914. FNME   PROC    NME           Backup procedure for naming
  2915.        POP     (TVAL)           Restore cursor
  2916. FNME1  AEQLC   LENFCL,0,TSALT,TSALF
  2917. *                   Check length failure indicator
  2918. *_
  2919. ENME   PROC    NME           Naming process for X . Y
  2920.        INCRA   PATICL,DESCR       Increment offset
  2921.        GETD    YPTR,PATBCL,PATICL  Get argument
  2922.        POP     (NVAL)           Restore previous cursor position
  2923.        SETVA   YCL,NVAL        Set up length
  2924.        SETSP   TSP,TXSP        Copy specifier
  2925.        PUTLG   TSP,NVAL        Insert length
  2926.        REMSP   TSP,TXSP,TSP       Compute ramainder
  2927.        SUM     TPTR,NBSPTR,NAMICL  Compute position on name list
  2928.        PUTSPC  TPTR,DESCR,TSP       Insert specifier
  2929.        PUTDC   TPTR,DESCR+SPEC,YPTR
  2930. *                   Insert argument
  2931.        INCRA   NAMICL,DESCR+SPEC   Increment list offset
  2932.        ACOMP   NAMICL,NMOVER,INTR13,ENME1
  2933. *                   Check for overflow
  2934. ENME2  INCRA   PDLPTR,DESCR+SPEC   Make room on history list
  2935.        ACOMP   PDLPTR,PDLEND,INTR31
  2936. *                   Check for overflow
  2937.        PUTDC   PDLPTR,DESCR,DNMECL Insert unravelling function
  2938. ENME3  GETLG   TMVAL,TXSP       Get cursor position
  2939.        MOVV    TMVAL,YCL
  2940.        PUTDC   PDLPTR,2*DESCR,TMVAL
  2941. *                   Insert on list
  2942.        PUTDC   PDLPTR,3*DESCR,LENFCL
  2943. *                   Insert length failure
  2944.        SETAC   LENFCL,1        Set length failure
  2945.        BRANCH  SCOK,SCNR       Return matching successfully
  2946. *_
  2947. ENME1  MOVD    WCL,NMOVER       Save copy of cuurent name list end
  2948.        INCRA   NMOVER,NAMLSZ*SPDR  Increment for larger block
  2949.        RCALL   TPTR,BLOCK,NMOVER   Allocate larger block
  2950.        MOVBLK  TPTR,NBSPTR,WCL       Move in old block
  2951.        MOVD    NBSPTR,TPTR       Set up new base pointer
  2952.        BRANCH  ENME2           Rejoin processing
  2953. *_
  2954. DNME   PROC    NME           Unravelling procedure for naming
  2955.        DECRA   NAMICL,DESCR+SPEC   Back off named string
  2956.        SUM     TPTR,NBSPTR,NAMICL  Compute current position
  2957. DNME1  PROC    NME
  2958.        SETAV   VVAL,YCL
  2959.        PUSH    (VVAL)           Preserve length
  2960.        BRANCH  FNME1
  2961. *_
  2962. ENMI   PROC    NME           Matching for X $ Y
  2963.        INCRA   PATICL,DESCR       Increment offset
  2964.        GETD    YPTR,PATBCL,PATICL  Get argument
  2965.        POP     (NVAL)           Restore initial length
  2966.        SETVA   YCL,NVAL        Move initial length into value field
  2967.        SETSP   TSP,TXSP        Get working specifier
  2968.        PUTLG   TSP,NVAL        Insert length
  2969.        REMSP   TSP,TXSP,TSP       Get specifier for part matched
  2970.        GETLG   ZCL,TSP           Get length of part
  2971.        ACOMP   ZCL,MLENCL,SCLNOR   Check &MAXLNGTH
  2972.        VEQLC   YPTR,E,,ENMEXN       Is it EXPRESSION?
  2973. ENMI5  VEQLC   YPTR,K,,ENMIC       Check for KEYWORD data type
  2974.        RCALL   VVAL,GENVAR,(TSPPTR)
  2975. *                   Generate variable
  2976. ENMI3  PUTDC   YPTR,DESCR,VVAL       Perform assignment
  2977.        AEQLC   OUTSW,0,,ENMI4       Check &OUTPUT
  2978.        LOCAPV  ZPTR,OUTATL,YPTR,ENMI4
  2979. *                   Look for output association
  2980.        GETDC   ZPTR,ZPTR,DESCR       Get association
  2981.        RCALL   ,PUTOUT,(ZPTR,VVAL) Perform output
  2982. ENMI4  ACOMPC  TRAPCL,0,,ENMI2,ENMI2
  2983. *                   Check &TRACE
  2984.        LOCAPT  ATPTR,TVALL,YPTR,ENMI2
  2985. *                   Look for VALUE trace
  2986.        PUSH    (PATBCL,PATICL,WPTR,XCL,YCL)
  2987. *                   Save relevant descriptors
  2988.        PUSH    (MAXLEN,LENFCL,PDLPTR,PDLHED,NAMICL,NHEDCL)
  2989.        SPUSH   (HEADSP,TSP,TXSP,XSP)
  2990. *                   Save relevant specifiers
  2991.        MOVD    PDLHED,PDLPTR       Set up new history list head
  2992.        MOVD    NHEDCL,NAMICL       Set up new name list head
  2993.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  2994. *                   Perform trace
  2995.        SPOP    (XSP,TXSP,TSP,HEADSP)
  2996. *                   Restore specifiers
  2997.        POP     (NHEDCL,NAMICL,PDLHED,PDLPTR,LENFCL,MAXLEN)
  2998. *                   Restore descriptors
  2999.        POP     (YCL,XCL,WPTR,PATICL,PATBCL)
  3000. ENMI2  INCRA   PDLPTR,3*DESCR       Make room on history list
  3001.        ACOMP   PDLPTR,PDLEND,INTR31
  3002. *                   Check for overflow
  3003.        PUTDC   PDLPTR,DESCR,DNMICL Insert unravelling function
  3004.        BRANCH  ENME3           Join common processing
  3005. *_
  3006. ENMIC  SPCINT  VVAL,TSP,SCDTER,ENMI3
  3007. *                   Convert STRING to INTEGER
  3008. *_
  3009. ENMEXN PUSH    ZEROCL                       E3.4.4 & E3.5.8
  3010.        RCALL   YPTR,EXPEVL,YPTR,(TSALF,,SCNEMO)        E3.4.4 & E3.5.8
  3011.        POP     ZEROCL                       E3.4.4 & E3.5.8
  3012.        BRANCH  ENMI5                       E3.4.4 & E3.5.8
  3013. *_
  3014. *---------------------------------------------------------------------*
  3015. *
  3016. *      SUCCEED
  3017. *
  3018. SUCE   PROC    ,           Matching procedure for SUCCEED
  3019. SUCE1  INCRA   PDLPTR,3*DESCR       Make room for history entry
  3020.        ACOMP   PDLPTR,PDLEND,INTR31
  3021. *                   Check for overflow
  3022.        PUTDC   PDLPTR,DESCR,SUCFCL Insert SUCCESS backup function
  3023.        GETLG   TMVAL,TXSP       Get length matched
  3024.        PUTDC   PDLPTR,2*DESCR,TMVAL
  3025. *                   Save on history list
  3026.        PUTDC   PDLPTR,3*DESCR,LENFCL
  3027. *                   Save current length failure
  3028.        SETAC   LENFCL,1        Set length failure
  3029.        BRANIC  SCOKCL,0        Return successful match
  3030. *_
  3031. SUCF   PROC    SUCE           SUCCEED failure
  3032.        GETDC   XCL,PDLPTR,DESCR    Get history entries
  3033.        GETDC   YCL,PDLPTR,2*DESCR
  3034.        BRANCH  SUCE1           Go in front door
  3035. *_
  3036. *---------------------------------------------------------------------*
  3037.        TITLE   'Defined Functions'
  3038. *
  3039. *      DEFINE(P,E)
  3040. *
  3041. DEFINE PROC    ,           DEFINE(P,E)
  3042.        RCALL   XPTR,VARVAL,,FAIL   Get prototype
  3043.        PUSH    XPTR           Save prototype
  3044.        RCALL   YPTR,VARVAL,,FAIL   Get entry point
  3045.        POP     XPTR           Restore prototype
  3046.        LOCSP   XSP,XPTR        Specifier for prototype
  3047.        STREAM  YSP,XSP,VARATB,PROTER,PROTER
  3048. *                   Break out function name
  3049.        AEQLC   STYPE,LPTYP,PROTER  Verify open parenthesis
  3050.        RCALL   XPTR,GENVAR,(YSPPTR)
  3051. *                   Get variable for function name
  3052.        RCALL   ZCL,FINDEX,(XPTR)   Get function descriptor for function
  3053.        DEQL    YPTR,NULVCL,DEFIN3  Check for omitted entry point
  3054.        MOVD    YPTR,XPTR       If omitted use function name
  3055. DEFIN3 PUSH    YPTR           Save entry point
  3056.        MOVD    YCL,ZEROCL       Set argument count to 0
  3057.        PUSH    XPTR           Save function name
  3058. DEFIN4 FSHRTN  XSP,1           Remove break character
  3059.        STREAM  YSP,XSP,VARATB,PROTER,PROTER
  3060. *                   Break out argument
  3061.        SELBRA  STYPE,(PROTER,,DEFIN6)
  3062. *                   Check for end
  3063.        LEQLC   YSP,0,,DEFIN4       Check for null argument
  3064.        RCALL   XPTR,GENVAR,(YSPPTR)
  3065. *                   Generate variable for argument
  3066.        PUSH    XPTR           Save argument
  3067.        INCRA   YCL,1           Increment argument count
  3068.        BRANCH  DEFIN4           Continue
  3069. *_
  3070. DEFIN6 LEQLC   YSP,0,,DEFIN9
  3071.        INCRA   YCL,1           Increment argument count
  3072.        RCALL   XPTR,GENVAR,(YSPPTR)
  3073. *                   Generate variable for argument
  3074.        PUSH    XPTR           Save argument
  3075. DEFIN9 SETVA   DEFCL,YCL
  3076. DEFIN8 FSHRTN  XSP,1
  3077.        STREAM  YSP,XSP,VARATB,PROTER,DEF10
  3078. *                   Break out local arguments
  3079.        AEQLC   STYPE,CMATYP,PROTER Verify comma
  3080.        LEQLC   YSP,0,,DEFIN8       Check for null argument
  3081.        RCALL   XPTR,GENVAR,(YSPPTR)
  3082. *                   Generate variable
  3083.        PUSH    XPTR           Save local argument
  3084.        INCRA   YCL,1           Increment total count
  3085.        BRANCH  DEFIN8           Continue
  3086. *_
  3087. DEF10  LEQLC   YSP,0,,DEF11       Check for null argument
  3088.        RCALL   XPTR,GENVAR,YSPPTR  Generate variable
  3089.        PUSH    XPTR           Save argument
  3090.        INCRA   YCL,1           Increment total count
  3091. DEF11  INCRA   YCL,2           Increment for name and label
  3092.        MULTC   XCL,YCL,DESCR       Convert to address units
  3093.        SETVC   XCL,B           Insert block data type
  3094.        RCALL   XPTR,BLOCK,XCL       Allocate block for definition
  3095.        PUTDC   ZCL,0,DEFCL       Point to procedure descriptor
  3096.        PUTDC   ZCL,DESCR,XPTR       Insert definition block
  3097.        SUM     XPTR,XPTR,XCL       Compute end of block
  3098. DEF12  DECRA   XPTR,DESCR       Decrement pointer
  3099.        POP     YPTR           Restore argument
  3100.        PUTDC   XPTR,DESCR,YPTR       Insert in definition block
  3101.        DECRA   YCL,1           Decrement total count
  3102.        AEQLC   YCL,0,DEF12,RETNUL  Check for end
  3103. *_
  3104. *---------------------------------------------------------------------*
  3105. *
  3106. *      Invocation of Defined Function
  3107. *
  3108. DEFFNC PROC    ,           Procedure to invoke defined function
  3109.        SETAV   XCL,INCL        Get number of arguments in call
  3110.        MOVD    WCL,XCL           Save copy
  3111.        MOVD    YCL,INCL        Save function descriptor
  3112.        PSTACK  YPTR           Post stack position
  3113.        PUSH    NULVCL           Save null value for function name
  3114. DEFF1  INCRA   OCICL,DESCR       Increment offset
  3115.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  3116.        TESTF   XPTR,FNC,,DEFFC       Check for function descriptor
  3117. DEFF2  AEQLC   INSW,0,,DEFF14       Check &INPUT
  3118.        LOCAPV  ZPTR,INATL,XPTR,DEFF14
  3119. *                   Look for input association
  3120.        GETDC   ZPTR,ZPTR,DESCR       Get association
  3121.        PUSH    (XCL,WCL,YCL,YPTR)  Save relevant descriptors
  3122.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),FAIL
  3123. *                   Perform input
  3124.        POP     (YPTR,YCL,WCL,XCL)  Restore descriptors
  3125.        BRANCH  DEFF3           Join processing
  3126. *_
  3127. DEFF14 GETDC   XPTR,XPTR,DESCR       Get value
  3128. DEFF3  PUSH    XPTR           Save value
  3129.        DECRA   XCL,1           Decrement argument count
  3130.        ACOMPC  XCL,0,DEFF1,,INTR10 Check for end
  3131.        GETDC   XCL,YCL,0       Get expected number of arguments
  3132.        SETAV   XCL,XCL           Insert in A-field
  3133. DEFF4  ACOMP   WCL,XCL,DEFF9,DEFF5 Compare given and expected
  3134.        PUSH    NULVCL           Not enough, save null string
  3135.        INCRA   WCL,1           Increment count
  3136.        BRANCH  DEFF4           Continue
  3137. *_
  3138. DEFF9  POP     ZCL           Throw away extra argument
  3139.        DECRA   WCL,1           Decrement count
  3140.        BRANCH  DEFF4           Continue
  3141. *_
  3142. DEFF5  GETDC   ZCL,YCL,DESCR       Get definition block
  3143.        MOVD    XPTR,ZCL        Save copy
  3144.        GETSIZ  WCL,ZCL           Get size of block
  3145.        SUM     WPTR,ZCL,WCL       Compute pointer to end
  3146.        INCRA   XCL,1           Increment for function name
  3147. DEFF8  INCRA   XPTR,DESCR       Increment pointer to block
  3148.        INCRA   YPTR,DESCR       Adjust stack pointer
  3149.        GETDC   ZPTR,XPTR,DESCR       Get argument name
  3150.        GETDC   TPTR,ZPTR,DESCR       Get current argument value
  3151.        GETDC   ATPTR,YPTR,DESCR    Get value from stack
  3152.        PUTDC   ZPTR,DESCR,ATPTR    Assign to argument name
  3153.        PUTDC   YPTR,DESCR,TPTR       Put current argument on stack
  3154.        DECRA   XCL,1           Decrement count
  3155.        ACOMPC  XCL,0,DEFF8,,INTR10 Check for end
  3156. DEFF10 INCRA   XPTR,DESCR       Increment pointer to block
  3157.        AEQL    XPTR,WPTR,,DEFFGO
  3158.        GETDC   ZPTR,XPTR,DESCR       Get argument name from block
  3159.        GETDC   TPTR,ZPTR,DESCR       Get current value of argument
  3160.        PUSH    TPTR           Save current value
  3161.        PUTDC   ZPTR,DESCR,NULVCL   Assign null value to local
  3162.        BRANCH  DEFF10           Continue
  3163. *_
  3164. DEFFGO PUSH    (FRTNCL,STNOCL,OCICL,OCBSCL,ZCL,ZCL)
  3165. *                   Save system state
  3166.        GETDC   XCL,ZCL,DESCR       Get entry label
  3167.        AEQLIC  XCL,ATTRIB,0,,UNDFFE                E3.0.2
  3168.        GETDC   OCBSCL,XCL,ATTRIB                E3.0.2
  3169.        ACOMPC  TRACL,0,,DEFF18,DEFF18
  3170. *                   Check &FTRACE
  3171.        DECRA   TRACL,1           Decrement &FTRACE
  3172.        GETDC   ATPTR,ZCL,2*DESCR   Get function name
  3173.        PUSH    ZCL           Save definition block
  3174.        RCALL   ,FENTR2,(ATPTR),(INTR10,INTR10)
  3175. *                   Perform function trace
  3176.        POP     ZCL           Restore definition block
  3177. DEFF18 ACOMPC  TRAPCL,0,,DEFF19,DEFF19
  3178. *                   Check &TRACE
  3179.        GETDC   ATPTR,ZCL,2*DESCR   Get function name
  3180.        LOCAPT  ATPTR,TFENTL,ATPTR,DEFF19
  3181. *                   Check for CALL trace
  3182.        PUSH    (OCBSCL,ZCL)       Save object code base and block
  3183.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  3184. *                   Perform trace
  3185.        POP     (ZCL,OCBSCL)       Restore base and block
  3186. DEFF19 INCRA   LVLCL,1           Increment &FNCLEVEL
  3187.        ACOMPC  TRAPCL,0,,DEFF15,DEFF15
  3188. *                   Check &TRACE
  3189.        LOCAPT  ATPTR,TKEYL,FNCLKY,DEFF15
  3190. *                   Look for KEYWORD trace
  3191.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  3192. *                   Perform trace
  3193. DEFF15 SETAC   OCICL,0           Zero offset
  3194.        RCALL   ,INTERP,,(DEFFF,DEFFNR)
  3195. *                   Call interpreter
  3196.        MOVD    RETPCL,RETCL       Set &RTNTYPE to RETURN
  3197. DEFFS1 POP     ZCL           Restore definition block
  3198.        ACOMPC  TRACL,0,,DEFF20,DEFF20
  3199. *                   Check &FTRACE
  3200.        DECRA   TRACL,1           Decrement &FTRACE
  3201.        GETDC   ATPTR,ZCL,2*DESCR   Get function name
  3202.        PUSH    ZCL           Save definition block
  3203.        RCALL   ,FNEXT2,(ATPTR),(INTR10,INTR10)
  3204. *                   Perform function trace
  3205.        POP     ZCL           Restore definition block
  3206. DEFF20 ACOMPC  TRAPCL,0,,DEFFS2,DEFFS2
  3207. *                   Check &TRACE
  3208.        GETDC   ATPTR,ZCL,2*DESCR   Get function name
  3209.        LOCAPT  ATPTR,TFEXTL,ATPTR,DEFFS2
  3210. *                   Check for RETURN trace
  3211.        PUSH    (RETPCL,ZCL)       Save return and block
  3212.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  3213. *                   Perform trace
  3214.        POP     (ZCL,RETPCL)       Restore block and return
  3215. DEFFS2 DECRA   LVLCL,1           Decrement &FNCLEVEL
  3216.        ACOMPC  TRAPCL,0,,DEFF17,DEFF17
  3217. *                   Check &TRACE
  3218.        LOCAPT  ATPTR,TKEYL,FNCLKY,DEFF17
  3219. *                   Check for KEYWORD trace
  3220.        PUSH    (RETPCL,ZCL)       Save return and block
  3221.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  3222. *                   Perform trace
  3223.        POP     (ZCL,RETPCL)       Restore block and return
  3224. DEFF17 POP     (ZCL,OCBSCL,OCICL,STNOCL,FRTNCL)
  3225. *                   Restore system state
  3226.        GETSIZ  WCL,ZCL           Get size of definition block
  3227.        DECRA   WCL,DESCR       Decrement pointer
  3228.        ACOMPC  WCL,0,,INTR10,INTR10
  3229. *                   Check for end
  3230.        SUM     WPTR,ZCL,WCL       Compute pointer to last descriptor
  3231.        MOVD    YPTR,ZCL        Save pointer to block
  3232.        INCRA   YPTR,DESCR       Increment pointer
  3233.        GETDC   ZPTR,YPTR,DESCR       Get function name
  3234.        GETDC   ZPTR,ZPTR,DESCR       Get value to be returned
  3235. DEFF6  POP     XPTR           Get old value
  3236.        GETDC   YPTR,WPTR,DESCR       Get argument name
  3237.        PUTDC   YPTR,DESCR,XPTR       Restore old value
  3238.        DECRA   WPTR,DESCR       Decrement pointer
  3239.        AEQL    WPTR,ZCL,DEFF6       Check for end
  3240.        DEQL    RETPCL,FRETCL,,FAIL Check for FRETURN
  3241.        DEQL    RETPCL,NRETCL,RTZPTR
  3242. *                   Check for NRETURN
  3243.        MOVD    XPTR,ZPTR       Move name to correct descriptor
  3244.        VEQLC   XPTR,S,,DEFFVX       Check for natural variable
  3245.        VEQLC   XPTR,I,,GENVIX       Convert integer
  3246.        VEQLC   XPTR,N,,RTXNAM       Check for created variable
  3247.        VEQLC   XPTR,K,NONAME,RTXNAM
  3248. *                   Check for keyword variable
  3249. DEFFVX AEQLC   XPTR,0,RTXNAM,NONAME
  3250. *                   Check for null string
  3251. *_
  3252. DEFFF  MOVD    RETPCL,FRETCL       Set up FRETURN
  3253.        BRANCH  DEFFS1           Join processing
  3254. *_
  3255. DEFFC  PUSH    (XCL,WCL,YCL,YPTR)  Save relevant descriptors
  3256.        RCALL   XPTR,INVOKE,(XPTR),(FAIL,DEFFN)
  3257. *                   Evaluate argument
  3258.        POP     (YPTR,YCL,WCL,XCL)  Restore relevant variables
  3259.        BRANCH  DEFF3           Join processing
  3260. *_
  3261. DEFFN  POP     (YPTR,YCL,WCL,XCL)  Restore relevant variables
  3262.        BRANCH  DEFF2           Join processing
  3263. *_
  3264. DEFFNR MOVD    RETPCL,NRETCL       Set up NRETURN
  3265.        BRANCH  DEFFS1           Join processing
  3266. *_
  3267. *---------------------------------------------------------------------*
  3268.        TITLE   'External Functions'
  3269. *
  3270. *      LOAD(P)
  3271. *
  3272. LOAD   PROC    ,           LOAD(P)
  3273.        RCALL   XPTR,VARVAL,,FAIL   Get prototype
  3274.        PUSH    XPTR           Save prototype
  3275.        RCALL   WPTR,VARVAL,,FAIL   Get library name
  3276.        LOCSP   VSP,WPTR        Get specifier for library
  3277.        POP     XPTR           Restore prototypr
  3278.        LOCSP   XSP,XPTR        Get specifier for prototype
  3279.        STREAM  YSP,XSP,VARATB,PROTER,PROTER
  3280. *                   Get function name from prototype
  3281.        AEQLC   STYPE,LPTYP,PROTER  Verify left parenthesis
  3282.        RCALL   XPTR,GENVAR,YSPPTR  Generate variable for function
  3283.        RCALL   ZCL,FINDEX,XPTR       Find function
  3284.        MOVD    YCL,ZEROCL       Set argument count to zero
  3285. LOAD4  FSHRTN  XSP,1           Remove break character
  3286.        STREAM  ZSP,XSP,VARATB,LOAD1,PROTER
  3287. *                   Break out argument
  3288.        SELBRA  STYPE,(PROTER,,LOAD6)
  3289. *                   Branch on break type
  3290.        RCALL   XPTR,GENVAR,ZSPPTR  Generate variable for data type
  3291.        LOCAPV  XPTR,DTATL,XPTR,LOAD9
  3292. *                   Look up data type
  3293.        GETDC   XPTR,XPTR,DESCR       Extract data type code
  3294.        PUSH    XPTR           Save data type code
  3295. LOAD10 INCRA   YCL,1           Increment count of arguments
  3296.        BRANCH  LOAD4           Continue
  3297. *_
  3298. LOAD6  INCRA   YCL,1           Count last argument
  3299.        RCALL   XPTR,GENVAR,ZSPPTR  Generate variable for data type
  3300.        LOCAPV  XPTR,DTATL,XPTR,LOAD11
  3301. *                   Look up data type
  3302.        GETDC   XPTR,XPTR,DESCR       Get data type code
  3303.        PUSH    XPTR           Save data type code
  3304. LOAD13 FSHRTN  XSP,1           Delete right parenthesis
  3305.        RCALL   XPTR,GENVAR,XSPPTR  Generate variable for target
  3306.        LOCAPV  XPTR,DTATL,XPTR,LOAD7
  3307. *                   Look up data type
  3308.        GETDC   XPTR,XPTR,DESCR       Get data type code
  3309.        PUSH    XPTR           Save data type code
  3310. LOAD8  SETVA   LODCL,YCL       Insert number of arguments
  3311.        INCRA   YCL,1           Increment count
  3312.        MULTC   XCL,YCL,DESCR       Convert to address units
  3313.        INCRA   XCL,DESCR       Add space for entry point
  3314.        SETVC   XCL,B           Insert BLOCK data type
  3315.        RCALL   XPTR,BLOCK,XCL       Allocate block for definition
  3316.        PUTDC   ZCL,0,LODCL       Insert procedure descriptor
  3317.        PUTDC   ZCL,DESCR,XPTR       Insert definition block
  3318.        SUM     XPTR,XPTR,XCL       Compute pointer to end of block
  3319. LOAD12 DECRA   XPTR,DESCR       Decrement pointer
  3320.        POP     YPTR           Restore data type
  3321.        PUTDC   XPTR,DESCR,YPTR       Insert in block
  3322.        DECRA   YCL,1           Decrement count
  3323.        ACOMPC  YCL,0,LOAD12       Check for end
  3324.        LOAD    YPTR,YSP,VSP,FAIL   Load external function
  3325.        PUTDC   XPTR,0,YPTR       Insert entry point
  3326.        BRANCH  RETNUL           Return null string as value
  3327. *_
  3328. LOAD7  PUSH    ZEROCL           Save 0 for unspecified type
  3329.        BRANCH  LOAD8           Continue
  3330. *_
  3331. LOAD9  PUSH    ZEROCL           Save 0 for unspecified type
  3332.        BRANCH  LOAD10           Continue
  3333. *_
  3334. LOAD1  PUSH    ZEROCL           Save 0 for unspecified type
  3335.        SETSP   TSP,XSP           Set up break check
  3336.        SETLC   TSP,1           Set length to 1
  3337.        INCRA   YCL,1
  3338.        LEXCMP  TSP,RPRNSP,LOAD4,LOAD13,LOAD4
  3339. *_
  3340. LOAD11 PUSH    ZEROCL           Save 0 for unspecified type
  3341.        BRANCH  LOAD13           Continue
  3342. *_
  3343. *---------------------------------------------------------------------*
  3344. *
  3345. *      UNLOAD(F)
  3346. *
  3347. UNLOAD PROC    ,           UNLOAD(F)
  3348.        RCALL   XPTR,VARVAL,,FAIL   Get function name
  3349.        RCALL   ZCL,FINDEX,XPTR       Locate function descriptor
  3350.        PUTDC   ZCL,0,UNDFCL       Undefine function
  3351.        LOCSP   XSP,XPTR        Get specifier
  3352.        UNLOAD  XSP           Unload external definition
  3353.        BRANCH  RETNUL           Return
  3354. *_
  3355. *---------------------------------------------------------------------*
  3356. *
  3357. *      Linkage to External Functions
  3358. *
  3359. LNKFNC PROC    ,           Procedure to link to externals
  3360.        SETAV   XCL,INCL        Get actual number of arguments
  3361.        MOVD    YCL,INCL        Save function descriptor
  3362.        SETAV   WCL,YCL                        E3.9.1
  3363.        GETDC   ZCL,YCL,DESCR       Get definition block
  3364.        PSTACK  YPTR           Post stack position
  3365.        SETAC   TCL,2*DESCR       Set offset for first argument
  3366. LNKF1  PUSH    (XCL,ZCL,TCL,YPTR,WCL,YCL)
  3367. *                   Save working descriptors
  3368.        RCALL   XPTR,ARGVAL,,FAIL   Evaluate argument
  3369.        POP     (YCL,WCL,YPTR,TCL,ZCL,XCL)
  3370. *                   Restore working descriptors
  3371.        DECRA   WCL,1                        E3.9.1
  3372.        ACOMPC  WCL,0,,,LNKF8                    E3.9.1
  3373. LNKF7  GETD    ZPTR,ZCL,TCL       Get data type required
  3374.        VEQLC   ZPTR,0,,LNKF6       Check for possible conversion
  3375.        VEQL    ZPTR,XPTR,,LNKF6    Skip if data types the same
  3376.        SETAV   DTCL,XPTR       Data type of argument
  3377.        MOVV    DTCL,ZPTR       Data type required
  3378.        DEQL    DTCL,VIDTP,,LNKVI   STRING-INTEGER
  3379.        DEQL    DTCL,IVDTP,,LNKIV   INTEGER-STRING
  3380.        DEQL    DTCL,RIDTP,,LNKRI   REAL-INTEGER
  3381.        DEQL    DTCL,IRDTP,,LNKIR   INTEGER-REAL
  3382.        DEQL    DTCL,RVDTP,,LNKRV   REAL-STRING
  3383.        DEQL    DTCL,VRDTP,INTR1,LNKVR
  3384. *                   STRING-REAL
  3385. LNKIV  RCALL   XPTR,GNVARI,XPTR,LNKF6
  3386. *                   Convert INTEGER to STRING
  3387. *_
  3388. LNKRI  RLINT   XPTR,XPTR,INTR1,LNKF6
  3389. *                   Convert REAL to INTEGER
  3390. *_
  3391. LNKIR  INTRL   XPTR,XPTR       Convert INTEGER to REAL
  3392.        BRANCH  LNKF6
  3393. *_
  3394. LNKVR  LOCSP   XSP,XPTR        Get specifier
  3395.        SPCINT  XPTR,XSP,,LNKIR       Convert STRING to INTEGER
  3396.        SPREAL  XPTR,XSP,INTR1,LNKF6
  3397. *                   Convert STRING to REAL
  3398. *_
  3399. LNKRV  REALST  XSP,XPTR
  3400.        RCALL   XPTR,GENVAR,XSPPTR,LNKF6
  3401. *_
  3402. LNKVI  LOCSP   XSP,XPTR        Get specifier
  3403.        SPCINT  XPTR,XSP,,LNKF6       Convert to INTEGER
  3404.        SPREAL  XPTR,XSP,INTR1,LNKRI
  3405. *                   Convert STRING to REAL
  3406. LNKF6  INCRA   TCL,DESCR       Increment offset
  3407.        PUSH    XPTR           Save argument
  3408. LNKF8  DECRA   XCL,1                        E3.9.1
  3409.        ACOMPC  XCL,0,LNKF1                    E3.9.1
  3410.        GETDC   WPTR,YCL,0       Get procedure descriptor
  3411.        SETAV   WPTR,WPTR       Get argument count required
  3412. LNKF4  ACOMPC  WCL,0,,LNKF5,LNKF5                E3.9.1
  3413.        PUSH    NULVCL                        E3.9.1
  3414.        DECRA   WCL,1           Decrement argument count
  3415.        BRANCH  LNKF4           Continue
  3416. *_
  3417. LNKF5  GETSIZ  WCL,ZCL           Get size of definition block
  3418.        SUM     XPTR,ZCL,WCL       Compute pointer to end
  3419.        GETDC   ZPTR,XPTR,0       Get data target descriptor
  3420.        GETDC   ZCL,ZCL,DESCR       Get function address
  3421.        INCRA   YPTR,2*DESCR       Get pointer to argument list
  3422.        LINK    ZPTR,YPTR,WPTR,ZCL,FAIL
  3423. *                   Link to external function
  3424.        VEQLC   ZPTR,L,RTZPTR       Check for linked string
  3425.        GETSPC  ZSP,ZPTR,0       Get specifier
  3426.        BRANCH  GENVRZ           Go generate variable
  3427. *_
  3428. *---------------------------------------------------------------------*
  3429.        TITLE   'Arrays, Tables, and Defined Data Objects'
  3430. *
  3431. *      ARRAY(P,V)
  3432. *
  3433. ARRAY  PROC    ,           ARRAY(P,V)
  3434.        RCALL   XPTR,VARVAL,,FAIL   Get prototype
  3435.        PUSH    XPTR           Save prototype
  3436.        RCALL   TPTR,ARGVAL,,FAIL   Get initial value for array elements
  3437.        POP     XPTR           Restore prototype
  3438.        SETAC   ARRMRK,0        Clear prototype analysis switch
  3439.        MOVD    WCL,ZEROCL       Initialize dimensionality to zero
  3440.        MOVD    XCL,ONECL       Initialize size to one
  3441.        LOCSP   XSP,XPTR        Get specifier to prototype
  3442.        PUSH    XPTR           Save prototype for later insertion
  3443. ARRAY1 STREAM  YSP,XSP,NUMBTB,PROTER,ARROT1            E3.5.1
  3444.        SPCINT  YCL,YSP,PROTER       Convert string to integer
  3445.        SELBRA  STYPE,(,ARRAY3)       Branch on colon or comma
  3446.        FSHRTN  XSP,1           Delete colon
  3447.        STREAM  ZSP,XSP,NUMBTB,PROTER,ARROT2
  3448.        SPCINT  ZCL,ZSP,PROTER       Convert upper bound to integer
  3449.        SELBRA  STYPE,(PROTER,ARRAY5)
  3450. *                   Verify break character
  3451. *_
  3452. ARRAY3 ACOMPC  YCL,0,,PROTER,PROTER
  3453. *                   Single number must be positive
  3454.        MOVD    ZCL,YCL           Move to copy
  3455.        SETAC   YCL,1           Set lower bound to default of one
  3456.        BRANCH  ARRAY6
  3457. *_
  3458. ARRAY5 SUBTRT  ZCL,ZCL,YCL       Compute difference
  3459.        SUM     ZCL,ZCL,ONECL       Add one
  3460.        ACOMPC  ZCL,0,,,PROTER
  3461. ARRAY6 SETVA   YCL,ZCL           Insert width of dimension
  3462.        PUSH    YCL           Save dimension information
  3463.        MULT    XCL,XCL,ZCL,PROTER  Compute size of array to this point
  3464.        INCRA   WCL,1           Increase count of dimensions
  3465.        AEQLC   ARRMRK,0,ARRAY7                    E3.5.1
  3466.        FSHRTN  XSP,1           Remove break character
  3467.        BRANCH  ARRAY1
  3468. *_
  3469. ARROT1 SETAC   ARRMRK,1        On run out, mark end of prototype
  3470.        SPCINT  YCL,YSP,PROTER,ARRAY3
  3471. *                   Convert string to integer
  3472. *_
  3473. ARROT2 SETAC   ARRMRK,1        On run out, mark end of prototype
  3474.        SPCINT  ZCL,ZSP,PROTER,ARRAY5
  3475. *                   Convert string to integer
  3476. *_
  3477. ARRAY7 SUM     ZCL,XCL,WCL       Add dimensionality to array size
  3478.        INCRA   ZCL,2           Add two for heading information
  3479.        MULTC   ZCL,ZCL,DESCR       Convert to address units
  3480.        SETVC   ZCL,A           Insert ARRAY data type
  3481.        RCALL   ZPTR,BLOCK,ZCL       Allocate block for array structure
  3482.        MOVD    XPTR,ZPTR       Save copy
  3483.        SUM     WPTR,XPTR,ZCL       Get pointer to last descriptor
  3484.        PUTDC   ZPTR,2*DESCR,WCL    Insert dimensionality
  3485.        INCRA   XPTR,DESCR       Update working pointer
  3486. ARRAY8 INCRA   XPTR,DESCR       Update working pointer for another
  3487.        POP     YPTR           Restore index pair
  3488.        PUTDC   XPTR,DESCR,YPTR       Insert in structure
  3489.        DECRA   WCL,1           Decrement dimensionality
  3490.        ACOMPC  WCL,0,ARRAY8,ARRFIL Check for last one
  3491. ARRAY9 PUTDC   XPTR,DESCR,TPTR       Insert initial value
  3492. ARRFIL INCRA   XPTR,DESCR       Update working pointer
  3493.        ACOMP   XPTR,WPTR,INTR10,,ARRAY9
  3494. *                   Check for end
  3495.        POP     WPTR           RESTORE PROTOTYPE        E3.10.1
  3496.        PUTDC   ZPTR,DESCR,WPTR       RETURN POINTER TO ARRAY    E3.10.1
  3497.        BRANCH  RTZPTR           Return pointer to array structure
  3498. *_
  3499. *---------------------------------------------------------------------*
  3500. *
  3501. *      TABLE(N,M)
  3502. *
  3503. ASSOC  PROC    ,           TABLE(N,M)
  3504.        RCALL   XPTR,INTVAL,,FAIL   Get table size
  3505.        PUSH    XPTR           Save size
  3506.        RCALL   WPTR,INTVAL,,FAIL   Get secondary allocation
  3507.        MULT    ZPTR,WPTR,DSCRTW,SIZERR                E3.10.4
  3508.        INCRA   ZPTR,2*DESCR                    E3.10.4
  3509.        ACOMP   ZPTR,SIZLMT,SIZERR,SIZERR            E3.10.4
  3510.        POP     XPTR           Restore size
  3511.        ACOMPC  XPTR,0,ASSOC1,,LENERR
  3512.        SETAC   XPTR,EXTSIZ
  3513. ASSOC1 INCRA   XPTR,1                        E3.2.3
  3514.        MULTC   XPTR,XPTR,2*DESCR                E3.2.3
  3515.        ACOMPC  WPTR,0,ASSOC4,,LENERR
  3516.        SETAC   WPTR,EXTSIZ
  3517. ASSOC4 INCRA   WPTR,1                        E3.2.3
  3518.        MULTC   WPTR,WPTR,2*DESCR                E3.2.3
  3519.        SETVC   XPTR,T                        E3.2.3
  3520. ASSOCE PROC    ASSOC                        E3.2.3
  3521.        RCALL   ZPTR,BLOCK,XPTR                    E3.2.3
  3522.        PUTD    ZPTR,XPTR,ONECL                    E3.2.3
  3523.        DECRA   XPTR,DESCR                    E3.2.3
  3524.        PUTD    ZPTR,XPTR,WPTR                    E3.2.3
  3525. ASSOC2 DECRA   XPTR,2*DESCR                    E3.2.3
  3526.        PUTD    ZPTR,XPTR,NULVCL                 E3.2.3
  3527.        AEQLC   XPTR,DESCR,ASSOC2,RTZPTR             E3.2.3
  3528. *_
  3529. *---------------------------------------------------------------------*
  3530. *
  3531. *      DATA(P)
  3532. *
  3533. DATDEF PROC    ,           DATA(P)
  3534.        RCALL   XPTR,VARVAL,,FAIL   Get prototype
  3535.        SETAC   DATACL,0        Initialize prototype switch
  3536.        LOCSP   XSP,XPTR        Get specifier
  3537.        STREAM  YSP,XSP,VARATB,PROTER,PROTER
  3538. *                   Break out data type name
  3539.        AEQLC   STYPE,LPTYP,PROTER  Verify left parenthesis
  3540.        RCALL   XPTR,GENVAR,(YSPPTR)
  3541. *                   Generate variable for name
  3542.        RCALL   ZCL,FINDEX,(XPTR)   Find function descriptor
  3543.        INCRV   DATSEG,1        Increment data type code
  3544.        VEQLC   DATSEG,DATSIZ,,INTR27
  3545. *                   Check against limit
  3546.        MOVD    YCL,ZEROCL       Initialize count of fields
  3547.        RCALL   DTATL,AUGATL,(DTATL,DATSEG,XPTR)
  3548. *                   Augment data type pair list
  3549.        PSTACK  WPTR           Post stack position
  3550.        PUSH    (DATSEG,XPTR)       Save code and name
  3551. DATA3  FSHRTN  XSP,1           Delete break character
  3552.        AEQLC   DATACL,0,DAT5       Check for prototype end
  3553.        STREAM  YSP,XSP,VARATB,PROTER,PROTER
  3554. *                   Break out field
  3555.        SELBRA  STYPE,(PROTER,,DATA6)
  3556. DATA4  LEQLC   YSP,0,,DATA3       Check for zero length
  3557.        RCALL   XPTR,GENVAR,YSPPTR  Generate variable
  3558.        PUSH    XPTR           Save field name
  3559.        RCALL   XCL,FINDEX,(XPTR)   Find function descriptor for field
  3560.        GETDC   WCL,XCL,0       Get procedure descriptor
  3561.        DEQL    WCL,FLDCL,DAT6       Check for FIELD procedure
  3562.        GETDC   ZPTR,XCL,DESCR       Get field definition block
  3563.        MULTC   TCL,YCL,DESCR
  3564.        RCALL   ZPTR,AUGATL,(ZPTR,DATSEG,TCL)
  3565. DAT7   PUTDC   XCL,DESCR,ZPTR       Insert new definition block
  3566.        INCRA   YCL,1
  3567.        BRANCH  DATA3           Continue
  3568. *_
  3569. DATA6  SETAC   DATACL,1        Note end of prototype analysis
  3570.        BRANCH  DATA4           Join field processing
  3571. *_
  3572. DAT5   LEQLC   XSP,0,PROTER       Verify prototype consumption
  3573.        AEQLC   YCL,0,,PROTER                    E3.1.2
  3574.        SETVA   DATCL,YCL       Insert field count for data function
  3575.        PUTDC   ZCL,0,DATCL       Insert new procedure descriptor
  3576.        MULTC   YCL,YCL,DESCR
  3577.        INCRA   YCL,2*DESCR       Add two for the number and name
  3578.        MOVV    YCL,DATSEG       Insert defined data code
  3579.        RCALL   ZPTR,BLOCK,YCL       Allocate definition block
  3580.        INCRA   WPTR,DESCR                    E3.0.3
  3581.        MOVBLK  ZPTR,WPTR,YCL       Copy from stack into block
  3582.        PUTDC   ZCL,DESCR,ZPTR       Insert definition block
  3583.        BRANCH  RETNUL           Return null value
  3584. *_
  3585. DAT6   PUTDC   XCL,0,FLDCL       Insert FIELD procedure descriptor
  3586.        RCALL   ZPTR,BLOCK,TWOCL    Allocate definition block
  3587.        PUTDC   ZPTR,DESCR,DATSEG   Insert data type code
  3588.        MULTC   TCL,YCL,DESCR
  3589.        PUTDC   ZPTR,2*DESCR,TCL
  3590.        BRANCH  DAT7           Join processing
  3591. *_
  3592. *---------------------------------------------------------------------*
  3593. *
  3594. *      PROTOTYPE(A)
  3595. *
  3596. PROTO  PROC    ,           PROTOTYPE(A)
  3597.        RCALL   XPTR,ARGVAL,,FAIL   Get argument
  3598.        VEQLC   XPTR,A,NONARY       Verify ARRAY
  3599.        GETDC   ZPTR,XPTR,DESCR       Get prototype
  3600.        BRANCH  RTZPTR           Return
  3601. *_
  3602. *---------------------------------------------------------------------*
  3603. *
  3604. *      Array and Table References
  3605. *
  3606. ITEM   PROC    ,           Array or table reference
  3607.        SETAV   XCL,INCL        Get argument count
  3608.        DECRA   XCL,1           Skip referenced object
  3609.        PUSH    XCL           Save count
  3610.        RCALL   YCL,ARGVAL,,FAIL    Get referenced object
  3611.        POP     XCL           Restore count
  3612.        VEQLC   YCL,A,,ARYAD3       ARRAY is acceptable
  3613.        VEQLC   YCL,T,NONARY,ASSCR  TABLE is acceptable
  3614. ARYAD3 MOVD    WCL,XCL           Save copy of argument count
  3615. ARYAD1 ACOMPC  XCL,0,,ARYAD2,ARYAD2
  3616. *                   Count down on arguments
  3617.        PUSH    (XCL,WCL,YCL)       Save
  3618.        RCALL   XPTR,INTVAL,,FAIL   Get index
  3619.        POP     (YCL,WCL,XCL)       Restore saved descriptors
  3620.        PUSH    XPTR           Save index
  3621.        DECRA   XCL,1           Decrement argument count
  3622.        BRANCH  ARYAD1
  3623. *_
  3624. ARYAD2 MOVD    ZPTR,ZEROCL       Initialize offset to zero
  3625.        GETDC   ZCL,YCL,2*DESCR       Get number of dimensions
  3626.        MULTC   YPTR,ZCL,DESCR       Convert to addressing units
  3627.        SUM     YPTR,YCL,YPTR       Add base and offset
  3628.        INCRA   YPTR,2*DESCR       Add two for heading
  3629. ARYAD7 ACOMP   WCL,ZCL,ARGNER,ARYAD9
  3630. *                   Compare given and required number
  3631.        PUSH    ZEROCL           If too few, supply a zero
  3632.        INCRA   WCL,1           Increment and loop
  3633.        BRANCH  ARYAD7
  3634. *_
  3635. ARYAD9 INCRA   YCL,2*DESCR
  3636.        GETDC   WPTR,YCL,DESCR       Get index pair
  3637.        SETAV   TPTR,WPTR       Get extent of dimension
  3638. ARYA11 POP     XPTR           Get index value
  3639.        SUBTRT  XPTR,XPTR,WPTR       Compute differnece from lower bound
  3640.        ACOMPC  XPTR,0,,,FAIL       If less than zero, out of bounds
  3641.        ACOMP   XPTR,TPTR,FAIL,FAIL If greater than extent, out of bound
  3642.        SUM     XPTR,ZPTR,XPTR       Else add to evolving sum
  3643.        DECRA   ZCL,1           Decrement dimension count
  3644.        ACOMPC  ZCL,0,,ARYA12       Get out if done
  3645.        INCRA   YCL,DESCR       Adjust bas pointer
  3646.        GETDC   WPTR,YCL,DESCR       Get index pair
  3647.        SETAV   TPTR,WPTR       Get extent of dimension
  3648.        MULT    ZPTR,XPTR,TPTR       Multiply for next dimension
  3649.        BRANCH  ARYA11           Continue with next dimension
  3650. *_
  3651. ARYA12 MULTC   XPTR,XPTR,DESCR       Expand offset into addressing units
  3652.        SUM     XPTR,YPTR,XPTR       Add to adjusted base
  3653. ARYA10 SETVC   XPTR,N           Insert NAME data type
  3654.        BRANCH  RTXNAM           Return interior pointer
  3655. *_
  3656. ASSCR  AEQLC   XCL,1,ARGNER       Only one argument for tables
  3657.        PUSH    YCL           Save pointer to object
  3658.        RCALL   YPTR,ARGVAL,,FAIL   Evaluate argument
  3659.        POP     XPTR                        E3.2.3
  3660. ASSCR5 LOCAPV  WPTR,XPTR,YPTR,,ASSCR4                E3.2.3
  3661.        LOCAPV  WPTR,XPTR,ZEROCL,ASSCR2
  3662. *                   Look for item with null value
  3663. ASSCR4 MOVA    XPTR,WPTR
  3664.        PUTDC   XPTR,2*DESCR,YPTR                E3.2.3
  3665.        BRANCH  ARYA10           Join array reference exit
  3666. *_
  3667. ASSCR2 GETSIZ  TCL,XPTR                     E3.2.3
  3668.        GETD    ZPTR,XPTR,TCL                    E3.2.3
  3669.        AEQLC   ZPTR,1,,ASSCR3                    E3.2.3
  3670.        MOVD    XPTR,ZPTR                    E3.2.3
  3671.        BRANCH  ASSCR5                        E3.2.3
  3672. *_                                E3.2.3
  3673. ASSCR3 DECRA   TCL,DESCR                    E3.2.3
  3674.        GETD    WPTR,XPTR,TCL                    E3.2.3
  3675.        PUSH    (XPTR,TCL,YPTR)                    E3.2.3
  3676.        MOVD    XPTR,WPTR                    E3.2.3
  3677.        RCALL   ZPTR,ASSOCE,,(INTR10,INTR10)            E3.2.3
  3678.        POP     (YPTR,TCL,XPTR)                    E3.2.3
  3679.        SETVC   ZPTR,B                        E3.2.3
  3680.        INCRA   TCL,DESCR                    E3.2.3
  3681.        PUTD    XPTR,TCL,ZPTR                    E3.2.3
  3682.        PUTDC   ZPTR,2*DESCR,YPTR                E3.2.3
  3683.        MOVD    XPTR,ZPTR                    E3.2.3
  3684.        BRANCH  ARYA10                        E3.2.3
  3685. *_
  3686. *---------------------------------------------------------------------*
  3687. *      Defined Object Creation
  3688. *
  3689. DEFDAT PROC    ,           Procedure to create defined objects
  3690.        SETAV   XCL,INCL        Get given number of arguments
  3691.        MOVD    WCL,XCL           Save a copy
  3692.        MOVD    YCL,INCL        Save function descriptor
  3693.        PSTACK  YPTR           Post stack position
  3694. DEFD1  INCRA   OCICL,DESCR       Increment offset
  3695.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  3696.        TESTF   XPTR,FNC,,DEFDC       Check for function
  3697. DEFD2  AEQLC   INSW,0,,DEFD8       Check &INPUT
  3698.        LOCAPV  ZPTR,INATL,XPTR,DEFD8
  3699. *                   Look for input association
  3700.        GETDC   ZPTR,ZPTR,DESCR       Get association
  3701.        PUSH    (XCL,WCL,YCL,YPTR)  Save relevant descriptors
  3702.        RCALL   XPTR,PUTIN,(ZPTR,XPTR),FAIL
  3703.        POP     (YPTR,YCL,WCL,XCL)  Restore relevant descriptors
  3704.        BRANCH  DEFD3           Join main processing
  3705. *_
  3706. DEFD8  GETDC   XPTR,XPTR,DESCR       Get value
  3707. DEFD3  PUSH    XPTR           Save value
  3708.        DECRA   XCL,1           Decrement argument count
  3709.        ACOMPC  XCL,0,DEFD1,,INTR10 Check for end
  3710.        GETDC   XCL,YCL,0       Get procedure descriptor
  3711.        SETAV   XCL,XCL           Get number of arguments expected
  3712. DEFD4  ACOMP   WCL,XCL,DEFD5,DEFD5 Compare given with expected
  3713.        PUSH    NULVCL           Save null for omitted argument
  3714.        INCRA   WCL,1           Increment count
  3715.        BRANCH  DEFD4           Continue
  3716. *_
  3717. DEFD5  GETDC   WCL,YCL,DESCR       Get definition block
  3718.        MULTC   XCL,XCL,DESCR
  3719.        MOVV    XCL,WCL           Insert data type code
  3720.        RCALL   ZPTR,BLOCK,XCL       Allocate block for data object
  3721.        INCRA   YPTR,DESCR       Adjust stack position
  3722.        MOVBLK  ZPTR,YPTR,XCL       Move values into block
  3723.        BRANCH  RTZPTR           Return new object
  3724. *_
  3725. DEFDC  PUSH    (XCL,WCL,YCL,YPTR)  Save relevant descriptors
  3726.        RCALL   XPTR,INVOKE,(XPTR),(FAIL,DEFDN)
  3727.        POP     (YPTR,YCL,WCL,XCL)  Restore relevant descriptors
  3728.        BRANCH  DEFD3           Join main processing
  3729. *_
  3730. DEFDN  POP     (YPTR,YCL,WCL,XCL)  Restore relevant descriptors
  3731.        BRANCH  DEFD2           Join main processing
  3732. *_
  3733. *---------------------------------------------------------------------*
  3734. *
  3735. *      Fields of Defined Data Objects
  3736. *
  3737. FIELD  PROC    ,           Field function procedure
  3738.        PUSH    INCL           Save function descriptor
  3739.        RCALL   XPTR,ARGVAL,,FAIL   Get value
  3740.        DEQL    XPTR,NULVCL,,NONAME Check for null value
  3741.        POP     YCL           Restore function descriptor
  3742.        VEQLC   XPTR,I,FIELD1       Check for INTEGER
  3743.        RCALL   XPTR,GNVARI,XPTR    Convert INTEGER to STRING
  3744. FIELD1 MOVV    DT1CL,XPTR       Set up data type
  3745.        GETDC   YPTR,YCL,DESCR       Get definition block
  3746.        LOCAPT  ZCL,YPTR,DT1CL,INTR1
  3747. *                   Look for data type offset
  3748.        GETDC   ZCL,ZCL,2*DESCR       Get offset
  3749.        SUM     XPTR,XPTR,ZCL       Compute field position
  3750.        SETVC   XPTR,N           Insert NAME data type
  3751.        BRANCH  RTXNAM           Return name
  3752. *_
  3753. *---------------------------------------------------------------------*
  3754.        TITLE   'Input and Output'
  3755. *
  3756. *      INPUT(V,U,L)
  3757. *
  3758. READ   PROC    ,           INPUT(V,U,L)
  3759.        RCALL   XPTR,IND,,FAIL       Get variable
  3760.        PUSH    XPTR           Save variable
  3761.        RCALL   YPTR,INTVAL,,FAIL   Get unit
  3762.        PUSH    YPTR           Save unit
  3763.        RCALL   ZPTR,INTVAL,,FAIL   Get length
  3764.        POP     (YPTR,XPTR)       Restore unit and variable
  3765.        ACOMPC  YPTR,0,,READ5,UNTERR
  3766. *                   Check for defaulted unit
  3767. READ6  ACOMPC  ZPTR,0,READ2,,LENERR
  3768. *                   Check for defaulted length
  3769.        LOCAPT  TPTR,INSATL,YPTR,READ4
  3770. *                   Look for default length
  3771. READ3  LOCAPV  ZPTR,INATL,XPTR,READ1
  3772. *                   Look for existing association
  3773.        PUTDC   ZPTR,DESCR,TPTR       Inset input block
  3774.        BRANCH  RETNUL           Return
  3775. *_                   Add new association pair
  3776. READ1  RCALL   INATL,AUGATL,(INATL,TPTR,XPTR),RETNUL
  3777. *_
  3778. READ4  MOVD    ZPTR,DFLSIZ       Set standard default
  3779. READ2  RCALL   TPTR,BLOCK,IOBLSZ   Allocate block
  3780.        PUTDC   TPTR,DESCR,YPTR       Insert unit
  3781.        PUTDC   TPTR,2*DESCR,ZPTR   Insert format
  3782.        BRANCH  READ3           Rejoin processing
  3783. *_
  3784. READ5  SETAC   YPTR,UNITI       Set up default unit
  3785.        BRANCH  READ6           Join processing
  3786. *_
  3787. *---------------------------------------------------------------------*
  3788. *
  3789. *      OUTPUT(V,U,F)
  3790. *
  3791. PRINT  PROC    ,           OUTPUT(V,U,F)
  3792.        RCALL   XPTR,IND,,FAIL       Get variable
  3793.        PUSH    XPTR           Save variable
  3794.        RCALL   YPTR,INTVAL,,FAIL   Get unit
  3795.        PUSH    YPTR           Save unit
  3796.        RCALL   ZPTR,VARVAL,,FAIL   Get format
  3797.        POP     (YPTR,XPTR)       Restore unit and variable
  3798.        ACOMPC  YPTR,0,,PRINT5,UNTERR
  3799. PRINT6 AEQLC   ZPTR,0,PRINT2       Check for defaulted format
  3800.        LOCAPT  TPTR,OTSATL,YPTR,PRINT4
  3801. *                   Insert length
  3802. PRINT3 LOCAPV  ZPTR,OUTATL,XPTR,PRINT1
  3803. *                   Look for output association
  3804.        PUTDC   ZPTR,DESCR,TPTR       Insert output block
  3805.        BRANCH  RETNUL           Return
  3806. *_
  3807. PRINT1 RCALL   OUTATL,AUGATL,(OUTATL,TPTR,XPTR),RETNUL
  3808. *                   Add new association pair
  3809. *_
  3810. PRINT4 MOVD    ZPTR,DFLFST       Set up standard default
  3811. PRINT2 RCALL   TPTR,BLOCK,IOBLSZ   Allocate block
  3812.        PUTDC   TPTR,DESCR,YPTR       Insert unit
  3813.        PUTDC   TPTR,2*DESCR,ZPTR   Insert format
  3814.        BRANCH  PRINT3           Rejoin processing
  3815. *_
  3816. PRINT5 SETAC   YPTR,UNITO       Set default unit
  3817.        BRANCH  PRINT6           Join processing
  3818. *_
  3819. *---------------------------------------------------------------------*
  3820. *
  3821. *      BACKSPACE(U), ENDFILE(U), and REWIND(U)
  3822. *
  3823. BKSPCE PROC    ,           BACKSPACE(N)
  3824.        SETAC   SCL,1           Indicate backspace
  3825.        BRANCH  IOOP
  3826. *_
  3827. ENFILE PROC    BKSPCE           ENDFILE(N)
  3828.        SETAC   SCL,2           Indicate end of file
  3829.        BRANCH  IOOP
  3830. *_
  3831. REWIND PROC    BKSPCE           REWIND(N)
  3832.        SETAC   SCL,3           Indicate rewind
  3833. IOOP   PUSH    SCL           Push indicator
  3834.        RCALL   XCL,INTVAL,,FAIL    Evaluate integer argument
  3835.        ACOMPC  XCL,0,,UNTERR,UNTERR
  3836. *                   Reject negative or zero
  3837.        POP     SCL           Restore indicator
  3838.        SELBRA  SCL,(,EOP,ROP)       Select operation
  3839.        BKSPCE  XCL           Backspace unit
  3840.        BRANCH  RETNUL
  3841. *_
  3842. EOP    ENFILE  XCL           End file unit
  3843.        BRANCH  RETNUL
  3844. *_
  3845. ROP    REWIND  XCL           Rewind unit
  3846.        BRANCH  RETNUL
  3847. *_
  3848. *---------------------------------------------------------------------*
  3849. *
  3850. *      DETACH(N)
  3851. *
  3852. DETACH PROC    ,           DETACH(N)
  3853.        RCALL   XPTR,IND,,FAIL       Get name of variable
  3854.        LOCAPV  ZPTR,INATL,XPTR,DTCH1
  3855. *                   Look for input association
  3856.        PUTDC   ZPTR,DESCR,ZEROCL   Delete association if there is one
  3857.        PUTDC   ZPTR,2*DESCR,ZEROCL Clear association pointer also
  3858. DTCH1  LOCAPV  ZPTR,OUTATL,XPTR,RETNUL
  3859. *                   Look for output association
  3860.        PUTDC   ZPTR,DESCR,ZEROCL   Delete association is there is one
  3861.        PUTDC   ZPTR,2*DESCR,ZEROCL Clear association pointer also
  3862.        BRANCH  RETNUL           Return null value
  3863. *_
  3864. *---------------------------------------------------------------------*
  3865. *
  3866. *      Input Procedure
  3867. *
  3868. PUTIN  PROC    ,           Input procedure
  3869.        POP     (IO1PTR,IO2PTR)       Restore block and variable
  3870.        GETDC   IO3PTR,IO1PTR,DESCR Get unit
  3871.        GETDC   IO1PTR,IO1PTR,2*DESCR
  3872. *                   Get length
  3873.        RCALL   IO4PTR,CONVAR,(IO1PTR)
  3874. *                   Get space for string
  3875.        LOCSP   IOSP,IO4PTR       Get specifier
  3876.        INCRA   RSTAT,1           Increment count of reads
  3877.        STREAD  IOSP,IO3PTR,FAIL,COMP5
  3878. *                   Perform read
  3879.        AEQLC   TRIMCL,0,,PUTIN1    Check &INPUT
  3880.        TRIMSP  IOSP,IOSP       Trim string
  3881.        GETLG   IO1PTR,IOSP       Get length
  3882. PUTIN1 ACOMP   IO1PTR,MLENCL,INTR8                E3.9.2
  3883.        VEQLC   IO2PTR,K,,PUTIN3    CHECK FOR KEYWORD        E3.10.2
  3884.        RCALL   IO1PTR,GNVARS,IO1PTR                E3.9.2
  3885. *                   Form variable for string
  3886. PUTIN2 PUTDC   IO2PTR,DESCR,IO1PTR                E3.10.2
  3887.        RRTURN  IO1PTR,2        Return value
  3888. PUTIN3 LOCSP   XSP,IO1PTR                    E3.10.2
  3889.        SPCINT  IO1PTR,XSP,INTR1,PUTIN2                E3.10.2
  3890. *_
  3891. *---------------------------------------------------------------------*
  3892. *
  3893. *      Output Procedure
  3894. *
  3895. PUTOUT PROC    ,           Output procedure
  3896.        POP     (IO1PTR,IO2PTR)       Restore block and value
  3897.        VEQLC   IO2PTR,S,,PUTV       Is value STRING?
  3898.        VEQLC   IO2PTR,I,,PUTI       Is value INTEGER?
  3899.        RCALL   IO2PTR,DTREP,IO2PTR Get data type representation
  3900.        GETSPC  IOSP,IO2PTR,0       Get specifier
  3901.        BRANCH  PUTVU           Join processing
  3902. *_
  3903. PUTV   LOCSP   IOSP,IO2PTR       Get specifier
  3904. PUTVU  STPRNT  IOKEY,IO1PTR,IOSP   Perform print
  3905.        INCRA   WSTAT,1           Increment count of writes
  3906.        BRANCH  RTN1           Return
  3907. *_
  3908. PUTI   INTSPC  IOSP,IO2PTR       Convert INTEGER to STRING
  3909.        BRANCH  PUTVU           Rejoin processing
  3910. *_
  3911. *---------------------------------------------------------------------*
  3912.        TITLE   'Tracing Procedures and Functions'
  3913. *
  3914. *      TRACE(V,R,T,F)
  3915. *
  3916. TRACE  PROC    ,           TRACE(V,R,T,F)
  3917.        RCALL   XPTR,IND,,FAIL       Get name of variable
  3918.        PUSH    XPTR           Save name
  3919.        RCALL   YPTR,VARVAL,,FAIL   Get trace type
  3920.        PUSH    YPTR           Save type
  3921.        RCALL   WPTR,ARGVAL,,FAIL   Get tag
  3922.        PUSH    WPTR           Save tag
  3923.        RCALL   ZPTR,VARVAL,,FAIL   Get trace function
  3924.        POP     (WPTR,YPTR,XPTR)    Restore saved arguments
  3925.        DEQL    YPTR,NULVCL,TRAC5   Is type defaulted??
  3926.        MOVD    YPTR,VALTRS       Set up VALUE default
  3927. TRAC5  LOCAPV  YPTR,TRATL,YPTR,TRAC1
  3928. *                   Look for trace type
  3929.        GETDC   YPTR,YPTR,DESCR       Get sub pair list
  3930. TRACEP PROC    TRACE           Subentry for TRACE
  3931.        GETDC   TPTR,YPTR,DESCR       Get default function
  3932.        DEQL    ZPTR,NULVCL,,TRAC2  Check for null
  3933.        RCALL   TPTR,FINDEX,(ZPTR)  Locate function descriptor
  3934. TRAC2  SETAC   XSIZ,5*DESCR                    V3.7
  3935.        SETVC   XSIZ,C           Insert CODE data type
  3936.        RCALL   XCL,BLOCK,XSIZ       Allocate block for code
  3937.        MOVBLK  XCL,TRCBLK,XSIZ                    V3.7
  3938.        SETVC   TPTR,2           Set up 2 arguments
  3939.        PUTDC   XCL,1*DESCR,TPTR    Insert function descriptor
  3940.        PUTDC   XCL,3*DESCR,XPTR    Insert name to be traced
  3941.        PUTDC   XCL,5*DESCR,WPTR    Insert tag
  3942.        GETDC   TPTR,YPTR,0       Make entry for proper attribute
  3943.        AEQLC   TPTR,0,,TRAC4
  3944.        LOCAPT  TPTR,TPTR,XPTR,TRAC3
  3945. *                   Locate trace
  3946.        PUTDC   TPTR,2*DESCR,XCL    Insert new code block
  3947.        BRANCH  RETNUL           Return
  3948. *_
  3949. TRAC3  RCALL   TPTR,AUGATL,(TPTR,XPTR,XCL)
  3950. *                   Augment pair list for new entry
  3951. TRAC6  PUTDC   YPTR,0,TPTR       Link in new pair list
  3952.        BRANCH  RETNUL           Return
  3953. *_
  3954. TRAC1  DEQL    YPTR,FUNTCL,INTR30  Is type FUNCTION?
  3955.        MOVD    YPTR,TFNCLP       Set up CALL trace
  3956.        RCALL   ,TRACEP,,(INTR10,INTR10)
  3957. *                   Call subentry to do it
  3958.        MOVD    YPTR,TFNRLP       Set up RETURN trace
  3959.        BRANCH  TRACEP           Branch to subentry to do it
  3960. *_
  3961. TRAC4  RCALL   TPTR,BLOCK,TWOCL    Allocate new pair list
  3962.        PUTDC   TPTR,DESCR,XPTR       Insert name to be traced
  3963.        PUTDC   TPTR,2*DESCR,XCL    Insert pointer to pseudo-code
  3964.        BRANCH  TRAC6
  3965. *_
  3966. *---------------------------------------------------------------------*
  3967. *
  3968. *      STOPTR(N,T)
  3969. *
  3970. STOPTR PROC    ,           STOPTR(T,R)
  3971.        RCALL   XPTR,IND,,FAIL       Get name of variable
  3972.        PUSH    XPTR           Save name
  3973.        RCALL   YPTR,VARVAL,,FAIL   Get trace respect
  3974.        POP     XPTR
  3975.        DEQL    YPTR,NULVCL,STOPT2  Check for defaulted respect
  3976.        MOVD    YPTR,VALTRS       Set up VALUE as default
  3977. STOPT2 LOCAPV  YPTR,TRATL,YPTR,STOPT1
  3978. *                   Look for trace respect
  3979.        GETDC   YPTR,YPTR,DESCR       Get pointer to trace list
  3980. STOPTP PROC    STOPTR           Subentry for FUNCTION
  3981.        GETDC   YPTR,YPTR,0       Get trace list
  3982.        LOCAPT  YPTR,YPTR,XPTR,FAIL Look for traced variable
  3983.        PUTDC   YPTR,DESCR,ZEROCL   Zero the entry
  3984.        PUTDC   YPTR,2*DESCR,ZEROCL Overwrite trace
  3985.        BRANCH  RETNUL           Return
  3986. *_
  3987. STOPT1 DEQL    YPTR,FUNTCL,INTR30  Check for FUNCTION
  3988.        MOVD    YPTR,TFNCLP       Set up CALL
  3989.        RCALL   ,STOPTP,,(FAIL,INTR10)
  3990. *                   Call subprocedure
  3991.        MOVD    YPTR,TFNRLP       Set up RETURN
  3992.        BRANCH  STOPTP           Branch to subentry
  3993. *_
  3994. *---------------------------------------------------------------------*
  3995. *
  3996. *      Call Tracing
  3997. *
  3998. FENTR  PROC    ,           Procedure to trace on CALL
  3999.        RCALL   WPTR,VARVAL,,FAIL   Get argument
  4000. FENTR3 SETLC   PROTSP,0        Clear specifier
  4001.        APDSP   PROTSP,TRSTSP       Append trace message
  4002.        INTSPC  XSP,STNOCL       Convert &STNO to string
  4003.        APDSP   PROTSP,XSP       Append &STNO
  4004.        APDSP   PROTSP,COLSP       Append colon
  4005.        APDSP   PROTSP,TRLVSP       Append level message
  4006.        INTSPC  XSP,LVLCL       Convert &FNCLEVEL to string
  4007.        APDSP   PROTSP,XSP       Append &FNCLEVEL
  4008.        APDSP   PROTSP,TRCLSP       Append call message
  4009.        LOCSP   XSP,WPTR        Get specifier for argument
  4010.        GETLG   TCL,XSP           Get length
  4011.        ACOMPC  TCL,BUFLEN,FXOVR,FXOVR
  4012. *                   Check for excessively long string
  4013.        APDSP   PROTSP,XSP       Append function name
  4014.        APDSP   PROTSP,LPRNSP       Append left parenthesis
  4015.        SETAC   WCL,0           Set argument count to 0
  4016. FNTRLP INCRA   WCL,1           Increment argument count
  4017.        RCALL   ZPTR,ARGINT,(WPTR,WCL),(FENTR4,INTR10)
  4018. *                   Get argument
  4019.        GETDC   ZPTR,ZPTR,DESCR       Get value
  4020.        VEQLC   ZPTR,S,,DEFTV       Is it STRING?
  4021.        VEQLC   ZPTR,I,,DEFTI       Is it INTEGER?
  4022.        RCALL   A2PTR,DTREP,ZPTR    Get data type representation
  4023.        GETSPC  XSP,A2PTR,0       Get specifier
  4024.        GETLG   SCL,XSP           Get length
  4025.        SUM     TCL,TCL,SCL       Total length
  4026.        ACOMPC  TCL,BUFLEN,FXOVR,FXOVR
  4027. *                   Check for excessively long string
  4028. DEFTIA APDSP   PROTSP,XSP       Append value
  4029.        BRANCH  DEFDTT           Continue with next argument
  4030. *_
  4031. DEFTI  INTSPC  XSP,ZPTR        Convert INTEGER to STRING
  4032.        BRANCH  DEFTIA           Rejoin processing
  4033. *_
  4034. DEFTV  LOCSP   XSP,ZPTR        Get specifier
  4035.        GETLG   SCL,XSP           Get length
  4036.        SUM     TCL,TCL,SCL       Get total length
  4037.        ACOMPC  TCL,BUFLEN,FXOVR,FXOVR
  4038. *                   Check for excessively long string
  4039.        APDSP   PROTSP,QTSP       Append quote
  4040.        APDSP   PROTSP,XSP       Append value
  4041.        APDSP   PROTSP,QTSP       Append quote
  4042. DEFDTT APDSP   PROTSP,CMASP       Append comma
  4043.        BRANCH  FNTRLP           Continue processing
  4044. *_
  4045. FENTR4 AEQLC   WCL,1,,FENTR5       Leave paren if no arguments
  4046.        SHORTN  PROTSP,1        Delete last comma
  4047. FENTR5 APDSP   PROTSP,RPRNSP       Append right parenthesis
  4048.        MSTIME  ZPTR           Get time
  4049.        SUBTRT  ZPTR,ZPTR,ETMCL       Compute elapsed time
  4050.        INTSPC  XSP,ZPTR        Convert to STRING
  4051.        APDSP   PROTSP,ETIMSP       Append time message
  4052.        APDSP   PROTSP,XSP       Append time
  4053.        STPRNT  IOKEY,OUTBLK,PROTSP Print trace message
  4054.        BRANCH  RTNUL3           Return
  4055. *_
  4056. FENTR2 PROC    FENTR           Standard entry
  4057.        POP     WPTR           Restore function name
  4058.        BRANCH  FENTR3
  4059. *_
  4060. FXOVR  OUTPUT  OUTPUT,PRTOVF       Print error message
  4061.        BRANCH  RTNUL3           Return
  4062. *_
  4063. *---------------------------------------------------------------------*
  4064. *
  4065. *      Keyword and Label Tracing
  4066. *
  4067. KEYTR  PROC    ,           Procedure to trace keywords
  4068.        SETAC   FNVLCL,1        Set entry indicator
  4069.        RCALL   WPTR,VARVAL,,FAIL   Get keyword
  4070.        LOCSP   XSP,WPTR        Get specifier
  4071.        RCALL   YCL,KEYT,(WPTR),(INTR10,)
  4072. *                   Get value of keyword
  4073. KEYTR3 SETLC   PROTSP,0        Clear specifier
  4074.        APDSP   PROTSP,TRSTSP       Append trace message
  4075.        INTSPC  TSP,STNOCL       Convert &STNO to string
  4076.        APDSP   PROTSP,TSP       Append &STNO
  4077.        APDSP   PROTSP,COLSP       Append colon
  4078.        AEQLC   FNVLCL,0,,KEYTR4    Check entry indicator
  4079.        APDSP   PROTSP,AMPSP       Append ampersand
  4080. KEYTR4 APDSP   PROTSP,XSP       Append name of keyword
  4081.        APDSP   PROTSP,BLSP       Append blank
  4082.        AEQLC   FNVLCL,0,,KEYTR5    Check entry indicator
  4083.        INTSPC  YSP,YCL           Convert keyword value to string
  4084.        APDSP   PROTSP,EQLSP       Append equal sign
  4085. KEYTR5 APDSP   PROTSP,YSP       Append value
  4086.        MSTIME  YPTR           Get time
  4087.        SUBTRT  YPTR,YPTR,ETMCL       Compute elapsed time
  4088.        INTSPC  XSP,YPTR        Convert time to string
  4089.        APDSP   PROTSP,ETIMSP       Append time message
  4090.        APDSP   PROTSP,XSP       Append time
  4091.        STPRNT  IOKEY,OUTBLK,PROTSP Print trace message
  4092.        BRANCH  RTN2           Return
  4093. *_
  4094. LABTR  PROC    KEYTR           Procedure to trace labels
  4095.        SETAC   FNVLCL,0        Set entry indicator
  4096.        RCALL   YPTR,VARVAL,,FAIL   Get label name
  4097.        LOCSP   YSP,YPTR        Get specifier
  4098.        SETSP   XSP,XFERSP       Set up message specifier
  4099.        BRANCH  KEYTR3           Join common processing
  4100. *_
  4101. *---------------------------------------------------------------------*
  4102. *
  4103. *      Trace Handler
  4104. *
  4105. TRPHND PROC    ,           Trace handling procedure
  4106.        POP     ATPTR           Restore trace
  4107.        DECRA   TRAPCL,1        Decrement &TRACE
  4108.        PUSH    (LSTNCL,STNOCL,FRTNCL,OCBSCL,OCICL,TRAPCL,TRACL)
  4109. *                   Save system descriptors
  4110.        GETDC   OCBSCL,ATPTR,2*DESCR    NEW CODE BASE
  4111. *                   Get new code base
  4112.        SETAC   OCICL,DESCR       Set up offset
  4113.        GETD    XPTR,OCBSCL,OCICL   Get function descriptor
  4114.        SETAC   TRAPCL,0        Set &TRACE to 0
  4115.        SETAC   TRACL,0           Set &FTRACE to 0
  4116.        RCALL   ,INVOKE,XPTR,(,)                 E3.3.1
  4117. *                   Evaluate function
  4118.        POP     (TRACL,TRAPCL,OCICL,OCBSCL,FRTNCL,STNOCL,LSTNCL)
  4119. *                   Restore system descriptors
  4120.        BRANCH  RTN1                        E3.3.1
  4121. *_
  4122. *---------------------------------------------------------------------*
  4123. *
  4124. *      Value Tracing
  4125. *
  4126. VALTR  PROC    ,           Tracing procedures
  4127.        SETAC   FNVLCL,1        Note entry
  4128. VALTR2 RCALL   XPTR,IND,,FAIL       Get variable to be traced
  4129.        PUSH    XPTR           Save name
  4130.        RCALL   ZPTR,VARVAL,,FAIL   Get tag
  4131.        POP     XPTR           Restore variable
  4132. VALTR4 SETLC   TRACSP,0        Clear specifier
  4133.        APDSP   TRACSP,TRSTSP       Append trace message
  4134.        INTSPC  XSP,STNOCL       Convert &STNO to string
  4135.        APDSP   TRACSP,XSP       Append &STNO
  4136.        APDSP   TRACSP,COLSP       Append colon
  4137.        AEQLC   FNVLCL,0,,FNEXT1    Check entry indicator
  4138.        VEQLC   XPTR,S,DEFDT       Is variable a string?
  4139. VALTR3 LOCSP   XSP,XPTR        Get specifier
  4140.        GETLG   TCL,XSP           Get length
  4141.        ACOMPC  TCL,BUFLEN,VXOVR,VXOVR
  4142. *                   Check for excessively long name
  4143. VALTR1 APDSP   TRACSP,XSP       Append name of variable
  4144.        APDSP   TRACSP,BLEQSP       Append ' = '
  4145.        GETDC   YPTR,XPTR,DESCR       Get value of traced variable
  4146.        VEQLC   YPTR,S,,TRV       Is it STRING?
  4147.        VEQLC   YPTR,I,,TRI       Is it INTEGER?
  4148.        RCALL   XPTR,DTREP,YPTR       Else get data type representation
  4149.        GETSPC  XSP,XPTR,0       Get specifier
  4150. TRI2   APDSP   TRACSP,XSP       Append value
  4151.        BRANCH  TRPRT           Join common processing
  4152. *_
  4153. TRV    LOCSP   XSP,YPTR        Get specifier
  4154.        GETLG   SCL,XSP           Get length
  4155.        SUM     TCL,TCL,SCL       Compute total length
  4156.        ACOMPC  TCL,BUFLEN,VXOVR,VXOVR
  4157. *                   Check for excessively long message
  4158.        APDSP   TRACSP,QTSP       Append quote
  4159.        APDSP   TRACSP,XSP       Append string
  4160.        APDSP   TRACSP,QTSP       Append quote
  4161. TRPRT  MSTIME  YPTR           Get time
  4162.        SUBTRT  YPTR,YPTR,ETMCL       Compute time in interpreter
  4163.        INTSPC  XSP,YPTR        Convert to STRING
  4164.        APDSP   TRACSP,ETIMSP       Append time message
  4165.        APDSP   TRACSP,XSP       Append time
  4166.        STPRNT  IOKEY,OUTBLK,TRACSP Print trace message
  4167.        BRANCH  RTNUL3           Return
  4168. *_
  4169. TRI    INTSPC  XSP,YPTR        Convert INTEGER to STRING
  4170.        BRANCH  TRI2           Join processing
  4171. *_
  4172. DEFDT  LOCSP   XSP,ZPTR        Get specifier for tag
  4173.        BRANCH  VALTR1           Join processing
  4174. *_
  4175. FNEXTR PROC    VALTR           Return tracing procedure
  4176.        SETAC   FNVLCL,0        Note entry
  4177.        BRANCH  VALTR2           Join processing
  4178. *_
  4179. FNEXT1 APDSP   TRACSP,TRLVSP       Append level message
  4180.        MOVD    XCL,LVLCL       Copy &FNCLEVEL
  4181.        DECRA   XCL,1           Decrement
  4182.        INTSPC  XSP,XCL           Convert to STRING
  4183.        APDSP   TRACSP,XSP       Append function level
  4184.        APDSP   TRACSP,BLSP       Append blank
  4185.        LOCSP   XSP,RETPCL       Get specifier for return
  4186.        APDSP   TRACSP,XSP       Append return type
  4187.        APDSP   TRACSP,OFSP       Append ' OF '
  4188.        DEQL    RETPCL,FRETCL,VALTR3
  4189. *                   Check for FRETURN
  4190.        LOCSP   XSP,XPTR        Get specifier for function name
  4191.        GETLG   TCL,XSP           Get length
  4192.        ACOMPC  TCL,BUFLEN,VXOVR,VXOVR
  4193. *                   Check for excessively long string
  4194.        APDSP   TRACSP,XSP       Append name of function
  4195.        BRANCH  TRPRT           Join common processing
  4196. *_                   FTRACE call trace
  4197. FNEXT2 PROC    VALTR           Note entry
  4198.        SETAC   FNVLCL,0        Restore function name
  4199.        POP     XPTR           Join common processing
  4200.        BRANCH  VALTR4
  4201. *_
  4202. VXOVR  OUTPUT  OUTPUT,PRTOVF       Print error message
  4203.        BRANCH  RTNUL3           Return
  4204. *_
  4205. *---------------------------------------------------------------------*
  4206.        TITLE   'Other Operations'
  4207. *
  4208. *      Assignment
  4209. *
  4210. ASGN   PROC    ,           X = Y
  4211.        INCRA   OCICL,DESCR       Increment offset in object code
  4212.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  4213.        TESTF   XPTR,FNC,,ASGNC       Test for function descriptor
  4214. ASGNV  VEQLC   XPTR,K,,ASGNIC       Check for keyword subject
  4215.        INCRA   OCICL,DESCR       Increment offset in object code
  4216.        GETD    YPTR,OCBSCL,OCICL   Get object code descriptor
  4217.        TESTF   YPTR,FNC,,ASGNCV    Test for function descriptor
  4218. ASGNVN AEQLC   INSW,0,,ASGNV1       Check &INPUT
  4219.        LOCAPV  ZPTR,INATL,YPTR,ASGNV1
  4220. *                   Look for input association
  4221.        GETDC   ZPTR,ZPTR,DESCR       Get input association descriptor
  4222.        RCALL   YPTR,PUTIN,(ZPTR,YPTR),(FAIL,ASGNVV)
  4223. *_
  4224. ASGNV1 GETDC   YPTR,YPTR,DESCR       Get value
  4225. ASGNVV PUTDC   XPTR,DESCR,YPTR       Perform assignment
  4226.        AEQLC   OUTSW,0,,ASGN1       Check &OUTPUT
  4227.        LOCAPV  ZPTR,OUTATL,XPTR,ASGN1
  4228. *                   Look for output association
  4229.        GETDC   ZPTR,ZPTR,DESCR       Get output association descriptor
  4230.        RCALL   ,PUTOUT,(ZPTR,YPTR) Perform output
  4231. ASGN1  ACOMPC  TRAPCL,0,,RTNUL3,RTNUL3
  4232. *                   Check &TRACE
  4233.        LOCAPT  ATPTR,TVALL,XPTR,RTNUL3
  4234. *                   Look for VALUE trace
  4235.        RCALL   ,TRPHND,ATPTR,RTNUL3                E3.3.1
  4236. *_
  4237. ASGNC  RCALL   XPTR,INVOKE,(XPTR),(FAIL,ASGNV,NEMO)
  4238. *_
  4239. ASGNCV PUSH    XPTR           Save subject of assignment
  4240.        RCALL   YPTR,INVOKE,(YPTR),(FAIL,ASGNVP)
  4241. ASGNCJ POP     XPTR           Restore subject
  4242.        BRANCH  ASGNVV
  4243. *_
  4244. ASGNVP POP     XPTR           Restore subject
  4245.        BRANCH  ASGNVN
  4246. *_
  4247. ASGNIC PUSH    XPTR           Save subject of assignment
  4248.        RCALL   YPTR,INTVAL,,(FAIL,ASGNCJ)
  4249. *                   Get integer value for keyword
  4250. *_
  4251. *---------------------------------------------------------------------*
  4252. *
  4253. *      X Y (concatenation)
  4254. *
  4255. CON    PROC    ,           X Y (concatenation)
  4256.        RCALL   ,XYARGS,,FAIL       Get two arguments
  4257.        DEQL    XPTR,NULVCL,,RTYPTR If first is null, return second
  4258.        DEQL    YPTR,NULVCL,,RTXPTR If second is null, return first
  4259.        VEQLC   XPTR,S,,CON5       Is first STRING?
  4260.        VEQLC   XPTR,P,,CON5       Is first PATTERN?
  4261.        VEQLC   XPTR,I,,CON4I       Is first INTEGER?
  4262.        VEQLC   XPTR,R,,CON4R       Is first REAL?
  4263.        VEQLC   XPTR,E,INTR1       Is first EXPRESSION?
  4264.        RCALL   TPTR,BLOCK,STARSZ   Allocate block for pattern
  4265.        MOVBLK  TPTR,STRPAT,STARSZ  Set up pattern for expression
  4266.        PUTDC   TPTR,4*DESCR,XPTR   Insert pointer to expression
  4267.        MOVD    XPTR,TPTR       Set up as first argument
  4268.        BRANCH  CON5
  4269. *_
  4270. CON4R  REALST  REALSP,XPTR       Convert REAL to STRING
  4271.        SETSP   XSP,REALSP       Set up specifier
  4272.        RCALL   XPTR,GENVAR,XSPPTR,CON5
  4273. *                   Generate variable
  4274. *_
  4275. CON4I  INTSPC  ZSP,XPTR        Convert INTEGER to STRING
  4276.        RCALL   XPTR,GENVAR,(ZSPPTR)
  4277. *                   Generate variable
  4278. CON5   VEQLC   YPTR,S,,CON7       Is second STRING?
  4279.        VEQLC   YPTR,P,,CON7       Is second PATTERN?
  4280.        VEQLC   YPTR,I,,CON5I       Is second INTEGER?
  4281.        VEQLC   YPTR,R,,CON5R       Is second REAL?
  4282.        VEQLC   YPTR,E,INTR1       Is second EXPRESSION?
  4283.        RCALL   TPTR,BLOCK,STARSZ   Allocate block for pattern
  4284.        MOVBLK  TPTR,STRPAT,STARSZ  Set up pattern for expression
  4285.        PUTDC   TPTR,4*DESCR,YPTR   Insert pointer to expression
  4286.        MOVD    YPTR,TPTR       Set up as second argument
  4287.        BRANCH  CON7           Join processing
  4288. *_
  4289. CON5R  REALST  REALSP,YPTR       Convert REAL to STRING
  4290.        SETSP   YSP,REALSP       Set up sepcifier
  4291.        RCALL   YPTR,GENVAR,YSPPTR,CON7
  4292. *                   Generate variable
  4293. *_
  4294. CON5I  INTSPC  ZSP,YPTR        Convert INTEGER to STRING
  4295.        RCALL   YPTR,GENVAR,(ZSPPTR)
  4296. *                   Generate variable
  4297. CON7   SETAV   DTCL,XPTR       Get data type of first
  4298.        MOVV    DTCL,YPTR       Get data type of second
  4299.        DEQL    DTCL,VVDTP,,CONVV   Check for STRING-STRING
  4300.        DEQL    DTCL,VPDTP,,CONVP   Check for STRING-PATTERN
  4301.        DEQL    DTCL,PVDTP,,CONPV   Check for PATTERN-STRING
  4302.        DEQL    DTCL,PPDTP,INTR1,CONPP
  4303. *                   Check for PATTERN-PATTERN
  4304. *_
  4305. CONVV  LOCSP   XSP,XPTR        Specifier for first string
  4306.        LOCSP   YSP,YPTR        Specifier for second string
  4307.        GETLG   XCL,XSP           Length of first string
  4308.        GETLG   YCL,YSP           Length of second string
  4309.        SUM     XCL,XCL,YCL       Total length
  4310.        ACOMP   XCL,MLENCL,INTR8    Check against &MAXLNGTH
  4311.        RCALL   ZPTR,CONVAR,(XCL)   Allocate space for string
  4312.        LOCSP   TSP,ZPTR        Get specifier to allocated space
  4313.        SETLC   TSP,0           Clear length
  4314.        APDSP   TSP,XSP           Move in first string
  4315.        APDSP   TSP,YSP           Append second string
  4316.        BRANCH  GENVSZ           Generate variable
  4317. *_
  4318. CONVP  LOCSP   TSP,XPTR        Specifier to string
  4319.        GETLG   TMVAL,TSP       Get length of string
  4320.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for pattern
  4321.        MAKNOD  XPTR,TPTR,TMVAL,ZEROCL,CHRCL,XPTR
  4322. *                   Construct pattern
  4323. CONPP  GETSIZ  XSIZ,XPTR       Get size of first pattern
  4324.        GETSIZ  YSIZ,YPTR       Get size of second pattern
  4325.        SUM     TSIZ,XSIZ,YSIZ       Compute total size required
  4326.        SETVC   TSIZ,P           Insert PATTERN data type
  4327.        RCALL   TPTR,BLOCK,TSIZ       Allocate block for new pattern
  4328.        MOVD    ZPTR,TPTR       Save copy to return
  4329.        LVALUE  TVAL,YPTR       Get least value for second pattern
  4330.        CPYPAT  TPTR,XPTR,TVAL,ZEROCL,XSIZ,XSIZ
  4331. *                   Copy in first pattern
  4332.        CPYPAT  TPTR,YPTR,ZEROCL,XSIZ,ZEROCL,YSIZ
  4333. *                   Copy in second pattern
  4334.        BRANCH  RTZPTR           Return pattern as value
  4335. *_
  4336. CONPV  LOCSP   TSP,YPTR        Get specifier to string
  4337.        GETLG   TMVAL,TSP       Get length of string
  4338.        RCALL   TPTR,BLOCK,LNODSZ   Allocate block for pattern
  4339.        MAKNOD  YPTR,TPTR,TMVAL,ZEROCL,CHRCL,YPTR
  4340. *                   Construct pattern for string
  4341.        BRANCH  CONPP           Join common processing
  4342. *_
  4343. *---------------------------------------------------------------------*
  4344. *
  4345. *      Indirect Reference
  4346. *
  4347. IND    PROC    ,           $X
  4348.        RCALL   XPTR,ARGVAL,,FAIL   Get argument
  4349.        VEQLC   XPTR,S,,INDV       STRING is acceptable
  4350.        VEQLC   XPTR,N,,RTXNAM       NAME can be returned directly
  4351.        VEQLC   XPTR,I,,GENVIX       Convert INTEGER
  4352.        VEQLC   XPTR,K,INTR1,RTXNAM KEYWORD is like NAME
  4353. *_
  4354. INDV   AEQLC   XPTR,0,RTXNAM,NONAME
  4355. *                   Be sure string is not null
  4356. *_
  4357. *---------------------------------------------------------------------*
  4358. *
  4359. *      Keywords
  4360. *
  4361. KEYWRD PROC    ,           &X
  4362.        INCRA   OCICL,DESCR       Increment offset
  4363.        GETD    XPTR,OCBSCL,OCICL   Get object code descriptor
  4364.        TESTF   XPTR,FNC,,KEYC       Check for function
  4365. KEYN   LOCAPV  XPTR,KNATL,XPTR,KEYV
  4366. *                   Look up X on unprotected list
  4367.        SETVC   XPTR,K           Set KEYWORD (NAME) data type
  4368.        BRANCH  RTXNAM           Return by name
  4369. *_
  4370. KEYV   LOCAPV  ATPTR,KVATL,XPTR,UNKNKW
  4371. *                   Look up X on protected list
  4372.        GETDC   ZPTR,ATPTR,DESCR    Get value
  4373.        BRANCH  RTZPTR           Return by value
  4374. *_
  4375. KEYC   RCALL   XPTR,INVOKE,(XPTR),(FAIL,KEYN,NEMO)
  4376. *                   Evaluate computed keyword
  4377. *_
  4378. KEYT   PROC    KEYWRD           Procedure to get keyword for trace
  4379.        POP     XPTR           Restore argument
  4380.        BRANCH  KEYN
  4381. *_                   Join common processing
  4382. *---------------------------------------------------------------------*
  4383. *      Literal Evaluation
  4384. *
  4385. *
  4386. LIT    PROC    ,           'X'
  4387.        INCRA   OCICL,DESCR       Increment offset
  4388.        GETD    ZPTR,OCBSCL,OCICL   Get object code descriptor
  4389.        BRANCH  RTZPTR           Return value
  4390. *_
  4391. *---------------------------------------------------------------------*
  4392. *
  4393. *      Unary Name Operator
  4394. *
  4395. NAME   PROC    ,           .X
  4396.        INCRA   OCICL,DESCR       Increment offset
  4397.        GETD    ZPTR,OCBSCL,OCICL   Get object code descriptor
  4398.        TESTF   ZPTR,FNC,RTZPTR       Test for function
  4399.        RCALL   ZPTR,INVOKE,ZPTR,(FAIL,RTZPTR,NEMO)
  4400. *_
  4401. *
  4402. *
  4403. *---------------------------------------------------------------------*
  4404. *
  4405. *      Value Assignment in Pattern Matching
  4406. *
  4407. NMD    PROC    ,
  4408.        MOVD    TCL,NHEDCL
  4409. NMD1   ACOMP   TCL,NAMICL,INTR13,RTN2
  4410. *                   Check for end
  4411.        SUM     TPTR,NBSPTR,TCL       Compute address
  4412.        GETSPC  TSP,TPTR,DESCR       Get specifier
  4413.        GETDC   TVAL,TPTR,DESCR+SPEC
  4414. *                   get variable
  4415.        GETLG   XCL,TSP           Get length
  4416.        ACOMP   XCL,MLENCL,INTR8    Check &MAXLNGTH
  4417.        VEQLC   TVAL,E,,NAMEXN       Is Variable EXPRESSION?
  4418. NMD5   VEQLC   TVAL,K,,NMDIC       Is variable KEYWORD?
  4419.        RCALL   VVAL,GENVAR,(TSPPTR)
  4420. *                   Generate string
  4421. NMD4   PUTDC   TVAL,DESCR,VVAL       Assign value
  4422.        AEQLC   OUTSW,0,,NMD3       Check &OUTPUT
  4423.        LOCAPV  ZPTR,OUTATL,TVAL,NMD3
  4424. *                   Look for output association
  4425.        GETDC   ZPTR,ZPTR,DESCR       Get association
  4426.        RCALL   ,PUTOUT,(ZPTR,VVAL) Perform output
  4427. NMD3   ACOMPC  TRAPCL,0,,NMD2,NMD2 Check &TRACE
  4428.        LOCAPT  ATPTR,TVALL,TVAL,NMD2
  4429. *                   Look for VALUE trace
  4430.        PUSH    (TCL,NAMICL,NHEDCL) Save state
  4431.        MOVD    NHEDCL,NAMICL       Set up new name list
  4432.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  4433. *                   Perform trace
  4434.        POP     (NHEDCL,NAMICL,TCL) Restore state
  4435. NMD2   INCRA   TCL,DESCR+SPEC       Move to next name
  4436.        BRANCH  NMD1           Continue
  4437. *_
  4438. NMDIC  SPCINT  VVAL,TSP,INTR1,NMD4 Convert to INTEGER
  4439. *_
  4440. NAMEXN RCALL   TVAL,EXPEVL,TVAL,(FAIL,NMD5,NEMO)        E3.10.5
  4441. *                   Evaluate expression
  4442. *_
  4443. *---------------------------------------------------------------------*
  4444. *
  4445. *      Unevaluated Expression
  4446. *
  4447. STR    PROC    ,           *X
  4448.        SUM     ZPTR,OCBSCL,OCICL   Compute position in code
  4449.        RCALL   ,CODSKP,(ONECL)       Skip one nest
  4450.        SETVC   ZPTR,E           Insert EXPRESSION data type
  4451.        BRANCH  RTZPTR           Return pointer to code
  4452. *_
  4453. *---------------------------------------------------------------------*
  4454.        TITLE   'Other Predicates'
  4455. *
  4456. *      DIFFER(X,Y)
  4457. *
  4458. DIFFER PROC    ,           DIFFER(X,Y)
  4459.        RCALL   ,XYARGS,,FAIL       Evaluate arguments
  4460.        DEQL    XPTR,YPTR,RETNUL,FAIL
  4461. *                   Compare them
  4462. *_
  4463. *---------------------------------------------------------------------*
  4464. *
  4465. *      IDENT(X,Y)
  4466. *
  4467. IDENT  PROC    ,           IDENT(X,Y)
  4468.        RCALL   ,XYARGS,,FAIL       Evaluate arguments
  4469.        DEQL    XPTR,YPTR,FAIL,RETNUL
  4470. *                   Compare arguments
  4471. *_
  4472. *---------------------------------------------------------------------*
  4473. *
  4474. *      LGT(X,Y)
  4475. *
  4476. LGT    PROC    ,           LGT(X,Y)
  4477.        RCALL   XPTR,VARVAL,,FAIL   Evaluate first argument
  4478.        PUSH    XPTR           Save first argument
  4479.        RCALL   YPTR,VARVAL,,FAIL   Evaluate second argument
  4480.        POP     XPTR           Restore first argument
  4481.        AEQLC   XPTR,0,,FAIL       Null is not greater than anything
  4482.        AEQLC   YPTR,0,,RETNUL       Similarly for second argument
  4483.        LOCSP   XSP,XPTR        Get specifier to first argument
  4484.        LOCSP   YSP,YPTR        Get specifier to second argument
  4485.        LEXCMP  XSP,YSP,RETNUL,FAIL,FAIL
  4486. *                   Compare lexically
  4487. *_
  4488. *---------------------------------------------------------------------*
  4489. *
  4490. *      Unary Negation Operator
  4491. *
  4492. NEG    PROC    ,           \X
  4493.        PUSH    (OCBSCL,OCICL)       Save object code position
  4494.        RCALL   ,ARGVAL,,(,FAIL)    Fail on success
  4495.        POP     (OCICL,OCBSCL)       Restore object code position
  4496.        RCALL   ,CODSKP,(ONECL),RETNUL
  4497. *                   Skip argument and return
  4498. *_
  4499. *---------------------------------------------------------------------*
  4500. *
  4501. *      Unary Interrogation Operator
  4502. *
  4503. QUES   PROC    ,           ?X
  4504.        RCALL   ,ARGVAL,,(FAIL,RETNUL)
  4505. *                   Evaluate argument
  4506. *_
  4507. *---------------------------------------------------------------------*
  4508.        TITLE   'Other Functions'
  4509. *
  4510. *      APPLY(F,A1,...AN)
  4511. *
  4512. APPLY  PROC    ,           APPLY(F,A1,...,AN)
  4513.        SETAV   XCL,INCL        Get count of arguments
  4514.        DECRA   XCL,1           Decrement to skip function name
  4515.        ACOMPC  XCL,1,,,ARGNER                    E3.3.3
  4516.        PUSH    XCL           Save argument count
  4517.        RCALL   XPTR,VARVAL,,FAIL   Get function name
  4518.        POP     XCL           Restore argument count
  4519.        LOCAPV  XPTR,FNCPL,XPTR,UNDF
  4520. *                   Locate function
  4521.        GETDC   INCL,XPTR,DESCR       Get function descriptor
  4522.        SETVA   INCL,XCL        Insert actual number of arguments
  4523.        RCALL   ZPTR,INVOKE,(INCL),(FAIL,,RTZPTR)
  4524.        MOVD    XPTR,ZPTR       Return by name
  4525.        BRANCH  RTXNAM
  4526. *_
  4527. *---------------------------------------------------------------------*
  4528. *
  4529. *      ARG(F,N), FIELD(F,N), and LOCAL(F,N)
  4530. *
  4531. ARG    PROC    ,           ARG(F,N)
  4532.        PUSH    (ONECL,DEFCL)       Save ARG indicators
  4533.        BRANCH  ARG1           Join main processing
  4534. *_
  4535. ARGINT PROC    ARG           Procedure used for CALL tracing
  4536.        POP     (XPTR,XCL)       Restore arguments
  4537.        PUSH    (ONECL,DEFCL)       Save indicators
  4538.        BRANCH  ARG2           Join processing
  4539. *_
  4540. LOCAL  PROC    ARG           LOCAL(F,N)
  4541.        PUSH    (ONECL,ZEROCL,DEFCL)
  4542. *                   Save LOCAL indicators
  4543.        BRANCH  ARG1           Join main processing
  4544. *_
  4545. FIELDS PROC    ARG           FIELD(F,N)
  4546.        PUSH    (ZEROCL,ZEROCL,DATCL)
  4547. *                   Save FIELD indicators
  4548. ARG1   RCALL   XPTR,VARVAL,,FAIL   Get function name
  4549.        PUSH    XPTR           Save function name
  4550.        RCALL   XCL,INTVAL,,FAIL    Get number
  4551.        ACOMP   ZEROCL,XCL,FAIL,FAIL
  4552. *                   Verify positive number
  4553.        POP     XPTR           Restore function name
  4554. ARG2   LOCAPV  XPTR,FNCPL,XPTR,INTR30
  4555. *                   Look for function descriptor
  4556.        GETDC   XPTR,XPTR,DESCR       Get function descriptor
  4557.        GETDC   YCL,XPTR,0       Get procedure descriptor
  4558.        GETDC   XPTR,XPTR,DESCR       Get definition block
  4559.        POP     (ZCL,ALCL)       Restore indicators
  4560.        AEQL    YCL,ZCL,INTR30       Check procedure type
  4561.        MULTC   XCL,XCL,DESCR       Convert number to address units
  4562.        INCRA   XCL,2*DESCR       Skip prototype information
  4563.        SETAV   YCL,YCL           Get argument count
  4564.        MULTC   YCL,YCL,DESCR       Convert to address units
  4565.        AEQLC   ALCL,0,,ARG4       Check funcion type
  4566.        INCRA   YCL,2*DESCR       Increment for heading
  4567.        MOVD    ZCL,YCL           Get working copy
  4568.        BRANCH  ARG5           Branch to continue processing
  4569. *_
  4570. ARG4   GETSIZ  ZCL,XPTR        Get size of block
  4571.        POP     ALCL           Restore entry indicator
  4572.        AEQLC   ALCL,0,,ARG5       Check entry type
  4573.        SUM     XCL,XCL,YCL       Skip formal arguments
  4574. ARG5   ACOMP   XCL,ZCL,FAIL       Check number in bounds
  4575.        GETD    ZPTR,XPTR,XCL       Get the desired name
  4576.        BRANCH  RTZPTR           Return name as value
  4577. *_
  4578. *---------------------------------------------------------------------*
  4579. *
  4580. *      CLEAR()
  4581. *
  4582. CLEAR  PROC    ,           CLEAR()
  4583.        RCALL   ,ARGVAL,,FAIL       Get rid of argument
  4584.        SETAC   DMPPTR,OBLIST-DESCR Initialize bin pointer
  4585. CLEAR1 ACOMP   DMPPTR,OBEND,RETNUL Check for end
  4586.        INCRA   DMPPTR,DESCR       Update for next bin
  4587.        MOVD    YPTR,DMPPTR       Get working copy
  4588. CLEAR2 GETAC   YPTR,YPTR,LNKFLD    Get next variable
  4589.        AEQLC   YPTR,0,,CLEAR1       Check for end of chain
  4590.        PUTDC   YPTR,DESCR,NULVCL   Assign null value
  4591.        BRANCH  CLEAR2           Continue
  4592. *_
  4593. *---------------------------------------------------------------------*
  4594. *
  4595. *      COLLECT(N)
  4596. *
  4597. COLECT PROC    ,           COLLECT(N)
  4598.        RCALL   XPTR,INTVAL,,FAIL   Get number of address units required
  4599.        ACOMPC  XPTR,0,,,LENERR       Verify positive integer
  4600.        RCALL   ZPTR,GC,(XPTR),FAIL Call for storage regeneration
  4601.        SETVC   ZPTR,I           Set INTEGER data type
  4602.        BRANCH  RTZPTR           Return amount collected
  4603. *_
  4604. *---------------------------------------------------------------------*
  4605. *
  4606. *      COPY(X)
  4607. *
  4608. COPY   PROC    ,           COPY(X)
  4609.        RCALL   XPTR,ARGVAL,,FAIL   Get object to copy
  4610.        VEQLC   XPTR,S,,INTR1       STRING cannot be copied
  4611.        VEQLC   XPTR,I,,INTR1       INTEGER cannot be copied
  4612.        VEQLC   XPTR,R,,INTR1       REAL cannot be copied
  4613.        VEQLC   XPTR,N,,INTR1       NAME cannot be copied
  4614.        VEQLC   XPTR,K,,INTR1       KEYWORD (NAME) cannot be copied
  4615.        VEQLC   XPTR,E,,INTR1       EXPRESSION cannot be copied
  4616.        VEQLC   XPTR,T,,INTR1       TABLE cannot be copied
  4617.        GETSIZ  XCL,XPTR        Get size of object to copy
  4618.        MOVV    XCL,XPTR        Insert data type
  4619.        RCALL   ZPTR,BLOCK,XCL       Allocate block for copy
  4620.        MOVBLK  ZPTR,XPTR,XCL       Copy contents
  4621.        BRANCH  RTZPTR           Return the copy
  4622. *_
  4623. *---------------------------------------------------------------------*
  4624. *
  4625. *      CONVERT(X,T)
  4626. *
  4627. CNVRT  PROC    ,           CONVERT(X,T)
  4628.        RCALL   ZPTR,ARGVAL,,FAIL   Get object to be converted
  4629.        PUSH    ZPTR           Save object
  4630.        RCALL   YPTR,VARVAL,,FAIL   Get data type target
  4631.        POP     ZPTR           Restore object
  4632.        LOCAPV  XPTR,DTATL,YPTR,INTR1
  4633. *                   Look for data type code
  4634.        GETDC   XPTR,XPTR,DESCR       Get code
  4635.        SETAV   DTCL,ZPTR       Insert object data type
  4636.        MOVV    DTCL,XPTR       Insert target data type
  4637.        DEQL    DTCL,IVDTP,,CNVIV   Check for INTEGER-STRING
  4638.        DEQL    DTCL,VCDTP,,RECOMP  Check for STRING-CODE
  4639.        DEQL    DTCL,VEDTP,,CONVE
  4640.        DEQL    DTCL,VRDTP,,CONVR   Check for STRING-REAL
  4641.        DEQL    DTCL,RIDTP,,CONRI   Check for REAL-INTEGER
  4642.        DEQL    DTCL,IRDTP,,CONIR   Check for INTEGER-REAL
  4643.        DEQL    DTCL,VIDTP,,CNVVI   CHeck for STRING-INTEGER
  4644.        DEQL    DTCL,ATDTP,,CNVAT   Check for ARRAY-TABLE
  4645.        DEQL    DTCL,TADTP,,CNVTA   Check for TABLE-ARRAY
  4646.        VEQL    ZPTR,XPTR,,RTZPTR                E3.0.4
  4647.        VEQLC   XPTR,S,FAIL,CNVRTS                E3.0.4
  4648. *                   Check for idem-conversion
  4649. *_
  4650. RECOMP SETAC   SCL,1           Note STRING-CODE conversion
  4651. RECOMJ LOCSP   TEXTSP,ZPTR       Set up global specifier
  4652. RECOMT GETLG   OCALIM,TEXTSP                    E3.1.5
  4653.        AEQLC   OCALIM,0,,RECOMN                 E3.1.5
  4654.        MULTC   OCALIM,OCALIM,DESCR Convert to address units
  4655.        INCRA   OCALIM,6*DESCR       Leave room for safety
  4656.        SETVC   OCALIM,C        Insert CODE data type
  4657.        RCALL   CMBSCL,BLOCK,OCALIM Allocate block for object code
  4658.        SUM     OCLIM,CMBSCL,OCALIM Compute end
  4659.        DECRA   OCLIM,6*DESCR
  4660.        SETAC   CMOFCL,0        Zero offset
  4661.        SETAC   ESAICL,0        Zero error count
  4662.        PUSH    CMBSCL           Save block pointer
  4663.        SELBRA  SCL,(,CONVEX)       Select correct procedure
  4664. RECOM1 LEQLC   TEXTSP,0,,RECOM2    Is string exhausted?
  4665.        RCALL   ,CMPILE,,(RECOMF,,RECOM1)
  4666. *                   Compile statement
  4667. RECOM2 SETAC   SCL,3           Set return switch
  4668. RECOMQ INCRA   CMOFCL,DESCR       Increment offset
  4669.        PUTD    CMBSCL,CMOFCL,ENDCL Insert END function
  4670.        POP     ZPTR           Restore pointer to code block
  4671. RECOMZ SUM     CMBSCL,CMBSCL,CMOFCL
  4672. *                   Compute used portion of block
  4673.        RCALL   ,SPLIT,(CMBSCL)       Split off remainder
  4674.        SETAC   OCLIM,0           Clear limit pointer
  4675.        SETAC   LPTR,0           Clear label pointer
  4676.        ZERBLK  COMREG,COMDCT       Zero compiler descriptors
  4677.        SELBRA  SCL,(FAIL,INTR10,RTZPTR)
  4678. *                   Select return
  4679. *_
  4680. RECOMF SETAC   SCL,1           Set failure return
  4681.        BRANCH  RECOMQ           Rejoin processing
  4682. *_
  4683. RECOMN SETSP   TEXTSP,BLSP                    E3.1.5
  4684.        BRANCH  RECOMT                        E3.1.5
  4685. *_                                E3.1.5
  4686. CODER  PROC    CNVRT           CODE(S)
  4687.        RCALL   ZPTR,VARVAL,,(FAIL,RECOMP)
  4688. *                   Get argument
  4689. *_
  4690. CONVE  PROC    CNVRT           Convert to EXPRESSION
  4691.        SETAC   SCL,2           Set switch
  4692.        BRANCH  RECOMJ           Join common program
  4693. *_
  4694. CONVEX RCALL   FORMND,EXPR,,FAIL   Compile expression
  4695.        LEQLC   TEXTSP,0,FAIL       Verify complete compilation
  4696.        RCALL   ,TREPUB,FORMND       Publish code tree
  4697.        MOVD    ZPTR,CMBSCL                    E3.1.6
  4698.        SETVC   ZPTR,E           Insert EXPRESSION data type
  4699.        SETAC   SCL,3           Set return branch
  4700.        BRANCH  RECOMZ           Join common program
  4701. *_
  4702. CONVR  LOCSP   ZSP,ZPTR        Get specifier
  4703.        SPCINT  ZPTR,ZSP,,CONIR       Try conversion to INTEGER first
  4704.        SPREAL  ZPTR,ZSP,FAIL,RTZPTR
  4705. *                   Convert to REAL
  4706. *_
  4707. CONIR  INTRL   ZPTR,ZPTR       Convert INTEGER to REAL
  4708.        BRANCH  RTZPTR           Return value
  4709. *_
  4710. CONRI  RLINT   ZPTR,ZPTR,FAIL,RTZPTR
  4711. *                   Convert REAL to INTEGER
  4712. *_
  4713. CNVIV  RCALL   ZPTR,GNVARI,ZPTR,RTZPTR
  4714. *                   Convert INTEGER to STRING
  4715. *_
  4716. CNVVI  LOCSP   ZSP,ZPTR        Get specifier
  4717.        SPCINT  ZPTR,ZSP,,RTZPTR    Convert STRING to INTEGER
  4718.        SPREAL  ZPTR,ZSP,FAIL,CONRI Try conversion to REAL
  4719. *_
  4720. CNVRTS RCALL   XPTR,DTREP,ZPTR       Get data type representation
  4721.        GETSPC  ZSP,XPTR,0       Get specifier
  4722.        BRANCH  GENVRZ           Go generate variable
  4723. *_
  4724. CNVTA  MOVD    YPTR,ZPTR                    E3.2.3
  4725.        MOVD    YCL,ZEROCL                    E3.2.3
  4726. CNVTA7 GETSIZ  XCL,YPTR                     E3.2.3
  4727.        MOVD    WPTR,YPTR                    E3.2.3
  4728.        MOVD    ZCL,XCL                        E3.2.3
  4729.        DECRA   XCL,3*DESCR                    E3.2.3
  4730. CNVTA1 GETD    WCL,WPTR,XCL       Get item value
  4731.        DEQL    WCL,NULVCL,,CNVTA2  Check for null value
  4732.        INCRA   YCL,1           Otherwise count item
  4733. CNVTA2 AEQLC   XCL,DESCR,,CNVTA6                E3.2.3
  4734.        DECRA   XCL,2*DESCR       Count down
  4735.        BRANCH  CNVTA1           Process next item
  4736. *_
  4737. CNVTA6 GETD    YPTR,YPTR,ZCL                    E3.2.3
  4738.        AEQLC   YPTR,1,CNVTA7                    E3.2.3
  4739. CNVTA4 AEQLC   YCL,0,,FAIL       Fail on empty table
  4740.        MOVD    WPTR,ZPTR                    E3.2.3
  4741.        MULTC   XCL,YCL,2*DESCR       Convert count to address units
  4742.        INTSPC  YSP,YCL           Get prototype for size
  4743.        SETLC   PROTSP,0        Clear specifier
  4744.        APDSP   PROTSP,YSP       Append length
  4745.        APDSP   PROTSP,CMASP       Append comma
  4746.        MOVD    WCL,ZEROCL                    E3.1.1
  4747.        SETAC   WCL,2           Set up 2 for second dimension
  4748.        INTSPC  XSP,WCL           Convert to string
  4749.        APDSP   PROTSP,XSP       Append 2
  4750.        SETSP   XSP,PROTSP       Move specifier
  4751.        RCALL   TPTR,GENVAR,XSPPTR                E3.5.2
  4752. *                   Generate variable for prototype
  4753.        MOVD    ZCL,XCL           Save size
  4754.        INCRA   XCL,4*DESCR       Increment for heading
  4755.        RCALL   ZPTR,BLOCK,XCL       Get block for array
  4756.        SETVC   ZPTR,A           Insert ARRAY data type
  4757.        MOVD    ATPRCL,TPTR                    E3.5.2
  4758.        SETVA   ATEXCL,YCL       Insert First dimension in head
  4759.        MOVBLK  ZPTR,ATRHD,FRDSCL   Copy heading information
  4760.        MOVD    YPTR,ZPTR       Save copy of block pointer
  4761.        MULTC   YCL,YCL,DESCR       Convert item count to address units
  4762.        INCRA   YPTR,5*DESCR       Skip heading
  4763.        SUM     TPTR,YPTR,YCL       Compute second half position
  4764. CNVTA8 GETSIZ  WCL,WPTR                     E3.2.3
  4765.        DECRA   WCL,2*DESCR                    E3.2.3
  4766.        SUM     WCL,WPTR,WCL                    E3.2.3
  4767. CNVTA3 GETDC   TCL,WPTR,DESCR                    E3.2.3
  4768.        DEQL    TCL,NULVCL,,CNVTA5                E3.2.3
  4769.        PUTDC   TPTR,0,TCL                    E3.2.3
  4770.        MOVDIC  YPTR,0,WPTR,2*DESCR
  4771.        INCRA   YPTR,DESCR       Increment upper pointer
  4772.        INCRA   TPTR,DESCR       Increment lower pointer
  4773. CNVTA5 INCRA   WPTR,2*DESCR
  4774.        AEQL    WCL,WPTR,CNVTA3                    E3.2.3
  4775.        GETDC   WPTR,WCL,2*DESCR                 E3.2.3
  4776.        AEQLC   WPTR,1,CNVTA8                    E3.8.1
  4777.        SETAC   TPTR,0                        E3.8.1
  4778.        BRANCH  RTZPTR                        E3.8.1
  4779. *_
  4780. CNVAT  GETDC   XCL,ZPTR,2*DESCR    Get array dimensionality
  4781.        MOVD    YPTR,ZPTR       Save copy of array pointer
  4782.        AEQLC   XCL,2,FAIL       Verify rectangular array
  4783.        GETDC   XCL,ZPTR,3*DESCR    Get second dimension
  4784.        VEQLC   XCL,2,FAIL       Verify extent of 2
  4785.        GETSIZ  XCL,ZPTR        Get size of array block
  4786.        DECRA   XCL,2*DESCR                    E3.2.3
  4787.        RCALL   XPTR,BLOCK,XCL       Allocate block for pair list
  4788.        SETVC   XPTR,T                        E3.2.3
  4789.        GETDC   YCL,ZPTR,4*DESCR                 E3.2.3
  4790.        MOVD    ZPTR,XPTR                    E3.2.3
  4791.        PUTD    XPTR,XCL,ONECL                    E3.2.3
  4792.        DECRA   XCL,DESCR                    E3.2.3
  4793.        MOVD    TCL,EXTVAL                    E3.2.3
  4794.        INCRA   TCL,2*DESCR                    E3.2.3
  4795.        PUTD    XPTR,XCL,TCL                    E3.2.3
  4796.        SETAV   YCL,YCL                        E3.2.3
  4797.        MULTC   YCL,YCL,DESCR                    E3.2.3
  4798.        INCRA   YPTR,5*DESCR                    E3.2.3
  4799.        SUM     WPTR,YPTR,YCL                    E3.2.3
  4800. CNVAT2 MOVDIC  XPTR,DESCR,WPTR,0                E3.2.3
  4801.        MOVDIC  XPTR,2*DESCR,YPTR,0                E3.2.3
  4802.        DECRA   YCL,DESCR                    E3.2.3
  4803.        AEQLC   YCL,0,,RTZPTR                    E3.2.3
  4804.        INCRA   XPTR,2*DESCR       Increment pair list pointer
  4805.        INCRA   WPTR,DESCR       Increment lower array pointer
  4806.        INCRA   YPTR,DESCR       Increment upper array pointer
  4807.        BRANCH  CNVAT2           Continue
  4808. *_
  4809. *---------------------------------------------------------------------*
  4810. *
  4811. *      DATE()
  4812. *
  4813. DATE   PROC    ,           DATE()
  4814.        RCALL   ,ARGVAL,,FAIL       Get rid of argument
  4815.        DATE    ZSP           Get the date
  4816.        BRANCH  GENVRZ           Go generate the variable
  4817. *_
  4818. *---------------------------------------------------------------------*
  4819. *
  4820. *      DATATYPE(X)
  4821. *
  4822. DT     PROC    ,           DATATYPE(X)
  4823.        RCALL   A2PTR,ARGVAL,,FAIL  Get object
  4824.        MOVV    DT1CL,A2PTR       Insert data type
  4825.        LOCAPT  A3PTR,DTATL,DT1CL,DTEXTN
  4826. *                   Look for data type
  4827.        GETDC   A3PTR,A3PTR,2*DESCR Get data type name
  4828. DTRTN  RRTURN  A3PTR,3           Return name
  4829. *_
  4830. DTEXTN MOVD    A3PTR,EXTPTR       Set up EXTERNAL data type
  4831.        BRANCH  DTRTN           Return
  4832. *_
  4833. *---------------------------------------------------------------------*
  4834. *
  4835. *      DUMP(N)
  4836. *
  4837. DMP    PROC    ,           DUMP(N)
  4838.        RCALL   XPTR,INTVAL,,FAIL   Evaluate argument
  4839.        AEQLC   XPTR,0,,RETNUL       No dump if zero
  4840. DUMP   PROC    DMP           End game dump procedure
  4841.        SETAC   WPTR,OBLIST-DESCR   Initialize bin list pointer
  4842. DMPB   ACOMP   WPTR,OBEND,RETNUL   Check for end
  4843.        INCRA   WPTR,DESCR       Increment pointer
  4844.        MOVD    YPTR,WPTR       Save working copy
  4845. DMPA   GETAC   YPTR,YPTR,LNKFLD    Get string structure
  4846.        AEQLC   YPTR,0,,DMPB       Check for end of chain
  4847.        GETDC   XPTR,YPTR,DESCR       Get value
  4848.        DEQL    XPTR,NULVCL,,DMPA   Skip null string values
  4849.        SETLC   DMPSP,0           Clear specifier
  4850.        LOCSP   YSP,YPTR        Get specifier for variable
  4851.        GETLG   YCL,YSP           Get length
  4852.        ACOMPC  YCL,BUFLEN,DMPOVR,DMPOVR
  4853. *                   Check for excessive length
  4854.        APDSP   DMPSP,YSP       Append variable
  4855.        APDSP   DMPSP,BLEQSP       Append ' = '
  4856.        VEQLC   XPTR,S,,DMPV       STRING is alright
  4857.        VEQLC   XPTR,I,,DMPI       Convert INTEGER
  4858.        RCALL   A1PTR,DTREP,XPTR    Else get representation
  4859.        GETSPC  YSP,A1PTR,0       Get specifier
  4860. DMPX   GETLG   XCL,YSP           Get length
  4861.        SUM     YCL,YCL,XCL       Get total
  4862.        ACOMPC  YCL,BUFLEN,DMPOVR   Check for excessive length
  4863.        APDSP   DMPSP,YSP       Append value
  4864.        BRANCH  DMPRT           Go print it
  4865. *_
  4866. DMPV   LOCSP   YSP,XPTR        Get specifier
  4867.        GETLG   XCL,YSP           Get length
  4868.        SUM     YCL,YCL,XCL       Total length
  4869.        ACOMPC  YCL,BUFLEN,DMPOVR   Check for excessive length
  4870.        APDSP   DMPSP,QTSP       Append quote
  4871.        APDSP   DMPSP,YSP       Append value
  4872.        APDSP   DMPSP,QTSP       Append quote
  4873. DMPRT  STPRNT  IOKEY,OUTBLK,DMPSP  Print line
  4874.        BRANCH  DMPA           Continue
  4875. *_
  4876. DMPI   INTSPC  YSP,XPTR        Convert integer
  4877.        BRANCH  DMPX           Rejoin processing
  4878. *_
  4879. DMPOVR OUTPUT  OUTPUT,PRTOVF       Print error message
  4880.        BRANCH  DMPA           Continue
  4881. *_
  4882. DMK    PROC    ,           Procedure to dump keywords
  4883.        OUTPUT  OUTPUT,PKEYF       Print caption
  4884.        GETSIZ  XCL,KNLIST       Get size of pair list
  4885. DMPK1  GETD    XPTR,KNLIST,XCL       Get name of keyword
  4886.        DECRA   XCL,DESCR       Adjust offset
  4887.        GETD    YPTR,KNLIST,XCL       Get value of keyword
  4888.        INTSPC  YSP,YPTR        Convert integer to string
  4889.        LOCSP   XSP,XPTR        Get specifier
  4890.        SETLC   DMPSP,0           Clear specifier
  4891.        APDSP   DMPSP,AMPSP       Append ampersand
  4892.        APDSP   DMPSP,XSP       Append name
  4893.        APDSP   DMPSP,BLEQSP       Append ' = '
  4894.        APDSP   DMPSP,YSP       Append value
  4895.        STPRNT  IOKEY,OUTBLK,DMPSP  Print line
  4896.        DECRA   XCL,DESCR       Adjust offset
  4897.        AEQLC   XCL,0,DMPK1,RTN1    Check for end
  4898. *_
  4899. *---------------------------------------------------------------------*
  4900. *
  4901. *      DUPL(S,N)
  4902. *
  4903. DUPL   PROC    ,           DUPL(S,N)
  4904.        RCALL   XPTR,VARVAL,,FAIL   Get string to duplicate
  4905.        PUSH    XPTR           Save string
  4906.        RCALL   YPTR,INTVAL,,FAIL   Get duplication factor
  4907.        POP     XPTR           Restore string
  4908.        ACOMPC  YPTR,0,,RETNUL,FAIL Return null for 0 duplications
  4909.        LOCSP   XSP,XPTR        Get specifier
  4910.        GETLG   XCL,XSP           Get length
  4911.        MULT    XCL,XCL,YPTR,AERROR                E3.9.3
  4912.        ACOMP   XCL,MLENCL,INTR8    Check &MAXLNGTH
  4913.        RCALL   ZPTR,CONVAR,XCL       Allocate space for string
  4914.        LOCSP   TSP,ZPTR        Get specifier
  4915.        SETLC   TSP,0           Zero length
  4916. DUPL1  APDSP   TSP,XSP           Append a copy
  4917.        DECRA   YPTR,1           Count down
  4918.        AEQLC   YPTR,0,DUPL1,GENVSZ Check for end
  4919. *_
  4920. *---------------------------------------------------------------------*
  4921. *
  4922. *      OPSYN(F1,F2,N)
  4923. *
  4924. OPSYN  PROC    ,           OPSYN(F,G,N)
  4925.        RCALL   XPTR,VARVAL,,FAIL   Get object function
  4926.        PUSH    XPTR           Save object function
  4927.        RCALL   YPTR,VARVAL,,FAIL   Get image function
  4928.        PUSH    YPTR           Save image function
  4929.        RCALL   ZPTR,INTVAL,,FAIL   Get type indicator
  4930.        POP     (YPTR,XPTR)       Restore image and object functions
  4931.        AEQLC   XPTR,0,,NONAME       Object may not be null
  4932.        AEQLC   ZPTR,1,,UNYOP       Check for unary definition
  4933.        AEQLC   ZPTR,2,,BNYOP       Check for binary definition
  4934.        AEQLC   ZPTR,0,INTR30       Check for function definition
  4935.        RCALL   XPTR,FINDEX,XPTR    Get function descriptor for object
  4936. UNBF   RCALL   YPTR,FINDEX,YPTR                 E3.6.2
  4937. OPPD   MOVDIC  XPTR,0,YPTR,0       Move procedure descriptor pair
  4938.        MOVDIC  XPTR,DESCR,YPTR,DESCR
  4939.        BRANCH  RETNUL
  4940. *_
  4941. UNYOP  LOCSP   XSP,XPTR        Get specifier for image
  4942.        LEQLC   XSP,1,UNAF       Length must be 1 for operator
  4943.        SETSP   ZSP,PROTSP                    E3.5.3
  4944.        SETLC   ZSP,0                        E3.5.3
  4945.        APDSP   ZSP,XSP                        E3.5.3
  4946.        APDSP   ZSP,LPRNSP                    E3.5.3
  4947.        STREAM  TSP,ZSP,UNOPTB,UNAF,UNAF             E3.5.3
  4948.        MOVD    XPTR,STYPE       STYPE has function descriptor
  4949. UNCF   LOCSP   YSP,YPTR        Get specifier for image
  4950.        LEQLC   YSP,1,UNBF       Length must be 1 for operator
  4951.        SETSP   ZSP,PROTSP                    E3.5.3
  4952.        SETLC   ZSP,0                        E3.5.3
  4953.        APDSP   ZSP,YSP                        E3.5.3
  4954.        APDSP   ZSP,LPRNSP                    E3.5.3
  4955.        STREAM  TSP,ZSP,UNOPTB,UNBF,UNBF             E3.5.3
  4956.        MOVD    YPTR,STYPE       STYPE has function descriptor
  4957.        BRANCH  OPPD           Join to copy descriptors
  4958. *_
  4959. UNAF   RCALL   XPTR,FINDEX,XPTR    Find definition of image
  4960.        BRANCH  UNCF           Join search for object
  4961. *_
  4962. BNYOP  LOCSP   XSP,XPTR        Get specifier for image
  4963.        LCOMP   XSP,EQLSP,BNAF       Length must be 2 or less
  4964.        SETSP   ZSP,PROTSP                    E3.5.3
  4965.        SETLC   ZSP,0                        E3.5.3
  4966.        APDSP   ZSP,XSP                        E3.5.3
  4967.        APDSP   ZSP,BLSP                     E3.5.3
  4968.        STREAM  TSP,ZSP,BIOPTB,BNAF,BNAF             E3.5.3
  4969.        LEQLC   ZSP,0,BNAF                    E3.5.3
  4970.        MOVD    XPTR,STYPE       STYPE has function descriptor
  4971. BNCF   LOCSP   YSP,YPTR        Get specifier for object
  4972.        LCOMP   YSP,EQLSP,BNBF       Length must be 2 or less
  4973.        SETSP   ZSP,PROTSP                    E3.5.3
  4974.        SETLC   ZSP,0                        E3.5.3
  4975.        APDSP   ZSP,YSP                        E3.5.3
  4976.        APDSP   ZSP,BLSP                     E3.5.3
  4977.        STREAM  TSP,ZSP,BIOPTB,BNBF,BNBF             E3.5.3
  4978.        LEQLC   ZSP,0,BNBF                    E3.5.3
  4979.        MOVD    YPTR,STYPE       STYPE has function descriptor
  4980.        BRANCH  OPPD           Join to copy descriptors
  4981. *_
  4982. BNAF   LEXCMP  XSP,BLSP,,BNCN       Check for concatenation
  4983.        RCALL   XPTR,FINDEX,XPTR    Find definition of image
  4984.        BRANCH  BNCF           Join search for object
  4985. *_
  4986. BNCN   MOVD    XPTR,CONCL       CONCL represents concatenation
  4987.        BRANCH  BNCF           Join search for object
  4988. *_
  4989. BNBF   LEXCMP  YSP,BLSP,UNBF,,UNBF Check for concatenation
  4990.        MOVD    YPTR,CONCL       CONCL represents concatenation
  4991.        BRANCH  OPPD           Join to copy descriptors
  4992. *_
  4993. *---------------------------------------------------------------------*
  4994. *
  4995. *      REPLACE(S1,S2,S3)
  4996. *
  4997. RPLACE PROC    ,           REPLACE(S1,S2,S3)
  4998.        RCALL   XPTR,VARVAL,,FAIL   Get first argument
  4999.        PUSH    XPTR           Save first argument
  5000.        RCALL   YPTR,VARVAL,,FAIL   Get second argument
  5001.        PUSH    YPTR           Save second argument
  5002.        RCALL   ZPTR,VARVAL,,FAIL   Get third argument
  5003.        POP     (YPTR,XPTR)       Restore first and second
  5004.        AEQLC   XPTR,0,,RTXPTR       Ignore replacement on null
  5005.        LOCSP   YSP,YPTR        Get specifier for second
  5006.        LOCSP   ZSP,ZPTR        Get specifier for third
  5007.        LCOMP   ZSP,YSP,FAIL,,FAIL  Verify same lengths
  5008.        AEQLC   YPTR,0,,FAIL       Ignore null replacement
  5009.        LOCSP   XSP,XPTR        Get specifier for first
  5010.        GETLG   XCL,XSP           Get length
  5011.        RCALL   ZPTR,CONVAR,XCL       Allocate space for result
  5012.        LOCSP   TSP,ZPTR        Get specifier
  5013.        SETLC   TSP,0           Clear specifier
  5014.        APDSP   TSP,XSP           Append first argument
  5015.        RPLACE  TSP,YSP,ZSP       Perform replacement
  5016.        BRANCH  GENVSZ           Got generate variable
  5017. *_
  5018. *---------------------------------------------------------------------*
  5019. *
  5020. *      SIZE(S)
  5021. *
  5022. SIZE   PROC    ,           SIZE(S)
  5023.        RCALL   XPTR,VARVAL,,FAIL   Get argument
  5024.        LOCSP   XSP,XPTR        Get specifier
  5025.        GETLG   ZPTR,XSP        Get length
  5026.        SETVC   ZPTR,I           Insert INTEGER data type
  5027.        BRANCH  RTZPTR           Return length
  5028. *_
  5029. *---------------------------------------------------------------------*
  5030. *
  5031. *      TIME()
  5032. *
  5033. TIME   PROC    ,           TIME()
  5034.        RCALL   ,ARGVAL,,FAIL       Get rid of argument
  5035.        MSTIME  ZPTR           Get elapsed time
  5036.        SUBTRT  ZPTR,ZPTR,ETMCL       Compute time in interpreter
  5037.        SETVC   ZPTR,I           Insert INTEGER data type
  5038.        BRANCH  RTZPTR           Return time
  5039. *_
  5040. *---------------------------------------------------------------------*
  5041. *
  5042. *      TRIM(S)
  5043. *
  5044. TRIM   PROC    ,           TRIM(S)
  5045.        RCALL   XPTR,VARVAL,,FAIL   Get string
  5046.        LOCSP   ZSP,XPTR        Get specifier
  5047.        TRIMSP  ZSP,ZSP           Trim string
  5048.        BRANCH  GENVRZ           Generate new variable
  5049. *_
  5050. *---------------------------------------------------------------------*
  5051.        TITLE   'Common Code'
  5052. DATA   LHERE   ,
  5053. RT1NUL RRTURN  NULVCL,1        Return null string by exit 1
  5054. *_
  5055. RTN1   LHERE   ,
  5056. FAIL   RRTURN  ,1           Return by exit 1
  5057. *_
  5058. RETNUL RRTURN  NULVCL,3        Return null string by exit 3
  5059. *_
  5060. RTN2   RRTURN  ,2           Return by exit 2
  5061. *_
  5062. RTN3   LHERE   ,
  5063. RTNUL3 RRTURN  ,3           Return by exit 3
  5064. *_
  5065. RTXNAM RRTURN  XPTR,2           Return XPTR by exit 2
  5066. *_
  5067. RTXPTR RRTURN  XPTR,3           Return XPTR by exit 3
  5068. *_
  5069. RTYPTR RRTURN  YPTR,3           Return YPTR by exit 3
  5070. *_
  5071. ARTN   INCRA   ARTHCL,1        Increment count of arithmetic
  5072. RTZPTR RRTURN  ZPTR,3           Return ZPTR by exit 3
  5073. *_
  5074. A5RTN  RRTURN  A5PTR,1           Return A5PTR by exit 1
  5075. *_
  5076. TSALF  BRANCH  SALF,SCNR       Branch to SALF in scanner
  5077. *_
  5078. TSALT  BRANCH  SALT,SCNR       Branch to SALT in scanner
  5079. *_
  5080. TSCOK  BRANCH  SCOK,SCNR       Branch to SCOK in scanner
  5081. *_
  5082. GENVSZ RCALL   ZPTR,GNVARS,XCL,RTZPTR
  5083. *                   Generate variable from storage
  5084. *_
  5085. GENVRZ RCALL   ZPTR,GENVAR,ZSPPTR,RTZPTR
  5086. *                   Generate variable
  5087. *_
  5088. GENVIX RCALL   XPTR,GNVARI,XPTR,RTXNAM
  5089. *                   Generate variable from integer
  5090. *_
  5091.        TITLE   'Termination'
  5092. END    OUTPUT  OUTPUT,NRMEND,(LVLCL)
  5093. *                   End procedure
  5094.        OUTPUT  OUTPUT,LASTSF,(STNOCL)
  5095. *                   Print status
  5096.        BRANCH  FTLEN2           Join termination procedure
  5097. *_
  5098. FTLEND OUTPUT  OUTPUT,FTLCF,(ERRTYP,STNOCL,LVLCL)        V3.7
  5099.        AEQLC   INICOM,0,FTLEN3       BE SURE OF INITIALIZATION    E3.10.6
  5100.        OUTPUT  OUTPUT,ALOCFL       WARN USER            E3.10.6
  5101.        BRANCH  ENDALL           GET OUT            E3.10.6
  5102. *_                                E3.10.6
  5103. FTLEN3 MULTC   YCL,ERRTYP,DESCR                 E3.10.6
  5104.        GETD    YCL,MSGNO,YCL       Get message pointer
  5105.        GETSPC  TSP,YCL,0       Get message specifier
  5106.        STPRNT  IOKEY,OUTBLK,TSP    Print error message
  5107. FTLEN2 ISTACK  ,           Reset system stack
  5108.        AEQLC   ETMCL,0,FTLEN4       Was compiler done?
  5109.        MSTIME  ETMCL           Time out compiler
  5110.        SUBTRT  TIMECL,ETMCL,TIMECL Compute time in compiler
  5111.        SETAC   ETMCL,0           Set interpreter time to 0
  5112.        BRANCH  FTLEN1           Join end game
  5113. *_
  5114. FTLEN4 MSTIME  XCL           Time out interpreter
  5115.        SUBTRT  ETMCL,XCL,ETMCL       Compute time in interpreter
  5116. FTLEN1 AEQLC   DMPCL,0,,END1       Check &DUMP
  5117.        AEQLC   NODPCL,0,DMPNO       Check storage condition
  5118.        ORDVST  ,           Order string structures
  5119.        OUTPUT  OUTPUT,STDMP       Print dump title
  5120.        OUTPUT  OUTPUT,NVARF       Print subtitle
  5121.        RCALL   ,DUMP,,(INTR10,INTR10,DMPK)
  5122. *                   Dump natural variables
  5123. *_
  5124. DMPNO  OUTPUT  OUTPUT,INCGCF       Print disclaimer
  5125.        OUTPUT  OUTPUT,NODMPF       Print reason
  5126.        BRANCH  END1           Join end game
  5127. *_
  5128. DMPK   RCALL   ,DMK           Dump keywords
  5129. END1   OUTPUT  OUTPUT,STATHD       Print statistics title
  5130.        OUTPUT  OUTPUT,CMTIME,(TIMECL)
  5131. *                   Print compilation time
  5132.        OUTPUT  OUTPUT,INTIME,(ETMCL)
  5133. *                   Print interpretation time
  5134.        OUTPUT  OUTPUT,EXNO,(EXNOCL,FALCL)
  5135. *                   Print execution stats
  5136.        OUTPUT  OUTPUT,ARTHNO,(ARTHCL)
  5137. *                   Print arithmetic stats
  5138.        OUTPUT  OUTPUT,SCANNO,(SCNCL)
  5139. *                   Print scanner stats
  5140.        OUTPUT  OUTPUT,STGENO,(GCNO)
  5141. *                   Print regeneration stats
  5142.        OUTPUT  OUTPUT,READNO,(RSTAT)
  5143. *                   Print read stats
  5144.        OUTPUT  OUTPUT,WRITNO,(WSTAT)
  5145. *                   Print write stats
  5146.        AEQLC   EXNOCL,0,END2       Check for no interpretation
  5147.        INTRL   FCL,ZEROCL
  5148.        BRANCH  AVTIME           Join end game
  5149. *_
  5150. END2   INTL   EXNOCL,EXNOCL       Convert execution total tn RAL
  5151.        INTRL   XCL,ETMCL      Convert execution time to REAL
  5152.        DVREAL  FCL,XCL,EXNOCL       Compute average time
  5153. AVTIME OUTPUT  OUTPUT,TIMEPS,(FCL) Print average time
  5154. ENDALL ENDEX   ABNDCL                        E3.2.2
  5155. *_
  5156. SYSCUT OUTPUT  OUTPUT,SYSCMT,(STNOCL,LVLCL)
  5157. *                   System cut exit
  5158.        AEQLC   CUTNO,0,ENDALL                    E3.2.2
  5159.        SETAC   CUTNO,1                        E3.2.2
  5160.        BRANCH  FTLEN2           Join end game
  5161. *_
  5162. *---------------------------------------------------)-----------------*
  5163.        TITLE   'Error Handling'       "%
  5164. AERROR SETAC   ERRTYP,2        Arithmetic error
  5165.        BRANCH  FTLTST
  5166. *_
  5167. ALOC2  SETAC   ERRTYP,20       Storage exhausted
  5168.        BRANCH  FTLEND
  5169. *_
  5170. ARGNER SETAC   ERRTYP,25       Incorrect number of arguments
  5171.        BRANCH  FTLEND
  5172. *_
  5173. INTR10 LHERE   ,
  5174. INTR13 LHERE   ,
  5175. COMP3  SETAC   ERRTYP,17       Program error
  5176.        BRANCH  FTLEND
  5177. *_
  5178. COMP5  SETAC   ERRTYP,11       Reading error
  5179.        BRANCH  FTLTST
  5180. *_
  5181. COMP7  SETAC   ERRTYP,27       Erroneous end statement
  5182.        BRANCH  FTLEND
  5183. *_
  5184. COMP9  SETAC   ERRTYP,26       Compilation error limit
  5185.        DECRA   ESAICL,DESCR       Decrement error count
  5186.        BRANCH  FTLEND
  5187. *_
  5188. EROR   SETAC   ERRTYP,28       Erroneous statement
  5189.        INCRA   OCICL,DESCR       Increment offset
  5190.        GETD    STNOCL,OCBSCL,OCICL Get statement number
  5191.        BRANCH  FTLEND
  5192. *_
  5193. EXEX   SETAC   ERRTYP,22       Exceeded &STLIMIT
  5194.        BRANCH  FTLEND
  5195. *_
  5196. INTR1  SETAC   ERRTYP,1        Illegal data type
  5197.        BRANCH  FTLTST
  5198. *_
  5199. INTR4  SETAC   ERRTYP,24       Erroneous goto
  5200.        BRANCH  FTLEND
  5201. *_
  5202. INTR5  SETAC   ERRTYP,19       Failure in goto
  5203.        BRANCH  FTLEND
  5204. *_
  5205. INTR8  SETAC   ERRTYP,15       Exceeded &MAXLNGTH
  5206.        BRANCH  FTLTST
  5207. *_
  5208. INTR27 SETAC   ERRTYP,13       Excessive data types
  5209.        BRANCH  FTLTST
  5210. *_
  5211. INTR30 SETAC   ERRTYP,10       Illegal argument
  5212.        BRANCH  FTLTST
  5213. *_
  5214. INTR31 SETAC   ERRTYP,16       Overflow in pattern matching
  5215.        SETAC   SCERCL,3
  5216.        BRANCH  FTERST
  5217. *_
  5218. LENERR SETAC   ERRTYP,14       Negative number
  5219.        BRANCH  FTLTST
  5220. *_
  5221. MAIN1  SETAC   ERRTYP,18       Return from level zero
  5222.        BRANCH  FTLEND
  5223. *_
  5224. NEMO   SETAC   ERRTYP,8        Variable not present
  5225.        BRANCH  FTLTST
  5226. *_
  5227. NONAME SETAC   ERRTYP,4        Null string
  5228.        BRANCH  FTLTST
  5229. *_
  5230. NONARY SETAC   ERRTYP,3        Erroneous array or table reference
  5231.        BRANCH  FTLTST
  5232. *_
  5233. OVER   SETAC   ERRTYP,21       Stack overflow
  5234.        BRANCH  FTLEND
  5235. *_
  5236. PROTER SETAC   ERRTYP,6        Erroneous prototype
  5237.        BRANCH  FTLTST
  5238. *_
  5239. SCDTER SETAC   ERRTYP,1        Illegal data type
  5240.        BRANCH  SCERST
  5241. *_
  5242. SCLENR SETAC   ERRTYP,14       Negative number
  5243.        BRANCH  SCERST
  5244. *_
  5245. SCLNOR SETAC   ERRTYP,15       String overflow
  5246.        BRANCH  SCERST
  5247. *_
  5248. SCNAME SETAC   ERRTYP,4        Null string
  5249.        BRANCH  SCERST
  5250. *_
  5251. SCNEMO SETAC   ERRTYP,8                     E3.4.4
  5252.        BRANCH  SCERST                        E3.4.4
  5253. *_                                E3.4.4
  5254. SIZERR SETAC   ERRTYP,23       Object too large
  5255.        BRANCH  FTLEND
  5256. *_
  5257. UNDF   SETAC   ERRTYP,5        Undefined function
  5258.        BRANCH  FTLTST
  5259. *_
  5260. UNDFFE SETAC   ERRTYP,9        Function entry point not label
  5261.        BRANCH  FTLTST
  5262. *_
  5263. UNKNKW SETAC   ERRTYP,7        Unknown keyword
  5264.        BRANCH  FTLTST
  5265. *_
  5266. UNTERR SETAC   ERRTYP,12       Illegal I/O unit
  5267.        BRANCH  FTLTST
  5268. *_
  5269. SCERST SETAC   SCERCL,1        Note failure during pattern matching
  5270.        BRANCH  FTERST
  5271. *_
  5272. FTLTST SETAC   SCERCL,2        Note failure out of pattern matching
  5273. FTERST ACOMPC  ERRLCL,0,,FTLEND,FTLEND
  5274. *                   Check &ERRLIMIT
  5275.        DECRA   ERRLCL,1        Decrement &ERRLIMIT
  5276.        ACOMPC  TRAPCL,0,,FTERBR,FTERBR
  5277. *                   Check &TRACE
  5278.        LOCAPT  ATPTR,TKEYL,ERRTKY,FTERBR
  5279. *                   Look for KEYWORD trace
  5280.        PUSH    SCERCL                        E3.1.3
  5281.        RCALL   ,TRPHND,ATPTR                    E3.3.1
  5282. *                   Perform trace
  5283.        POP     SCERCL                        E3.1.3
  5284. FTERBR SELBRA  SCERCL,(TSALF,FAIL,RTNUL3)
  5285. *_
  5286. *---------------------------------------------------------------------*
  5287.        TITLE   'Data'
  5288. DTLIST DESCR   DTLIST,TTL+MARK,DTLEND-DTLIST-DESCR
  5289.        DESCR   0,0,S
  5290.        DESCR   VARSP,0,0       STRING
  5291.        DESCR   0,0,I
  5292.        DESCR   INTGSP,0,0       INTEGER
  5293.        DESCR   0,0,P
  5294.        DESCR   PATSP,0,0       PATTERN
  5295.        DESCR   0,0,A
  5296.        DESCR   ARRSP,0,0       ARRAY
  5297.        DESCR   0,0,R
  5298.        DESCR   RLSP,0,0        REAL
  5299.        DESCR   0,0,C
  5300.        DESCR   CODESP,0,0       CODE
  5301.        DESCR   0,0,N
  5302.        DESCR   NAMESP,0,0       NAME
  5303.        DESCR   0,0,K
  5304.        DESCR   NAMESP,0,0       NAME (for keyword)
  5305.        DESCR   0,0,E
  5306.        DESCR   EXPSP,0,0       EXPRESSION
  5307.        DESCR   0,0,T
  5308.        DESCR   ASSCSP,0,0       TABLE
  5309. DTLEND LHERE   ,
  5310. *
  5311. KNLIST DESCR   KNLIST,TTL+MARK,KNEND-KNLIST-DESCR
  5312. TRIMCL DESCR   0,0,I           &TRIM
  5313.        DESCR   TRMSP,0,0
  5314. TRAPCL DESCR   0,0,I           &TRACE
  5315.        DESCR   TRCESP,0,0
  5316. EXLMCL DESCR   50000,0,I       &STLIMIT
  5317.        DESCR   STLMSP,0,0
  5318. OUTSW  DESCR   1,0,I           &OUTPUT
  5319.        DESCR   OUTSP,0,0
  5320. MLENCL DESCR   5000,0,I        &MAXLNGTH
  5321.        DESCR   MAXLSP,0,0
  5322. INSW   DESCR   1,0,I           &INPUT
  5323.        DESCR   INSP,0,0
  5324. FULLCL DESCR   0,0,I           &FULLSCAN
  5325.        DESCR   FULLSP,0,0
  5326. TRACL  DESCR   0,0,I           &FTRACE
  5327.        DESCR   FTRCSP,0,0
  5328. ERRLCL DESCR   0,0,I           &ERRLIMIT
  5329.        DESCR   ERRLSP,0,0
  5330. DMPCL  DESCR   0,0,I           &DUMP
  5331.        DESCR   DUMPSP,0,0
  5332. RETCOD DESCR   0,0,I           &CODE
  5333.        DESCR   CODESP,0,0
  5334. ANCCL  DESCR   0,0,I           &ANCHOR
  5335.        DESCR   ANCHSP,0,0
  5336. ABNDCL DESCR   0,0,I           &ABEND
  5337.        DESCR   ABNDSP,0,0
  5338. KNEND  LHERE   ,
  5339. *
  5340. KVLIST DESCR   KVLIST,TTL+MARK,KVEND-KVLIST-DESCR
  5341. ERRTYP DESCR   0,0,I           &ERRTYPE
  5342. ERRTKY DESCR   ERRTSP,0,0
  5343. ARBPAT DESCR   ARBPT,0,P       &ARB
  5344. ARBKY  DESCR   ARBSP,0,0
  5345. BALPAT DESCR   BALPT,0,P       &BAL
  5346. BALKY  DESCR   BALSP,0,0
  5347. FNCPAT DESCR   FNCEPT,0,P       &FENCE
  5348. FNCEKY DESCR   FNCESP,0,0
  5349. ABOPAT DESCR   ABORPT,0,P       &ABORT
  5350. ABRTKY DESCR   ABORSP,0,0
  5351. FALPAT DESCR   FAILPT,0,P       &FAIL
  5352. FAILKY DESCR   FAILSP,0,0
  5353. REMPAT DESCR   REMPT,0,P       &REM
  5354. REMKY  DESCR   REMSP,0,0
  5355. SUCPAT DESCR   SUCCPT,0,P       &SUCCEED
  5356. SUCCKY DESCR   SUCCSP,0,0
  5357. FALCL  DESCR   0,0,I           &STFCOUNT
  5358. FALKY  DESCR   STFCSP,0,0
  5359. LSTNCL DESCR   0,0,I           &LASTNO
  5360.        DESCR   LSTNSP,0,0
  5361. RETPCL DESCR   0,0,S           &RTNTYPE
  5362.        DESCR   RTYPSP,0,0
  5363. STNOCL DESCR   0,0,I           &STNO
  5364.        DESCR   STNOSP,0,0
  5365. ALPHVL DESCR   0,0,0           &ALPHABET
  5366.        DESCR   ALNMSP,0,0
  5367. EXNOCL DESCR   0,0,I           &STCOUNT
  5368. STCTKY DESCR   STCTSP,0,0
  5369. LVLCL  DESCR   0,0,I           &FNCLEVEL
  5370. FNCLKY DESCR   FNCLSP,0,0
  5371. KVEND  LHERE   ,
  5372. *
  5373. INLIST DESCR   INLIST,TTL+MARK,2*DESCR
  5374.        DESCR   INPUT-DESCR,0,0       INPUT block
  5375.        DESCR   INSP,0,0
  5376. OTLIST DESCR   OTLIST,TTL+MARK,4*DESCR
  5377.        DESCR   OUTPUT-DESCR,0,0    OUTPUT block
  5378.        DESCR   OUTSP,0,0
  5379.        DESCR   PUNCH-DESCR,0,0       PUNCH block
  5380.        DESCR   PNCHSP,0,0
  5381. OTSATL DESCR   OTSATL,TTL+MARK,4*DESCR
  5382. OUTPUT DESCR   UNITO,0,I       OUTPUT unit
  5383.        DESCR   OUTPSP,0,0       OUTPUT format
  5384. PUNCH  DESCR   UNITP,0,I       PUNCH unit
  5385. PCHFST DESCR   CRDFSP,0,0       PUNCH format
  5386. INSATL DESCR   INSATL,TTL+MARK,2*DESCR
  5387. INPUT  DESCR   UNITI,0,I       INPUT unit
  5388. DFLSIZ DESCR   80,0,I           INPUT length
  5389. *
  5390. TRLIST DESCR   TRLIST,TTL+MARK,10*DESCR
  5391.        DESCR   TVALL,0,0       VALUE trace
  5392. VALTRS DESCR   VALSP,0,0
  5393.        DESCR   TLABL,0,0       LABEL trace
  5394.        DESCR   TRLASP,0,0
  5395. TFNCLP DESCR   TFENTL,0,0       CALL trace
  5396.        DESCR   TRFRSP,0,0
  5397. TFNRLP DESCR   TFEXTL,0,0       RETURN trace
  5398.        DESCR   RETSP,0,0
  5399.        DESCR   TKEYL,0,0       KEYWORD trace
  5400.        DESCR   TRKYSP,0,0
  5401. *
  5402. TRCBLK DESCR   TRCBLK,TTL+MARK,5*DESCR                V3.7
  5403.        DESCR   0,FNC,2           TRACE FUNCTION DESCRIPTOR    V3.7
  5404. LIT1CL DESCR   LITFN,FNC,1       LITERAL FUNCTION DESCRIPTOR    E3.7.1
  5405.        DESCR   0,0,0           VARIABLE TO BE TRACED    V3.7
  5406.        DESCR   LITFN,FNC,1       LITERAL FUNCTION DESCRIPTOR    E3.7.1
  5407.        DESCR   0,0,0           TAG SUPPLIED FOR TRACE    V3.7
  5408. *
  5409. ATRHD  DESCR   ATPRCL-DESCR,0,0    Array header converting from TABLE
  5410. ATPRCL DESCR   0,0,0           Prototype
  5411.        DESCR   2,0,0           Dimensionality
  5412.        DESCR   1,0,2           1:2 second dimension
  5413. ATEXCL DESCR   1,0,0           1:n first dimension
  5414. *
  5415. *      Data type pairs
  5416. *
  5417. ATDTP  DESCR   A,0,T           ARRAY-TABLE
  5418. IIDTP  DESCR   I,0,I           INTEGER-INTEGER
  5419. IPDTP  DESCR   I,0,P           INTEGER-PATTERN
  5420. IRDTP  DESCR   I,0,R           INTEGER-REAL
  5421. IVDTP  DESCR   I,0,S           INTEGER-STRING
  5422. PIDTP  DESCR   P,0,I           PATTERN-INTEGER
  5423. PPDTP  DESCR   P,0,P           PATTERN-PATTERN
  5424. PVDTP  DESCR   P,0,S           PATTERN-STRING
  5425. RIDTP  DESCR   R,0,I           REAL-INTEGER
  5426. RPDTP  DESCR   R,0,P           REAL-PATTERN
  5427. RRDTP  DESCR   R,0,R           REAL-REAL
  5428. RVDTP  DESCR   R,0,S           REAL-STRING
  5429. TADTP  DESCR   T,0,A           TABLE-ARRAY
  5430. VCDTP  DESCR   S,0,C           STRING-CODE
  5431. VEDTP  DESCR   S,0,E           STRING-EXPRESSION
  5432. VIDTP  DESCR   S,0,I           STRING-INTEGER
  5433. VPDTP  DESCR   S,0,P           STRING-PATTERN
  5434. VRDTP  DESCR   S,0,R           STRING-REAL
  5435. VVDTP  DESCR   S,0,S           STRING-STRING
  5436. *
  5437. ARTHCL DESCR   0,0,0           Number of arithmetic operations
  5438. CSTNCL DESCR   0,0,I           Compiler statement number
  5439. RSTAT  DESCR   0,0,0           Number of reads
  5440. SCNCL  DESCR   0,0,0           Number of scanner entrances
  5441. WSTAT  DESCR   0,0,0           Number of writes
  5442. TIMECL DESCR   0,0,0           Millisecond time
  5443. *
  5444. *      SWITCHES
  5445. *
  5446. ALCL   DESCR   0,0,0           Entry point switch for ARG(F,N)
  5447. ARRMRK DESCR   0,0,0           Prototype end switch for ARRAY(P,V)
  5448. CUTNO  DESCR   0,0,0                        E3.2.2
  5449. CNSLCL DESCR   0,0,0           Label redefinition switch
  5450. DATACL DESCR   0,0,0           Prototype end switch for DATA(P)
  5451. FNVLCL DESCR   0,0,0           FUNCTION-VALUE switch for trace
  5452. INICOM DESCR   0,0,0           INITIALIZATION SWITCH    E3.10.6
  5453. LENFCL DESCR   0,0,0           Length failure switch
  5454. LISTCL DESCR   1,0,0           Compiler listing switch
  5455. LLIST  DESCR   0,0,0           Left listing switch
  5456. NAMGCL DESCR   0,0,0           Naming switch for SJSR
  5457. SCERCL DESCR   0,0,0           Error branch switch
  5458. *
  5459. *      Constants
  5460. *
  5461. ARBSIZ DESCR   8*NODESZ,0,0       Node size for ARBNO(P)
  5462. CHARCL DESCR   1,0,0           Length constant 1
  5463. CNDSIZ DESCR   CNODSZ,0,B       Compiler node size
  5464. CODELT DESCR   200*DESCR,0,C       Object code excess
  5465. DSCRTW DESCR   2*DESCR,0,0       Constant 2*DESCR
  5466. EOSCL  DESCR   EOSTYP,0,0       End of statement switch
  5467. ESALIM DESCR   ESASIZ*DESCR,0,0    Bound on compilation errors
  5468. EXTVAL DESCR   EXTSIZ*2*DESCR,0,0                V3.11
  5469. FBLKRQ DESCR   FBLKSZ,0,B       Quantum on allocated function blocks
  5470. GOBRCL DESCR   0,0,0           Goto break character switch
  5471. GTOCL  DESCR   FGOTYP,0,0       Goto decision switch
  5472. IOBLSZ DESCR   2*DESCR,0,B       Size of I/O blocks
  5473. LNODSZ DESCR   NODESZ+DESCR,0,P    Size of long pattern node
  5474. NODSIZ DESCR   NODESZ,0,P       Size of short pattern node
  5475. OBEND  DESCR   OBLIST+DESCR*OBOFF,0,0
  5476. *                   End on bin list
  5477. OCALIM DESCR   OCASIZ*DESCR,0,C    Size of object code block
  5478. ONECL  DESCR   1,0,0           Constant 1
  5479. OUTBLK DESCR   OUTPUT-DESCR,0,0    Pointer to OUTPUT block
  5480. SIZLMT DESCR   SIZLIM,0,0       Limit on size of data object
  5481. SNODSZ DESCR   NODESZ,0,P       Small pattern node size
  5482. STARSZ DESCR   11*DESCR,0,P       Size of EXPRESSION pattern
  5483. ZEROCL DESCR   0,0,0           Constant zero
  5484. TRSKEL DESCR   TRCBLK,0,0
  5485. COMDCT DESCR   14*DESCR,0,0
  5486. COMREG DESCR   ELEMND,0,0       Pointer to compiler descriptors
  5487. *
  5488. *
  5489. *
  5490. *      Pointers to Assembled Data Patterns
  5491. *
  5492. ARBACK DESCR   ARBAK,0,P
  5493. ARHEAD DESCR   ARHED,0,P
  5494. ARTAIL DESCR   ARTAL,0,P
  5495. STRPAT DESCR   STARPT,0,P
  5496. *
  5497. *      Function Descriptors
  5498. *
  5499. ANYCCL DESCR   ANYCFN,FNC,3
  5500. ASGNCL DESCR   ASGNFN,FNC,2
  5501. ATOPCL DESCR   ATOPFN,FNC,3
  5502. BASECL DESCR   BASEFN,FNC,0
  5503. BRKCCL DESCR   BRKCFN,FNC,3
  5504. CHRCL  DESCR   CHRFN,FNC,3
  5505. CONCL  DESCR   CONFN,FNC,0       Argument count is incremented
  5506. DNMECL DESCR   DNMEFN,FNC,2
  5507. DNMICL DESCR   DNMIFN,FNC,2
  5508. ENDCL  DESCR   ENDFN,FNC,0
  5509. ENMECL DESCR   ENMEFN,FNC,3
  5510. ENMICL DESCR   ENMIFN,FNC,3
  5511. ERORCL DESCR   ERORFN,FNC,1
  5512. FNCFCL DESCR   FNCFFN,FNC,2
  5513. FNMECL DESCR   FNMEFN,FNC,2
  5514. GOTGCL DESCR   GOTGFN,FNC,1
  5515. GOTLCL DESCR   GOTLFN,FNC,1
  5516. GOTOCL DESCR   GOTOFN,FNC,1
  5517. INITCL DESCR   INITFN,FNC,1
  5518. ITEMCL DESCR   AREFN,FNC,0
  5519. LITCL  DESCR   LITFN,FNC,0       Argument count is incremented
  5520. LNTHCL DESCR   LNTHFN,FNC,3
  5521. NMECL  DESCR   NMEFN,FNC,2
  5522. NNYCCL DESCR   NNYCFN,FNC,3
  5523. POSICL DESCR   POSIFN,FNC,3
  5524. RPSICL DESCR   RPSIFN,FNC,3
  5525. RTBCL  DESCR   RTBFN,FNC,3
  5526. SCANCL DESCR   SCANFN,FNC,2
  5527. SCFLCL DESCR   SCFLFN,FNC,2
  5528. SCOKCL DESCR   SCOKFN,FNC,2
  5529. SCONCL DESCR   SCONFN,FNC,2
  5530. SJSRCL DESCR   SJSRFN,FNC,3
  5531. SPNCCL DESCR   SPNCFN,FNC,3
  5532. SUCFCL DESCR   SUCFFN,FNC,2
  5533. TBCL   DESCR   TBFN,FNC,3
  5534. INITB  DESCR   ABNDB,0,0
  5535. INITE  DESCR   DTEND+DESCR,0,0
  5536. *
  5537. *      Miscellaneous Data Cells
  5538. *
  5539. A4PTR  DESCR   0,0,0           Scratch descriptor
  5540. A5PTR  DESCR   0,0,0           Scratch descriptor
  5541. A6PTR  DESCR   0,0,0           Scratch descriptor
  5542. A7PTR  DESCR   0,0,0           Scratch descriptor
  5543. BRTYPE DESCR   0,0,0           Break type returned by FORWRD
  5544. CMOFCL DESCR   0,0,0           Compiler offset
  5545. DATSEG DESCR   0,0,100           Beginning of defined data types
  5546. DMPPTR DESCR   0,0,0           Bin pointer for DUMP
  5547. DTCL   DESCR   0,0,0           Data type descriptor
  5548. DT1CL  DESCR   0,0,0           Data type descriptor
  5549. EMSGCL DESCR   0,0,0           Present error message address
  5550. ERRBAS DESCR   CARDSZ+STNOSZ-SEQSIZ,0,0
  5551. ESAICL DESCR   0,0,0           Count of compiler errors
  5552. ETMCL  DESCR   0,0,0           Time descriptor
  5553. FCL    DESCR   0,0,0           Real number descriptor
  5554. NEXFCL DESCR   FBLKSZ,0,0       Offset in function block
  5555. FRTNCL DESCR   0,0,0           Failure return
  5556. GOGOCL DESCR   0,0,0           goto descriptor
  5557. INCL   DESCR   0,0,0           Global function descriptor
  5558. IOKEY  DESCR   0,0,0           I/O indicator
  5559. MAXLEN DESCR   0,0,0           Maximum length for matching
  5560. MSGNO  DESCR   MSGLST,0,0       Pointer to error message list
  5561. NAMICL DESCR   0,0,0           Offset on naming list
  5562. NHEDCL DESCR   0,0,0           Name list head offset
  5563. NMOVER DESCR   NAMLSZ*SPDR,0,B       Name list end offset
  5564. NULVCL DESCR   0,0,S           Null string value
  5565. OCICL  DESCR   0,0,0           Object code offset
  5566. PATICL DESCR   0,0,0           Pattern code offset
  5567. PDLEND DESCR   PDLBLK+SPDLDR-NODESZ,0,0
  5568. *                   Pattern history list end
  5569. PDLPTR DESCR   PDLBLK,0,0       Pattern history list beginning
  5570. SCL    DESCR   0,0,0           Switch descriptor
  5571. STKPTR DESCR   STACK,0,0       Pointer to stack
  5572. STYPE  DESCR   0,FNC,0           Descriptor return by STREAM
  5573. TBLFNC DESCR   0,0,0           Pointer to last pattern table
  5574. UNIT   DESCR   0,0,0           Input unit switch
  5575. VARSYM DESCR   0,0,0
  5576. *
  5577. *      Program Pointers
  5578. *
  5579. DATCL  DESCR   DEFDAT,FNC,0       Defined data objects
  5580. DEFCL  DESCR   DEFFNC,FNC,0       Defined functions
  5581. FLDCL  DESCR   FIELD,0,1       Field of defined data objects
  5582. LODCL  DESCR   LNKFNC,FNC,0       External functions
  5583. PDLHED DESCR   PDLBLK,0,0       History list head
  5584. UNDFCL DESCR   UNDF,FNC,0       Undefined functions
  5585. *
  5586. *      Pointers to Specifiers
  5587. *
  5588. DPSPTR DESCR   DPSP,0,0
  5589. XSPPTR DESCR   XSP,0,0
  5590. YSPPTR DESCR   YSP,0,0
  5591. ZSPPTR DESCR   ZSP,0,0
  5592. TSPPTR DESCR   TSP,0,0
  5593. *
  5594. *      Permanent Attribute List Pointers
  5595. *
  5596. KNATL  DESCR   KNLIST,0,0       Unprotected keyword list
  5597. KVATL  DESCR   KVLIST,0,0       Protected keyword list
  5598. TRATL  DESCR   TRLIST,0,0       Trace list
  5599. *
  5600. *      Specifiers for Compilation Listing
  5601. *
  5602. BLNSP  SPEC    BLNBUF,0,0,0,STNOSZ
  5603. ERRSP  SPEC    ERRBUF,0,0,0,CARDSZ+STNOSZ-SEQSIZ+1
  5604. INBFSP SPEC    INBUF,0,0,STNOSZ,CARDSZ
  5605. LNBFSP SPEC    INBUF,0,0,0,CARDSZ+DSTSZ+1
  5606. NEXTSP SPEC    INBUF,0,0,STNOSZ,CARDSZ-SEQSIZ
  5607. LNOSP  SPEC    INBUF,0,0,0,STNOSZ
  5608. RNOSP  SPEC    INBUF,0,0,CARDSZ+STNOSZ+1,STNOSZ
  5609. *
  5610. *      Strings and Specifiers
  5611. *
  5612. ALPHSP SPEC    ALPHA,0,0,0,ALPHSZ  Alphabet
  5613. AMPSP  SPEC    AMPST,0,0,0,1       Ampersand
  5614. CERRSP SPEC    ANYSP,0,0,0,0       Buffer specifier
  5615. COLSP  SPEC    COLSTR,0,0,0,2       Colon for trace messages
  5616. DMPSP  SPEC    ANYSP,0,0,0,0       Buffer specifier
  5617. DTARSP SPEC    DTARBF,0,0,0,ARRLEN+9
  5618. *                   Array representation specifier
  5619. PROTSP SPEC    ANYSP,0,0,0,0       Buffer specifier
  5620. QTSP   SPEC    QTSTR,0,0,0,1       Quote for messages
  5621. REALSP SPEC    REALBF,0,0,0,10       Specifier for real conversion
  5622. TRACSP SPEC    ANYSP,0,0,0,0       Buffer specifier
  5623. *
  5624. ARRSP  STRING  'ARRAY'
  5625. ASSCSP STRING  'TABLE'
  5626. BLSP   STRING  ' '
  5627. BLEQSP STRING  ' = '
  5628. CMASP  STRING  ','
  5629. EJCTSP STRING  'EJECT'
  5630. EQLSP  STRING  '= '
  5631. ETIMSP STRING  ',TIME = '
  5632. EXDTSP STRING  'EXTERNAL'
  5633. LEFTSP STRING  'LEFT'
  5634. LISTSP STRING  'LIST'
  5635. LPRNSP STRING  '('
  5636. OFSP   STRING  ' OF '
  5637. RPRNSP STRING  ')'
  5638. STARSP STRING  '*** '
  5639. TRCLSP STRING  ' CALL OF '
  5640. TRLVSP STRING  'LEVEL '
  5641. TRSTSP STRING  '    STATEMENT '
  5642. UNLSP  STRING  'UNLIST'
  5643. XFERSP STRING  'TRANSFER TO'
  5644. *
  5645. *      Character Buffers
  5646. *
  5647. BLNBUF BUFFER  STNOSZ           Blanks for statment number field
  5648. DTARBF BUFFER  ARRLEN+7        Array representation buffer
  5649. ERRBUF BUFFER  CARDSZ+STNOSZ-SEQSIZ+1
  5650. INBUF  BUFFER  CARDSZ+DSTSZ+1       Card input buffer
  5651. REALBF BUFFER  36           Buffer for real number conversion
  5652. ICLBLK DESCR   ICLBLK,TTL+MARK,ICLEND-ICLBLK-DESCR
  5653. *
  5654. *      Pointers to Attribute Lists
  5655. *
  5656. DTATL  DESCR   DTLIST,0,0       Data type pair list
  5657. FNCPL  DESCR   FNLIST,0,0       Function pair list
  5658. INATL  DESCR   INLIST,0,0       Input association pair list
  5659. OUTATL DESCR   OTLIST,0,0       Output association pair list
  5660. TVALL  DESCR   TVALPL,0,0       Value trace pair list
  5661.        DESCR   VLTRFN,FNC,2       Default value trace procedure
  5662. TLABL  DESCR   TLABPL,0,0       Label trace pair list
  5663.        DESCR   LABTFN,FNC,1       Default label trace procedure
  5664. TFENTL DESCR   TFENPL,0,0       Call trace pair list
  5665.        DESCR   FNTRFN,FNC,2       Default call trace procedure
  5666. TFEXTL DESCR   TFEXPL,0,0       Return trace pair list
  5667.        DESCR   FXTRFN,FNC,2       Default return trace procedure
  5668. TKEYL  DESCR   TKEYPL,0,0       Keyword trace pair list
  5669.        DESCR   KEYTFN,FNC,1       Default keyword trace procedure
  5670. *
  5671. *      Scratch Descriptors
  5672. *
  5673. A1PTR  DESCR   0,0,0
  5674. A2PTR  DESCR   0,0,0
  5675. A3PTR  DESCR   0,0,0
  5676. ATPTR  DESCR   0,0,0
  5677. F1PTR  DESCR   0,0,0
  5678. F2PTR  DESCR   0,0,0
  5679. IO2PTR DESCR   0,0,0
  5680. IO1PTR DESCR   0,0,0
  5681. LPTR   DESCR   0,0,0           Last label pointer
  5682. NVAL   DESCR   0,0,0
  5683. IO3PTR DESCR   0,0,0
  5684. IO4PTR DESCR   0,0,0
  5685. TBLCS  DESCR   0,0,0
  5686. TMVAL  DESCR   0,0,0
  5687. TPTR   DESCR   0,0,0
  5688. TCL    DESCR   0,0,0
  5689. TSIZ   DESCR   0,0,0
  5690. TVAL   DESCR   0,0,0
  5691. VVAL   DESCR   0,0,0
  5692. WCL    DESCR   0,0,0
  5693. WPTR   DESCR   0,0,0
  5694. XCL    DESCR   0,0,0
  5695. XPTR   DESCR   0,0,0
  5696. XSIZ   DESCR   0,0,0
  5697. YCL    DESCR   0,0,0
  5698. YPTR   DESCR   0,0,0
  5699. YSIZ   DESCR   0,0,0
  5700. ZCL    DESCR   0,0,0
  5701. ZPTR   DESCR   0,0,0
  5702. ZSIZ   DESCR   0,0,0
  5703. *
  5704. *      System Descriptors
  5705. *
  5706. BOSCL  DESCR   0,0,0           Offset of beginning of statement
  5707. CMBSCL DESCR   0,0,0           Compiler code base descriptor
  5708. NBSPTR DESCR   0,0,0           Name list base pointer
  5709. FBLOCK DESCR   0,0,0           Function procedure descriptor block
  5710. OCBSCL DESCR   0,0,0           Interpreter code base descriptor
  5711. OCLIM  DESCR   0,0,0           End of object code block
  5712. OCSVCL DESCR   0,0,0           Pointer to basic object code
  5713. PATBCL DESCR   0,0,0           Pattern code base descriptor
  5714. SCBSCL DESCR   0,0,0
  5715. SRNCL  DESCR   0,0,0           Success return descriptor
  5716. *
  5717. *      Compiler Descriptors
  5718. *
  5719. ELEMND DESCR   0,0,0           Element node
  5720. ELEXND DESCR   0,0,0           Temporary node
  5721. ELEYND DESCR   0,0,0           Temporary node
  5722. EXELND DESCR   0,0,0           Temporary node
  5723. EXEXND DESCR   0,0,0           Temporary node
  5724. EXOPCL DESCR   0,0,0           Operator node
  5725. EXOPND DESCR   0,0,0           Operator node
  5726. EXPRND DESCR   0,0,0           Expression node
  5727. FGOND  DESCR   0,0,0           Failure goto node
  5728. FORMND DESCR   0,0,0           Object node
  5729. FRNCL  DESCR   0,0,0           Failure return descriptor
  5730. GOTOND DESCR   0,0,0           Goto node
  5731. PATND  DESCR   0,0,0           Pattern node
  5732. SGOND  DESCR   0,0,0           Success goto node
  5733. SUBJND DESCR   0,0,0           Subject node
  5734. *
  5735. *      Data Pointers
  5736. *
  5737. DFLFST DESCR   0,0,0           Default output format
  5738. ENDPTR DESCR   0,0,0           'END'
  5739. EXTPTR DESCR   0,0,0           'EXTERNAL'
  5740. FRETCL DESCR   0,0,0           'FRETURN'
  5741. NRETCL DESCR   0,0,0           'NRETURN'
  5742. RETCL  DESCR   0,0,0           'RETURN'
  5743. FUNTCL DESCR   0,0,0           'FUNCTION'
  5744. *
  5745. *      Specifiers
  5746. *
  5747. DPSP   SPEC    0,0,0,0,0       Data type specifier
  5748. HEADSP SPEC    0,0,0,0,0       Matching head specifier
  5749. IOSP   SPEC    0,0,0,0,0       I/O specifier
  5750. TAILSP SPEC    0,0,0,0,0       Matching tail specifier
  5751. TEXTSP SPEC    0,0,0,0,0       Compiler statement specifier
  5752. TSP    SPEC    0,0,0,0,0       Scratch specifier
  5753. TXSP   SPEC    0,0,0,0,0       Scratch specifier
  5754. VSP    SPEC    0,0,0,0,0       Scratch specifier
  5755. XSP    SPEC    0,0,0,0,0       Scratch specifier
  5756. YSP    SPEC    0,0,0,0,0       Scratch specifier
  5757. ZSP    SPEC    0,0,0,0,0       Scratch specifier
  5758. *
  5759. *      Allocator Data
  5760. *
  5761. ARG1CL DESCR   0,0,0           Scratch descriptor
  5762. BUKPTR DESCR   0,PTR,S           Bin pointer
  5763. LSTPTR DESCR   0,PTR,S           Pointer to last structure
  5764. AXPTR  DESCR   0,0,0           Allocation size descriptor
  5765. SPECR1 SPEC    0,0,0,0,0       Scratch specifier
  5766. SPECR2 SPEC    0,0,0,0,0       Scratch specifier
  5767. ICLEND LHERE   ,           End of basic block
  5768. *
  5769. *      Allocator Data
  5770. *
  5771. BK1CL  DESCR   0,0,0           Pointer to block being marked
  5772. BKDX   DESCR   0,0,0           Offset in block being marked
  5773. BKDXU  DESCR   0,0,0           Offset in block
  5774. BKLTCL DESCR   0,0,0
  5775. BKPTR  DESCR   0,PTR,S
  5776. BLOCL  DESCR   0,0,0
  5777. CONVSW DESCR   0,0,0           CONVAR-GENVAR entry switch
  5778. CPYCL  DESCR   0,0,0           Regeneration block pointer
  5779. DESCL  DESCR   0,0,0           Regeneration scratch descriptor
  5780. EQUVCL DESCR   0,0,0           Variable identification descriptor
  5781. FRDSCL DESCR   4*DESCR,0,0
  5782. GCBLK  DESCR   GCXTTL,0,0       Pointer to marking block
  5783. GCNO   DESCR   0,0,0           Count of regenerations
  5784. GCMPTR DESCR   0,0,0           Pointer to basic blocks
  5785. GCREQ  DESCR   0,0,0           Space required from regeneration
  5786. GCGOT  DESCR   0,0,I           Space obtained from regeneration
  5787. LCPTR  DESCR   0,0,0           Scratch descriptor
  5788. MVSGPT DESCR   0,0,0           Compression boundary pointer
  5789. NODPCL DESCR   0,0,0           Regeneration switch
  5790. OBPTR  DESCR   OBLIST,PTR,S       Pointer to bins
  5791. OFSET  DESCR   0,0,0           Offset in block during regeneration
  5792. PRMDX  DESCR   PRMSIZ,0,0       Size of basic block list
  5793. PRMPTR DESCR   PRMTBL,0,0       Pointer to list of basic blocks
  5794. ST1PTR DESCR   0,PTR,S           Regeneration link pointer
  5795. ST2PTR DESCR   0,PTR,S           Regeneration link pointer
  5796. TEMPCL DESCR   0,PTR,0           Scracth descriptor
  5797. TOPCL  DESCR   0,0,0           Pointer to block title
  5798. TTLCL  DESCR   0,0,0           Pointer to block title
  5799. TWOCL  DESCR   2*DESCR,0,B       Size of string to be marked
  5800. *
  5801. *
  5802. FRSGPT DESCR   0,PTR,0           Position pointer
  5803. HDSGPT DESCR   0,PTR,0           Head of allocated data region
  5804. TLSGP1 DESCR   0,PTR,0           End of allocated data region
  5805. GCXTTL DESCR   GCXTTL,TTL+MARK,DESCR
  5806. *                   Block to prime marking procedure
  5807.        DESCR   0,0,0           Pointer to block to mark
  5808. *
  5809. *      Machine-dependent Data
  5810. *
  5811.        COPY    MDATA           Segment of machine-dependent data
  5812. *
  5813. *      Function Table
  5814. *
  5815. FTABLE DESCR   FTABLE,TTL+MARK,FTBLND-FTABLE-DESCR
  5816. *
  5817. *      Primitive Functions
  5818. *
  5819. ANYFN  DESCR   ANY,0,1
  5820.        DESCR   0,0,0
  5821. APLYFN DESCR   APPLY,FNC,1
  5822.        DESCR   0,0,0
  5823. ARBOFN DESCR   ARBNO,0,1
  5824.        DESCR   0,0,0
  5825. ARGFN  DESCR   ARG,0,2
  5826.        DESCR   0,0,0
  5827. ARRAFN DESCR   ARRAY,0,2
  5828.        DESCR   0,0,0
  5829. ASSCFN DESCR   ASSOC,0,2
  5830.        DESCR   0,0,0
  5831. BACKFN DESCR   BKSPCE,0,1
  5832.        DESCR   0,0,0
  5833. BREAFN DESCR   BREAK,0,1
  5834.        DESCR   0,0,0
  5835. CLEAFN DESCR   CLEAR,0,1
  5836.        DESCR   0,0,0
  5837. CODEFN DESCR   CODER,0,1
  5838.        DESCR   0,0,0
  5839. COLEFN DESCR   COLECT,0,1
  5840.        DESCR   0,0,0
  5841. CNVRFN DESCR   CNVRT,0,2
  5842.        DESCR   0,0,0
  5843. COPYFN DESCR   COPY,0,1
  5844.        DESCR   0,0,0
  5845. DATFN  DESCR   DATE,0,1
  5846.        DESCR   0,0,0
  5847. DATDFN DESCR   DATDEF,0,1
  5848.        DESCR   0,0,0
  5849. DEFIFN DESCR   DEFINE,0,2
  5850.        DESCR   0,0,0
  5851. DIFFFN DESCR   DIFFER,0,2
  5852.        DESCR   0,0,0
  5853. DTCHFN DESCR   DETACH,0,1
  5854.        DESCR   0,0,0
  5855. DTFN   DESCR   DT,0,1
  5856.        DESCR   0,0,0
  5857. DUMPFN DESCR   DMP,0,1
  5858.        DESCR   0,0,0
  5859. DUPLFN DESCR   DUPL,0,2
  5860.        DESCR   0,0,0
  5861. ENDFFN DESCR   ENFILE,0,1
  5862.        DESCR   0,0,0
  5863. EQFN   DESCR   EQ,0,2
  5864.        DESCR   0,0,0
  5865. EVALFN DESCR   EVAL,0,1
  5866.        DESCR   0,0,0
  5867. FLDSFN DESCR   FIELDS,0,2
  5868.        DESCR   0,0,0
  5869. GEFN   DESCR   GE,0,2
  5870.        DESCR   0,0,0
  5871. GTFN   DESCR   GT,0,2
  5872.        DESCR   0,0,0
  5873. IDENFN DESCR   IDENT,0,2
  5874.        DESCR   0,0,0
  5875. INTGFN DESCR   INTGER,0,1
  5876.        DESCR   0,0,0
  5877. ITEMFN DESCR   ITEM,FNC,1
  5878.        DESCR   0,0,0
  5879. LEFN   DESCR   LE,0,2
  5880.        DESCR   0,0,0
  5881. LENFN  DESCR   LEN,0,1
  5882.        DESCR   0,0,0
  5883. LGTFN  DESCR   LGT,0,2
  5884.        DESCR   0,0,0
  5885. LOADFN DESCR   LOAD,0,2
  5886.        DESCR   0,0,0
  5887. LOCFN  DESCR   LOCAL,0,2
  5888.        DESCR   0,0,0
  5889. LTFN   DESCR   LT,0,2
  5890.        DESCR   0,0,0
  5891. NEFN   DESCR   NE,0,2
  5892.        DESCR   0,0,0
  5893. NOTAFN DESCR   NOTANY,0,1
  5894.        DESCR   0,0,0
  5895. OPSYFN DESCR   OPSYN,0,3
  5896.        DESCR   0,0,0
  5897. POSFN  DESCR   POS,0,1
  5898.        DESCR   0,0,0
  5899. PRINFN DESCR   PRINT,0,3
  5900.        DESCR   0,0,0
  5901. PROTFN DESCR   PROTO,0,1
  5902.        DESCR   0,0,0
  5903. REMDFN DESCR   REMDR,0,2
  5904.        DESCR   0,0,0
  5905. RPLAFN DESCR   RPLACE,0,3
  5906.        DESCR   0,0,0
  5907. READFN DESCR   READ,0,3
  5908.        DESCR   0,0,0
  5909. REWNFN DESCR   REWIND,0,1
  5910.        DESCR   0,0,0
  5911. RPOSFN DESCR   RPOS,0,1
  5912.        DESCR   0,0,0
  5913. RTABFN DESCR   RTAB,0,1
  5914.        DESCR   0,0,0
  5915. SIZEFN DESCR   SIZE,0,1
  5916.        DESCR   0,0,0
  5917. SPANFN DESCR   SPAN,0,1
  5918.        DESCR   0,0,0
  5919. STPTFN DESCR   STOPTR,0,2
  5920.        DESCR   0,0,0
  5921. TABFN  DESCR   TAB,0,1
  5922.        DESCR   0,0,0
  5923. TIMFN  DESCR   TIME,0,1
  5924.        DESCR   0,0,0
  5925. TRCEFN DESCR   TRACE,0,4
  5926.        DESCR   0,0,0
  5927. TRIMFN DESCR   TRIM,0,1
  5928.        DESCR   0,0,0
  5929. UNLDFN DESCR   UNLOAD,0,1
  5930.        DESCR   0,0,0
  5931. VALFN  DESCR   FIELD,0,1
  5932.        DESCR   VALBLK,0,0
  5933. FTBLND LHERE   ,
  5934. *
  5935. INITLS DESCR   INITLS,TTL+MARK,8*DESCR
  5936.        DESCR   DTLIST,0,0
  5937.        DESCR   FNLIST,0,0
  5938.        DESCR   INLIST,0,0
  5939.        DESCR   KNLIST,0,0
  5940.        DESCR   KVLIST,0,0
  5941.        DESCR   OTLIST,0,0
  5942.        DESCR   OTSATL,0,0
  5943.        DESCR   TRLIST,0,0
  5944. *
  5945. *      Function Pair List
  5946. *
  5947. FNLIST DESCR   FNLIST,TTL+MARK,FNCPLE-FNLIST-DESCR
  5948.        DESCR   ANYFN,FNC,0       ANY(CS)
  5949.        DESCR   ANYSP,0,0
  5950.        DESCR   APLYFN,FNC,0       APPLY(F,A1,...,AN)
  5951.        DESCR   APLYSP,0,0
  5952.        DESCR   ARBOFN,FNC,0       ARBNO(P)
  5953.        DESCR   ARBNSP,0,0
  5954.        DESCR   ARGFN,FNC,0       ARG(F,N)
  5955.        DESCR   ARGSP,0,0
  5956.        DESCR   ARRAFN,FNC,0       ARRAY(P,V)
  5957.        DESCR   ARRSP,0,0
  5958.        DESCR   BACKFN,FNC,0       BACKSPACE(N)
  5959.        DESCR   BACKSP,0,0
  5960.        DESCR   BREAFN,FNC,0       BREAK(CS)
  5961.        DESCR   BRKSP,0,0
  5962.        DESCR   CLEAFN,FNC,0       CLEAR()
  5963.        DESCR   CLERSP,0,0
  5964.        DESCR   CODEFN,FNC,0       CODE(S)
  5965.        DESCR   CODESP,0,0
  5966.        DESCR   COLEFN,FNC,0       COLLECT(N)
  5967.        DESCR   CLSP,0,0
  5968.        DESCR   CNVRFN,FNC,0       CONVERT(V,DT)
  5969.        DESCR   CNVTSP,0,0
  5970.        DESCR   COPYFN,FNC,0       COPY(V)
  5971.        DESCR   COPYSP,0,0
  5972.        DESCR   DATDFN,FNC,0       DATA(P)
  5973.        DESCR   DATASP,0,0
  5974.        DESCR   DATFN,FNC,0                    E3.0.5
  5975.        DESCR   DATSP,0,0
  5976.        DESCR   DEFIFN,FNC,0       DEFINE(P,L)
  5977.        DESCR   DEFISP,0,0
  5978.        DESCR   DIFFFN,FNC,0       DIFFER(V1,V2)
  5979.        DESCR   DIFFSP,0,0
  5980.        DESCR   DTCHFN,FNC,0       DETACH(V)
  5981.        DESCR   DTCHSP,0,0
  5982.        DESCR   DTFN,FNC,0       DATATYPE(V)
  5983.        DESCR   DTSP,0,0
  5984.        DESCR   DUMPFN,FNC,0       DUMP()
  5985.        DESCR   DUMPSP,0,0
  5986.        DESCR   DUPLFN,FNC,0       DUPL(S,N)
  5987.        DESCR   DUPLSP,0,0
  5988.        DESCR   ENDFFN,FNC,0       ENDFILE(N)
  5989.        DESCR   ENDFSP,0,0
  5990.        DESCR   EQFN,FNC,0       EQ(I1,I2)
  5991.        DESCR   EQSP,0,0
  5992.        DESCR   EVALFN,FNC,0       EVAL(E)
  5993.        DESCR   EVALSP,0,0
  5994.        DESCR   FLDSFN,FNC,0       FIELD(V,N)
  5995.        DESCR   FLDSSP,0,0
  5996.        DESCR   GEFN,FNC,0       GE(I1,I2)
  5997.        DESCR   GESP,0,0
  5998.        DESCR   GTFN,FNC,0       GT(I1,I2)
  5999.        DESCR   GTSP,0,0
  6000.        DESCR   IDENFN,FNC,0       IDENT(V1,V2)
  6001.        DESCR   IDENSP,0,0
  6002.        DESCR   READFN,FNC,0       INPUT(V,N,L)
  6003.        DESCR   INSP,0,0
  6004.        DESCR   INTGFN,FNC,0       INTEGER(V)
  6005.        DESCR   INTGSP,0,0
  6006.        DESCR   ITEMFN,FNC,0       ITEM(A,I1,...,IN)
  6007.        DESCR   ITEMSP,0,0
  6008.        DESCR   LENFN,FNC,0       LEN(N)
  6009.        DESCR   LENSP,0,0
  6010.        DESCR   LEFN,FNC,0       LE(I1,I2)
  6011.        DESCR   LESP,0,0
  6012.        DESCR   LGTFN,FNC,0       LGT(S1,S2)
  6013.        DESCR   LGTSP,0,0
  6014.        DESCR   LOADFN,FNC,0       LOAD(P)
  6015.        DESCR   LOADSP,0,0
  6016.        DESCR   LOCFN,FNC,0       LOCAL(F,N)
  6017.        DESCR   LOCSP,0,0
  6018.        DESCR   LTFN,FNC,0       LT(I1,I2)
  6019.        DESCR   LTSP,0,0
  6020.        DESCR   NEFN,FNC,0       NE(I1,I2)
  6021.        DESCR   NESP,0,0
  6022.        DESCR   NOTAFN,FNC,0       NOTANY(CS)
  6023.        DESCR   NNYSP,0,0
  6024.        DESCR   OPSYFN,FNC,0       OPSYN(F1,F2,N)
  6025.        DESCR   OPSNSP,0,0
  6026.        DESCR   PRINFN,FNC,0       OUTPUT(V,N,F)
  6027.        DESCR   OUTSP,0,0
  6028.        DESCR   POSFN,FNC,0       POS(N)
  6029.        DESCR   POSSP,0,0
  6030.        DESCR   PROTFN,FNC,0       PROTOTYPE(A)
  6031.        DESCR   PRTSP,0,0
  6032.        DESCR   REMDFN,FNC,0       REMDR(N,M)
  6033.        DESCR   REMDSP,0,0
  6034.        DESCR   REWNFN,FNC,0       REWIND(N)
  6035.        DESCR   REWNSP,0,0
  6036.        DESCR   RPLAFN,FNC,0       REPLACE(S,CS1,CS2)
  6037.        DESCR   RPLCSP,0,0
  6038.        DESCR   RPOSFN,FNC,0       RPOS(N)
  6039.        DESCR   RPOSSP,0,0
  6040.        DESCR   RTABFN,FNC,0       RTAB(N)
  6041.        DESCR   RTABSP,0,0
  6042.        DESCR   SIZEFN,FNC,0       SIZE(S)
  6043.        DESCR   SIZESP,0,0
  6044.        DESCR   SPANFN,FNC,0       SPAN(CS)
  6045.        DESCR   SPANSP,0,0
  6046.        DESCR   STPTFN,FNC,0       STOPTR(V,R)
  6047.        DESCR   STPTSP,0,0
  6048.        DESCR   TABFN,FNC,0       TAB(N)
  6049.        DESCR   TABSP,0,0
  6050.        DESCR   ASSCFN,FNC,0       TABLE(N,M)
  6051.        DESCR   ASSCSP,0,0
  6052.        DESCR   TIMFN,FNC,0       TIME()
  6053.        DESCR   TIMSP,0,0
  6054.        DESCR   TRCEFN,FNC,0       TRACE(V,R,T,F)
  6055.        DESCR   TRCESP,0,0
  6056.        DESCR   TRIMFN,FNC,0       TRIM(S)
  6057.        DESCR   TRMSP,0,0
  6058.        DESCR   UNLDFN,FNC,0       UNLOAD(S)
  6059.        DESCR   UNLDSP,0,0
  6060.        DESCR   VALFN,FNC,0       VALUE(S)
  6061.        DESCR   VALSP,0,0
  6062.        ARRAY   10*2           Space for 10 more functions
  6063. FNCPLE LHERE   ,           End of function pair list
  6064. OPTBL  DESCR   OPTBL,TTL+MARK,OPTBND-OPTBL-DESCR
  6065. ADDFN  DESCR   ADD,0,2           X + Y    addition
  6066.        DESCR   0,0,0
  6067.        DESCR   30,0,29
  6068. BIAMFN DESCR   UNDF,FNC,0       X & Y    definable
  6069.        DESCR   0,0,0
  6070.        DESCR   5,0,4
  6071. BIATFN DESCR   UNDF,FNC,0       X @ Y    definable
  6072.        DESCR   0,0,0
  6073.        DESCR   25,0,24
  6074. BINGFN DESCR   UNDF,FNC,0       X \ Y    definable
  6075.        DESCR   0,0,0
  6076.        DESCR   70,0,70
  6077. BIPDFN DESCR   UNDF,FNC,0       X # Y    definable
  6078.        DESCR   0,0,0
  6079.        DESCR   35,0,34
  6080. BIPRFN DESCR   UNDF,FNC,0       X % Y    definable
  6081.        DESCR   0,0,0
  6082.        DESCR   45,0,44
  6083. BIQSFN DESCR   UNDF,FNC,0       X ? Y    definable
  6084.        DESCR   0,0,0
  6085.        DESCR   70,0,69
  6086. CONFN  DESCR   CON,0,2           X   Y    concatenation
  6087.        DESCR   0,0,0
  6088.        DESCR   20,0,19
  6089. DIVFN  DESCR   DIV,0,2           X / Y    division
  6090.        DESCR   0,0,0
  6091.        DESCR   40,0,39
  6092. DOLFN  DESCR   DOL,0,2           X $ Y    immediate naming
  6093.        DESCR   0,0,0
  6094.        DESCR   60,0,59
  6095. EXPFN  DESCR   EXP,0,2           X ** Y   exponentiation
  6096.        DESCR   0,0,0
  6097.        DESCR   50,0,50
  6098. MPYFN  DESCR   MPY,0,2           X * Y    multiplication
  6099.        DESCR   0,0,0
  6100.        DESCR   42,0,41
  6101. NAMFN  DESCR   NAM,0,2           X . Y    naming
  6102.        DESCR   0,0,0
  6103.        DESCR   60,0,59
  6104. ORFN   DESCR   OR,0,2           X | Y    alternation
  6105.        DESCR   0,0,0
  6106.        DESCR   10,0,9
  6107. SUBFN  DESCR   SUB,0,2           X - Y    subtraction
  6108.        DESCR   0,0,0
  6109.        DESCR   30,0,29
  6110. AROWFN DESCR   UNDF,FNC,0       !X        definable
  6111.        DESCR   0,0,0
  6112. ATFN   DESCR   ATOP,0,1        @X        scanner position
  6113.        DESCR   0,0,0
  6114. BARFN  DESCR   UNDF,FNC,0       |X        definable
  6115.        DESCR   0,0,0
  6116. DOTFN  DESCR   NAME,0,1        .X        name
  6117.        DESCR   0,0,0
  6118. INDFN  DESCR   IND,0,1           $X        indirect reference
  6119.        DESCR   0,0,0
  6120. KEYFN  DESCR   KEYWRD,0,1       &X        keyword
  6121.        DESCR   0,0,0
  6122. MNSFN  DESCR   MNS,0,1           -X        minus
  6123.        DESCR   0,0,0
  6124. NEGFN  DESCR   NEG,0,1           \X        negation
  6125.        DESCR   0,0,0
  6126. PDFN   DESCR   UNDF,FNC,0       #X        definable
  6127.        DESCR   0,0,0
  6128. PLSFN  DESCR   PLS,0,1           +X        plus
  6129.        DESCR   0,0,0
  6130. PRFN   DESCR   UNDF,FNC,0       %X        definable
  6131.        DESCR   0,0,0
  6132. QUESFN DESCR   QUES,0,1        ?X        interrogation
  6133.        DESCR   0,0,0
  6134. SLHFN  DESCR   UNDF,FNC,0       /X        definable
  6135.        DESCR   0,0,0
  6136. STRFN  DESCR   STR,0,1           *X        unevaluated expression
  6137.        DESCR   0,0,0
  6138. OPTBND LHERE   ,           End of operator table
  6139. *
  6140. *
  6141. AREFN  DESCR   ITEM,FNC,1       Array or table reference
  6142. ASGNFN DESCR   ASGN,0,2        X = Y
  6143. BASEFN DESCR   BASE,0,0        Base object code
  6144. ENDAFN DESCR   ARGNER,0,0       Safety exit on trace psuedo-code
  6145. ENDFN  DESCR   END,0,0           End of program
  6146. ERORFN DESCR   EROR,0,1        Erroneous statement
  6147. FNTRFN DESCR   FENTR,0,2       Call tracing
  6148. FXTRFN DESCR   FNEXTR,0,2       Return tracing
  6149. GOTGFN DESCR   GOTG,0,1        :<X>
  6150. GOTLFN DESCR   GOTL,0,1        :(L)
  6151. GOTOFN DESCR   GOTO,0,1        Internal goto
  6152. INITFN DESCR   INIT,0,1        Statement initialization
  6153. KEYTFN DESCR   KEYTR,0,2       Keyword tracing
  6154. LABTFN DESCR   LABTR,0,2       Label tracing
  6155. LITFN  DESCR   LIT,0,1           Literal evaluation
  6156. SCANFN DESCR   SCAN,0,2        Pattern matching
  6157. SJSRFN DESCR   SJSR,0,3        Pattern matching with replacement
  6158. VLTRFN DESCR   VALTR,0,2       Value tracing
  6159. ANYCFN DESCR   ANYC,0,3        Matching for ANY(S)
  6160. ARBFFN DESCR   ARBF,0,2        Failure for ARB
  6161. ARBNFN DESCR   ARBN,0,2        Matching for ARBNO(P)
  6162. ATOPFN DESCR   ATP,0,3           Matching for @X
  6163. CHRFN  DESCR   CHR,0,3           Matching for string
  6164. BALFN  DESCR   BAL,0,2           Matching for BAL
  6165. BALFFN DESCR   BALF,0,2        Failure for BAL
  6166. BRKCFN DESCR   BRKC,0,3        Matching for BREAK(S)
  6167. DNMEFN DESCR   DNME,0,2
  6168. DNMIFN DESCR   DNME1,0,2
  6169. EARBFN DESCR   EARB,0,2
  6170. DSARFN DESCR   DSAR,0,3
  6171. ENMEFN DESCR   ENME,0,3
  6172. ENMIFN DESCR   ENMI,0,3
  6173. FARBFN DESCR   FARB,0,2
  6174. FNMEFN DESCR   FNME,0,2
  6175. LNTHFN DESCR   LNTH,0,3        Matching for LEN(N)
  6176. NMEFN  DESCR   NME,0,2
  6177. NNYCFN DESCR   NNYC,0,3        Matching for NOTANY(S)
  6178. ONARFN DESCR   ONAR,0,2
  6179. ONRFFN DESCR   ONRF,0,2
  6180. POSIFN DESCR   POSI,0,3        Matching for POS(N)
  6181. RPSIFN DESCR   RPSI,0,3        Matching for RPOS(N)
  6182. RTBFN  DESCR   RTB,0,3           Matching for RTAB(N)
  6183. SALFFN DESCR   SALF,0,2
  6184. SCFLFN DESCR   FAIL,0,2
  6185. SCOKFN DESCR   SCOK,0,2        Successful match procedure
  6186. SCONFN DESCR   SCON,0,2
  6187. SPNCFN DESCR   SPNC,0,3        Matching for SPAN(S)
  6188. STARFN DESCR   STAR,0,3        Matching for *X
  6189. TBFN   DESCR   TB,0,3           Matching for TAB(N)
  6190. ABORFN DESCR   RTNUL3,0,3       Matching for ABORT
  6191. FNCEFN DESCR   FNCE,0,2        Matching for FENCE
  6192. FNCFFN DESCR   RTNUL3,0,2       Failure for FENCE
  6193. SUCFFN DESCR   SUCF,0,2        Matching for SUCCEED
  6194. *
  6195. *      Initialization Data for Functions
  6196. *
  6197. ABNDSP STRING  'ABEND'
  6198. ABORSP STRING  'ABORT'
  6199. ALNMSP STRING  'ALPHABET'
  6200. ANCHSP STRING  'ANCHOR'
  6201. ANYSP  STRING  'ANY'
  6202. APLYSP STRING  'APPLY'
  6203. ARBSP  STRING  'ARB'
  6204. ARBNSP STRING  'ARBNO'
  6205. ARGSP  STRING  'ARG'
  6206. BACKSP STRING  'BACKSPACE'
  6207. BALSP  STRING  'BAL'
  6208. BRKSP  STRING  'BREAK'
  6209. TRFRSP STRING  'CALL'
  6210. CLERSP STRING  'CLEAR'
  6211. CODESP STRING  'CODE'
  6212. CLSP   STRING  'COLLECT'
  6213. CNVTSP STRING  'CONVERT'
  6214. COPYSP STRING  'COPY'
  6215. DATSP  STRING  'DATE'
  6216. DATASP STRING  'DATA'
  6217. DEFISP STRING  'DEFINE'
  6218. DIFFSP STRING  'DIFFER'
  6219. DTCHSP STRING  'DETACH'
  6220. DTSP   STRING  'DATATYPE'
  6221. DUMPSP STRING  'DUMP'
  6222. DUPLSP STRING  'DUPL'
  6223. ENDSP  STRING  'END'
  6224. ENDFSP STRING  'ENDFILE'
  6225. EQSP   STRING  'EQ'
  6226. ERRLSP STRING  'ERRLIMIT'
  6227. ERRTSP STRING  'ERRTYPE'
  6228. EVALSP STRING  'EVAL'
  6229. EXPSP  STRING  'EXPRESSION'
  6230. FAILSP STRING  'FAIL'
  6231. FNCESP STRING  'FENCE'
  6232. FLDSSP STRING  'FIELD'
  6233. FNCLSP STRING  'FNCLEVEL'
  6234. FRETSP STRING  'FRETURN'
  6235. FTRCSP STRING  'FTRACE'
  6236. FULLSP STRING  'FULLSCAN'
  6237. FUNTSP STRING  'FUNCTION'
  6238. GESP   STRING  'GE'
  6239. GTSP   STRING  'GT'
  6240. IDENSP STRING  'IDENT'
  6241. INSP   STRING  'INPUT'
  6242. INTGSP STRING  'INTEGER'
  6243. ITEMSP STRING  'ITEM'
  6244. TRKYSP STRING  'KEYWORD'
  6245. TRLASP STRING  'LABEL'
  6246. LSTNSP STRING  'LASTNO'
  6247. LENSP  STRING  'LEN'
  6248. LESP   STRING  'LE'
  6249. LGTSP  STRING  'LGT'
  6250. LOADSP STRING  'LOAD'
  6251. LOCSP  STRING  'LOCAL'
  6252. LTSP   STRING  'LT'
  6253. MAXLSP STRING  'MAXLNGTH'
  6254. NAMESP STRING  'NAME'
  6255. NESP   STRING  'NE'
  6256. NNYSP  STRING  'NOTANY'
  6257. NRETSP STRING  'NRETURN'
  6258. OPSNSP STRING  'OPSYN'
  6259. OUTSP  STRING  'OUTPUT'
  6260. PATSP  STRING  'PATTERN'
  6261. POSSP  STRING  'POS'
  6262. PRTSP  STRING  'PROTOTYPE'
  6263. PNCHSP STRING  'PUNCH'
  6264. RLSP   STRING  'REAL'
  6265. REMSP  STRING  'REM'
  6266. REMDSP STRING  'REMDR'
  6267. RETSP  STRING  'RETURN'
  6268. REWNSP STRING  'REWIND'
  6269. RPLCSP STRING  'REPLACE'
  6270. RPOSSP STRING  'RPOS'
  6271. RTABSP STRING  'RTAB'
  6272. RTYPSP STRING  'RTNTYPE'
  6273. SIZESP STRING  'SIZE'
  6274. SPANSP STRING  'SPAN'
  6275. STCTSP STRING  'STCOUNT'
  6276. STFCSP STRING  'STFCOUNT'
  6277. STLMSP STRING  'STLIMIT'
  6278. STPTSP STRING  'STOPTR'
  6279. STNOSP STRING  'STNO'
  6280. VARSP  STRING  'STRING'
  6281. SUCCSP STRING  'SUCCEED'
  6282. TABSP  STRING  'TAB'
  6283. TIMSP  STRING  'TIME'
  6284. TRCESP STRING  'TRACE'
  6285. TRMSP  STRING  'TRIM'
  6286. UNLDSP STRING  'UNLOAD'
  6287. VALSP  STRING  'VALUE'
  6288. *
  6289. CRDFSP STRING  '(80A1)'        Default output format
  6290. OUTPSP STRING  '(1X,132A1)'       Standard print format
  6291. *
  6292. *      Pointers to Other Initialization
  6293. *
  6294. ABNDB  LHERE   ,
  6295.        DESCR   ALPHSP,0,0       &ALPHABET
  6296.        DESCR   ALPHVL,0,0
  6297.        DESCR   CRDFSP,0,0       Default output format
  6298.        DESCR   DFLFST,0,0
  6299.        DESCR   EXDTSP,0,0       'EXTERNAL'
  6300.        DESCR   EXTPTR,0,0
  6301.        DESCR   ENDSP,0,0       'END'
  6302.        DESCR   ENDPTR,0,0
  6303.        DESCR   FRETSP,0,0       'FRETURN'
  6304.        DESCR   FRETCL,0,0
  6305.        DESCR   FUNTSP,0,0       'FUNCTION'
  6306.        DESCR   FUNTCL,0,0
  6307.        DESCR   NRETSP,0,0       'NRETURN'
  6308.        DESCR   NRETCL,0,0
  6309.        DESCR   RETSP,0,0       'RETURN'
  6310. DTEND  DESCR   RETCL,0,0
  6311. BUFEXT EQU     DTEND-ANYSP
  6312. BUFLEN EQU     BUFEXT*CPA
  6313. *
  6314. *      System Arrays
  6315. *
  6316. PRMTBL DESCR   PRMTBL,TTL+MARK,PRMSIZ
  6317.        DESCR   DTLIST,0,0       Data type pair list
  6318.        DESCR   FNLIST,0,0       Function pair list
  6319.        DESCR   FTABLE,0,0       Procedure descriptor table
  6320.        DESCR   ICLBLK,0,0       Miscellaneous data
  6321.        DESCR   KNLIST,0,0       Unprotected keyword pair list
  6322.        DESCR   KVLIST,0,0       Protected keyword pair list
  6323.        DESCR   OPTBL,0,0       Operator procedure descriptors
  6324.        DESCR   STACK,0,0       Interpreter stack
  6325.        DESCR   INLIST,0,0       Input association pair list
  6326.        DESCR   OTLIST,0,0       Output association pair list
  6327.        DESCR   INSATL,0,0       Input block list
  6328.        DESCR   OTSATL,0,0       Output block list
  6329.        DESCR   TFENPL,0,0       Call trace pair list
  6330.        DESCR   TFEXPL,0,0       Return trace pair list
  6331.        DESCR   TKEYPL,0,0       Keyword trace pair list
  6332.        DESCR   TLABPL,0,0       Label trace pair list
  6333.        DESCR   TRLIST,0,0       Trace pair list
  6334.        DESCR   TVALPL,0,0       Value trace pair list
  6335. PRMTRM LHERE   ,           End of basic block list
  6336. PRMSIZ EQU     PRMTRM-PRMTBL-DESCR Size of basic block list
  6337. *
  6338. *      String Storage Bin List
  6339. *
  6340. OBLOCK DESCR   OBLOCK,TTL+MARK,OBARY*DESCR
  6341.        ARRAY   3           Pseudo heading
  6342. OBSTRT ARRAY   OBSIZ           Bin list
  6343. OBLIST EQU     OBSTRT-LNKFLD       Pseudo link pointer
  6344. *
  6345. *      Pattern Matching History List
  6346. *
  6347. PDLBLK DESCR   PDLBLK,TTL+MARK,SPDLSZ*DESCR
  6348.        ARRAY   SPDLSZ           Pattern history list
  6349. *
  6350. *      SYSTEM  STACK
  6351. *
  6352. STACK  DESCR   STACK,TTL+MARK,STSIZE*DESCR
  6353.        ARRAY   STSIZE           Interpreter stack
  6354. *
  6355. *      Primitive Patterns
  6356. *
  6357. ABORPT DESCR   ABORPT,TTL+MARK,3*DESCR
  6358.        DESCR   ABORFN,FNC,2       ABORT
  6359.        DESCR   0,0,0
  6360.        DESCR   0,0,0
  6361. *
  6362. ARBAK  DESCR   ARBAK,TTL+MARK,6*DESCR
  6363.        DESCR   ONARFN,FNC,2
  6364.        DESCR   3*DESCR,0,0
  6365.        DESCR   0,0,0
  6366.        DESCR   ONRFFN,FNC,2
  6367.        DESCR   0,0,0
  6368.        DESCR   0,0,0
  6369. *
  6370. ARBPT  DESCR   ARBPT,TTL+MARK,9*DESCR
  6371.        DESCR   SCOKFN,FNC,2       ARB
  6372.        DESCR   0,0,3*DESCR
  6373.        DESCR   0,0,0
  6374.        DESCR   SCOKFN,FNC,2
  6375.        DESCR   6*DESCR,0,0
  6376.        DESCR   0,0,0
  6377.        DESCR   FARBFN,FNC,2
  6378.        DESCR   6*DESCR,0,0
  6379.        DESCR   0,0,0
  6380. *
  6381. ARHED  DESCR   ARHED,TTL+MARK,12*DESCR
  6382.        DESCR   SCOKFN,FNC,2
  6383.        DESCR   0,0,3*DESCR
  6384.        DESCR   0,0,0
  6385.        DESCR   SCOKFN,FNC,2
  6386.        DESCR   6*DESCR,0,0
  6387.        DESCR   0,0,0
  6388.        DESCR   ARBNFN,FNC,2
  6389.        DESCR   9*DESCR,0,12*DESCR
  6390.        DESCR   0,0,0
  6391.        DESCR   ARBFFN,FNC,2
  6392.        DESCR   0,0,0
  6393.        DESCR   0,0,0
  6394. *
  6395. ARTAL  DESCR   ARTAL,TTL+MARK,6*DESCR
  6396.        DESCR   EARBFN,FNC,2
  6397.        DESCR   0,0,3*DESCR
  6398.        DESCR   0,0,0
  6399.        DESCR   SCOKFN,FNC,2
  6400.        DESCR   6*DESCR,0,0
  6401.        DESCR   0,0,0
  6402. *
  6403. BALPT  DESCR   BALPT,TTL+MARK,9*DESCR
  6404.        DESCR   SCOKFN,FNC,2       BAL
  6405.        DESCR   0,0,3*DESCR
  6406.        DESCR   0,0,0
  6407.        DESCR   BALFN,FNC,2
  6408.        DESCR   6*DESCR,0,0
  6409.        DESCR   0,0,0
  6410.        DESCR   BALFFN,FNC,2
  6411.        DESCR   6*DESCR,0,0
  6412.        DESCR   0,0,0
  6413. *
  6414. FAILPT DESCR   FAILPT,TTL+MARK,3*DESCR
  6415.        DESCR   SALFFN,FNC,2       FAIL
  6416.        DESCR   0,0,0
  6417.        DESCR   0,0,0
  6418. *
  6419. FNCEPT DESCR   FNCEPT,TTL+MARK,3*DESCR
  6420.        DESCR   FNCEFN,FNC,2       FENCE
  6421.        DESCR   0,0,0
  6422.        DESCR   0,0,0
  6423. *
  6424. REMPT  DESCR   REMPT,TTL+MARK,4*DESCR
  6425.        DESCR   RTBFN,FNC,3       REM
  6426.        DESCR   0,0,0
  6427.        DESCR   0,0,0
  6428.        DESCR   0,0,I
  6429. *
  6430. STARPT DESCR   STARPT,TTL+MARK,11*DESCR
  6431.        DESCR   STARFN,FNC,3
  6432.        DESCR   0,0,4*DESCR
  6433.        DESCR   1,0,0
  6434.        DESCR   0,0,0
  6435.        DESCR   SCOKFN,FNC,2
  6436.        DESCR   7*DESCR,0,0
  6437.        DESCR   0,0,0
  6438.        DESCR   DSARFN,FNC,3
  6439.        DESCR   0,0,4*DESCR
  6440.        DESCR   0,0,0
  6441.        DESCR   0,0,0
  6442. *
  6443. SUCCPT DESCR   SUCCPT,TTL+MARK,3*DESCR
  6444.        DESCR   SUCFFN,FNC,2       SUCCEED
  6445.        DESCR   0,0,0
  6446.        DESCR   0,0,0
  6447. *
  6448. TVALPL DESCR   TVALPL,TTL+MARK,2*DESCR
  6449.        DESCR   0,0,0           VALUE trace
  6450.        DESCR   0,0,0
  6451. TLABPL DESCR   TLABPL,TTL+MARK,2*DESCR
  6452.        DESCR   0,0,0           LABEL trace
  6453.        DESCR   0,0,0
  6454. TFENPL DESCR   TFENPL,TTL+MARK,2*DESCR
  6455.        DESCR   0,0,0           CALL trace
  6456.        DESCR   0,0,0
  6457. TFEXPL DESCR   TFEXPL,TTL+MARK,2*DESCR
  6458.        DESCR   0,0,0           RETURN trace
  6459.        DESCR   0,0,0
  6460. TKEYPL DESCR   TKEYPL,TTL+MARK,2*DESCR
  6461.        DESCR   0,0,0           KEYWORD trace
  6462.        DESCR   0,0,0
  6463. *
  6464. VALBLK DESCR   VALBLK,TTL+MARK,6*DESCR
  6465.        DESCR   0,0,S           STRING
  6466.        DESCR   0,0,0           0 offset
  6467.        DESCR   0,0,N           NAME
  6468.        DESCR   0,0,0           0 offset
  6469.        DESCR   0,0,K           KEYWORD (NAME)
  6470.        DESCR   0,0,0           0 offset
  6471. *
  6472. *      Fatal Error Message Pointers
  6473. *
  6474. MSGLST DESCR   0,0,0
  6475.        DESCR   MSG1,0,0
  6476.        DESCR   MSG2,0,0
  6477.        DESCR   MSG3,0,0
  6478.        DESCR   MSG4,0,0
  6479.        DESCR   MSG5,0,0
  6480.        DESCR   MSG6,0,0
  6481.        DESCR   MSG7,0,0
  6482.        DESCR   MSG8,0,0
  6483.        DESCR   MSG9,0,0
  6484.        DESCR   MSG10,0,0
  6485.        DESCR   MSG11,0,0
  6486.        DESCR   MSG12,0,0
  6487.        DESCR   MSG13,0,0
  6488.        DESCR   MSG14,0,0
  6489.        DESCR   MSG15,0,0
  6490.        DESCR   MSG16,0,0
  6491.        DESCR   MSG17,0,0
  6492.        DESCR   MSG18,0,0
  6493.        DESCR   MSG19,0,0
  6494.        DESCR   MSG20,0,0
  6495.        DESCR   MSG21,0,0
  6496.        DESCR   MSG22,0,0
  6497.        DESCR   MSG23,0,0
  6498.        DESCR   MSG24,0,0
  6499.        DESCR   MSG25,0,0
  6500.        DESCR   MSG26,0,0
  6501.        DESCR   MSG27,0,0
  6502.        DESCR   MSG28,0,0
  6503. *
  6504. *      Fatal Error Messages
  6505. *
  6506. MSG1   STRING  'ILLEGAL DATA TYPE'
  6507. MSG2   STRING  'ERROR IN ARITHMETIC OPERATION'
  6508. MSG3   STRING  'ERRONEOUS ARRAY OR TABLE REFERENCE'
  6509. MSG4   STRING  'NULL STRING IN ILLEGAL CONTEXT'
  6510. MSG5   STRING  'UNDEFINED FUNCTION OR OPERATION'
  6511. MSG6   STRING  'ERRONEOUS PROTOTYPE'
  6512. MSG7   STRING  'UNKNOWN KEYWORD'
  6513. MSG8   STRING  'VARIABLE NOT PRESENT WHERE REQUIRED'
  6514. MSG9   STRING  'ENTRY POINT OF FUNCTION NOT LABEL'
  6515. MSG10  STRING  'ILLEGAL ARGUMENT TO PRIMITIVE FUNCTION'
  6516. MSG11  STRING  'READING ERROR'
  6517. MSG12  STRING  'ILLEGAL I/O UNIT'
  6518. MSG13  STRING  'LIMIT ON DEFINED DATA TYPES EXCEEDED'
  6519. MSG14  STRING  'NEGATIVE NUMBER IN ILLEGAL CONTEXT'
  6520. MSG15  STRING  'STRING OVERFLOW'
  6521. MSG16  STRING  'OVERFLOW DURING PATTERN MATCHING'
  6522. MSG17  STRING  'ERROR IN SNOBOL4 SYSTEM'
  6523. MSG18  STRING  'RETURN FROM LEVEL ZERO'
  6524. MSG19  STRING  'FAILURE DURING GOTO EVALUATION'
  6525. MSG20  STRING  'INSUFFICIENT STORAGE TO CONTINUE'
  6526. MSG21  STRING  'STACK OVERFLOW'
  6527. MSG22  STRING  'LIMIT ON STATEMENT EXECUTION EXCEEDED'
  6528. MSG23  STRING  'OBJECT EXCEEDS SIZE LIMIT'
  6529. MSG24  STRING  'UNDEFINED OR ERRONEOUS GOTO'
  6530. MSG25  STRING  'INCORRECT NUMBER OF ARGUMENTS'
  6531. MSG26  STRING  'LIMIT ON COMPILATION ERRORS EXCEEDED'
  6532. MSG27  STRING  'ERRONEOUS END STATEMENT'
  6533. MSG28  STRING  'EXECUTION OF STATEMENT WITH COMPILATION ERROR'
  6534. *
  6535. *      Compiler Error Messages
  6536. *
  6537. EMSG1  STRING  'ERRONEOUS LABEL'
  6538. EMSG2  STRING  'PREVIOUSLY DEFINED LABEL'
  6539. EMSG3  STRING  'ERRONEOUS SUBJECT'
  6540. EMSG14 STRING  'ERROR IN GOTO'
  6541. ILCHAR STRING  'ILLEGAL CHARACTER IN ELEMENT'
  6542. ILLBIN STRING  'BINARY OPERATOR MISSING OR IN ERROR'
  6543. ILLBRK STRING  'ERRONEOUS OR MISSING BREAK CHARACTER'
  6544. ILLDEC STRING  'ERRONEOUS REAL NUMBER'
  6545. ILLEOS STRING  'IMPROPERLY TERMINATED STATEMENT'
  6546. ILLINT STRING  'ERRONEOUS INTEGER'
  6547. OPNLIT STRING  'UNCLOSED LITERAL'
  6548. *
  6549. *      Formats
  6550. *
  6551. ALOCFL FORMAT  '(40H0INSUFFICIENT STORAGE FOR INITIALIZATION)'    E3.10.6
  6552. ARTHNO FORMAT  '(1H0,I15,32H ARITHMETIC OPERATIONS PERFORMED)'
  6553. CMTIME FORMAT  '(1H0,I15,21H MS. COMPILATION TIME)'
  6554. EJECTF FORMAT  '(1H1)'
  6555. ERRCF  FORMAT  '(34H0ERRORS DETECTED IN SOURCE PROGRAM/1H1)'
  6556. EXNO   FORMAT  '(1H0,I15,21H STATEMENTS EXECUTED,,I8,7H FAILED)'
  6557. FTLCF  FORMAT  '(6H1ERROR,I3,13H IN STATEMENT,I5,9H AT LEVEL,I3)'
  6558. *                                E3.4.1
  6559. INCGCF FORMAT  '(33H1INCOMPLETE STORAGE REGENERATION.)'
  6560. INTIME FORMAT  '(1H0,I15,19H MS. EXECUTION TIME)'
  6561. LASTSF FORMAT  '(28H LAST STATEMENT EXECUTED WAS,I5)'
  6562. NODMPF FORMAT  '(28H1TERMINAL DUMP NOT POSSIBLE.)'
  6563. NRMEND FORMAT  '(28H1NORMAL TERMINATION AT LEVEL,I3)'
  6564. NVARF  FORMAT  '(18H0NATURAL VARIABLES,/1H )'
  6565. PKEYF  FORMAT  '(21H0UNPROTECTED KEYWORDS/1H )'
  6566. PRTOVF FORMAT  '(29H ***PRINT REQUEST TOO LONG***)'
  6567. READNO FORMAT  '(1H0,I15,16H READS PERFORMED)'
  6568. SCANNO FORMAT  '(1H0,I15,26H PATTERN MATCHES PERFORMED)'
  6569. SOURCF FORMAT  '(42H0BELL TELEPHONE LABORATORIES, INCORPORATED,/1H1)'
  6570. STATHD FORMAT  '(28H1SNOBOL4 STATISTICS SUMMARY-)'
  6571. STDMP  FORMAT  '(33H1DUMP OF VARIABLES AT TERMINATION/1H )'
  6572. STGENO FORMAT  '(1H0,I15,33H REGENERATIONS OF DYNAMIC STORAGE)'
  6573. SUCCF  FORMAT  '(37H0NO ERRORS DETECTED IN SOURCE PROGRAM/1H1)'
  6574. SYSCMT FORMAT  '(27H0CUT BY SYSTEM IN STATEMENT,I5,9H AT LEVEL,I3)'
  6575. *                                E3.4.1
  6576. TIMEPS FORMAT  '(1H0,F15.2,35H MS. AVERAGE PER STATEMENT EXECUTED/1H1)'
  6577. TITLEF FORMAT  '(37H1SNOBOL4 (VERSION 3.11, MAY 19, 1975)/8H+_______)'
  6578. *                                V3.11
  6579. WRITNO FORMAT  '(1H0,I15,17H WRITES PERFORMED)'
  6580.        END
  6581.