home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MISC / PLM80.ARK / PLM82.FOR < prev    next >
Text File  |  1989-04-05  |  190KB  |  6,050 lines

  1. C***********************************************************************
  2. C
  3. C         8 0 8 0   P L / M   C O M P I L E R ,   P A S S - 2
  4. C                                 PLM82
  5. C                              VERSION 2.0
  6. C                             JANUARY, 1975
  7. C
  8. C                          COPYRIGHT (C) 1975
  9. C                          INTEL CORPORATION
  10. C                          3065 BOWERS AVENUE
  11. C                          SANTA CLARA, CALIFORNIA 95051
  12. C
  13. C  MODIFYED BY JEFF OGDEN (UM), DECEMBER 1977.
  14. C
  15. C***********************************************************************
  16. C
  17. C
  18. C         P A S S - 2     E R R O R    M E S S A G E S
  19. C
  20. C  ERROR                     MESSAGE
  21. C  NUMBER
  22. C  ------  --- -------------------------------------------------------
  23. C
  24. C   101     REFERENCE TO STORAGE LOCATIONS OUTSIDE THE VIRTUAL MEMORY
  25. C           OF PASS-2.  RE-COMPILE PASS-2 WITH LARGER 'MEMORY' ARRAY.
  26. C
  27. C   102         "
  28. C
  29. C   103     VIRTUAL MEMORY OVERFLOW.  PROGRAM IS TOO LARGE TO COMPILE
  30. C           WITH PRESENT SIZE OF 'MEMORY.'  EITHER SHORTEN PROGRAM OR
  31. C           RECOMPILE PASS-2 WITH A LARGER VIRTUAL MEMORY.
  32. C
  33. C   104     (SAME AS 103).
  34. C
  35. C
  36. C   105     $TOGGLE USED IMPROPERLY IN PASS-2.  ATTEMPT TO COMPLEMENT
  37. C           A TOGGLE WHICH HAS A VALUE OTHER THAN 0 OR 1.
  38. C
  39. C   106     REGISTER ALLOCATION TABLE UNDERFLOW.  MAY BE DUE TO A PRE-
  40. C
  41. C   107     REGISTER ALLOCATION ERROR.  NO REGISTERS AVAILABLE.  MAY
  42. C           BE CAUSED BY A PREVIOUS ERROR, OR PASS-2 COMPILER ERROR.
  43. C
  44. C   108     PASS-2 SYMBOL TABLE OVERFLOW.  REDUCE NUMBER OF
  45. C           SYMBOLS, OR RE-COMPILE PASS-2 WITH LARGER SYMBOL TABLE.
  46. C
  47. C   109     SYMBOL TABLE OVERFLOW (SEE ERROR 108).
  48. C
  49. C   110     MEMORY ALLOCATION ERROR.  TOO MUCH STORAGE SPECIFIED IN
  50. C           THE SOURCE PROGRAM (16K MAX).  REDUCE SOURCE PROGRAM
  51. C           MEMORY REQUIREMENTS.
  52. C
  53. C   111     INLINE DATA FORMAT ERROR.  MAY BE DUE TO IMPROPER
  54. C           RECORD SIZE IN SYMBOL TABLE FILE PASSED TO PASS-2.
  55. C
  56. C   112     (SAME AS ERROR 107).
  57. C
  58. C   113     REGISTER ALLOCATION STACK OVERFLOW.  EITHER SIMPLIFY THE
  59. C           PROGRAM OR INCREASE THE SIZE OF THE ALLOCATION STACKS.
  60. C
  61. C   114     PASS-2 COMPILER ERROR IN 'LITADD' -- MAY BE DUE TO A
  62. C           PREVIOUS ERROR.
  63. C
  64. C   115     (SAME AS 114).
  65. C
  66. C   116     (SAME AS 114).
  67. C
  68. C   117     LINE WIDTH SET TOO NARROW FOR CODE DUMP (USE $WIDTH=N)
  69. C
  70. C   118     (SAME AS 107).
  71. C
  72. C   119     (SAME AS 110).
  73. C
  74. C   120     (SAME AS 110, BUT MAY BE A PASS-2 COMPILER ERROR).
  75. C
  76. C   121     (SAME AS 108).
  77. C
  78. C   122     PROGRAM REQUIRES TOO MUCH PROGRAM AND VARIABLE STORAGE.
  79. C           (PROGRAM AND VARIABLES EXCEED 16K).
  80. C
  81. C   123     INITIALIZED STORAGE OVERLAPS PREVIOUSLY INITIALIZED STORAGE.
  82. C
  83. C   124     INITIALIZATION TABLE FORMAT ERROR.  (SEE ERROR 111).
  84. C
  85. C   125     INLINE DATA ERROR.  MAY HAVE BEEN CAUSED BY PREVIOUS ERROR.
  86. C
  87. C   126     BUILT-IN FUNCTION IMPROPERLY CALLED.
  88. C
  89. C   127     INVALID INTERMEDIATE LANGUAGE FORMAT. (SEE ERROR 111).
  90. C
  91. C   128     (SAME AS ERROR 113).
  92. C
  93. C   129     INVALID USE OF BUILT-IN FUNCTION IN AN ASSIGNMENT.
  94. C
  95. C   130     PASS-2 COMPILER ERROR.  INVALID VARIABLE PRECISION (NOT
  96. C           SINGLE BYTE OR DOUBLE BYTE).  MAY BE DUE TO PREVIOUS ERROR.
  97. C
  98. C   131     LABEL RESOLUTION ERROR IN PASS-2 (MAY BE COMPILER ERROR).
  99. C
  100. C   132     (SAME AS 108).
  101. C
  102. C   133     (SAME AS 113).
  103. C
  104. C   134     INVALID PROGRAM TRANSFER (ONLY COMPUTED JUMPS ARE ALLOWED
  105. C           WITH A 'GO TO').
  106. C
  107. C   135     (SAME AS 134).
  108. C
  109. C   136     ERROR IN BUILT-IN FUNCTION CALL.
  110. C
  111. C   137     (NOT USED)
  112. C
  113. C   138     (SAME AS 107).
  114. C
  115. C   139     ERROR IN CHANGING VARIABLE TO ADDRESS REFERENCE. MAY
  116. C           BE A PASS-2 COMPILER ERROR, OR MAY BE CAUSED BY PRE-
  117. C           VOUS ERROR.
  118. C
  119. C   140     (SAME AS 107).
  120. C
  121. C   141     INVALID ORIGIN.  CODE HAS ALREADY BEEN GENERATED IN THE
  122. C           SPECIFIED LOCATIONS.
  123. C
  124. C   142     A SYMBOL TABLE DUMP HAS BEEN SPECIFIED (USING THE $MEMORY
  125. C           TOGGLE IN PASS-1), BUT NO FILE HAS BEEN SPECIFIED TO RE-
  126. C           CEIVE THE BNPF TAPE (USE THE $BNPF=N CONTROL).
  127. C
  128. C   143     INVALID FORMAT FOR THE SIMULATOR SYMBOL TABLE DUMP (SEE
  129. C           ERROR 111).
  130. C
  131. C   144     STACK NOT EMPTY AT END OF COMPILATION.  POSSIBLY CAUSED
  132. C           BY PREVIOUS COMPILATION ERROR.
  133. C
  134. C   145     PROCEDURES NESTED TOO DEEPLY (HL OPTIMIZATION)
  135. C           SIMPLIFY NESTING, OR RE-COMPILE WITH LARGER PSTACK
  136. C
  137. C   146     PROCEDURE OPTIMIZATION STACK UNDERFLOW.  MAY BE A
  138. C           RETURN IN OUTER BLOCK.
  139. C
  140. C   147     PASS-2 COMPILER ERROR IN LOADV. REGISTER
  141. C           STACK ORDER IS INVALID.  MAY BE DUE TO PREVIOUS ERROR.
  142. C
  143. C   148     PASS-2 COMPILER ERROR.  ATTEMPT TO UNSTACK TOO
  144. C           MANY VALUES.  MAY BE DUE TO PREVIOUS ERROR.
  145. C
  146. C   149     PASS-2 COMPILER ERROR. ATTEMPT TO CONVERT INVALID
  147. C           VALUE TO ADDRESS TYPE.  MAY BE DUE TO PREVIOUS ERROR.
  148. C
  149. C   150     (SAME AS 147)
  150. C
  151. C   151     PASS-2 COMPILER ERROR. UNBALANCED  EXECUTION STACK
  152. C           AT BLOCK END.  MAY BE DUE TO A PREVIOUS ERROR.
  153. C
  154. C    152    INVALID STACK ORDER IN APPLY.  MAY BE DUE TO PREVIOUS
  155. C           ERROR.
  156. C
  157. C
  158. C              I M P L E M E N T A T I O N    N O T E S
  159. C              - - - - - - - - - - - - - -    - - - - -
  160. C    THE PL/M COMPILER IS INTENDED TO BE WRITTEN IN ANSI STANDARD
  161. C    FORTRAN - IV, AND THUS IT SHOULD BE POSSIBLE TO COMPILE AND
  162. C    EXECUTE THIS PROGRAM ON ANY MACHINE WHICH SUPPORTS THIS FORTRAN
  163. C    STANDARD.  BOTH PASS-1 AND PASS-2, HOWEVER, ASSUME THE HOST
  164. C    MACHINE WORD SIZE IS AT LEAST 31 BITS, EXCLUDING THE SIGN BIT
  165. C    (I.E., 32 BITS IF THE SIGN IS INCLUDED).
  166. C
  167. C    THE IMPLEMENTOR MAY FIND IT NECESSARY TO CHANGE THE SOURCE PROGRAM
  168. C    IN ORDER TO ACCOUNT FOR SYSTEM DEPENDENCIES.  THESE CHANGES ARE
  169. C    AS FOLLOWS
  170. C
  171. C    1)   THE FORTRAN LOGICAL UNIT NUMBERS FOR VARIOUS DEVICES
  172. C         MAY HAVE TO BE CHANGED IN THE 'GNC' AND 'WRITEL' SUBROU-
  173. C         TINES (SEE THE FILE DEFINITIONS BELOW).
  174. C
  175. C     2)   THE HOST MACHINE MAY NOT HAVE THE PL/M 52 CHARACTER SET
  176. C           0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$=./()+-'*,<>:;
  177. C         (THE LAST 15 SPECIAL CHARACTERS ARE
  178. C         DOLLAR,  EQUAL,  PERIOD,  SLASH, LEFT PAREN,
  179. C         RIGHT PAREN, PLUS,   MINUS,  QUOTE, ASTERISK,
  180. C         COMMA, LESS-THAN, GREATER-THAN, COLON, SEMI-COLON)
  181. C         IN THIS CASE, IT IS NECESSARY TO CHANGE THE 'OTRAN' VECTOR IN
  182. C         BLOCK DATA TO A CHARACTER SET WHICH THE HOST MACHINE SUPPORTS
  183. C
  184. C     3)  ALTHOUGH THE DISTRIBUTION VERSION OF PASS-2 ASSUMES A
  185. C        MINIMUM OF 31 BITS PER WORD ON THE HOST MACHINE, BETTER
  186. C        STORAGE UTILIZATION IS OBTAINED BY ALTERING THE 'WDSIZE'
  187. C        PARAMETER IN BLOCK DATA (SECOND TO LAST LINE OF THIS PROGRAM).
  188. C        THE WDSIZE IS CURRENTLY SET TO 31 BITS (FOR THE S/360), AND
  189. C        THUS WILL EXECUTE ON ALL MACHINES WITH A LARGER WORD SIZE.  THE
  190. C        VALUE OF WDSIZE MAY BE SET TO THE NUMBER OF USABLE BITS IN
  191. C        A FORTRAN INTEGER, EXCLUDING THE SIGN BIT (E.G., ON A
  192. C        CDC 6X00, SET WDSIZE TO 44, AND ON A UNIVAC 1108, SET WDSIZE
  193. C        TO 35).  IN GENERAL, LARGER VALUES OF WDSIZE ALLOW LARGER 8080
  194. C        PROGRAMS TO BE COMPILED WITHOUT CHANGING THE SIZE OF THE
  195. C        'MEM' VECTOR.
  196. C
  197. C     4)  THE HOST FORTRAN SYSTEM MAY HAVE A LIMITATION ON THE NUMBER
  198. C         OF CONTIGUOUS COMMENT RECORDS (E.G. S/360 LEVEL G). IF SO,
  199. C         INTERSPERSE THE DECLARATION STATEMENTS INTEGER I1000, INTEGER
  200. C         I1001, ETC., AS NECESSARY TO BREAK UP THE LENGTH OF COMMENTS.
  201. C         THE SYMBOLS I1XXX ARE RESERVED FOR THIS PURPOSE.
  202. C
  203. C    THERE ARE A NUMBER OF COMPILER PARAMETERS WHICH MAY HAVE TO
  204. C    BE CHANGED FOR YOUR INSTALLATION.  THESE PARAMETERS ARE DEFINED
  205. C    BELOW (SEE 'SCANNER COMMANDS'), AND THE CORRESPONDING DEFAULT
  206. C    VALUES ARE SET FOLLOWING THEIR DEFINITION.  FOR EXAMPLE, THE
  207. C                  $RIGHTMARGIN = I
  208. C    PARAMETER DETERMINES THE RIGHT MARGIN OF THE INPUT SOURCE LINE.
  209. C    THE PARAMETER IS SET EXTERNALLY BY A SINGLE LINE STARTING WITH
  210. C    '$R' IN COLUMNS ONE AND TWO (THE REMAINING CHARACTERS UP TO
  211. C    THE '=' ARE IGNORED).  THE INTERNAL COMPILER REPRESENTATION
  212. C    OF THE CHARACTER 'R' IS 29 (SEE CHARACTER CODES BELOW), AND THUS
  213. C    THE VALUE OF THE $RIGHTMARGIN PARAMETER CORRESPONDS TO ELEMENT 29
  214. C    OF THE 'CONTRL' VECTOR.
  215. C
  216. C    1)  IF OPERATING IN  AN INTERACTIVE MODE, IT IS OFTEN
  217. C        DESIRABLE TO MINIMIZE OUTPUT FROM PASS-2.  THUS, THE FOLLOWING
  218. C        PARAMETERS ARE USUALLY SET AS DEFAULTS
  219. C               $TERMINAL   =  1
  220. C               $INPUT      =  1
  221. C               $OUTPUT     =  1
  222. C               $GENERATE   =  0
  223. C               $FINISH     =  0
  224. C
  225. C        ALL OTHER PARAMETERS ARE THEN SELECTED FROM THE CONSOLE
  226. C
  227. C    2)  IF OPERATING IN BATCH MODE, A NUMBER OF DEFAULT TOGGLES ARE
  228. C        OFTEN SET WHICH PROVIDE USEFUL INFORMATION WHEN DEBUGGING
  229. C        THE FINAL PROGRAM
  230. C               $TERMINAL   =  0
  231. C               $INPUT      =  2
  232. C               $OUTPUT     =  2
  233. C               $GENERATE   =  1 (LINE NUMBER VS. CODE LOCATIONS)
  234. C               $FINISH     =  1 (DECODE PROGRAM INTO MNEMONICS AT END)
  235. C
  236. C    3)  IF OPERATING WITH AN INTELLEC 8/80, IT MAY BE USEFUL TO SET
  237. C        THE CODE GENERATION HEADER AT 16, PAST THE MONITOR'S VARIABLES.
  238. C               $HEADER     = 16
  239. C
  240. C    RECALL, OF COURSE, THAT THE PROGRAMMER CAN ALWAYS OVERRIDE THESE
  241. C    DEFAULT TOGGLES -- THEY ARE ONLY A CONVENIENCE TO THE PROGRAMMER.
  242. C
  243. C    5)  THE CHARACTERISTICS OF THE INTERMEDIATE LANGUAGE FILES
  244. C        PRODUCED BY PASS-1 ARE MONITORED BY THE $J, $R, $U, AND
  245. C        $Z PARAMETERS.  THESE PARAMETERS CORRESPOND TO THE SOURCE
  246. C        AND WIDTH OF THE INTERMEDIATE CODE FILE ($J AND $R), AND
  247. C        SOURCE AND WIDTH OF THE INTERMEDIATE SYMBOL TABLE ($U
  248. C        AND $R).  SOME FORTRAN SYSTEMS DELETE THE LEADING CHARACTER
  249. C        OF THE FILES PRODUCED BY OTHER FORTRAN PROGRAMS.  THE $Z
  250. C        PARAMETER MAY BE USED TO READ EXTRA BLANKS AT THE BEGINNING OF
  251. C        THE INTERMEDIATE FILES IF THIS BECOMES A PROBLEM ON THE HOST
  252. C        SYSTEM.
  253. C
  254. C         UNDER NORMAL CIRCUMSTANCES, THESE PARAMETERS WILL NOT
  255. C        HAVE TO BE CHANGED.  IN ANY CASE, EXPERIMENT WITH VARIOUS
  256. C        VALUES OF THE $ PARAMETERS BY SETTING THEM EXTERNALLY BE-
  257. C        FORE ACTUALLY CHANGING THE DEFAULTS.
  258. C
  259. C    THE IMPLEMENTOR MAY ALSO WISH TO INCREASE OR DECREASE THE SIZE
  260. C    OF PASS-1 OR PASS-2 TABLES.  THE TABLES IN PASS-2 THAT MAY BE
  261. C    CHANGED IN SIZE ARE 'MEM' AND 'SYMBOL' WHICH CORRESPOND TO
  262. C    THE AREAS WHICH HOLD THE COMPILED PROGRAM AND PROGRAM SYMBOL
  263. C    ATTRIBUTES, RESPECTIVELY.  IT IS IMPOSSIBLE TO PROVIDE AN
  264. C    EXACT FORMULA WHICH RELATES THE NUMBER OF SYMBOLS HELD BY
  265. C    THE SYMBOL TABLE SINCE THE VARIOUS TYPES OF SYMBOLS REQUIRE
  266. C    DIFFERING AMOUNTS OF STORAGE IN THE TABLE.
  267. C
  268. C    1)  IN THE CASE OF THE MEM VECTOR, THE LENGTH IS DETERMINED
  269. C        BY THE WDSIZE PARAMETER AND THE LARGEST PROGRAM WHICH YOU
  270. C        WISH TO COMPILE.  THE NUMBER OF 8080 (8-BIT) WORDS WHICH ARE
  271. C        PACKED INTO EACH MEM ELEMENT IS
  272. C
  273. C                      P = WDSIZE/8
  274. C
  275. C        AND THUS THE LARGEST PROGRAM WHICH CAN BE COMPILED IS
  276. C
  277. C                      T = P * N
  278. C
  279. C        WHERE N IS THE DECLARED SIZE OF THE MEM VECTOR.  TO CHANGE
  280. C        THE SIZE OF MEM, ALTER ALL OCCURRENCES OF
  281. C
  282. C                         MEM(2500)
  283. C
  284. C        IN EACH SUBROUTINE TO MEM(N), WHERE N REPRESENTS THE NEW
  285. C        INTEGER CONSTANT SIZE.  IN ADDITION, THE 'DATA' STATEMENT
  286. C        IN BLOCK DATA (LAST PROGRAM SEGMENT) MUST BE CHANGED FOR THE
  287. C        MACRO PARAMETERS BASED UPON THE CONSTANT VALUE N TO
  288. C
  289. C          DATA WDSIZE /31/, TWO8 /256/, MAXMEM /N/
  290. C
  291. C    2)  IF THE IMPLEMENTOR WISHES TO INCREASE OR DECREASE THE SIZE
  292. C        OF THE SYMBOL TABLE, THEN ALL OCCURRENCES OF
  293. C
  294. C                          SYMBOL(3000)
  295. C
  296. C        MUST BE CHANGED TO SYMBOL(M), WHERE M IS THE DESIRED INTEGER
  297. C        CONSTANT SIZE.  THE 'DATA' STATEMENTS FOR SYMBOL TABLE PARA-
  298. C        METERS MUST ALSO BE ALTERED AS SHOWN BELOW.
  299. C
  300. C             DATA SYMAX /M/, SYTOP /0/, SYINFO /M/
  301. C
  302. C    GOOD  LUCK (AGAIN) ...
  303. C
  304. C     F  I  L  E     D  E  F  I  N  I  T  I  O  N  S
  305. C            INPUT                        OUTPUT
  306. C
  307. C     FILE   FORTRAN  MTS       DEFAULT   FORTRAN  MTS      DEFAULT
  308. C     NUM    I/O UNIT I/O UNIT  FDNAME    I/O UNIT I/O UNIT FDNAME
  309. C
  310. C      1       1      GUSER     *MSOURCE*   11     SERCOM   *MSINK*
  311. C      2       2      SCARDS    *SOURCE*    12     SPRINT   *SINK*
  312. C      3       3      3                     13     13
  313. C      4       4      4         -PLM16##    14     14
  314. C      5       5      5                     15     15
  315. C      6       6      6                     16     16
  316. C      7       7      7         -PLM17##    17     SPUNCH   -LOAD
  317. C
  318. C
  319. C   ALL INPUT RECORDS ARE 80 CHARACTERS OR LESS.  ALL
  320. C   OUTPUT RECORDS ARE 120 CHARACTERS OR LESS.
  321. C   THE FORTRAN UNIT NUMBERS CAN BE CHANGED IN THE
  322. C   SUBROUTINES GNC AND WRITEL (THESE ARE THE ONLY OC-
  323. C   CURRENCES OF REFERENCES TO THESE UNITS).
  324. C
  325. C
  326. C
  327. C    0 1 2 3 4 5 6 7 8 9
  328. C    0 0 0 0 0 0 0 0 1 1
  329. C    2 3 4 5 6 7 8 9 0 1
  330. C
  331. C
  332. C    $ = . / ( ) + - ' * , < > : ;
  333. C    3 3 4 4 4 4 4 4 4 4 4 4 5 5 5
  334. C    8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
  335. C
  336. C    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  337. C    1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
  338. C    2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
  339. C
  340. C
  341. C  SEQNO               SUB/FUNC NAME
  342. C  16280000      SUBROUTINE INITAL
  343. C  16560000      INTEGER FUNCTION GET(IP)
  344. C  16740000      SUBROUTINE PUT(IP,X)
  345. C  16960000      INTEGER FUNCTION ALLOC(I)
  346. C  17150000      FUNCTION ICON(I)
  347. C  17340000      INTEGER FUNCTION GNC(Q)
  348. C  18690000      FUNCTION IMIN(I,J)
  349. C  18760000      SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH)
  350. C  19040000      SUBROUTINE WRITEL(NSPACE)
  351. C  19580000      SUBROUTINE CONOUT(CC,K,N,BASE)
  352. C  19900000      SUBROUTINE PAD(CC,CHR,I)
  353. C  20010000      SUBROUTINE ERROR(I,LEVEL)
  354. C  20310000      INTEGER FUNCTION SHR(I,J)
  355. C  20350000      INTEGER FUNCTION SHL(I,J)
  356. C  20390000      INTEGER FUNCTION RIGHT(I,J)
  357. C  20430000      SUBROUTINE DELETE(N)
  358. C  20680000      SUBROUTINE APPLY(OP,OP2,COM,CYFLAG)
  359. C  23380000      SUBROUTINE GENREG(NP,IA,IB)
  360. C  24400000      SUBROUTINE LOADSY
  361. C  26100000      SUBROUTINE LOADV(IS,TYPV)
  362. C  28330000      SUBROUTINE SETADR(VAL)
  363. C  28790000      SUBROUTINE USTACK
  364. C  28900000      INTEGER FUNCTION CHAIN(SY,LOC)
  365. C  29070000      SUBROUTINE GENSTO(KEEP)
  366. C  30880000      SUBROUTINE LITADD(S)
  367. C  32120000      SUBROUTINE DUMP(L,U,FA,FE)
  368. C  33080000      INTEGER FUNCTION DECODE(CC,I,W)
  369. C  34540000      SUBROUTINE EMIT(OPR,OPA,OPB)
  370. C  36950000      SUBROUTINE PUNCOD(LB,UB,MODE)
  371. C  38010000      SUBROUTINE CVCOND(S)
  372. C  38730000      SUBROUTINE SAVER
  373. C  40000000      SUBROUTINE RELOC
  374. C  41970000      SUBROUTINE LOADIN
  375. C  42770000      SUBROUTINE EMITBF(L)
  376. C  43510000      SUBROUTINE INLDAT
  377. C  44780000      SUBROUTINE UNARY(IVAL)
  378. C  45950000      SUBROUTINE EXCH
  379. C  46690000      SUBROUTINE STACK(N)
  380. C  46790000      SUBROUTINE READCD
  381. C  52230000      SUBROUTINE OPERAT(VAL)
  382. C  66220000      SUBROUTINE SYDUMP
  383. C
  384. C     GLOBAL VARIABLES
  385.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  386.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  387.       INTEGER CONTRL(64)
  388.       COMMON /CNTRL/CONTRL
  389.       INTEGER TITLE(10),VERS
  390.       COMMON/TITLES/TITLE,VERS
  391.       INTEGER TERR(22)
  392.       LOGICAL ERRFLG
  393.       COMMON/TERRR/TERR,ERRFLG
  394.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  395.      1    ITRAN(256),OTRAN(64)
  396.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  397.      1    ITRAN,OTRAN
  398.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  399.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  400.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  401.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  402.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  403.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  404.       INTEGER MSSG(77)
  405.       COMMON/MESSG/MSSG
  406.       INTEGER CODLOC,ALTER,CBITS(43)
  407.       COMMON /CODE/CODLOC,ALTER,CBITS
  408. C
  409.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  410.      1    SP,MAXSP,INTBAS
  411.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  412.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  413.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  414.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  415.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  416.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  417.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  418.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  419.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  420.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  421.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  422.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  423.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  424.       INTEGER VARB,INTR,PROC,LABEL,LITER
  425.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  426.       INTEGER GNC
  427. C     INITIALIZE MEMORY
  428.       CALL INITAL
  429. C     THE FOLLOWING SCANNER COMMANDS ARE DEFINED
  430. C     ANALYSIS         (12)
  431. C     BPNF             (13)
  432. C     COUNT = I        (14)
  433. C     DELETE = I       (15)
  434. C     EOF              (16)
  435. C     FINISH           (17)  DUMP CODE AT FINISH
  436. C     GENERATE         (18)
  437. C     HEADER           (19)
  438. C     INPUT = I        (20)
  439. C     JFILE (CODE)= I  (21)
  440. C     LEFTMARGIN = I   (23)
  441. C     MAP              (24)
  442. C     NUMERIC (EMIT)   (25)
  443. C     OUTPUT = I       (26)
  444. C     PRINT (T OR F)   (27)
  445. C     QUICKDUMP = N    (28)  HEXADECIMAL DUMP
  446. C     RIGHTMARG = I    (29)
  447. C     SYMBOLS          (30)
  448. C     TERMINAL         (31) (0=BATCH, 1=TERM, 2=INTERLIST)
  449. C     USYMBOL = I      (32)
  450. C     VARIABLES        (33)
  451. C     WIDTH = I        (34)
  452. C     YPAD = N         (36)  BLANK PAD ON OUTPUT
  453. C     ZMARGIN = I      (37)  SETS LEFT MARGIN FOR I.L.
  454. C     * = N            (47)  0 - COMPILER HANDLES STACK POINTER
  455. C                            1 - PROGRAMMER HANDLES  STACK POINTER
  456. C                            N > 1 (MOD 65536) N IS BASE VALUE OF SP
  457. C
  458. C     CONTRL(1) HOLDS THE ERROR COUNT
  459.       DO 2 I=1,64
  460. 2     CONTRL(I) = -1
  461.       CONTRL(1) = 0
  462.       CONTRL(12) = 0
  463.       CONTRL(13) = 7
  464.       CONTRL(14) = 0
  465.       CONTRL(15) = 120
  466.       CONTRL(16) = 0
  467.       CONTRL(17) = 1
  468.       CONTRL(18) = 1
  469.       CONTRL(19) = 0
  470.       CONTRL(20) = 1
  471.       CONTRL(21) = 4
  472.       CONTRL(23) = 1
  473.       CONTRL(24) = 1
  474.       CONTRL(25) = 0
  475.       CONTRL(26) = 2
  476.       CONTRL(27) = 0
  477.       CONTRL(28) = 1
  478.       CONTRL(29) = 73
  479.       CONTRL(30) = 0
  480.       CONTRL(31) = 1
  481.       CONTRL(32) = 7
  482.       CONTRL(33) = 0
  483.       CONTRL(34) = 120
  484.       CONTRL(36) = 1
  485.       CONTRL(37) = 2
  486.       CONTRL(47) = 0
  487. C
  488.           DO 8 I=1,256
  489.           ITRAN(I) = 1
  490. 8         CONTINUE
  491. C
  492.           DO 5 I=53,64
  493.           OTRAN(I) = OTRAN(1)
  494. 5         CONTINUE
  495. C
  496.           DO 10 I=1,52
  497.           J = OTRAN(I)
  498.           J = ICON(J)
  499. 10        ITRAN(J) = I
  500.       CALL CONOUT(0,4,8080,10)
  501.       CALL PAD(1,1,1)
  502.       CALL FORM(1,TITLE,1,10,10)
  503.       CALL CONOUT(1,1,VERS/10,10)
  504.       CALL PAD(1,40,1)
  505.       CALL CONOUT(1,1,MOD(VERS,10),10)
  506.       CALL WRITEL(1)
  507.       I = GNC(0)
  508. C     CHANGE MARGINS FOR READING INTERMEDIATE LANGUAGE
  509.       CONTRL(23) = CONTRL(37)
  510.       CALL WRITEL(0)
  511.       CODLOC = CONTRL(19)
  512.       CALL LOADSY
  513.       CALL READCD
  514.       IF (ERRFLG) GO TO 10100
  515. C     MAKE SURE COMPILER STACK IS EMPTY
  516.       IF (SP.NE.0) CALL ERROR(144,1)
  517. C     MAKE SURE EXECUTION STACK IS EMPTY
  518.       IF (CURDEP(1).NE.0) CALL ERROR(150,1)
  519.       CALL RELOC
  520. C     MAY WANT A SYMBOL TABLE FOR THE SIMULATOR
  521.           CALL WRITEL(0)
  522.           CALL SYDUMP
  523.       IF (CONTRL(17).EQ.0) GO TO 90
  524. C         DUMP THE PREAMBLE
  525.           I = OFFSET
  526.           OFFSET = 0
  527.           IF (PREAMB.GT.0) CALL DUMP(0,PREAMB-1,16,1)
  528.           OFFSET = I
  529. C
  530. C     DUMP THE SYMBOL TABLE BY SEGMENTS UNTIL CODLOC-1
  531.       I = OFFSET + PREAMB
  532. 15    JP = 99999
  533.       JL = 0
  534. C     LOCATE NEXT INLINE DATA AT OR ABOVE I
  535.       JN = 0
  536.       NP = INTBAS+1
  537.       IF (NP.GT.SYTOP) GO TO 22
  538.           DO 20 N=NP,SYTOP
  539.           L = SYMBOL(N)
  540.           M = SYMBOL(L-1)
  541.           IF (M.LT.0) GO TO 20
  542.           IF (MOD(M,16).NE.VARB) GO TO 20
  543.           J = IABS(SYMBOL(L))
  544.           J = MOD(J,65536)
  545.           IF (J.GT.JP) GO TO 20
  546.           IF (J.LT.I) GO TO 20
  547. C         CANDIDATE AT J
  548.           K = MOD(M/16,16)
  549.           IF (K.GT.2) K = 1
  550.           K = K * (M/256)
  551.           IF (K.EQ.0) GO TO 20
  552. C         FOUND ONE AT J WITH LENGTH K BYTES
  553.           JP = J
  554.           JN = N
  555.           JL = K
  556. 20        CONTINUE
  557. 22    CONTINUE
  558. C     JP IS BASE ADDRESS OF NEXT DATA STMT, JL IS LENGTH IN BYTES
  559. C
  560.       IF (I.GE.JP) GO TO 30
  561. C     CODE IS PRINTED BELOW
  562.       L = JP-1
  563.       IF (L.GT.(CODLOC-1)) L = CODLOC-1
  564.       CALL DUMP(I,L,16,1)
  565. 30    IF (JP.GE.CODLOC) GO TO 40
  566. C     THEN THE DATA SEGMENTS
  567.       IF (CONTRL(30).EQ.0) GO TO 35
  568.       CALL PAD(0,30,1)
  569.       CALL CONOUT(1,5,JN,10)
  570. 35    CALL DUMP(JP,JP+JL-1,16,16)
  571. 40    I = JP + JL
  572.       IF (I.LT.CODLOC) GO TO 15
  573. 90    I = CODLOC
  574.       CALL LOADIN
  575.       IF (CODLOC.EQ.I) GO TO 100
  576. C     DUMP THE INITIALIZED VARIABLES
  577.       IF (CONTRL(17).NE.0) CALL DUMP(I,CODLOC-1,16,16)
  578. 100   IF (CONTRL(13).EQ.0) GO TO 9999
  579. C
  580. C     PUNCH DECK
  581.           CALL WRITEL(0)
  582.           I = CONTRL(26)
  583.           CONTRL(26) = CONTRL(13)
  584.           K = OFFSET
  585.           OFFSET = 0
  586.           IF (PREAMB.GT.0) CALL PUNCOD(0,PREAMB-1,1)
  587.           OFFSET = K
  588.           J = 2
  589.           IF (PREAMB.EQ.0) J = 3
  590.           CALL PUNCOD(OFFSET+PREAMB,CODLOC-1,J)
  591.           CALL PAD(0,1,1)
  592. C         WRITE A $
  593.           CALL PAD(1,38,1)
  594.           CALL WRITEL(0)
  595.           CONTRL(26) = I
  596. C
  597. 9999  CONTINUE
  598. C     WRITE ERROR COUNT
  599.       J = CONTRL(26)
  600.       K = J
  601. 10000 CONTINUE
  602.       CALL WRITEL(0)
  603.       CONTRL(26) = J
  604.       I = CONTRL(1)
  605.       IF (I.EQ.0) CALL FORM(0,MSSG,6,7,77)
  606.       IF (I.NE.0) CALL CONOUT(2,-5,I,10)
  607.       CALL PAD(1,1,1)
  608.       CALL FORM(1,MSSG,8,20,77)
  609.       IF (I.NE.1) CALL PAD(1,30,1)
  610.       CALL PAD(0,1,1)
  611.       CALL WRITEL(0)
  612. C     CHECK FOR TERMINAL CONTROL OF A BATCH JOB
  613.       IF ((J.EQ.1).OR.(CONTRL(31).EQ.0)) GO TO 10100
  614. C     ARRIVE HERE IF TERMINAL TOGGLE GT 0, AND OUTPUT NOT CONSOLE
  615.       J = 1
  616.       GO TO 10000
  617. 10100 CONTINUE
  618.       STOP
  619.       END
  620.       SUBROUTINE INITAL
  621.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  622.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  623.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  624.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  625.       INTEGER I,J,K
  626.       WFACT = WDSIZE/8
  627.       MAXVM = MAXMEM*WFACT - 1
  628.       MEMTOP = MAXVM+1
  629.       MEMBOT =  -1
  630. C
  631.           DO 5 I=1,5
  632.           FACT(I) = 0
  633. 5         CONTINUE
  634. C
  635. C
  636.       FACT(WFACT) = 1
  637.       J= WFACT-1
  638.           DO 10 I=1,J
  639.           K = WFACT - I
  640.           FACT(K) = FACT(K+1) * TWO8
  641. 10        CONTINUE
  642. C
  643.           DO 15 I=1,MAXMEM
  644.           MEM(I) = 0
  645. 15        CONTINUE
  646.       RETURN
  647.       END
  648.       INTEGER FUNCTION GET(IP)
  649.       INTEGER I,IP
  650.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  651.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  652.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  653.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  654.       INTEGER J,K
  655.       I = IP - OFFSET
  656.       J = I/WFACT+1
  657.       IF (J .GT. MAXMEM) GO TO 9999
  658.       J = MEM(J)
  659.       K = MOD(I,WFACT)+1
  660.       GET = MOD(J/FACT(K),TWO8)
  661.       RETURN
  662. 9999  GET = 0
  663.       CALL ERROR(101,5)
  664.       RETURN
  665.       END
  666.       SUBROUTINE PUT(IP,X)
  667.       INTEGER I,IP,X
  668.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  669.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  670.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  671.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  672.       I = IP - OFFSET
  673.       J = I/WFACT+1
  674.       IF (J .GT. MAXMEM) GO TO 9999
  675.       M = MEM(J)
  676.       K = MOD(I,WFACT)+1
  677.       MH = 0
  678.       IF (K .EQ. 1) GO TO 10
  679.       IFACT = FACT(K-1)
  680.       MH = (M/IFACT)*IFACT
  681. 10    IFACT = FACT(K)
  682.       M = MOD(M,IFACT)
  683.       MEM(J) = MH +X*IFACT+M
  684.       RETURN
  685. 9999  CALL ERROR(102,5)
  686.       RETURN
  687.       END
  688.       INTEGER FUNCTION ALLOC(I)
  689.       INTEGER I
  690.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  691.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  692.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  693.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  694.       IF (I .LT. 0) GO TO 10
  695. C     ALLOCATION IS FROM BOTTOM
  696.       ALLOC = MEMBOT + OFFSET + 1
  697.       MEMBOT = MEMBOT + I
  698.       IF (MEMBOT .GT. MEMTOP) CALL ERROR(103,5)
  699.       RETURN
  700. C
  701. C     ALLOCATION IS FROM TOP
  702. 10    MEMTOP=MEMTOP + I
  703.       IF (MEMTOP .LE. MEMBOT) CALL ERROR(104,5)
  704.       ALLOC = MEMTOP + OFFSET
  705.       RETURN
  706.       END
  707.       FUNCTION ICON(I)
  708.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  709.      1    ITRAN(256),OTRAN(64)
  710.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  711.      1    ITRAN,OTRAN
  712. C     ICON IS CALLED WITH AN INTEGER VARIABLE I WHICH CONTAINS A
  713. C     CHARACTER READ WITH AN A1 FORMAT.  ICON MUST REDUCE THIS CHARACTER
  714. C     TO A VALUE SOMEWHERE BETWEEN 1 AND 256.  NORMALLY, THIS WOULD BE
  715. C     ACCOMPLISHED BY SHIFTING THE CHARACTER TO THE RIGHTMOST BIT POSI-
  716. C     TIONS OF THE WORD AND MASKING THE RIGHT 8 BITS.  IT IS DONE RATHER
  717. C     INEFFICIENTLY HERE, HOWEVER, TO GAIN SOME MACHINE INDEPENDENCE.
  718.         DO 100 K=1,52
  719.         J = K
  720.         IF (I .EQ. OTRAN(K)) GO TO 200
  721. 100   CONTINUE
  722.         J = 1
  723. 200   ICON = J
  724.       RETURN
  725.       END
  726.       INTEGER FUNCTION GNC(Q)
  727. C     GET NEXT CHARACTER FROM THE INPUT STREAM (OR 0 IF
  728. C     NO CHARACTER IS FOUND)
  729. C
  730.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  731.      1    ITRAN(256),OTRAN(64)
  732.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  733.      1    ITRAN,OTRAN
  734.       INTEGER CONTRL(64)
  735.       COMMON /CNTRL/CONTRL
  736.       INTEGER Q
  737.       IF (IBP .LE. CONTRL(29)) GO TO 200
  738. C     READ ANOTHER RECORD FROM COMMAND STREAM
  739.       IF (CONTRL(31) .EQ. 0) GO TO 1
  740.       IF (CONTRL(20).NE.1) GO TO 1
  741. C     INPUT IS FROM TERMINAL, SO GET RID OF LAST LINE
  742.           CALL PAD(0,1,1)
  743.           CALL WRITEL(0)
  744. 1     IFILE = CONTRL(20)
  745.       IF (CONTRL(16) .EQ. 1) GO TO 999
  746. 10    READ(IFILE,1000) IBUFF
  747. 100       DO 110 I=1,80
  748.           J = IBUFF(I)
  749.           J = ICON(J)
  750.           IBUFF(I) = ITRAN(J)
  751. 110       CONTINUE
  752. C
  753.       LP = CONTRL(23)
  754.       IF (IBUFF(LP).EQ.38) GO TO 300
  755. 115   IBP = LP
  756.       IF (CONTRL(27).EQ.0) GO TO 200
  757.       IF (CONTRL(23) .EQ. 1) GO TO 120
  758.       CALL FORM(1,IBUFF,1,CONTRL(23)-1,80)
  759.       CALL PAD(1,1,3)
  760. 120   CALL FORM(1,IBUFF,CONTRL(23),CONTRL(29),80)
  761.       IF(CONTRL(29) .EQ. 80) GO TO 130
  762.       CALL PAD(1,1,3)
  763.       CALL FORM(1,IBUFF,CONTRL(29)+1,80,80)
  764. 130   CONTINUE
  765. 200   GNC = IBUFF(IBP)
  766.       IBP = IBP + 1
  767.       RETURN
  768. 300   CONTINUE
  769.       IF(IBUFF(2) .EQ. 1) GO TO 115
  770. C     SCANNER PARAMETERS FOLLOW
  771.       LP = LP + 1
  772. 305   J = IBUFF(LP)
  773.       IF (J.EQ.38) GO TO 400
  774.       LP = LP + 1
  775. C
  776.           DO 310 I=LP,80
  777.           II = I
  778.           IF (IBUFF(I) .EQ. 39) GO TO 330
  779.           IF (IBUFF(I).EQ.38) GO TO 315
  780. 310       CONTINUE
  781. C
  782. 315   K = CONTRL(J)
  783.       IF (K .GT. 1) GO TO 320
  784.       CONTRL (J) = 1-K
  785.       GO TO 325
  786. 320   CALL ERROR(105,1)
  787. 325   IF (II.EQ.80) GO TO 1
  788.       LP = II + 1
  789.       GO TO 305
  790. 330   K = 0
  791.       II = II+1
  792. C
  793.           DO 340 I=II,80
  794.           L = IBUFF(I)
  795.           IF (L .LE. 1) GO TO 340
  796.           IF (L .GT. 11) GO TO 350
  797.           K = K*10+(L-2)
  798. 340       CONTINUE
  799. C
  800. 350   CONTRL(J) = K
  801. C     MAY BE MORE $ IN INPUT LINE
  802. 360   II = LP + 1
  803.           DO 370 I=II,80
  804.           LP = I
  805.           IF (IBUFF(I).EQ.38) GO TO 380
  806. 370       CONTINUE
  807. C     NO MORE $ FOUND
  808.       GO TO 1
  809. 380   LP = LP + 1
  810.       GO TO 305
  811. 400   CONTINUE
  812. C     DISPLAY $ PARAMETERS
  813.       L = 2
  814.       K = 64
  815.       LP = LP + 1
  816.       J = IBUFF(LP)
  817.       IF (J.EQ.1) GO TO 410
  818.       L = J
  819.       K = J
  820. 410   CONTINUE
  821.           DO 420 I=L,K
  822.           J = CONTRL(I)
  823.           IF (J.LT.0) GO TO 420
  824.           CALL PAD(0,38,1)
  825.           CALL PAD(1,I,1)
  826.           CALL PAD(1,39,1)
  827.           CALL CONOUT(2,-10,J,10)
  828. 420       CONTINUE
  829.           IF (CONTRL(31).NE.0) CALL PAD(0,1,1)
  830.       CALL WRITEL(0)
  831.       GO TO 360
  832. 999   GNC = 0
  833.       RETURN
  834. 1000  FORMAT(80A1)
  835.       END
  836.       FUNCTION IMIN(I,J)
  837.       IF (I .LT. J) GO TO 10
  838.       IMIN = J
  839.       GO TO 20
  840. 10    IMIN = I
  841. 20    RETURN
  842.       END
  843.       SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH)
  844. C     CC = 0 DUMP BUFFER, GO TO NEXT LINE
  845. C     CC = 1 APPEND TO CURRENT BUFFER
  846. C     CC = 2 DELETE LEADING BLANKS AND APPEND
  847.       INTEGER CHARS(LENGTH)
  848.       INTEGER CC,START,FINISH
  849.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  850.      1    ITRAN(256),OTRAN(64)
  851.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  852.      1    ITRAN,OTRAN
  853.       INTEGER CONTRL(64)
  854.       COMMON /CNTRL/CONTRL
  855.       J = START
  856.       I = CC + 1
  857.       GO TO (100,200,300),I
  858. 100   CALL WRITEL(0)
  859. 200   IF (J .GT. FINISH) GO TO 999
  860.       OBP = OBP + 1
  861.       OBUFF(OBP) = CHARS(J)
  862.       J = J + 1
  863.       IF (OBP .GE. CONTRL(34)) GO TO 100
  864.       GO TO 200
  865. 300   IF (J .GT. FINISH) GO TO 999
  866.       IF (CHARS(J) .NE. 1) GO TO 200
  867.       J = J + 1
  868.       GO TO 300
  869. 999   RETURN
  870.       END
  871.       SUBROUTINE WRITEL(NSPAC)
  872.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  873.      1    ITRAN(256),OTRAN(64)
  874.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  875.      1    ITRAN,OTRAN
  876.         INTEGER CONTRL(64),OFILE
  877.         COMMON /CNTRL/CONTRL
  878.       NSPACE=NSPAC
  879. C
  880.       NP = CONTRL(36) - 1
  881.       IF (OBP.LE.NP) GO TO 998
  882.       NBLANK = 1
  883. C
  884.           DO 5 I=1,OBP
  885.           J = OBUFF(I)
  886.           IF (J .NE. 1) NBLANK = I
  887. 5         OBUFF(I) = OTRAN(J)
  888. C
  889.       OBP = IMIN(CONTRL(15),NBLANK)
  890.       OFILE = CONTRL(26) + 10
  891. 9     CONTINUE
  892. 10      WRITE(OFILE,1000) (OBUFF(I), I=1,OBP)
  893. 11    IF(NSPACE.LE.0) GO TO 998
  894. C
  895.       DO 12 I=1 , OBP
  896. 12    OBUFF(I)=OTRAN(1)
  897.       NSPACE=NSPACE-1
  898.       GO TO 9
  899. 998   IF (NP.LE.0) GO TO 997
  900.           DO 999 I=1,NP
  901. 999       OBUFF(I) = 1
  902. 997   OBP = NP
  903.       RETURN
  904. 1000    FORMAT (1H ,121A1)
  905. 1001    FORMAT(1H )
  906.         END
  907.       SUBROUTINE CONOUT(CC,K,N,BASE)
  908.       INTEGER CC,K,N,BASE,T(20)
  909.       LOGICAL ZSUP
  910.       NP = N
  911.       ZSUP = K .LT. 0
  912.       KP = IMIN (IABS(K),19)
  913. C
  914.           DO 10 I=1,KP
  915. 10        T(I) = 1
  916. C
  917.       IP = KP + 1
  918. C
  919.           DO 20 I=1,KP
  920.           LTEMP=IP-I
  921.           T(LTEMP)=MOD(NP,BASE)+2
  922.           NP = NP/BASE
  923.           IF(ZSUP .AND. (NP .EQ. 0)) GO TO 30
  924. 20        CONTINUE
  925. C
  926. 30    IF(BASE .EQ. 8) GO TO 40
  927.       IF(BASE .EQ. 2) GO TO 45
  928.       IF(BASE .NE. 16) GO TO 50
  929.       KP = KP+1
  930.       T(KP) = 19
  931.       GO TO 50
  932. 40    KP = KP+1
  933.       T(KP) = 28
  934.       GO TO 50
  935. 45     KP = KP+1
  936.       T(KP) = 13
  937. 50    CALL FORM(CC,T,1,KP,20)
  938.       RETURN
  939.       END
  940.       SUBROUTINE PAD(CC,CHR,I)
  941.       INTEGER CC,CHR,I
  942.       INTEGER T(20)
  943.       J = IMIN(I,20)
  944. C
  945.           DO 10 K=1,J
  946. 10        T(K) = CHR
  947. C
  948.       CALL FORM(CC,T,1,J,20)
  949.       RETURN
  950.       END
  951.       SUBROUTINE ERROR(I,LEVEL)
  952. C     PRINT ERROR MESSAGE - LEVEL IS SEVERITY CODE (TERMINATE AT 5)
  953.       INTEGER TERR(22)
  954.       LOGICAL ERRFLG
  955.       COMMON/TERRR/TERR,ERRFLG
  956.       INTEGER CONTRL(64)
  957.       COMMON /CNTRL/CONTRL
  958.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  959.      1    ITRAN(256),OTRAN(64)
  960.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  961.      1    ITRAN,OTRAN
  962.       INTEGER MSSG(77)
  963.       COMMON/MESSG/MSSG
  964.       CONTRL(1) = CONTRL(1) + 1
  965.       CALL PAD(0,42,1)
  966.       CALL CONOUT(1,5,CONTRL(14),10)
  967.       CALL PAD(1,43,1)
  968.       CALL PAD(1,1,2)
  969.       CALL FORM(1,MSSG,16,20,77)
  970.       CALL PAD(1,1,1)
  971.       CALL CONOUT(2,-4,I,10)
  972.       CALL WRITEL(0)
  973. C     CHECK FOR SEVERE ERROR - LEVEL GREATER THAN 4
  974.       IF (LEVEL.LE.4) GO TO 999
  975. C         TERMINATE COMPILATION
  976.           CALL FORM(0,TERR,1,22,22)
  977.           CALL WRITEL(0)
  978.           ERRFLG = .TRUE.
  979. 999   RETURN
  980.       END
  981.       INTEGER FUNCTION SHR(I,J)
  982.       SHR = I/(2**J)
  983.       RETURN
  984.       END
  985.       INTEGER FUNCTION SHL(I,J)
  986.       SHL = I*(2**J)
  987.       RETURN
  988.       END
  989.       INTEGER FUNCTION RIGHT(I,J)
  990.       RIGHT = MOD(I,2**J)
  991.       RETURN
  992.       END
  993.       SUBROUTINE DELETE(N)
  994.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  995.      1    SP,MAXSP,INTBAS
  996.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  997. C     DELETE THE TOP N ELEMENTS FROM THE STACK
  998.       DO 200 I=1,N
  999.       IF(SP.GT.0) GO TO 50
  1000.           CALL ERROR(106,1)
  1001.           GO TO 9999
  1002. 50    I1 = RASN(SP)
  1003.       I1 = MOD(I1,256)
  1004.       I2 = MOD(I1,16)
  1005.       I1 = I1/16
  1006.       JP = REGS(1)
  1007.       IF (I1.EQ.0) GO TO 100
  1008.           IF (JP.EQ.I1) REGS(1) = 0
  1009.           LOCK(I1) = 0
  1010.           REGS(I1) = 0
  1011. 100   IF(I2.EQ.0) GO TO 200
  1012.           IF (JP.EQ.I2) REGS(1) = 0
  1013.           LOCK(I2) = 0
  1014.           REGS(I2) = 0
  1015. 200   SP = SP - 1
  1016. 9999  RETURN
  1017.       END
  1018.       SUBROUTINE APPLY(OP,OP2,COM,CYFLAG)
  1019.       INTEGER OP,COM,CYFLAG,OP2
  1020. C     APPLY OP TO TOP ELEMENTS OF STACK
  1021. C     USE OP2 FOR HIGH ORDER BYTES IF DOUBLE BYTE OPERATION
  1022. C     COM = 1 IF COMMUTATIVE OPERATOR, 0 OTHERWISE
  1023. C     CYFLAG = 1 IF THE CARRY IS INVOLVED IN THE OPERATION
  1024.       INTEGER CODLOC,ALTER,CBITS(43)
  1025.       COMMON /CODE/CODLOC,ALTER,CBITS
  1026.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  1027.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  1028.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  1029.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1030.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1031.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1032.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1033.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1034.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  1035.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1036.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1037.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1038.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1039.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1040.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  1041.      1    SP,MAXSP,INTBAS
  1042.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  1043. C
  1044. C     MAY WANT TO CLEAR THE CARRY FOR THIS OPERATION
  1045. C
  1046. C     CHECK FOR ONE OF THE OPERANDS IN THE STACK (ONLY ONE CAN BE THERE)
  1047. C
  1048.       I = SP-1
  1049.       IP = 0
  1050.           DO 90 J=I,SP
  1051.           IF ((ST(J).NE.0).OR.(RASN(J).NE.0).OR.(LITV(J).GE.0)) GO TO 90
  1052. C
  1053. C         OPERAND IS STACKED
  1054.           CALL GENREG(-2,IA,IB)
  1055.           REGS(IA) = J
  1056.           IF (IP.NE.0) CALL ERROR(152,1)
  1057.           IP = IB
  1058.           IF (PREC(J).GT.1) GO TO 80
  1059. C
  1060. C     SINGLE PRECISION RESULT
  1061.       IB = 0
  1062.       GO TO 85
  1063. C
  1064. C
  1065. C         DOUBLE BYTE OPERAND
  1066. 80        REGS(IB) = J
  1067. C
  1068. 85        RASN(J) = IB*16+IA
  1069.           CALL EMIT(POP,IP,0)
  1070.           CALL USTACK
  1071. 90        CONTINUE
  1072. C
  1073. C     MAKE A QUICK CHECK FOR POSSIBLE ACCUMULATOR MATCH
  1074. C     WITH THE SECOND OPERAND
  1075.       IA = RASN(SP)
  1076.       IF (IA.GT.255) CALL CVCOND(SP)
  1077.       IB = RASN(SP-1)
  1078.       IF (IB.GT.255) CALL CVCOND(SP-1)
  1079.       L = REGS(1)
  1080.       IF ((IA*IB*L*COM).EQ.0) GO TO 100
  1081. C     COMMUTATIVE OPERATOR, ONE MAY BE IN THE ACCUMULATOR
  1082.       IF (L.NE.MOD(IA,16)) GO TO 100
  1083. C     SECOND OPERAND IN GPR'S, L.O. BYTE IN ACCUMULATOR
  1084.       CALL EXCH
  1085. C
  1086. 100   IA = 0
  1087.       IB = 0
  1088. C     IS OP1 IN GPR'S
  1089. C
  1090.       L = RASN(SP-1)
  1091.       IF (L.EQ.0) GO TO 140
  1092. C     REG ASSIGNED, LOCK REGS CONTAINING VAR
  1093.       I = MOD(L,16)
  1094.       IF (I.EQ.0) GO TO 9990
  1095.       IA = I
  1096.       LOCK(I) = 1
  1097.       I = L/16
  1098.       IF (I.EQ.0) GO TO 110
  1099.           IB = I
  1100.           LOCK(I) = 1
  1101. C
  1102. C     MAY HAVE TO GENERATE ONE FREE REG
  1103. 110   IF (PREC(SP-1).GE.PREC(SP)) GO TO 120
  1104.       IB = IA - 1
  1105. C
  1106. C     FORCE LOW-ORDER BYTE INTO ACCUMULATOR
  1107. 120   CONTINUE
  1108. C     CHECK FOR PENDING REGISTER STORE
  1109.       JP = REGS(1)
  1110.       IF (JP.EQ.IA) GO TO 200
  1111.       IF (JP.NE.0) CALL EMIT(LD,JP,RA)
  1112.       REGS(1) = IA
  1113.       CALL EMIT(LD,RA,IA)
  1114.       GO TO 200
  1115. C
  1116. C     IS OP2 IN GPR'S
  1117. 140   L = RASN(SP)
  1118.       IF (L.EQ.0) GO TO 200
  1119. C     YES - CAN WE EXCHANGE AND TRY AGAIN
  1120. C     AFTER INSURING THAT A LITERAL HAS NO REGS ASSIGNED
  1121.       LITV(SP) = -1
  1122.       IF (COM.EQ.0) GO TO 200
  1123. 150   CALL EXCH
  1124.       GO TO 100
  1125. C
  1126. C     OP2 NOT IN GPR'S OR OP IS NOT COMMUTATIVE
  1127. C     CHECK FOR LITERAL VALUE - IS OP2 LITERAL
  1128. 200   K = LITV(SP)
  1129.       IF (K.LT.0) GO TO 280
  1130. C
  1131.       IF ((PREC(SP).GT.1).OR.(PREC(SP-1).GT.1)) GO TO 300
  1132. C     MAKE SPECIAL CHECK FOR POSSIBLE INCREMENT OR DECREMENT
  1133.       IF (K.NE.1) GO TO 300
  1134. C         MUST BE ADD OR SUBTRACT WITHOUT CARRY
  1135.           IF ((OP.NE.AD).AND.(OP.NE.SU)) GO TO 300
  1136. C         FIRST OPERAND MUST BE SINGLE BYTE VARIABLE
  1137.           IF (PREC(SP-1).NE.1) GO TO 300
  1138.           IF (IA.GT.1) GO TO 230
  1139. C         OP1 MUST BE IN MEMORY, SO LOAD INTO GPR
  1140.               CALL LOADV(SP-1,0)
  1141.               L = RASN(SP-1)
  1142.               IA = MOD(L,16)
  1143.               IF (IA.EQ.0) GO TO 9990
  1144. C             ...MAY CHANGE TO INR MEMORY IF STD TO OP1 FOLLOWS...
  1145.               LASTIR = CODLOC
  1146. 230       JP = IA
  1147.           IF (REGS(RA).EQ.IA) JP = RA
  1148.           IF (OP .EQ. AD) CALL EMIT (IN, JP, 0)
  1149.           IF (OP .EQ. SU) CALL EMIT (DC, JP, 0)
  1150.           GO TO 2000
  1151. C
  1152. C     OP1 NOT A LITERAL,  CHECK FOR LITERAL OP2
  1153. 280   IF(LITV(SP-1).LT.0) GO TO 300
  1154.       IF(COM.EQ.1) GO TO 150
  1155. C
  1156. C     GENERATE REGISTERS TO HOLD RESULTS IN LOADV
  1157. C     (LOADV WILL LOAD THE LOW ORDER BYTE INTO THE ACC)
  1158. 300   CALL LOADV(SP-1,1)
  1159.       L = RASN(SP-1)
  1160.       IA = MOD(L,16)
  1161.       IF (IA.EQ.0) GO TO 9990
  1162.       LOCK(IA) = 1
  1163.       IB = L/16
  1164. C
  1165. C     IS THIS A SINGLE BYTE / DOUBLE BYTE OPERATION
  1166.       IF ((IB.GT.0).OR.(PREC(SP).EQ.1)) GO TO 400
  1167. C     GET A SPARE REGISTER
  1168.           IB = IA - 1
  1169.           IF (IB.EQ.0) GO TO 9990
  1170.           LOCK(IB) = 1
  1171. C
  1172. C     NOW READY TO PERFORM OPERATION
  1173. C     L.O. BYTE IS IN AC, H.O. BYTE IS IN IB.
  1174. C     RESULT GOES TO IA (L.O.) AND IB (H.O.)
  1175. C
  1176. C     IS OP2 IN GPR'S
  1177. 400   LP = RASN(SP)
  1178.       K = -1
  1179.       IF (LP.LE.0) GO TO 500
  1180. C
  1181. C         PERFORM ACC-REG OPERATION
  1182.           CALL EMIT(OP,MOD(LP,16),0)
  1183.           GO TO 700
  1184. C
  1185. C     IS OP2 A LITERAL
  1186. 500   K = LITV(SP)
  1187.       IF (K.LT.0) GO TO 600
  1188. C
  1189. C         USE CMA IF OP IS XR AND OP2 IS LIT 255
  1190.           IF (OP.NE.XR.OR.MOD(K,256).NE.255) GO TO 550
  1191.               CALL EMIT(CMA,0,0)
  1192.               GO TO 700
  1193. 550       CONTINUE
  1194. C
  1195. C         PERFORM ACC-IMMEDIATE OPERATION
  1196.           CALL EMIT(OP,-MOD(K,256),0)
  1197.           GO TO 700
  1198. C
  1199. C     OP2 IS IN MEMORY - SETUP ADDRESS
  1200. 600   CONTINUE
  1201.       CALL LOADV(SP,2)
  1202. C     PERFORM OPERATION WITH LOW ORDER BYTE
  1203.       CALL EMIT(OP,ME,0)
  1204. C
  1205. C     NOW PROCESS HIGH ORDER BYTE
  1206. 700   CONTINUE
  1207. C     SET UP A PENDING REGISTER STORE
  1208. C     IF THIS IS NOT A COMPARE
  1209.       IF (OP.NE.CP) REGS(1) = IA
  1210.       IF(PREC(SP).EQ.2) GO TO 3000
  1211. C     SECOND OPERAND IS SINGLE BYTE
  1212.       IF (PREC(SP-1).LT.2) GO TO 2000
  1213. C
  1214. C     MAY NOT NEED TO PERFORM OPERATIONS FOR CERTAIN OPERATORS, BUT ...
  1215. C     PERFORM OPERATION WITH H.O. BYTE OF OP1
  1216. C     OP1 MUST BE IN THE GPR'S - PERFORM DUMMY OPERATION WITH ZERO
  1217.       JP = REGS(1)
  1218.       IF (JP.EQ.0) GO TO 800
  1219.       IF (JP.EQ.IB) GO TO 850
  1220.           CALL EMIT(LD,JP,RA)
  1221.           REGS(1)= 0
  1222. 800   CALL EMIT(LD,RA,IB)
  1223. 850   CALL EMIT(OP2,0,0)
  1224. C
  1225. C     MOVE ACCUMULATOR TO GPR
  1226. 1000  CONTINUE
  1227. C     SET UP PENDING REGISTER STORE
  1228.       REGS(1) = IB
  1229. C
  1230. C     FIX STACK POINTERS AND VALUES
  1231. 2000  CONTINUE
  1232. C     SAVE THE PENDING ACCUMULATOR - REGISTER STORE
  1233.       JP = REGS(1)
  1234.       CALL DELETE(2)
  1235.       REGS(1) = JP
  1236.           SP = SP+1
  1237.           PREC(SP)=1
  1238.           RASN(SP) = IB*16 + IA
  1239.           LOCK(IA) = 0
  1240.           ST(SP) = 0
  1241.           LITV(SP) = -1
  1242.           REGS(IA) = SP
  1243.           REGV(IA) = -1
  1244.       IF (IB.LE.0) GO TO 9999
  1245.           PREC(SP)=2
  1246.           REGS(IB)=SP
  1247.           LOCK(IB)=0
  1248.           REGV(IB)=-1
  1249.       GO TO 9999
  1250. C
  1251. C     PREC OF OP2 = 2
  1252. 3000  CONTINUE
  1253. C     IS H.O. BYTE OF OP2 IN MEMORY
  1254.       IF ((K.GE.0).OR.(LP.GT.0)) GO TO 3100
  1255. C     POINT TO H.O. BYTE WITH H AND L
  1256.       CALL EMIT(IN,RL,0)
  1257.       REGV(7) = REGV(7) + 1
  1258. C
  1259. C     DO WE NEED TO PAD WITH H.O. ZERO FOR OP1
  1260. 3100  IF (PREC(SP-1).GT.1) GO TO 3200
  1261. C     IS STORE PENDING
  1262.       JP = REGS(1)
  1263.       IF (JP.EQ.0) GO TO 3150
  1264.       IF (JP.EQ.IB) GO TO 3250
  1265.           CALL EMIT(LD,JP,RA)
  1266.           REGS(1) = 0
  1267. 3150  IF (CYFLAG.EQ.0) CALL EMIT(XR,RA,0)
  1268.       IF (CYFLAG.EQ.1) CALL EMIT(LD,RA,0)
  1269.       GO TO 3250
  1270. C
  1271. C     IS H.O. BYTE OF OP2 IN GPR
  1272. 3200  CONTINUE
  1273. C     IS STORE PENDING
  1274.       JP = REGS(1)
  1275.       IF (JP.EQ.0) GO TO 3220
  1276.       IF (JP.EQ.IB) GO TO 3250
  1277.           CALL EMIT(LD,JP,RA)
  1278.           REGS(1) = 0
  1279. 3220  CALL EMIT(LD,RA,IB)
  1280. 3250  IF (LP.EQ.0) GO TO 3300
  1281. C
  1282. C     OP2 IN GPR'S - PERFORM ACC-REGISTER OPERATION
  1283.       CALL EMIT(OP2,LP/16,0)
  1284.       GO TO 1000
  1285. C
  1286. C     OP2 IS NOT IN GPR'S - IS IT A LITERAL
  1287. 3300  CONTINUE
  1288.       IF (K.LT.0) GO TO 3400
  1289. C     YES - PERFORM ACC-IMMEDIATE OPERATION
  1290. C     USE CMA IF OP1 IS XR AND OP2 IS 65535
  1291.       IF (OP2.NE.XR.OR.K.NE.65535) GO TO 3350
  1292.           CALL EMIT(CMA,0,0)
  1293.           GO TO 1000
  1294. 3350  CONTINUE
  1295.       CALL EMIT(OP2,-(K/256),0)
  1296.       GO TO 1000
  1297. C
  1298. C     PERFORM ACC-MEMORY OPERATION
  1299. 3400  CALL EMIT(OP2,ME,0)
  1300.       GO TO 1000
  1301. C
  1302. 9990  CALL ERROR(107,5)
  1303. 9999  RETURN
  1304.       END
  1305.       SUBROUTINE GENREG(NP,IA,IB)
  1306.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1307.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1308.       INTEGER CONTRL(64)
  1309.       COMMON /CNTRL/CONTRL
  1310.       INTEGER CODLOC,ALTER,CBITS(43)
  1311.       COMMON /CODE/CODLOC,ALTER,CBITS
  1312.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  1313.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  1314.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1315.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1316.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1317.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1318.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1319.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  1320.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1321.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1322.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1323.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1324.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1325.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  1326.      1    SP,MAXSP,INTBAS
  1327.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  1328.       INTEGER VARB,INTR,PROC,LABEL,LITER
  1329.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  1330. C     GENERATE N FREE REGISTERS FOR SUBSEQUENT OPERATION
  1331.       N = IABS(NP)
  1332. C     N IS NUMBER OF REGISTERS, NP NEGATIVE IF NO PUSHING ALLOWED
  1333. 10    IB = 0
  1334.       IA = 0
  1335.       IDUMP = 0
  1336. C
  1337. C     LOOK FOR FREE RC OR RE AND ALLOCATE IN PAIRS (RC/RB,RE/RD)
  1338. 100   K = RC
  1339.       IF (REGS(K).EQ.0) GO TO 200
  1340.       K = RE
  1341.       IF (REGS(K).NE.0) GO TO 9990
  1342. 200   IA = K
  1343.       IF (N.GT.1) IB = IA - 1
  1344.       GO TO 9999
  1345. C
  1346. 9990  CONTINUE
  1347.       IF (IDUMP.GT.0) GO TO 9991
  1348.       IF (NP.LT.0) GO TO 5000
  1349.       IP = 0
  1350. C     GENERATE TEMPORARIES IN THE STACK AND RE-TRY
  1351. C         SEARCH FOR LOWEST REGISTER PAIR ASSIGNMENT IN STACK
  1352.           IF (SP.LE.0) GO TO 5000
  1353.           DO 4000 I=1,SP
  1354.           K = RASN(I)
  1355.           IF (K.EQ.0) GO TO 3950
  1356.           IF (K.GT.255) GO TO 4000
  1357.           J = MOD(K,16)
  1358.           IF (LOCK(J).NE.0) GO TO 4000
  1359.           JP = K/16
  1360.           IF (JP.EQ.0) GO TO 3900
  1361. C         OTHERWISE CHECK HO REGISTER
  1362.           IF ((LOCK(JP).NE.0).OR.(JP.NE.(J-1))) GO TO 4000
  1363. 3900          IF (IP.EQ.0) IP = I
  1364.               GO TO 4000
  1365. 3950          IF ((ST(I).EQ.0).AND.(LITV(I).LT.0)) IP=0
  1366. 4000      CONTINUE
  1367.       IF (IP.EQ.0) GO TO 5000
  1368. C     FOUND ENTRY TO PUSH AT IP
  1369.       J = RASN(IP)
  1370.       JP = J/16
  1371.       J = MOD(J,16)
  1372.       REGS(J) = 0
  1373.       IF (JP.GT.0) REGS(JP) = 0
  1374. C     CHECK PENDING REGISTER STORE
  1375.       K = REGS(1)
  1376.       IF (K.EQ.0) GO TO 4500
  1377.       IF (K.EQ.J) GO TO 4200
  1378.       IF (K.NE.JP) GO TO 4500
  1379. C     STORE INTO HO REGISTER
  1380.           CALL EMIT(LD,JP,RA)
  1381.           GO TO 4400
  1382. C     PENDING STORE TO LO BYTE
  1383. 4200  CONTINUE
  1384.       CALL EMIT(LD,J,RA)
  1385. 4400  REGS(RA) = 0
  1386. C
  1387. C     FREE THE REGISTER FOR ALLOCATION
  1388. C
  1389. 4500  CALL STACK(1)
  1390.       CALL EMIT(PUSH,J-1,0)
  1391. C
  1392. C     MARK ELEMENT AS STACKED (ST=0, RASN=0)
  1393.           RASN(IP) = 0
  1394.           ST(IP) = 0
  1395.           LITV(IP) = -1
  1396. C         AND THEN TRY AGAIN
  1397.       GO TO 100
  1398. C
  1399. C     TRY FOR MEMORY STORE
  1400. 5000  CONTINUE
  1401.       IDUMP = 1
  1402.       CALL SAVER
  1403.       GO TO 100
  1404. 9991  IA = 0
  1405. 9999  RETURN
  1406.       END
  1407.       SUBROUTINE LOADSY
  1408.       INTEGER INTPRO(8)
  1409.       COMMON /INTER/INTPRO
  1410.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1411.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1412.       INTEGER VARB,INTR,PROC,LABEL,LITER
  1413.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  1414.       INTEGER ATTRIB
  1415.       INTEGER CONTRL(64)
  1416.       COMMON /CNTRL/CONTRL
  1417.       INTEGER GNC,RIGHT,SHL,SHR,SIGN
  1418. C     SAVE THE CURRENT INPUT FILE NUMBER
  1419.       M = CONTRL(20)
  1420.       CONTRL(20) = CONTRL(32)
  1421. 5     I = GNC(0)
  1422.       IF(I.EQ.1) GO TO 5
  1423. C     LOOK FOR INITIAL '/'
  1424.       IF (I.NE.41) GO TO 8000
  1425. C     LOAD THE INTERRUPT VECTOR
  1426. C
  1427. 10    I = GNC(0)
  1428.       IF (I.EQ.41) GO TO 50
  1429.       IF ((I.LT.2).OR.(I.GT.9)) GO TO 8000
  1430.       I = I - 1
  1431. C     GET THE PROCEDURE NAME CORRESPONDING TO INTERRUPT I-1
  1432.       J = 0
  1433.       L = 1
  1434. 20    K = GNC(0)
  1435.       IF (K.EQ.41) GO TO 30
  1436.       K = K - 2
  1437.       IF ((K.LT.0).OR.(K.GT.31)) GO TO 8000
  1438.       J = J + K*L
  1439.       L = L * 32
  1440.       GO TO 20
  1441. C
  1442. 30    INTPRO(I) = J
  1443.       IF (CONTRL(30).LT.2) GO TO 10
  1444.       CALL PAD(0,1,1)
  1445.       CALL PAD(1,20,1)
  1446.       CALL CONOUT(1,1,I-1,10)
  1447.       CALL PAD(1,39,1)
  1448.       CALL PAD(1,30,1)
  1449.       CALL CONOUT(1,5,J,10)
  1450.       CALL WRITEL(0)
  1451.       GO TO 10
  1452. C
  1453. C     INTERRUPT PROCEDURES ARE HANDLED.
  1454. 50    I = GNC(0)
  1455.       IF (I.EQ.1) GO TO 50
  1456. C
  1457.       IF (I.NE. 41) GO TO 8000
  1458. C
  1459. C     PROCESS NEXT SYMBOL TABLE ENTRY
  1460. 100   I = GNC(0)
  1461.       IF (I.EQ.41) GO TO 1000
  1462. C
  1463.       SYTOP = SYTOP + 1
  1464.       IF (SYTOP .LT. SYINFO) GO TO 200
  1465.           CALL ERROR(108,5)
  1466.           SYINFO = SYMAX
  1467. 200   IF (CONTRL(30).LT.2) GO TO 250
  1468. C
  1469. C     WRITE SYMBOL NUMBER AND SYMBOL TABLE ADDRESS
  1470.       CALL PAD(0,1,1)
  1471.       CALL PAD(1,30,1)
  1472.       CALL CONOUT(1,5,SYTOP,10)
  1473. 250   SYMBOL(SYTOP) = SYINFO
  1474.       SYINFO = SYINFO - 1
  1475.       ATTRIB = SYINFO
  1476. C
  1477. 300   SIGN = 0
  1478.       IF (I.EQ. 1) SIGN = 1
  1479.       IF (I.EQ. 45) SIGN = -1
  1480.       IF (SIGN.EQ.0) GO TO 8000
  1481. C
  1482.       L = 1
  1483.       K = 0
  1484. 400   I = GNC(0)
  1485.       IF ((I.GE.2).AND.(I.LE.33)) GO TO 600
  1486. C
  1487. C     END OF NUMBER
  1488.       IF (SYINFO .GT. SYTOP) GO TO 500
  1489.           CALL ERROR(109,5)
  1490.           SYINFO = SYMAX
  1491. 500   IF (CONTRL(30).LT.2) GO TO 550
  1492. C
  1493. C     WRITE SYMBOL TABLE ADDRESS AND ENTRY
  1494.       CALL PAD(0,1,4)
  1495.       CALL CONOUT(1,5,SYINFO,10)
  1496.       CALL PAD(1,1,1)
  1497.       KP = 1
  1498.       IF (SIGN.EQ.-1) KP = 45
  1499.       CALL PAD(1,KP,1)
  1500.       CALL CONOUT(1,8,K,16)
  1501. 550   SYMBOL(SYINFO) = SIGN * K
  1502.       SYINFO = SYINFO - 1
  1503. C     LOOK FOR '/'
  1504.       IF (I.NE.41) GO TO 300
  1505. C     CHECK FOR SPECIAL CASE AT END OF AN ENTRY
  1506.       ATTRIB = IABS(SYMBOL(ATTRIB))
  1507.       I = MOD(ATTRIB,16)
  1508.       IF ((I.EQ.PROC).OR.(I.EQ.VARB)) GO TO 545
  1509.       IF (I.NE.LABEL) GO TO 100
  1510. C     CHECK FOR SINGLE REFERENCE TO THE LABEL
  1511.       J = ATTRIB/256
  1512.       IF (J.NE.1) GO TO 100
  1513. C     ALLOCATE A CELL AND SET TO ZERO
  1514. C     ARRIVE HERE WITH PROC, VARB, OR SINGLE REF LABEL
  1515. 545   SYMBOL(SYINFO) = 0
  1516.       SYINFO = SYINFO - 1
  1517.       IF (I.NE.PROC) GO TO 100
  1518. C     RESERVE ADDITIONAL CELL FOR STACK DEPTH COUNT
  1519.       I = 0
  1520.       GO TO 545
  1521. C
  1522. C
  1523. C     GET NEXT DIGIT
  1524. 600   K = (I-2)*L + K
  1525.       L = L  * 32
  1526.       GO TO 400
  1527. 1000  CONTINUE
  1528. C     ASSIGN RELATIVE MEMORY ADDRESSES TO VARIABLES IN SYMBOL TABLE
  1529.       I = SYTOP
  1530. C     65536 = 65280 + 256
  1531.       LMEM = 65280
  1532. 1100  IF (I.LE.0) GO TO 9999
  1533. C     PROCESS NEXT SYMBOL
  1534.       MP = SYMBOL(I)
  1535.       L = -1
  1536.       K = SYMBOL (MP-1)
  1537. C     K CONTAINS ATTRIBUTES OF VARIABLE
  1538.       IF (K.LT.0) GO TO 1300
  1539.       IF (RIGHT(K,4).NE. 1) GO TO 1300
  1540. C     OTHERWISE TYPE IS VARB
  1541.           K = SHR(K,4)
  1542.           L = RIGHT(K,4)
  1543.           K = SHR(K,4)
  1544. C         L IS ELEMENT SIZE, K IS NUMBER OF ELEMENTS
  1545.           IF (L.LE.2) GO TO 1150
  1546. C         PROBABLY AN INLINE DATA VARIABLE
  1547.           L = -1
  1548.           GO TO 1300
  1549. 1150  IF ((MOD(LMEM,2).EQ.1).AND.(L.EQ.2)) LMEM = LMEM - 1
  1550. C     MEM IS AT THE PROPER BOUNDARY NOW
  1551.       LMEM = LMEM - L*K
  1552.       IF (LMEM.GE.0) GO TO 1200
  1553.           CALL ERROR(110,1)
  1554.           LMEM = 65280
  1555. 1200  L = LMEM
  1556.       IF (CONTRL(30).EQ.0) GO TO 1300
  1557.       IF(I.LE.4.OR.I.EQ.6) GO TO 1300
  1558. C     WRITE OUT ADDRESS ASSIGNMENT
  1559.           CALL PAD(0,1,1)
  1560.           CALL PAD(1,30,1)
  1561.           CALL CONOUT(1,5,I,10)
  1562.           CALL PAD(1,39,1)
  1563.           CALL CONOUT(1,5,L,10)
  1564. 1300  SYMBOL(MP) = L
  1565.       I = I - 1
  1566.       GO TO 1100
  1567. C
  1568. 8000  CALL ERROR(111,1)
  1569. 9999  CONTINUE
  1570. C     NOW ASSIGN THE LAST ADDRESS TO THE VARIABLE 'MEMORY'
  1571. C     ** NOTE THAT 'MEMORY' MUST BE AT LOCATION 5 IN THE SYMBOL TABLE **
  1572.       I = SYMBOL(5)
  1573.       SYMBOL(I) = 65280
  1574.       IF (CONTRL(30).NE.0) CALL WRITEL(0)
  1575.       CONTRL(20) = M
  1576.       RETURN
  1577.       END
  1578.       SUBROUTINE LOADV(IS,TYPV)
  1579.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1580.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1581.       INTEGER S,TYP,TYPV
  1582. C     LOAD VALUE TO REGISTER IF NOT A LITERAL
  1583. C     TYP = 1 IF CALL FROM 'APPLY' IN WHICH CASE THE L.O. BYTE IS
  1584. C     LOADED INTO THE ACCUMULATOR INSTEAD OF A GPR.
  1585. C     IF TYP = 2, THE ADDRESS IS LOADED, BUT THE VARIABLE IS NOT.
  1586. C     IF TYP = 3, A DOUBLE BYTE (ADDRESS) FETCH IS FORCED.
  1587. C     IF TYP = 4 THEN DO A QUICK LOAD INTO H AND L
  1588. C     IF TYP = 5, A DOUBLE BYTE QUICK LOAD INTO H AND L IS FORCED
  1589.       INTEGER CONTRL(64)
  1590.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  1591.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  1592.       COMMON /CNTRL/CONTRL
  1593.       INTEGER CODLOC,ALTER,CBITS(43)
  1594.       COMMON /CODE/CODLOC,ALTER,CBITS
  1595.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  1596.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1597.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1598.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1599.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1600.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1601.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  1602.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1603.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1604.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1605.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1606.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1607.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  1608.      1    SP,MAXSP,INTBAS
  1609.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  1610.       INTEGER VARB,INTR,PROC,LABEL,LITER
  1611.       INTEGER CHAIN
  1612.       I = 0
  1613.       S = IS
  1614.       TYP = TYPV
  1615.       IF (TYP.EQ.2) GO TO 100
  1616. C
  1617.       IF (RASN(S).GT.255) CALL CVCOND(S)
  1618.       IF (TYP.EQ.4.OR.TYP.EQ.5) GO TO 3000
  1619.       IF (RASN(S).GT.0) GO TO 9999
  1620. C     CHECK FOR PREVIOUSLY STACKED VALUE
  1621.       IF ((ST(S).NE.0).OR.(LITV(S).GE.0)) GO TO 40
  1622.       CALL GENREG(2,K,I)
  1623. C     CHECK TO ENSURE THE STACK IS IN GOOD SHAPE
  1624.       I = S + 1
  1625. 10    IF (I.GT.SP) GO TO 30
  1626.       IF((ST(I).NE.0).OR.(RASN(I).NE.0).OR.(LITV(I).GE.0)) GO TO 20
  1627. C         FOUND ANOTHER STACKED VALUE
  1628.           CALL ERROR(147,1)
  1629. 20    I = I + 1
  1630.       GO TO 10
  1631. 30    CONTINUE
  1632. C     AVAILABLE CPU REGISTER IS BASED AT K
  1633.       CALL EMIT(POP,K-1,0)
  1634.       REGS(K) = S
  1635.       IF (PREC(SP).LT.2) GO TO 35
  1636.       REGS(K-1) = S
  1637.       K = (K-1)*16 + K
  1638. 35    RASN(S) = K
  1639. C     DECREMENT THE STACK COUNT FOR THIS LEVEL
  1640.       CALL USTACK
  1641.       GO TO 9999
  1642. C
  1643. 40    CONTINUE
  1644. C     NO REGISTERS ASSIGNED.  ALLOCATE REGISTERS AND LOAD VALUE.
  1645.       I = PREC(S)
  1646.       IF (TYP.NE.3) GO TO 50
  1647. C         FORCE A DOUBLE BYTE LOAD
  1648.           I = 2
  1649.           TYP = 0
  1650. 50    CALL GENREG(I,IA,IB)
  1651. C     IA IS LOW ORDER BYTE, IB IS HIGH ORDER BYTE.
  1652.       IF (IA.LE.0) GO TO 9990
  1653. C     OTHERWISE REGISTERS HAVE BEEN FOUND.
  1654. 100   CONTINUE
  1655. C     CHECK FOR LITERAL VALUE (IN ARITH EXP)
  1656.       L = LITV(S)
  1657.       IF ((L.GE.0).AND.(L.LE.65535)) GO TO 2000
  1658. C     OTHERWISE FETCH FROM MEMORY
  1659.       SP = SP + 1
  1660.       J = ST(S)
  1661.       CALL SETADR(J)
  1662.       CALL LITADD(SP)
  1663. C     ADDRESS OF VARIABLE IS IN H AND L
  1664.       JP = TYP+1
  1665.       GO TO (200,300,1000), JP
  1666. C     CALL FROM GENSTO (TYP = 0)
  1667. 200   CALL EMIT(LD,IA,ME)
  1668.       GO TO 400
  1669. C     CALL FROM APPLY TO LOAD VALUE OF VARIABLE
  1670. 300   JP = REGS(1)
  1671. C     CHECK FOR PENDING REGISTER STORE
  1672.       IF (JP.EQ.0) GO TO 350
  1673. C     HAVE TO STORE ACC INTO REGISTER BEFORE RELOADING
  1674.       CALL EMIT(LD,JP,RA)
  1675.       REGS(1) = 0
  1676. 350   CALL EMIT(LD,RA,ME)
  1677. C
  1678. C     CHECK FOR DOUBLE BYTE VARIABLE
  1679. 400   IF (I.LE.1) GO TO 1000
  1680. C     LOAD HIGH ORDER BYTE
  1681.       CALL EMIT(IN,RL,0)
  1682.       REGV(7) = REGV(7) + 1
  1683.       CALL EMIT(LD,IB,ME)
  1684. C     VALUE IS NOW LOADED
  1685. 1000  CALL DELETE(1)
  1686.       IF (TYP .EQ. 2) GO TO 9999
  1687.       RASN(S) = IB*16+IA
  1688.       IF (IB.NE.0) REGS(IB) = S
  1689.       REGS(IA) = S
  1690.       IF (IB.NE.0) REGV(IB) = -1
  1691.       REGV(IA) = - 1
  1692.       GO TO 9999
  1693. C
  1694. C     LOAD A CONSTANT INTO REGISTERS (NON-COM OPERATOR)
  1695. 2000  CONTINUE
  1696.       LP = MOD(L,256)
  1697.       REGS(IA) = S
  1698.       REGV(IA) = LP
  1699.       IF (TYP.EQ.1) GO TO 2100
  1700. C     TYP = 0, LOAD DIRECTLY INTO REGISTERS
  1701. C     MAY BE POSSIBLE TO LXI
  1702.       IF (IB.NE.(IA-1)) GO TO 2010
  1703.           CALL EMIT(LXI,IB,L)
  1704.           GO TO 2210
  1705. 2010      CALL EMIT(LD,IA,-LP)
  1706.           GO TO 2200
  1707. C
  1708. C     TYP = 1, LOAD INTO ACCUMULATOR
  1709. 2100  CONTINUE
  1710. C     CHECK FOR PENDING REGISTER STORE
  1711.       JP = REGS(1)
  1712.       IF (JP.EQ.0) GO TO 2150
  1713. C     STORE ACC INTO REGISTER BEFORE CONTINUING
  1714.           CALL EMIT(LD,JP,RA)
  1715.           REGS(1) = 0
  1716. 2150      IF (LP.EQ.0) CALL EMIT(XR,RA,0)
  1717.           IF (LP.NE.0) CALL EMIT(LD,RA,-LP)
  1718. C
  1719. 2200  IF (IB.EQ.0) GO TO 2300
  1720.           CALL EMIT(LD,IB,-L/256)
  1721. 2210  REGS(IB) = S
  1722.           REGV(IB) = -L
  1723. C
  1724. 2300  RASN(S) = IB*16+IA
  1725.       GO TO 9999
  1726. C     QUICK LOAD TO H AND L
  1727. 3000  CONTINUE
  1728.       M = LITV(S)
  1729.       I = RASN(S)
  1730.       K = ST(S)
  1731.       IF (I.NE.0) GO TO 3100
  1732.       IF (K.NE.0) GO TO 3200
  1733.       IF (M.GE.0) GO TO 3400
  1734. C
  1735. C     VALUE STACKED, SO...
  1736.           CALL USTACK
  1737.           CALL EMIT(POP,RH,0)
  1738.           IF (PREC(S).LT.2) CALL EMIT(LD,RH,0)
  1739.           GO TO 3160
  1740. C
  1741. C     REGISTERS ARE ASSIGNED
  1742. 3100  J = REGS(1)
  1743.       L = MOD(I,16)
  1744.       I = I/16
  1745.       IF ((J.NE.0).AND.(J.EQ.I)) I = RA
  1746.       IF ((J.NE.0).AND.(J.EQ.L)) L = RA
  1747.       IF ((L.NE.RE).OR.(I.NE.RD)) GO TO 3150
  1748.           CALL EMIT(XCHG,0,0)
  1749.           GO TO 3160
  1750. C     NOT IN D AND E, SO USE TWO BYTE MOVE
  1751. 3150  CALL EMIT(LD,RL,L)
  1752. C     NOTE THAT THE FOLLOWING MAY BE A LHI 0
  1753.       CALL EMIT(LD,RH,I)
  1754. 3160      REGV(RH) = -1
  1755.           REGV(RL) = -1
  1756.           GO TO 3300
  1757. C
  1758. C     VARIABLE , LITERAL  OR ADDRESS REFERENCE
  1759. 3200  IF (K.GT.0) GO TO 3250
  1760. C         ADR REF - SET H AND L WITH LITADD
  1761.           CALL LITADD(SP)
  1762.           GO TO 3300
  1763. C
  1764. C     SIMPLE VARIABLE OR LITERAL REF, MAY USE LHLD
  1765. C         MAY WANT TO CHECK FOR POSSIBLE INX OR DCX, BUT NOW...
  1766. 3250      IF (M.GE.0) GO TO 3400
  1767.           M = REGV(RH)
  1768.           L = REGV(RL)
  1769.           IF ((M.EQ.-3).AND.(-L.EQ.K)) GO TO 3260
  1770.           IF ((M.EQ.-4).AND.(-L.EQ.K)) GO TO 3255
  1771.               J = CHAIN(K,CODLOC+1)
  1772.               CALL EMIT(LHLD,J,0)
  1773.               GO TO 3260
  1774. C
  1775. 3255      CALL EMIT(DCX,RH,0)
  1776. 3260      REGV(RH) = -1
  1777.           REGV(RL) = -1
  1778.           IF (PREC(S).GT.1.OR.TYP.EQ.5) GO TO 3270
  1779. C         THIS IS A SINGLE BYTE VALUE
  1780.               CALL EMIT(LD,RH,0)
  1781.               GO TO 3300
  1782. C
  1783. 3270      REGV(RH) = -3
  1784.           REGV(RL) = -K
  1785. C
  1786. 3300  IF (RASN(S).EQ.0) RASN(S) = RH*16+RL
  1787.       GO TO 9999
  1788. C
  1789. C     LITERAL VALUE TO H L
  1790. 3400  CALL EMIT(LXI,RH,M)
  1791.       REGV(RH) = M/256
  1792.       REGV(RL) = MOD(M,256)
  1793.       GO TO 9999
  1794. C
  1795. 9990  CALL ERROR(112,5)
  1796. 9999  RETURN
  1797.       END
  1798.       SUBROUTINE SETADR(VAL)
  1799.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1800.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1801. C     SET TOP OF STACK TO ADDRESS REFERENCE
  1802.       INTEGER CODLOC,ALTER,CBITS(43)
  1803.       COMMON /CODE/CODLOC,ALTER,CBITS
  1804.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  1805.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  1806.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1807.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1808.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1809.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1810.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1811.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  1812.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1813.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1814.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1815.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1816.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1817.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  1818.      1    SP,MAXSP,INTBAS
  1819.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  1820.       INTEGER VARB,INTR,PROC,LABEL,LITER
  1821.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  1822.       ALTER = 1
  1823. C
  1824.       IF (SP .GT. MAXSP) GO TO 9999
  1825. C         MARK AS ADDRESS REFERENCE
  1826.           ST(SP) = -VAL
  1827.           I = SYMBOL(VAL)
  1828.           J = IABS(SYMBOL(I-1))
  1829.           PREC(SP) = RIGHT(SHR(J,4),4)
  1830.           I = SYMBOL(I)
  1831. C         *J=SHL(1,16)*
  1832.           J = 65536
  1833.           IF (I.GE.0) GO TO 4100
  1834.           J = 0
  1835.           I = - I
  1836. 4100      I = RIGHT(I,16)
  1837.           LITV(SP) = J + I
  1838.       RASN(SP) = 0
  1839.       RETURN
  1840. 9999  CALL ERROR(113,5)
  1841.       SP = 1
  1842.       RETURN
  1843.       END
  1844.       SUBROUTINE USTACK
  1845. C     DECREMENT CURDEP AND CHECK FOR UNDERFLOW
  1846.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  1847.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  1848.       I = CURDEP(PRSP+1)
  1849.       IF (I.GT.0) GO TO 100
  1850.           CALL ERROR(148,1)
  1851.           RETURN
  1852. 100   CURDEP(PRSP+1) = I - 1
  1853.       RETURN
  1854.       END
  1855.       INTEGER FUNCTION CHAIN(SY,LOC)
  1856.       INTEGER SY,LOC
  1857. C     CHAIN IN DOUBLE-BYTE REFS TO SYMBOL SY, IF NECESSARY
  1858.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1859.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1860.       I = SYMBOL(SY)
  1861.       J = SYMBOL(I)
  1862.       IF (J.GE.0) GO TO 100
  1863. C         ABSOLUTE ADDRESS ALREADY ASSIGNED
  1864.           CHAIN = MOD(-J,65536)
  1865.           GO TO 999
  1866. C     BACKSTUFF REQUIRED
  1867. 100       I = I - 2
  1868.           CHAIN = SYMBOL(I)
  1869.           SYMBOL(I) = LOC
  1870. 999   RETURN
  1871.       END
  1872.       SUBROUTINE GENSTO(KEEP)
  1873. C     KEEP = 0 IF STD, KEEP = 1 IF STO (VALUE RETAINED)
  1874.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  1875.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  1876.       INTEGER CONTRL(64)
  1877.       COMMON /CNTRL/CONTRL
  1878.       INTEGER CODLOC,ALTER,CBITS(43)
  1879.       COMMON /CODE/CODLOC,ALTER,CBITS
  1880.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  1881.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  1882.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1883.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1884.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1885.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1886.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1887.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  1888.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  1889.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  1890.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  1891.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  1892.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  1893.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  1894.      1    SP,MAXSP,INTBAS
  1895.       INTEGER CHAIN
  1896.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  1897.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  1898.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  1899. C     GENERATE A STORE INTO THE ADDRESS AT STACK TOP
  1900. C     LOAD VALUE IF NOT LITERAL
  1901.       L = LITV(SP-1)
  1902.       IF (L.GE.0) GO TO 100
  1903.       IQ = 0
  1904.       CALL LOADV(SP-1,IQ)
  1905. 100   I1 = RASN(SP-1)
  1906.       I2 = MOD(I1,16)
  1907.       I1 = I1/16
  1908. C     CHECK FOR PENDING REGISTER STORE
  1909.       JP = REGS(1)
  1910.       IF (JP.EQ.0) GO TO 150
  1911.       IF (JP.EQ.I1) I1 = 1
  1912.       IF (JP.EQ.I2) I2 = 1
  1913. 150   CONTINUE
  1914. C     ** NOTE THAT THIS ASSUMES 'STACKPTR' IS AT 6 IN SYM TAB
  1915.       IF (-ST(SP).EQ.6) GO TO 700
  1916.       IF (LITV(SP).LT.0) GO TO 1000
  1917. C     OTHERWISE THIS IS A LITERAL ADDRESS
  1918. C         IF POSSIBLE, GENERATE A SHLD
  1919.       IF (I1.NE.RD.OR.I2.NE.RE.OR.LASTEX.NE.CODLOC-1
  1920.      1    .OR.PREC(SP).NE.2) GO TO 155
  1921.           CALL EMIT(XCHG,0,0)
  1922.           I = IABS(ST(SP))
  1923.           J = CHAIN(I,CODLOC+1)
  1924.           CALL EMIT(SHLD,J,0)
  1925.           REGV(RH) = -3
  1926.           REGV(RL) = -I
  1927.           IF (KEEP.NE.0) CALL EMIT(XCHG,0,0)
  1928.           GO TO 600
  1929. 155   CONTINUE
  1930.       CALL LITADD(SP)
  1931. 160   CONTINUE
  1932. C     WE MAY CHANGE MOV R,M INR R MOV M,R TO INR M.
  1933. C     IF SO, AND THIS IS A NON-DESTRUCTIVE STORE, THE REGISTER
  1934. C     ASSIGNMENT MUST BE RELEASED.
  1935.       IQ = LASTIR
  1936. C     GENERATE LOW ORDER BYTE STORE
  1937.       IF (I2.EQ.0) GO TO 200
  1938.           CALL EMIT(LD,ME,I2)
  1939.           GO TO 300
  1940. C     IMMEDIATE STORE
  1941. 200       CALL EMIT(LD,ME,-(MOD(IABS(L),256)))
  1942. 300   CONTINUE
  1943. C
  1944. C     NOW STORE HIGH ORDER BYTE (IF ANY)
  1945.       IF (PREC(SP).EQ.1) GO TO 600
  1946. C     A DOUBLE BYTE STORE
  1947.       I = 0
  1948. C     STORE SECOND BYTE
  1949.       CALL EMIT(INCX,RH,0)
  1950. C     REGV(RH) = -3 THEN LHLD HAS OCCURRED ON SYMBOL -REGV(RL)
  1951. C     REGV(RH) = -4 THEN LHLD AND INCX H HAS OCCURRED
  1952.       J = REGV(RH)
  1953.       IF (J.LT.0) GO TO 310
  1954.       REGV(7) = REGV(7) + 1
  1955.       GO TO 320
  1956. 310   REGV(RH) = -4
  1957.       IF (J.EQ.-3) GO TO 320
  1958. C         RH AND RL HAVE UNKNOWN VALUES
  1959.           REGV(RH) = -1
  1960.           REGV(RL) = -1
  1961. 320   CONTINUE
  1962.       IF (PREC(SP-1).LT.2) GO TO 400
  1963.       IF (I1.NE.0) GO TO 500
  1964. C     SECOND BYTE IS LITERAL
  1965.       I = L/256
  1966. C     ENTER HERE IF LITERAL
  1967. 400   CONTINUE
  1968.       CALL EMIT(LD,ME,-IABS(I))
  1969.       GO TO 600
  1970. C     LD MEMORY FROM REGISTER
  1971. 500   CALL EMIT(LD,ME,I1)
  1972. 600   CONTINUE
  1973. C
  1974. C     NOW RELEASE REGISTER CONTAINING ADDRESS
  1975. C     RELEASE REGISTER ASSIGNMENT FOR VALUE
  1976. C     IF MOV R,M INR R MOV M,R WAS CHANGED TO INR M.
  1977.       IF (IQ.NE.CODLOC) GO TO 650
  1978.           I = -ST(SP)
  1979.           CALL DELETE(2)
  1980.           SP = SP + 1
  1981.           ST(SP) = I
  1982.           RASN(SP) = 0
  1983.           PREC(SP) = 1
  1984.           LITV(SP) = -1
  1985.           GO TO 9999
  1986. 650   CONTINUE
  1987.       CALL DELETE(1)
  1988.       GO TO 9999
  1989. C
  1990. C     STORE INTO STACKPTR
  1991. 700   CONTINUE
  1992.       IF (I2.EQ.0) GO TO 750
  1993.           CALL EMIT(LD,RL,I2)
  1994.           REGV(RL) = -1
  1995.           CALL EMIT(LD,RH,I1)
  1996.           REGV(RH) = -1
  1997.           CALL EMIT (SPHL,0,0)
  1998.           GO TO 600
  1999. 750   CONTINUE
  2000. C     LOAD SP IMMEDIATE
  2001.           CALL EMIT(LXI,RSP,L)
  2002.           GO TO 600
  2003. C
  2004. C     WE HAVE TO LOAD THE ADDRESS BEFORE THE STORE
  2005. 1000  CONTINUE
  2006.       I = RASN(SP)
  2007.       IF (I.GT.0) GO TO 1100
  2008. C     REGISTERS NOT ALLOCATED - CHECK FOR STACKED VALUE
  2009.       IF (ST(SP).NE.0) GO TO 1010
  2010. C     ADDRESS IS STACKED SO POP TO H AND L
  2011.           CALL EMIT(POP,RH,0)
  2012.           CALL USTACK
  2013.           GO TO 1110
  2014. 1010  CONTINUE
  2015. C     CHECK FOR REF TO SIMPLE BASED VARIABLE
  2016.       I = ST(SP)
  2017.       IF (I.LE.INTBAS) GO TO 1020
  2018. C
  2019. C     MAY BE ABLE TO SIMPLIFY (OR ELIMINATE) THE LHLD
  2020.       K = REGV(RH)
  2021.       LP = REGV(RL)
  2022.       IF((K.EQ.-3).AND.(-LP.EQ.I)) GO TO 160
  2023.       IF((K.EQ.-4).AND.(-LP.EQ.I)) GO TO 1012
  2024.           J = CHAIN(I,CODLOC+1)
  2025.           CALL EMIT(LHLD,J,0)
  2026.           REGV(RH) = -3
  2027.           REGV(RL) = -I
  2028.       GO TO 160
  2029. 1012  CALL EMIT(DCX,RH,0)
  2030.       REGV(RH) = -3
  2031.       GO TO 160
  2032. 1020  CONTINUE
  2033.           IF (I2.NE.0)  LOCK(I2) = 1
  2034.           IF (I1.NE.0) LOCK(I1) = 1
  2035. C         FORCE A DOUBLE BYTE FETCH INTO GPRS
  2036.           CALL LOADV(SP,3)
  2037.           I = RASN(SP)
  2038. C
  2039. 1100  JP = REGS(1)
  2040.       J = MOD(I,16)
  2041.       I = I/16
  2042.       IF ((I2.EQ.0).OR.(I.NE.(J-1))) GO TO 1105
  2043. C     IF PREVOUS SYLLABLE IS XCHG THEN DO ANOTHER - PEEP WILL FIX IT
  2044.       IF ((I.EQ.RD).AND.(LASTEX.EQ.(CODLOC-1))) GO TO 1107
  2045. C         USE STAX - SET UP ACCUMULATOR
  2046. C
  2047.           IF (I2.EQ.1) GO TO 2215
  2048.           IF (JP.NE.0) CALL EMIT(LD,JP,RA)
  2049.           IF (I1.EQ.1) I1 = JP
  2050.           CALL EMIT(LD,RA,I2)
  2051.           REGS(RA) = 0
  2052. 2215  CALL EMIT(STAX,I,0)
  2053. C     *****
  2054. C     IF BYTE DEST WE ARE DONE
  2055.       IF (PREC(SP) .LT. 2) GO TO 1104
  2056. C     *****
  2057.       CALL EMIT(INCX,I,0)
  2058.       IF (I1 .NE. 0) GO TO 1102
  2059. C     *****
  2060. C     STORE HIGH ORDER ZERO
  2061.       IF((I2 .NE. 1) .OR. (KEEP .NE. 0)) GO TO 1101
  2062.       CALL EMIT(LD, MOD(RASN(SP-1), 16), RA)
  2063. 1101  REGS(RA) = 0
  2064.       CALL EMIT (XR, RA, 0)
  2065.       CALL EMIT (STAX, I, 0)
  2066.       GO TO 1104
  2067. C     *****
  2068. C     STORE HIGH ORDER BYTE
  2069. 1102  IF((I2 .NE. 1) .OR. (KEEP .EQ. 0)) GO TO 1103
  2070.       CALL EMIT (LD, MOD(RASN(SP-1), 16), RA)
  2071.       REGS(RA) = 0
  2072. 1103  CONTINUE
  2073.       CALL EMIT (LD, RA, I1)
  2074.       CALL EMIT (STAX, I, 0)
  2075. C     *****
  2076. 1104  CALL DELETE (1)
  2077.       GO TO 9999
  2078. C     *****
  2079. C     ADDRESS IN GPRS BUT CANNOT USE STAX
  2080. 1105  CONTINUE
  2081.       IF (J.EQ.JP) J = 1
  2082.       IF (I.EQ.JP) I=1
  2083.       IF ((I.EQ.RD).AND.(J.EQ.RE)) GO TO 1107
  2084.       CALL EMIT(LD,RL,J)
  2085.       CALL EMIT(LD,RH,I)
  2086.       GO TO 1110
  2087. 1107  CALL EMIT(XCHG,0,0)
  2088. C     XCHG MAY BE REMOVED BY PEEPHOLE OPTIMIZATION
  2089. 1110  CONTINUE
  2090.       IF (I1.NE.0)  LOCK(I1) = 0
  2091.       IF (I2.NE.0) LOCK(I2) = 0
  2092.       REGV(6) = -1
  2093.       REGV(7) = -1
  2094.       GO TO 160
  2095. C
  2096. 9999  RETURN
  2097.       END
  2098.       SUBROUTINE LITADD(S)
  2099.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  2100.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  2101.       INTEGER S
  2102.       INTEGER CONTRL(64)
  2103.       COMMON /CNTRL/CONTRL
  2104.       INTEGER CODLOC,ALTER,CBITS(43)
  2105.       COMMON /CODE/CODLOC,ALTER,CBITS
  2106.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  2107.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  2108.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2109.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2110.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2111.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2112.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2113.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  2114.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2115.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2116.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2117.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2118.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2119.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  2120.      1    SP,MAXSP,INTBAS
  2121.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  2122. C     LOAD H AND L WITH THE ADDRESS OF THE VARIABLE AT S IN
  2123. C     THE STACK
  2124.       IH = LITV(S)
  2125.       IL = MOD(IH,256)
  2126.       IH = IH/256
  2127.       IR = RH
  2128.       L = IH
  2129.       IF (IH.GE.0) GO TO 10
  2130.           CALL ERROR(114,1)
  2131.           GO TO 99999
  2132. 10    CONTINUE
  2133. C
  2134. C     DEASSIGN REGISTERS
  2135.       I = RASN(S)
  2136.       IF (I.EQ.103) GO TO 99999
  2137. C     6*16+7 = 103
  2138.       JP = REGS(1)
  2139.           DO 50 J=1,2
  2140.           K = MOD(I,16)
  2141.           I = I/16
  2142.           IF (K.EQ.0) GO TO 50
  2143.           IF (K.EQ.JP) REGS(1) = 0
  2144.           REGS(K) = 0
  2145.           LOCK(K) = 0
  2146.           REGV(K) = -1
  2147. 50        CONTINUE
  2148. C
  2149.       RASN(S) = 0
  2150. C
  2151.       DO 1000 I=6,7
  2152.       J = REGS(I)
  2153.       IF (J.EQ.0) GO TO 100
  2154.           K = RASN(J)
  2155.           KP = MOD(K,16)
  2156.           K = K/16
  2157.           IF (K.EQ.I) K = 0
  2158.           IF (KP.EQ.I) KP = 0
  2159.           RASN(J) = K*16+KP
  2160. C
  2161. 100   LP = REGV(I)
  2162.       IF (LP.EQ.L) GO TO 700
  2163.       IF (LP.NE.(L+1)) GO TO 200
  2164.           CALL EMIT(DC,IR,0)
  2165.           GO TO 700
  2166. 200   IF(LP.NE.(L-1)) GO TO 300
  2167.       IF(L.EQ.0) GO TO 300
  2168.           CALL EMIT(IN,IR,0)
  2169.           GO TO 700
  2170. 300   IF (I.NE.6) GO TO 350
  2171. C     NO INC/DEC POSSIBLE, SEE IF L DOES NOT MATCH
  2172.       IF (IL.EQ.REGV(7)) GO TO 350
  2173.       REGV(7) = IL
  2174.       IF (L.GT.255) GO TO 310
  2175. C     OTHERWISE THIS IS A REAL ADDRESS
  2176.           CALL EMIT(LXI,RH,IL+IH*256)
  2177.           GO TO 700
  2178. 310   CONTINUE
  2179. C     THE LXI MUST BE BACKSTUFFED LATER
  2180.       IT = ST(S)
  2181.       IF (IT.GE.0) GO TO 410
  2182.       IT=-IT
  2183.       IT=SYMBOL(IT)
  2184.       J = SYMBOL(IT-2)
  2185. C     PLACE REFERENCE INTO CHAIN
  2186.           CALL EMIT(LXI,RH,J)
  2187.           SYMBOL(IT-2) = CODLOC-2
  2188.           GO TO 700
  2189. 350   IF (L.GT.255) GO TO 400
  2190.           CALL EMIT(LD,IR,-L)
  2191.           GO TO 700
  2192. C     THE ADDRESS MUST BE BACKSTUFFED LATER
  2193. 400   IT = ST(S)
  2194.       IF (IT.LT.0) GO TO 500
  2195. 410       CALL ERROR(115,1)
  2196.           GO TO 99999
  2197. 500   IT = IABS(IT)
  2198.       IT = SYMBOL(IT)
  2199.       J = SYMBOL(IT)
  2200.       IF (J.GT.0) GO TO 600
  2201.           CALL ERROR(116,1)
  2202.           GO TO 99999
  2203. C     PLACE LINK INTO CODE
  2204. 600   K = SHR(J,16)
  2205.       SYMBOL(IT) = SHL(CODLOC+1,16)+RIGHT(J,16)
  2206.       KP = MOD(K,256)
  2207.       K = K/256
  2208.       CALL EMIT(0,K,0)
  2209.       CALL EMIT(0,KP,0)
  2210. C     DONE LOADING ADDRESS ELEMENT
  2211. 700   CONTINUE
  2212. C     FIX VALUES IN STACK AND REG
  2213.       IF (I.EQ.7) RASN(S) = 103
  2214. C     103 = 6*16+7
  2215.       REGS(I) = S
  2216.       REGV(I) = L
  2217.       L = IL
  2218.       IR = RL
  2219. 1000  CONTINUE
  2220. C
  2221. 99999 RETURN
  2222.       END
  2223.       SUBROUTINE DUMP(L,U,FA,FE)
  2224.       INTEGER L,U,FA,FE,A,B,W,FR,WR,RR
  2225.       INTEGER GET,DECODE,OPCNT
  2226.       LOGICAL SAME
  2227.       INTEGER CONTRL(64)
  2228.       COMMON /CNTRL/CONTRL
  2229.       INTEGER DEBASE
  2230.       COMMON /BASE/DEBASE
  2231.       INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
  2232.      1    IDENT,NUMB,SPECL,STR,CONT,VALUE,ASCII(48)
  2233.       COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
  2234.      1    IDENT,NUMB,SPECL,STR,CONT,VALUE,ASCII
  2235.       LP = L
  2236.       W = CONTRL(34)
  2237.       A = 5
  2238.       B = 3
  2239.       IF (FA .EQ. 8) A = 6
  2240.       IF(FE.NE.1) GO TO 10
  2241. C         SYMBOLIC DUMP
  2242.           B = 6
  2243.           FR = DEBASE
  2244.           IF (FR.EQ.2) FR = 16
  2245.           WR = 2
  2246.           IF(FR.EQ.10) WR = 3
  2247.           RR = 6-WR
  2248.           IF (FR.NE.10) RR = RR-1
  2249. C         FR IS FORMAT OF NUMBERS AFTER OP CODES
  2250. C         WR IS THE WIDTH OF THE NUMBER FIELD
  2251. C         RR IS THE NUMBER OF BLANKS AFTER THE NUMBER FIELD
  2252.           GO TO 20
  2253. 10    IF (FE .EQ. 2) B = 9
  2254.       IF (FE .EQ. 8) B = 4
  2255. 20    W = (W - A) / (B + 1)
  2256. C     W IS NUMBER OF ENTRIES ON EACH LINE
  2257.       IF (W .EQ. 0) GO TO 8025
  2258.       IF (FA .NE. 10) A = A - 1
  2259.       IF (FE .NE. 10) B = B - 1
  2260. C     A IS THE WIDTH OF THE ADDRESS FIELD
  2261. C     B IS THE WIDTH OF EACH ENTRY
  2262. C
  2263.           DO 100 I=1,29
  2264. 100       ACCUM(I) = 256
  2265.           NSAME = 0
  2266.           OPCNT = 0
  2267. C
  2268. 110   SAME = .TRUE.
  2269.       LS = LP
  2270.       I = 0
  2271. C
  2272. 200   IF (LP .GT. U) GO TO 500
  2273.       I = I + 1
  2274.       J = GET(LP)
  2275.       LP = LP + 1
  2276.       J = MOD(J,256)
  2277.       IF (J .NE. ACCUM(I)) SAME = .FALSE.
  2278.       ACCUM(I) = J
  2279.       IF (I .LT. W) GO TO 200
  2280. C
  2281. 300   IF (SAME) GO TO 400
  2282.       IF (I .EQ. 0) GO TO 9999
  2283.       CALL CONOUT (0, A, LS, FA)
  2284. C
  2285.           DO 320 J=1,I
  2286.           CALL PAD(1,1,1)
  2287.           K = ACCUM(J)
  2288.           IF (OPCNT .GT. 0) GO TO 315
  2289.           IF (FE .NE. 1) GO TO 310
  2290.           OPCNT = DECODE(1,K,6)
  2291.           GO TO 320
  2292. C
  2293. 315   OPCNT = OPCNT - 1
  2294.       CALL CONOUT(1,WR,K,FR)
  2295.       CALL PAD(1,1,RR)
  2296.       GO TO 320
  2297. 310       CALL CONOUT(1,B,K,FE)
  2298. 320       CONTINUE
  2299. C
  2300.       IF (LP .LE. U) GO TO 110
  2301.       GO TO 600
  2302. C
  2303. 400   NSAME = NSAME + 1
  2304.       IF (NSAME .GT. 1) GO TO 110
  2305.       CALL PAD(0,1,1)
  2306.       CALL WRITEL(0)
  2307.       GO TO 110
  2308. C
  2309. 500   SAME = .FALSE.
  2310.       GO TO 300
  2311. C
  2312. 600   CALL WRITEL(0)
  2313.       GO TO 9999
  2314. 8025  CALL ERROR (117, 1)
  2315. 9999  RETURN
  2316.       END
  2317.       INTEGER FUNCTION DECODE(CC,I,W)
  2318. C            *****************************************
  2319. C            *INSTRUCTION * DECODING * USING * CTRAN *
  2320. C            *****************************************
  2321. C     THE ELEMENTS OF CTRAN REPRESENT THE 8080 OPERATION CODES IN A
  2322. C     FORM WHICH IS MORE USABLE FOR INSTRUCTION DECODING IN BOTH THE
  2323. C     DECODE AND INTERP SUBROUTINES.  GIVEN AN INSTRUCTION I (BETWEEN 0
  2324. C     AND 255), CTRAN(I+1) PROVIDES AN ALTERNATE REPRESENTATION OF THE
  2325. C     INSTRUCTION, AS SHOWN BELOW...
  2326. C         5B    5B     5B       OR     5B     3B  2B    5B
  2327. C        ------------------          -----------------------
  2328. C        /    /     /     /          /      /    /    /    /
  2329. C        / X  /  Y  /   I /          / X    / Y1 /Y2  /  I /
  2330. C        /    /     /     /          /      /    /    /    /
  2331. C        ------------------          -----------------------
  2332. C     WHERE FIELD I SPECIFIES A 'CATEGORY' AND THE X AND Y FIELDS
  2333. C     QUALIFY INSTRUCTIONS WITHIN THE CATEGORY.
  2334. C    FIELD I       CATEGORY         VALUE OF X AND Y FIELDS
  2335. C    ------   ----------------- ----------------------------------------
  2336. C       0           MOV         THE FIELDS INDICATE THE VALID OPERANDS
  2337. C                              INVOLVED...
  2338. C                              ACC=0, B = 1, C = 2, D = 3, E = 4, H = 5,
  2339. C                               L = 6, M = 7, I = 8, SP= 9 (M IS MEMORY
  2340. C                              REFERENCING INSTRUCTION, AND I IS IMMED)
  2341. C                              THUS, /3/5/0/ IS A MOV D,H INSTRUCTION.
  2342. C
  2343. C       1     INCREMENT, DECRE- THE VALUE OF X DETERMINES THE INSTRUC-
  2344. C             MENT, ARITHMETIC, TION WITHIN THE CATEGORY..
  2345. C             OR LOGICAL        INR = 1, CDR = 2, ADD = 3, ADC = 4,
  2346. C                               SUB = 5, SBC = 6, ANA = 7, XRA = 8,
  2347. C                               ORA = 9, CMP = 10
  2348. C                               THE VALUE OF Y DETERMINES THE VALID
  2349. C                               REGISTER INVOLVED, AS ABOVE.  THUS,
  2350. C                               /3/4/1/ IS AN ADD E INSTRUCTION.
  2351. C    ------   ----------------- ----------------------------------------
  2352. C       2     JUMP, CALL, OR    THE VALUE OF X DETERMINES THE EXACT IN-
  2353. C                RETURN         STRUCTION.. JUMP=1, CALL=2, RETURN=3
  2354. C                               THE SUBFIELD Y1 DETERMINES THE ORIENTA-
  2355. C                               TION OF THE CONDITION.. T=1, F=0
  2356. C                               THE VALUE OF SUBFIELD Y2 GIVES THE CON-
  2357. C                               DITION.. CY=0, Z=1, S=2, P=3.
  2358. C                               THUS, /3/0/1/2/ IS AN RFZ (RETURN FALSE
  2359. C                               ZERO) INSTRUCTION.
  2360. C    ------   - --------------  ----------------------------------------
  2361. C       3     MISCELLANEOUS     THE VALUE OF THE Y FIELD DETERMINES THE
  2362. C                               INSTRUCTION (THE X FIELD GIVES THE VALUE
  2363. C                               OF AAA IN THE RST INSTRUCTION)
  2364. C                               RLC  = 1  RRC  = 2  RAL  = 3  RAR  = 4
  2365. C                               JMP  = 5  CALL = 6  RET  = 7  RST  = 8
  2366. C                               IN   = 9  OUT  = 10 HLT  = 11 STA  = 12
  2367. C                               LDA  = 13 XCHG = 14 XTHL = 15 SPHL = 16
  2368. C                               PCHL = 17 CMA  = 18 STC  = 19 CMC  = 20
  2369. C                               DAA  = 21 SHLD = 22 LHLD = 23 EI   = 24
  2370. C                               DI   = 25 NOP  = 26 27 --- 31 UNDEFINED
  2371. C                               (IBYTES GIVES NUMBER OF BYTES FOLLOWING
  2372. C                               THE FIRST 23 INSTRUCTIONS OF THIS GROUP)
  2373. C    -------   ---------------- ---------------------------------------
  2374. C     4 - 11   INSTRUCTIONS RE  THE Y FIELD GIVES A REGISTER PAIR NUM-
  2375. C              QUIRING A REGIS  BER A = 0, B = 1, D = 3, H = 5, SP = 9
  2376. C              TER PAIR
  2377. C                               THE INSTRUCTIONS IN EACH CATEGORY ARE
  2378. C                               DETERMINED BY THE I FIELD..
  2379. C                               LXI  = 4  PUSH = 5  POP  = 6
  2380. C                               DAD  = 7  STAX = 8  LDAX = 9
  2381. C                               INX  = 10 DCX  = 11
  2382. C    -------   ---------------- ---------------------------------------
  2383. C
  2384.       INTEGER CC,I,W,X,Y
  2385.       INTEGER CTRAN(256),INSYM(284),IBYTES(23)
  2386.       COMMON/INST/CTRAN,INSYM,IBYTES
  2387.       INSIZE=284
  2388.       IP = CTRAN(I+1)
  2389.       X = IP/1024
  2390.       Y = MOD(IP/32,32)
  2391.       IP = MOD(IP,32)+1
  2392.       DECODE = 0
  2393. C      POINT TO THE PROPER CATEGORY
  2394. C     (THE FIRST TWO ARE FOR CONDITION CODES AND REGISTER DESIGNATIONS)
  2395.       J = INSYM(IP+2)
  2396. C     SELECT THE PROPER INSTRUCTION CODE WITHIN THE CATEGORY
  2397.       IF (IP.GT.4) GO TO 500
  2398.       GO TO (100,200,300,400),IP
  2399. C     MOV
  2400. 100   K = 1
  2401.       GO TO 210
  2402. C     INR ... CMP
  2403. 200   K = X
  2404. C     MAY BE AN IMMEDIATE OPERATION
  2405. 210   IF (Y.EQ.8) DECODE = 1
  2406.       GO TO 1000
  2407. C     JUMP CALL OR RETURN CONDITIONALLY
  2408. 300   K = X
  2409.       IF (X.NE.3) DECODE = 2
  2410.       GO TO 1000
  2411. C     RLC ... NOP
  2412. 400   K = Y
  2413. C     CHECK FOR JMP
  2414.       IF (Y.GT.23) GO TO 1000
  2415. C     RLC ... LDA
  2416.       DECODE = IBYTES(Y)
  2417.       GO TO 1000
  2418. C     LXI ... DCX
  2419. 500   K = 1
  2420.       IF (IP.EQ.5) DECODE = 2
  2421. 1000  J = J + K
  2422.       L = INSYM(J)
  2423.       J = INSYM(J+1)
  2424.       CALL FORM(CC,INSYM,L,J-1,INSIZE)
  2425.       L = J - L
  2426. C
  2427.       IF(IP.NE.4) GO TO 1050
  2428. C     CHECK FOR RST (IF FOUND ADD DECIMAL NUMBER)
  2429.       IF (Y.NE.8) GO TO 1100
  2430. C     FOUND RST INSTRUCTION
  2431.       CALL PAD(1,1,1)
  2432.       CALL CONOUT(1,1,X,10)
  2433.       L = L + 2
  2434. 1050  IF (IP.NE.3) GO TO 1100
  2435. C     CONDITIONAL
  2436.       J = INSYM(2)+1+Y
  2437.       K = INSYM(J)
  2438.       J = INSYM(J+1)
  2439.       CALL FORM(1,INSYM,K,J-1,INSIZE)
  2440.       L = L + J - K
  2441. 1100  CONTINUE
  2442. C     OPCODE IS WRITTEN.  L CHARACTERS ARE IN BUFFER, CHECK FOR MORE
  2443.       IF ((IP.LE.4).AND.(IP.GE.3)) GO TO 1200
  2444. C     WRITE REGISTER REFERENCE
  2445.       CALL PAD(1,1,1)
  2446. 1110  M = Y
  2447.       IF (IP.EQ.1) M = X
  2448.       J = INSYM(1) + 1 + M
  2449.       K = INSYM(J)
  2450.       J = INSYM(J+1)
  2451.       CALL FORM(1,INSYM,K,J-1,INSIZE)
  2452.       L = L + J - K + 1
  2453.       IF (IP.NE.1) GO TO 1200
  2454.       IP = 0
  2455.       GO TO 1110
  2456. 1200  IF (L.GE.W) GO TO 1300
  2457.       CALL PAD(1,1,W-L)
  2458. 1300  RETURN
  2459.       END
  2460.       SUBROUTINE EMIT(OPR,OPA,OPB)
  2461.       INTEGER GET,RIGHT
  2462.       INTEGER CONTRL(64)
  2463.       COMMON /CNTRL/CONTRL
  2464.       INTEGER REGMAP(9)
  2465.       COMMON/RGMAPP/REGMAP
  2466.       INTEGER OPR,OPA,OPB
  2467.       INTEGER CODLOC,ALTER,CBITS(43)
  2468.       COMMON /CODE/CODLOC,ALTER,CBITS
  2469.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  2470.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  2471.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  2472.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  2473.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  2474.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2475.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2476.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2477.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2478.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2479.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  2480.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2481.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2482.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2483.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2484.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2485. C
  2486. C     THE FOLLOWING COMMENTS ARE SAMPLE CALLS TO THE EMIT
  2487. C     ROUTINE.  NOTE THAT EMIT REQUIRES THREE ARGUMENT AT ALL TIMES
  2488. C     (THE UNUSED ARGUMENTS ARE ZERO).
  2489. C
  2490. C             CALL EMIT(LD,RA,RB)
  2491. C             CALL EMIT(LD,RC,-34)
  2492. C             CALL EMIT(LD,RD,ME)
  2493. C             CALL EMIT(LD,ME,RE)
  2494. C             CALL EMIT(IN,RH,0)
  2495. C             CALL EMIT(DC,RL,0)
  2496. C             CALL EMIT(AD,RB,0)
  2497. C             CALL EMIT(AD,ME,0)
  2498. C             CALL EMIT(AD,-5,0)
  2499. C             CALL EMIT(SU,RB,0)
  2500. C             CALL EMIT(SB,ME,0)
  2501. C             CALL EMIT(ND,-5,0)
  2502. C             CALL EMIT(XR,0,0)
  2503. C             CALL EMIT(OR,RB,0)
  2504. C             CALL EMIT(CP,RH,0)
  2505. C             CALL EMIT(ROT,ACC,LFT)
  2506. C             CALL EMIT(ROT,CY,LFT)
  2507. C             CALL EMIT(ROT,CY,RGT)
  2508. C             CALL EMIT(JMP,148,0)
  2509. C             CALL EMIT(JMC,TRU*32+ZERO,148)
  2510. C             CALL EMIT(CAL,1048,0)
  2511. C             CALL EMIT(CLC,FAL*32+PARITY,148)
  2512. C             CALL EMIT(RTN,0,0)
  2513. C             CALL EMIT(RTC,FAL*32+CARRY,255)
  2514. C             CALL EMIT(RST,3,0)
  2515. C             CALL EMIT(INP,6,0)
  2516. C             CALL EMIT(OUT,10,0)
  2517. C             CALL EMIT(HALT,0,0)
  2518. C             EMIT A LITERAL BETWEEN 0 AND 255
  2519. C             CALL EMIT(0,44,0)
  2520. C
  2521. C             CALL EMIT(STA,300,0)
  2522. C             CALL EMIT(LDA,300,0)
  2523. C             CALL EMIT(XCHG,0,0)
  2524. C             CALL EMIT(SPHL,0,0)
  2525. C             CALL EMIT(PCHL,0,0)
  2526. C             CALL EMIT(CMA,0,0)
  2527. C             CALL EMIT(STC,0,0)
  2528. C             CALL EMIT(CMC,0,0)
  2529. C             CALL EMIT(DAA,0,0)
  2530. C             CALL EMIT(SHLD,300,0)
  2531. C             CALL EMIT(LHLD,300,0)
  2532. C             CALL EMIT(EI,0,0)
  2533. C             CALL EMIT(DI,0,0)
  2534. C
  2535. C             CALL EMIT(LXI,(RB,RD,RH,RSP),300)
  2536. C             CALL EMIT(PUSH,(RB,RD,RH,RA),0)
  2537. C             CALL EMIT(POP,(RB,RD,RH,RA),0)
  2538. C             CALL EMIT(DAD,(RB,RD,RH,RSP),0)
  2539. C             CALL EMIT(STAX,(RB,RD),0)
  2540. C             CALL EMIT(LDAX,(RB,RD),0)
  2541. C             CALL EMIT(INX,(RB,RD,RH,RSP),0)
  2542. C             CALL EMIT(DCX,(RB,RD,RH,RSP),0)
  2543.       INTEGER BITS(3),ALLOC
  2544. C
  2545.       N = 1
  2546. C
  2547.       IF (CONTRL(25).EQ.0) GO TO 100
  2548. C      WRITE EMITTER TRACE
  2549.       CALL PAD(0,16,1)
  2550.       CALL PAD(1,42,1)
  2551.       CALL CONOUT(2,-6,OPR,10)
  2552.       CALL PAD(1,48,1)
  2553.       IF (OPA.LT.0) CALL PAD(1,45,1)
  2554.       CALL CONOUT(2,-6,IABS(OPA),10)
  2555.       CALL PAD(1,48,1)
  2556.       IF (OPB.LT.0) CALL PAD(1,45,1)
  2557.       CALL CONOUT(2,-6,IABS(OPB),10)
  2558.       CALL PAD(1,43,1)
  2559.       CALL WRITEL(0)
  2560. 100   IF (OPR.LE.0) GO TO 9000
  2561.       BITS(1) = CBITS(OPR)
  2562.       GO TO (1000,1500,1500,2000,2000,2000,2000,2000,2000,2000,2000,
  2563.      1  3000,4000,5000,4000,5000,10000,5100,7000,8000,8000,10000,
  2564.      2  9100,9100,9400,9999,9999,9999,9999,9999,9999,9100,9100,
  2565.      3  9999,9999,9200,9500,9300,9300,9300,9300,9300,9300)
  2566.      4    ,OPR
  2567. C
  2568. 1000  CONTINUE
  2569. C     LOAD OPERATION
  2570.       IF (OPB.GT.0) GO TO 1200
  2571. C         LRI OPERATION
  2572.           N = 2
  2573.       BITS(1) = REGMAP(OPA)*8 + 6
  2574.           BITS(2) = - OPB
  2575.           GO TO 10000
  2576. 1200  CONTINUE
  2577. C     CHECK FOR POSSIBLE LOAD REGISTER ELIMINATION
  2578. C     IS THIS A LMR OR LRM INSTRUCTION...
  2579.       IF (OPA.NE.ME) GO TO 1210
  2580. C         MAY CHANGE A MOV R,M INR R MOV M,R TO INR M
  2581.           IF (LASTIR.NE.CODLOC-1) GO TO 1205
  2582.               I = RIGHT(GET(CODLOC-1),3) + 48
  2583. C             THE REGISTER LOAD MAY HAVE BEEN ELIMINATED...
  2584.               IF (LASTLD.EQ.CODLOC-2.AND.OPB.EQ.LASTRG) GO TO 1202
  2585.                   CODLOC = CODLOC - 1
  2586.                   MEMBOT = MEMBOT - 1
  2587. 1202          CONTINUE
  2588.               CALL PUT(CODLOC-1,I)
  2589.               LASTIR = 0
  2590.               LASTRG = 0
  2591.               LASTLD = 0
  2592.               IF (LASTIN.EQ.CODLOC.OR.LASTIN.EQ.CODLOC+1)
  2593.      1            LASTIN = CODLOC - 1
  2594.               GO TO 11000
  2595. 1205      CONTINUE
  2596. C         THIS IS A LOAD MEMORY FROM REGISTER OPERATION - SAVE
  2597.           LASTLD = CODLOC
  2598.           LASTRG = OPB
  2599.           GO TO 1220
  2600. 1210  IF (OPB.NE.ME) GO TO 1220
  2601. C         THIS IS A LOAD REGISTER FROM MEMORY - MAYBE ELIMINATE
  2602.           IF (LASTLD.NE.(CODLOC-1)) GO TO 1220
  2603.           IF (LASTRG.EQ.OPA) GO TO 11000
  2604. 1220  CONTINUE
  2605.       BITS(1) = BITS(1) + REGMAP(OPA)*8 + REGMAP(OPB)
  2606.       GO TO 10000
  2607. C
  2608. C     IN OR DC
  2609. 1500  CONTINUE
  2610.       BITS(1) = BITS(1) + REGMAP(OPA)*8
  2611.       GO TO 10000
  2612. C
  2613. 2000  CONTINUE
  2614. C     AD AC SU SB ND XR OR CP
  2615.       IF (OPA.GT.0) GO TO 2200
  2616. C         IMMEDIATE OPERAND
  2617.           N = 2
  2618.       BITS(1) = BITS(1) + 70
  2619.           BITS(2) = - OPA
  2620.           GO TO 10000
  2621. C
  2622. 2200  BITS(1) = BITS(1) + REGMAP(OPA)
  2623.       GO TO 10000
  2624. C
  2625. 3000  CONTINUE
  2626. C     ROT
  2627.       I = (OPA-CY)*2 + (OPB-LFT)
  2628.       BITS(1) = BITS(1) + I*8
  2629.       GO TO 10000
  2630. C
  2631. C      JMP CAL
  2632. 4000  CONTINUE
  2633.       N = 3
  2634.       I = OPA
  2635. 4100  BITS(3) = I/256
  2636.       BITS(2) = MOD(I,256)
  2637.       GO TO 10000
  2638. C
  2639. C     JFC JTC CFC CTC
  2640. 5000  CONTINUE
  2641.       N = 3
  2642. 5100  I = MOD(OPA,32) - CARRY
  2643.       I = (I/2)*2 + MOD(I+1,2)
  2644.       J = OPA/32-FAL
  2645.       J = I*2 + J
  2646.       BITS(1) = BITS(1) + J*8
  2647.       I = OPB
  2648.       GO TO 4100
  2649. C
  2650. C     RET HLT
  2651. C     GO TO 10000
  2652. C
  2653. C     RST
  2654. 7000  CONTINUE
  2655.       BITS(1) = BITS(1) + MOD(OPA,8)*8
  2656.       GO TO 10000
  2657. C
  2658. C     INP OUT
  2659. 8000  CONTINUE
  2660.       N = 2
  2661.       BITS(2) = OPA
  2662.       GO TO 10000
  2663. C
  2664. C     LITERAL VALUE
  2665. 9000  CONTINUE
  2666.       BITS(1) = OPA
  2667.       GO TO 10000
  2668. C     STA LDA SHLD LHLD (GET ADDRESS PART)
  2669. 9100  N = 3
  2670.       BITS(3) = OPA/256
  2671.       BITS(2) = MOD(OPA,256)
  2672.       GO TO 10000
  2673. C
  2674. C     LXI (GET IMMEDIATE PART)
  2675. 9200  N = 3
  2676.       BITS(3) = OPB/256
  2677.       BITS(2) = MOD(OPB,256)
  2678. C     AND DROP THROUGH...
  2679. C     LXI PUSH POP DAD STAX LDAX INX DCX
  2680. 9300  I = REGMAP(OPA)
  2681. C     CHECK FOR ACC
  2682.       IF (I.EQ.7) I = 6
  2683. 9310  CONTINUE
  2684.       BITS(1) = I*8 + BITS(1)
  2685.       GO TO 10000
  2686. C     XCHG - CHECK FOR PREVIOUS XCHG AND ELIMINATE IF FOUND
  2687. 9400  CONTINUE
  2688.       IF (LASTEX.NE.(CODLOC-1)) GO TO 9410
  2689.           MEMBOT = MEMBOT - 1
  2690.           CODLOC = CODLOC - 1
  2691.           LASTEX = 0
  2692.           GO TO 11000
  2693. 9410  LASTEX = CODLOC
  2694.       GO TO 10000
  2695. C     PUSH R - CHECK FOR XCHG PUSH D COMBINATION. CHANGE TO PUSH H
  2696. 9500  IF (LASTEX.NE.(CODLOC-1)) GO TO 9300
  2697.       IF (OPA.NE.RD) GO TO 9300
  2698.           MEMBOT = MEMBOT - 1
  2699.           CODLOC = CODLOC - 1
  2700.           LASTEX = 0
  2701.           I = REGMAP(RH)
  2702.       GO TO 9310
  2703. C     XCHG SPHL PCHL CMA STC CMC DAA EI DI (NO ADDRESS PART)
  2704. 9999  CONTINUE
  2705. C
  2706. 10000 I = ALLOC(N)-1
  2707.       CODLOC = CODLOC + N
  2708.           DO 10100 J = 1,N
  2709. 10100     CALL PUT(I+J,BITS(J))
  2710. C
  2711. 11000 CONTINUE
  2712.       RETURN
  2713.       END
  2714.       SUBROUTINE PUNCOD(LB,UB,MODE)
  2715. C     PUNCH CODE FROM LOWER BOUND (LB) TO UPPER BOUND (UB)
  2716. C     MODE = 1  - - PUNCH HEADER ONLY
  2717. C     MODE = 2 - - PUNCH TRAILER ONLY
  2718. C     MODE = 3 - - PUNCH HEADER AND TRAILER
  2719.       INTEGER LB,UB,MODE
  2720.       INTEGER GET,L,U,LP,UP,K,KP,RIGHT,SHR
  2721.       INTEGER IMIN,J,ISUM
  2722.       INTEGER CONTRL(64)
  2723.       COMMON /CNTRL/CONTRL
  2724.       INTEGER T(4)
  2725.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  2726.      1    ITRAN(256),OTRAN(64)
  2727.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  2728.      1    ITRAN,OTRAN
  2729. C
  2730.       UP = UB
  2731.       LP = LB
  2732.       CALL WRITEL(0)
  2733.       IF (CONTRL(28).NE.0) GO TO 400
  2734.       T(1) = 25
  2735.       T(2) = 27
  2736.       T(3) = 13
  2737.       T(4) = 17
  2738. C
  2739.           DO 10 I=1,4
  2740. 10        CALL PAD(1,47,20)
  2741.       CALL WRITEL(0)
  2742. C
  2743.       IF (MOD(LP,8).NE.0) CALL CONOUT(0,-8,LP,10)
  2744. 100   IF(LP .GT. UP) GO TO 300
  2745.       IF(MOD(LP,4).NE.0) GO TO 200
  2746.       IF(MOD(LP,8).NE.0) GO TO 130
  2747.       IF(MOD(LP,256).NE.0) GO TO 120
  2748. C     *********
  2749.       CALL WRITEL(0)
  2750.           DO 110 I=1,4
  2751. 110       CALL PAD(1,47,20)
  2752. C
  2753. 120   CALL CONOUT(0,-8,LP,10)
  2754.       GO TO 200
  2755. C
  2756. 130   CALL PAD(0,1,8)
  2757. C     DECODE A MEMORY LOCATION
  2758. 200   CALL PAD(1,1,1)
  2759.       CALL FORM(1,T,3,3,4)
  2760.           K=GET(LP)
  2761. C
  2762.           DO 210 I=1,8
  2763.           KP = K/(2**(8-I))
  2764.           KP = MOD(KP,2)+1
  2765. 210       CALL FORM(1,T,KP,KP,4)
  2766. C
  2767.       CALL FORM(1,T,4,4,4)
  2768.       LP = LP + 1
  2769.       GO TO 100
  2770. C
  2771. 300   CALL WRITEL(0)
  2772.           DO 310 I=1,4
  2773. 310       CALL PAD(1,47,20)
  2774.       CALL WRITEL(0)
  2775.       GO TO 9999
  2776. 400   CONTINUE
  2777. C     WRITE ********
  2778.       IF (MOD(MODE,2).EQ.0) GO TO 402
  2779.       CALL PAD(0,47,20)
  2780.       CALL PAD(1,47,20)
  2781. 402   CALL WRITEL(0)
  2782.       L = CONTRL(28)
  2783.       IF (L.LT.16) L=16
  2784. 405   IF (LP.GT.UP) GO TO 500
  2785.       KP = UP - LP + 1
  2786.       K = IMIN(KP,L)
  2787.       IF (K.EQ.0) GO TO 500
  2788.       CALL PAD(1,51,1)
  2789.       CALL CONOUT(1,2,K,16)
  2790.       OBP = OBP - 1
  2791.       CALL CONOUT(1,4,LP,16)
  2792.       OBP = OBP - 1
  2793.       ISUM = K + RIGHT(LP,8) + SHR(LP,8)
  2794.       CALL CONOUT(1,2,0,16)
  2795.       OBP = OBP - 1
  2796.           DO 410 I = 1,K
  2797.           J = GET(LP)
  2798.           ISUM = ISUM + J
  2799.           LP = LP + 1
  2800.           CALL CONOUT(1,2,J,16)
  2801.           OBP = OBP - 1
  2802. 410       CONTINUE
  2803.       ISUM = RIGHT(ISUM,8)
  2804.       ISUM = MOD(256-ISUM,256)
  2805.       CALL CONOUT(1,2,ISUM,16)
  2806.       OBP = OBP - 1
  2807.       CALL WRITEL(0)
  2808.       GO TO 405
  2809. 500   CONTINUE
  2810.       IF ((MODE/2) .EQ. 0) GO TO 510
  2811. C     *****
  2812. C     WRITE END OF FILE RECORD
  2813.       CALL PAD(1,51,1)
  2814.       CALL PAD(1,2,10)
  2815. C
  2816. C     WRITE ***** AGAIN
  2817.       CALL PAD(0,47,20)
  2818.       CALL PAD(1,47,20)
  2819. 510   CALL WRITEL(0)
  2820. 9999  RETURN
  2821.       END
  2822.       SUBROUTINE CVCOND(S)
  2823.       INTEGER S
  2824. C     CONVERT THE CONDITION CODE AT S IN THE STACK TO A BOOLEAN VALUE
  2825.       INTEGER CODLOC,ALTER,CBITS(43)
  2826.       COMMON /CODE/CODLOC,ALTER,CBITS
  2827.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  2828.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2829.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2830.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2831.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2832.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2833.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  2834.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2835.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2836.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2837.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2838.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2839.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  2840.      1    SP,MAXSP,INTBAS
  2841.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  2842.       I = RASN(S)
  2843.       J = I/256
  2844.       K = MOD(J,16)
  2845.       J = J/16
  2846.       IA = MOD(I,16)
  2847. C     J = 1 IF TRUE , J = 0 IF FALSE
  2848. C
  2849. C     K = 1 IF CARRY, 2 IF ZERO, 3 IF SIGN, AND 4 IF PARITY
  2850. C
  2851. C     WE MAY GENERATE A SHORT SEQUENCE
  2852.       IF (K.GT.2.OR.IA.EQ.0) GO TO 40
  2853.       IF (REGS(1).NE.IA) GO TO 40
  2854.       IF (K.EQ.2) GO TO 10
  2855. C     SHORT CONVERSION FOR TRUE OR FALSE CARRY
  2856.       CALL EMIT(SB,RA,0)
  2857.       IF (J.EQ.0) CALL EMIT(CMA,0,0)
  2858.       GO TO 300
  2859. C     SHORT CONVERSION FOR TRUE OR FALSE ZERO
  2860. 10    IF (J.EQ.0) CALL EMIT(AD,-255,0)
  2861.       IF (J.EQ.1) CALL EMIT(SU,-1,0)
  2862.       CALL EMIT(SB,RA,0)
  2863.       GO TO 300
  2864. C     DO WE HAVE TO ASSIGN A REGISTER
  2865. 40    IF (IA.NE.0) GO TO 50
  2866.           CALL GENREG(1,IA,JP)
  2867.           IF (IA.NE.0) GO TO 60
  2868.               CALL ERROR(118,5)
  2869.               GO TO 9999
  2870. 60        REGS(IA) = SP
  2871.           I = IA
  2872. C
  2873. C     CHECK PENDING REGISTER STORE
  2874. 50    JP = REGS(1)
  2875.       IF (JP.EQ.0) GO TO 100
  2876.       IF (JP.EQ.IA) GO TO 100
  2877.           CALL EMIT(LD,JP,RA)
  2878.           REGS(1) = 0
  2879. C
  2880. 100   CONTINUE
  2881.           CALL EMIT(LD,RA,-255)
  2882.           J = (FAL+J)*32 + (CARRY+K-1)
  2883.           CALL EMIT(JMC,J,CODLOC+4)
  2884.           CALL EMIT(XR,RA,0)
  2885.       GO TO 300
  2886. C
  2887. C     ACCUMULATOR CONTAINS THE BOOLEAN VALUE (0 OR 1)
  2888. 300   CONTINUE
  2889. C     SET UP PENDING REGISTER STORE
  2890.       REGS(1) = IA
  2891.       RASN(S) = MOD(I,256)
  2892. 9999  RETURN
  2893.       END
  2894.       SUBROUTINE SAVER
  2895.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  2896.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  2897. C     SAVE THE ACTIVE REGISTERS AND RESET TABLES
  2898.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  2899.      1    SP,MAXSP,INTBAS
  2900.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  2901.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  2902.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2903.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2904.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2905.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2906.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2907.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  2908.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  2909.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  2910.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  2911.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  2912.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  2913.       INTEGER VARB,INTR,PROC,LABEL,LITER
  2914.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  2915. C     FIRST DETERMINE THE STACK ELEMENTS WHICH MUST BE SAVED
  2916.       IC1 = 0
  2917.       IC2 = 0
  2918.       I1 = 0
  2919.       I2 = 0
  2920. C
  2921.       IF (SP.EQ.0) GO TO 3000
  2922.       DO 1000 J=1,SP
  2923.       K = RASN(J)
  2924.       IF (K.GT.255) CALL CVCOND(J)
  2925.       IF (K.LE.0) GO TO 1000
  2926.       K = RASN(J)
  2927.       IF (K.GE.16) GO TO 800
  2928. C         SINGLE BYTE
  2929.           IF (LOCK(K).EQ.1) GO TO 1000
  2930.           ST(J) = I1
  2931.           IC1 = IC1 + 1
  2932.           I1 = J
  2933.           GO TO 1000
  2934. C
  2935. C         DOUBLE BYTE
  2936. 800   L = MOD(K,16)
  2937.       K = K/16
  2938.       IF ((LOCK(L)+LOCK(K)).GT.0) GO TO 1000
  2939.       ST(J) = I2
  2940.       I2 = J
  2941.       IC2 = IC2 + 1
  2942. 1000  CONTINUE
  2943. C
  2944.       LMEM = LMEM - IC1 - (IC2*2)
  2945.       IF  (((MOD(LMEM,2)*IC2).GT.0).AND.(IC1.EQ.0)) LMEM=LMEM-1
  2946. C     LMEM IS NOW PROPERLY ALIGNED.
  2947.       IF (LMEM.GE.0) GO TO 1100
  2948.           CALL ERROR(119,1)
  2949.           GO TO 99999
  2950. 1100  CONTINUE
  2951.       K = LMEM
  2952. C
  2953. 2000  IF ((I1+I2).EQ.0) GO TO 3000
  2954.       IF ((MOD(K,2).EQ.1).OR.(I2.EQ.0)) GO TO 2100
  2955. C     EVEN BYTE BOUNDARY WITH DOUBLE BYTES TO STORE
  2956.           I = I2
  2957.           I2 = ST(I)
  2958.           GO TO 2200
  2959. C
  2960. C      SINGLE BYTE
  2961. 2100      I = I1
  2962.           I1 = ST(I)
  2963. 2200   IF (I.GT.0) GO TO 2300
  2964.            CALL ERROR(120,1)
  2965.            GO TO 99999
  2966. C
  2967. C     PLACE TEMPORARY INTO SYMBOL TABLE
  2968. 2300  SYTOP = SYTOP + 1
  2969.       ST(I) = SYTOP
  2970.       SYMBOL(SYTOP) = SYINFO
  2971.       J = RASN(I)
  2972.       L = 1
  2973.       IF (J.GE.16) L = 2
  2974.       SYMBOL(SYINFO) = K
  2975.       K = K + L
  2976.       SYINFO = SYINFO - 1
  2977.       SYMBOL(SYINFO) = 256 + L*16 + VARB
  2978. C     LENGTH IS 1*256
  2979.       SYINFO = SYINFO - 1
  2980. C     LEAVE ROOM FOR LXI CHAIN
  2981.       SYMBOL(SYINFO) = 0
  2982.       SYINFO = SYINFO - 1
  2983.       IF (SYTOP.LE.SYINFO) GO TO 2400
  2984.           CALL ERROR(121,5)
  2985.           GO TO 99999
  2986. C
  2987. 2400  CONTINUE
  2988. C     STORE INTO MEMORY
  2989.       L = RASN(I)
  2990.       RASN (I) = 0
  2991.       SP = SP + 1
  2992.       CALL SETADR(SYTOP)
  2993.       CALL LITADD(SP)
  2994. 2450  I = MOD(L,16)
  2995.       IF (I.NE.REGS(1)) GO TO 2500
  2996.           I = 1
  2997.           REGS(RA) = 0
  2998.           REGV(RA) = -1
  2999. 2500  CONTINUE
  3000.       CALL EMIT(LD,ME,I)
  3001.       L = L / 16
  3002.       IF (L.EQ.0) GO TO 2700
  3003. C     DOUBLE BYTE STORE
  3004.       CALL EMIT(IN,RL,0)
  3005.       REGV(7) = REGV(7) + 1
  3006.       GO TO 2450
  3007. C
  3008. 2700  CALL DELETE(1)
  3009.       GO TO 2000
  3010. C
  3011. C     END OF REGISTER STORES
  3012. 3000  CONTINUE
  3013.       DO 4000 I=2,7
  3014.       IF (LOCK(I).EQ.1) GO TO 4000
  3015.       REGS(I) = 0
  3016.       REGV(I) = -1
  3017. 4000  CONTINUE
  3018. 99999 RETURN
  3019.       END
  3020.       SUBROUTINE RELOC
  3021.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  3022.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  3023.       INTEGER CODLOC,ALTER,CBITS(43)
  3024.       COMMON /CODE/CODLOC,ALTER,CBITS
  3025.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3026.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3027.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3028.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3029.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3030.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3031.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3032.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3033.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3034.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3035.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3036.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3037.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  3038.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  3039.       INTEGER INTPRO(8)
  3040.       COMMON /INTER/INTPRO
  3041.       INTEGER CONTRL(64)
  3042.       COMMON /CNTRL/CONTRL
  3043.       INTEGER INLOC,OUTLOC,TIMLOC,CASJMP
  3044.       COMMON /BIFLOC/INLOC,OUTLOC,TIMLOC,CASJMP
  3045.       INTEGER VARB,INTR,PROC,LABEL,LITER
  3046.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  3047.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  3048.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  3049.       INTEGER RIGHT,SHL,SHR,GET
  3050.       INTEGER SMSSG(29)
  3051.       COMMON/SMESSG/SMSSG
  3052.       INTEGER STSIZE,STLOC
  3053. C
  3054.       IF (CONTRL(30).LT.2) GO TO 18
  3055.       DO 12 I=1,SYTOP
  3056.       CALL CONOUT(0,-4,I,10)
  3057.       CALL PAD(1,39,1)
  3058.       CALL CONOUT(1,-6,SYMBOL(I),10)
  3059. 12    CONTINUE
  3060. C
  3061.       DO 14 I=SYINFO,SYMAX
  3062.       CALL CONOUT(0,-5,I,10)
  3063.       CALL PAD(1,39,1)
  3064.       J = SYMBOL(I)
  3065.       K = 45
  3066.       IF (J.GE.0) K = 1
  3067.       CALL PAD(1,K,1)
  3068.       CALL CONOUT(1,8,IABS(J),16)
  3069. 14    CONTINUE
  3070. C
  3071. 18    CONTINUE
  3072. C     COMPUTE MAX STACK DEPTH REQUIRED FOR CORRECT EXECUTION
  3073.       STSIZE = MAXDEP(1)
  3074.           DO 20 N=1,8
  3075.           I = INTPRO(N)
  3076.           IF (I.EQ.0) GO TO 20
  3077. C         GET INTERRUPT PROCEDURE DEPTH
  3078.           I = SYMBOL(I) - 3
  3079.           I = SYMBOL(I) + 1
  3080. C         NOTE THAT I EXCEEDS DEPTH BY 1 SINCE RET MAY BE PENDING
  3081.           STSIZE = STSIZE + I
  3082. 20        CONTINUE
  3083.       STSIZE = STSIZE * 2
  3084. C
  3085.       N = STSIZE
  3086.       IF (CONTRL(47).NE.0) N = 0
  3087. C     ALIGN TO EVEN BOUNDARY, IF NECESSARY
  3088.       IF ((N.NE.0).AND.(MOD(LMEM,2).EQ.1)) LMEM=LMEM-1
  3089.       STLOC = LMEM
  3090.       LMEM = LMEM - N
  3091. C     STSIZE IS NUMBER OF BYTES REQD FOR STACK, STLOC IS ADDR
  3092. C
  3093.           IW = CONTRL(34)/14
  3094.           N = 0
  3095. C     COMPUTE PAGE TO START VARIABLES
  3096.       I = 0
  3097.       IF (MOD(CODLOC,256).GT.MOD(LMEM,256)) I = 1
  3098.       I = I+CODLOC/256
  3099.       IF (CONTRL(33).GT.I) I = CONTRL(33)
  3100. C
  3101. C     COMPUTE FIRST RELATIVE ADDRESS PAGE
  3102.       J = LMEM/256 - I
  3103.       IF (J.GE.0) GO TO 50
  3104.           CALL ERROR(122,1)
  3105.           GO TO 9999
  3106. 50    DO 300 I=1,SYTOP
  3107.           M = SYMBOL(I)
  3108.           K = SYMBOL(M)
  3109.           IF (K.LT.0) GO TO 300
  3110. C
  3111. C     NOW FIX PAGE NUMBER
  3112. C
  3113.       L = RIGHT(SHR(K,8),8) - J
  3114. C     L IS RELOCATED PAGE NUMBER
  3115.       SYMBOL(M) = SHL(L,8)+RIGHT(K,8)
  3116.       K = SHR(K,16)
  3117. 100   CONTINUE
  3118.       IF (K.EQ.0) GO TO 150
  3119. C     BACKSTUFF LHI L INTO LOCATION K-1
  3120.       IP = GET(K-1)*256+GET(K)
  3121.       CALL PUT(K-1,38)
  3122.       CALL PUT(K,L)
  3123.        K = IP
  3124.        GO TO 100
  3125. 150   CONTINUE
  3126. C     BACKSTUFF LXI REFERENCES TO THIS VARIABLE
  3127.       K = SYMBOL(M-2)
  3128.       M = SYMBOL(M)
  3129. C     K IS LXI CHAIN HEADER, M IS REAL ADDRESS
  3130. 160       IF (K.EQ.0) GO TO 300
  3131.           L = GET(K) + GET(K+1)*256
  3132.           CALL PUT(K,MOD(M,256))
  3133.           CALL PUT(K+1,M/256)
  3134.           K = L
  3135.           GO TO 160
  3136. 300   CONTINUE
  3137.       IF (CONTRL(24).NE.0) CALL WRITEL(0)
  3138. C
  3139. C     RELOCATE AND BACKSTUFF THE STACK TOP REFERENCES
  3140.       STLOC = STLOC - J*256
  3141. 310   IF (LXIS.EQ.0) GO TO 320
  3142.           I = LXIS
  3143.           LXIS = GET(I) + GET(I+1)*256
  3144.           CALL PUT(I,MOD(STLOC,256))
  3145.           CALL PUT(I+1,STLOC/256)
  3146.           GO TO 310
  3147. 320   CONTINUE
  3148.       CALL FORM(0,SMSSG,1,11,29)
  3149.       IF (CONTRL(47).EQ.1) GO TO 330
  3150.       CALL FORM(1,SMSSG,12,13,29)
  3151.       CALL CONOUT(2,-10,STSIZE,10)
  3152.       CALL FORM(1,SMSSG,24,29,29)
  3153.       GO TO 340
  3154. 330   CALL FORM(1,SMSSG,14,23,29)
  3155. 340   CALL WRITEL(0)
  3156. C
  3157. C     NOW BACKSTUFF ALL OTHER TRC, TRA, AND PRO ADDRESSES
  3158. C
  3159.       DO 700 I = 1, SYTOP
  3160.           J = SYMBOL(I)
  3161.           K = -SYMBOL(J)
  3162.           L = IABS(SYMBOL(J-1))
  3163.           L = RIGHT(L,4)
  3164.           IF (L.NE.LABEL.AND.L.NE.PROC) GO TO 700
  3165.           L = RIGHT(SHR(K,2),14)
  3166.           N = RIGHT(K,2)
  3167.           K = SHR(K,16)
  3168. 600       IF (L.EQ.0) GO TO 650
  3169.               M = GET(L) + GET(L+1) * 256
  3170.               CALL PUT(L,MOD(K,256))
  3171.               CALL PUT(L+1,K/256)
  3172.               L = M
  3173.           GO TO 600
  3174. 650       SYMBOL(J) = SHL(K,16) + N
  3175. 700   CONTINUE
  3176.       IF (PREAMB.LE.0) GO TO 900
  3177.           DO 710 I=1,8
  3178.           J = INTPRO(I)
  3179.           IF (J.EQ.0)  GO TO 710
  3180.               J = SYMBOL(J)
  3181.               J = IABS(SYMBOL(J))/65536
  3182.               INTPRO(I) = J*256 + 195
  3183. C             INTPRO CONTAINS INVERTED JUMP TO PROCEDURE
  3184. 710       CONTINUE
  3185.       IF (INTPRO(1).EQ.0) INTPRO(1) = (OFFSET+PREAMB)*256+195
  3186. C     ** NOTE THAT JUMP INST IS 11000011B = 195D **
  3187.       K = OFFSET
  3188.       OFFSET = 0
  3189.       I = 0
  3190.       J = 1
  3191. 720   L = INTPRO(J)
  3192.       J = J + 1
  3193. 730       CALL PUT(I,MOD(L,256))
  3194.           L = L/256
  3195.           I = I + 1
  3196.           IF (I.GE.PREAMB) GO TO 740
  3197.           IF (MOD(I,8).EQ.0) GO TO 720
  3198.           GO TO 730
  3199. C
  3200. 740   OFFSET = K
  3201. 900   CONTINUE
  3202. 9999  RETURN
  3203.       END
  3204.       SUBROUTINE LOADIN
  3205.       INTEGER CODLOC,ALTER,CBITS(43)
  3206.       COMMON /CODE/CODLOC,ALTER,CBITS
  3207.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  3208.      1    ITRAN(256),OTRAN(64)
  3209.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  3210.      1    ITRAN,OTRAN
  3211.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  3212.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  3213.       INTEGER CONTRL(64)
  3214.       COMMON /CNTRL/CONTRL
  3215.       INTEGER GNC,RIGHT,SHL,SHR,GET
  3216. C     SAVE THE CURRENT INPUT FILE NUMBER
  3217.       M = CONTRL(20)
  3218.       CONTRL(20) = CONTRL(32)
  3219. C     GET RID OF LAST CARD IMAGE
  3220.       IBP = 99999
  3221. 5     I = GNC(0)
  3222.       IF (I.EQ.1) GO TO 5
  3223.       IF (I.NE.41) GO TO 8000
  3224. C
  3225. C     PROCESS NEXT SYMBOL TABLE ENTRY
  3226. 100   I = GNC(0)
  3227.       IF (I.EQ.41) GO TO 9999
  3228. C
  3229.       I = I - 2
  3230. C     BUILD ADDRESS OF INITIALIZED SYMBOL
  3231.       K = 32
  3232.           DO 200 J=1,2
  3233.           I = (GNC(0)-2)*K+I
  3234. 200       K = K * 32
  3235. C
  3236.       J = SYMBOL(I)
  3237.       K = SYMBOL(J-1)
  3238.       K = MOD(K/16,16)
  3239.       J = SYMBOL(J)
  3240. C     J IS STARTING ADDRESS, AND K IS THE PRECISION OF
  3241. C     THE BASE VARIABLE
  3242.       IF (CODLOC.LE.J) GO TO 300
  3243.           CALL ERROR(123,1)
  3244. 300   IF (CODLOC.GE.J) GO TO 350
  3245.           CALL PUT(CODLOC,0)
  3246.           CODLOC = CODLOC + 1
  3247.           GO TO 300
  3248. C
  3249. C     READ HEX VALUES UNTIL NEXT '/' IS ENCOUNTERED
  3250. 350   LP = - 1
  3251. 400   LP = LP + 1
  3252.       I = GNC(0) - 2
  3253. C     CHECK FOR ENDING /
  3254.       IF (I.EQ.39) GO TO 100
  3255.       L = I/16
  3256.       I = MOD(I,16)*16+(GNC(0)-2)
  3257. C     I IS THE NEXT HEX VALUE, AND L=1 IF BEGINNING OF A NEW BVALUE
  3258.           IF (K.NE.2) GO TO 1000
  3259. C         DOUBLE BYTE INITIALIZE
  3260.           IF (L.NE.0) GO TO 500
  3261. C         CHECK FOR LONG CONSTANT
  3262.           IF (LP.LT.2) GO TO 600
  3263. 500       LP = 0
  3264.               CALL PUT(CODLOC,I)
  3265.               CALL PUT(CODLOC+1,0)
  3266.           GO TO 1100
  3267. C
  3268. C         EXCHANGE PLACES WITH H.O. AND L.O. BYTES
  3269. 600           N = GET(CODLOC-2)
  3270.               CALL PUT(CODLOC-1,N)
  3271.               CALL PUT(CODLOC-2,I)
  3272.           GO TO 400
  3273. C
  3274. 1000          CALL PUT(CODLOC,I)
  3275. 1100           CODLOC = CODLOC + K
  3276.           GO TO 400
  3277. C
  3278. C
  3279. 8000  CALL ERROR(124,1)
  3280. 9999  CONTINUE
  3281.       CONTRL(20) = M
  3282.       RETURN
  3283.       END
  3284.       SUBROUTINE EMITBF(L)
  3285. C     EMIT CODE FOR THE BUILT-IN FUNCTION L.  THE BIFTAB
  3286. C     ARRAY IS HEADED BY A TABLE WHICH EITHER GIVES THE STARTING
  3287. C     LOCATION OF THE BIF CODE IN BIFTAB (IF NEGATIVE) OR THE
  3288. C     ABSOLUTE CODE LOCATION OF THE FUNCTION IF ALREADY
  3289. C     EMITTED.
  3290.       INTEGER CODLOC,ALTER,CBITS(43)
  3291.       COMMON /CODE/CODLOC,ALTER,CBITS
  3292.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3293.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3294.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3295.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3296.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3297.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3298.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3299.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3300.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3301.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3302.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3303.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3304.       INTEGER GET,ALLOC
  3305.       INTEGER BIFTAB(41),BIFPAR
  3306.       COMMON /BIFCOD/BIFTAB,BIFPAR
  3307.       I = BIFTAB(L)
  3308.       IF (I.GE.0) GO TO 1000
  3309. C     CODE NOT YET EMITTED
  3310.       I = -I
  3311.       CALL EMIT(JMP,0,0)
  3312. C     BACKSTUFF ADDRESS LATER
  3313.       BIFTAB(L) = CODLOC
  3314. C     GET NUMBER OF BYTES TO EMIT
  3315.       K = BIFTAB(I)
  3316.       I = I + 1
  3317. C     THEN THE NUMBER OF RELATIVE ADDRESS STUFFS
  3318.       KP = BIFTAB(I)
  3319.       I = I + 1
  3320. C     START EMITTING CODE
  3321.       M = I + KP
  3322.       JP = 0
  3323. 100   IF (JP.GE.K) GO TO 200
  3324.       IF (MOD(JP,3).NE.0) GO TO 110
  3325.           N = BIFTAB(M)
  3326.           M = M + 1
  3327. 110   LP = ALLOC(1)
  3328.       CALL PUT(CODLOC,MOD(N,256))
  3329.       N = N/256
  3330.       CODLOC = CODLOC + 1
  3331.       JP = JP + 1
  3332.       GO TO 100
  3333. C
  3334. C     NOW GO BACK AND REPLACE RELATIVE ADDRESSES WITH
  3335. C     ABSOLUTE ADDRESSES.
  3336. C
  3337. 200   JP = 0
  3338.       N = BIFTAB(L)
  3339. 300   IF (JP.GE.KP) GO TO 400
  3340.       M = BIFTAB(I)
  3341.       I = I + 1
  3342.       K = GET(N+M) + GET(M+N+1)*256 + N
  3343.       CALL PUT(N+M,MOD(K,256))
  3344.       CALL PUT(N+M+1,K/256)
  3345.       JP = JP + 1
  3346.       GO TO 300
  3347. C
  3348. 400   CONTINUE
  3349.       I = BIFTAB(L)
  3350. C     BACKSTUFF BRANCH AROUND FUNCTION
  3351.       CALL PUT(I-2,MOD(CODLOC,256))
  3352.       CALL PUT(I-1,CODLOC/256)
  3353. C
  3354. C     EMIT CALL ON THE FUNCTION
  3355. 1000  CALL EMIT(CAL,I,0)
  3356.       RETURN
  3357.       END
  3358.       SUBROUTINE INLDAT
  3359.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  3360.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  3361.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  3362.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  3363.       INTEGER CONTRL(64)
  3364.       COMMON /CNTRL/CONTRL
  3365.       INTEGER CODLOC,ALTER,CBITS(43)
  3366.       COMMON /CODE/CODLOC,ALTER,CBITS
  3367.       INTEGER POLCHR(18),OPCVAL(51)
  3368.       COMMON /OPCOD/POLCHR,OPCVAL
  3369.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  3370.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3371.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3372.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3373.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3374.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3375.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3376.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3377.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3378.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3379.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3380.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3381.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3382.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  3383.      1    SP,MAXSP,INTBAS
  3384.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  3385.       INTEGER VARB,INTR,PROC,LABEL,LITER
  3386.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  3387.       INTEGER OPR,ADR,VLU,DEF,LIT,LIN,
  3388.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  3389.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  3390.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  3391.      *AX1,AX2,AX3
  3392.       COMMON /ILCOD/ OPR,ADR,VLU,DEF,LIT,LIN,
  3393.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  3394.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  3395.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  3396.      *AX1,AX2,AX3
  3397. C     EMIT DATA INLINE
  3398.       IQ = CODLOC
  3399.       L = 0
  3400. 100   K = 0
  3401.           IF (LAPOL.EQ.0) GO TO 600
  3402.           DO 200 J=1,3
  3403. 150       I = GNC(0)
  3404.           IF (I.EQ.1) GO TO 150
  3405.           IF ((I.LT.2).OR.(I.GT.33)) GO TO 600
  3406. 200       K = K *32 + I - 2
  3407. C
  3408.       I = K
  3409.       K = LAPOL
  3410.       LAPOL = I
  3411. C
  3412.       KP = MOD(K,8)
  3413.       K = K / 8
  3414. C     KP IS TYP AND K IS DATA
  3415.       IF (L.GT.0) GO TO 300
  3416. C
  3417. C     DEFINE INLINE DATA SYMBOL
  3418.       IF (KP.NE.DEF) GO TO 600
  3419.       IC = K
  3420.       IF (K.GT.0) GO TO 400
  3421. C     INLINE CONSTANT -- SET UP SYMBOL ENTRY
  3422.       SYTOP = SYTOP + 1
  3423.       IC = - SYTOP
  3424.       SYMBOL(SYTOP) = SYINFO
  3425.       SYINFO = SYINFO - 2
  3426. C     WILL BE FILLED LATER
  3427.       IF (SYINFO.LT.SYTOP) GO TO 600
  3428.       GO TO 400
  3429. C
  3430. C     READ DATA AND STORE INTO ROM
  3431. 300   CONTINUE
  3432.       IF (KP.EQ.OPR) GO TO 500
  3433.       IF (KP.NE.LIT) GO TO 600
  3434.       CALL EMIT(0,K,0)
  3435. 400   L = L + 1
  3436.       GO TO 100
  3437. C
  3438. C     END OF DATA
  3439. 500   CONTINUE
  3440.       IF (K.NE.DAT) GO TO 600
  3441. C     BACKSTUFF JUMP ADDRESS
  3442. C     NOW FIX SYMBOL TABLE ENTRIES
  3443.       K = IABS(IC)
  3444.       L = L - 1
  3445.       K = SYMBOL(K)
  3446.       SYMBOL(K) = - IQ
  3447.       K = K - 1
  3448.       J = SYMBOL(K)
  3449. C     CHECK SYMBOL LENGTH AGAINST COUNT
  3450.       J = J/256
  3451.       SYMBOL(K) = L*256+16+VARB
  3452.       IF (IC.LT.0) GO TO 550
  3453. C     CHECK SIZE DECLARED AGAINST SIZE READ
  3454.       IF (J.EQ.L) GO TO 1000
  3455. C
  3456. 600   CONTINUE
  3457.       IF (KP.NE.LIN) GO TO 700
  3458.       CONTRL(14) = K
  3459.       GO TO 100
  3460. 700   CALL ERROR(125,1)
  3461.       GO TO 1000
  3462. C
  3463. C     THIS IS AN ADDRESS REFERENCE TO A CONSTANT, SO..
  3464. 550   SP = SP + 1
  3465.       ST(SP) = IC
  3466.       RASN(SP) = 0
  3467.       LITV(SP) = IQ
  3468.       PREC(SP) = 2
  3469. C
  3470. C
  3471. 1000  CONTINUE
  3472. 2000  RETURN
  3473.       END
  3474.       SUBROUTINE UNARY(IVAL)
  3475.       INTEGER IVAL,VAL
  3476. C     'VAL' IS AN INTEGER CORRESPONDING TO THE OPERATIONS--
  3477. C     RTL(1) RTR(2) SFL(3) SFR(4) SCL(5) SCR(6) HIV(7) LOV(8)
  3478.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3479.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3480.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3481.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3482.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3483.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3484.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3485.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3486.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3487.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3488.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3489.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3490.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  3491.      1    SP,MAXSP,INTBAS
  3492.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  3493. C     ** NOTE THAT THE FOLLOWING CODE ASSUMES THE VALUE OF RTL = 37
  3494.       VAL = IVAL - 36
  3495.       IF (RASN(SP).GT.255) CALL CVCOND(SP)
  3496.       IP = PREC(SP)
  3497.       GO TO (1000,1000,3000,3000,3000,3000,9990,5000,6000),VAL
  3498. C     RTL RTR
  3499. 1000  CONTINUE
  3500.       IF (IP.GT.1) GO TO 9990
  3501.       IF (RASN(SP).NE.0) GO TO 1100
  3502.           CALL LOADV(SP,1)
  3503.           REGS(1) = MOD(RASN(SP),16)
  3504. 1100  I = MOD(RASN(SP),16)
  3505.       K = REGS(1)
  3506.       IF (K.EQ.0) GO TO 1200
  3507.       IF (K.EQ.I) GO TO 1300
  3508.           CALL EMIT(LD,K,RA)
  3509. 1200      CALL EMIT(LD,RA,I)
  3510.       REGS(1) = I
  3511. 1300  I = LFT
  3512.       IF (VAL.EQ.2) I = RGT
  3513.       CALL EMIT(ROT,CY,I)
  3514.       GO TO 9999
  3515. C
  3516. C     SFL SFR  SCL SCR
  3517. 3000  CONTINUE
  3518.       J = 1
  3519.       IF (((VAL.EQ.4).OR.(VAL.EQ.6)).AND.(IP.GT.1)) J =0
  3520.       I = RASN(SP)
  3521.       IF (I.GT.0) GO TO 3100
  3522. C
  3523. C         LOAD FROM MEMORY
  3524.           CALL LOADV(SP,J)
  3525.           I = RASN(SP)
  3526.            IF (J.EQ.1) REGS(1) = MOD(I,16)
  3527. C
  3528. C     MAY HAVE TO STORE THE ACCUMULATOR
  3529. 3100  IA = MOD(I,16)
  3530.       IB = I/16
  3531.       K = IA
  3532.       IF (J.NE.1) K = IB
  3533.       JP = REGS(1)
  3534. C     WE WANT REGISTER K TO BE IN THE ACCUMULATOR
  3535.       IF (JP.EQ.K) GO TO 3200
  3536.       IF (JP.EQ.0) GO TO 3150
  3537.           CALL EMIT(LD,JP,RA)
  3538. 3150      CALL EMIT(LD,RA,K)
  3539. 3200  REGS(1) = K
  3540. C
  3541. C     SFL AND SFR TAKE SEPARATE PATHS NOW...
  3542.       IF ((VAL.EQ.4).OR.(VAL.EQ.6)) GO TO 4000
  3543. C
  3544. C     SFL - CLEAR CARRY AND SHIFT
  3545.           IF (VAL.EQ.3) CALL EMIT(AD,RA,RA)
  3546.           IF (VAL.EQ.5) CALL EMIT(ROT,ACC,LFT)
  3547.           IF (IP.LT.2) GO TO 9999
  3548.           CALL EMIT(LD,IA,RA)
  3549.           CALL EMIT(LD,RA,IB)
  3550.           CALL EMIT(ROT,ACC,LFT)
  3551.           REGS(1) = IB
  3552.           GO TO 9999
  3553. C
  3554. C     SFR - ACCUMULATOR CONTAINS VALUE TO SHIFT FIRST
  3555. 4000  CONTINUE
  3556.           IF (VAL.EQ.4) CALL EMIT(OR,RA,0)
  3557.           CALL EMIT(ROT,ACC,RGT)
  3558.           IF (IP.LT.2) GO TO 9999
  3559.           CALL EMIT(LD,IB,RA)
  3560.           CALL EMIT(LD,RA,IA)
  3561.           CALL EMIT(ROT,ACC,RGT)
  3562.           REGS(1) = IA
  3563.           GO TO 9999
  3564. C
  3565. C     HIV
  3566. 5000  CONTINUE
  3567.       IF (IP.LT.2) GO TO 9990
  3568.       IF (RASN(SP).GT.0) GO TO 5100
  3569.           CALL LOADV(SP,0)
  3570. 5100  I = RASN(SP)
  3571.       IP = MOD(I/16, 16)
  3572.       IQ = MOD(I, 16)
  3573.       IF (REGS(1) .EQ. IQ) REGS(1) = 0
  3574.       REGS(IP) = 0
  3575.       REGV(IP) = -1
  3576.       RASN(SP) = IQ
  3577.       PREC(SP) = 1
  3578.       IF (REGS(1) .NE. IP) GO TO 5200
  3579.       REGS(1) = IQ
  3580.       GO TO 9999
  3581. 5200  CALL EMIT (LD, IQ, IP)
  3582.       GO TO 9999
  3583. C
  3584. C     LOV
  3585. 6000  CONTINUE
  3586.       PREC(SP) = 1
  3587. C     MAY HAVE TO RELEASE REGISTER
  3588.       I = RASN(SP)
  3589.       RASN(SP) = MOD(I,16)
  3590.       I = I/16
  3591.       IF (I.EQ.0) GO TO 9999
  3592.       REGS(I) = 0
  3593.       REGV(I) = -1
  3594.       IF (REGS(1).EQ.I) REGS(1) = 0
  3595.       GO TO 9999
  3596. C
  3597. 9990  CALL ERROR(126,1)
  3598. 9999  RETURN
  3599.       END
  3600.       SUBROUTINE EXCH
  3601.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  3602.      1    SP,MAXSP,INTBAS
  3603.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  3604.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  3605.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  3606.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3607.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3608.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3609.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3610.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3611.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3612.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3613.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3614.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3615.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3616.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3617.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3618. C     EXCHANGE THE TOP TWO ELEMENTS OF THE STACK
  3619.       J = SP-1
  3620.       IF ((ST(J).NE.0).OR.(RASN(J).NE.0).OR.(LITV(J).GE.0)) GO TO 40
  3621. C     SECOND ELEMENT IS PUSHED - CHECK TOP ELT
  3622.       IF ((RASN(SP).EQ.0).AND.(LITV(SP).LT.0)) GO TO 30
  3623. C     TOP ELT IS IN CPU REGS
  3624. C
  3625. C     ASSUME THERE WILL BE AN IMMEDIATE OPERATION, SO ALLOW
  3626. C          REG/PUSH TO BE CHANGED TO PUSH/REG
  3627.       GO TO 40
  3628. C
  3629. C     POP ELEMENT (SECOND IF DROP THRU, TOP IF FROM 30)
  3630. 20        CALL GENREG(-1,IA,IB)
  3631.           IF (IA.NE.0) GO TO 25
  3632.               CALL ERROR(107,5)
  3633.               GO TO 40
  3634. 25        IF (PREC(J).GT.1) IB = IA - 1
  3635.           CALL EMIT(POP,IA-1,0)
  3636.           CALL USTACK
  3637.           REGS(IA) = J
  3638.           IF (IB.NE.0) REGS(IB) = J
  3639.           RASN(J) = IB*16 + IA
  3640.           IF (J.NE.SP) GO TO 40
  3641.           J = SP - 1
  3642.           GO TO 20
  3643. C     SECOND ELT IS PUSHED, TOP ELT IS NOT IN CPU
  3644. 30    IF (ST(SP).NE.0) GO TO 40
  3645. C     BOTH ARE PUSHED, SO GO THRU 20 TWICE
  3646.           J = SP
  3647.           GO TO 20
  3648. C
  3649. 40    J = SP-1
  3650.       DO 100 I=2,7
  3651.       IF (REGS(I).NE.SP) GO TO 50
  3652.           REGS(I) = J
  3653.           GO TO 100
  3654. 50    IF (REGS(I).EQ.J) REGS(I) = SP
  3655. 100   CONTINUE
  3656.       I = PREC(SP)
  3657.       PREC(SP) = PREC(J)
  3658.       PREC(J) = I
  3659. C
  3660.       I = RASN(SP)
  3661.       RASN(SP) = RASN(J)
  3662.       RASN(J) = I
  3663. C
  3664.       I = ST(SP)
  3665.       ST(SP) = ST(J)
  3666.       ST(J) = I
  3667. C
  3668.       I = LITV(SP)
  3669.       LITV(SP) = LITV(J)
  3670.       LITV(J) = I
  3671. C
  3672.       RETURN
  3673.       END
  3674.       SUBROUTINE STACK(N)
  3675. C     ADD N TO CURRENT DEPTH, TEST FOR STACKSIZE EXC MAXDEPTH
  3676.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  3677.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  3678.       K = PRSP+1
  3679.       J = CURDEP(K) + N
  3680.       IF (J.GT.MAXDEP(K)) MAXDEP(K) = J
  3681.       CURDEP(K) = J
  3682.       RETURN
  3683.       END
  3684.       SUBROUTINE READCD
  3685.       INTEGER TERR(22)
  3686.       LOGICAL ERRFLG
  3687.       COMMON/TERRR/TERR,ERRFLG
  3688.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  3689.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  3690.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  3691.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  3692.       INTEGER XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  3693.       COMMON /XFROPT/XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  3694.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  3695.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  3696.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  3697.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  3698.       INTEGER STHEAD(12)
  3699.       COMMON/STHED/STHEAD
  3700.       INTEGER INTPRO(8)
  3701.       COMMON /INTER/INTPRO
  3702.       INTEGER CONTRL(64)
  3703.       COMMON /CNTRL/CONTRL
  3704.       INTEGER CODLOC,ALTER,CBITS(43)
  3705.       COMMON /CODE/CODLOC,ALTER,CBITS
  3706.       INTEGER POLCHR(18),OPCVAL(51)
  3707.       COMMON /OPCOD/POLCHR,OPCVAL
  3708.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  3709.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  3710.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3711.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3712.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3713.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3714.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3715.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  3716.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  3717.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  3718.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  3719.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  3720.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  3721.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  3722.      1    SP,MAXSP,INTBAS
  3723.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  3724.       INTEGER VARB,INTR,PROC,LABEL,LITER
  3725.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  3726.       INTEGER INLOC,OUTLOC,FIRSTI,CASJMP
  3727.       COMMON /BIFLOC/INLOC,OUTLOC,FIRSTI,CASJMP
  3728.       INTEGER OPR,ADR,VLU,DEF,LIT,LIN,
  3729.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  3730.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  3731.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  3732.      *AX1,AX2,AX3
  3733.       COMMON /ILCOD/ OPR,ADR,VLU,DEF,LIT,LIN,
  3734.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  3735.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  3736.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  3737.      *AX1,AX2,AX3
  3738.       INTEGER LLOC,LLINE,LCNT
  3739.       INTEGER ALLOC
  3740.       CONTRL(14) = 1
  3741.       LLINE = 0
  3742.       LLOC = 0
  3743.       LCNT = CONTRL(34)/12
  3744.       ALTER = 0
  3745.       M = CONTRL(20)
  3746.       CONTRL(20) = CONTRL(21)
  3747.       POLCNT = 0
  3748. C     RESERVE SPACE FOR INTERRUPT LOCATIONS
  3749.           DO 10 I=1,8
  3750.           II = 9-I
  3751.           IF (INTPRO(II).NE.0) GO TO 20
  3752. 10        CONTINUE
  3753.       PREAMB = 0
  3754.       GO TO 22
  3755. 20    PREAMB = (II-1)*8+3
  3756. C     ADJUST CODLOC TO ACCOUNT FOR PREAMBLE
  3757. 22    IF (CODLOC.LT.PREAMB) CODLOC = PREAMB
  3758. C     ALLOCATE 'PREAMBLE' CELLS AT START OF CODE
  3759.       I = ALLOC(PREAMB)
  3760.       OFFSET = CODLOC - PREAMB
  3761. C     SET STACK POINTER UPON PROGRAM ENTRY
  3762.       J = CONTRL(47)
  3763.       IF (J.EQ.1) GO TO 100
  3764.       IF (J.NE.0) GO TO 90
  3765. C     START CHAIN OF LXIS
  3766.       LXIS = CODLOC+1
  3767. 90    CALL EMIT(LXI,RSP,J)
  3768. 100   CONTINUE
  3769.       IF (ERRFLG) GO TO 9000
  3770.       IBASE = 0
  3771. C     MAY HAVE BEEN STACK OVERFLOW SO...
  3772.       IF (SP.LT.0) SP = 0
  3773.       IF (CONTRL(12).EQ.0) GO TO 10700
  3774.       IF ((ALTER.EQ.0).OR.(SP.LE.0)) GO TO 10700
  3775. C     WRITE STACK
  3776.       CALL PAD(0,1,1)
  3777.       CALL PAD(0,1,2)
  3778.       CALL FORM(1,STHEAD,1,2,12)
  3779.       CALL PAD(1,1,3)
  3780.       CALL FORM(1,STHEAD,3,4,12)
  3781.       CALL PAD(1,1,3)
  3782.       CALL FORM(1,STHEAD,5,8,12)
  3783.       CALL PAD(1,1,2)
  3784.       CALL FORM(1,STHEAD,9,12,12)
  3785.       CALL WRITEL(0)
  3786.           DO 10600 I=1,SP
  3787.           IP = SP - I + 1
  3788.           K = PREC(IP)
  3789.           CALL CONOUT(0,2,IP,10)
  3790.           CALL CONOUT(1,-2,K,10)
  3791.           CALL PAD(1,1,1)
  3792.           J = ST(IP)
  3793.           IF (J.EQ.0) GO TO 10200
  3794.           K = 30
  3795.           IF (J.GE.0) GO TO 10100
  3796.           K = 12
  3797.           J = -J
  3798. 10100     CALL PAD(1,K,1)
  3799.           CALL CONOUT(1,5,J,10)
  3800.           GO TO 10300
  3801. C
  3802. 10200     CALL PAD(1,1,6)
  3803. 10300     CALL PAD(1,1,1)
  3804.           K = RASN(IP)
  3805.               DO 10400 J=1,2
  3806.               L = RIGHT(SHR(K,(2-J)*4),4)+11
  3807.               IF (L.EQ.11) L = 45
  3808.               CALL PAD(1,1,1)
  3809. 10400         CALL PAD(1,L,1)
  3810. C
  3811.           K = LITV(IP)
  3812.           IF (K.LT.0) GO TO 10600
  3813.           L = 1
  3814.           IF (SHR(K,16).EQ.0) GO TO 10500
  3815.           L = 29
  3816.           K = RIGHT(K,16)
  3817. 10500     CALL PAD(1,1,1)
  3818.           CALL PAD(1,L,1)
  3819.           CALL CONOUT(1,5,K,10)
  3820. 10600     CALL WRITEL(0)
  3821. C     WRITE REGISTERS
  3822.       IF (CONTRL(12) .LT. 2) GO TO 10700
  3823.           DO 10650 I=1,7
  3824.           IP = REGS(I)
  3825.           KP = LOCK(I)
  3826.           LP = REGV(I)
  3827.           IF ((KP+IP+LP).LT. 0) GO TO 10650
  3828.               CALL PAD(1,1,1)
  3829.               CALL PAD(1,I+11,1)
  3830.               CALL PAD(1,42,1)
  3831.               K = 32
  3832.               IF (KP.EQ.1) K=23
  3833.               CALL PAD(1,K,1)
  3834.               CALL PAD(1,48,1)
  3835.               IF (IP.EQ.0) GO TO 10610
  3836.                   CALL CONOUT(1,2,IP,10)
  3837.                   GO TO 10620
  3838. 10610             CALL PAD(1,47,1)
  3839. 10620         CALL PAD(1,48,1)
  3840.               IF (LP.LT.0) GO TO 10630
  3841.                   CALL CONOUT(2,-10,LP,16)
  3842.                   GO TO 10640
  3843. 10630             CALL PAD(1,47,1)
  3844. 10640         CALL PAD(1,43,1)
  3845. 10650     CONTINUE
  3846.       CALL WRITEL(0)
  3847. C
  3848. 10700 K = 0
  3849.           IF (LAPOL.EQ.0) GO TO 250
  3850.           DO 200 J=1,3
  3851. 110       I = GNC(0)
  3852.           IF(I.EQ.1) GO TO 110
  3853.           IF((I.GE.2) .AND.(I.LE.33)) GO TO 150
  3854.               CALL ERROR(127,5)
  3855.               GO TO 99999
  3856. 150       K = K * 32 + (I-2)
  3857. 200       CONTINUE
  3858. C
  3859. C     COPY THE ELT JUST READ TO THE POLISH LOOK-AHEAD, AND
  3860. C     INTERPRET THE PREVIOUS ELT
  3861. C
  3862. 250   I = K
  3863.       K = LAPOL
  3864.       LAPOL = I
  3865. C     READ AGAIN (ONLY ON FIRST ARRIVAL HERE) IF ELT IS NULL
  3866.       IF (K.LT.0) GO TO 10700
  3867. C
  3868. C     CHECK FOR END OF CODE
  3869.       IF (K.EQ.0) GO TO 9000
  3870.       POLCNT = POLCNT + 1
  3871.       TYP = RIGHT(K,3)
  3872.       VAL = SHR(K,3)
  3873. C     $G=0 FOR NO TRACE, $G=1 GIVES LINES VS LOCS,
  3874. C     $G=2 YIELDS FULL INTERLIST OF I.L.
  3875.       I = CONTRL(18)
  3876.       IF (I.EQ.0) GO TO 2000
  3877.       IF (I.GT.1) GO TO 900
  3878. C
  3879. C     PRINT LINE NUMBER = CODE LOCATION, IF ALTERED
  3880.       IF ((LLINE.EQ.CONTRL(14)).OR.(LLOC.EQ.CODLOC)) GO TO 2000
  3881. C     CHANGED COMPLETELY, SO PRINT IT
  3882.       LLINE = CONTRL(14)
  3883.       LLOC = CODLOC
  3884.       I = 1
  3885.       IF (LCNT.GT.0) GO TO 300
  3886.           LCNT = CONTRL(34)/12
  3887.           I = 0
  3888. 300   LCNT = LCNT - 1
  3889.       CALL PAD(I,1,1)
  3890.       CALL CONOUT(1,-4,LLINE,10)
  3891.       CALL PAD(1,39,1)
  3892.       CALL CONOUT(1,4,LLOC,16)
  3893.       GO TO 2000
  3894. C
  3895. C     OTHERWISE INTERLIST THE I.L.
  3896. 900       CALL CONOUT(0,5,CODLOC,10)
  3897.           CALL PAD(1,1,1)
  3898.           CALL CONOUT(1,4,CODLOC,16)
  3899.           CALL PAD(1,1,1)
  3900.           CALL CONOUT(1,-5,POLCNT,10)
  3901.           CALL PAD(1,1,1)
  3902.           I = TYP*3+1
  3903.           CALL FORM(1,POLCHR,I,I+2,18)
  3904.           CALL PAD(1,1,1)
  3905.           I = TYP + 1
  3906.           J = 1
  3907.       GO TO (1000,1001,1001,1001,1004,1004),I
  3908. 1000  J = OPCVAL(VAL+1)
  3909.           DO 400 I=1,3
  3910.           KP = SHR(J,(3-I)*6)
  3911.           CALL PAD(1,RIGHT(KP,6),1)
  3912. 400       CONTINUE
  3913. C
  3914.       GO TO 1100
  3915. C
  3916. 1001  J = 30
  3917. 1004  CALL PAD(1,J,1)
  3918.       CALL CONOUT(1,5,VAL,10)
  3919. 1100  CONTINUE
  3920.       CALL WRITEL(0)
  3921. C
  3922. 2000  CONTINUE
  3923.       TYP = TYP+1
  3924.       SP = SP + 1
  3925.       IF (SP.LE.MAXSP) GO TO 2100
  3926. C         STACK OVERFLOW
  3927.           CALL ERROR(128,5)
  3928.           SP = 1
  3929. 2100  PREC(SP) = 0
  3930.       ST(SP) = 0
  3931.       RASN(SP) = 0
  3932.       LITV(SP) = -1
  3933.       ALTER = 0
  3934.       GO TO (3000,4000,5000,6000,7000,8000),TYP
  3935. C     OPERATOR
  3936. 3000  SP = SP - 1
  3937.       CALL OPERAT(VAL)
  3938.       GO TO 100
  3939. C     LOAD ADDRESS
  3940. 4000  CONTINUE
  3941.       IF (SP.LE.1) GO TO 4010
  3942. C     CHECK FOR ACTIVE CONDITION CODE WHICH MUST BE CHANGED TO BOOLEAN
  3943.       IF (RASN(SP-1).GT.255) CALL CVCOND(SP-1)
  3944. 4010  I = SYMBOL(VAL)
  3945.       J = SYMBOL(I-1)
  3946.       IF (J.GE.0) GO TO 4500
  3947. C     LOAD ADDRESS OF BASED VARIABLE.  CHANGE TO
  3948. C     LOAD VALUE OF THE BASE, USING THE VARIABLE'S PRECISION
  3949.           IBASE = RIGHT(SHR(-J,4),4)
  3950.           VAL = SYMBOL(I-2)
  3951.       GO TO 5000
  3952. 4500  CALL SETADR(VAL)
  3953.       GO TO 100
  3954. C     LOAD VALUE
  3955. 5000  CONTINUE
  3956.       I = SYMBOL(VAL)
  3957.       J = SYMBOL(I-1)
  3958.       IF (SP.LE.1) GO TO 5010
  3959. C     ALLOW ONLY A LABEL VARIABLE TO BE STACKED
  3960.       IF(MOD(IABS(J),16).EQ.LABEL) GO TO 5010
  3961. C     CHECK FOR ACTIVE CONDITION CODE WHICH MUST BE CHANGED TO BOOLEAN
  3962.       IF (RASN(SP-1).GT.255) CALL CVCOND(SP-1)
  3963. 5010  CONTINUE
  3964. C     CHECK FOR CONDITION CODES
  3965.       IF (VAL.GT.INTBAS) GO TO 5400
  3966.       IF (VAL.LE.4) GO TO 5100
  3967. C     MAY BE A CALL TO INPUT OR OUTPUT
  3968.       IF ((VAL.GE.FIRSTI).AND.(VAL.LE.INTBAS)) GO TO 5400
  3969. C     CHECK FOR REFERENCE TO 'MEMORY'
  3970. C     ** NOTE THAT 'MEMORY' MUST BE AT LOCATION 5 IN THE SYMBOL TABLE **
  3971.       IF (VAL.EQ.5) GO TO 5400
  3972. C     ** NOTE THAT 'STACKPTR' MUST BE AT 6 IN SYM TAB
  3973.       IF (VAL.EQ.6) GO TO 5300
  3974.           CALL ERROR(129,1)
  3975.           GO TO 100
  3976. C     CARRY ZERO MINUS PARITY
  3977. C     SET TO TRUE/CONDITION (1*16+VAL)
  3978. 5100  RASN(SP) = (16+VAL)*256
  3979.       ST(SP) = 0
  3980.       PREC(SP) = 1
  3981.       ALTER = 1
  3982.       GO TO 100
  3983. 5300  CONTINUE
  3984. C     LOAD VALUE OF STACKPOINTER TO REGISTERS IMMEDIATELY
  3985.       CALL GENREG(2,IA,IB)
  3986.       IF (IB.NE.0) GO TO 5310
  3987.           CALL ERROR(107,5)
  3988.           GO TO 100
  3989. 5310  RASN(SP) = IB*16+IA
  3990.       LITV(SP) = -1
  3991.       ST(SP) = 0
  3992.       REGS(IA) = SP
  3993.       REGS(IB) = SP
  3994.       PREC(SP) = 2
  3995.       CALL EMIT(LXI,RH,0)
  3996.       CALL EMIT(DAD,RSP,0)
  3997.       CALL EMIT(LD,IA,RL)
  3998.       CALL EMIT(LD,IB,RH)
  3999.       REGV(RH) = -1
  4000.       REGV(RL) = -1
  4001.       ALTER = 1
  4002.       GO TO 100
  4003. 5400  IF (J.GE.0) GO TO 5500
  4004. C
  4005. C     VALUE REFERENCE TO BASED VARIABLE. FIRST INSURE THAT THIS
  4006. C     IS NOT A LENGTH ATTRIBUTE REFERENCE, (I.E., THE VARIABLE IS
  4007. C     NOT AN ACTUAL PARAMETER FOR A CALL ON LENGTH OR LAST) BY
  4008. C     INSURING THAT THE NEXT POLISH ELT IS NOT AN ADDRESS
  4009. C     REFERENCE TO SYMBOL (LENGTH+1) OR (LAST+1)
  4010. C     NOTE THAT THIS ASSUMES LENGTH AND LAST ARE SYMBOL NUMBERS
  4011. C     18 AND 19
  4012. C
  4013.       IF (LAPOL.EQ.153.OR.LAPOL.EQ.161) GO TO 5500
  4014. C     LOAD VALUE OF BASE VARIABLE.  CHANGE TO LOAD
  4015. C     VALUE OF BASE, FOLLOWED BY A LOD OP.
  4016.           IBASE = RIGHT(SHR(-J,4),4) + 16
  4017.           VAL = SYMBOL(I-2)
  4018.           I = SYMBOL(VAL)
  4019.           J = SYMBOL(I-1)
  4020. 5500  ALTER = 1
  4021. C         EXAMINE ATTRIBUTES
  4022.           ST(SP) = VAL
  4023.           I = RIGHT(J,4)
  4024.           J = SHR(J,4)
  4025.           K = RIGHT(J,4)
  4026.           IF (IBASE.GT.0) K = MOD(IBASE,16)
  4027.           PREC(SP) = K
  4028.           IF (I.LT.(LITER-1)) GO TO 5800
  4029.           IF ((K.GT.0).AND.(K.LT.3)) GO TO 5900
  4030.               CALL ERROR(130,1)
  4031.               GO TO 100
  4032. 5900          LITV(SP) = RIGHT(SHR(J,4),16)
  4033. 5800  CONTINUE
  4034. C     CHECK FOR BASE ADDRESS WHICH MUST BE LOADED
  4035.       IF (IBASE.LT.16) GO TO 100
  4036. C     MUST BE A BASED VARIABLE VALUE REFERENCE.
  4037. C     LOAD THE VALUE OF THE BASE AND FOLLOW IT BY
  4038. C     A LOAD OPERATION.
  4039.       K = PREC(SP)
  4040. C     MARK AS A BYTE LOAD FOR THE LOD OPERATION IN OPERAT
  4041. C     LEAVES 2 IF DOUBLE BYTE RESULT AND 6 (=2 MOD 4) IF SINGLE BYTE
  4042.       PREC(SP) = 10 - 4*K
  4043.       CALL OPERAT(LOD)
  4044.       GO TO 100
  4045. C
  4046. C     DEFINE LOCATION
  4047. 6000  CONTINUE
  4048. C     MARK LAST REGISTER LOAD NIL
  4049.       LASTRG = 0
  4050.       LASTEX = 0
  4051.       LASTIN = 0
  4052.       LASTIR = 0
  4053.       SP = SP - 1
  4054. C     SAVE REGISTERS IF THIS IS A PROC OR A LABEL WHICH WAS
  4055. C     REFERENCED IN A GO-TO STATEMENT OR WAS COMPILER-GENERATED.
  4056.       IP = SYMBOL(VAL)
  4057.       I = IABS(SYMBOL(IP-1))
  4058. C
  4059. C     SAVE THIS DEF SYMBOL NUMBER AND THE LITERAL VALUES OF THE
  4060. C     H AND L REGISTERS FOR POSSIBLE TRA CHAIN STRAIGHTENING.
  4061. C
  4062.       IF(RIGHT(I,4).NE.LABEL) GO TO 6001
  4063.       DEFSYM = VAL
  4064.       DEFRH = REGV(RH)
  4065.       DEFRL = REGV(RL)
  4066. C
  4067. C     WE MAY CONVERT THE SEQUENCE
  4068. C
  4069. C          TRC L, TRA/PRO/RET, DEF L
  4070. C
  4071. C     TO AN EQUIVALENT CONDITIONAL TRA/PRO/RET...
  4072. C
  4073. 6001  IF (I/256.NE.1) GO TO 6004
  4074.       IF (TSTLOC.NE.CODLOC) GO TO 6004
  4075.       IF (CONLOC.NE.XFRLOC-3) GO TO 6004
  4076.       J = -SYMBOL(IP)
  4077.       K = RIGHT(SHR(J,2),14)
  4078.       IF (K.NE.CONLOC+1) GO TO 6004
  4079. C
  4080. C
  4081. C     ADJUST BACKSTUFFING CHAIN FOR JMP OR CALL
  4082. C
  4083.       IF (XFRSYM.LE.0) GO TO 6002
  4084.       K = SYMBOL(XFRSYM)
  4085. C     DECREMENT BACKSTUFF LOCATION BY 3
  4086.       SYMBOL(K) = SYMBOL(K) + 12
  4087. 6002  CONTINUE
  4088. C     ARRIVE HERE WITH THE CONFIGURATION TRC...DEF
  4089. C
  4090.           SYMBOL(IP) = -(SHL(SHR(J,16),16)+RIGHT(J,2))
  4091.           K = MOD(IABS(SYMBOL(IP-1)),256)
  4092.           IF (SYMBOL(IP-1).LT.0) K = -K
  4093.           SYMBOL(IP-1) = K
  4094.           J = GET(CONLOC)
  4095.       J = GET(CONLOC)
  4096.       J = SHR(J,3)
  4097.       K = MOD(MOD(J,2)+1,2)
  4098.       K = SHL(SHR(J,1),1)+K
  4099.       J = GET(XFRLOC)
  4100.       L = RIGHT(SHR(J,1),2)
  4101.       J = SHL(K,3) + SHL(L,1)
  4102. 6003          CALL PUT(CONLOC,J)
  4103.               CONLOC = CONLOC + 1
  4104.               XFRLOC = XFRLOC + 1
  4105.               J = GET(XFRLOC)
  4106.               IF (XFRLOC.NE.CODLOC) GO TO 6003
  4107.           CODLOC = CONLOC
  4108.           MEMBOT = MEMBOT - 3
  4109.           CONLOC = -1
  4110.           XFRLOC = -1
  4111.           TSTLOC = -1
  4112. C
  4113. C     NOTICE THAT DEFRH AND DEFRL ARE NOW INCORRECT
  4114. C     DEFSYM=0 PREVENTS USE OF THESE VARIABLES...
  4115. C     ... IF A TRA IMMEDIATELY FOLLOWS
  4116. C
  4117.           DEFSYM = 0
  4118. 6004  CONTINUE
  4119.       J = RIGHT(I,4)
  4120.       IF (J.NE.LABEL) GO TO 6005
  4121. C         LABEL FOUND.  CHECK FOR REFERENCE TO LABEL
  4122.           I = I/256
  4123.           IF (I.EQ.0) GO TO 6020
  4124. C     CHECK FOR SINGLE REFERENCE, NO CONFLICT WITH H AND L
  4125.       IF (I.NE.1) GO TO 6010
  4126.       I = SYMBOL(IP-2)
  4127. C     CHECK FOR PREVIOUS REFERENCE  FORWARD
  4128.       IF (I.EQ.0) GO TO 6010
  4129.       L = MOD(I,256)
  4130.       I = I/256
  4131.       J = MOD(I,512)
  4132.       I = I/512
  4133.       IF (MOD(I,2).NE.1) L = -1
  4134.       IF (MOD(I/2,2).NE.1) J = -1
  4135. C     J IS H REG, L IS L REG
  4136.       LOCK(6) = 1
  4137.       LOCK(7) = 1
  4138.       CALL SAVER
  4139. C     COMPARE OLD HL WITH NEW HL
  4140.       LOCK(6) = 0
  4141.       LOCK(7) = 0
  4142.       K = REGV(6)
  4143.       REGV(6) = -1
  4144.       IF ((K.EQ.-255).OR.(K.EQ.J)) REGV(6) = J
  4145.       K = REGV(7)
  4146.       REGV(7) = -1
  4147.       IF ((K.EQ.-255).OR.(K.EQ.L)) REGV(7) = L
  4148.       GO TO 6020
  4149. C
  4150. C     OTHERWISE NOT A LABEL, CHECK FOR PROCEDURE ENTRY
  4151. 6005  CONTINUE
  4152.       IF (J.NE.PROC) GO TO 6010
  4153. C         SET UP PROCEDURE STACK FOR PROCEDURE ENTRY
  4154.           PRSP = PRSP + 1
  4155.           IF (PRSP.LE.PRSMAX) GO TO 6008
  4156.               CALL ERROR(145,5)
  4157.               GO TO 6010
  4158. 6008      J = IP - 2
  4159.           PRSTK(PRSP) = J
  4160. C         MARK H AND L AS UNALTERED INITIALLY
  4161. C          /  1B  /  1B  /  1B  /  1B  /  9B  /  8B  /
  4162. C          /H UNAL/L UNAL/H VALD/L VALD/H VALU/L VALU/
  4163. C          -------------------------------------------
  4164.           SYMBOL(J) = SHL(3,19)
  4165.           CALL SAVER
  4166.           REGV(6) = -254
  4167.           REGV(7) = -254
  4168.           K=CODLOC
  4169. C         SET UP STACK DEPTH COUNTERS
  4170.           MAXDEP(PRSP+1) = 0
  4171.           CURDEP(PRSP+1) = 0
  4172.           DO 6009 I=1,8
  4173.           IF (VAL.NE.INTPRO(I)) GO TO 6009
  4174. C         INTERRUPT PROCEDURE IS MARKED WITH HO 1
  4175.           PRSTK(PRSP) = J + 65536
  4176.           CALL EMIT(PUSH,RH,0)
  4177.           CALL EMIT(PUSH,RD,0)
  4178.           CALL EMIT(PUSH,RB,0)
  4179.           CALL EMIT(PUSH,RA,0)
  4180.           CALL STACK(4)
  4181. 6009      CONTINUE
  4182.           GO TO 6025
  4183. C
  4184. 6010  CALL SAVER
  4185. C
  4186. 6020      CONTINUE
  4187. C         LABEL IS RESOLVED.  LAST TWO BITS OF ENTRY MUST BE 01
  4188.           K=CODLOC
  4189. 6025      I = -SYMBOL(IP)
  4190.           J = MOD(I,4)
  4191.           I = I/4
  4192.           IF (J.EQ.1) GO TO 6200
  4193.               CALL ERROR(131,1)
  4194. 6200  SYMBOL(IP) = -(SHL(K,16) + SHL(I,2) + 3)
  4195. C
  4196. C     NOW CHECK FOR PROCEDURE ENTRY POINT
  4197. C
  4198.       I = SYMBOL(IP-1)
  4199.       IF (RIGHT(I,4).NE.PROC) GO TO 100
  4200.       I = SHR(I,8)
  4201. C
  4202. C     BUILD RECEIVING SEQUENCE FOR REGISTER PARAMETERS
  4203. C
  4204.       IF (I.LT.1) GO TO 100
  4205.       K = I - 2
  4206.       IF (K.LT.0) K = 0
  4207.       IF (I.GT.2) I = 2
  4208.       DO 6300 J = 1, I
  4209.           SP = SP + 1
  4210.           IF (SP.LE.MAXSP) GO TO 6310
  4211.               CALL ERROR(113,5)
  4212.               SP = 1
  4213. C     (RD,RE) = 69    (RB,RC) = 35
  4214. 6310      IF (J.EQ.1) L = 35
  4215.           IF (J.EQ.2) L = 69
  4216.           RASN(SP) = L
  4217.           ST(SP) = 0
  4218.           LITV(SP) = -1
  4219.           PREC(SP) = 2
  4220.           SP = SP + 1
  4221.           IF (SP.LE.MAXSP) GOTO 6320
  4222.               CALL ERROR(113,5)
  4223.               SP = 1
  4224. 6320      RASN(SP) = 0
  4225.           LITV(SP) = -1
  4226.           CALL SETADR(VAL+K+J)
  4227.           CALL OPERAT(STD)
  4228. 6300      CONTINUE
  4229.       GO TO 100
  4230. C     LITERAL VALUE
  4231. 7000  CONTINUE
  4232.       IF (SP.LE.1) GO TO 7010
  4233. C     CHECK FOR ACTIVE CONDITION CODE WHICH MUST BE CHANGED TO BOOLEAN
  4234.       IF (RASN(SP-1).GT.255) CALL CVCOND(SP-1)
  4235. 7010  ALTER = 1
  4236.       LITV(SP) = VAL
  4237.       PREC(SP) = 1
  4238.       IF (LITV(SP).GT.255) PREC(SP) = 2
  4239.       GO TO 100
  4240. C     LINE NUMBER
  4241. 8000  CONTRL(14) = VAL
  4242.       SP = SP - 1
  4243.       GO TO 100
  4244. 9000  CONTINUE
  4245.       CALL EMIT(EI,0,0)
  4246.       CALL EMIT(HALT,0,0)
  4247. C
  4248. C     MAY BE LINE/LOC'S LEFT IN OUTPUT BUFFER
  4249.       IF (CONTRL(18).NE.0) CALL WRITEL(0)
  4250. C
  4251. 99999 CONTRL(20) = M
  4252.       RETURN
  4253.       END
  4254.       SUBROUTINE OPERAT(VAL)
  4255.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  4256.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  4257.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  4258.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  4259.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  4260.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  4261.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  4262.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  4263.       INTEGER CONTRL(64)
  4264.       COMMON /CNTRL/CONTRL
  4265.       INTEGER CODLOC,ALTER,CBITS(22)
  4266.       COMMON /CODE/CODLOC,ALTER,CBITS
  4267.       INTEGER XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  4268.       COMMON /XFROPT/XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  4269.       INTEGER GET,SHR,SHL,RIGHT,GNC,POLCNT,TYP,VAL
  4270.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  4271.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  4272.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  4273.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  4274.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  4275.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  4276.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  4277.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  4278.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  4279.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  4280.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  4281.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  4282.       COMMON /BIFCOD/BIFTAB,BIFPAR
  4283.       INTEGER BIFTAB(41),BIFPAR
  4284.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  4285.      1    SP,MAXSP,INTBAS
  4286.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  4287.       INTEGER VARB,INTR,PROC,LABEL,LITER
  4288.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  4289.       INTEGER INLOC,OUTLOC,FIRSTI,CASJMP
  4290.       COMMON /BIFLOC/INLOC,OUTLOC,FIRSTI,CASJMP
  4291.       INTEGER CHAIN
  4292. C     ADD ADC SUB SBC MUL DIV MOD NEG AND IOR
  4293. C     XOR NOT EQL LSS GTR NEQ LEQ GEQ INX TRA
  4294. C     TRC PRO RET STO STD XCH DEL CAT LOD BIF
  4295. C     INC CSE END ENB ENP HAL RTL RTR SFL SFR
  4296. C     HIV LOV CVA ORG AX1 AX2 AX3
  4297.       ICY = 0
  4298.       ICOM = 0
  4299.       IQ = 0
  4300.       GO TO (
  4301.      1   1000, 2000, 3000, 3500, 4000, 5000, 6000,99999, 9000,10000,
  4302.      2  11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
  4303.      3  21000,22000,23000,24000,24000,26000,27000,28000,29000,99999,
  4304.      4  31000,32000,99999,99999,99999,36000,37000,37000,37000,37000,
  4305.      5  37000,37000,43000,44000,45000,45100,45200,45500,46000,99999),
  4306.      6  VAL
  4307. C
  4308. C     ADD
  4309. 1000  CONTINUE
  4310. C     MAY DO THE ADD IN H AND L (USING INX OPERATOR)
  4311.       IF (PREC(SP).NE.1) CALL EXCH
  4312.       IF (PREC(SP-1).NE.1) GO TO 1100
  4313.       CALL EXCH
  4314.       ICY = 1
  4315.       IOP = AD
  4316.       IOP2 = AC
  4317.       ICOM = 1
  4318.       GO TO 88888
  4319. 1100  CONTINUE
  4320. C     SET PREC = 1 FOR INX
  4321.       JP = 1
  4322.       GO TO 19001
  4323. C
  4324. C     ADC
  4325. 2000  CONTINUE
  4326.       ICY = 1
  4327.       IOP = AC
  4328.       IOP2 = AC
  4329.       ICOM = 1
  4330.       GO TO 88888
  4331. C
  4332. C     SUB
  4333. 3000  CONTINUE
  4334. C     CHANGE ADDRESS VALUE - 1 TO ADDRESS VALUE + 65535 AND APPLY ADD
  4335.       IF (PREC(SP-1).EQ.1.OR.LITV(SP).NE.1) GO TO 3100
  4336.           LITV(SP) = 65535
  4337.           PREC(SP) = 2
  4338.           GO TO 1100
  4339. 3100  CONTINUE
  4340.       ICY = 1
  4341.       IOP = SU
  4342.       IOP2 = SB
  4343.       GO TO 88888
  4344. C
  4345. C     SBC
  4346. 3500  CONTINUE
  4347.       ICY = 1
  4348.       IOP = SB
  4349.       IOP2 = SB
  4350.       GO TO 88888
  4351. C
  4352. C     MUL
  4353. 4000  I = 1
  4354.       J = 2
  4355.       GO TO 6100
  4356. C     DIV
  4357. 5000  I = 2
  4358.       J = 1
  4359.       GO TO 6100
  4360. C     MOD
  4361. 6000  I = 2
  4362.       J = 2
  4363. 6100  CONTINUE
  4364. C     CLEAR CONDITION CODE
  4365.       IF (RASN(SP) .GT. 255) CALL CVCOND(SP)
  4366. C     CLEAR PENDING STORE
  4367.       IF (REGS(RA) .NE. 0) CALL EMIT (LD, REGS(RA), RA)
  4368.       REGS(RA) = 0
  4369. C     LOCK ANY CORRECTLY ASSIGNED REGISTERS
  4370. C     ....AND STORE THE REMAINING REGISTERS.
  4371.       IF (MOD(RASN(SP),16) .EQ. RE) LOCK(RE) = 1
  4372.       IF (RASN(SP)/16 .EQ. RD) LOCK(RD) = 1
  4373.       IF (MOD(RASN(SP-1),16) .EQ. RC) LOCK(RC) = 1
  4374.       IF (RASN(SP-1)/16 .EQ. RB) LOCK(RB) = 1
  4375.       CALL SAVER
  4376. C     MARK REGISTER C USED.
  4377.       IF (REGS(RC) .EQ. 0) REGS(RC) = -1
  4378. C     LOAD TOP OF STACK INTO REGISTERS D AND E.
  4379.       CALL LOADV(SP, 0)
  4380.       IF (PREC(SP) .EQ. 1) CALL EMIT (LD, RD, 0)
  4381. C     NOW DEASSIGN REGISTER C UNLESS CORRECTLY LOADED.
  4382.       IF (REGS(RC) .EQ. -1) REGS(RC) = 0
  4383. C     LOAD T.O.S. - 1 INTO REGISTERS B AND C.
  4384.       CALL LOADV(SP-1, 0)
  4385.       IF (PREC(SP-1) .EQ. 1) CALL EMIT(LD, RB, 0)
  4386.       CALL DELETE(2)
  4387. C
  4388. C     CALL THE BUILT-IN FUNCTION
  4389.       CALL EMITBF(I)
  4390. C     REQUIRES 2 LEVELS IN STACK FOR BIF (CALL AND TEMP.)
  4391.       CALL STACK(2)
  4392.       CALL USTACK
  4393.       CALL USTACK
  4394. C    AND THEN RETRIEVE RESULTS
  4395.           DO 6500 K=1,7
  4396. 6500      LOCK(K) = 0
  4397. C     CANNOT PREDICT WHERE REGISTERS H AND L WILL END UP
  4398.       REGV(RL) = -1
  4399.       REGV(RH)=-1
  4400.       SP = SP + 1
  4401.       ST(SP) = 0
  4402.       PREC(SP) = 2
  4403.       LITV(SP) = -1
  4404.       IF (J.EQ.2) GO TO 6600
  4405.       RASN(SP) = RB*16 + RC
  4406.       REGS(RB)=SP
  4407.       REGS(RC)=SP
  4408.       GO TO 99991
  4409. 6600  RASN(SP) = RD*16 + RE
  4410.       REGS(RD)=SP
  4411.       REGS(RE)=SP
  4412.       GO TO 99991
  4413. C
  4414. C     AND
  4415. 9000  CONTINUE
  4416.       IOP = ND
  4417. 9100  ICOM = 1
  4418.       GO TO 88887
  4419. C
  4420. C     IOR
  4421. 10000 CONTINUE
  4422.       IOP = OR
  4423.       GO TO 9100
  4424. C
  4425. C     XOR
  4426. 11000 CONTINUE
  4427.       IOP = XR
  4428.       GO TO 9100
  4429. C
  4430. C     NEGATE (COMPLEMENT THE ENTIRE NUMBER)
  4431. 12000 CONTINUE
  4432.       I = RASN(SP)
  4433.       IF (I.LE.255) GO TO 12100
  4434. C
  4435. C     CONDITION CODE - CHANGE PARITY
  4436.           J = 1 - (I/4096)
  4437.           RASN(SP) = J*4096 + MOD(I,4096)
  4438.       GO TO 99991
  4439. C
  4440. 12100  CONTINUE
  4441. C     PERFORM XOR WITH 255 OR 65535 (BYTE OR ADDRESS)
  4442.       I = PREC(SP)
  4443.       J = 256**I
  4444.       SP = SP + 1
  4445.       LITV(SP) = J - 1
  4446.       PREC(SP) = I
  4447.       GO TO 11000
  4448. C
  4449. 13000 CONTINUE
  4450. C     EQUAL TEST
  4451.       IF ((PREC(SP)+PREC(SP-1)).GT.2) GO TO 13200
  4452. C
  4453. C     MARK AS TRUE/ZERO (1*16+2)
  4454.       J = 18
  4455. 13050 ICOM = 1
  4456. 13080 IOP = SU
  4457. 13090 IOP2 = 0
  4458. 13100 CALL APPLY(IOP,IOP2,ICOM,ICY)
  4459. C         MARK AS CONDITION CODE
  4460.           RASN(SP) = J*256 + RASN(SP)
  4461.           GO TO 99991
  4462. C
  4463. C     DOUBLE BYTE EQUAL
  4464. 13200 CONTINUE
  4465.       IQ = 1
  4466. C     MARK AS TRUE/ZERO (1*16 + 2)
  4467.       J = 18
  4468. 13300 ICOM = 1
  4469. 13400 IOP = SU
  4470.       IOP2 = SB
  4471.       ICY = 1
  4472.       CALL APPLY(IOP,IOP2,ICOM,ICY)
  4473. C     CHANGE TO CONDITION CODE
  4474.           I = RASN(SP)
  4475.           IP = MOD(I,16)
  4476.           IF (IQ.EQ.1) CALL EMIT(OR,IP,0)
  4477. C
  4478. C     GET RID OF HIGH ORDER REGISTER IN THE RESULT
  4479.           REGS(1) = IP
  4480.           RASN(SP) = J*256 + IP
  4481.           PREC(SP) = 1
  4482.           LITV(SP) = -1
  4483.           ST(SP) = 0
  4484.           J = MOD(I/16,16)
  4485.           IF (J.EQ.0) GO TO 99991
  4486.               LOCK(J) = 0
  4487.               REGS(J) = 0
  4488.               REGV(J) = - 1
  4489.           GO TO 99991
  4490. C
  4491. 14000 CONTINUE
  4492. C     LSS - SET TO TRUE/CARRY (1*16+1)
  4493.       J = 17
  4494.       IF ((PREC(SP)+PREC(SP-1)).GT.2) GO TO 13400
  4495. 14010 IF (LITV(SP).NE.1) GO TO 13080
  4496.       IOP = CP
  4497.       GO TO 13090
  4498. C
  4499. 15000 CONTINUE
  4500. C     GTR - CHANGE TO LSS
  4501.       CALL EXCH
  4502.       GO TO 14000
  4503. C
  4504. 16000 CONTINUE
  4505. C     NEQ
  4506. C     MARK AS FALSE/ZERO (0*16+2)
  4507.       J = 2
  4508.       IQ = 1
  4509.       IF ((PREC(SP)+PREC(SP-1)).GT.2) GO TO 13300
  4510.       GO TO 13050
  4511. C
  4512. 17000 CONTINUE
  4513. C     LEQ - CHANGE TO GEQ
  4514.       CALL EXCH
  4515. C
  4516. 18000 CONTINUE
  4517. C     GEQ - SET TO FALSE/CARRY (0*16+1)
  4518.       J = 1
  4519.       IF ((PREC(SP)+PREC(SP-1)).GT.2) GO TO 13400
  4520.       GO TO 14010
  4521. C
  4522. C     INX
  4523. 19000 CONTINUE
  4524.       JP = PREC(SP-1)
  4525. C     INX IS ALSO USED FOR ADDING ADDRESS VALUES, ENTERING FROM ADD
  4526. 19001 CONTINUE
  4527. C     BASE MAY BE INDEXED BY ZERO...
  4528.       IF (LITV(SP).NE.0) GO TO 19002
  4529. C         JUST DELETE THE INDEX AND IGNORE THE INX OPERATOR
  4530.           CALL DELETE(1)
  4531.           GO TO 99991
  4532. 19002 CONTINUE
  4533.       IF (RASN(SP).GT.255) CALL CVCOND(SP)
  4534.       J = REGS(1)
  4535.       IH = RASN(SP)
  4536.       IL = MOD(IH,16)
  4537.       IH = IH/16
  4538.       JH = RASN(SP-1)
  4539.       JL = MOD(JH,16)
  4540.       JH = JH/16
  4541. C     CHECK FOR PENDING STORE TO BASE OR INDEX
  4542.       IF ((J.EQ.0).OR.((J.NE.JH).AND.(J.NE.JL)
  4543.      1    .AND.(J.NE.IH).AND.(J.NE.IL))) GO TO 19010
  4544.           CALL EMIT(LD,J,RA)
  4545.           REGS(1) = 0
  4546. 19010 CONTINUE
  4547. C     MAKE SURE THAT D AND E ARE AVAILABLE
  4548.       IF ((REGS(RE).EQ.0).AND.(REGS(RD).EQ.0)) GO TO 19020
  4549.       IF ((IL.EQ.RE).OR.(JL.EQ.RE)) GO TO 19020
  4550. C     MARK ALL REGISTERS FREE
  4551.       IF (IL.NE.0) REGS(IL) = 0
  4552.       IF (JL.NE.0) REGS(JL) = 0
  4553.       CALL GENREG(2,IA,IB)
  4554.       REGS(IA) = 1
  4555.       CALL GENREG(2,IC,IB)
  4556.       REGS(IA) = 0
  4557. C     ALL REGS ARE CLEARED EXCEPT BASE AND INDEX, IF ALLOCATED.
  4558.       IF (IL.NE.0) REGS(IL) = SP
  4559.       IF (JL.NE.0) REGS(JL) = SP-1
  4560. C     GET INDEX FROM MEMORY, IF NECESSARY
  4561. 19020 CONTINUE
  4562. C     IF LITERAL 1 OR -1, USE INX OR DCX
  4563.       IF (LITV(SP).EQ.1.OR.LITV(SP).EQ.65535) GO TO 19040
  4564. C     IF THE INDEX IS CONSTANT, AND THE BASE AN ADDRESS VARIABLE,
  4565. C     DOUBLE THE LITERAL VALUE AT COMPILE TIME
  4566.       IF (LITV(SP).LT.0.OR.JP.EQ.1) GO TO 19030
  4567.           LITV(SP) = LITV(SP) + LITV(SP)
  4568.           JP = 1
  4569. 19030 CONTINUE
  4570.       I = 0
  4571.       IF (LITV(SP).GE.0) I = 3
  4572.       CALL LOADV(SP,I)
  4573. 19040 CONTINUE
  4574. C     IF THE INDEX WAS ALREADY IN THE REGISTERS, MAY
  4575. C     HAVE TO EXTEND PRECISION TO ADDRESS.
  4576.       IH = RASN(SP)
  4577.       IL = MOD(IH,16)
  4578.       IH = IH/16
  4579.       IF (IL.EQ.0.OR.IH.NE.0) GO TO 19050
  4580.           IH = IL-1
  4581.           CALL EMIT (LD,IH,0)
  4582. 19050 CONTINUE
  4583.       I = DAD
  4584.       IF (LITV(SP).EQ.1) I = INCX
  4585.       IF (LITV(SP).EQ.65535) I = DCX
  4586.       IF (IH.EQ.0) IH = RH
  4587. C     DELETE THE INDEX.  (NOTE THAT SP WILL THEN POINT TO THE BASE)
  4588.       CALL DELETE(1)
  4589. C     LOAD THE BASE INTO THE H AND L REGISTERS
  4590.       CALL LOADV(SP,5)
  4591. C     ADD THE BASE AND INDEX
  4592.       CALL EMIT(I,IH,0)
  4593. C     AND ADD INDEX AGAIN IF BASE IS AN ADDRESS VARIABLE.
  4594.       IF (JP.NE.1) CALL EMIT(I,IH,0)
  4595.       CALL EMIT(XCHG,0,0)
  4596. C     NOTE XCHG HERE AND REMOVE WITH PEEPHOLE OPTIMIZATION LATER
  4597. C
  4598.       I = PREC(SP)
  4599.       CALL DELETE(1)
  4600.       SP = SP + 1
  4601.       ST(SP) = 0
  4602.       PREC(SP) = I
  4603.       LITV(SP) = -1
  4604.       REGV(RH) = -1
  4605.       REGV(RL) = -1
  4606.       RASN(SP) = RD*16 + RE
  4607.       REGS(RD) = SP
  4608.       REGS(RE) = SP
  4609.       GO TO 99991
  4610. C
  4611. C     TRA -   CHECK STACK FOR SIMPLE LABEL VARIABLE
  4612. 20000 IOP = 1
  4613. C     IN CASE THERE ARE ANY PENDING VALUES ...
  4614.       LOCK(6) = 1
  4615.       LOCK(7) = 1
  4616.       CALL SAVER
  4617.       LOCK(6) = 0
  4618.       LOCK(7) = 0
  4619. C     THIS MAY BE A JUMP TO AN ABSOLUTE ADDRESS
  4620.       M = LITV(SP)
  4621.       IF (M .LT. 0) GO TO 20050
  4622. C     ABSOLUTE JUMP - PROBABLY TO ASSEMBLY LANGUAGE SUBRTNE...
  4623. C     ...SO MAKE H AND L REGISTERS UNKNOWN
  4624.           REGV(RH) = -1
  4625.           REGV(RL) = -1
  4626.           CALL EMIT (JMP, M, 0)
  4627.           CALL DELETE (1)
  4628.           GO TO 99991
  4629. 20050     I = ST(SP)
  4630.           IF (I.GT.0) GO TO 20100
  4631.           IF ((IOP.EQ.1).AND.(I.EQ.0)) GO TO 20700
  4632. C         COULD BE A COMPUTED ADDRESS
  4633.               CALL ERROR(134,1)
  4634.               GO TO 99990
  4635. 20100     I = SYMBOL(I)
  4636.           J = SYMBOL(I-1)
  4637.           J = RIGHT(J,4)
  4638. C         MAY BE A SIMPLE VARIABLE
  4639.           IF ((IOP.EQ.1).AND.(J.EQ.VARB)) GO TO 20700
  4640.           IF (((IOP.EQ.3).AND.(J.EQ.PROC)).OR.(J.EQ.LABEL)) GO TO 20200
  4641.               CALL ERROR(135,1)
  4642.               GO TO 99990
  4643. 20200     J = - SYMBOL(I)
  4644.           M = SHR(J,16)
  4645.           IF (IOP.NE.1) GO TO 20206
  4646.           IT = IABS(SYMBOL(I-1))
  4647.           IT = RIGHT(SHR(IT,4),4)
  4648. C          IT IS TYPE OF LABEL...
  4649. C          3 IS USER-DEFINED OUTER BLOCK, 4 IS USER DEFINED
  4650. C          NOT OUTER BLOCK, 5 IS COMPILER DEFINED
  4651.           IF (IT.NE.5) GO TO 20206
  4652. C
  4653. C         THIS TRA IS ONE OF A CHAIN OF COMPILER GENERATED
  4654. C         TRA'S - STRAIGHTEN THE CHAIN IF NO CODE HAS BEEN
  4655. C         GENERATED SINCE THE PREVIOUS DEF.
  4656. C
  4657.           IF (DEFSYM.LE.0) GO TO 20206
  4658.           K = SYMBOL(DEFSYM)
  4659.           IF(RIGHT(SHR(SYMBOL(K-1),4),4).NE.5) GO TO 20206
  4660.           L = -SYMBOL(K)
  4661.           JP = SHR(L,16)
  4662.           IF (JP.NE.CODLOC) GO TO 20205
  4663. C
  4664. C         ADJUST THE REFERENCE COUNTS AND OPTIMIZATION
  4665. C         INFORMATION FOR BOTH DEF'S.
  4666. C
  4667.           IA = SHR(IABS(SYMBOL(K-1)),8)
  4668.           IB = 0
  4669.           IF (IA.EQ.1) IB = SYMBOL(K-2)
  4670.           IF (DEFRH.EQ.-255) IA = IA - 1
  4671.           SYMBOL(K-1) = 84
  4672. C         I.E., ZERO REFERENCES TO COMPILER GENERATED LABEL
  4673.           IF (SHR(IABS(SYMBOL(I-1)),8).EQ.1) SYMBOL(I-2) = IB
  4674.           SYMBOL(I-1) = SYMBOL(I-1) + IA * 256
  4675. C         CORRECTED REFERENCE COUNT FOR OBJECT OF THE DEF
  4676. C
  4677. C         MERGE THE BACKSTUFFING CHAINS
  4678. C
  4679. 20201     IA = RIGHT(SHR(L,2),14)
  4680.           IF (IA.EQ.0) GO TO 20203
  4681.               IB = GET(IA) + GET(IA+1) * 256
  4682.               L = SHL(JP,16) + SHL(IB,2) + RIGHT(L,2)
  4683.               SYMBOL(K) = -L
  4684.               IP = RIGHT(SHR(J,2),14)
  4685.                   CALL PUT(IA,MOD(IP,256))
  4686.                   CALL PUT(IA+1,IP/256)
  4687.               J = SHL(M,16) + SHL(IA,2) + RIGHT(J,2)
  4688.               SYMBOL(I) = -J
  4689.               GO TO 20201
  4690. 20203     CONTINUE
  4691. C
  4692. C         EQUATE THE DEFS
  4693. C
  4694.           DO 20202 IA = 1,SYTOP
  4695.           IF (SYMBOL(IA) .EQ. K) SYMBOL(IA) = I
  4696. 20202     CONTINUE
  4697. C
  4698. C         OMIT THE TRA IF NO PATH TO IT
  4699. C
  4700. 20204     REGV(RH) = DEFRH
  4701.           REGV(RL) = DEFRL
  4702. 20205     IF (REGV(RH).NE.-255) GO TO 20206
  4703.               CALL DELETE(1)
  4704.               GO TO 99991
  4705. 20206     CONTINUE
  4706.           IF (IT.NE.3.OR.IOP.NE.1) GO TO 20208
  4707. C         WE HAVE A TRA TO THE OUTER BLOCK...
  4708.           J = CONTRL(47)
  4709.           IF ((PRSP.EQ.0).OR.(J.EQ.1)) GO TO 20208
  4710.           IF (J.NE.0) GO TO 20207
  4711.               J = LXIS
  4712.               LXIS = CODLOC + 1
  4713. 20207     CALL EMIT(LXI,RSP,MOD(J,65536))
  4714. C
  4715. 20208      J = -SYMBOL(I)
  4716.           M = RIGHT(SHR(J,2),14)
  4717. C             CONNECT ENTRY INTO CHAIN
  4718.               K = CODLOC + 1
  4719.               IF (IOP.EQ.4) K = CODLOC
  4720. C             IOP = 4 IF WE ARRIVED HERE FROM CASE TABLE JMP
  4721.               SYMBOL(I) = -(SHL(SHR(J,16),16) + SHL(K,2) + RIGHT(J,2))
  4722. C
  4723. C     CHECK FOR SINGLE REFERENCE
  4724.       J = SYMBOL(I-1)
  4725.       K = IABS(J)/256
  4726.       IF (K.NE.1) GO TO 20300
  4727. C     MAKE SURE THIS IS THE FIRST FWD REFERENCE
  4728.       L = SYMBOL(I-2)
  4729.       IF (L .NE. 0) GO TO 20220
  4730. C     SAVE H AND L, MARK AS A FORWARD REFERENCE
  4731. C     /  1B   /  1B   /  9B   /  8B   /
  4732. C     /H VALID/L VALID/H VALUE/L VALUE/
  4733.       K = 0
  4734.       L = REGV(7)
  4735.       IF ((L.LT.0).OR.(L.GT.255)) GO TO 20210
  4736.       K = L + 131072
  4737. 20210 L = REGV(6)
  4738.       IF ((L.LT.0).OR.(L.GT.511)) GO TO 20220
  4739.       K = (L + 1024) * 256 + K
  4740. 20220 SYMBOL(I-2) = K
  4741. C
  4742. C         TRA, TRC, PRO, AX2 (CASE TRA)
  4743. 20300     GO TO (20400,20500,20600,20650),IOP
  4744. C
  4745. 20400         CONTINUE
  4746. C             MAY BE INC TRA COMBINATION IN DO-LOOP
  4747.               IF ((LASTIN+1).NE.CODLOC) GO TO 20410
  4748. C                 CHANGE TO JFZ TO TOP OF LOOP
  4749.                   CALL EMIT(JMC,FAL*32+ZERO,M)
  4750.                   CALL DELETE(1)
  4751.                   GO TO 99991
  4752. 20410         XFRLOC = CODLOC
  4753.               XFRSYM = ST(SP)
  4754.               TSTLOC = CODLOC+3
  4755.               CALL EMIT(JMP,M,0)
  4756.               CALL DELETE(1)
  4757. C             MARK H AND L NIL (= - 255)
  4758. 20550         REGV(6) = -255
  4759.               REGV(7) = -255
  4760.               GO TO 99991
  4761. C
  4762. 20500         CONLOC = CODLOC
  4763.               CALL EMIT(JMC,IOP2,M)
  4764.               CALL DELETE(2)
  4765.               GO TO 99991
  4766. C
  4767. 20600         XFRLOC = CODLOC
  4768.               XFRSYM = ST(SP)
  4769.               TSTLOC = CODLOC+3
  4770.               CALL EMIT(CAL,M,0)
  4771. C              ADJUST THE MAXDEPTH, IF NECESSARY
  4772.               J = SYMBOL(I-3) + 1
  4773. C             J IS NUMBER OF DOUBLE-BYTE STACK ELEMENTS REQD
  4774.               CALL STACK(J)
  4775. C             NOW RETURNED FROM CALL SO...
  4776.               CURDEP(PRSP+1) = CURDEP(PRSP+1) - J
  4777. C
  4778. C             NOW FIX THE H AND L VALUES UPON RETURN
  4779.               J = SYMBOL(I-2)
  4780.               K = SHR(J,19)
  4781. C             MAY BE UNCHANGED FROM CALL
  4782.               IF (K.EQ.3) GO TO 20610
  4783. C                 COMPARE VALUES
  4784.                   J = RIGHT(J,19)
  4785.                   L = MOD(J,256)
  4786.                   J = J / 256
  4787.                   K = MOD(J,512)
  4788.                   J = J/512
  4789.                   IF (MOD(J,2).NE.1) L = -1
  4790.                   IF (MOD(J/2,2).NE.1) K = -1
  4791.                   REGV(6) = K
  4792.                   REGV(7) = L
  4793. 20610     CONTINUE
  4794.               CALL DELETE(1)
  4795. C             MAY HAVE TO CONSTRUCT A RETURNED
  4796. C             VALUE AT THE STACK TOP
  4797.               J = SYMBOL(I-1)
  4798.               J = MOD(J/16,16)
  4799.               IF (J.LE.0) GO TO 99991
  4800. C             SET STACK TOP TO PRECISION OF PROCEDURE
  4801.                   SP = SP + 1
  4802.                   PREC(SP) = J
  4803.                   ST(SP) = 0
  4804.                   I = RC
  4805.                   IF (J.GT.1) I = RB*16+I
  4806.                   RASN(SP) = I
  4807.                   REGS(RA) = RC
  4808.                   REGS(RC) = SP
  4809.                   IF (J.GT.1) REGS(RB) = SP
  4810.                   LITV(SP) = -1
  4811.                GO TO 99991
  4812. C         CAME FROM A CASE VECTOR
  4813. 20650     CALL EMIT(0,MOD(M,256),0)
  4814.           CALL EMIT(0,M/256,0)
  4815.           CALL DELETE(1)
  4816.           GO TO 99991
  4817. C
  4818. C     JUMP TO COMPUTED LOCATION
  4819. 20700 CALL LOADV(SP,4)
  4820.       CALL DELETE(1)
  4821.       CALL EMIT(PCHL,0,0)
  4822. C     PC HAS BEEN MOVED, SO MARK H AND L UNKNOWN
  4823.       REGV(RH) = -255
  4824.       REGV(RL) = -255
  4825.       GO TO 99991
  4826. C     TRC
  4827. 21000 CONTINUE
  4828.       J = SP - 1
  4829.       I = LITV(J)
  4830.       IF(RIGHT(I,1).NE.1) GO TO 21100
  4831. C     THIS IS A DO FOREVER (OR SOMETHING SIMILAR) SO IGNORE THE JUMP
  4832.           CALL DELETE(2)
  4833.           GO TO 99991
  4834. C
  4835. C     NOT A LITERAL '1'
  4836. 21100 IOP  = 2
  4837. C     CHECK FOR CONDITION CODE
  4838.       I = RASN(J)
  4839.       IF (I.LE.255) GO TO 21200
  4840. C     ACTIVE CONDITION CODE, CONSTRUCT MASK FOR JMC
  4841.           I = I / 256
  4842.           J = I / 16
  4843.           I = MOD(I,16)
  4844.           IOP2 = (FAL + 1 - J)*32 + (CARRY + I - 1)
  4845.       GO TO 20050
  4846. C
  4847. C     OTHERWISE NOT A CONDITION CODE, CONVERT TO CARRY
  4848. 21200 CONTINUE
  4849.       IF (I.NE.0) GO TO 21300
  4850. C     LOAD VALUE TO ACCUMULATOR
  4851.           PREC(J) = 1
  4852.           CALL LOADV(J,1)
  4853.           GO TO 21400
  4854. C
  4855. C     VALUE ALREADY LOADED
  4856. 21300 I = MOD(I,16)
  4857.       J = REGS(1)
  4858.       IF (J.EQ.I) GO TO 21400
  4859.       IF (J.NE.0) CALL EMIT(LD,J,RA)
  4860.       CALL EMIT(LD,RA,I)
  4861. C
  4862. 21400 REGS(1) = 0
  4863.       CALL EMIT(ROT,CY,RGT)
  4864.       IOP2 = FAL*32 + CARRY
  4865.       GO TO 20050
  4866. C
  4867. C     PRO
  4868. C
  4869. C     ROL     ROR     SHL     SHR
  4870. C     SCL     SCR
  4871. C     TIME    HIGH    LOW     INPUT
  4872. C     OUTPUT  LENGTH  LAST    MOVE
  4873. C     DOUBLE  DEC
  4874. C
  4875. 22000 CONTINUE
  4876.       I = ST(SP)
  4877.       IF (I.GT.INTBAS) GO TO 22500
  4878. C     THIS IS A BUILT-IN FUNCTION.
  4879.       CALL DELETE(1)
  4880.       IF (I.LT.FIRSTI) GO TO 22499
  4881.       I = I - FIRSTI + 1
  4882. C
  4883.       GO TO ( 22300, 22300, 22300, 22300,
  4884.      *        22300,22300,
  4885.      1        22200, 22300, 22300, 22050,
  4886.      2        22100, 22310, 22310, 22499,
  4887.      3         22320,22350),I
  4888. C      INPUT(X)
  4889. 22050  CONTINUE
  4890. C         INPUT FUNCTION. GET INPUT PORT NUMBER
  4891.           I = LITV(SP)
  4892.           IF ((I.LT.0).OR.(I.GT.255)) GO TO 22499
  4893.           CALL DELETE(1)
  4894.           SP = SP + 1
  4895.           CALL GENREG(1,J,K)
  4896.           IF (J.EQ.0) GO TO 22499
  4897.           K = REGS(1)
  4898.           IF (K.NE.0) CALL EMIT(LD,K,RA)
  4899.           REGS(1) = J
  4900.           RASN(SP) = J
  4901.           LITV(SP) = -1
  4902.           ST(SP) = 0
  4903.           PREC(SP) = 1
  4904.           REGS(J) = SP
  4905.           CALL EMIT(INP,I,0)
  4906.           GO TO 99991
  4907. C
  4908. C     OUTPUT(X)
  4909. 22100 CONTINUE
  4910. C         CHECK FOR PROPER OUTPUT PORT NUMBER
  4911.           I = LITV(SP)
  4912.           IF ((I.LT.0).OR.(I.GT.255)) GO TO 22499
  4913.           CALL DELETE(1)
  4914.           SP = SP + 1
  4915. C         NOW BUILD AN ENTRY WHICH CAN BE RECOGNIZED BY
  4916. C         OPERAT.
  4917.           LITV(SP) = I
  4918.           RASN(SP) = 0
  4919.           PREC(SP) = 1
  4920.           ST(SP) =  OUTLOC
  4921.           GO TO 99991
  4922. C     TIME(X)
  4923. 22200 CONTINUE
  4924.       IF (RASN(SP).GT.255) CALL CVCOND(SP)
  4925. C
  4926. C    EMIT THE FOLLOWING CODE SEQUENCE FOR 100 USEC PER LOOP
  4927. C       8080 CPU ONLY
  4928. C     (GET TIME PARAMETER INTO THE ACCUMULATOR)
  4929. C              MVI   B,12   (7 CY OVERHEAD)
  4930. C     START    MOV   C,B    (5 CY * .5 USEC = 2.5 USEC)
  4931. C     --------------------
  4932. C     TIM180   DCR   C      (5 CY * .5 USEC = 2.5 USEC)
  4933. C              JNZ   TIM180 (10 CY* .5 USEC = 5.0 USEC)
  4934. C     --------------------
  4935. C                  12 *     (15 CY* .5 USEC = 7.5 USEC)
  4936. C                   =       (180 CY* .5 USEC = 90 USEC)
  4937. C              DCR   A      (5 CY * .5 USEC = 2.5 USEC)
  4938. C              JNZ   START  (10 CY* .5 USEC = 5.0 USEC)
  4939. C
  4940. C              TOTAL TIME   (200 CY*.5 USEC = 100 USEC/LOOP)
  4941. C
  4942.       J = REGS(RA)
  4943.       I = RASN(SP)
  4944.       IP = I/16
  4945.       I = MOD(I,16)
  4946.       IF ((J.NE.0).AND.(J.EQ.I)) GO TO 22210
  4947. C         GET TIME PARAMETER INTO THE ACCUMULATOR
  4948.           IF ((J.NE.0).AND.(J.NE.IP)) CALL EMIT(LD,J,RA)
  4949.           REGS(RA) = 0
  4950.           IF (I.EQ.0) CALL LOADV(SP,1)
  4951.           I = MOD(RASN(SP),16)
  4952.           IF (J.NE.0) CALL EMIT(LD,RA,I)
  4953. 22210 REGS(RA) = 0
  4954.       CALL EMIT(LD,I-1,-12)
  4955.       CALL EMIT(LD,I,I-1)
  4956.       CALL EMIT(DC,I,0)
  4957.       CALL EMIT(JMC,FAL*32+ZERO,CODLOC-1)
  4958.       CALL EMIT(DC,RA,0)
  4959.       CALL EMIT(JMC,FAL*32+ZERO,CODLOC-6)
  4960. C
  4961.       CALL DELETE(1)
  4962.       GO TO 99991
  4963. C     STOP HERE BEFORE GOING TO THE UNARY OPERATORS
  4964. C     ** NOTE THAT THIS DEPENDS UPON FIXED RTL = 37 **
  4965. 22300 CONTINUE
  4966.       VAL = 36 + I
  4967.       IF (VAL.LE.42) GO TO 22307
  4968. C     ** NOTE THAT THIS ALSO ASSUMES ONLY 6 SUCH BIFS
  4969. 22305 CALL UNARY(VAL)
  4970.       GO TO 99991
  4971. C
  4972. C     MAY HAVE TO ITERATE
  4973. 22307 CONTINUE
  4974.       I = LITV(SP)
  4975.       IF (I.LE.0) GO TO 22308
  4976. C     GENERATE IN-LINE CODE FOR SHIFT COUNTS OF
  4977. C         1 OR 2 FOR ADDRESS VALUES
  4978. C         1 TO 3 FOR SHR OF BYTE VALUES
  4979. C         1 TO 6 FOR ALL OTHER SHIFT FUNCTIONS ON BYTE VALUES
  4980.       J = 6
  4981.       IF (VAL.EQ.40) J = 3
  4982.       IF (PREC(SP-1).NE.1) J = 2
  4983.       IF (I.GT.J) GO TO 22308
  4984.       CALL DELETE(1)
  4985.       DO 22306 J = 1, I
  4986.           CALL UNARY(VAL)
  4987. 22306 CONTINUE
  4988.       GO TO 99991
  4989. C     BUILD A SMALL LOOP AND COUNT DOWN TO ZERO
  4990. 22308 CONTINUE
  4991.       CALL EXCH
  4992. C     LOAD THE VALUE TO DECREMENT
  4993.       CALL LOADV(SP-1,0)
  4994.       J = RASN(SP-1)
  4995.       J = MOD(J,16)
  4996.       IF (REGS(RA).NE.J) GO TO 22311
  4997.           CALL EMIT(LD,J,RA)
  4998.           REGS(RA) = 0
  4999. 22311 CONTINUE
  5000.       LOCK(J) = 1
  5001. C     LOAD THE VALUE WHICH IS TO BE OPERATED UPON
  5002.           KP = PREC(SP)
  5003.           I  = 1
  5004.           IF (KP.GT.1) I = 0
  5005.           IF (RASN(SP).NE.0) GO TO 22312
  5006.               CALL LOADV(SP,I)
  5007.           IF (I.EQ.1) REGS(1) = MOD(RASN(SP),16)
  5008. 22312     K = RASN(SP)
  5009.           M = MOD(K,16)
  5010.           K = K/16
  5011.           JP = REGS(RA)
  5012.           IF (I.EQ.1.AND.JP.EQ.M) GO TO 22314
  5013.           IF (JP.EQ.0) GO TO 22313
  5014.                CALL EMIT(LD,JP,RA)
  5015.                  REGS(RA) = 0
  5016. 22313     IF (I.EQ.0) GO TO 22314
  5017.               CALL EMIT(LD,RA,M)
  5018.               REGS(RA) = M
  5019. 22314     CONTINUE
  5020.           I = CODLOC
  5021.           CALL UNARY(VAL)
  5022.           IF (KP.EQ.1) GO TO 22309
  5023.           K = REGS(1)
  5024.           IF (K.NE.0) CALL EMIT(LD,K,RA)
  5025.           REGS(1) = 0
  5026. 22309  CALL EMIT(DC,J,0)
  5027.       CALL EMIT(JMC,FAL*32+ZERO,I)
  5028. C     END UP HERE AFTER OPERATION COMPLETED
  5029.       CALL EXCH
  5030.       LOCK(J) = 0
  5031.       CALL DELETE(1)
  5032.       GO TO 99991
  5033. C
  5034. C     LENGTH AND LAST
  5035. C     ** NOTE THAT THIS ASSUMES THAT LENGTH AND LAST ARE
  5036. C     BUILT-IN FUNCTIONS 10 AND 11 **
  5037. 22310 CONTINUE
  5038.       J = ST(SP)
  5039.       IF (J.LE.0) GO TO 22499
  5040.       J = SYMBOL(J)-1
  5041.       J = IABS(SYMBOL(J))/256+12-I
  5042.       CALL DELETE(1)
  5043.       SP = SP + 1
  5044.       ST(SP) = 0
  5045.       I = 1
  5046.       IF (J.GT.255) I=2
  5047.       PREC(SP) = I
  5048.       RASN(SP) = 0
  5049.       LITV(SP) = J
  5050.       IF (J.LT.0) GO TO 22499
  5051.       GO TO 99991
  5052. C
  5053. C     DOUBLE
  5054. 22320 CONTINUE
  5055.       IF(PREC(SP).GT.1) GO TO 99999
  5056.       IF(RASN(SP).NE.0) GO TO 22330
  5057.       IF(LITV(SP).LT.0) GO TO 22332
  5058.           PREC(SP) = 2
  5059.           ST(SP) = 0
  5060.           GO TO 99991
  5061. C         LOAD VALUE TO ACCUMULATOR AND GET A REGISTER
  5062. 22332     CALL LOADV(SP,1)
  5063.           REGS(1) = MOD(RASN(SP),16)
  5064. C
  5065. 22330 IA = RASN(SP)
  5066.       PREC(SP) = 2
  5067.       ST(SP) = 0
  5068.       IF (IA.GT.15) GO TO 99991
  5069.       LOCK(IA) = 1
  5070.       IB = IA - 1
  5071.       REGS(IB) = SP
  5072.       LOCK(IA) = 0
  5073.       RASN(SP) = IB*16 + IA
  5074. C     ZERO THE REGISTER
  5075.       CALL EMIT(LD,IB,0)
  5076.       IF (IB.NE.0) GO TO 99991
  5077.       CALL ERROR(133,5)
  5078.       GO TO 99991
  5079. C
  5080. C
  5081. C     DEC
  5082. 22350 CONTINUE
  5083.       J = MOD(RASN(SP),16)
  5084.       IF (J.EQ.0) GO TO 22499
  5085.       IF (PREC(SP).NE.1) GO TO 22499
  5086.       I = REGS(RA)
  5087.       IF (I.EQ.J) GO TO 22370
  5088. C     MAY BE A PENDING REGISTER STORE
  5089.       IF (I.NE.0) CALL EMIT(LD,I,RA)
  5090.       CALL EMIT(LD,RA,J)
  5091.       REGS(RA) = J
  5092. 22370 CALL EMIT(DAA,0,0)
  5093.       GO TO 99991
  5094. C
  5095. C     BUILT IN FUNCTION ERROR
  5096. 22499 CALL ERROR(136,1)
  5097.       GO TO 99999
  5098. C
  5099. C     PASS THE LAST TWO (AT MOST) PARAMETERS IN THE REGISTERS
  5100. C
  5101. 22500 I = RIGHT(ST(SP),16)
  5102.       I = SYMBOL(I)
  5103.       I = SHR(SYMBOL(I-1),8)
  5104.       I = IMIN(I,2)
  5105.       IF (I.LT.1) GO TO 22630
  5106.       J = SP - I - I
  5107.       DO 22520 K = 1, I
  5108.           IP = RASN(J)
  5109.           JP = MOD(IP/16,16)
  5110.           IP = MOD(IP,16)
  5111.           IF (IP.NE.0) LOCK(IP) = 1
  5112.           IF (JP.NE.0) LOCK(JP) = 1
  5113.           PREC(J) = IMIN(PREC(J),PREC(J+1))
  5114.       IF (PREC(J).GT.1.OR.JP.EQ.0) GO TO 22510
  5115.               REGS(JP) = 0
  5116.               LOCK(JP) = 0
  5117.               JP = 0
  5118.           IF (REGS(1).EQ.IP) LOCK(1) = 1
  5119.           IF (REGS(1).EQ.JP) LOCK(1) = 1
  5120. 22510     RASN(J) = JP*16+IP
  5121.           J = J + 2
  5122. 22520     CONTINUE
  5123.       J = SP - 1 - I - I
  5124.       IT = 0
  5125. C     STACK ANY STUFF WHICH DOES NOT GO TO THE PROCEDURE
  5126.           DO 22530 K=1,SP
  5127. C         CHECK FOR VALUE TO PUSH
  5128.           JP = RASN(K)
  5129.           IF (JP.EQ.0) GO TO 22524
  5130. C         POSSIBLE PUSH IF NOT A PARAMETER
  5131.           IF (K.GT.J) GO TO 22530
  5132. C             REGISTERS MUST BE PUSHED
  5133.              JPH = JP/16
  5134.              KP = REGS(RA)
  5135.               JP = MOD(JP,16)
  5136.              IF (KP.EQ.0) GO TO 22522
  5137. C            PENDING ACC STORE, CHECK HO AND LO REGISTERS
  5138.              IF (KP.NE.JPH) GO TO 22521
  5139. C            PENDING HO BYTE STORE
  5140.                  CALL EMIT(LD,JPH,RA)
  5141.                  REGS(RA) = 0
  5142.                  GO TO 22522
  5143. C            CHECK LO BYTE
  5144. 22521        IF (KP.NE.JP) GO TO 22522
  5145.                   CALL EMIT (LD,JP,RA)
  5146.                   REGS(RA) = 0
  5147. 22522     CALL EMIT(PUSH,JP-1,0)
  5148.           CALL STACK(1)
  5149.           ST(K) = 0
  5150.           IT = RASN(K)
  5151.           JP = MOD(IT,16)
  5152.           IF (JP.NE.0) REGS(JP) = 0
  5153.           JP = IT/16
  5154.           IF (JP.NE.0) REGS(JP) = 0
  5155.           RASN(K) = 0
  5156.           LITV(K) = -1
  5157.           IT = K
  5158.           GO TO 22530
  5159. C     REGISTERS NOT ASSIGNED - CHECK FOR STACKED VALUE
  5160. 22524     IF ((ST(K).NE.0).OR.(LITV(K).GE.0)) GO TO 22530
  5161.           IF (IT.EQ.0) GO TO 22530
  5162.               CALL ERROR(150,1)
  5163. 22530     CONTINUE
  5164. 22550 IT = RH
  5165.       J = SP - I - I
  5166.       DO 22590 K = 1, I
  5167.           ID = K + K + 2
  5168.           IP = RASN(J)
  5169.           JP = MOD(IP/16,16)
  5170.           IP = MOD(IP,16)
  5171. 22560     ID = ID - 1
  5172.           IF (IP.EQ.0) GO TO 22590
  5173.           IF (IP.EQ.ID) GO TO 22580
  5174.           IF (REGS(ID).EQ.0) GO TO 22570
  5175.               M = REGS(ID)
  5176.               ML = RASN(M)
  5177.               MH = MOD(ML/16,16)
  5178.               ML = MOD(ML,16)
  5179.               IF (ML.EQ.ID) ML = IT
  5180.               IF (MH.EQ.ID) MH = IT
  5181.               CALL EMIT(LD,IT,ID)
  5182.               REGS(IT) = M
  5183.               RASN(M) = MH*16+ML
  5184.               IT = IT + 1
  5185. 22570     REGS(IP) = 0
  5186.           LOCK(IP) = 0
  5187.           IF (REGS(1).NE.IP) GO TO 22575
  5188.           IP = 1
  5189.           REGS(1) = 0
  5190.           LOCK(1) = 0
  5191. 22575     CALL EMIT(LD,ID,IP)
  5192.           REGS(ID) = J
  5193. 22580     LOCK(ID) = 1
  5194.           IP = JP
  5195.           IF (IP.EQ.-1) GO TO 22590
  5196.           JP = -1
  5197.           GO TO 22560
  5198. 22590     J = J + 2
  5199.       J = SP - I - I
  5200.       DO 22600 K = 1, I
  5201.           IF (RASN(J).EQ.0) CALL LOADV(J,0)
  5202.           IP = K + K
  5203.           REGS(IP) = J
  5204.           LOCK(IP) = 1
  5205.           IF (PREC(J+1).EQ.2.AND.PREC(J).EQ.1) CALL EMIT(LD,IP,0)
  5206.           J = J + 2
  5207. 22600     CONTINUE
  5208.       IF (REGS(1).NE.0) CALL EMIT(LD,REGS(1),RA)
  5209.       DO 22610 K = 1, 7
  5210.           REGS(K) = 0
  5211.           REGV(K) = -1
  5212.           LOCK(K) = 0
  5213. 22610     CONTINUE
  5214.       J = I + I
  5215.       DO 22620 K = 1, J
  5216.           CALL EXCH
  5217.           IF ((ST(SP).NE.0).OR.(RASN(SP).NE.0).OR.
  5218.      1    (LITV(SP).GE.0)) GO TO 22615
  5219.       CALL EMIT(POP,RH,0)
  5220.       CALL USTACK
  5221.       REGV(RH) = -1
  5222.       REGV(RL) = -1
  5223. 22615 CALL DELETE(1)
  5224. 22620     CONTINUE
  5225.       IOP = 3
  5226.       GO TO 20050
  5227. 22630 CONTINUE
  5228.       LOCK(6) = 1
  5229.       LOCK(7) = 1
  5230.       CALL SAVER
  5231.       LOCK(6) = 0
  5232.       LOCK(7) = 0
  5233.       IOP = 3
  5234.       GO TO 20050
  5235. C
  5236. C     RET
  5237. 23000 CONTINUE
  5238.       JP = PRSP
  5239.       IF (JP.GT.0) GO TO 23050
  5240.           CALL ERROR(146,1)
  5241.           GO TO 20550
  5242. 23050 CONTINUE
  5243. C     CHECK FOR TYPE AND PRECISION OF PROCEDURE
  5244.       L = MOD(PRSTK(JP),65536) + 1
  5245.       L = SYMBOL(L)/16
  5246.       L = MOD(L,16)
  5247. C     L IS THE PRECISION OF THE PROCEDURE
  5248.       IF (L.EQ.0) GO TO 23310
  5249.       I = RASN(SP)
  5250.       IF (I.EQ.0) CALL LOADV(SP,1)
  5251.       IF (I.GE.256) CALL CVCOND(SP)
  5252.       K = RASN(SP)
  5253.       JP = REGS(1)
  5254.       J = MOD(K,16)
  5255.       K = K/16
  5256.       IF ((I.EQ.0).OR.(J.EQ.JP)) GO TO 23200
  5257. C         HAVE TO LOAD THE ACCUMULATOR.  MAY HAVE H.O. BYTE.
  5258.           IF ((JP.EQ.0).OR.(JP.NE.K)) GO TO 23150
  5259.           CALL EMIT(LD,K,RA)
  5260. 23150     CALL EMIT(LD,RA,J)
  5261. C
  5262. 23200 IF (K.EQ.0) GO TO 23300
  5263.       IF (K.NE.RB) CALL EMIT(LD,RB,K)
  5264. 23300 CONTINUE
  5265. C     COMPARE PRECISION OF PROCEDURE WITH STACK
  5266.       IF (L.GT.PREC(SP)) CALL EMIT(LD,RB,0)
  5267. 23310 CALL DELETE(1)
  5268.       IF (PRSTK(PRSP).LE.65535) GO TO 23320
  5269. C         INTERRUPT PROCEDURE - USE THE DRT CODE BELOW
  5270.           JP = PRSP
  5271.           K = 0
  5272.           GO TO 45020
  5273. 23320 CALL EMIT(RTN,0,0)
  5274. C     MERGE VALUES OF H AND L FOR THIS PROCEDURE
  5275. C         CAN ALSO ENTER WITH JP SET FROM END OF PROCEDURE
  5276.           JP = PRSP
  5277. 23350     XFRLOC = CODLOC-1
  5278.           XFRSYM = 0
  5279.           TSTLOC = CODLOC
  5280.           I = MOD(PRSTK(JP),65536)
  5281.           JP = SYMBOL(I)
  5282.           K = REGV(6)
  5283.           L = REGV(7)
  5284.           J = RIGHT(JP,19)
  5285.           JP = SHR(JP,19)
  5286.           IF (JP.NE.3) GO TO 23360
  5287.           IF ((K.EQ.-254).AND.(L.EQ.-254)) GO TO 99991
  5288. C     H AND L HAVE BEEN ALTERED IN THE PROCEDURE
  5289.           KP = K
  5290.           LP = L
  5291.           GO TO 23370
  5292. C     OTHERWISE MERGE VALUES OF H AND L
  5293. C
  5294. 23360     LP = MOD(J,256)
  5295.           J = J / 256
  5296.           KP = MOD(J,512)
  5297.           J = J/512
  5298.           IF (MOD(J,2).EQ.0) LP = -1
  5299.           IF (MOD(J/2,2).EQ.0) KP = -1
  5300. C     COMPARE K WITH KP AND L WITH LP
  5301. 23370     J = 0
  5302.           IF ((L.GE.0).AND.(LP.EQ.L)) J = 131072+L
  5303.           IF ((K.GE.0).AND.(KP.EQ.K)) J = (K+1024) * 256 + J
  5304.           SYMBOL(I) = J
  5305. C     MARK H AND L NIL BEFORE RETURNING FROM SUBR
  5306.       GO TO 20550
  5307. C
  5308. C     STO AND STD
  5309. 24000 I = ST(SP)
  5310. C     CHECK FOR OUTPUT FUNCTION
  5311.       IF (I.EQ.OUTLOC) GO TO 24050
  5312. C     CHECK FOR COMPUTED ADDRESS OR SAVED ADDRESS
  5313.       IF (I.GE.0) GO TO 24100
  5314. C     CHECK FOR ADDRESS REFERENCE OUTSIDE INTRINSIC RANGE
  5315.       I = -I
  5316.       IF (I.GT.INTBAS) GO TO 24100
  5317. C     CHECK FOR 'MEMORY' ADDRESS REFERENCE
  5318. C    ** NOTE THAT STACKTOP MUST BE AT 6 **
  5319.       IF (I.LE.6) GO TO 24100
  5320.       IF (I.EQ.5) GO TO 24100
  5321. C     IGNORE THE STORE FOR INTRINSIC PARAMETERS
  5322.       GO TO 24200
  5323. C     OUTPUT FUNCTION
  5324. 24050 CONTINUE
  5325.           J = LITV(SP)
  5326.           I = RASN(SP-1)
  5327.           IF ((I.GT.0) .AND. (I.LT.256)) GO TO 24060
  5328. C         LOAD VALUE TO ACC
  5329.           I = REGS(RA)
  5330.           IF (I.GT.0) CALL EMIT(LD,I,RA)
  5331.           CALL LOADV(SP-1,1)
  5332.           I = RASN(SP-1)
  5333.           GO TO 24070
  5334. C     OPERAND IS IN THE GPRS
  5335. 24060     I = MOD(I,16)
  5336.           K = REGS(RA)
  5337.           IF ((K.GT.0).AND.(K.NE.I))CALL EMIT(LD,K,RA)
  5338.           IF (K.NE.I) CALL EMIT(LD,RA,I)
  5339. C     NOW MARK ACC ACTIVE IN CASE SUBSEQUENT STO OPERATOR
  5340. 24070     REGS(RA) = MOD(I,16)
  5341.           CALL EMIT(OUT,J,0)
  5342.           CALL DELETE(1)
  5343.       GO TO 24200
  5344. 24100 I= 1
  5345. C     CHECK FOR STD
  5346.       IF (VAL.EQ.25) I = 0
  5347.       CALL GENSTO(I)
  5348. C     * CHECK FOR STD *
  5349. 24200 IF(VAL.EQ.25) CALL DELETE(1)
  5350.       GO TO 99991
  5351. C     XCH
  5352. 26000 CALL EXCH
  5353.       GO TO 99991
  5354. C     DEL
  5355. 27000 CONTINUE
  5356.       IF ((ST(SP).NE.0).OR.(RASN(SP).NE.0).OR.(LITV(SP).GE.0))
  5357.      1    GO TO 27100
  5358. C     VALUE IS STACKED, SO GET RID OF IT
  5359.       CALL EMIT(POP,RH,0)
  5360.       REGV(RH) = -1
  5361.       REGV(RL) = -1
  5362.       CALL USTACK
  5363. 27100 CALL DELETE(1)
  5364.       GO TO 99991
  5365. C
  5366. C     CAT (INLINE DATA FOLLOWS)
  5367. 28000 CONTINUE
  5368.       CALL INLDAT
  5369.       GO TO 99999
  5370. C
  5371. C    LOD
  5372. 29000 CONTINUE
  5373.       IL = 0
  5374.       K = PREC(SP)
  5375. C     MAY BE A LOD FROM A BASE FOR A BASED VARIABLE
  5376.       PREC(SP) = MOD(K,4)
  5377.       IA = RASN(SP)
  5378.       IF (IA.GT.0) GO TO 29050
  5379. C     CHECK FOR SIMPLE BASED VARIABLE CASE
  5380.       I = ST(SP)
  5381.       IF (I.LE.0) GO TO 29010
  5382. C         RESERVE REGISTERS FOR THE RESULT
  5383.           CALL GENREG(2,IA,IB)
  5384.           REGS(IA) = SP
  5385.           REGS(IB) = SP
  5386.           RASN(SP) = IB*16 + IA
  5387. C         MAY BE ABLE TO SIMPLIFY LHLD
  5388.           LP = REGV(RH)
  5389.           L = REGV(RL)
  5390.           IF ((LP.EQ.-3).AND.(-L.EQ.I)) GO TO 29110
  5391.           IF ((LP.EQ.-4).AND.(-L.EQ.I)) GO TO 29007
  5392.           J = CHAIN(I,CODLOC+1)
  5393.           CALL EMIT(LHLD,J,0)
  5394.           REGV(RH) = -3
  5395.           REGV(RL) = -I
  5396.           GO TO 29110
  5397. 29007 CALL EMIT(DCX,RH,0)
  5398.       REGV(RH) = -3
  5399.       GO TO 29110
  5400. C
  5401. 29010 CONTINUE
  5402. C     FIRST CHECK FOR AN ADDRESS REFERENCE
  5403.       IF (ST(SP).EQ.0) GO TO 29011
  5404. C         CHANGE THE ADDRESS REFERENCE TO A VALUE REFERENCE
  5405.           ST(SP) = -ST(SP)
  5406.           LITV(SP) = -1
  5407.           GO TO 99991
  5408. C     LOAD THE ADDRESS
  5409. 29011 CONTINUE
  5410.       CALL LOADV(SP,0)
  5411.       IA = RASN(SP)
  5412. 29050 IB = IA/16
  5413.       IA = MOD(IA,16)
  5414.       I = REGS(1)
  5415.       IF (IA.EQ.I) IA = 1
  5416.       IF (IB.EQ.I) IB = 1
  5417.       IF (IB.EQ.(IA-1)) IL = IB
  5418.       IF ((IA*IB).NE.0) GO TO 29100
  5419.           CALL ERROR(138,5)
  5420.           GO TO 99991
  5421. 29100 CONTINUE
  5422. C     MAY BE POSSIBLE TO USE LDAX OR XCHG
  5423.       IF (IL.NE.RD) GO TO 29105
  5424. C     POSSIBLE XCHG OR LDAX
  5425.       IF (LASTEX.EQ.(CODLOC-1)) GO TO 29102
  5426. C     LAST INSTRUCTION NOT AN XCHG
  5427.       IF (MOD(PREC(SP),2).EQ.1) GO TO 29110
  5428. C     DOUBLE XCHG OR DOUBLE BYTE LOAD WITH ADDR IN D AND E
  5429. 29102 CALL EMIT(XCHG,0,0)
  5430.       GO TO 29107
  5431. C
  5432. 29105 CONTINUE
  5433.       CALL EMIT(LD,RL,IA)
  5434.       CALL EMIT(LD,RH,IB)
  5435. 29107 IL = 0
  5436.       REGV(RH) = -1
  5437.       REGV(RL) = -1
  5438. 29110 I = PREC(SP) - K/4
  5439.       PREC(SP) = I
  5440. C     RECOVER THE REGISTER ASSIGNMENT FROM RASN
  5441.       IB = RASN(SP)
  5442.       IA = MOD(IB,16)
  5443.       IB = IB/16
  5444.       J = REGS(1)
  5445.       K = J*(J-IA)*(J-IB)
  5446. C     JUMP IF J=0, IA, OR IB
  5447.       IF (K.EQ.0) GO TO 29150
  5448.           CALL EMIT(LD,J,RA)
  5449. C     SET PENDING STORE OPERATION IN REGS(1)
  5450. 29150 CONTINUE
  5451. C     MAY BE ABLE TO CHANGE REGISTER ASSIGNMENT TO BC
  5452.       IF (IA.NE.RE) GO TO 29160
  5453.       IF ((REGS(RB).NE.0).OR.(REGS(RC).NE.0)) GO TO 29160
  5454. C         BC AVAILABLE, SO RE-ASSIGN
  5455.           REGS(IA) = 0
  5456.           REGS(IB) = 0
  5457.           REGS(RB) = SP
  5458.           REGS(RC) = SP
  5459.           IA = RC
  5460.           IB = RB
  5461.           RASN(SP) = RB*16+RC
  5462. 29160 REGS(RA) = IA
  5463.       IF (IL.EQ.0) CALL EMIT(LD,RA,ME)
  5464.       IF (IL.NE.0) CALL EMIT(LDAX,IL,0)
  5465.       IF (I.GT.1) GO TO 29200
  5466. C     SINGLE BYTE LOAD - RELEASE H.O. REGISTER
  5467.           IB = RASN(SP)
  5468.           RASN(SP) = MOD(IB,16)
  5469.           IB = IB/16
  5470.           IF (IB.EQ.REGS(1)) REGS(1) = 0
  5471.           REGS(IB) = 0
  5472.           REGV(IB) = -1
  5473.           GO TO 29300
  5474. C
  5475. 29200 CALL EMIT(INCX,RH,0)
  5476. C     MAY HAVE DONE A PREVOUS LHLD, IF SO MARK INCX H
  5477.       IF (REGV(RH).EQ.-3) REGV(RH) = -4
  5478.       CALL EMIT(LD,IB,ME)
  5479. 29300 CONTINUE
  5480.       REGS(6) = 0
  5481.       REGS(7) = 0
  5482.       ST(SP) = 0
  5483.       GO TO 99991
  5484. C
  5485. C     INC
  5486. 31000 CONTINUE
  5487. C     PLACE A LITERAL 1 AT STACK TOP AND APPLY ADD OPERATOR
  5488.       SP = SP + 1
  5489.       LITV(SP) = 1
  5490. C     CHECK FOR SINGLE BYTE INCREMENT, MAY BE COMPARING WITH 255
  5491.       IF (PREC(SP-1).NE.1) GO TO 1000
  5492.       CALL APPLY(AD,AC,1,1)
  5493.       LASTIN = CODLOC
  5494. C     TRA WILL NOTICE LASTIN = CODLOC AND SUBSTITUTE JFZ
  5495.       GO TO 99991
  5496. C
  5497. C     CSE (CASE STATEMENT INDEX)
  5498. 32000 CONTINUE
  5499. C     LET X BE THE VALUE OF THE STACK TOP
  5500. C     COMPUTE 2*X + CODLOC, FETCH TO HL, AND JUMP WITH PCHL
  5501. C     RESERVE REGISTERS FOR THE JUMP TABLE BASE
  5502.       CALL GENREG(2,IA,IB)
  5503.       LOCK(IA) = 1
  5504.       LOCK(IB) = 1
  5505. C     INDEX IS IN H AND L, SO DOUBLE IT
  5506.       CALL EMIT(DAD,RH,0)
  5507. C     NOW LOAD THE VALUE OF TABLE BASE, DEPENDING UPON 9 BYTES
  5508. C     LXI R X Y, DAD R, MOV EM, INX H, MOV DM XCHG PCHL
  5509.       CALL EMIT(LXI,IB,CODLOC+9)
  5510.       CALL EMIT(DAD,IB,0)
  5511.       CALL EMIT(LD,RE,ME)
  5512.       CALL EMIT(INCX,RH,0)
  5513.       CALL EMIT(LD,RD,ME)
  5514.       CALL EMIT(XCHG,0,0)
  5515.       CALL EMIT(PCHL,0,0)
  5516. C     PHONEY ENTRY IN SYMBOL TABLE TO KEEP CODE DUMP CLEAN
  5517.       SYTOP = SYTOP + 1
  5518.       SYMBOL(SYTOP) = SYINFO
  5519.       SYMBOL(SYINFO) = -CODLOC
  5520.       SYINFO = SYINFO - 1
  5521. C     SET ENTRY TO LEN=0/PREC=2/TYPE=VARB/
  5522.       SYMBOL(SYINFO) = 32+VARB
  5523.       CASJMP = SYINFO
  5524. C     CASJMP WILL BE USED TO UPDATE THE LENGTH FIELD
  5525.       SYINFO = SYINFO - 1
  5526.       IF (SYINFO.LE.SYTOP) CALL ERROR(108,5)
  5527. C
  5528.       LOCK(IB) = 0
  5529.       REGV(RH) = -1
  5530.       REGV(RL) = -1
  5531. C     MARK H AND L NIL AT CASE OR COMPUTED JUMP BEFORE RETURNING
  5532.       GO TO 20550
  5533. C     HAL (HALT)
  5534. 36000 CONTINUE
  5535.       CALL EMIT(EI,0,0)
  5536.       CALL EMIT(HALT,0,0)
  5537.       GO TO 99991
  5538. C
  5539. C     RTL RTR SFL SFR
  5540. 37000 CONTINUE
  5541.       CALL UNARY(VAL)
  5542.       GO TO 99991
  5543. C
  5544. C     CVA (CONVERT ADDRESS TO DOUBLE PRECISION VARIABLE)
  5545. 43000 CONTINUE
  5546. C     CVA MUST BE IMMEDIATELY PRECEDED BY AN INX OR ADR REF
  5547.       PREC(SP) = 2
  5548. C     IF THE ADDRESS IS ALREADY IN THE GPR'S THEN NOTHING TO DO
  5549.       IF (RASN(SP).GT.0) GO TO 99991
  5550.       IF (ST(SP).LT.0) GO TO 43100
  5551.       IF (ST(SP).GT.0) GO TO 43050
  5552.           CALL ERROR(139,1)
  5553.           GO TO 99999
  5554. C
  5555. C     LOAD VALUE OF BASE FOR ADDRESS REF TO A BASED VARIABLE
  5556. 43050 CALL LOADV(SP,3)
  5557.       GO TO 99991
  5558. C
  5559. C     CHECK FOR ADDRESS REF TO DATA IN ROM.
  5560. 43100 JP = LITV(SP)
  5561.       IF (JP.GT.65535) GO TO 43190
  5562.       IF (JP.LT.0) CALL ERROR(149,1)
  5563. C         LEAVE LITERAL VALUE
  5564.           ST(SP) = 0
  5565.           GO TO 99991
  5566. C
  5567. C     DO LXI R WITH THE ADDRESS
  5568. 43190 CALL GENREG(2,IA,IB)
  5569.       IF (IA.GT.0) GO TO 43200
  5570.           CALL ERROR(140,5)
  5571.           GO TO 99999
  5572. C
  5573. 43200 J = CHAIN(-ST(SP),CODLOC+1)
  5574.       CALL EMIT(LXI,IB,J)
  5575.       ST(SP) = 0
  5576.       RASN(SP) = IB*16+IA
  5577.       REGS(IA) = SP
  5578.       REGS(IB) = SP
  5579.       GO TO 99991
  5580. C
  5581. C
  5582. C     ORG
  5583. 44000 CONTINUE
  5584.       I = LITV(SP)
  5585.       IF (CODLOC.LE.I) GO TO 44100
  5586.           CALL ERROR(141,1)
  5587. C
  5588. 44100 J = CONTRL(47)
  5589.       K = 3
  5590.       IF (J.EQ.1) K = 0
  5591.       IF (CODLOC.NE.(OFFSET+PREAMB+K)) GO TO 44200
  5592. C         THIS IS THE START OF PROGRAM, CHANGE OFFSET
  5593.           OFFSET = I - PREAMB
  5594.           CODLOC = I + K
  5595.           IF (LXIS.GT.0) LXIS = CODLOC - 2
  5596. C         WE HAVE ALREADY GENERATED LXI SP (IF ANY)
  5597.           GO TO 99990
  5598. C     SOME CODE HAS BEEN GENERATED, SO LXI IF NECESSARY
  5599. 44200 IF (CODLOC.GE.I) GO TO 44300
  5600.           CALL EMIT(0,0,0)
  5601.           GO TO 44200
  5602. C
  5603. 44300 IF (J.EQ.1) GO TO 99990
  5604.       IF (J.GT.1) GO TO 44400
  5605.           J = LXIS
  5606.           LXIS = CODLOC + 1
  5607. 44400 CALL EMIT(LXI,RSP,J)
  5608.       GO TO 99990
  5609. C
  5610. C     DRT (DEFAULT RETURN FROM SUBROUTINE)
  5611. C     MERGE H AND L VALUES USING RET OPERATION ABOVE
  5612. 45000 CONTINUE
  5613.           JP = PRSP
  5614.       IF (PRSTK(JP).LE.65535) GO TO 45005
  5615. C     THIS IS THE END OF AN INTERRUPT PROCEDURE
  5616.       CURDEP(JP+1) = CURDEP(JP+1) - 4
  5617. 45005 CONTINUE
  5618.           IF (PRSP.GT.0) PRSP = PRSP - 1
  5619. C         GET STACK DEPTH FOR SYMBOL TABLE
  5620.           IF (JP.LE.0) GO TO 45010
  5621.       IF (CURDEP(JP+1).NE.0) CALL ERROR(150,1)
  5622.           K = MAXDEP(JP+1)
  5623.           L = MOD(PRSTK(JP),65536) - 1
  5624. C         K IS MAX STACK DEPTH, L IS SYMBOL TABLE COUNT ENTRY
  5625.           SYMBOL(L) = K
  5626. 45010     K = REGV(6)
  5627.           L = REGV(7)
  5628.           IF ((K.EQ.-255).AND.(L.EQ.-255)) GO TO 99999
  5629.       IF (PRSTK(JP).LE.65535) GO TO 45030
  5630. 45020 CONTINUE
  5631. C         POP INTERRUPTED REGISTERS AND ENABLE INTERRUPTS
  5632.           CALL EMIT(POP,RA,0)
  5633.           CALL EMIT(POP,RB,0)
  5634.           CALL EMIT(POP,RD,0)
  5635.           CALL EMIT(POP,RH,0)
  5636.           CALL EMIT(EI,0,0)
  5637. 45030 CALL EMIT(RTN,0,0)
  5638.           IF ((K.EQ.-254).AND.(L.EQ.-254)) GO TO 20550
  5639.           IF (JP.GT.0) GO TO 23350
  5640.           CALL ERROR(146,1)
  5641.           GO TO 20550
  5642. C
  5643. C     ENA  -  ENABLE INTERRUPTS
  5644. 45100 CONTINUE
  5645.       CALL EMIT(EI,0,0)
  5646.       GO TO 99999
  5647. C     DIS  - DISABLE INTERRUPTS
  5648. 45200 CONTINUE
  5649.       CALL EMIT(DI,0,0)
  5650.       GO TO 99999
  5651. C
  5652. C     AX1 - CASE BRANCH TO CASE SELECTOR
  5653. 45500 CONTINUE
  5654. C     LOAD CASE NUMBER TO H AND L
  5655.       CALL EXCH
  5656.       CALL LOADV(SP,4)
  5657.       CALL DELETE(1)
  5658.       REGV(RH) = -1
  5659.       REGV(RL) = -1
  5660. C     USE TRA CODE
  5661.       GO TO 20000
  5662. C
  5663. C     MAY NOT BE OMITTED EVEN THOUGH NO OBVIOUS PATH EXISTS).
  5664. 46000 IOP = 4
  5665. C     CASJMP POINTS TO SYMBOL TABLE ATTRIBUTES - INC LEN FIELD
  5666.       SYMBOL(CASJMP) = SYMBOL(CASJMP) + 256
  5667.       GO TO 20050
  5668. 88887 IOP2 = IOP
  5669. 88888 CALL APPLY (IOP,IOP2,ICOM,ICY)
  5670.       GO TO 99991
  5671. 99990 SP = SP - 1
  5672. 99991 ALTER = 1
  5673. 99999 RETURN
  5674.       END
  5675.       SUBROUTINE SYDUMP
  5676. C     DUMP THE SYMBOL TABLE FOR THE SIMULATOR
  5677.       INTEGER CODLOC,ALTER,CBITS(43)
  5678.       COMMON /CODE/CODLOC,ALTER,CBITS
  5679.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  5680.      1    ITRAN(256),OTRAN(64)
  5681.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  5682.      1    ITRAN,OTRAN
  5683.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  5684.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  5685.       INTEGER CONTRL(64)
  5686.       COMMON /CNTRL/CONTRL
  5687.       INTEGER VARB,INTR,PROC,LABEL,LITER
  5688.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  5689.       INTEGER GNC,RIGHT,SHL,SHR,GET
  5690.       INTEGER CHAR(32),ICHAR,ADDR
  5691. C     CLEAR THE OUTPUT BUFFER
  5692.       CALL WRITEL(0)
  5693.       L = 0
  5694. C     SAVE THE CURRENT INPUT FILE NUMBER, POINT INPUT
  5695. C     AT SYMBOL FILE.
  5696.       M = CONTRL(20)
  5697.       CONTRL(20) = CONTRL(32)
  5698. C     GET RID OF LAST CARD IMAGE
  5699.       IBP = 99999
  5700. 50    I = GNC(0)
  5701.       IF (I.EQ.1) GO TO 50
  5702.       IF (I.NE.41) GO TO 8000
  5703. C
  5704. C     PROCESS NEXT SYMBOL TABLE ENTRY
  5705. 100   I = GNC(0)
  5706.       IF (I.EQ.41) GO TO 9000
  5707. C     PROCESS THE NEXT SYMBOL
  5708. 110   I = I - 2
  5709. C     BUILD ADDRESS OF INITIALIZED SYMBOL
  5710.       K = 32
  5711.           DO 200 J=1,2
  5712.           I = (GNC(0)-2)*K+I
  5713. 200       K = K * 32
  5714. C
  5715.       IF(I.GT.4.AND.I.NE.6) GO TO 260
  5716. 250   J=GNC(0)
  5717.       IF(J.EQ.41) GO TO 100
  5718.       GO TO 250
  5719. 260   CONTINUE
  5720. C     WRITE SYMBOL NUMBER, SYMBOL, AND ABSOLUTE ADDRESS (OCTAL)
  5721.           CALL CONOUT(1,-5,I,10)
  5722.           CALL PAD(1,1,1)
  5723.           ICHAR = 1
  5724.           DO 290 K = 1,32
  5725.             CHAR(K) = 40
  5726. 290       CONTINUE
  5727. C     READ UNTIL NEXT / SYMBOL
  5728. 300       J = GNC(0)
  5729.           IF (J.EQ.41) GO TO 400
  5730.           CHAR(ICHAR) = J
  5731.           ICHAR = ICHAR + 1
  5732. C     WRITE NEXT CHARACTER IN STRING
  5733.           CALL PAD(1,J,1)
  5734.           GO TO 300
  5735. C
  5736. C     END OF SYMBOL
  5737. 400   CALL PAD(1,1,1)
  5738. C     WRITE OCTAL ADDRESS
  5739.       J = SYMBOL(I)
  5740.       I = IABS(SYMBOL(J))
  5741.       J = SYMBOL(J-1)
  5742.       IF (MOD(J,16).EQ.VARB) GO TO 410
  5743. C     SYMBOL IS A LABEL, SO SHIFT RIGHT TO GET ADDR
  5744.       I = I/65536
  5745. 410   CONTINUE
  5746.       CALL CONOUT(1,5,I,16)
  5747.       ADDR = I
  5748.       CALL PAD(1,1,3)
  5749.       IF (CONTRL(13).EQ.0) GO TO 430
  5750.         N = CONTRL(26)
  5751.         CONTRL(26) = CONTRL(13)
  5752.         CALL WRITEL(0)
  5753.         L = 1
  5754.         CONTRL(26) = N
  5755. 430   CONTINUE
  5756.       OBP = CONTRL(36) - 1
  5757.       IF (CONTRL(24).EQ.0) GO TO 440
  5758.         CALL FORM(1,CHAR,1,32,32)
  5759.         CALL CONOUT(1,4,ADDR,16)
  5760.         CALL WRITEL(0)
  5761. 440   CONTINUE
  5762.       GO TO 100
  5763. C
  5764. 8000  CALL ERROR(143,1)
  5765. C
  5766. 9000  IF (L.EQ.0) GO TO 9999
  5767.       IF (CONTRL(13).EQ.0) GO TO 9999
  5768.         CALL PAD(1,1,1)
  5769.         CALL PAD(1,38,1)
  5770.         N = CONTRL(26)
  5771.         CONTRL(26) = CONTRL(13)
  5772.         CALL WRITEL(0)
  5773.         CONTRL(26) = N
  5774. C
  5775. 9999  CONTINUE
  5776.       CONTRL(20) = M
  5777.       RETURN
  5778.       END
  5779.       BLOCK DATA
  5780.       INTEGER TITLE(10),VERS
  5781.       COMMON/TITLES/TITLE,VERS
  5782.       INTEGER PRSTK(15),MAXDEP(16),CURDEP(16),PRSMAX,PRSP,LXIS
  5783.       LOGICAL ERRFLG
  5784.       INTEGER TERR(22)
  5785.       COMMON/TERRR/TERR,ERRFLG
  5786.       INTEGER SMSSG(29)
  5787.       COMMON/SMESSG/SMSSG
  5788.       COMMON /PSTACK/PRSTK,MAXDEP,CURDEP,PRSMAX,PRSP,LXIS
  5789. C     PSTACK IS THE PROCEDURE STACK USED IN HL OPTIMIZATION
  5790.       INTEGER XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  5791.       INTEGER LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  5792.       COMMON /PEEP/LAPOL,LASTLD,LASTRG,LASTIN,LASTEX,LASTIR
  5793.       COMMON /XFROPT/XFRLOC,XFRSYM,TSTLOC,CONLOC,DEFSYM,DEFRH,DEFRL
  5794. C     XFROPT IS USED IN BRANCH OPTIMIZTION
  5795.       INTEGER SYMBOL(3000),SYMAX,SYTOP,SYINFO,LMEM
  5796.       COMMON /SYMBL/SYMBOL,SYMAX,SYTOP,SYINFO,LMEM
  5797. C     BUILT-IN FUNCTION CODE (MULTIPLICATION AND DIVISION)
  5798.       INTEGER BIFTAB(41),BIFPAR
  5799.       COMMON /BIFCOD/BIFTAB,BIFPAR
  5800.       INTEGER IBUFF(80),OBUFF(120),IBP,OBP,
  5801.      1    ITRAN(256),OTRAN(64)
  5802.       COMMON /FILES/IBUFF,OBUFF,IBP,OBP,
  5803.      1    ITRAN,OTRAN
  5804.       INTEGER CONTRL(64)
  5805.       COMMON /CNTRL/CONTRL
  5806.       INTEGER MSSG(77)
  5807.       COMMON/MESSG/MSSG
  5808. C
  5809.       INTEGER POLCHR(18),OPCVAL(51)
  5810.       COMMON /OPCOD/POLCHR,OPCVAL
  5811. C     OPRADRVALDEFLITLIN
  5812.       INTEGER INTPRO(8)
  5813.       COMMON /INTER/INTPRO
  5814.       INTEGER DEBASE
  5815.       COMMON /BASE/DEBASE
  5816.       INTEGER INLOC,OUTLOC,FIRSTI,CASJMP
  5817.       COMMON /BIFLOC/INLOC,OUTLOC,FIRSTI,CASJMP
  5818.       INTEGER CTRAN(256),C1(100),C2(100),C3(56)
  5819.       EQUIVALENCE (C1(1),CTRAN(1)),(C2(1),CTRAN(101)),
  5820.      1    (C3(1),CTRAN(201))
  5821.       INTEGER INSYM(284),INSYM1(150),INSYM2(134)
  5822.       EQUIVALENCE (INSYM1(1),INSYM(1)),
  5823.      1    (INSYM2(1),INSYM(151))
  5824.       INTEGER IBYTES(23)
  5825.       COMMON /INST/CTRAN,INSYM,IBYTES
  5826.       INTEGER CODLOC,ALTER,CBITS(43)
  5827.       COMMON /CODE/CODLOC,ALTER,CBITS
  5828.       INTEGER LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,JMP,JMC,
  5829.      1   CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  5830.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  5831.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  5832.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  5833.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  5834.       COMMON /OPS/LD,IN,DC,AD,AC,SU,SB,ND,XR,OR,CP,ROT,
  5835.      1   JMP,JMC,CAL,CLC,RTN,RTC,RST,INP,OUT,HALT,
  5836.      2   STA,LDA,XCHG,SPHL,PCHL,CMA,STC,CMC,DAA,SHLD,LHLD,EI,DI,
  5837.      3   LXI,PUSH,POP,DAD,STAX,LDAX,INCX,DCX,
  5838.      4   RA,RB,RC,RD,RE,RH,RL,RSP, ME,LFT,RGT,TRU,FAL,
  5839.      5   CY,ACC,CARRY,ZERO,SIGN,PARITY
  5840.       INTEGER REGS(7),REGV(7),LOCK(7),PREC(16),ST(16),RASN(16),LITV(16),
  5841.      1    SP,MAXSP,INTBAS
  5842.       COMMON /REGALL/REGS,REGV,LOCK,PREC,ST,RASN,LITV,SP,MAXSP,INTBAS
  5843.       INTEGER REGMAP(9)
  5844.       COMMON /RGMAPP/ REGMAP
  5845.       INTEGER VARB,INTR,PROC,LABEL,LITER
  5846.       COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
  5847.       INTEGER STHEAD(12)
  5848.       COMMON /STHED/ STHEAD
  5849.       INTEGER OPR,ADR,VLU,DEF,LIT,LIN,
  5850.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  5851.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  5852.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  5853.      *AX1,AX2,AX3
  5854.       COMMON /ILCOD/ OPR,ADR,VLU,DEF,LIT,LIN,
  5855.      *NOP,ADD,ADC,SUB,SBC,MUL,DIV,MDF,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
  5856.      *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
  5857.      *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
  5858.      *AX1,AX2,AX3
  5859.       INTEGER WDSIZE,WFACT,TWO8,FACT(5)
  5860.       INTEGER MAXMEM,MEMTOP,MEMBOT,MEM(2500),MAXVM,OFFSET,PREAMB
  5861.       COMMON /FACTOR/WDSIZE,WFACT,TWO8,FACT
  5862.       COMMON /MEMORY/MAXMEM,MEMTOP,MEMBOT,MEM,MAXVM,OFFSET,PREAMB
  5863. C     ... PLM2 VERS ...
  5864.       DATA OFFSET/0/
  5865.       DATA TITLE/27,23,24, 4, 1,33,16,29,30, 1/
  5866.       DATA VERS/20/
  5867. C     COMPILATION TERMINATED
  5868.       DATA TERR/14,26,24,27,20,23,12,31,20,26,25, 1,
  5869.      1    31,16,29,24,20,25,12,31,16,15/
  5870.       DATA ERRFLG /.FALSE./
  5871. C     STACK SIZE = OVERRIDDEN BYTES
  5872.       DATA SMSSG /30,31,12,14,22,1,
  5873.      1    30,20,37,16,1,  39,1,
  5874.      2    26,33,16,29,29,20,15,15,16,25,1,
  5875.      3    13,36,31,16,30/
  5876.       DATA PRSTK /15*0/, PRSMAX /15/, PRSP /0/
  5877.       DATA MAXDEP /16*0/, CURDEP /16*0/, LXIS /0/
  5878. C     PEEP IS USED IN PEEPHOLE OPTIMIZATION (SEE EMIT)
  5879. C         LAPOL IS A ONE ELEMENT POLISH LOOK-AHEAD
  5880. C         LASTLD IS CODLOC OF LAST REGISTER TO MEMORY STORE
  5881. C         LASTRG IS THE EFFECTED REGISTER
  5882. C         LASTIN IS THE CODLOC OF THE LAST INCREMENT
  5883. C         (USED IN DO-LOOP INDEX INCREMENT)
  5884. C         LASTEX IS LOCATION OF LAST XCHG OPERATOR
  5885. C         LASTIR IS THE CODLOC OF THE LAST REGISTER INCREMENT
  5886. C         (USED IN APPLY AND GENSTO TO GEN INR MEMORY)
  5887.       DATA LAPOL/-1/, LASTLD/0/, LASTRG/0/, LASTIN /0/, LASTEX /0/,
  5888.      1    LASTIR /0/
  5889.       DATA XFRLOC /-1/, XFRSYM /0/, TSTLOC /-1/, CONLOC /-1/,
  5890.      1    DEFSYM /0/, DEFRH /-1/, DEFRL /-1/
  5891.       DATA SYMAX /3000/, SYTOP /0/, SYINFO /3000/
  5892.       DATA BIFPAR /0/
  5893. C     BUILT-IN FUNCTION VECTOR --
  5894. C     MULTIPLY AND DIVIDE OR MOD
  5895. C     +  FIRST TWO GIVE BASE LOCATIONS OF BIF CODE SEGMENTS
  5896. C     +  NEXT COMES NUMBER OF BYTES, NUMBER OF RELOCATIONS, AND
  5897. C     +  A VECTOR OF ABSOLUTE LOCATIONS WHERE STUFFS OCCUR
  5898. C
  5899. C     THE CODE SEGMENTS ARE ABSOLUTE, PACKED THREE PER ENTRY
  5900. C
  5901. C
  5902. C MULTIPLY
  5903. C
  5904. C 121 147 120 154 242 012 000 096 105 235 068 077 033 000 000 235
  5905. C 120 177 200 235 120 031 071 121 031 079 210 030 000 025 235 041
  5906. C 195 016 000
  5907. C
  5908. C DIVIDE
  5909. C
  5910. C 122 047 087 123 047 095 019 033 000 000 062 017 229 025 210 018
  5911. C 000 227 225 245 121 023 079 120 023 071 125 023 111 124 023 103
  5912. C 241 061 194 012 000 183 124 031 087 125 031 095 201
  5913. C
  5914.       DATA BIFTAB/
  5915.      1 -3, -20,
  5916.      1 35, 3, 5, 27, 33,
  5917.      1 7902073, 848538, 6905856, 5063915, 33, 11630827,
  5918.      1 7924680, 7948063, 13782815, 1638430, 12790251, 16,
  5919.      1 45, 2, 15, 35,
  5920.      1 5713786, 6238075, 8467, 1129984, 13769189,
  5921.      1 14876690, 7992801, 7884567, 8210199, 8154903,
  5922.      1 15820567, 836157, 8173312, 8214303, 13197087,
  5923.      1 0, 0, 0/
  5924.       DATA CONTRL /64*0/
  5925.       DATA IBP /81/, OBP /0/
  5926.       DATA OTRAN /1H ,1H0,1H1,1H2,1H3,1H4,
  5927.      1    1H5,1H6,1H7,1H8,1H9,1HA,1HB,1HC,1HD,1HE,1HF,
  5928.      2    1HG,1HH,1HI,1HJ,1HK,1HL,1HM,1HN,1HO,1HP,1HQ,
  5929.      3    1HR,1HS,1HT,1HU,1HV,1HW,1HX,1HY,1HZ,
  5930.      4    1H$,1H=,1H.,1H/,1H(,1H),1H+,1H-,1H',1H*,1H,,
  5931.      5    1H<,1H>,1H:,1H;,12*0/
  5932. C     PASS-NOPROGRAM
  5933. C     ERROR
  5934. C     ()NEARAT
  5935. C     PARSE STACK
  5936. C     SYMBOL  ADDR WDS CHRS   LENGTH PR TY
  5937.       DATA MSSG /27,12,30,30,45,
  5938.      1    25,26,27,29,26,18,29,12,24,1,
  5939.      2    16,29,29,26,29,
  5940.      3    42,43,25,16,12,29,12,31,
  5941.      4    27,12,29,30,16,1,30,31,12,14,22,51,1,
  5942.      5    30,36,24,13,26,23, 1,1,  12,15,15,29, 1, 34,15,30, 1,
  5943.      6    14,19,29,30, 1,1,1, 23,16,25,18,31,19,  1,27,29,  1,31,36/
  5944.       DATA INTPRO /8*0/
  5945.       DATA POLCHR /26,27,29, 12,15,29, 33,12,23, 15,16,17,
  5946.      1    23,20,31, 23,20,25/
  5947.       DATA DEBASE /16/
  5948.       DATA INLOC /16/, OUTLOC /17/, CASJMP /0/, FIRSTI /7/
  5949. C     NUMBER OF BYTES FOLLOWING FIRST 13 INSTRUCTIONS IN CATEGORY 3
  5950.       DATA IBYTES /0,0,0,0,2,2,0,0,1,1,0,2,2,
  5951.      1     0,0,0,0,0,0,0,0,2,2/
  5952.       DATA C1 /
  5953.      1    835,   36,   40,   42, 1057, 2081, 1280,   35,  995,   39,
  5954.      2     41,   43, 1089, 2113, 2304,   67,  995,  100,  104,  106,
  5955.      3    1121, 2145, 3328,   99,  995,  103,  105,  107, 1153, 2177,
  5956.      4    4352,  131,  995,  164,  707,  170, 1185, 2209, 5376,  675,
  5957.      5     995,  167,  739,  171, 1217, 2241, 6400,  579,  995,  292,
  5958.      6     387,  298, 1249, 2273, 7424,  611,  995,  295,  419,  299,
  5959.      7    1025, 2049,  256,  643, 1056, 1088, 1120, 1152, 1184, 1216,
  5960.      8    1248, 1024, 2080, 2112, 2144, 2176, 2208, 2240, 2272, 2048,
  5961.      9    3104, 3136, 3168, 3200, 3232, 3264, 3296, 3072, 4128, 4160,
  5962.      A   4192, 4224, 4256, 4288, 4320, 4096, 5152, 5184, 5216, 5248/
  5963.       DATA C2 /
  5964.      1   5280, 5312, 5344, 5120, 6176, 6208, 6240, 6272, 6304, 6336,
  5965.      2    6368, 6144, 7200, 7232, 7264, 7296, 7328, 7360,  355, 7168,
  5966.      3     32,   64,   96,  128,  160,  192,  224,    0, 3105, 3137,
  5967.      4    3169, 3201, 3233, 3265, 3297, 3073, 4129, 4161, 4193, 4225,
  5968.      5    4257, 4289, 4321, 4097, 5153, 5185, 5217, 5249, 5281, 5313,
  5969.      6    5345, 5121, 6177, 6209, 6241, 6273, 6305, 6337, 6369, 6145,
  5970.      7    7201, 7233, 7265, 7297, 7329, 7361, 7393, 7169, 8225, 8257,
  5971.      8    8289, 8321, 8353, 8385, 8417, 8193, 9249, 9281, 9313, 9345,
  5972.      9    9377, 9409, 9441, 9217,10273,10305,10337,10369,10401,10433,
  5973.      A  10465,10241, 3106,   38, 1058,  163, 2082,   37, 3329,  259/
  5974.       DATA C3 /
  5975.      1   3234,  227, 1186,  995, 2210,  195, 4353, 1283, 3074,  102,
  5976.      2    1026,  323, 2050,  101, 5377, 2307, 3202,  995, 1154,  291,
  5977.      3    2178,  995, 6401, 3331, 3170,  166, 1122,  483, 2146,  165,
  5978.      4    7425, 4355, 3298,  547, 1250,  451, 2274,  995, 8449, 5379,
  5979.      5    3138,    6, 1090,  803, 2114,    5, 9473, 6403, 3266,  515,
  5980.      6    1218,  771, 2242,  995,10497, 7427/
  5981. C
  5982.       DATA INSYM1 /
  5983.      1     15, 38, 60, 66,108,116,234,240,247,253,259,266,273,279, 10,
  5984.      2     27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 12, 13, 14, 15,
  5985.      3     16, 19, 23, 24, 20, 30, 27,  8, 48, 50, 52, 53, 55, 56, 57,
  5986.      4     58, 60, 25, 14, 25, 37, 27, 27, 26, 14, 37, 24, 27, 16,  1,
  5987.      5     63, 66, 24, 26, 33, 10, 78, 81, 84, 87, 90, 93, 96, 99,102,
  5988.      6    105,108, 20, 25, 29, 15, 14, 29, 12, 15, 15, 12, 15, 14, 30,
  5989.      7     32, 13, 30, 13, 14, 12, 25, 12, 35, 29, 12, 26, 29, 12, 14,
  5990.      8     24, 27,  3,113,114,115,116, 21, 14, 29, 31,149,152,155,158,
  5991.      9    161,164,168,171,174,176,179,182,185,188,192,196,200,204,207,
  5992.      A    210,213,216,220,224,226,228,231,231,231,231,231,234, 29, 23/
  5993.       DATA INSYM2 /
  5994.      1     14, 29, 29, 14, 29, 12, 23, 29, 12, 29, 21, 24, 27, 14, 12,
  5995.      2     23, 23, 29, 16, 31, 29, 30, 31, 20, 25, 26, 32, 31, 19, 23,
  5996.      3     31, 30, 31, 12, 23, 15, 12, 35, 14, 19, 18, 35, 31, 19, 23,
  5997.      4     30, 27, 19, 23, 27, 14, 19, 23, 14, 24, 12, 30, 31, 14, 14,
  5998.      5     24, 14, 15, 12, 12, 30, 19, 23, 15, 23, 19, 23, 15, 16, 20,
  5999.      6     15, 20, 25, 26, 27, 45, 45, 45,  1,237,240, 23, 35, 20,  1,
  6000.      7    243,247, 27, 32, 30, 19,  1,250,253, 27, 26, 27,  1,256,259,
  6001.      8     15, 12, 15,  1,262,266, 30, 31, 12, 35,  1,269,273, 23, 15,
  6002.      9     12, 35,  1,276,279, 20, 25, 35,  1,282,285, 15, 14, 35/
  6003.       DATA CODLOC /0/
  6004. C  STA    011    000    LDA    011    000    XCHG   SPHL   PCHL
  6005. C  CMA    STC    CMC    DAA    SHLD   011    000    LHLD   011
  6006. C  000    EI     DI     LXI B  011    000    PUSH B POP B  DAD B
  6007. C  STAX B LDAX B INX B  DCX B  NOP    NOP    NOP    NOP    NOP
  6008. C  050 011 000 058 011 000 235 249 233 047 055 063 039 034 011 000
  6009. C  042 011 000 251 243 001 011 000 197 193 009 002 010 003 011 000
  6010.       DATA CBITS /64,4,5,128,136,144,152,160,168,176,184,7,
  6011.      1    195,194,205,196,201,192,199,219,211,118,
  6012.      2    50,58,235,249,233,47,55,63,39,34,42,251,243,1,
  6013.      3    197,193,9,2,10,3,11/
  6014.       DATA LD /1/, IN /2/, DC /3/, AD /4/, AC /5/, SU /6/,
  6015.      1   SB /7/, ND /8/, XR /9/, OR /10/, CP /11/, ROT /12/,
  6016.      2   JMP /13/, JMC /14/, CAL /15/, CLC /16/, RTN /17/, RTC /18/,
  6017.      3   RST /19/, INP /20/, OUT /21/, HALT /22/,
  6018.      4   STA /23/, LDA /24/, XCHG /25/, SPHL /26/, PCHL /27/, CMA /28/,
  6019.      5   STC /29/, CMC /30/, DAA /31/, SHLD /32/, LHLD /33/, EI /34/,
  6020.      6   DI /35/, LXI /36/, PUSH /37/, POP /38/, DAD /39/, STAX /40/,
  6021.      7   LDAX /41/, INCX /42/, DCX /43/
  6022.       DATA RA /1/, RB /2/, RC /3/, RD /4/, RE /5/, RH /6/, RL /7/,
  6023.      1   RSP/9/, ME /8/, LFT /9/, RGT /10/, TRU /12/, FAL /11/, CY /13/,
  6024.      2   ACC /14/, CARRY /15/, ZERO /16/, SIGN /17/, PARITY /18/
  6025.       DATA REGS/7*0/, REGV/7*-1/, LOCK /7*0/,  SP /0/, MAXSP /16/
  6026.       DATA REGMAP /7,0,1,2,3,4,5,6,6/
  6027. C     INTBAS IS THE LARGEST INTRINSIC SYMBOL NUMBER
  6028.       DATA INTBAS /23/
  6029.       DATA VARB /1/, INTR /2/, PROC /3/, LABEL /4/, LITER /6/
  6030. C     PRSTRASNLITV
  6031.       DATA STHEAD /27,29,30,31,29,12,30,25,23,20,31,33/
  6032.       DATA OPR /0/, ADR /1/, VLU /2/, DEF /3/, LIT /4/, LIN /5/,
  6033.      *NOP/ 0/,ADD/ 1/,ADC/ 2/,SUB/ 3/,SBC/ 4/,MUL/ 5/,DIV/ 6/,MDF/ 7/,
  6034.      *NEG/ 8/,AND/ 9/,IOR/10/,XOR/11/,NOT/12/,EQL/13/,LSS/14/,GTR/15/,
  6035.      *NEQ/16/,LEQ/17/,GEQ/18/,INX/19/,TRA/20/,TRC/21/,PRO/22/,RET/23/,
  6036.      *STO/24/,STD/25/,XCH/26/,DEL/27/,DAT/28/,LOD/29/,BIF/30/,INC/31/,
  6037.      *CSE/32/,END/33/,ENB/34/,ENP/35/,HAL/36/,RTL/37/,RTR/38/,SFL/39/,
  6038.      *SFR/40/,HIV/41/,LOV/42/,CVA/43/,ORG/44/,DRT/45/,ENA/46/,DIS/47/,
  6039.      *AX1/48/,AX2/49/,AX3/50/
  6040.       DATA OPCVAL /
  6041.      * 104091,  50127,  50126, 124941, 123726, 100375,  62753, 119832,
  6042.      * 103442,  50767,  83613, 145053, 104095,  67351,  96158,  75741,
  6043.      * 103452,  95260,  74780,  83555, 128844, 128846, 112474, 119839,
  6044.      * 124890, 124879, 144275,  62487,  62239,  95887,  54545,  83534,
  6045.      *  59280,  67151,  67149,  67163,  78615, 120791, 120797, 123991,
  6046.      * 123997,  79137,  95905,  59468, 108370,  63327,  67148,  62750,
  6047.      *  51395,  51396,  51397/
  6048.       DATA WDSIZE /31/, TWO8 /256/, MAXMEM /2500/
  6049.       END
  6050.