|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 244992 (0x3bd00)
Types: TextFile
Names: »list1«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »list1«
82.01.12. 12.40. pascal version 1980.06.17
1 (*$L+*)
2 (* M20 *)
3 (* COPYRIGHTED 1980 BY MOTOROLA, INC. *)
4 PROGRAM DIRECT(OUTPUT,PCODE,OBJECT,LISTING);
5 (* AUGUST 7, 1980 *)
6 (* GENERATES S-RECORDS *)
7 (* 370 VERSION *)
8 (* LONG ADDRESSES *)
9 (* DIRECT CODE VERSION *)
10 (* 01/08/82 @ REPLACED BY ^ *
11 * (. REPLACED BY Æ *
12 * .) REPLACED BY Å *
13 * EXTERNAL REPLACED BY XEXTERNAL *
14 * FILE OF CHAR REPLACED BY TEXT *
15 * HENRIK JACOBSEN HC *)
16 CONST STRLENGTH = 64;
17 LINELNGTH = 133;
18 BITSPERDIGIT = 8;
19 LDIGIT = 3;
20 TOPDIGIT = 255;
21 MAXDIGIT = 256;
22 MAXLABEL = 400;
23 MAXCORE = 1044;
24 STKMAX = 32;
25 NDREGS = 5; NAREGS = 3; (*NBR OF REGS TO BE ALLOCATED FOR STACK*)
26
27
28 TYPE OPTYPS = (OP0, OPLI, OPT, OP2T, OPTI, OPT2I, OPI, OPTLI,
29 OP3I, OPTL2I, OPTL, OPENT, OPENTB, OPTV, OPLAB, ENDOP);
30
31 PCODES=(XAB, XAD, XAFI, XAND, XARG,
32 XAST, XATN, XCHK, XCHKF, XCLO, XCOS, XCSP,
33 XCSPF,XCUP, XCUPF,XCVB, XCVT, XDAS, XDATA,XDATB,XDEC, XDEF, XDIF,
34 XDIS, XDV, XEIO, XEND, XENT, XENTB,XEOF, XEOL, XEQU, XEXI, XEXP,
35 XEXT, XFJP, XGEQ, XGET, XGRT, XIFD, XINC, XIND, XINN, XINS, XINT,
36 XIOR, XISC, XIXA, XLAB, XLCA, XLDA, XLDC, XLEQ, XLES, XLOD, XLOG,
37 XLSC, XLSPA,XLTA, XLUPA,XMOD, XMOV, XMOVV,XMP, XMRK, XMST, XNEQ,
38 XNEW, XNG, XNOT, XODD, XPAG, XPEE, XPOK, XPOS, XPUT, XRDB, XRDC,
39 (*604*) XRDE, XRDH, XRDI, XRDJ, XRDQ, XRDR, XRDS, XRDV, XRET, XRLN, XRLS, XRND,
40 XRST, XRWT, XSB, XSCON,XSCOP,XSDEL,XSEE, XSGS, XSIN, XSINS,XSLEN,
41 (*RM*) XSPOS,XSQR, XSQT, XSTO, XSTP, XSTR, XTRC, XUJP, XUNI, XVJP, XWLN, XWRB,
42 (*604*) XWRC, XWRE, XWRH, XWRI, XWRJ, XWRQ, XWRR, XWRS, XWRV, XXJP, XSTC, XNONE,
43 XINDV, XLODV, XSTRV, XSTOV, XEQUV, XNEQV, XLESV, XLEQV,
44 XGRTV, XGEQV, XCVTSU, XCVTUS, XLDCV);
45
46 MNS = XAB .. XNONE;
47
48 TARGETOP = (TMOVE, TLINK, TUNLK, TRTS , TTST, TBGT, TNEG, TSUBQ,
49 TBTST, TSNZ, TADD, TSUB, TAND, TOR, TMULS, TDIVS,
50 TCMP, TCLR, TTRAP, TDCNT, TBSR, TADDQ,TCOMP, TLBSR,
51 TMOVEQ,TSEQ, TSNE, TSLT, TSLE, TSGT, TSGE, TLEA ,
52 TLBGT, TLBRA, TLBNE, TLBEQ, TLBLT, TASL, TBLT, TJMP,
53 (*RM*) TPEA, TBSET, TBZ, TSWAP, TCMPM, TJSR,
54 TBNZ, TBGE, TBLE, TCHK, TLBLE, TLBGE,
55 (*RM*) TLDQ, TEXTE, TBRA, TBNE, TEQU, TBEQ, TEOR, TDC );
56
57 DATATYPE = (ATYP,ITYP,JTYP,RTYP,QTYP,VTYP,STYP,BTYP,
58 (*RM*) PTYP,NOTATYP,CTYP,HTYP,UTYP);
59
60 MESSAGE = PACKED ARRAYÆ1..15Å OF CHAR;
61 ERRORMESSAGE = PACKED ARRAYÆ1..20Å OF CHAR;
62
63
64
65 IPTR = ^INSTRUCTION;
66 INSTRUCTION = RECORD INUSE : BOOLEAN;
67 NEXT : IPTR;
68 (*PREV : IPTR;*)
69 OPCODE: MNS;
70 OPTYPE: OPTYPS;
71 DTYPE,D1TYPE: DATATYPE;
72 OPAND1: INTEGER;
73 OPAND2: INTEGER;
74 OPAND3: INTEGER;
75 OPAND4: INTEGER;
76 OPSTRING: ^VSTRINGV;
77 (*RM*) OPSET: ^SETR
78 END;
79
80 VSTRINGV = RECORD STRINGL: 0..STRLENGTH;
81 VSTRINGA: PACKED ARRAY Æ 1..STRLENGTHÅ OF CHAR
82 END;
83
84
85 LINT = ARRAY Æ0..LDIGITÅ OF INTEGER; (*MULTIPLE PRECISION*)
86
87 ADDRESS = LINT; (*SHOULD BE "RECORD BYTE1,BYTE2,BYTE3:0..255 END"*)
88
89 LABELREF = RECORD CORELOC: ADDRESS;
90 NEXT: ^LABELREF
91 END;
92
93 LABL = RECORD LOCATION: ADDRESS;
94 DEFINED: BOOLEAN;
95 REFED: BOOLEAN;
96 REFCHAIN: ^LABELREF;
97 END;
98 LABTABLE = ARRAYÆ0..MAXLABELÅ OF LABL;
99
100 ESD = RECORD NAME: MNS; (*XEXTERNAL SYMBOL DEFINITION LIST*)
101 REFERENCE: ADDRESS;
102 NEXT: ^ESD
103 END;
104
105 EAMODE = (NONE,DDIRECT,ADIRECT,DEFER,INCR,DECR,
106 (*RM*) BASED,INDEX, PCINDEX, STSHORT,
107 RELATIVE,XEXTERNAL,LABELLED, LABIMMED,
108 (*RM*) PIMMED,
109 LIMMED,
110 (*RM*) IMMED,ABSOLUTE,STLONG); (* THIS ORDER IS IMPORTANT *)
111
112 REGISTER = (DNONE,D0,D1,D2,D3,D4,D5,D6,D7,
113 ANONE,A0,A1,A2,A3,A4,A5,A6,A7);
114
115 REGKIND = (AREG, DREG);
116
117 EFFADDR = RECORD MODE: EAMODE;
118 REG: REGISTER;
119 XREG: REGISTER;
120 DISPL: INTEGER
121 END;
122
123 (*RM*) SETR = RECORD
124 (*RM*) SETV: PACKED ARRAYÆ1..16Å OF CHAR
125 (*RM*) END;
126
127 VAR
128 DEBUG: INTEGER; (*DIAGNOTSIC FLAG *)
129 CHANGED: BOOLEAN;
130 ASCII: ARRAYÆCHARÅ OF INTEGER;
131 C: CHAR;
132 ERRORWR: BOOLEAN;
133 LISTING: TEXT;
134 PCODE: TEXT;
135 OBJECT: TEXT;
136 CHCNT,LINELEN: 1..LINELNGTH;
137 LINEBUF: ARRAYÆ1..LINELNGTHÅ OF CHAR;
138 LINECOUNT: INTEGER;
139 MACHINDEX: INTEGER;
140
141 SIZE: ARRAYÆDATATYPEÅ OF INTEGER;
142 (*RM*) DNAME: PACKED ARRAYÆDATATYPEÅ OF CHAR;
143 LONGTYPES: SET OF DATATYPE; (* = ÆPTYP,VTYP,STYPÅ*)
144
145 (*RM*) LASTLABEL: INTEGER; (* LABEL OF LAST LABELLED PCODE *)
146
147 FIRSTI, LASTI, CURRI, OPTIMI, TEMPI : IPTR;
148 (*480*) FAKEI: IPTR; (* DUMMY PCODE *)
149 OPTIM2,OPTIM3,OPTIM4,OPTIM5 : IPTR;
150 CURROPCODE: MNS; CURROPTYPE: OPTYPS;
151
152 TEMPLEVEL: INTEGER; (*LEVEL OF DISPLAY VECTOR CURRENTLY IN A4*)
153 COMMUTATIVE, SWITCH: BOOLEAN;
154
155 OPSYM: PACKED ARRAYÆ1..4Å OF CHAR;
156 MACHCODE: PACKED ARRAYÆ1..20Å OF CHAR;
157 VSTRING, BLANKS: PACKED ARRAYÆ1..STRLENGTHÅ OF CHAR;
158 CURRLABEL, HIGHLABEL, LABELOFFSET, DEFVALUE: INTEGER;
159 TOPLABEL : INTEGER;
160 LABELED, DOLLAR, ABSOL: BOOLEAN;
161 LEVEL, ALENGTH: INTEGER;
162 FLPC: BOOLEAN;
163
164 FMN: ARRAYÆ'A'..'Z'Å OF MNS;
165 MN: ARRAYÆMNSÅ OF PACKED ARRAYÆ1..4Å OF CHAR;
166 OT: ARRAYÆMNSÅ OF OPTYPS;
167 SUBTYPE: ARRAYÆMNSÅ OF 0..255;
168 RT: ARRAYÆPCODESÅ OF INTEGER; (* ADDRESSES OF RUNTIME ROUTINES*)
169 FL: ARRAYÆMNSÅ OF BOOLEAN;
170 TMN: ARRAYÆTARGETOPÅ OF PACKED ARRAYÆ1..5Å OF CHAR;
171
172 LABELTABLE, PROCTABLE: LABTABLE;
173
174 PC: ADDRESS;
175 LTEMP: LINT; (* TEMPORARY FOR LONG ARITHMETIC *)
176 CORE: ARRAYÆ1..MAXCOREÅ OF INTEGER;
177 GENLOC: LINT; (* CURRENT CODEGEN ADDRESS *)
178 GENSTART: LINT; (* FIRST ADDRESS OF CODE *)
179 GENSAVE: LINT; (*TEMP TO SAVE GENLOC *)
180 EXPROC: ADDRESS; (* SLOT TO STORE JUMP TO DISTANT PROC IN *)
181 CORECOUNT: 0..MAXCORE;
182 CORESAVE: 0..MAXCORE;
183 LOCOUNT: 0..MAXCORE;
184 MAINFLG: BOOLEAN; (* MAIN PROGRAM ENCOUNTERED *)
185 COREBASE: ADDRESS;
186 PROGSTART: ADDRESS;
187 RTJUMP: ADDRESS; (* START OF RUNTIME JUMP TABLE *)
188 STKSTART: ADDRESS; (* START OF STACK *)
189 HEAPSTART: ADDRESS; (* START OF HEAP *)
190 JTSIZE: INTEGER; (* NUMBER OF JUMP TABLE ELEMENTS *)
191
192 FIRSTESD: ^ESD;
193
194 SP: REGISTER;
195 DALLOC,AALLOC: 0..8;
196 DTOP,DBOT: DNONE..D7;
197 ATOP,ABOT: ANONE..A7;
198 (*REGISTER ALLOCATION VARIABLES*)
199 (*VALUE OF -1 MEANS NONE CURRENTLY ASSIGNED*)
200
201 REGTYPE: ARRAYÆREGISTERÅ OF DATATYPE;
202 TYPESTK: ARRAYÆ-1..STKMAXÅ OF DATATYPE;
203 KINDSTK: ARRAYÆ-1..STKMAXÅ OF REGKIND;
204 STKPTR: -1..STKMAX;
205
206 DREGS: ARRAYÆ0..NDREGSÅ OF REGISTER;
207 AREGS: ARRAYÆ0..NAREGSÅ OF REGISTER;
208
209 EADDIR, EAADIR, EAPOP, EAPUSH, EAIMMED, EAINCR,
210 (*RM*) EALIMM, EAREL, EALAB, EAPSET, EALONG,
211 EABASED, EANONE, EADEFER: EFFADDR;
212
213 AALLOCCNT, DALLOCCNT, DPUSHCNT, APUSHCNT, DPOPCNT, APOPCNT: INTEGER;
214 TEMPESD: ^ESD;
215 TEMPLABREF: ^LABELREF;
216
217 (*RM*) HEXDATA: PACKED ARRAYÆ1..16Å OF CHAR;
218
219 FUNCTION SUCCIBM(CH:CHAR):CHAR; (* HANDLES EBCDIC ALPHABET *)
220 0 BEGIN
221 1 IF CH = 'I' THEN SUCCIBM := 'J'
222 2 ELSE IF CH ='R' THEN SUCCIBM := 'S'
223 3 ELSE SUCCIBM := SUCC(CH)
224 END (* SUCCIBM *) ;
225
226
227 FUNCTION HEXBIN(I: INTEGER): INTEGER; (* CONVERT HEX CHAR TO BINARY *)
228 0 BEGIN
229 1 IF I >= 65
230 2 THEN HEXBIN := I - 55
231 3 ELSE HEXBIN := I - 48
232 END; (* HEXBIN *)
233
234 PROCEDURE ERROR(MSG: ERRORMESSAGE);
235 BEGIN ERRORWR:=TRUE;WRITELN(LISTING,'**ERROR** ',MSG) END; (* ERROR *)
236
237 (*480*) FUNCTION NEXTPCOD (PCODE: IPTR) : IPTR;
238 (*480*) (* GIVEN A PCODE, FIND NEXT ACTIVE ONE; IF NONE, RETURN FAKE ONE *)
239 0 (*480*) BEGIN
240 1 (*480*) REPEAT
241 2 (*480*) PCODE := PCODE^.NEXT;
242 3 (*480*) IF PCODE = NIL THEN PCODE := FAKEI
243 4 (*480*) UNTIL PCODE^.INUSE;
244 5 (*480*) NEXTPCOD := PCODE
245 (*480*) END; (*NEXTPCOD *)
246
247 FUNCTION CONDITIONAL(INST:IPTR):INTEGER;
248 (* IF CONDITIONAL P-CODE, RETURN NUMBER, ELSE RETURN 0 *)
249 0 BEGIN
250 1 WITH INST^ DO
251 2 BEGIN
252 3 CONDITIONAL := 0;
253 4 IF OPCODE = XNEQ THEN CONDITIONAL := 1 ELSE
254 5 IF OPCODE = XEQU THEN CONDITIONAL := 2 ELSE
255 6 IF OPCODE = XLES THEN CONDITIONAL := 3 ELSE
256 7 IF OPCODE = XLEQ THEN CONDITIONAL := 4 ELSE
257 8 IF OPCODE = XGRT THEN CONDITIONAL := 5 ELSE
258 9 IF OPCODE = XGEQ THEN CONDITIONAL := 6
259 10 END (*WITH*)
260 END; (*CONDITIONAL*)
261
262 FUNCTION GETHEX:BOOLEAN;
263 VAR I: INTEGER;
264 0 BEGIN
265 1 GETHEX := FALSE;
266 2 WHILE (LINEBUFÆCHCNTÅ=' ') AND (CHCNT<LINELEN) DO CHCNT := CHCNT + 1;
267 3 IF LINEBUFÆCHCNTÅ <> ' '
268 4 THEN BEGIN
269 5 GETHEX := TRUE;
270 6 FOR I := 0 TO 3 DO
271 7 BEGIN
272 8 LTEMPÆIÅ := 16 * HEXBIN(ASCIIÆLINEBUFÆCHCNTÅÅ) +
273 9 HEXBIN(ASCIIÆLINEBUFÆCHCNT + 1ÅÅ);
274 10 CHCNT := CHCNT + 2
275 11 END
276 12 END;
277 13 IF LINEBUFÆCHCNTÅ <> ' ' THEN GETHEX := FALSE;
278 END ; (*GETHEX*)
279
280 PROCEDURE GETSTRING;
281 0 BEGIN
282 1 WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
283 2 CHCNT := CHCNT + 1;
284 3 IF LINEBUFÆCHCNTÅ <> '''' THEN
285 4 BEGIN ERROR('STRING EXPECTED ');
286 5 VSTRING := BLANKS END
287 6 ELSE BEGIN
288 7 ALENGTH := 0;
289 8 REPEAT
290 9 REPEAT
291 10 CHCNT := CHCNT + 1;
292 11 ALENGTH := ALENGTH + 1;
293 12 IF ALENGTH <= STRLENGTH THEN
294 13 VSTRINGÆALENGTHÅ := LINEBUFÆCHCNTÅ;
295 14 UNTIL (LINEBUFÆCHCNTÅ = '''') OR (CHCNT = LINELEN);
296 15 CHCNT := CHCNT + 1
297 16 UNTIL LINEBUFÆCHCNTÅ <> '''';
298 17 IF ALENGTH > STRLENGTH
299 18 THEN ALENGTH := STRLENGTH
300 19 ELSE ALENGTH := ALENGTH - 1;
301 20 END
302 END; (*GETSTRING*)
303
304 FUNCTION GETINTEGER :INTEGER;
305 VAR I: INTEGER;
306 CH: CHAR;
307 MINUS: BOOLEAN;
308 0 BEGIN
309 1 WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
310 2 CHCNT := CHCNT + 1;
311 3 I := 0;
312 4 MINUS := LINEBUFÆCHCNTÅ = '-';
313 5 IF MINUS THEN CHCNT := CHCNT + 1;
314 6 WHILE (LINEBUFÆCHCNTÅ <> ' ') AND (CHCNT < LINELEN) DO
315 7 BEGIN
316 8 CH := LINEBUFÆCHCNTÅ;
317 9 IF (CH >= '0') AND (CH <= '9')
318 10 THEN I := I*10 + ORD(CH)-ORD('0')
319 11 (*RM*) ELSE IF LINEBUFÆCHCNTÅ <> ',' THEN ERROR('MALFORMED INTEGER ');
320 12 CHCNT := CHCNT + 1
321 13 END;
322 14 IF MINUS THEN GETINTEGER := -1*I ELSE GETINTEGER := I
323 END; (*GETINTEGER*)
324
325
326 PROCEDURE BUILDADDR (VAR ADDR: EFFADDR; KMODE: EAMODE;
327 KREG, KXREG: REGISTER; KDISPL: INTEGER);
328 0 BEGIN WITH ADDR DO BEGIN
329 1 MODE := KMODE;
330 2 REG := KREG;
331 3 XREG := KXREG;
332 4 DISPL:= KDISPL
333 END END; (*BUILDADDR*)
334
335 (*----------------------------------------------------------------------
336 MULTIPLE PRECISION ARITHMETIC ROUTINES
337 -----------------------------------------------------------------------*)
338
339
340 PROCEDURE PLINT(VAR FIL:TEXT; X:LINT); (* WRITE LONG VALUE *)
341 VAR I: INTEGER;
342 0 BEGIN
343 1 FOR I := 0 TO LDIGIT DO
344 2 WRITE(FIL,HEXDATAÆ(XÆIÅ DIV 16) + 1Å:1,
345 3 HEXDATAÆ(XÆIÅ MOD 16) + 1Å:1);
346 END; (*PLINT*)
347
348 FUNCTION SDV(VAR X: LINT; S: INTEGER): INTEGER; (*DIVIDE LONG BY INTEGER *)
349 (* X := X / S (UNSIGNED) *)
350 VAR
351 I, CARRY: INTEGER;
352 Z: LINT;
353 0 BEGIN
354 1 FOR I := LDIGIT DOWNTO 0 DO ZÆIÅ := 0;
355 2 IF S > 0 THEN
356 3 BEGIN
357 4 CARRY := 0;
358 5 FOR I := 0 TO LDIGIT DO
359 6 BEGIN
360 7 CARRY := CARRY * MAXDIGIT + XÆIÅ;
361 8 WHILE CARRY >= S DO
362 9 BEGIN
363 10 ZÆIÅ := ZÆIÅ + 1;
364 11 CARRY := CARRY - S;
365 12 END;
366 13 END;
367 14 END;
368 15 FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
369 16 SDV := CARRY;
370 END; (*SDV*)
371
372 FUNCTION SHORT(VAR X:LINT):BOOLEAN; (* DETERMINE IF LINT IS SHORT*)
373 VAR
374 I: INTEGER;
375 0 BEGIN
376 1 SHORT := FALSE;
377 2 IF ((XÆ0Å=0) AND (XÆ1Å=0) AND (XÆ2Å<128))
378 3 OR ((XÆ0Å=255) AND (XÆ1Å=255) AND (XÆ2Å>127))
379 4 THEN SHORT := TRUE
380 END; (*SHORT*)
381
382
383 PROCEDURE CLR(VAR X: LINT); (* CLEAR LONG VALUE *)
384 (* X := 0 *)
385 VAR
386 I: INTEGER;
387 0 BEGIN
388 1 FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := 0;
389 END; (*CLR*)
390
391 PROCEDURE LSB(VAR X: LINT; Y: LINT); (* SUBTRACT LONG FROM LONG *)
392 VAR
393 I, B: INTEGER;
394 0 BEGIN
395 1 B := 0; (* SET BORROW TO 0 *)
396 2 FOR I := LDIGIT DOWNTO 0 DO
397 3 BEGIN
398 4 XÆIÅ := XÆIÅ - YÆIÅ - B;
399 5 B := 0; (* RESET CARRY *)
400 6 IF XÆIÅ < 0
401 7 THEN
402 8 BEGIN
403 9 XÆIÅ := XÆIÅ + 256;
404 10 B := 1
405 11 END (*THEN*)
406 12 END (*FOR*)
407 END; (*LSB*)
408
409
410 PROCEDURE SSB(VAR X: LINT; S: INTEGER); FORWARD;
411
412 PROCEDURE SAD(VAR X: LINT; S: INTEGER); (* ADD INTEGER TO LONG *)
413 (* X := X + S *)
414 VAR
415 I,CARRY: INTEGER;
416 Z: LINT;
417 0 BEGIN
418 1 IF S < 0
419 2 THEN SSB(X, -S)
420 3 ELSE
421 4 BEGIN
422 5 CARRY := S;
423 6 FOR I := LDIGIT DOWNTO 0 DO
424 7 BEGIN
425 8 ZÆIÅ := XÆIÅ + CARRY;
426 9 IF ZÆIÅ > TOPDIGIT
427 10 THEN
428 11 BEGIN
429 12 CARRY := ZÆIÅ DIV MAXDIGIT;
430 13 ZÆIÅ := ZÆIÅ MOD MAXDIGIT;
431 14 END
432 15 ELSE CARRY := 0;
433 16 END;
434 17 FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
435 18 END
436 END; (*SAD*)
437
438 PROCEDURE SSB(* (VAR X: LINT; S: INTEGER) *); (* SUBTRACT INTEGER FROM LONG *)
439 (* X := X - S *)
440 VAR
441 I,BORROW: INTEGER;
442 Z: LINT;
443 0 BEGIN
444 1 (*0321D*) IF (S<0) AND (-S > 0) (* CHECKS FOR -32768 *)
445 2 THEN SAD(X, -S)
446 3 ELSE
447 4 BEGIN
448 5 BORROW := S;
449 6 FOR I := LDIGIT DOWNTO 0 DO
450 7 BEGIN
451 8 ZÆIÅ := XÆIÅ - BORROW;
452 9 IF ZÆIÅ < 0
453 10 THEN
454 11 BEGIN
455 12 BORROW := - (ZÆIÅ DIV MAXDIGIT);
456 13 ZÆIÅ := ZÆIÅ MOD MAXDIGIT;
457 14 IF ZÆIÅ < 0
458 15 THEN
459 16 BEGIN
460 17 BORROW := BORROW + 1;
461 18 ZÆIÅ := ZÆIÅ + MAXDIGIT;
462 19 END; (*BEGIN*)
463 20 END (*THEN*)
464 21 ELSE BORROW := 0;
465 22 END; (*FOR*)
466 23 FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
467 24 END (*ELSE*)
468 END; (*SSB*)
469
470 PROCEDURE LASGN(VAR X: INTEGER; Y: LINT); (* MOVE LONG TO SHORT*)
471 VAR
472 I, J: INTEGER;
473 0 BEGIN
474 1 J := YÆLDIGIT -1Å;
475 2 IF J > 127 THEN J := J - 256;
476 3 X := 256 * J + YÆLDIGITÅ
477 END; (* LASGN *)
478
479 PROCEDURE ASGN(VAR X: LINT; Y: LINT); (* MOVE LONG TO LONG *)
480 (* X := Y *)
481 0 BEGIN
482 1 X := Y;
483 END; (*ASGN*)
484
485 PROCEDURE SASGN(VAR X: LINT; Y: INTEGER); (* MOVE INTEGER TO LONG *)
486 (* X := LINT Y *)
487 VAR
488 I: INTEGER;
489 0 BEGIN
490 1 CLR(X);
491 2 IF Y > 0
492 3 THEN SAD(X,Y)
493 4 ELSE IF Y < 0
494 5 THEN SSB(X,-Y);
495 END; (*ASGN*)
496
497 PROCEDURE SHL(VAR X: LINT; S: INTEGER); (* SHIFT LONG LEFT INTEGER TIMES*)
498 (* X := X SHIFTED LEFT BY S BITS *)
499 VAR
500 I,J,CARRY: INTEGER;
501 Z: LINT;
502 0 BEGIN
503 1 FOR I := LDIGIT DOWNTO 0 DO ZÆIÅ := XÆIÅ;
504 2 FOR J := 1 TO S DIV BITSPERDIGIT DO
505 3 BEGIN
506 4 FOR I := 0 TO LDIGIT - 1 DO ZÆIÅ := ZÆI + 1Å;
507 5 ZÆLDIGITÅ := 0;
508 6 END;
509 7 FOR J := 1 TO S MOD BITSPERDIGIT DO
510 8 BEGIN
511 9 CARRY := 0;
512 10 FOR I := LDIGIT DOWNTO 0 DO
513 11 BEGIN
514 12 ZÆIÅ := 2 * ZÆIÅ + CARRY;
515 13 IF ZÆIÅ > TOPDIGIT
516 14 THEN
517 15 BEGIN
518 16 ZÆIÅ := ZÆIÅ - MAXDIGIT;
519 17 CARRY := 1;
520 18 END (*THEN*)
521 19 ELSE CARRY := 0;
522 20 END (*FOR*)
523 21 END; (*FOR*)
524 22 FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
525 END; (*SHL*)
526
527
528
529
530
531 (*-------------------------------------------------------------------------
532 CODE GENERATION SECTION
533 -------------------------------------------------------------------------*)
534
535 (*604*) PROCEDURE PCPRINT;
536 0 (*604*) BEGIN
537 1 (*604*) IF ODD(DEBUG)
538 2 (*604*) THEN
539 3 (*604*) BEGIN
540 4 (*604*) PLINT(LISTING,PC);
541 5 (*604*) WRITE(LISTING,' ':21)
542 6 (*604*) END
543 (*604*) END; (* PCPRINT*)
544
545 PROCEDURE EMITCODE;
546 VAR
547 II, I, J, HI, MD, LO, CHKSUM: INTEGER;
548 SAVE: LINT;
549
550 PROCEDURE EMITBYTE(DATA: INTEGER); (*EXPAND BYTE INTO TWO HEX DIGITS*)
551 VAR
552 HI, LO: INTEGER;
553 CH: CHAR;
554 0 BEGIN (*EMITBYTE*)
555 1 CHKSUM := CHKSUM + DATA;
556 2 HI := DATA DIV 16;
557 3 LO := DATA MOD 16;
558 4 IF HI < 10
559 5 THEN CH := CHR(ORD('0') + HI)
560 6 ELSE CH := CHR(ORD('A') + HI - 10);
561 7 WRITE(OBJECT,CH);
562 8 IF LO < 10
563 9 THEN CH := CHR(ORD('0') + LO)
564 10 ELSE CH := CHR(ORD('A') + LO - 10);
565 11 WRITE(OBJECT,CH);
566 END; (*EMITBYTE*)
567
568 0 BEGIN (*EMITCODE*)
569 1 IF (CORECOUNT>0)
570 2 THEN
571 3 BEGIN
572 4 I := LOCOUNT;
573 5 WHILE I <= CORECOUNT DO
574 6 BEGIN
575 7 CHKSUM := 0;
576 8 IF CORECOUNT - I >= 31
577 9 THEN J := I + 31
578 10 ELSE J := CORECOUNT;
579 11 ASGN(SAVE,GENLOC);
580 12 (* LO := GENLOCÆLDIGITÅ; *)
581 13 (* MD := GENLOCÆLDIGIT-1Å; *)
582 14 (* HI := GENLOCÆLDIGIT-2Å; *)
583 15 LO := SDV(GENLOC,256);
584 16 MD := SDV(GENLOC,256);
585 17 HI := SDV(GENLOC,256);
586 18 ASGN(GENLOC,SAVE);
587 19 IF HI = 0
588 20 THEN BEGIN
589 21 WRITE(OBJECT,'S1');
590 22 EMITBYTE(J-I+4)
591 23 END
592 24 ELSE BEGIN
593 25 WRITE(OBJECT,'S2');
594 26 EMITBYTE(J-I+5)
595 27 END;
596 28 IF HI <> 0
597 29 THEN EMITBYTE(HI);
598 30 EMITBYTE(MD);
599 31 EMITBYTE(LO); (* EMIT ADDRESS FIELD *)
600 32 FOR II := I TO J DO
601 33 BEGIN
602 34 IF (COREÆIIÅ < 0) OR (COREÆIIÅ > 256)
603 35 THEN
604 36 BEGIN
605 37 ERROR('BAD EMIT DATA ');
606 38 WRITELN(LISTING,'VALUE ',COREÆIIÅ,' AT ',II,
607 39 ' PC=') ;
608 40 PLINT(LISTING,PC)
609 41 END; (*THEN*)
610 42 EMITBYTE(COREÆIIÅ);
611 43 END; (*FOR*)
612 44 EMITBYTE(255-(CHKSUM MOD 256));
613 45 WRITELN(OBJECT,' ');
614 46 SAD(GENLOC,J-I+1);
615 47 I := J + 1;
616 48 END; (*WHILE*)
617 49 CORECOUNT := 0;
618 50 IF LOCOUNT = 1 THEN COREBASE := PC;
619 51 END; (*THEN*)
620 END; (*EMITCODE*)
621
622 PROCEDURE EMITEND;
623 0 BEGIN
624 1 WRITELN(OBJECT,'S9030000FC');
625 END; (*EMITEND*)
626
627 PROCEDURE FLUSH; (*CURRENTLY CALLED AT END OF EACH BASIC BLOCK*)
628 (*I.E. ONLY LOCAL OPTIMIZATION IS BEING DONE*)
629
630 PROCEDURE GENERATE(INSTR: IPTR);
631
632 VAR SOURCE, DEST: EFFADDR;
633 TEMPESD: ^ESD;
634 K: INTEGER;
635 OPCDE: TARGETOP;
636
637 PROCEDURE RESETLABEL;
638 VAR I: INTEGER;
639 0 BEGIN
640 1 FOR I:= 0 TO HIGHLABEL DO
641 2 BEGIN LABELTABLEÆIÅ.DEFINED :=FALSE;
642 3 LABELTABLEÆIÅ.REFCHAIN := NIL;
643 4 LABELTABLEÆIÅ.REFED :=FALSE
644 5 END;
645 6 IF TOPLABEL < HIGHLABEL THEN TOPLABEL := HIGHLABEL;
646 7 (*#*) LABELOFFSET := LABELOFFSET + HIGHLABEL; HIGHLABEL := 0;
647 END;
648
649
650
651 PROCEDURE GENX(OP: TARGETOP; SIZE: INTEGER; EA1,EA2: EFFADDR); FORWARD;
652 (*RM*) PROCEDURE VSTRINGIMMED(STARTCH,COUNT: INTEGER);
653 (*RM*) VAR K: INTEGER;
654 0 (*RM*) BEGIN
655 1 WITH INSTR^ DO BEGIN
656 2 WRITE(LISTING,'''':1);
657 3 K := STARTCH;
658 4 (*RM*) WHILE K < STARTCH + COUNT DO BEGIN
659 5 EAIMMED.DISPL := ASCIIÆOPSTRING^.VSTRINGAÆKÅÅ;
660 6 GENX(TDC,1,EAIMMED,EANONE);
661 7 (*RM*) IF OPSTRING^.VSTRINGAÆKÅ = '''' THEN WRITE(LISTING,'''''':2)
662 8 (*RM*) ELSE WRITE(LISTING,OPSTRING^.VSTRINGAÆKÅ:1);
663 9 (*RM*) K := K + 1
664 10 (*RM*) END;
665 11 (*RM*) WRITE(LISTING,'''':1)
666 12 (*RM*) END (* WITH *)
667 (*RM*) END; (* VSTRINGIMMED *)
668
669 (*RM*) PROCEDURE HEXVSTRING(K:INTEGER);
670 (*RM*) VAR I:INTEGER;
671 CH:CHAR;
672 0 (*RM*) BEGIN
673 1 (*RM*) WITH INSTR^ DO BEGIN
674 2 (*RM*) FOR I := 1 TO 8 DO
675 3 BEGIN
676 4 CH:=OPSET^.SETVÆ K + 1 Å;
677 5 (*RM*) WRITE(LISTING, CH :1) ;
678 6 IF NOT ODD(I)
679 7 THEN BEGIN
680 8 EAIMMED.DISPL := 16 *
681 9 HEXBIN(ASCIIÆOPSET^.SETVÆK + I - 1ÅÅ) +
682 10 HEXBIN(ASCIIÆOPSET^.SETVÆK + IÅÅ);
683 11 GENX(TDC,1,EAIMMED,EANONE);
684 12 END; (*IF*)
685 13 (*RM*) END (*FOR*)
686 14 END; (*WITH*)
687 (*RM*) END; (* HEXVSTRING *)
688
689 PROCEDURE GENX (* (OP:TARGETOP; SIZE: INTEGER; EA1,EA2: EFFADDR) *) ;
690 VAR I, SUBOP, OPC, OPI: INTEGER;
691
692 PROCEDURE PRINTINSTRUCTION;
693 VAR BYTES: INTEGER;
694 PROCEDURE PRINTEA(EA: EFFADDR);
695 VAR AR: INTEGER;
696 0 BEGIN WITH EA DO
697 1 BEGIN
698 2 AR := ORD(REG)-ORD(A0);
699 3 CASE MODE OF
700 4 NONE: ;
701 5 DDIRECT: WRITE(LISTING, 'D',ORD(REG)-ORD(D0):1);
702 6 ADIRECT: WRITE(LISTING, 'A', AR:1);
703 7 DEFER: WRITE(LISTING, '(A', AR:1, ')');
704 8 INCR: WRITE(LISTING, '(A', AR:1,')+');
705 9 DECR: WRITE(LISTING, '-(A', AR:1,')');
706 10 BASED: WRITE(LISTING, DISPL:1, '(A', AR:1,
707 11 ')');
708 12 INDEX: WRITE(LISTING, DISPL:1,
709 13 '(A', AR:1, ',', 'D', ORD(XREG)-ORD(D0):1,')');
710 14 ABSOLUTE: WRITE(LISTING,DISPL:1);
711 15 IMMED: WRITE(LISTING,'#',DISPL:1);
712 16 RELATIVE: BEGIN
713 17 WRITE(LISTING,'*');
714 18 IF DISPL> 0 THEN
715 19 WRITE(LISTING,'+',DISPL:1)
716 20 ELSE IF DISPL< 0 THEN WRITE(LISTING,DISPL:1)
717 21 END;
718 22 LABELLED: IF CURROPCODE = XCUP
719 23 THEN WRITE(LISTING,'USER':4,DISPL:1)
720 24 ELSE WRITE(LISTING,
721 25 'L',DISPL + LABELOFFSET:1);
722 26 LABIMMED: BEGIN
723 27 IF DISPL <0 THEN WRITE(LISTING,'#-L',-DISPL:1)
724 28 ELSE WRITE(LISTING,'#L',DISPL + LABELOFFSET:1)
725 29 END;
726 30 (*RM*) PIMMED: BEGIN
727 31 (*RM*) WRITE(LISTING,'#$':2);
728 32 (*RM*) HEXVSTRING(DISPL)
729 33 (*RM*) END;
730 34 (*RM*) STSHORT: BEGIN
731 35 (*RM*) WRITE(LISTING,'#':1);
732 36 (*RM*) VSTRINGIMMED(DISPL,2)
733 37 (*RM*) END;
734 38 (*RM*) STLONG : BEGIN
735 39 (*RM*) WRITE(LISTING,'#':1);
736 40 (*RM*) VSTRINGIMMED(DISPL,4)
737 41 (*RM*) END;
738 42 LIMMED: BEGIN
739 43 WITH INSTR^ DO BEGIN
740 44 WRITE(LISTING,'#$');
741 45 WRITE(LISTING,HEXDATAÆOPAND1 DIV 16 + 1Å);
742 46 WRITE(LISTING,HEXDATAÆOPAND1 MOD 16 + 1Å);
743 47 WRITE(LISTING,HEXDATAÆOPAND2 DIV 16 + 1Å);
744 48 WRITE(LISTING,HEXDATAÆOPAND2 MOD 16 + 1Å);
745 49 WRITE(LISTING,HEXDATAÆOPAND3 DIV 16 + 1Å);
746 50 WRITE(LISTING,HEXDATAÆOPAND3 MOD 16 + 1Å);
747 51 WRITE(LISTING,HEXDATAÆOPAND4 DIV 16 + 1Å);
748 52 WRITE(LISTING,HEXDATAÆOPAND4 MOD 16 + 1Å);
749 53 END
750 54 END;
751 55 (*RM*) XEXTERNAL: BEGIN WRITE(LISTING,'X',MNÆINSTR^.OPCODEÅ:3);
752 56 IF INSTR^.D1TYPE <> NOTATYP THEN
753 57 WRITE(LISTING,DNAMEÆINSTR^.D1TYPEÅ:1);
754 58 IF INSTR^.DTYPE <> NOTATYP THEN
755 59 WRITE(LISTING,DNAMEÆINSTR^.DTYPEÅ:1);
756 60 END; (* XEXTERNAL *)
757 61 PCINDEX: BEGIN WRITE(LISTING,'***PCINDEX***') END;
758 62 END END;
759 END; (*PRINTEA*)
760
761 0 BEGIN (*PRINTINSTRUCTION*)
762 1 WRITE(LISTING, ' ':10);
763 2 FOR BYTES:=1 TO 5 DO IF TMNÆOP,BYTESÅ<>' ' THEN WRITE
764 3 (LISTING, TMNÆOP,BYTESÅ);
765 4 IF SIZE = 1 THEN WRITE(LISTING,'.B ')
766 5 ELSE IF SIZE >= 4 THEN WRITE(LISTING,'.L ')
767 6 ELSE WRITE(LISTING,' ');
768 7 PRINTEA(EA1);
769 8 IF EA2.MODE <> NONE THEN BEGIN
770 9 WRITE(LISTING,',');
771 10 PRINTEA(EA2);
772 11 END;
773 12 IF FLPC THEN
774 13 BEGIN
775 14 WRITE(LISTING,' ':2,'***** FLUSH ',
776 15 MNÆINSTR^.OPCODEÅ);
777 16 FLPC := FALSE
778 17 END;
779 18 IF EA1.REG = A3
780 19 THEN WRITE(LISTING,' ',MNÆINSTR^.OPCODEÅ:3,
781 20 DNAMEÆINSTR^.D1TYPEÅ:1,
782 21 DNAMEÆINSTR^.DTYPEÅ:1);
783 22 WRITELN(LISTING,' ');
784 END; (*PRINTINSTRUCTION*)
785
786
787 PROCEDURE BUFFER(VALU: LINT; SIZE: INTEGER); (* PUT LONG VALUE IN CORE*)
788 VAR
789 I,B: INTEGER;
790 V: LINT;
791 PROCEDURE HEXWRITE(DATA: INTEGER); (*WRITE CONTENTS OF CORE CELL*)
792 VAR HI, LO: INTEGER;
793 CH: CHAR;
794 0 BEGIN
795 1 IF (DATA < 0) OR (DATA > 256)
796 2 THEN ERROR('BAD DATA IN HEXWRITE');
797 3 HI := DATA DIV 16;
798 4 LO := DATA MOD 16;
799 5 IF HI < 10
800 6 THEN CH := CHR(ORD('0') + HI)
801 7 ELSE CH := CHR(ORD('A') + HI - 10);
802 8 IF ODD(DEBUG) AND (OP <> TDC) THEN
803 9 BEGIN
804 10 MACHCODEÆMACHINDEXÅ := CH;
805 11 MACHINDEX := MACHINDEX + 1
806 12 END;
807 13 IF LO < 10
808 14 THEN CH := CHR(ORD('0') + LO)
809 15 ELSE CH := CHR(ORD('A') + LO - 10);
810 16 IF ODD(DEBUG) AND (OP <> TDC) THEN
811 17 BEGIN
812 18 MACHCODEÆMACHINDEXÅ := CH;
813 19 MACHINDEX := MACHINDEX + 1
814 20 END;
815 END; (*HEXWRITE*)
816 0 BEGIN (* BUFFER *)
817 1 IF SIZE + CORECOUNT > MAXCORE - 22
818 2 THEN EMITCODE;
819 3 FOR I := 1 TO SIZE DO
820 4 COREÆCORECOUNT + IÅ := VALUÆLDIGIT - SIZE + IÅ;
821 5 FOR I := 1 TO SIZE DO HEXWRITE(COREÆCORECOUNT + IÅ );
822 6 CORECOUNT := CORECOUNT + SIZE;
823 7 SAD(PC, SIZE);
824 8 IF ODD(DEBUG) AND (OP <> TDC) THEN MACHINDEX := MACHINDEX + 1;
825 END; (*BUFFER *)
826
827 PROCEDURE GEN8(A: INTEGER);
828 VAR
829 L: LINT;
830 0 BEGIN
831 1 SASGN(L, A);
832 2 BUFFER(L, 1);
833 END; (* GEN8*)
834
835 PROCEDURE GEN16(A: INTEGER);
836 VAR
837 L: LINT;
838 0 BEGIN
839 1 SASGN(L, A);
840 2 BUFFER(L, 2);
841 END; (*GEN16*)
842
843 PROCEDURE GEN448(A,B,C: INTEGER);
844 VAR
845 L: LINT;
846 0 BEGIN
847 1 IF C < 0 THEN C := C + 256; (* ADJUST TO ONE BYTE *)
848 2 SASGN(L, A);
849 3 SHL(L, 4); SAD(L, B);
850 4 SHL(L, 8); SAD(L, C);
851 5 BUFFER(L, 2)
852 END; (*GEN448*)
853
854 PROCEDURE GEN43333(A,B,C,D,E: INTEGER);
855 VAR
856 L: LINT;
857 0 BEGIN
858 1 SASGN(L, A);
859 2 SHL(L, 3); SAD(L, B);
860 3 SHL(L, 3); SAD(L, C);
861 4 SHL(L, 3); SAD(L, D);
862 5 SHL(L, 3); SAD(L, E);
863 6 BUFFER(L, 2);
864 END; (*GEN43333*)
865
866 PROCEDURE GEN4318(A,B,C,D: INTEGER);
867 VAR
868 L: LINT;
869 0 BEGIN
870 1 IF D < 0 THEN D := D + 256; (* ADJUST LENGTH OF OPERAND *)
871 2 SASGN(L, A);
872 3 SHL(L, 3); SAD(L, B);
873 4 SHL(L, 1); SAD(L, C);
874 5 SHL(L, 8); SAD(L, D);
875 6 BUFFER(L, 2);
876 END; (*GEN4318*)
877
878 PROCEDURE GENNULL; (* WRITE SOME SPACES*)
879 0 BEGIN
880 END; (*GENNULL*)
881
882 PROCEDURE GENEAEXT(E: EFFADDR);
883 VAR
884 R: INTEGER;
885 K: LINT;
886 0 BEGIN
887 1 IF E.MODE >= BASED
888 2 THEN IF (E.MODE=INDEX) OR (E.MODE=PCINDEX)
889 3 THEN
890 4 BEGIN
891 5 IF E.DISPL < 0 THEN E.DISPL := E.DISPL + 256;
892 6 IF E.XREG < ANONE
893 7 THEN R := ORD(E.XREG) - ORD(D0)
894 8 ELSE R := ORD(E.XREG) - ORD(A0) + 8;
895 9 SASGN(K, R);
896 10 SHL(K, 1);
897 11 IF NOT(REGTYPEÆE.XREGÅ IN ÆITYP,BTYP,CTYP,HTYPÅ)
898 12 THEN SAD(K, 1);
899 13 SHL(K, 11); SAD(K, E.DISPL);
900 14 BUFFER(K, 2);
901 15 END
902 16 ELSE
903 17 BEGIN
904 18 IF E.MODE = RELATIVE THEN E.DISPL := E.DISPL - 2;
905 19 SASGN(K, E.DISPL);
906 20 IF (E.MODE = IMMED) AND (SIZE = 4) THEN BUFFER(K,4) ELSE
907 21 IF NOT ( E.MODE IN ÆPIMMED, STSHORT, STLONG,LIMMEDÅ ) THEN
908 22 BUFFER(K, 2) (* 4 INSTEAD OF 2 FOR ABS/IMMED LONG*)
909 23 ELSE IF E.MODE = LIMMED
910 24 THEN BEGIN
911 25 WITH INSTR^ DO BEGIN
912 26 KÆ0Å := OPAND1;
913 27 KÆ1Å := OPAND2;
914 28 KÆ2Å := OPAND3;
915 29 KÆ3Å := OPAND4;
916 30 BUFFER(K,4)
917 31 END
918 32 END
919 33 END
920 34 ELSE IF OP <> TMOVE
921 35 THEN GENNULL
922 END; (*GENEAEXT*)
923
924 FUNCTION REG(EA: EFFADDR): INTEGER;
925 (* GENERATE CODED VALUE OF REG FIELD FOR GIVEN EFFECTIVE ADDRESS *)
926 0 BEGIN
927 1 IF EA.MODE < STSHORT
928 2 THEN IF (EA.REG = DNONE) OR (EA.REG = ANONE)
929 3 THEN ERROR('A/DNONE IN SUBR REG ')
930 4 ELSE IF EA.REG < ANONE
931 5 THEN REG := ORD(EA.REG) - ORD(D0)
932 6 ELSE REG := ORD(EA.REG) - ORD(A0)
933 7 ELSE CASE EA.MODE OF
934 8 ABSOLUTE: REG := 0;
935 9 RELATIVE: REG := 2;
936 10 PCINDEX: REG := 3;
937 11 IMMED: REG := 4;
938 12 LIMMED: REG := 4;
939 13 LABELLED: REG := 2; (*?*)
940 14 LABIMMED: REG := 4; (*?*)
941 15 PIMMED: REG := 4;
942 16 STSHORT: REG := 4;
943 17 STLONG: REG := 4;
944 18 XEXTERNAL: REG := 2;
945 19 END (*CASE*)
946 END; (*REG*)
947
948 FUNCTION MODE(EA: EFFADDR): INTEGER;
949 (* GENERATE CODED VALUE OF MODE FIELD FOR GIVEN EFFECTIVE ADDRESS*)
950 0 BEGIN
951 1 CASE EA.MODE OF
952 2 DDIRECT: MODE := 0;
953 3 ADIRECT: MODE := 1;
954 4 DEFER: MODE := 2;
955 5 INCR: MODE := 3;
956 6 DECR: MODE := 4;
957 7 BASED: MODE := 5;
958 8 INDEX: MODE := 6;
959 9 PCINDEX: MODE := 7;
960 10 ABSOLUTE:MODE := 7;
961 11 IMMED: MODE := 7;
962 12 LIMMED: MODE := 7;
963 13 RELATIVE:MODE := 7;
964 14 LABELLED:MODE := 7; (*?*)
965 15 LABIMMED:MODE := 7; (*?*)
966 16 NONE: MODE := 7;
967 17 PIMMED: MODE := 7;
968 18 STSHORT: MODE := 7;
969 19 STLONG: MODE := 7;
970 20 XEXTERNAL:MODE := 7;
971 21 END (* CASE*)
972 END; (*MODE*)
973
974 0 BEGIN (*GENX*)
975 1 IF EA1.MODE = LIMMED
976 2 THEN WITH INSTR^ DO
977 3 IF OPAND1 + OPAND2 + OPAND3 + OPAND4 = 0
978 4 THEN BEGIN
979 5 IF (OP=TMOVE) OR (OP=TCMP)
980 6 THEN BEGIN
981 7 EA1.MODE := IMMED;
982 8 EA1.DISPL := 0
983 9 END
984 10 END
985 11 ELSE IF OPAND1 + OPAND2 + OPAND3 = 0
986 12 THEN BEGIN
987 13 IF (OP=TADD) OR (OP=TSUB)
988 14 AND (OPAND4 > 0) AND (OPAND4 <= 8)
989 15 THEN BEGIN
990 16 EA1.MODE := IMMED;
991 17 EA1.DISPL := OPAND4
992 18 END
993 19 ELSE
994 20 IF (OP=TMOVE)
995 21 AND (OPAND4 > 0) AND (OPAND4 < 128)
996 22 THEN BEGIN
997 23 EA1.MODE := IMMED;
998 24 EA1.DISPL := OPAND4
999 25 END
1000 26 END
1001 27 ELSE
1002 28 IF (OPAND1 + OPAND2 + OPAND3 = 765)
1003 29 AND (OP=TMOVE)
1004 30 AND (OPAND4 > 127) AND (OPAND4 < 256)
1005 31 THEN BEGIN
1006 32 EA1.MODE := IMMED;
1007 33 EA1.DISPL := OPAND4 -256
1008 34 END;
1009 35 (* CHECK FOR MOVEQ, ADDQ, SUBQ *)
1010 36 IF OP = TMOVE
1011 37 THEN
1012 38 BEGIN
1013 39 IF ((EA1.MODE=IMMED) AND (EA1.DISPL=0) AND (EA2.MODE<>ADIRECT))
1014 40 THEN
1015 41 BEGIN
1016 42 EA1 := EA2;
1017 43 EA2 := EANONE;
1018 44 OP := TCLR;
1019 45 END
1020 46 ELSE
1021 47 (*0423A*) IF (EA2.MODE = DDIRECT) AND (EA1.DISPL > -128)
1022 48 AND (EA1.DISPL < 128)
1023 49 AND (EA1.MODE = IMMED)
1024 50 THEN
1025 51 BEGIN
1026 52 OP := TMOVEQ;
1027 53 SIZE := 4
1028 54 END; (*THEN*)
1029 55 END; (* THEN*)
1030 56 IF (OP = TADD) OR (OP = TSUB)
1031 57 THEN
1032 58 BEGIN
1033 59 IF (EA1.MODE=IMMED) AND (EA1.DISPL > 0) AND (EA1.DISPL<=8)
1034 60 THEN
1035 61 BEGIN
1036 62 IF OP = TADD
1037 63 THEN OP := TADDQ
1038 64 ELSE OP := TSUBQ
1039 65 END (*THEN*)
1040 66 END; (*THEN*)
1041 67 (* CHECK FOR CMP THAT CAN BE TST *)
1042 68 IF OP = TCMP
1043 69 THEN
1044 70 BEGIN
1045 71 IF ((EA1.MODE=IMMED) AND (EA1.DISPL = 0) AND (EA2.MODE<>ADIRECT))
1046 72 THEN
1047 73 BEGIN
1048 74 EA1 := EA2;
1049 75 EA2 := EANONE;
1050 76 OP := TTST
1051 77 END
1052 78 END;
1053 79 IF ODD(DEBUG) AND (OP <> TDC) AND (OP<>TEQU) THEN BEGIN PLINT(LISTING,PC);
1054 80 WRITE(LISTING,' ')
1055 81 END ;
1056 82 CASE OP OF
1057 83 TMOVE: BEGIN
1058 84 CASE SIZE OF 1: I:=1;
1059 85 2: I:=3;
1060 86 (*RM*) 4: I:=2
1061 87 END; (*CASE*)
1062 88 GEN43333(I, REG(EA2), MODE(EA2), MODE(EA1), REG(EA1));
1063 89 GENEAEXT(EA1); GENEAEXT(EA2);
1064 90 IF (EA1.MODE < BASED) AND (EA2.MODE < BASED)
1065 91 THEN GENNULL
1066 92 END; (*TMOVE*)
1067 93
1068 94 TLINK: BEGIN
1069 95 GEN43333(4,7,1,2,ORD(EA1.REG)-ORD(A0));
1070 96 GENEAEXT(EA2)
1071 97 END; (*TLINK*)
1072 98 TUNLK: BEGIN
1073 99 GEN43333(4,7,1,3,ORD(EA1.REG)-ORD(A0));
1074 100 GENNULL
1075 101 END;
1076 102
1077 103 TRTS : BEGIN
1078 104 GEN43333(4,7,1,6,5);
1079 105 GENNULL
1080 106 END;
1081 107
1082 108 TTST, TCLR, TNEG, TCOMP:
1083 109 BEGIN
1084 110 IF SIZE = 1
1085 111 THEN I := 0
1086 112 ELSE IF SIZE = 4
1087 113 THEN I := 2
1088 114 ELSE I := 1;
1089 115 CASE OP OF TTST: SUBOP := 5;
1090 116 TCLR: SUBOP := 1;
1091 117 TNEG: SUBOP := 2;
1092 118 TCOMP: SUBOP := 3
1093 119 END (*CASE*);
1094 120 GEN43333(4,SUBOP,I,MODE(EA1),REG(EA1));
1095 121 GENEAEXT(EA1);
1096 122 END; (*TTST*)
1097 123
1098 124 TBTST, TBSET:
1099 125 BEGIN
1100 126 IF OP = TBTST
1101 127 THEN SUBOP := 0 (*BTST*)
1102 128 ELSE SUBOP := 3; (*BSET*)
1103 129 IF EA1.MODE = IMMED
1104 130 THEN
1105 131 BEGIN
1106 132 GEN43333(0,4,SUBOP,MODE(EA2),REG(EA2));
1107 133 GENEAEXT(EA2);
1108 134 GENEAEXT(EA1) (* BIT NUMBER *)
1109 135 END
1110 136 ELSE
1111 137 BEGIN
1112 138 GEN43333(0,REG(EA1),4+SUBOP,MODE(EA2),REG(EA2));
1113 139 GENEAEXT(EA2);
1114 140 END
1115 141 END; (*TBTST*)
1116 142
1117 143 TOR, TEOR, TSUB, TAND, TADD, TCMP:
1118 144 BEGIN
1119 145 IF SIZE = 1
1120 146 THEN I := 0
1121 147 ELSE IF SIZE = 4
1122 148 THEN I := 2
1123 149 ELSE I := 1;
1124 150 CASE OP OF
1125 151 TOR: BEGIN OPC := 8; OPI := 0 END;
1126 152 TEOR:BEGIN OPC := 11; OPI := 5 END;
1127 153 TSUB: BEGIN OPC := 9; OPI := 2 END;
1128 154 TCMP: BEGIN OPC := 11; OPI := 6 END;
1129 155 TAND: BEGIN OPC := 12; OPI := 1 END;
1130 156 TADD: BEGIN OPC := 13; OPI := 3 END
1131 157 END; (*CASE*)
1132 158 IF (EA1.MODE IN ÆIMMED,LABELLED,LABIMMED,LIMMED,
1133 159 PIMMED,STSHORT,STLONGÅ) AND (EA2.MODE <> ADIRECT)
1134 160 THEN
1135 161 BEGIN
1136 162 GEN43333(0,OPI,I,MODE(EA2),REG(EA2));
1137 163 GENEAEXT(EA1);
1138 164 IF EA2.MODE >= BASED
1139 165 THEN GENEAEXT(EA2);
1140 166 END (*THEN*)
1141 167 ELSE
1142 168 IF EA2.MODE = ADIRECT
1143 169 THEN
1144 170 BEGIN
1145 171 IF I = 2
1146 172 THEN SUBOP := 7
1147 173 ELSE SUBOP := 3;
1148 174 GEN43333(OPC,REG(EA2),SUBOP,MODE(EA1),REG(EA1));
1149 175 GENEAEXT(EA1)
1150 176 END (*THEN*)
1151 177 ELSE
1152 178 IF (EA2.MODE=DDIRECT) AND (OP<>TEOR)
1153 179 THEN
1154 180 BEGIN
1155 181 GEN43333(OPC,REG(EA2),I,
1156 182 MODE(EA1),REG(EA1));
1157 183 GENEAEXT(EA1)
1158 184 END (*THEN*)
1159 185 ELSE
1160 186 IF EA1.MODE = DDIRECT
1161 187 THEN
1162 188 BEGIN
1163 189 IF OP = TCMP
1164 190 THEN
1165 191 ERROR('TO MEMORY COMPARE ');
1166 192 GEN43333(OPC,REG(EA1),4+I,
1167 193 MODE(EA2),REG(EA2));
1168 194 GENEAEXT(EA2)
1169 195 END (*THEN*)
1170 196 ELSE ERROR('MEMORY/MEMORY +-ETC ')
1171 197 END; (*TOR*)
1172 198
1173 199 TMULS, TDIVS:
1174 200 BEGIN
1175 201 CASE OP OF
1176 202 TMULS: OPC := 12;
1177 203 TDIVS: OPC := 8
1178 204 END; (*CASE*)
1179 205 GEN43333(OPC,REG(EA2),7,MODE(EA1),REG(EA1));
1180 206 GENEAEXT(EA1)
1181 207 END; (*TMULS*)
1182 208
1183 209 TTRAP: BEGIN
1184 210 GEN448(4,14,64 + EA1.DISPL);
1185 211 GENNULL
1186 212 END; (*TTRAP*)
1187 213
1188 214 TSEQ, TSNE, TSLT, TSNZ, TSLE, TSGT, TSGE:
1189 215 BEGIN
1190 216 CASE OP OF
1191 217 TSEQ: SUBOP := 7;
1192 218 TSNE: SUBOP := 6;
1193 219 TSNZ: SUBOP := 6;
1194 220 TSLT: SUBOP := 13;
1195 221 TSLE: SUBOP := 15;
1196 222 TSGT: SUBOP := 14;
1197 223 TSGE: SUBOP := 12;
1198 224 END; (*CASE*)
1199 225 GEN43333(5,SUBOP DIV 2,4*(SUBOP MOD 2) + 3,MODE(EA1),REG(EA1));
1200 226 GENEAEXT(EA1)
1201 227 END; (*TSEQ*)
1202 228
1203 229 TJMP, TJSR: BEGIN
1204 230 CASE OP OF
1205 231 TJMP: SUBOP := 3;
1206 232 TJSR: SUBOP := 2
1207 233 END; (*CASE*)
1208 234 GEN43333(4,7,SUBOP,MODE(EA1),REG(EA1));
1209 235 GENEAEXT(EA1)
1210 236 END; (*TJMP*)
1211 237
1212 238 TBRA, TBNE, TBNZ, TBGT, TBGE, TBSR, TBEQ, TBZ, TBLT, TBLE:
1213 239 BEGIN
1214 240 CASE OP OF
1215 241 TBRA: SUBOP := 0;
1216 242 TBSR: SUBOP := 1;
1217 243 TBNE: SUBOP := 6;
1218 244 TBNZ: SUBOP := 6;
1219 245 TBEQ: SUBOP := 7;
1220 246 TBZ: SUBOP := 7;
1221 247 TBGE: SUBOP := 12;
1222 248 TBLT: SUBOP := 13;
1223 249 TBGT: SUBOP := 14;
1224 250 TBLE: SUBOP := 15
1225 251 END; (*CASE*)
1226 252 I := EA1.DISPL;
1227 253 IF EA1.MODE = RELATIVE
1228 254 THEN I := I -2
1229 255 ELSE IF EA1.MODE = LABELLED
1230 256 THEN IF ((LABELTABLEÆIÅ.DEFINED)
1231 257 AND (CURROPCODE <> XCUP))
1232 258 OR ((PROCTABLEÆIÅ.DEFINED)
1233 259 AND (CURROPCODE = XCUP))
1234 260 THEN
1235 261 BEGIN
1236 262 IF CURROPCODE = XCUP
1237 263 THEN LTEMP := PROCTABLEÆIÅ.LOCATION
1238 264 ELSE LTEMP := LABELTABLEÆIÅ.LOCATION;
1239 265 LSB(LTEMP, PC);
1240 266 SSB(LTEMP, 2);
1241 267 LASGN(I, LTEMP)
1242 268 END
1243 269 ELSE I := 0; (* FORWARD REFERENCE*)
1244 270 GEN448(6,SUBOP,I);
1245 271 GENNULL
1246 272 END; (*TBRA*)
1247 273
1248 274 TMOVEQ, TLDQ: BEGIN
1249 275 GEN4318(7,REG(EA2),0,EA1.DISPL);
1250 276 GENNULL
1251 277 END; (*TMOVEQ*)
1252 278
1253 279 TADDQ, TSUBQ:
1254 280 BEGIN
1255 281 IF SIZE = 1
1256 282 THEN I := 0
1257 283 ELSE IF SIZE = 4
1258 284 THEN I := 2
1259 285 ELSE I := 1;
1260 286 IF OP = TADDQ
1261 287 THEN SUBOP := 0
1262 288 ELSE SUBOP := 4; (* SUBQ*)
1263 289 IF EA1.DISPL = 8 THEN EA1.DISPL := 0; (* ADJUST FOR IMMED 8 *)
1264 290 GEN43333(5,EA1.DISPL,SUBOP+I,MODE(EA2),REG(EA2));
1265 291 IF EA1.DISPL = 0 THEN EA1.DISPL := 8; (*REPAIR IMMED 8*)
1266 292 GENEAEXT(EA2)
1267 293 END; (*TADDQ*)
1268 294
1269 295 TLEA, TCHK:
1270 296 BEGIN
1271 297 IF OP = TLEA
1272 298 THEN SUBOP := 7
1273 299 ELSE SUBOP := 6; (*CHK*)
1274 300 GEN43333(4,REG(EA2),SUBOP,MODE(EA1),REG(EA1));
1275 301 GENEAEXT(EA1)
1276 302 END; (*TLEA*)
1277 303
1278 304 TPEA: BEGIN
1279 305 GEN43333(4,4,1,MODE(EA1),REG(EA1));
1280 306 GENEAEXT(EA1)
1281 307 END; (*TPEA*)
1282 308
1283 309 TDC: BEGIN
1284 310 IF SIZE = 1
1285 311 THEN GEN8(EA1.DISPL);
1286 312 IF SIZE = 2
1287 313 THEN GEN16(EA1.DISPL);
1288 314 END; (*TDC*)
1289 315
1290 316 TLBSR, TLBLT, TLBEQ, TLBRA, TLBGT, TLBNE, TLBLE, TLBGE:
1291 317 BEGIN
1292 318 CASE OP OF
1293 319 TLBRA: SUBOP := 0;
1294 320 TLBSR: SUBOP := 1;
1295 321 TLBNE: SUBOP := 6;
1296 322 TLBEQ: SUBOP := 7;
1297 323 TLBGE: SUBOP := 12;
1298 324 TLBLT: SUBOP := 13;
1299 325 TLBGT: SUBOP := 14;
1300 326 TLBLE: SUBOP := 15;
1301 327 END; (*CASE*)
1302 328 I := EA1.DISPL;
1303 329 IF EA1.MODE = RELATIVE
1304 330 THEN I := I
1305 331 ELSE IF EA1.MODE = LABELLED
1306 332 THEN IF (LABELTABLEÆIÅ.DEFINED
1307 333 AND (CURROPCODE <> XCUP))
1308 334 OR (PROCTABLEÆIÅ.DEFINED
1309 335 AND (CURROPCODE = XCUP))
1310 336 THEN
1311 337 BEGIN
1312 338 IF CURROPCODE = XCUP
1313 339 THEN LTEMP := PROCTABLEÆIÅ.LOCATION
1314 340 ELSE LTEMP := LABELTABLEÆIÅ.LOCATION;
1315 341 LSB(LTEMP, PC);
1316 342 SSB(LTEMP, 2);
1317 343 LASGN(I, LTEMP)
1318 344 END
1319 345 ELSE I := 0 (*FORWARD REF*)
1320 346 ELSE IF EA1.MODE = XEXTERNAL
1321 347 THEN I := -(I );
1322 348 GEN448(6,SUBOP,0);
1323 349 SUBOP := EA1.DISPL;
1324 350 EA1.DISPL := I;
1325 351 GENEAEXT(EA1);
1326 352 EA1.DISPL := SUBOP;
1327 353 END; (*TLBSR*)
1328 354
1329 355 TSWAP: BEGIN
1330 356 GEN43333(4,4,1,0,REG(EA1));
1331 357 GENNULL
1332 358 END; (*TSWAP*)
1333 359
1334 360 TEXTE: BEGIN
1335 361 IF SIZE = 4
1336 362 THEN I := 3
1337 363 ELSE I := 2;
1338 364 GEN43333(4,4,I,0,REG(EA1));
1339 365 GENNULL
1340 366 END; (*TEXTE*)
1341 367
1342 368 TCMPM: BEGIN
1343 369 CASE SIZE OF
1344 370 1: I := 4;
1345 371 2: I := 5;
1346 372 4: I := 6
1347 373 END; (*CASE*)
1348 374 GEN43333(11,REG(EA2),I,1,REG(EA1));
1349 375 GENNULL
1350 376 END; (*TCMPM*)
1351 377
1352 378
1353 379 TDCNT: BEGIN (* WARNING: THIS IS OLD DCNT *)
1354 380 GEN4318(7,REG(EA1),1,256 - EA2.DISPL);
1355 381 GENNULL
1356 382 END (*TDCNT*) ;
1357 383 TASL: WRITELN(LISTING,'****ASL NOT SUPPORTED YET***');
1358 384
1359 385 TEQU: ;
1360 386 END; (*CASE*)
1361 387
1362 388 IF OP <> TDC THEN
1363 389 BEGIN
1364 390 IF (OP <> TEQU) AND ODD(DEBUG) THEN WRITE(LISTING,MACHCODE);
1365 391 MACHCODE := ' ';
1366 392 MACHINDEX := 1;
1367 393 PRINTINSTRUCTION
1368 394 END;
1369 END; (*GENX*)
1370 PROCEDURE PUSHDREG;
1371 VAR K: INTEGER;
1372 0 BEGIN IF DALLOC <= 0 THEN ERROR('NO D REG TO PUSH ')
1373 1 ELSE BEGIN K := SIZEÆREGTYPEÆDBOTÅÅ;
1374 2 (*1204B*) IF K = 8 THEN K := 4; (* POWERSETS*)
1375 3 EADDIR.REG := DBOT;
1376 4 GENX(TMOVE,K,EADDIR,EAPUSH);
1377 5 STKPTR:=STKPTR + 1;
1378 6 IF STKPTR > STKMAX THEN ERROR('TOO MANY REG PUSHES ');
1379 7 KINDSTKÆSTKPTRÅ := DREG;
1380 8 TYPESTKÆSTKPTRÅ := REGTYPEÆDBOTÅ;
1381 9 DALLOC := DALLOC - 1;
1382 10 IF DALLOC = 0 THEN
1383 11 BEGIN
1384 12 DBOT := DNONE;
1385 13 DTOP := DNONE
1386 14 END
1387 15 ELSE
1388 16 DBOT := DREGSÆ(ORD(DBOT)-ORD(D0)+1) MOD NDREGSÅ;
1389 17 END
1390 END; (*PUSHDREG*)
1391
1392
1393 PROCEDURE PUSHAREG;
1394 VAR K: INTEGER;
1395 0 BEGIN IF AALLOC <= 0 THEN ERROR('NO A REG TO PUSH ')
1396 1 ELSE BEGIN K := SIZEÆREGTYPEÆABOTÅÅ;
1397 2 EAADIR.REG := ABOT;
1398 3 GENX(TMOVE,K,EAADIR,EAPUSH);
1399 4 STKPTR:=STKPTR + 1;
1400 5 IF STKPTR > STKMAX THEN ERROR('TOO MANY REG PUSHES ');
1401 6 KINDSTKÆSTKPTRÅ := AREG;
1402 7 TYPESTKÆSTKPTRÅ := REGTYPEÆABOTÅ;
1403 8 AALLOC := AALLOC -1;
1404 9 IF AALLOC = 0 THEN BEGIN ABOT := ANONE; ATOP := ANONE END
1405 10 ELSE
1406 11 ABOT := AREGSÆ(ORD(ABOT)-ORD(A0) + 1) MOD NAREGSÅ;
1407 12 END
1408 END; (*PUSHAREG*)
1409
1410
1411 PROCEDURE PUSHALLD;
1412 BEGIN WHILE DALLOC > 0 DO PUSHDREG END;
1413
1414
1415 PROCEDURE PUSHALL;
1416 0 BEGIN WHILE AALLOC > 0 DO PUSHAREG;
1417 1 WHILE DALLOC > 0 DO PUSHDREG
1418 END;
1419
1420 PROCEDURE FREEALL;
1421 0 BEGIN
1422 1 DALLOC := 0; DTOP := DNONE; DBOT := DNONE;
1423 2 AALLOC := 0; ATOP := ANONE; ABOT := ANONE
1424 END; (*FREEALL*)
1425
1426
1427 PROCEDURE POPREG(KIND: REGKIND);
1428
1429 PROCEDURE POPD;
1430 VAR K: INTEGER;
1431 0 (*RM*) BEGIN
1432 1 (*RM*) IF DBOT = DNONE THEN
1433 2 (*RM*) BEGIN
1434 3 (*RM*) DBOT := D0;
1435 4 (*RM*) DTOP := D0
1436 5 (*RM*) END ELSE
1437 6 DBOT :=
1438 7 DREGSÆ (ORD(DBOT)-ORD(D0)-1+NDREGS) MOD NDREGSÅ;
1439 8 DALLOC := DALLOC + 1;
1440 9 IF STKPTR < 0 THEN ERROR('POPPING EMPTY STACK ')
1441 10 ELSE BEGIN
1442 11 K := SIZEÆTYPESTKÆSTKPTRÅÅ;
1443 12 (*1204B*) IF K = 8 THEN K := 4; (*POWERSETS*)
1444 13 EADDIR.REG := DBOT;
1445 14 GENX(TMOVE,K,EAPOP, EADDIR);
1446 15 REGTYPEÆDBOTÅ := TYPESTKÆSTKPTRÅ;
1447 16 IF STKPTR >= 0 THEN STKPTR := STKPTR -1;
1448 17 DPOPCNT := DPOPCNT + 1;
1449 18 END
1450 END; (*POPD*)
1451
1452 PROCEDURE POPA;
1453 VAR K: INTEGER;
1454 0 (*RM*) BEGIN IF ABOT = ANONE THEN
1455 1 (*RM*) BEGIN
1456 2 (*RM*) ABOT := A0;
1457 3 (*RM*) ATOP := A0
1458 4 (*RM*) END
1459 5 ELSE ABOT :=
1460 6 AREGSÆ (ORD(ABOT)-ORD(A0)-1+NAREGS) MOD NAREGSÅ;
1461 7 AALLOC := AALLOC + 1;
1462 8 IF STKPTR < 0 THEN ERROR('POPPING EMPTY STACK ')
1463 9 ELSE BEGIN
1464 10 K := SIZEÆTYPESTKÆSTKPTRÅÅ;
1465 11 EAADIR.REG := ABOT;
1466 12 GENX(TMOVE,K,EAPOP, EAADIR);
1467 13 REGTYPEÆABOTÅ := TYPESTKÆSTKPTRÅ;
1468 14 IF STKPTR >= 0 THEN STKPTR := STKPTR -1;
1469 15 APOPCNT := APOPCNT + 1;
1470 16 END
1471 END; (*POPA*)
1472
1473
1474 0 BEGIN IF KIND = DREG THEN
1475 1 BEGIN WHILE KINDSTKÆSTKPTRÅ <> DREG DO POPA;
1476 2 (*RM*) IF STKPTR >= 0 THEN POPD
1477 3 ELSE ERROR('NO D REG TO POP ')
1478 4 END
1479 5 ELSE
1480 6 BEGIN WHILE KINDSTKÆSTKPTRÅ <> AREG DO POPD;
1481 7 (*RM*) IF STKPTR >= 0 THEN POPA
1482 8 ELSE ERROR('NO A REG TO POP ')
1483 9 END
1484 END;
1485
1486
1487 FUNCTION PREVIOUS(R:REGISTER):REGISTER;
1488 0 BEGIN
1489 1 PREVIOUS := DREGSÆ(ORD(R)-ORD(D0)-1+NDREGS) MOD NDREGSÅ
1490 END; (* PREVIOUS *)
1491
1492 PROCEDURE ALLOCDREG;
1493 0 BEGIN
1494 1 DALLOCCNT := DALLOCCNT + 1;
1495 2 IF DALLOC >= NDREGS THEN BEGIN PUSHDREG;
1496 3 DPUSHCNT:=DPUSHCNT+1
1497 4 END;
1498 5 DALLOC := DALLOC + 1;
1499 6 DTOP := DREGSÆ(ORD(DTOP)-ORD(D0)+1) MOD NDREGSÅ;
1500 7 IF DBOT = DNONE THEN DBOT := DTOP;
1501 8 REGTYPEÆDTOPÅ := INSTR^.DTYPE;
1502 END; (*ALLOCDREG*)
1503
1504 PROCEDURE ALLOCAREG;
1505 0 BEGIN
1506 1 AALLOCCNT := AALLOCCNT + 1;
1507 2 IF AALLOC >= NAREGS THEN BEGIN PUSHAREG;
1508 3 APUSHCNT:=APUSHCNT+1
1509 4 END;
1510 5 AALLOC := AALLOC + 1;
1511 6 ATOP := AREGSÆ(ORD(ATOP)-ORD(A0)+1) MOD NAREGSÅ;
1512 7 IF ABOT = ANONE THEN ABOT := ATOP;
1513 8 (*1011*) REGTYPEÆATOPÅ := ATYP;
1514 END; (*ALLOCAREG*)
1515
1516 PROCEDURE FREEDREG;
1517 0 BEGIN IF DALLOC > 1 THEN BEGIN
1518 1 DALLOC := DALLOC -1;
1519 2 DTOP := DREGSÆ(ORD(DTOP)-ORD(D0)+NDREGS-1) MOD NDREGSÅ
1520 3 (*-1 AND WRAPAROUND*)
1521 4 END
1522 5 ELSE IF DALLOC = 1 THEN BEGIN
1523 6 DALLOC := 0;
1524 7 (*RM*) DBOT := DNONE;
1525 8 DTOP := DNONE
1526 9 END
1527 10 ELSE ERROR('FREE NONALLOC''D DREG')
1528 END; (*FREEDREG*)
1529
1530
1531 PROCEDURE FREEAREG;
1532 0 BEGIN IF AALLOC > 1 THEN BEGIN
1533 1 AALLOC := AALLOC -1;
1534 2 ATOP := AREGSÆ(ORD(ATOP)-ORD(A0)+NAREGS-1) MOD NAREGSÅ
1535 3 (*-1 AND WRAPAROUND*)
1536 4 END
1537 5 ELSE IF AALLOC = 1 THEN BEGIN
1538 6 AALLOC := 0;
1539 7 (*RM*) ABOT := ANONE;
1540 8 ATOP := ANONE
1541 9 END
1542 10 ELSE ERROR('FREE NONALLOC''D AREG')
1543 END; (*FREEAREG*)
1544
1545
1546 PROCEDURE EFFADDRESS(INSTR: IPTR; VAR OPADDR: EFFADDR);
1547 (*USED BY LOD, LDA, STR, TAKES LEVEL, OFFSET
1548 IN OPAND1 AND OPAND2 AND RETURNS MODE,
1549 REGISTER, AND DISPLACEMENT OF CORRESPONDING
1550 68000 ADDRESS*)
1551 VAR SRC: EFFADDR;
1552 0 BEGIN WITH INSTR^ DO
1553 1 BEGIN IF OPAND1 (*LEVEL*) = 0 THEN (*GLOBAL ACCESS*)
1554 2 OPADDR.REG := A5 (*GLOBAL BASE REGISTER*)
1555 3 ELSE IF OPAND1 = LEVEL THEN (*LOCAL ACCESS*)
1556 4 OPADDR.REG := A6 (*FRAME POINTER*)
1557 5 ELSE BEGIN
1558 6 IF TEMPLEVEL <> OPAND1 THEN
1559 7 BEGIN
1560 8 EAADIR.REG := A4;
1561 9 BUILDADDR(SRC,BASED,A5,ANONE,4*OPAND1 + 8);
1562 10 GENX(TMOVE,4,SRC,EAADIR);
1563 11 TEMPLEVEL := OPAND1
1564 12 (*SAVE LEVEL OF DISPLAY ENTRY
1565 13 CURRENTLY HELD IN A4*)
1566 14 END;
1567 15 OPADDR.REG := A4; (*TEMPORARY INTERMEDIATE PTR*)
1568 16 END;
1569 17 OPADDR.MODE := BASED;
1570 18 OPADDR.DISPL := OPAND2; (*OFFSET*)
1571 19 IF (OPADDR.REG = A4) OR (OPADDR.REG = A6) THEN
1572 20 IF OPAND2 >= 0 THEN OPADDR.DISPL := OPAND2 + 12;
1573 21 IF OPADDR.DISPL = 0 THEN OPADDR.MODE := DEFER
1574 22 END;
1575 END; (*EFFADDRESS*)
1576
1577 PROCEDURE DOUBLEOP(VAR SRC, DST:EFFADDR; COMMUTATIVE: BOOLEAN;
1578 VAR SWITCH: BOOLEAN);
1579 0 (*RM*) BEGIN
1580 1 (*RM*) IF INSTR^.DTYPE = ATYP THEN BEGIN
1581 2 (*RM*) IF NOT COMMUTATIVE OR (AALLOC>=2) THEN
1582 3 (*RM*) BEGIN
1583 4 (*RM*) WHILE AALLOC <= 1 DO POPREG(AREG);
1584 5 (*RM*) BUILDADDR(SRC,ADIRECT,ATOP,ANONE,0);
1585 6 (*RM*) FREEAREG;
1586 7 (*RM*) BUILDADDR(DST,ADIRECT,ATOP,ANONE,0);
1587 8 (*RM*) SWITCH := FALSE
1588 9 (*RM*) END ELSE
1589 10 (*RM*) BEGIN
1590 11 (*RM*) IF AALLOC < 1 THEN POPREG(AREG);
1591 12 (*RM*) (*AALLOC = 1 AT THIS POINT *)
1592 13 (*RM*) BUILDADDR(DST,ADIRECT,ATOP,ANONE,0);
1593 14 (*RM*) BUILDADDR(SRC,INCR,SP,ANONE,0);
1594 15 (*RM*) SWITCH := TRUE;
1595 16 (*RM*) IF NOT (INSTR^.DTYPE IN LONGTYPES) THEN STKPTR := STKPTR -1;
1596 17 (*RM*) END
1597 18 (*RM*) END ELSE
1598 19 BEGIN IF NOT COMMUTATIVE OR (DALLOC >= 2) THEN
1599 20 BEGIN
1600 21 WHILE DALLOC <= 1 DO POPREG(DREG);
1601 22 BUILDADDR(SRC,DDIRECT,DTOP,ANONE,0);
1602 23 FREEDREG;
1603 24 BUILDADDR(DST,DDIRECT,DTOP,ANONE,0);
1604 25 SWITCH := FALSE
1605 26 END
1606 27 ELSE BEGIN
1607 28 IF DALLOC < 1 THEN POPREG(DREG);
1608 29 (*DALLOC = 1 AT THIS POINT*)
1609 30 BUILDADDR(DST,DDIRECT,DTOP,ANONE,0);
1610 31 BUILDADDR(SRC,INCR,SP,ANONE,0);
1611 32 SWITCH := TRUE;
1612 33 (*RM*) IF NOT (INSTR^.DTYPE IN LONGTYPES) THEN STKPTR := STKPTR -1;
1613 34 END
1614 35 (*RM*) END
1615 (*RM*) END;
1616
1617 PROCEDURE SINGLEOP(VAR SRC:EFFADDR);
1618 0 (*RM*) BEGIN
1619 1 (*RM*) IF INSTR^.DTYPE = ATYP THEN
1620 2 (*RM*) BEGIN IF AALLOC = 0 THEN POPREG(AREG);
1621 3 (*RM*) BUILDADDR(SRC,ADIRECT,ATOP,ANONE,0)
1622 4 (*RM*) END ELSE
1623 5 BEGIN IF DALLOC = 0 THEN POPREG(DREG);
1624 6 BUILDADDR(SRC,DDIRECT,DTOP,ANONE,0);
1625 7 (*RM*) END
1626 END;
1627
1628
1629 PROCEDURE LOADBIG(ADDR: EFFADDR; BYTES: INTEGER);
1630 (* PROCEDURE TO LOAD POWERSETS ONTO STACK *)
1631 0 BEGIN
1632 1 ALLOCDREG;
1633 2 EADDIR.REG := DTOP;
1634 3 GENX(TMOVE,4,ADDR,EADDIR);
1635 4 IF ADDR.MODE = BASED
1636 5 THEN ADDR.DISPL := ADDR.DISPL + 4
1637 6 ELSE IF ADDR.MODE=DEFER
1638 7 THEN BEGIN
1639 8 ADDR.MODE := BASED;
1640 9 ADDR.DISPL := 4
1641 10 END
1642 11 ELSE ERROR('LOADBIG W/BAD MODE ');
1643 12 ALLOCDREG;
1644 13 EADDIR.REG := DTOP;
1645 14 GENX(TMOVE,4,ADDR,EADDIR);
1646 END; (*LOADBIG*)
1647
1648
1649 PROCEDURE STOREBIG(ADDR: EFFADDR; BYTES: INTEGER);
1650 (* PROCEDURE TO STORE POWERSETS OFF THE STACK *)
1651 0 BEGIN
1652 1 EADDIR.REG := PREVIOUS(DTOP);
1653 2 GENX(TMOVE,4,EADDIR,ADDR);
1654 3 IF ADDR.MODE = BASED
1655 4 THEN ADDR.DISPL := ADDR.DISPL + 4
1656 5 ELSE IF ADDR.MODE = DEFER
1657 6 THEN BEGIN
1658 7 ADDR.MODE := BASED;
1659 8 ADDR.DISPL := 4
1660 9 END
1661 10 ELSE ERROR('STOREBIG W/BAD MODE ');
1662 11 EADDIR.REG := DTOP;
1663 12 FREEDREG;
1664 13 GENX(TMOVE,4,EADDIR,ADDR);
1665 14 FREEDREG
1666 END; (*STOREBIG*)
1667
1668
1669 PROCEDURE STORELITTLE; (*GEN CODE TO MOVE TOP DATA ITEM TO MEMORY*)
1670 0 BEGIN IF DALLOC > 0 THEN
1671 1 BEGIN EADDIR.REG := DTOP;
1672 2 GENX(TMOVE,SIZEÆINSTR^.DTYPEÅ,EADDIR,SOURCE);
1673 3 FREEDREG;
1674 4 END
1675 5 ELSE BEGIN GENX(TMOVE,SIZEÆINSTR^.DTYPEÅ,EAPOP,SOURCE);
1676 6 STKPTR := STKPTR - 1;
1677 7 END
1678 END; (*STORELITTLE*)
1679
1680 PROCEDURE REFERENCELABEL(LABL: INTEGER; WHERE: ADDRESS);
1681 (* CALLED TO SAVE FORWARD REFERENCE INFO *)
1682 0 BEGIN
1683 1 NEW(TEMPLABREF);
1684 2 WITH TEMPLABREF^ DO
1685 3 BEGIN
1686 4 IF INSTR^.OPCODE=XCUP
1687 5 THEN NEXT := PROCTABLEÆLABLÅ.REFCHAIN
1688 6 ELSE NEXT := LABELTABLEÆLABLÅ.REFCHAIN;
1689 7 CORELOC := WHERE
1690 8 END; (*WITH*)
1691 9 IF INSTR^.OPCODE=XCUP
1692 10 THEN BEGIN
1693 11 PROCTABLEÆLABLÅ.REFCHAIN := TEMPLABREF;
1694 12 PROCTABLEÆLABLÅ.REFED := TRUE;
1695 13 CLR (PROCTABLEÆLABLÅ.LOCATION);
1696 14 PROCTABLEÆLABLÅ.LOCATIONÆ0Å := 1
1697 15 END (*ELSE*)
1698 16 ELSE BEGIN
1699 17 LABELTABLEÆLABLÅ.REFCHAIN := TEMPLABREF ;
1700 18 LABELTABLEÆLABLÅ.REFED := TRUE;
1701 19 IF INSTR^.OPCODE = XENT
1702 20 THEN SASGN(LABELTABLEÆLABLÅ.LOCATION, -1)
1703 21 ELSE CLR(LABELTABLEÆLABLÅ.LOCATION);
1704 22 END; (*ELSE*)
1705 END; (*REFERENCELABEL*)
1706
1707
1708 PROCEDURE LONGBSR; (* RUNTIME ROUTINE BRANCH CALCULATION *)
1709 VAR
1710 I: INTEGER;
1711 RTNAME: PCODES;
1712 0 BEGIN
1713 1 WITH INSTR^ DO
1714 2 BEGIN
1715 3 RTNAME := OPCODE;
1716 4 IF DTYPE = VTYP
1717 5 THEN BEGIN
1718 6 IF RTNAME = XIND THEN RTNAME := XINDV
1719 7 ELSE IF RTNAME = XLOD THEN RTNAME := XLODV
1720 8 ELSE IF RTNAME = XSTR THEN RTNAME := XSTRV
1721 9 ELSE IF RTNAME = XSTO THEN RTNAME := XSTOV
1722 10 ELSE IF RTNAME = XEQU THEN RTNAME := XEQUV
1723 11 ELSE IF RTNAME = XNEQ THEN RTNAME := XNEQV
1724 12 ELSE IF RTNAME = XLES THEN RTNAME := XLESV
1725 13 ELSE IF RTNAME = XLEQ THEN RTNAME := XLEQV
1726 14 ELSE IF RTNAME = XGRT THEN RTNAME := XGRTV
1727 15 ELSE IF RTNAME = XGEQ THEN RTNAME := XGEQV
1728 16 ELSE IF RTNAME = XLDC THEN RTNAME := XLDCV
1729 17 END
1730 18 ELSE IF RTNAME = XCVT
1731 19 THEN IF (D1TYPE=STYP) AND (DTYPE=UTYP)
1732 20 THEN RTNAME := XCVTSU
1733 21 ELSE IF (D1TYPE=UTYP) AND (DTYPE=STYP)
1734 22 THEN RTNAME := XCVTUS;
1735 23 CLR(LTEMP);
1736 24 LSB(LTEMP,RTJUMP);
1737 25 SAD(LTEMP,RTÆRTNAMEÅ);
1738 26 SSB(LTEMP,4096);
1739 27 LASGN(SOURCE.DISPL,LTEMP);
1740 28 BUILDADDR(SOURCE,BASED,A3,ANONE,SOURCE.DISPL);
1741 29 GENX(TJSR,2,SOURCE,EANONE)
1742 30 END (*WITH*)
1743 END; (*LONGBSR*)
1744
1745 PROCEDURE MAIN;
1746 0 BEGIN
1747 1 IF INSTR^.OPAND1 = 0 THEN
1748 2 BEGIN
1749 3 PROGSTART := PC;
1750 4 MAINFLG := TRUE;
1751 5 WRITELN(LISTING,'MAIN',' ':6,'EQU *');
1752 6 END
1753 7 ELSE WRITELN(LISTING,'USER':4,CURRLABEL:1,' EQU *')
1754 END ; (* MAIN *)
1755
1756 PROCEDURE GENXXJP;
1757 0 BEGIN
1758 1 (*0421B*) IF DALLOC = 0 THEN POPREG(DREG);
1759 2 EADDIR.REG := DTOP;
1760 3 EALIMM.DISPL := INSTR^.OPAND1 + 1;
1761 4 GENX(TCMP,2,EALIMM,EADDIR);
1762 5 LTEMP := PC;
1763 6 SSB(LTEMP, 2);
1764 7 REFERENCELABEL(EALIMM.DISPL,LTEMP);
1765 8 (*RM*) EAREL.DISPL := 20;
1766 9 GENX(TBGT,2,EAREL,EANONE);
1767 10 EALIMM.DISPL := INSTR^.OPAND1;
1768 11 GENX(TSUB,2,EALIMM,EADDIR);
1769 12 LTEMP := PC;
1770 13 SSB(LTEMP, 2);
1771 14 REFERENCELABEL(EALIMM.DISPL,LTEMP);
1772 15 (*RM*) EAREL.DISPL := 14;
1773 16 GENX(TBLT,2,EAREL,EANONE);
1774 17 EALAB.DISPL := INSTR^.OPAND1 + 2;
1775 18 ALLOCAREG;
1776 19 EAADIR.REG := ATOP;
1777 20 GENX(TLEA,2,EALAB,EAADIR);
1778 21 LTEMP := PC;
1779 22 SSB(LTEMP, 2);
1780 23 REFERENCELABEL(EALAB.DISPL,LTEMP);
1781 24 GENX(TADD,2,EADDIR,EADDIR);
1782 25 BUILDADDR(SOURCE,INDEX,ATOP,DTOP,0);
1783 26 GENX(TADD,2,SOURCE,EAADIR);
1784 27 EADEFER.REG := ATOP;
1785 28 GENX(TJMP,2,EADEFER,EANONE);
1786 29 FREEDREG; FREEAREG
1787 END (* GENXXJP *) ;
1788
1789
1790 (*RM*) PROCEDURE LOADPSET;
1791 0 (*RM*) BEGIN
1792 1 (*RM*) WITH INSTR^ DO BEGIN
1793 2 (*RM*) ALLOCDREG;
1794 3 (*RM*) EADDIR.REG := DTOP;
1795 4 (*RM*) EAPSET.DISPL := 0;
1796 5 (*RM*) GENX(TMOVE,4,EAPSET,EADDIR);
1797 6 (*RM*) ALLOCDREG;
1798 7 (*RM*) EADDIR.REG := DTOP;
1799 8 (*RM*) EAPSET.DISPL := 8;
1800 9 (*RM*) GENX(TMOVE,4,EAPSET,EADDIR)
1801 10 (*RM*) END
1802 (*RM*) END; (* LOADPSET *)
1803
1804
1805 PROCEDURE SETOPS;
1806 0 BEGIN
1807 1 WITH INSTR^ DO BEGIN
1808 2 WHILE DALLOC < 4 DO POPREG(DREG);
1809 3 IF OPCODE = XDIF THEN BEGIN
1810 4 EADDIR.REG := DTOP;
1811 5 (*1324A*) GENX(TCOMP,4,EADDIR,EANONE);
1812 6 EADDIR.REG := PREVIOUS(DTOP);
1813 7 (*1324A*) GENX(TCOMP,4,EADDIR,EANONE);
1814 8 END;
1815 9 IF OPCODE = XUNI THEN OPCDE := TOR
1816 10 ELSE OPCDE := TAND;
1817 11 BUILDADDR(SOURCE,DDIRECT,DTOP,DNONE,0);
1818 12 EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
1819 13 GENX(OPCDE,4,SOURCE,EADDIR);
1820 14 SOURCE.REG := PREVIOUS(DTOP);
1821 15 EADDIR.REG := PREVIOUS(PREVIOUS(PREVIOUS(DTOP)));
1822 16 GENX(OPCDE,4,SOURCE,EADDIR);
1823 17 FREEDREG;FREEDREG;
1824 18 END
1825 END; (* SETOPS *)
1826
1827
1828 PROCEDURE PXLAB;
1829 0 BEGIN WITH INSTR^ DO BEGIN
1830 1 IF OPAND1 = 0 THEN OPAND1 := -1;
1831 2 (*604*) PCPRINT;
1832 3 WRITE(LISTING,'L',OPAND1 + LABELOFFSET:1);
1833 4 BUILDADDR(SOURCE,RELATIVE,ANONE,ANONE,0);
1834 5 GENX(TEQU,0,SOURCE,EANONE)
1835 6 END;
1836 END; (* PXLAB *)
1837
1838 PROCEDURE PXEND;
1839 VAR I: INTEGER;
1840 0 BEGIN
1841 1 EMITCODE;
1842 2 IF MAINFLG THEN BEGIN
1843 3 GENLOC := GENSTART;
1844 4 WRITE(LISTING,' RORG $');
1845 5 PLINT(LISTING,GENSTART);
1846 6 LTEMP := PC;
1847 7 WRITELN(LISTING,' ');
1848 8 LSB(LTEMP,GENSTART);
1849 9 SSB(LTEMP,20);
1850 10 GENSAVE := PC;
1851 11 PC := GENSTART;
1852 12 (* LOAD STACK *)
1853 13 WRITE(LISTING,' ':39,'MOVE.L $');
1854 14 PLINT(LISTING,STKSTART);
1855 15 WRITELN(LISTING,',A7');
1856 16 EAIMMED.DISPL := 11900; (* TMOVE 2E7C *)
1857 17 GENX(TDC,2,EAIMMED,EANONE);
1858 18 EAIMMED.DISPL := STKSTARTÆ0Å;
1859 19 GENX(TDC,1,EAIMMED,EANONE);
1860 20 EAIMMED.DISPL := STKSTARTÆ1Å;
1861 21 GENX(TDC,1,EAIMMED,EANONE);
1862 22 EAIMMED.DISPL := STKSTARTÆ2Å;
1863 23 GENX(TDC,1,EAIMMED,EANONE);
1864 24 EAIMMED.DISPL := STKSTARTÆ3Å;
1865 25 GENX(TDC,1,EAIMMED,EANONE);
1866 26 (* LEA 11EA,A3 *)
1867 27 WRITE(LISTING,' ':39,'LEA $');
1868 28 LTEMP := RTJUMP;
1869 29 SAD(LTEMP,4096);
1870 30 PLINT(LISTING,LTEMP);
1871 31 WRITELN(LISTING,',A3');
1872 32 EAIMMED.DISPL := 18425; (* LEA 47F9 *)
1873 33 GENX(TDC,2,EAIMMED,EANONE);
1874 34 EAIMMED.DISPL := LTEMPÆ0Å;
1875 35 GENX(TDC,1,EAIMMED,EANONE);
1876 36 EAIMMED.DISPL := LTEMPÆ1Å;
1877 37 GENX(TDC,1,EAIMMED,EANONE);
1878 38 EAIMMED.DISPL := LTEMPÆ2Å;
1879 39 GENX(TDC,1,EAIMMED,EANONE);
1880 40 EAIMMED.DISPL := LTEMPÆ3Å;
1881 41 GENX(TDC,1,EAIMMED,EANONE);
1882 42 (* JSR -490(A3) INITIALIZE ENVIRONMENT *)
1883 43 LONGBSR;
1884 44 IF (HEAPSTARTÆ0Å=255) AND (HEAPSTARTÆ1Å=255)
1885 45 AND (HEAPSTARTÆ2Å=255) AND (HEAPSTARTÆ3Å=255)
1886 46 THEN BEGIN
1887 47 HEAPSTART := GENSAVE;
1888 48 SAD(HEAPSTART,10)
1889 49 END;
1890 50 WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
1891 51 PLINT(LISTING,HEAPSTART);
1892 52 WRITELN(LISTING,' ');
1893 53 FOR I := 0 TO 3 DO
1894 54 BEGIN
1895 55 EAIMMED.DISPL := HEAPSTARTÆIÅ;
1896 56 GENX(TDC,1,EAIMMED,EANONE)
1897 57 END;
1898 58 (* BRA OR JSR TO MAIN *)
1899 59 LTEMP := PROGSTART;
1900 60 LSB(LTEMP,PC);
1901 61 IF SHORT(LTEMP) THEN BEGIN
1902 62 LASGN(EAREL.DISPL, LTEMP);
1903 63 GENX(TLBRA,2,EAREL,EANONE);
1904 64 END ELSE
1905 65 BEGIN
1906 66 EADEFER.REG := A3;
1907 67 SSB(LTEMP,2);
1908 68 GENX(TJSR,2,EADEFER,EANONE);
1909 69 WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
1910 70 PLINT(LISTING,LTEMP);
1911 71 WRITELN(LISTING,' ');
1912 72 FOR I := 0 TO 3 DO
1913 73 BEGIN
1914 74 EAIMMED.DISPL := LTEMPÆIÅ;
1915 75 GENX(TDC,1,EAIMMED,EANONE)
1916 76 END
1917 77 END;
1918 78 PC := GENSAVE;
1919 79 EMITCODE;
1920 80 END; (*BEGIN*)
1921 81 EMITEND
1922 82 ;WRITELN(LISTING,' END');
1923 END; (*PXEND*)
1924
1925 PROCEDURE PXDEF;
1926 0 BEGIN WITH INSTR^ DO BEGIN
1927 1 IF LABELED AND NOT DOLLAR THEN
1928 2 BEGIN
1929 3 IF OPAND1= 0 THEN OPAND1 := 1-LABELOFFSET;
1930 4 (*604*) PCPRINT;
1931 5 WRITE(LISTING,'L',OPAND1 + LABELOFFSET:1);
1932 6 BUILDADDR(SOURCE,ABSOLUTE,ANONE,ANONE,OPAND2);
1933 7 GENX(TEQU,0,SOURCE,EANONE)
1934 8 END;
1935 9 IF LABELED AND DOLLAR THEN
1936 10 BEGIN GETSTRING;
1937 11 WRITE(OUTPUT,'***** REFERENCE TO EXTERNAL PROCEDURE ',
1938 12 VSTRING:ALENGTH,' AT LOCATION ');
1939 13 LTEMP := EXPROC;
1940 14 SSB(LTEMP,10);
1941 15 PLINT(OUTPUT,LTEMP);
1942 16 WRITELN(OUTPUT,' ');
1943 17 END
1944 18 ELSE IF NOT LABELED THEN
1945 19 ERROR('DEF WITH NO LABEL ')
1946 20 END;
1947 END; (*PXDEF*)
1948
1949 PROCEDURE PXENT; (* OPAND1 IS NEW LEVEL*)
1950 0 BEGIN WITH INSTR^ DO BEGIN
1951 1 (*OPAND2 IS LABEL WHICH GIVES LOCAL DATA SZ*)
1952 2 (*VSTRING IS NEW PROC/FUNC NAME*)
1953 3 EMITCODE;
1954 4 RESETLABEL;
1955 5 MAIN;
1956 6 LEVEL := OPAND1;
1957 7 IF TEMPLEVEL = LEVEL THEN TEMPLEVEL := -1;
1958 8 (*INVALIDATE A4 (POINTER TO INTERMEDIATE
1959 9 LEXICAL LEVEL) IF DISPLAY ENTRY CHANGES*)
1960 10 IF LEVEL = 1 THEN
1961 11 BEGIN
1962 12 WRITE(OUTPUT,'*****ENTRY TO PROCEDURE ':25,
1963 13 VSTRING:ALENGTH,' AT LOCATION ');
1964 14 PLINT(OUTPUT,PC);
1965 15 WRITELN(OUTPUT,' ')
1966 16 END;
1967 17 (*1212A*) IF LEVEL = 0 THEN
1968 18 (*1212A*) BEGIN
1969 19 (*1212A*) EAADIR.REG := A7;
1970 20 (*1212A*) EALIMM.DISPL := -OPAND2;
1971 21 (*1212A*) GENX(TADD,0,EALIMM,EAADIR);
1972 22 LTEMP := PC;
1973 23 SSB(LTEMP, 2);
1974 24 (*1212A*) REFERENCELABEL(OPAND2 - LABELOFFSET,LTEMP)
1975 25 (*1212A*) END
1976 26 (*1212A*) ELSE BEGIN
1977 27 BUILDADDR(SOURCE,BASED,A5,ANONE,8+4*LEVEL);
1978 28 (*DISPLAY IS ^A5(6)*)
1979 29 GENX(TMOVE,4,SOURCE,EAPUSH);
1980 30 EAADIR.REG := A6; (*FRAME POINTER*)
1981 31 EALIMM.DISPL := -OPAND2 ;
1982 32 GENX(TLINK,0,EAADIR,EALIMM) ;
1983 33 LTEMP := PC;
1984 34 SSB( LTEMP, 2);
1985 35 REFERENCELABEL(OPAND2 - LABELOFFSET,LTEMP);
1986 36 GENX(TMOVE,4,EAADIR,SOURCE);
1987 37 (*1212A*) END;
1988 38 END;
1989 END; (* PXENT *)
1990
1991 PROCEDURE PXRET;
1992 0 BEGIN WITH INSTR^ DO BEGIN
1993 1 IF OPAND1 <> LEVEL THEN
1994 2 ERROR('ENT/RET LEVELS NOT =');
1995 3 EAADIR.REG := A6; (*FRAME POINTER*)
1996 4 GENX(TUNLK,0,EAADIR,EANONE);
1997 5 BUILDADDR(SOURCE,BASED,A5,ANONE,8+4*LEVEL);
1998 6 GENX(TMOVE,4,EAPOP,SOURCE);
1999 7 (*RM*) (* CODE TO FLUSH ARGUMENTS FROM STACK *)
2000 8 (*RM*) IF OPAND2 <> 0 THEN
2001 9 (*RM*) BEGIN
2002 10 (*RM*) ALLOCAREG;
2003 11 (*RM*) EAADIR.REG := ATOP;
2004 12 (*RM*) GENX(TMOVE,4,EAPOP,EAADIR);
2005 13 (*RM*) EAIMMED.DISPL := OPAND2;
2006 14 (*RM*) EAADIR.REG := SP;
2007 15 (*RM*) GENX(TADD,4,EAIMMED,EAADIR);
2008 16 (*RM*) EADEFER.REG := ATOP;
2009 17 (*RM*) GENX(TJMP,0,EADEFER,EANONE);
2010 18 (*RM*) FREEAREG
2011 19 (*RM*) END ELSE
2012 20 GENX(TRTS,0,EANONE,EANONE)
2013 21 END;
2014 END; (*PXRET*)
2015
2016 (*604*) PROCEDURE PXAD; FORWARD;
2017 PROCEDURE PXAB;
2018 0 BEGIN WITH INSTR^ DO BEGIN
2019 1 SINGLEOP(SOURCE);
2020 2 (*RM*) K := SIZEÆDTYPEÅ;
2021 3 CASE SUBTYPEÆOPCODEÅ OF
2022 4 (*604*) 1 (*AB *): BEGIN GENX(TTST,K,SOURCE,EANONE);
2023 5 (*RM*) EAREL.DISPL := 4;
2024 6 GENX(TBGT,0,EAREL,EANONE);
2025 7 (*604*) GENX(TNEG,K,SOURCE,EANONE)
2026 8 END;
2027 9 (*604*) 2 (*NG *): GENX(TNEG,K,SOURCE,EANONE);
2028 10 (*RM*) 3 (*DEC*): BEGIN EAIMMED.DISPL := OPAND1;
2029 11 GENX(TSUB,K,EAIMMED,SOURCE)
2030 12 (*RM*) END;
2031 13 (*RM*) 4 (*INC*): BEGIN EAIMMED.DISPL := OPAND1;
2032 14 (*480*) IF DTYPE = ATYP THEN K := 2;
2033 15 (*RM*) GENX(TADD,K,EAIMMED,SOURCE) END;
2034 16 5 (*NOT*): BEGIN
2035 17 OPTIMI := NEXTPCOD(INSTR);
2036 18 IF OPTIMI^.OPCODE=XFJP
2037 19 THEN BEGIN
2038 20 OPTIMI^.OPAND3 := 102; (*BEQ TO FJP*)
2039 21 END
2040 22 ELSE BEGIN
2041 23 (*RM*) EAIMMED.DISPL := 1;
2042 24 (*RM*) GENX(TEOR,1,EAIMMED,SOURCE)
2043 25 END
2044 26 (*RM*) END;
2045 27 (*0421C*) 6 (*ODD*): BEGIN EAIMMED.DISPL := 1;(*BIT # = 0*)
2046 28 (*0421C*) GENX(TAND,1,EAIMMED,SOURCE);
2047 29 (*0421C*) REGTYPEÆDTOPÅ := BTYP;
2048 30 END;
2049 31 (*RM*) 7 (*SQR*): (*CHECK SIZES??*)
2050 32 (*604*) IF DTYPE = JTYP
2051 33 (*604*) THEN BEGIN
2052 34 (*604*) IF DALLOC < 1
2053 35 (*604*) THEN POPREG(DREG);
2054 36 (*604*) EADDIR.REG := DTOP;
2055 37 (*604*) ALLOCDREG;
2056 38 (*604*) BUILDADDR(DEST,DDIRECT,
2057 39 (*604*) DTOP,ANONE,0);
2058 40 (*604*) GENX(TMOVE,4,EADDIR,DEST);
2059 41 (*604*) OPCODE := XMP;
2060 42 (*604*) PXAD;
2061 43 (*604*) END ELSE
2062 44 (*604*) BEGIN
2063 45 (*604*) IF DTYPE = HTYP
2064 46 (*604*) THEN BEGIN
2065 47 (*604*) IF DALLOC<1 THEN POPREG(DREG);
2066 48 (*604*) BUILDADDR(SOURCE,DDIRECT,DTOP,
2067 49 (*604*) ANONE,0);
2068 50 (*604*) GENX(TEXTE,2,SOURCE,EANONE)
2069 51 (*604*) END;
2070 52 (*RM*) GENX(TMULS,2,SOURCE,SOURCE);
2071 53 (*604*) END;
2072 54 (* CHECK OVFL
2073 55 MOV.W TO TEMP
2074 56 EXT.L TEMP
2075 57 CMP TEMP WITH SOURCE
2076 58 BNE *+2
2077 59 TRAP OVFL *)
2078 60 END
2079 61 END;
2080 END; (*PXAB*)
2081
2082 PROCEDURE PXAD;
2083 0 BEGIN WITH INSTR^ DO BEGIN
2084 1 CASE SUBTYPEÆOPCODEÅ OF
2085 2 (*604*) 1,3,4: COMMUTATIVE := TRUE;
2086 3 (*604*) 5: IF DTYPE IN ÆJTYP,HTYPÅ THEN COMMUTATIVE := FALSE
2087 4 (*604*) ELSE COMMUTATIVE := TRUE;
2088 5 2,6,7: COMMUTATIVE := FALSE
2089 6 END;
2090 7 DOUBLEOP(SOURCE,DEST,COMMUTATIVE,SWITCH);
2091 8 K := SIZEÆDTYPEÅ;
2092 9 IF DTYPE = NOTATYP THEN K := 1; (* ASSUME BOOLEAN*)
2093 10 (*604*) IF (DTYPE = JTYP)
2094 11 (*604*) AND (SUBTYPEÆOPCODEÅ IN Æ5,6,7Å)
2095 12 (*604*) THEN BEGIN
2096 13 (*604*) LONGBSR;
2097 14 (*604*) EAIMMED.DISPL := ORD(DEST.REG) - ORD(D0);
2098 15 (*604*) PCPRINT;
2099 16 (*604*) WRITELN(LISTING,' ':10,'DC.W ',
2100 17 (*604*) EAIMMED.DISPL:0);
2101 18 (*604*) GENX(TDC,2,EAIMMED,EANONE);
2102 19 (*604*) END ELSE
2103 20 CASE SUBTYPEÆOPCODEÅ OF
2104 21 1 (*ADD*): GENX(TADD,K,SOURCE, DEST);
2105 22 2 (*SB *): GENX(TSUB,K,SOURCE, DEST);
2106 23 3 (*AND*): GENX(TAND,K,SOURCE, DEST);
2107 24 4 (*IOR*): GENX(TOR, K,SOURCE, DEST);
2108 25 (*604*) 5 (*MP *): BEGIN
2109 26 (***CHECK OVFL; SEE CODE FOR SQR*)
2110 27 (*604*) IF DTYPE = HTYP
2111 28 (*604*) THEN GENX(TEXTE,2,SOURCE,EANONE);
2112 29 (*604*) IF (DTYPE = HTYP)
2113 30 (*604*) THEN GENX(TEXTE,2,DEST,EANONE);
2114 31 (*604*) GENX(TMULS,2,SOURCE,DEST)
2115 32 END;
2116 33 (*604*) 6 (*DV *): BEGIN
2117 34 (*604*) IF DTYPE = HTYP
2118 35 (*604*) THEN BEGIN
2119 36 (*604*) GENX(TEXTE,2,SOURCE,EANONE);
2120 37 (*604*) GENX(TEXTE,2,DEST,EANONE)
2121 38 (*604*) END;
2122 39 (*604*) GENX(TEXTE,4,DEST,EANONE);
2123 40 (*RM*) GENX(TDIVS,2,SOURCE,DEST)
2124 41 END;
2125 42 (*604*) 7 (*MOD*): BEGIN
2126 43 (*604*) IF DTYPE = HTYP
2127 44 (*604*) THEN BEGIN
2128 45 (*604*) GENX(TEXTE,2,SOURCE,EANONE);
2129 46 (*604*) GENX(TEXTE,2,DEST,EANONE)
2130 47 (*604*) END;
2131 48 (*604*) GENX(TEXTE,4,DEST,EANONE);
2132 49 (*RM*) GENX(TDIVS,2,SOURCE,DEST);
2133 50 (*RM*) GENX(TSWAP,2,DEST,EANONE)
2134 51 END;
2135 52 END
2136 53 END;
2137 END; (*PXAD*)
2138
2139 PROCEDURE PXCLO;
2140 VAR I:INTEGER;
2141 0 BEGIN WITH INSTR^ DO BEGIN
2142 1 IF SHORT(FIRSTESD^.REFERENCE)
2143 2 AND (FIRSTESD^.REFERENCEÆ2Å=0)
2144 3 AND (FIRSTESD^.REFERENCEÆ3Å=0) THEN
2145 4 BEGIN TEMPESD:= FIRSTESD;
2146 5 NEW(FIRSTESD); FIRSTESD^.NEXT:=TEMPESD;
2147 6 END;
2148 7 LTEMP := PC;
2149 8 SAD(LTEMP, 2);
2150 9 FIRSTESD^.REFERENCE := LTEMP;
2151 10 FIRSTESD^.NAME := OPCODE;
2152 11 IF (OPCODE=XWRB) OR (OPCODE=XWRC) OR (OPCODE=XWRI)
2153 12 (*604*) OR (OPCODE=XWRH) OR (OPCODE=XWRJ)
2154 13 THEN BEGIN
2155 14 (*0610B*) IF OPCODE=XWRC THEN DTYPE := CTYP
2156 15 (*0610B*) ELSE IF OPCODE=XWRI THEN DTYPE := ITYP
2157 16 (*0610B*) ELSE IF OPCODE=XWRH THEN DTYPE := HTYP
2158 17 (*0610B*) ELSE IF OPCODE=XWRJ THEN DTYPE := JTYP;
2159 18 IF DALLOC + AALLOC = 0
2160 19 THEN BEGIN
2161 20 EADDIR.REG := D1;
2162 21 GENX(TMOVE,2,EAPOP,EADDIR);
2163 22 EADDIR.REG := D0;
2164 23 (*0610B*) GENX(TMOVE,SIZEÆDTYPEÅ,EAPOP,EADDIR);
2165 24 EAADIR.REG := A0;
2166 25 GENX(TMOVE,4,EAPOP,EAADIR);
2167 26 STKPTR := STKPTR - 3;
2168 27 DPOPCNT := DPOPCNT + 3;
2169 28 END
2170 29 ELSE IF (DALLOC=1) AND (AALLOC=0)
2171 30 THEN BEGIN
2172 31 BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
2173 32 EADDIR.REG := D1;
2174 33 GENX(TMOVE,2,SOURCE,EADDIR);
2175 34 EADDIR.REG := D0;
2176 35 (*0610B*) GENX(TMOVE,SIZEÆDTYPEÅ,EAPOP,EADDIR);
2177 36 EAADIR.REG := A0;
2178 37 GENX(TMOVE,4,EAPOP,EAADIR);
2179 38 STKPTR := STKPTR -2;
2180 39 DPOPCNT := DPOPCNT +2;
2181 40 (*1015E*) END
2182 41 (*1015E*) ELSE IF (DALLOC=2) AND (AALLOC=0)
2183 42 (*1015E*) THEN BEGIN
2184 43 (*1015E*) EAADIR.REG := A0;
2185 44 (*1015E*) GENX(TMOVE,4,EAPOP,EAADIR);
2186 45 (*1015E*) STKPTR := STKPTR -1;
2187 46 (*1015E*) DPOPCNT := DPOPCNT +1;
2188 47 (*1015E*) END;
2189 48 END;
2190 49 IF (OPCODE=XWRV) OR (OPCODE=XWRS)
2191 50 (*1205B*) THEN BEGIN PUSHALLD; STKPTR := STKPTR -2 END;
2192 51 (*1207C*) IF OPCODE = XWRV THEN STKPTR := STKPTR - 1;
2193 52 IF (OPCODE=XPEE)
2194 53 THEN
2195 54 BEGIN
2196 55 IF AALLOC = 0 THEN POPREG(AREG)
2197 56 END;
2198 57 (*MAKE SURE PARAMETERS ARE IN RIGHT PLACE?*)
2199 58 DTYPE := NOTATYP;
2200 59 (*RM*) IF OPCODE <> XEIO THEN LONGBSR
2201 60 ELSE IF AALLOC = 0 THEN BEGIN
2202 61 (* REMOVE FILE POINTER FROM STACK *)
2203 62 EAIMMED.DISPL := 4;
2204 63 EAADIR.REG := SP;
2205 64 GENX(TADD,2,EAIMMED,EAADIR)
2206 65 END;
2207 66 (*RM*) FREEALL ;
2208 67 (*1031A*) IF (OPCODE=XEOL) OR (OPCODE=XEOF) OR (OPCODE=XPOS)
2209 68 (*1031A*) THEN
2210 69 (*1031A*) BEGIN
2211 70 (*1031A*) ALLOCDREG;
2212 71 (*1031A*) IF OPCODE=XPOS
2213 72 (*1031A*) THEN REGTYPEÆDTOPÅ := ITYP
2214 73 (*1031A*) ELSE REGTYPEÆDTOPÅ := BTYP;
2215 74 (*1031A*) END
2216 75 (*RM*) ELSE IF (OPCODE <> XEIO) AND (OPCODE<>XCLO) AND (OPCODE<>XIFD)
2217 76 (*RM*) AND (OPCODE<>XSEE) AND (OPCODE<>XRST) AND (OPCODE<>XRWT)
2218 77 (*RM*) AND (OPCODE<>XRLN) AND (OPCODE<>XWLN)
2219 78 (*1023A*) AND (OPCODE<>XGET) AND (OPCODE<>XPUT)
2220 79 (*1206A*) AND (OPCODE<>XPAG)
2221 80 (*RM*) THEN ALLOCAREG;
2222 81 (*1207H*) IF OPCODE = XAFI THEN STKPTR := STKPTR - 1;
2223 82 END;
2224 END (*PXCLO*) ;
2225
2226 PROCEDURE PXLOD;
2227 0 BEGIN WITH INSTR^ DO BEGIN
2228 1 EFFADDRESS(INSTR,SOURCE);
2229 2 CASE SUBTYPEÆOPCODEÅ OF
2230 3 1 (*LOD*): BEGIN IF DTYPE = ATYP THEN
2231 4 BEGIN
2232 5 OPTIMI := NEXTPCOD(INSTR);
2233 6 IF OPTIMI^.OPCODE=XARG
2234 7 THEN BEGIN GENX(TMOVE,4,SOURCE,EAPUSH);
2235 8 OPTIMI^.INUSE := FALSE END
2236 9 ELSE IF ( OPTIMI^.OPCODE=XSTR)
2237 10 AND ((OPTIMI^.OPAND1=LEVEL)
2238 11 OR (OPTIMI^.OPAND1=0)
2239 12 OR (OPTIMI^.OPAND1=OPAND1))
2240 13 THEN BEGIN
2241 14 EFFADDRESS(OPTIMI,DEST);
2242 15 OPTIMI^.INUSE := FALSE;
2243 16 GENX(TMOVE,4,SOURCE,DEST)
2244 17 END
2245 18 ELSE
2246 19 BEGIN ALLOCAREG;
2247 20 EAADIR.REG := ATOP;
2248 21 GENX(TMOVE,4,SOURCE,EAADIR);
2249 22 END;
2250 23 END
2251 24 ELSE IF NOT (DTYPE IN LONGTYPES) THEN
2252 25 BEGIN
2253 26 OPTIMI := NEXTPCOD(INSTR);
2254 27 EADDIR.REG := DTOP;
2255 28 OPTIMI^.INUSE := FALSE;
2256 29 OPTIM2 := NEXTPCOD(OPTIMI);
2257 30 IF ((OPTIMI^.OPCODE=XAD)
2258 31 OR (OPTIMI^.OPCODE=XSB)
2259 32 OR (OPTIMI^.OPCODE=XAND)
2260 33 OR (OPTIMI^.OPCODE=XIOR))
2261 34 AND (DTOP<>DNONE)
2262 35 THEN BEGIN
2263 36 CASE SUBTYPEÆOPTIMI^.OPCODEÅ OF
2264 37 1: OPCDE := TADD;
2265 38 2: OPCDE := TSUB;
2266 39 3: OPCDE := TAND;
2267 40 4: OPCDE := TOR;
2268 41 END; (*CASE*)
2269 42 GENX(OPCDE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
2270 43 END
2271 44 ELSE IF (OPTIMI^.OPCODE = XLDC)
2272 45 AND (CONDITIONAL(OPTIM2)>0)
2273 46 THEN BEGIN
2274 47 EAIMMED.DISPL := OPTIMI^.OPAND1;
2275 48 IF DTYPE = CTYP
2276 49 THEN EAIMMED.DISPL :=
2277 50 ASCIIÆOPTIMI^.OPSTRING^.VSTRINGAÆ1ÅÅ;
2278 51 IF OPTIMI^.DTYPE=JTYP
2279 52 THEN BEGIN
2280 53 OPAND1 := OPTIMI^.OPAND1;
2281 54 OPAND2 := OPTIMI^.OPAND2;
2282 55 OPAND3 := OPTIMI^.OPAND3;
2283 56 OPAND4 := OPTIMI^.OPAND4;
2284 57 GENX(TCMP,4,EALONG,SOURCE);
2285 58 END
2286 59 ELSE
2287 60 IF EAIMMED.DISPL = 0
2288 61 THEN GENX(TTST,SIZEÆDTYPEÅ,
2289 62 SOURCE,EANONE)
2290 63 ELSE GENX(TCMP,SIZEÆDTYPEÅ,
2291 64 EAIMMED,SOURCE);
2292 65 OPTIM2^.OPAND3 := 200; (*FLAG SET*)
2293 66 END
2294 67 ELSE IF OPTIMI^.OPCODE=XARG
2295 68 THEN GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EAPUSH)
2296 69 ELSE IF OPTIMI^.OPCODE=XSTO
2297 70 THEN BEGIN
2298 71 EADEFER.REG := ATOP;
2299 72 GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADEFER)
2300 73 ;FREEAREG
2301 74 END
2302 75 ELSE IF (OPTIMI^.OPCODE = XSTR)
2303 76 AND ((OPTIMI^.OPAND1 = LEVEL)
2304 77 OR (OPTIMI^.OPAND1 = 0)
2305 78 OR (OPTIMI^.OPAND1 = OPAND1))
2306 79 THEN BEGIN
2307 80 EABASED.DISPL :=OPTIMI^.OPAND2;
2308 81 IF (EABASED.DISPL >=0) AND
2309 82 (OPTIMI^.OPAND1=LEVEL)
2310 83 THEN EABASED.DISPL := EABASED.DISPL+12;
2311 84 IF OPTIMI^.OPAND1 = 0
2312 85 THEN EABASED.REG := A5
2313 86 ELSE IF OPTIMI^.OPAND1 = LEVEL
2314 87 THEN EABASED.REG := A6
2315 88 ELSE EABASED.REG := A4;
2316 89 GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EABASED)
2317 90 END
2318 91 ELSE IF (((OPTIMI^.OPCODE=XINC)
2319 92 OR (OPTIMI^.OPCODE=XDEC))
2320 93 AND ((OPTIM2^.OPCODE=XSTR)
2321 94 AND (OPTIM2^.OPAND1=OPAND1)
2322 95 AND (OPTIM2^.OPAND2=OPAND2)))
2323 96 THEN BEGIN
2324 97 OPTIM2^.INUSE := FALSE;
2325 98 IF OPTIMI^.OPCODE = XDEC
2326 99 THEN OPCDE := TSUB
2327 100 ELSE OPCDE := TADD;
2328 101 EAIMMED.DISPL := OPTIMI^.OPAND1;
2329 102 GENX(OPCDE,SIZEÆDTYPEÅ,EAIMMED,SOURCE)
2330 103 END
2331 104 ELSE IF ( CONDITIONAL(OPTIMI) > 0)
2332 105 AND (DTOP<>DNONE)
2333 106 THEN BEGIN
2334 107 GENX(TCMP,SIZEÆDTYPEÅ,SOURCE,EADDIR);
2335 108 OPTIMI^.OPAND3 := 100; (*SET FLAG *)
2336 109 OPTIMI^.INUSE := TRUE
2337 110 END
2338 111
2339 112 ELSE BEGIN
2340 113 ALLOCDREG;
2341 114 EADDIR.REG := DTOP;
2342 115 GENX(TMOVE,SIZEÆDTYPEÅ,
2343 116 SOURCE,EADDIR) ;
2344 117 OPTIMI^.INUSE:= TRUE
2345 118 END
2346 119 END
2347 120 ELSE (*LONG TYPE: P, S, OR V*)
2348 121 (*RM*) BEGIN IF DTYPE = PTYP THEN OPAND3:=8;
2349 122 IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
2350 123 (*1015D*) PUSHALL;
2351 124 EAADIR.REG := A0;
2352 125 GENX(TLEA,2,SOURCE,EAADIR);
2353 126 IF (AALLOC<>0) OR (DALLOC<>0)
2354 127 THEN ERROR
2355 128 ('REGISTERS NOT EMPTY ');
2356 129 FREEALL;
2357 130 LONGBSR;
2358 131 IF DTYPE = VTYP THEN BEGIN
2359 132 (*604*) PCPRINT;
2360 133 WRITELN(LISTING,' ':10,
2361 134 'DC.W ',OPAND3:0);
2362 135 EAIMMED.DISPL := OPAND3;
2363 136 GENX(TDC,2,EAIMMED,EANONE);
2364 137 END
2365 138 END ELSE
2366 139 LOADBIG(SOURCE,OPAND3 (*SIZE*))
2367 140 (*RM*) END
2368 141 END;
2369 142 2 (*LDA*): BEGIN
2370 143 (*480*) OPTIMI := NEXTPCOD(INSTR);
2371 144 IF (OPTIMI^.OPCODE=XARG) OR (OPTIMI^.OPCODE=XMST)
2372 145 (*480*) OR (((OPTIMI^.OPCODE=XLDC) OR (OPTIMI^.OPCODE=XLOD)
2373 146 (*480*) OR (OPTIMI^.OPCODE=XIND))
2374 147 (*480*) AND (OPTIMI^.DTYPE IN ÆSTYP,VTYPÅ))
2375 148 THEN BEGIN
2376 149 OPTIMI^.INUSE := FALSE;
2377 150 (*480*) IF (OPTIMI^.OPCODE<>XMST)AND(OPTIMI^.OPCODE<>XARG)
2378 151 (*480*) THEN OPTIMI^.INUSE := TRUE;
2379 152 (*480*) IF OPTIMI^.OPCODE <> XARG
2380 153 THEN BEGIN
2381 154 PUSHALL;
2382 155 STKPTR := STKPTR + 1;
2383 156 KINDSTKÆSTKPTRÅ := AREG;
2384 157 TYPESTKÆSTKPTRÅ := ATYP;
2385 158 END;
2386 159 GENX(TPEA,2,SOURCE,EANONE)
2387 160 END ELSE BEGIN
2388 161 ALLOCAREG;
2389 162 EAADIR.REG := ATOP;
2390 163 GENX(TLEA,2,SOURCE,EAADIR)
2391 164 END
2392 165 END;
2393 166 3 (*STR*): BEGIN IF DTYPE = ATYP THEN
2394 167 BEGIN IF AALLOC > 0 THEN
2395 168 BEGIN EAADIR.REG := ATOP;
2396 169 GENX(TMOVE,4,EAADIR,SOURCE);
2397 170 FREEAREG
2398 171 END
2399 172 ELSE BEGIN
2400 173 GENX(TMOVE,4,EAPOP,SOURCE);
2401 174 STKPTR := STKPTR - 1;
2402 175 END
2403 176 END ELSE (*DTYPE <> ATYP*)
2404 177 IF NOT (DTYPE IN LONGTYPES) THEN
2405 178 STORELITTLE
2406 179 (*RM*) ELSE BEGIN
2407 180 (*RM*) IF DTYPE = PTYP THEN OPAND3:=8;
2408 181 IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
2409 182 EADDIR.REG := D0;
2410 183 EAIMMED.DISPL := OPAND3;
2411 184 IF DTYPE = STYP THEN
2412 185 GENX(TMOVE,4,EAIMMED,EADDIR);
2413 186 EAADIR.REG := A0;
2414 187 GENX(TLEA,2,SOURCE,EAADIR);
2415 188 IF (AALLOC<>0) OR (DALLOC<>0)
2416 189 THEN ERROR
2417 190 ('REGISTERS NOT EMPTY ');
2418 191 FREEALL;
2419 192 LONGBSR;
2420 193 IF DTYPE = VTYP THEN BEGIN
2421 194 PCPRINT;
2422 195 WRITELN(LISTING,' ':10,'DC.W ',
2423 196 OPAND3:0);
2424 197 GENX(TDC,2,EAIMMED,EANONE)
2425 198 END
2426 199 END ELSE
2427 200 (*RM*) STOREBIG(SOURCE,OPAND3)
2428 201 (*RM*) END
2429 202 END
2430 203 END
2431 204 END;
2432 END; (*PXLOD*)
2433
2434 PROCEDURE PXIXA;
2435 0 BEGIN WITH INSTR^ DO BEGIN
2436 1 (*T <- T' + T * OPAND1; WHERE T' IS ADDR AND T IS DATA*)
2437 2 IF DALLOC <= 0 THEN POPREG(DREG);
2438 3 EADDIR.REG := DTOP;
2439 4 IF OPAND1 = 2 THEN
2440 5 GENX(TADD,2,EADDIR,EADDIR)
2441 6 (***MORE OPTIMIZATION POSSIBLE FOR SMALL OPAND1'S*)
2442 7 ELSE BEGIN EAIMMED.DISPL := OPAND1;
2443 8 (*OP*) IF OPAND1 <> 1 THEN
2444 9 GENX(TMULS,2,EAIMMED,EADDIR) END;
2445 10 IF AALLOC <= 0 THEN POPREG(AREG);
2446 11 EAADIR.REG := ATOP;
2447 12 (*OP*) EADDIR.REG := DTOP;
2448 13 (*OP*) GENX(TADD,2,EADDIR,EAADIR);
2449 14 FREEDREG;
2450 15 END;
2451 END; (*PXIXA*)
2452
2453 PROCEDURE PXIND;
2454 0 BEGIN WITH INSTR^ DO BEGIN
2455 1 (*T <- MEMÆT + OPAND1Å*)
2456 2 IF AALLOC <= 0 THEN POPREG(AREG);
2457 3 BUILDADDR(SOURCE,BASED,ATOP,ANONE,OPAND1);
2458 4 IF OPAND1 = 0 THEN SOURCE.MODE := DEFER;
2459 5 IF DTYPE = ATYP
2460 6 THEN
2461 7 BEGIN
2462 8 OPTIMI := NEXTPCOD(INSTR);
2463 9 IF OPTIMI^.OPCODE = XSTR
2464 10 THEN
2465 11 BEGIN
2466 12 EFFADDRESS(OPTIMI,DEST);
2467 13 OPTIMI^.INUSE := FALSE;
2468 14 GENX(TMOVE,4,SOURCE,DEST)
2469 15 ;FREEAREG
2470 16 END
2471 17 ELSE
2472 18 BEGIN
2473 19 EAADIR.REG := ATOP;
2474 20 GENX(TMOVE,4,SOURCE,EAADIR)
2475 21 END
2476 22 END
2477 23 ELSE BEGIN
2478 24 IF NOT (DTYPE IN LONGTYPES) THEN
2479 25 BEGIN
2480 26 OPTIMI := NEXTPCOD(INSTR);
2481 27 OPTIMI^.INUSE := FALSE;
2482 28 (*0610A*) IF (DTOP=DNONE) AND ((OPTIMI^.OPCODE=XAD)
2483 29 (*0610A*) OR (OPTIMI^.OPCODE=XSB) OR
2484 30 (*0610A*) (OPTIMI^.OPCODE=XAND) OR
2485 31 (*0610A*) (OPTIMI^.OPCODE=XIOR))
2486 32 (*0610A*) THEN POPREG(DREG);
2487 33 EADDIR.REG := DTOP;
2488 34 FREEAREG;
2489 35 OPTIM2 := NEXTPCOD(OPTIMI);
2490 36 IF OPTIMI^.OPCODE = XARG
2491 37 THEN GENX(TMOVE,SIZEÆDTYPEÅ,
2492 38 SOURCE,EAPUSH)
2493 39 ELSE
2494 40 IF OPTIMI^.OPCODE=XAD
2495 41 THEN GENX(TADD,SIZEÆDTYPEÅ,SOURCE,EADDIR)
2496 42 ELSE IF OPTIMI^.OPCODE=XSB
2497 43 THEN GENX(TSUB,SIZEÆDTYPEÅ,SOURCE,EADDIR)
2498 44 ELSE IF OPTIMI^.OPCODE=XAND
2499 45 THEN GENX(TAND,SIZEÆDTYPEÅ,SOURCE,EADDIR)
2500 46 ELSE IF OPTIMI^.OPCODE=XIOR
2501 47 THEN GENX(TOR,SIZEÆDTYPEÅ,SOURCE,EADDIR)
2502 48 ELSE IF OPTIMI^.OPCODE = XSTR
2503 49 THEN
2504 50 BEGIN
2505 51 EFFADDRESS(OPTIMI,DEST);
2506 52 GENX(TMOVE,SIZEÆDTYPEÅ,
2507 53 SOURCE,DEST)
2508 54 END
2509 55 ELSE IF (OPTIMI^.OPCODE = XLDC)
2510 56 AND (CONDITIONAL(OPTIM2)>0)
2511 57 THEN
2512 58 BEGIN
2513 59 EAIMMED.DISPL :=
2514 60 OPTIMI^.OPAND1;
2515 61 IF DTYPE = CTYP
2516 62 THEN EAIMMED.DISPL :=
2517 63 ASCIIÆOPTIMI^.OPSTRING^.VSTRINGAÆ1ÅÅ;
2518 64 IF OPTIMI^.DTYPE=JTYP
2519 65 THEN BEGIN
2520 66 OPAND1 := OPTIMI^.OPAND1;
2521 67 OPAND2 := OPTIMI^.OPAND2;
2522 68 OPAND3 := OPTIMI^.OPAND3;
2523 69 OPAND4 := OPTIMI^.OPAND4;
2524 70 GENX(TCMP,4,EALONG,SOURCE);
2525 71 END
2526 72 ELSE
2527 73 IF EAIMMED.DISPL = 0
2528 74 THEN GENX(TTST,SIZEÆDTYPEÅ
2529 75 ,SOURCE,EANONE)
2530 76 ELSE GENX(TCMP,SIZEÆDTYPEÅ
2531 77 ,EAIMMED,SOURCE);
2532 78 OPTIM2^.OPAND3 :=200
2533 79 END
2534 80 ELSE BEGIN
2535 81 OPTIMI^.INUSE := TRUE;
2536 82 ALLOCDREG;
2537 83 EADDIR.REG := DTOP;
2538 84 GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
2539 85 END;
2540 86 END
2541 87 ELSE BEGIN IF DTYPE = PTYP THEN OPAND2 :=8;
2542 88 IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
2543 89 FREEAREG;
2544 90 PUSHALL;
2545 91 EAADIR.REG := A0;
2546 92 GENX(TLEA,2,SOURCE,EAADIR);
2547 93 LONGBSR;
2548 94 IF DTYPE = VTYP THEN BEGIN
2549 95 (*604*) PCPRINT;
2550 96 WRITELN(LISTING,' ':10,
2551 97 'DC.W ',OPAND2:0);
2552 98 EAIMMED.DISPL := OPAND2;
2553 99 GENX(TDC,2,EAIMMED,EANONE)
2554 100 END
2555 101 END ELSE BEGIN (*PTYP*)
2556 102 LOADBIG(SOURCE,OPAND2);
2557 103 (*1207E*) IF DTYPE = PTYP THEN FREEAREG;
2558 104 END;
2559 105 END;
2560 106 END
2561 107 END;
2562 END ; (*PXIND*)
2563
2564 PROCEDURE PXSTO;
2565 0 BEGIN WITH INSTR^ DO BEGIN
2566 1 (* MEMÆT'Å <- T *)
2567 2 IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
2568 3 IF (AALLOC<>0) OR (DALLOC<>0) THEN
2569 4 ERROR('REGISTERS NOT EMPTY ');
2570 5 FREEALL;
2571 6 IF DTYPE = STYP THEN BEGIN
2572 7 ALLOCDREG;
2573 8 EAIMMED.DISPL := OPAND1;
2574 9 EADDIR.REG := DTOP;
2575 10 GENX(TMOVE,2,EAIMMED,EADDIR);
2576 11 END;
2577 12 LONGBSR;
2578 13 IF DTYPE = VTYP THEN BEGIN
2579 14 (*604*) PCPRINT;
2580 15 WRITELN(LISTING,'DC.W ',OPAND1:0);
2581 16 EAIMMED.DISPL := OPAND1;
2582 17 GENX(TDC,2,EAIMMED,EANONE)
2583 18 END ELSE
2584 19 FREEDREG;
2585 20 (*1207D*) STKPTR := STKPTR - 1;
2586 21 END ELSE
2587 22 IF DTYPE = PTYP THEN BEGIN
2588 23 WHILE DALLOC<2 DO POPREG(DREG);
2589 24 IF AALLOC < 1 THEN POPREG(AREG);
2590 25 (*1303A*) BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
2591 26 STOREBIG(SOURCE,8);
2592 27 FREEAREG;
2593 28 END ELSE
2594 29 IF DTYPE = ATYP THEN
2595 30 BEGIN WHILE AALLOC < 2 DO POPREG(AREG);
2596 31 EAADIR.REG := ATOP;
2597 32 FREEAREG;
2598 33 BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
2599 34 GENX(TMOVE,4,EAADIR,SOURCE);
2600 35 FREEAREG
2601 36 END
2602 37 ELSE BEGIN IF DALLOC < 1 THEN POPREG(DREG);
2603 38 IF AALLOC < 1 THEN POPREG(AREG);
2604 39 BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
2605 40 STORELITTLE;
2606 41 FREEAREG;
2607 42 END
2608 43 END;
2609 END; (*PXSTO *)
2610
2611 PROCEDURE PXLDC;
2612 VAR J,K: INTEGER;
2613 0 BEGIN WITH INSTR^ DO BEGIN
2614 1 IF DTYPE = ATYP THEN
2615 2 BEGIN ALLOCAREG;
2616 3 EAADIR.REG := ATOP;
2617 4 (*604*) GENX(TMOVE,4,EALONG,EAADIR) (* LOAD 4 CONSTS *)
2618 5 END ELSE
2619 6 (*604*) IF DTYPE = JTYP
2620 7 (*604*) THEN BEGIN
2621 8 (*604*) ALLOCDREG;
2622 9 (*604*) EADDIR.REG := DTOP;
2623 10 (*604*) GENX(TMOVE,4,EALONG,EADDIR)
2624 11 (*604*) END ELSE
2625 12 (*480*) IF DTYPE IN ÆSTYP,VTYPÅ THEN
2626 13 BEGIN
2627 14 (*480*) IF DTYPE = VTYP THEN
2628 15 (*480*) BEGIN
2629 16 (*480*) K := OPSTRING^.STRINGL; (* STRING LEN*)
2630 17 (*480*) (*IF STC THRU HERE *) IF OPCODE = XLDC THEN OPAND3:=OPAND1;
2631 18 (*480*) OPSTRING^.STRINGL := OPAND3; (*VEC *)
2632 19 (*480*) IF K < OPAND3
2633 20 (*480*) THEN FOR J := K + 1 TO OPAND3 DO
2634 21 (*480*) OPSTRING^.VSTRINGAÆJÅ := ' '
2635 22 (*480*) END;
2636 23 PUSHALL;
2637 24 LONGBSR;
2638 25 K := OPSTRING^.STRINGL;
2639 26 EAIMMED.DISPL := K;
2640 27 IF ODD(K) THEN K := K + 1;
2641 28 (*604*) PCPRINT;
2642 29 WRITELN(LISTING,' ':10,'DC.W ',
2643 30 EAIMMED.DISPL:0);
2644 31 GENX(TDC,2,EAIMMED,EANONE);
2645 32 (*604*) PCPRINT;
2646 33 WRITE(LISTING,' ':10,'DC.W ');
2647 34 VSTRINGIMMED(1,K);
2648 35 WRITELN(LISTING,' ');
2649 36 END
2650 37 ELSE
2651 38 (*RM*) IF DTYPE = PTYP THEN
2652 39 (*RM*) LOADPSET
2653 40 (*RM*) ELSE
2654 41 BEGIN
2655 42 IF DTYPE = CTYP THEN
2656 43 EAIMMED.DISPL := ASCIIÆOPSTRING^.VSTRINGAÆ1ÅÅ
2657 44 ELSE
2658 45 EAIMMED.DISPL := OPAND1;
2659 46 OPTIMI := NEXTPCOD(INSTR);
2660 47 OPTIMI^.INUSE := FALSE;
2661 48 IF (OPTIMI^.OPCODE=XARG) OR (OPTIMI^.OPCODE=XEXI)
2662 49 OR (OPTIMI^.OPCODE=XWRS) OR (OPTIMI^.OPCODE=XWRV)
2663 50 THEN BEGIN
2664 51 IF (OPTIMI^.OPCODE=XWRS) OR (OPTIMI^.OPCODE=XWRV)
2665 52 THEN PUSHALLD;
2666 53 IF OPTIMI^.OPCODE<>XARG THEN BEGIN
2667 54 OPTIMI^.INUSE := TRUE;
2668 55 OPTIMI^.DTYPE := DTYPE
2669 56 (*1205B*) ;
2670 57 (*1205B*) IF OPTIMI^.OPCODE<>XEXI THEN BEGIN
2671 58 (*1205B*) STKPTR := STKPTR +1;
2672 59 (*1205B*) TYPESTKÆSTKPTRÅ := DTYPE;
2673 60 (*1205B*) KINDSTKÆSTKPTRÅ := DREG;
2674 61 (*1205B*) END END;
2675 62 GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EAPUSH)
2676 63 ; OPTIMI^.DTYPE := NOTATYP
2677 64 END
2678 65 ELSE IF OPTIMI^.OPCODE=XSTO
2679 66 THEN BEGIN
2680 67 EADEFER.REG := ATOP;
2681 68 GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EADEFER)
2682 69 ;FREEAREG
2683 70 END
2684 71 ELSE IF (OPTIMI^.OPCODE = XSTR)
2685 72 AND ((OPTIMI^.OPAND1 = LEVEL)
2686 73 OR (OPTIMI^.OPAND1 = 0))
2687 74 THEN BEGIN
2688 75 EABASED.DISPL := OPTIMI^.OPAND2;
2689 76 IF (EABASED.DISPL>=0) AND (OPTIMI^.OPAND1=LEVEL)
2690 77 THEN EABASED.DISPL := EABASED.DISPL+12;
2691 78 IF OPTIMI^.OPAND1 = 0
2692 79 THEN EABASED.REG := A5
2693 80 ELSE EABASED.REG := A6;
2694 81 GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EABASED)
2695 82 END
2696 83 ELSE IF (CONDITIONAL(OPTIMI) > 0)
2697 84 AND (DTOP<>DNONE)
2698 85 THEN BEGIN
2699 86 EADDIR.REG := DTOP;
2700 87 IF EAIMMED.DISPL=0 THEN
2701 88 GENX(TTST,SIZEÆDTYPEÅ,EADDIR,EANONE)
2702 89 ELSE
2703 90 GENX(TCMP,SIZEÆDTYPEÅ,EAIMMED,EADDIR);
2704 91 OPTIMI^.OPAND3 := 100; (* SET FLAG *)
2705 92 OPTIMI^.INUSE := TRUE
2706 93 END
2707 94 ELSE IF OPTIMI^.OPCODE=XIXA
2708 95 THEN BEGIN
2709 96 EAIMMED.DISPL := OPAND1 * OPTIMI^.OPAND1;
2710 97 EAADIR.REG := ATOP;
2711 98 GENX(TADD,2,EAIMMED,EAADIR)
2712 99 END
2713 100 ELSE
2714 101 BEGIN
2715 102 ALLOCDREG;
2716 103 OPTIMI^.INUSE := TRUE;
2717 104 EADDIR.REG := DTOP;
2718 105 GENX(TMOVE ,2,EAIMMED,EADDIR);
2719 106 END
2720 107 END
2721 108 END;
2722 END; (*PXLDC*)
2723
2724 (*480*) PROCEDURE PXSTC;
2725 0 (*480*) BEGIN WITH INSTR^ DO BEGIN
2726 1 (*480*) EFFADDRESS(INSTR,SOURCE);
2727 2 (*480*) PUSHALL;
2728 3 (*480*) EAADIR.REG := A0;
2729 4 (*480*) GENX(TLEA,2,SOURCE,EAADIR);
2730 5 (*480*) PXLDC (* LET LOAD CONSTANT PROCESSOR DO REST *)
2731 6 (*480*) END (* WITH *)
2732 (*480*) END; (*PXSTC*)
2733
2734 PROCEDURE PXLTA;
2735 0 BEGIN WITH INSTR^ DO BEGIN
2736 1 ALLOCAREG;
2737 2 EAADIR.REG := SP;
2738 3 BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
2739 4 GENX(TMOVE,4,EAADIR,SOURCE)
2740 5 END;
2741 END; (*PXLTA*)
2742
2743 PROCEDURE PXLCA;
2744 0 BEGIN
2745 1 ;(*LEAVE INDICATION TO ALLOCATE STORAGE AT END
2746 2 OF THIS BLOCK; GEN LEA ATOP WITH PC^(DISPL)*)
2747 END; (* PXLCA*)
2748
2749 PROCEDURE PXISC;
2750 0 BEGIN WITH INSTR^ DO BEGIN
2751 1 EAIMMED.DISPL := 1;
2752 2 EADEFER.REG := A5;
2753 3 GENX(TADD,4,EAIMMED,EADEFER) (*'SC' IS ^A5*)
2754 4 END;
2755 END; (*PXISC*)
2756
2757 PROCEDURE PXLSC;
2758 0 BEGIN WITH INSTR^ DO BEGIN
2759 1 EAIMMED.DISPL := OPAND1;
2760 2 EADEFER.REG := A5;
2761 3 GENX(TMOVE,4,EAIMMED,EADEFER) (*'SC' IS ^A5*)
2762 4 END;
2763 END; (*PXLSC*)
2764
2765 PROCEDURE PXEQU;
2766 VAR FLAG: BOOLEAN; (* TRUE MEANS NO DREG WAS ALLOC YET *)
2767 0 BEGIN WITH INSTR^ DO BEGIN
2768 1 FLAG := FALSE;
2769 2 IF OPAND3 = 200
2770 3 THEN BEGIN
2771 4 FLAG := TRUE;
2772 5 OPAND3 := 100
2773 6 END;
2774 7 IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
2775 8 LONGBSR;
2776 9 IF DTYPE = VTYP
2777 10 THEN
2778 11 BEGIN
2779 12 EAIMMED.DISPL := OPAND1; (* VEC LEN *)
2780 13 (*604*) PCPRINT;
2781 14 IF DEBUG <> 0 THEN
2782 15 WRITELN(LISTING,' ':10,'DC.W ',
2783 16 OPAND1:0);
2784 17 GENX(TDC,2,EAIMMED,EANONE)
2785 18 (*604*) END;
2786 19 IF (AALLOC<>0) OR (DALLOC<>0) THEN
2787 20 ERROR('REGISTERS NOT EMPTY ');
2788 21 FREEALL;
2789 22 ALLOCDREG;
2790 23 (*0326A*) REGTYPEÆDTOPÅ := BTYP;
2791 24 END ELSE IF DTYPE = PTYP THEN BEGIN
2792 25 WHILE DALLOC < 4 DO POPREG(DREG);
2793 26 (*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
2794 27 WHEN ONE ARGUMENT IS A CONSTANT*)
2795 28 CASE SUBTYPEÆOPCODEÅ OF
2796 29 1 (*EQU*) : OPCDE := TEOR;
2797 30 2 (*NEQ*) : OPCDE := TEOR;
2798 31 4 (*LEQ*) : BEGIN
2799 32 OPCDE := TAND;
2800 33 EADDIR.REG := DTOP;
2801 34 GENX(TCOMP,4,EADDIR,EANONE);
2802 35 EADDIR.REG := PREVIOUS(DTOP);
2803 36 GENX(TCOMP,4,EADDIR,EANONE);
2804 37 END;
2805 38 6 (*GEQ*) : BEGIN
2806 39 OPCDE := TAND;
2807 40 EADDIR.REG :=
2808 41 PREVIOUS(PREVIOUS(DTOP));
2809 42 GENX(TCOMP,4,EADDIR,EANONE);
2810 43 EADDIR.REG :=
2811 44 PREVIOUS(PREVIOUS(PREVIOUS(DTOP)));
2812 45 GENX(TCOMP,4,EADDIR,EANONE);
2813 46 END;
2814 47 END; (*CASE*)
2815 48 BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
2816 49 FREEDREG;
2817 50 BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),ANONE,0);
2818 51 GENX(OPCDE,4,SOURCE,DEST);
2819 52 SOURCE.REG := DTOP;
2820 53 FREEDREG;
2821 54 DEST.REG := PREVIOUS(DTOP);
2822 55 GENX(OPCDE,4,SOURCE,DEST);
2823 56 SOURCE.REG := DTOP;
2824 57 FREEDREG;
2825 58 DEST.REG := DTOP;
2826 59 GENX(TOR,4,SOURCE,DEST);
2827 60 SWITCH := FALSE;
2828 61 IF OPCODE <> XNEQ THEN OPCODE := XEQU;
2829 62 END ELSE BEGIN
2830 63 OPTIMI := NEXTPCOD(INSTR);
2831 64 SWITCH := FALSE;
2832 65 IF OPAND3<>100 THEN BEGIN (*CMP ALREADY DONE*)
2833 66 DOUBLEOP(SOURCE,DEST,TRUE(*COMMUTATIVITY*),SWITCH);
2834 67 K := SIZEÆDTYPEÅ;
2835 68 GENX(TCMP,K,SOURCE,DEST);
2836 69 (*1207A*) IF DTYPE = ATYP THEN FREEAREG;
2837 70 END
2838 71 END;
2839 72 IF DTYPE <> STYP THEN BEGIN
2840 73 EADDIR.REG := DTOP;
2841 74 CASE SUBTYPEÆOPCODEÅ OF
2842 75 1 (*EQU*) : OPCDE:=TSEQ;
2843 76 2 (*NEQ*) : OPCDE:=TSNE;
2844 77 3 (*LES*) : IF SWITCH THEN
2845 78 OPCDE:=TSGT
2846 79 ELSE OPCDE:=TSLT;
2847 80 4 (*LEQ*) : IF SWITCH THEN
2848 81 OPCDE:=TSGE
2849 82 ELSE OPCDE:=TSLE;
2850 83 5 (*GRT*) : IF SWITCH THEN
2851 84 OPCDE:=TSLT
2852 85 ELSE OPCDE:=TSGT;
2853 86 6 (*GEQ*) : IF SWITCH THEN
2854 87 OPCDE:=TSLE
2855 88 ELSE OPCDE:=TSGE;
2856 89 END;
2857 90 (*RM*) IF DTYPE = ATYP THEN BEGIN
2858 91 (*RM*) ALLOCDREG;
2859 92 (*RM*) EADDIR.REG := DTOP
2860 93 (*RM*) END;
2861 94 IF OPTIMI = NIL THEN OPTIMI:=INSTR; (*FORCE NOTEQ*)
2862 95 IF OPTIMI^.OPCODE = XFJP
2863 96 THEN
2864 97 BEGIN
2865 98 OPTIMI^.OPAND3 := 100 + CONDITIONAL(INSTR)
2866 99 ;IF FLAG
2867 100 THEN OPTIMI^.OPAND3 := OPTIMI^.OPAND3 + 100
2868 101 END
2869 102 ELSE BEGIN
2870 103 IF FLAG
2871 104 THEN BEGIN
2872 105 ALLOCDREG;
2873 106 EADDIR.REG := DTOP
2874 107 END;
2875 108 IF DTYPE <> VTYP
2876 109 THEN
2877 110 BEGIN
2878 111 GENX(OPCDE,2,EADDIR,EANONE);
2879 112 REGTYPEÆDTOPÅ := BTYP;
2880 113 GENX(TNEG,1,EADDIR,EANONE)
2881 114 END
2882 115 END
2883 116 END;
2884 117 END;
2885 END; (*PXEQU*)
2886
2887 PROCEDURE PXSTP;
2888 0 BEGIN WITH INSTR^ DO BEGIN
2889 1 PUSHALL;
2890 2 (*PUSH ZERO ARGUMENT ON STACK*)
2891 3 GENX(TCLR,2,EAPUSH,EANONE);
2892 4 EAIMMED.DISPL := 14;
2893 5 GENX(TTRAP,2,EAIMMED,EANONE);
2894 6 EAIMMED.DISPL := 3;
2895 7 GENX(TDC,2,EAIMMED,EANONE);
2896 8 END;
2897 END; (*PXSTP*)
2898
2899 PROCEDURE PXEXI;
2900 0 BEGIN WITH INSTR^ DO BEGIN
2901 1 PUSHALL;
2902 2 (*EXIT ARGUMENT ALREADY ON STACK*)
2903 3 EAIMMED.DISPL := 14;
2904 4 GENX(TTRAP,2,EAIMMED,EANONE);
2905 5 EAIMMED.DISPL := OPAND1 + 3;
2906 6 GENX(TDC,2,EAIMMED,EANONE);
2907 7 END;
2908 END; (*PXEXI*)
2909
2910 PROCEDURE PXDIS;
2911 0 BEGIN WITH INSTR^ DO BEGIN
2912 1 IF AALLOC < 1 THEN POPREG(AREG);
2913 2 (*604*) LONGBSR;
2914 3 (*604*) EAIMMED.DISPL := OPAND1;
2915 4 (*604*) PCPRINT;
2916 5 (*604*) WRITELN(LISTING,' ':10,'DC.W ',OPAND1:0);
2917 6 (*604*) GENX(TDC,2,EAIMMED,EANONE);
2918 7 FREEAREG;
2919 8 END;
2920 END; (*PXDIS*)
2921
2922 PROCEDURE PXNEW;
2923 0 BEGIN WITH INSTR^ DO BEGIN
2924 1 (*RM*) (*HEAP POINTER IS ^A5(4) *)
2925 2 IF AALLOC < 1 THEN POPREG(AREG);
2926 3 (*604*) LONGBSR;
2927 4 (*604*) EAIMMED.DISPL := OPAND1; (* LENGTH TO ALLOC *)
2928 5 (*604*) PCPRINT;
2929 6 (*604*) WRITELN(LISTING,' ':10,'DC.W ',OPAND1:0);
2930 7 (*604*) GENX(TDC,2,EAIMMED,EANONE);
2931 8 (*604*) FREEAREG;
2932 9 END;
2933 END; (*PXNEW*)
2934
2935 PROCEDURE PXMRK;
2936 0 BEGIN WITH INSTR^ DO BEGIN
2937 1 IF AALLOC < 1 THEN POPREG(AREG);
2938 2 (*604*) LONGBSR;
2939 3 FREEAREG;
2940 4 END;
2941 END; (*PXMRK*)
2942
2943 PROCEDURE PXRLS;
2944 0 BEGIN WITH INSTR^ DO BEGIN
2945 1 (*604*) IF AALLOC < 1 THEN POPREG(AREG);
2946 2 (*604*) LONGBSR;
2947 3 (*604*) FREEAREG;
2948 4 END;
2949 END; (*PXRLS*)
2950
2951 PROCEDURE PXMST;
2952 0 BEGIN
2953 1 PUSHALL;
2954 END; (*PXMST*)
2955
2956 PROCEDURE PXARG;
2957 0 BEGIN WITH INSTR^ DO BEGIN
2958 1 (*604*) IF OPAND1 <> 0 THEN BEGIN
2959 2 (*RM*) IF (DALLOC=2) AND (DTYPE=PTYP) THEN
2960 3 (*1205A*) BEGIN
2961 4 (*1205A*) EADDIR.REG := DTOP;
2962 5 (*1205A*) GENX(TMOVE,4,EADDIR,EAPUSH);
2963 6 (*1205A*) EADDIR.REG := DBOT;
2964 7 (*1205A*) GENX(TMOVE,4,EADDIR,EAPUSH);
2965 8 (*1205A*) FREEDREG;FREEDREG
2966 9 (*1205A*) END;
2967 10 (*1205G*) IF (NOT (DTYPE IN LONGTYPES)) AND (DALLOC=0) AND (AALLOC=0)
2968 11 (*1205G*) THEN STKPTR := STKPTR -1;
2969 12 (*RM*) IF AALLOC = 1 THEN BEGIN PUSHAREG;
2970 13 STKPTR:=STKPTR-1 END;
2971 14 (*RM*) IF DALLOC = 1 THEN BEGIN PUSHDREG;
2972 15 STKPTR := STKPTR -1 END;
2973 16 IF (DALLOC <> 0) OR (AALLOC <> 0)
2974 17 THEN ERROR('STK NONEMPTY IN ARG ')
2975 18 (*604*) END
2976 19 END;
2977 END; (*PXARG*)
2978
2979 PROCEDURE PXAST;
2980 0 BEGIN WITH INSTR^ DO BEGIN
2981 1 (*ASSUMES PREVIOUS 'MST' HAS DONE PUSHALL*)
2982 2 IF ODD(OPAND1) THEN OPAND1:=OPAND1+1;
2983 3 EAIMMED.DISPL := OPAND1;(*SHOULD BE LONG #*)
2984 4 EAADIR.REG := SP;
2985 5 GENX(TSUB,4,EAIMMED,EAADIR);
2986 6 (*0416A*) IF NOT (DTYPE IN LONGTYPES) THEN BEGIN
2987 7 STKPTR := STKPTR +1;
2988 8 IF STKPTR>STKMAX THEN
2989 9 ERROR('TOO MANY REG PUSHES ');
2990 10 IF OPAND1=4 THEN KINDSTKÆSTKPTRÅ
2991 11 := AREG ELSE KINDSTKÆSTKPTRÅ
2992 12 := DREG;
2993 13 IF OPAND1=4 THEN TYPESTKÆSTKPTRÅ:=ATYP
2994 14 ELSE IF OPAND1=2 THEN TYPESTKÆSTKPTRÅ:=ITYP
2995 15 ELSE IF OPAND1=1 THEN TYPESTKÆSTKPTRÅ:=BTYP
2996 16 ELSE IF OPAND1=8 THEN TYPESTKÆSTKPTRÅ:=PTYP
2997 17 ELSE TYPESTKÆSTKPTRÅ:=VTYP;
2998 18 IF DTYPE <> NOTATYP THEN BEGIN
2999 19 TYPESTKÆSTKPTRÅ:=DTYPE;
3000 20 IF DTYPE = ATYP
3001 21 THEN KINDSTKÆSTKPTRÅ := AREG
3002 22 ELSE KINDSTKÆSTKPTRÅ := DREG;
3003 23 END;
3004 24 (*0416A*) END; (* LONGTYPES CODE *)
3005 25 END;
3006 END; (*PXAST*)
3007
3008 PROCEDURE PXMOV;
3009 0 BEGIN WITH INSTR^ DO BEGIN
3010 1 WHILE AALLOC < 2 DO POPREG(AREG);
3011 2 IF OPCODE = XMOV THEN
3012 3 BEGIN ALLOCDREG;
3013 4 EAIMMED.DISPL := OPAND1;
3014 5 EADDIR.REG := DTOP;
3015 6 GENX(TMOVE,2,EAIMMED,EADDIR)
3016 7 END
3017 8 ELSE IF DALLOC < 1 THEN POPREG(DREG);
3018 9 (*BYTE COUNT IS NOW IN DTOP*)
3019 10 BUILDADDR(SOURCE,INCR,ATOP,ANONE,0);
3020 11 FREEAREG;
3021 12 BUILDADDR(DEST,INCR,ATOP,ANONE,0);
3022 13 (*RM*) GENX(TMOVE,1,SOURCE,DEST);
3023 14 (*ONLY MOVES BYTE AT A TIME NOW*)(*FIX LIKE '_BIG'*)
3024 15 EADDIR.REG := DTOP;
3025 16 (*RM*) EAIMMED.DISPL := 1;
3026 17 (*RM*) GENX(TSUB,2,EAIMMED,EADDIR);
3027 18 (*RM*) EAREL.DISPL := -4;
3028 19 (*RM*) GENX(TBNE,0,EAREL,EANONE);
3029 20 FREEAREG;FREEDREG;
3030 21 END;
3031 END; (*PXMOV*)
3032
3033 PROCEDURE PXCUP;
3034 0 BEGIN WITH INSTR^ DO BEGIN
3035 1 IF NOT PROCTABLEÆCURRLABELÅ.DEFINED THEN
3036 2 BEGIN
3037 3 LTEMP := PC;
3038 4 SAD(LTEMP, 2);
3039 5 REFERENCELABEL(CURRLABEL,LTEMP)
3040 6 END;
3041 7 PROCTABLEÆCURRLABELÅ.REFED := TRUE;
3042 8 PUSHALL;
3043 9 LTEMP := PROCTABLEÆCURRLABELÅ.LOCATION ;
3044 10 LSB(LTEMP, PC);
3045 11 IF SHORT(LTEMP) THEN BEGIN
3046 12 LASGN(EAREL.DISPL, LTEMP);
3047 13 IF (EAREL.DISPL >-128) AND (EAREL.DISPL < 127) THEN
3048 14 BEGIN
3049 15 EALAB.DISPL := CURRLABEL;
3050 16 GENX(TBSR, 2,EALAB,EANONE) ;
3051 17 END
3052 18 ELSE BEGIN
3053 19 EALAB.DISPL := CURRLABEL;
3054 20 GENX(TLBSR,2,EALAB,EANONE);
3055 21 END;
3056 22 END ELSE
3057 23 BEGIN
3058 24 EADEFER.REG := A3;
3059 25 GENX(TJSR,2,EADEFER,EANONE);
3060 26 (*604*) PCPRINT;
3061 27 WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
3062 28 SSB(LTEMP,2);
3063 29 PLINT(LISTING,LTEMP);
3064 30 WRITELN(LISTING,' ');
3065 31 FOR K := 0 TO 3 DO
3066 32 BEGIN
3067 33 EAIMMED.DISPL := LTEMPÆKÅ;
3068 34 GENX(TDC,1,EAIMMED,EANONE)
3069 35 END
3070 36 END
3071 37 END;
3072 END; (*PXCUP*)
3073
3074 PROCEDURE PXVJP;
3075 0 BEGIN WITH INSTR^ DO BEGIN
3076 1 (*604*) PCPRINT;
3077 2 (*RM*) WRITELN(LISTING,' ':10,'DC.W L',
3078 3 (*RM*) OPAND1 + LABELOFFSET:0,'-L',
3079 4 (*RM*) LASTLABEL + LABELOFFSET:0); (* GENX!!*)
3080 5 IF LABELTABLEÆOPAND1Å.DEFINED
3081 6 THEN
3082 7 BEGIN
3083 8 LTEMP := LABELTABLEÆOPAND1Å.LOCATION;
3084 9 LSB(LTEMP,LABELTABLEÆLASTLABELÅ.LOCATION);
3085 10 LASGN(EAIMMED.DISPL, LTEMP)
3086 11 END
3087 12 ELSE
3088 13 BEGIN
3089 14 LTEMP := LABELTABLEÆLASTLABEL-1Å.LOCATION;
3090 15 LSB(LTEMP,LABELTABLEÆLASTLABEL-2Å.LOCATION);
3091 16 SAD(LTEMP,1);
3092 17 SHL(LTEMP,1); (*TIMES 2*)
3093 18 (*0401A*)
3094 19 LASGN(EAIMMED.DISPL,LTEMP)
3095 20 END;
3096 21 GENX(TDC,2,EAIMMED,EANONE);
3097 22 (*RM*) END;
3098 END; (*PXVJP*)
3099
3100 PROCEDURE PXUJP;
3101 VAR FLAG: BOOLEAN; (* INDICATES THAT CMP ALREADY DONE *)
3102 0 BEGIN WITH INSTR^ DO BEGIN
3103 1 FLAG := OPAND3 >= 200;
3104 2 IF FLAG THEN OPAND3 := OPAND3 - 100;
3105 3 IF LABELTABLEÆOPAND1Å.DEFINED = TRUE
3106 4 THEN
3107 5 BEGIN
3108 6 LTEMP := LABELTABLEÆOPAND1Å.LOCATION;
3109 7 LSB(LTEMP, PC);
3110 8 SSB(LTEMP,2);
3111 9 LASGN(K, LTEMP)
3112 10 END
3113 11 ELSE K := 200;
3114 12 CASE SUBTYPEÆOPCODEÅ OF
3115 13 1 (*UJP*) : BEGIN OPCDE := TBRA;
3116 14 IF (K<-127) OR (K>127) THEN OPCDE := TLBRA END;
3117 15 2 (*FJP*) : BEGIN OPCDE := TBEQ ;
3118 16 IF (K<-127) OR (K>127) THEN OPCDE := TLBEQ ;
3119 17 IF (DALLOC = 0) AND (OPAND3 < 100)
3120 18 THEN POPREG(DREG);
3121 19 END
3122 20 END;
3123 21 BUILDADDR(SOURCE,LABELLED,ANONE,ANONE,OPAND1);
3124 22 IF OPAND3 >100
3125 23 THEN BEGIN
3126 24 OPAND3 := OPAND3 - 100;
3127 25 IF SWITCH THEN
3128 26 BEGIN
3129 27 IF (OPAND3=3) OR (OPAND3=4) THEN OPAND3:=OPAND3+2
3130 28 ELSE IF (OPAND3=5) OR (OPAND3=6) THEN OPAND3:=OPAND3-2;
3131 29 END ;
3132 30 CASE OPAND3 OF
3133 31 1: ; (* NEQ ALREADY TURNED AROUND *)
3134 32 2: IF OPCDE = TBEQ THEN OPCDE := TBNE
3135 33 ELSE OPCDE := TLBNE;
3136 34 3: IF OPCDE = TBEQ THEN OPCDE := TBGE
3137 35 ELSE OPCDE := TLBGE;
3138 36 4: IF OPCDE = TBEQ THEN OPCDE := TBGT
3139 37 ELSE OPCDE := TLBGT;
3140 38 5: IF OPCDE = TBEQ THEN OPCDE := TBLE
3141 39 ELSE OPCDE := TLBLE;
3142 40 6: IF OPCDE = TBEQ THEN OPCDE := TBLT
3143 41 ELSE OPCDE := TLBLT;
3144 42 END; (*CASE*)
3145 43 END;
3146 44 GENX(OPCDE,0,SOURCE,EANONE) ;
3147 45 IF LABELTABLEÆOPAND1Å.DEFINED = FALSE THEN
3148 46 BEGIN
3149 47 LTEMP := PC;
3150 48 SSB(LTEMP, 2);
3151 49 REFERENCELABEL(OPAND1,LTEMP);
3152 50 END;
3153 51 IF (OPCODE = XFJP) AND (NOT FLAG) THEN FREEDREG;
3154 52 END;
3155 END; (*PXUJP*)
3156
3157 PROCEDURE PXDIF;
3158 0 BEGIN
3159 1 (*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
3160 2 WHEN ONE ARGUMENT IS A CONSTANT *)
3161 3 SETOPS;
3162 END; (*PXDIF*)
3163
3164 (*604*) PROCEDURE PXSPOS;
3165 0 (*604*) BEGIN
3166 1 (*604*) WITH INSTR^ DO
3167 2 (*604*) BEGIN
3168 3 (*604*) LONGBSR;
3169 4 (*604*) IF OPCODE <> XSCON
3170 5 THEN BEGIN
3171 6 DTYPE := ITYP;
3172 7 ALLOCDREG
3173 8 END
3174 9 (*604*) END
3175 (*604*) END; (* PXSPOS *)
3176
3177 PROCEDURE PXSDEL;
3178 0 BEGIN
3179 1 WITH INSTR^ DO
3180 2 BEGIN
3181 3 IF DALLOC = 0
3182 4 THEN BEGIN
3183 5 EADDIR.REG := D1;
3184 6 GENX(TMOVE,2,EAPOP,EADDIR);
3185 7 EADDIR.REG := D0;
3186 8 GENX(TMOVE,2,EAPOP,EADDIR);
3187 9 STKPTR := STKPTR - 2;
3188 10 DPOPCNT := DPOPCNT + 2
3189 11 END ELSE
3190 12 IF DALLOC = 1
3191 13 THEN BEGIN
3192 14 BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
3193 15 EADDIR.REG := D1;
3194 16 GENX(TMOVE,2,SOURCE,EADDIR);
3195 17 EADDIR.REG := D0;
3196 18 GENX(TMOVE,2,EAPOP,EADDIR);
3197 19 STKPTR := STKPTR - 1;
3198 20 DPOPCNT := DPOPCNT + 1
3199 21 END;
3200 22 LONGBSR
3201 23 END;
3202 24 FREEDREG;FREEDREG
3203 END; (* PXSDEL *)
3204
3205 (*604*) PROCEDURE PXSINS;
3206 0 BEGIN
3207 1 WITH INSTR^ DO
3208 2 BEGIN
3209 3 IF DALLOC = 0 THEN POPREG(DREG);
3210 4 IF DTOP <> D0
3211 5 THEN BEGIN
3212 6 BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
3213 7 EADDIR.REG := D0;
3214 8 GENX(TMOVE,2,SOURCE,EADDIR)
3215 9 END;
3216 10 LONGBSR;
3217 11 FREEDREG;
3218 12 END
3219 END; (* PXSINS *)
3220
3221
3222 PROCEDURE PXINN;
3223 0 BEGIN WITH INSTR^ DO BEGIN
3224 1 WHILE DALLOC < 3 DO POPREG(DREG);
3225 2 (* THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
3226 3 WHERE ONE ARGUMENT IS A CONSTANT*)
3227 4 (*RM*) EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
3228 5 EAIMMED.DISPL := 32;
3229 6 (*RM*) GENX(TCMP,1,EAIMMED,EADDIR);
3230 7 (*RM*) EAREL.DISPL := 6;
3231 8 (*RM*) GENX(TBLT,0,EAREL,EANONE);
3232 9 BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),DNONE,0);
3233 10 GENX(TBTST,0,EADDIR,DEST);
3234 11 (*RM*) EAREL.DISPL := 4;
3235 12 (*RM*) GENX(TBRA,0,EAREL,EANONE);
3236 13 (*RM*) BUILDADDR(DEST,DDIRECT,DTOP,DNONE,0);
3237 14 GENX(TBTST,0,EADDIR,DEST);
3238 15 FREEDREG; FREEDREG;
3239 16 EADDIR.REG := DTOP;
3240 17 (*RM*) GENX(TSNE,0,EADDIR,EANONE);
3241 18 (*1015A*) GENX(TNEG,1,EADDIR,EANONE);
3242 19 (*1323A*) REGTYPEÆDTOPÅ := BTYP;
3243 20 END;
3244 END; (*PXINN*)
3245
3246 PROCEDURE PXSGS;
3247 0 BEGIN WITH INSTR^ DO BEGIN
3248 1 IF DALLOC < 1 THEN POPREG(DREG);
3249 2 (*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
3250 3 WHEN ONE ARGUMENT IS A CONSTANT*)
3251 4 (*RM*) ALLOCDREG;ALLOCDREG;
3252 5 (*RM*) EADDIR.REG := DTOP;
3253 6 (*RM*) GENX(TCLR,4,EADDIR,EANONE);
3254 7 (*RM*) EADDIR.REG := PREVIOUS(DTOP);
3255 8 (*RM*) GENX(TCLR,4,EADDIR,EANONE);
3256 9 (*RM*) EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
3257 10 (*RM*) EAIMMED.DISPL := 32;
3258 11 (*RM*) GENX(TCMP,1,EAIMMED,EADDIR);
3259 12 (*RM*) EAREL.DISPL := 6;
3260 13 (*1204A*) GENX(TBGE,0,EAREL,EANONE);
3261 14 (*RM*) BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),DNONE,0);
3262 15 (*RM*) GENX(TBSET,0,EADDIR,DEST);
3263 16 (*RM*) EAREL.DISPL := 4;
3264 17 (*RM*) GENX(TBRA,0,EAREL,EANONE);
3265 18 (*RM*) BUILDADDR(DEST,DDIRECT,DTOP,DNONE,0);
3266 19 (*RM*) GENX(TBSET,0,EADDIR,DEST);
3267 20 (*1204A*) GENX(TMOVE,4,DEST,EADDIR);
3268 21 (*1204A*) FREEDREG;
3269 22 END;
3270 END; (*PXSGS*)
3271
3272 PROCEDURE PXCHK;
3273 0 BEGIN
3274 1 WITH INSTR^ DO
3275 2 BEGIN
3276 3 EADDIR.REG := D7; (* USE D7 FOR CHECKING *)
3277 4 SOURCE := EADDIR;
3278 5 (*604*) IF ((DTYPE<>ATYP) AND (DTOP=DNONE)) OR ((DTYPE=ATYP) AND (ATOP=ANONE))
3279 6 THEN BEGIN
3280 7 SOURCE.REG := A7;
3281 8 SOURCE.MODE := DEFER
3282 9 END
3283 10 (*604*) ELSE IF DTYPE=ATYP THEN BEGIN
3284 11 (*604*) SOURCE.REG := ATOP;
3285 12 (*604*) SOURCE.MODE := ADIRECT
3286 13 (*604*) END
3287 14 (*604*) ELSE SOURCE.REG := DTOP;
3288 15 (*604*) GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
3289 16 IF SIZEÆDTYPEÅ = 1
3290 17 THEN GENX(TEXTE,2,EADDIR,EANONE);
3291 18 (*604*) IF DTYPE IN ÆATYP,JTYPÅ
3292 19 (*604*) THEN BEGIN OPAND1:=1; OPAND2:=1 END; (* FAKE OUT NEXT INSTRS*)
3293 20 IF OPAND2 = 0
3294 21 THEN BEGIN
3295 22 GENX(TNEG,2,EADDIR,EANONE);
3296 23 EAIMMED.DISPL := -OPAND1
3297 24 END;
3298 25 IF OPAND1 = 0 THEN EAIMMED.DISPL := OPAND2;
3299 26 IF (OPAND1=0) OR (OPAND2=0)
3300 27 THEN GENX(TCHK,2,EAIMMED,EADDIR)
3301 28 ELSE
3302 29 (*604*) IF NOT (DTYPE IN ÆJTYP,ATYPÅ)
3303 30 (*604*) THEN BEGIN
3304 31 SASGN(LTEMP,OPAND2);
3305 32 IF OPAND1 > 0
3306 33 THEN SAD (LTEMP,OPAND1)
3307 34 ELSE SSB(LTEMP,OPAND1);
3308 35 IF SHORT(LTEMP)
3309 36 THEN BEGIN
3310 37 EAIMMED.DISPL := OPAND1;
3311 38 GENX(TSUB,2,EAIMMED,EADDIR);
3312 39 EAIMMED.DISPL := OPAND2 - OPAND1;
3313 40 GENX(TCHK,2,EAIMMED,EADDIR)
3314 41 END
3315 42 ELSE BEGIN
3316 43 EAIMMED.DISPL := OPAND1;
3317 44 GENX(TCMP,2,EAIMMED,EADDIR);
3318 45 EAREL.DISPL := 8;
3319 46 GENX(TBLT,0,EAREL,EANONE);
3320 47 EAIMMED.DISPL := OPAND2;
3321 48 GENX(TCMP,2,EAIMMED,EADDIR);
3322 49 EAREL.DISPL := 2;
3323 50 GENX(TBLE,0,EAREL,EANONE);
3324 51 EAIMMED.DISPL := 13;
3325 52 GENX(TTRAP,2,EAIMMED,EANONE)
3326 53 END
3327 54 END
3328 55 (*604*) ELSE IF DTYPE=JTYP THEN BEGIN (*JTYP*)
3329 56 (*604*) EAPSET.DISPL := 0;
3330 57 (*604*) GENX(TCMP,4,EAPSET,EADDIR);
3331 58 (*604*) EAREL.DISPL := 10;
3332 59 (*604*) GENX(TBLT,0,EAREL,EANONE);
3333 60 (*604*) EAPSET.DISPL := 8;
3334 61 (*604*) GENX(TCMP,4,EAPSET,EADDIR);
3335 62 (*604*) EAREL.DISPL := 4;
3336 63 (*604*) GENX(TBLE,0,EAREL,EANONE);
3337 64 (*604*) EAIMMED.DISPL := 13;
3338 65 (*604*) GENX(TTRAP,2,EAIMMED,EANONE)
3339 66 (*604*) END
3340 67 (*604*) ELSE BEGIN (*ATYP*)
3341 68 (*604*) EABASED.DISPL := 368;
3342 69 (*604*) EABASED.REG := A5;
3343 70 (*604*) GENX(TCMP,4,EABASED,EADDIR);
3344 71 (*604*) EAREL.DISPL := 6;
3345 72 (*604*) GENX(TBLT,0,EAREL,EANONE);
3346 73 (*604*) EABASED.DISPL := 4;
3347 74 (*604*) GENX(TCMP,4,EABASED,EADDIR);
3348 75 (*604*) EAREL.DISPL := 4;
3349 76 (*604*) GENX(TBLE,0,EAREL,EANONE);
3350 77 (*604*) EAIMMED.DISPL := 13;
3351 78 (*604*) GENX(TTRAP,2,EAIMMED,EANONE)
3352 79 (*604*) END
3353 80 END (* WITH *)
3354 END; (*PXCHK*)
3355
3356
3357 (*RM*) PROCEDURE PXCVB;
3358 0 BEGIN WITH INSTR^ DO BEGIN
3359 1 (*604*) IF (NOT (DTYPE IN LONGTYPES))
3360 2 (*604*) THEN BEGIN
3361 3 (*604*) IF DALLOC < 1 THEN POPREG(DREG);
3362 4 (*604*) IF OPCODE = XCVB
3363 5 (*604*) THEN BEGIN
3364 6 (*604*) IF DALLOC < 2 THEN POPREG(DREG);
3365 7 (*604*) EADDIR.REG := PREVIOUS(DTOP)
3366 8 (*604*) END
3367 9 (*604*) ELSE EADDIR.REG := DTOP;
3368 10 (*604*) REGTYPEÆEADDIR.REGÅ := DTYPE;
3369 11 (*604*) IF (D1TYPE=HTYP) AND (DTYPE=JTYP)
3370 12 (*604*) THEN GENX(TEXTE,2,EADDIR,EANONE);
3371 13 (*604*) IF SIZEÆDTYPEÅ > SIZEÆD1TYPEÅ
3372 14 (*604*) THEN GENX(TEXTE,SIZEÆDTYPEÅ,EADDIR,EANONE);
3373 15 (*604*) END;
3374 16 (*604*) IF (D1TYPE=CTYP) AND (DTYPE=STYP)
3375 17 (*604*) THEN BEGIN
3376 18 (*604*) IF DALLOC<1 THEN POPREG(DREG);
3377 19 (*604*) EADDIR.REG := DTOP;
3378 20 (*604*) FREEDREG;
3379 21 PUSHALL;
3380 22 GENX(TMOVE,1,EADDIR,EAPUSH);
3381 23 (*604*) EAIMMED.DISPL := 1;
3382 24 (*604*) GENX(TMOVE,2,EAIMMED,EAPUSH)
3383 25 (*604*) END;
3384 26 (*RM*) IF ((D1TYPE=VTYP) AND (DTYPE=STYP)) THEN BEGIN
3385 27 (*RM*) EAIMMED.DISPL := OPAND1;
3386 28 (*RM*) GENX(TMOVE,2,EAIMMED,EAPUSH);
3387 29 (*RM*) END;
3388 30 (*RM*) IF ((D1TYPE=STYP) AND (DTYPE=VTYP))
3389 31 (*RM*) OR ((D1TYPE=STYP) AND (DTYPE=UTYP))
3390 32 (*RM*) OR ((D1TYPE=UTYP) AND (DTYPE=STYP)) THEN BEGIN
3391 33 (*RM*) ALLOCDREG;
3392 34 (*RM*) EADDIR.REG := DTOP;
3393 35 (*RM*) EAIMMED.DISPL := OPAND1;
3394 36 (*RM*) GENX(TMOVE,4,EAIMMED,EADDIR);
3395 37 (*RM*) FREEDREG;
3396 38 LONGBSR;
3397 39 (*RM*) END
3398 40 (*RM*) END;
3399 END; (*PXCVB*)
3400
3401 0 BEGIN (* GENERATE *)
3402 1 CASE INSTR^.OPCODE OF
3403 2 XATN,XCOS,XSIN,XEXP,XSQT,XLOG,XRND,XTRC:
3404 3 ERROR('REAL NOT IMPLEMENTED');
3405 4 (*604*) XSCON,XSPOS,XSLEN: PXSPOS;
3406 5 (*604*) XSINS : PXSINS;
3407 6 XSDEL,XSCOP : PXSDEL;
3408 7 XLAB: PXLAB;
3409 8 (*RM*) XEND: PXEND;
3410 9 XDEF: PXDEF;
3411 10 XENT,XENTB: PXENT;
3412 11 XRET: PXRET;
3413 12 XAB,XNG,XSQR,XNOT,XDEC,XINC,XODD: PXAB;
3414 13 XAD,XSB,XMP,XDV,XMOD,XIOR,XAND: PXAD;
3415 14 XCLO,XIFD,XAFI,XEOL,XEOF,XGET,XPUT,XPOS,XSEE,XPEE,XPOK,
3416 15 (*604*) XRDH, XWRH,
3417 16 XRST,XRWT,XRLN,XWLN,XPAG,XEIO,
3418 17 XRDB,XRDC,XRDE,XRDI,XRDJ,XRDQ,XRDR,XRDS,XRDV,
3419 18 XWRB,XWRC,XWRE,XWRI,XWRJ,XWRQ,XWRR,XWRS,XWRV: PXCLO;
3420 19 XLOD,XLDA,XSTR: PXLOD;
3421 20 XIXA: PXIXA;
3422 21 XIND: PXIND;
3423 22 XSTO: PXSTO;
3424 23 (*480*) XSTC: PXSTC;
3425 24 XLDC: PXLDC;
3426 25 XLTA: PXLTA;
3427 26 XLCA: PXLCA;
3428 27 XISC: PXISC;
3429 28 XLSC: PXLSC;
3430 29 XEQU,XNEQ,XLES,XLEQ,XGRT,XGEQ: PXEQU;
3431 30 XSTP: PXSTP;
3432 31 XEXI: PXEXI;
3433 32 XDIS: PXDIS;
3434 33 XNEW: PXNEW;
3435 34 XMRK: PXMRK;
3436 35 XRLS: PXRLS;
3437 36 XMST: PXMST;
3438 37 XARG: PXARG;
3439 38 XAST: PXAST;
3440 39 XMOV,XMOVV: PXMOV;
3441 40 XCUP: PXCUP;
3442 41 XXJP: GENXXJP;
3443 42 XVJP: PXVJP;
3444 43 XUJP,XFJP: PXUJP;
3445 44 XDIF,XINT,XUNI: PXDIF;
3446 45 XINN: PXINN;
3447 46 XSGS: PXSGS;
3448 47 XCHK:PXCHK ;
3449 48 XCVB,XCVT: PXCVB;
3450 49 XCHKF,XDAS,XEXT,XINS,XLUPA,XLSPA,XCSP,XCSPF,XCUPF,XDATA,XDATB: ;
3451 50 (*NOT CURRENTLY GEN'ED BY COMPILER*)
3452 51 XNONE: ;
3453 52 END (*CASES*)
3454 END; (*GENERATE*)
3455
3456
3457 0 BEGIN (*FLUSH*)
3458 1 OPTIMI := FIRSTI;
3459 2 CHANGED := FALSE;
3460 3 WHILE OPTIMI <> NIL DO
3461 4 BEGIN
3462 5 WITH OPTIMI^ DO
3463 6 BEGIN
3464 7 (*480*) IF INUSE AND ((OPCODE = XLDC) OR (OPCODE = XINC)
3465 8 (*480*) OR (OPCODE = XLDA))
3466 9 THEN
3467 10 BEGIN
3468 11 CASE OPCODE OF
3469 12 (*480*) XLDA: BEGIN
3470 13 (*480*) IF NOT (DTYPE IN LONGTYPES)
3471 14 (*480*) THEN
3472 15 (*480*) BEGIN
3473 16 (*480*) OPTIM2 := NEXTPCOD(OPTIMI);
3474 17 (*480*) OPTIM3 := NEXTPCOD(OPTIM2);
3475 18 (*480*) IF (OPTIM2^.OPCODE=XLDC)
3476 19 (*480*) AND (OPTIM2^.DTYPE=ITYP)
3477 20 (*480*) AND(OPTIM3^.OPCODE=XIXA)
3478 21 (*480*) THEN BEGIN
3479 22 (*480*) OPTIM2^.INUSE :=FALSE;
3480 23 (*480*) OPTIM3^.INUSE := FALSE;
3481 24 (*480*) OPTIMI^.OPAND2 :=
3482 25 (*480*) OPTIMI^.OPAND2 +
3483 26 (*480*) OPTIM2^.OPAND1 *
3484 27 (*480*) OPTIM3^.OPAND1;
3485 28 (*480*) CHANGED := TRUE
3486 29 (*480*) END
3487 30 (*480*) ELSE IF ((OPTIM2^.OPCODE=XLDC)
3488 31 (*480*) OR (OPTIM2^.OPCODE=XLOD))
3489 32 (*480*) AND (OPTIM3^.OPCODE=XSTO)
3490 33 (*480*) THEN BEGIN
3491 34 (*480*) INUSE := FALSE;
3492 35 (*480*) CHANGED := TRUE;
3493 36 (*480*) OPTIM3^.OPAND3 :=
3494 37 (*480*) OPTIM3^.OPAND1;
3495 38 (*480*) OPTIM3^.OPAND1:=OPAND1;
3496 39 (*480*) OPTIM3^.OPAND2:=OPAND2;
3497 40 (*480*) OPTIM3^.OPCODE:=XSTR
3498 41 (*480*) END
3499 42 (*480*) ELSE IF OPTIM2^.OPCODE=XIND
3500 43 (*480*) THEN BEGIN
3501 44 (*480*) OPTIM2^.INUSE :=FALSE;
3502 45 (*480*) CHANGED := TRUE;
3503 46 (*480*) OPTIMI^.OPCODE := XLOD;
3504 47 (*480*) OPTIMI^.DTYPE :=
3505 48 (*480*) OPTIM2^.DTYPE;
3506 49 (*480*) OPTIMI^.OPTYPE := OPTLI;
3507 50 (*480*) OPTIMI^.OPAND2 :=
3508 51 (*480*) OPTIMI^.OPAND2 +
3509 52 (*480*) OPTIM2^.OPAND1;
3510 53 (*480*) OPTIMI^.OPAND3 :=
3511 54 (*480*) OPTIM2^.OPAND2;
3512 55 (*480*) END
3513 56 (*480*) END
3514 57 (*480*) END; (* XLDA*)
3515 58 XLDC: BEGIN
3516 59 IF NOT (DTYPE IN LONGTYPES)
3517 60 AND (DTYPE <> JTYP) AND (DTYPE<>ATYP)
3518 61 THEN
3519 62 BEGIN
3520 63 CHANGED := TRUE; (*ASSUME*)
3521 64 (*480*) TEMPI := NEXTPCOD(OPTIMI);
3522 65 IF TEMPI^.OPCODE=XDEC
3523 66 THEN
3524 67 BEGIN
3525 68 OPAND1:=OPAND1
3526 69 - TEMPI^.OPAND1;
3527 70 TEMPI^.INUSE:=FALSE;
3528 71 END (*THEN*)
3529 72 ELSE IF TEMPI^.OPCODE=XINC
3530 73 THEN BEGIN
3531 74 OPAND1:=OPAND1+
3532 75 TEMPI^.OPAND1;
3533 76 TEMPI^.INUSE:=FALSE
3534 77 END
3535 78 ELSE IF TEMPI^.OPCODE=XAD
3536 79 THEN BEGIN
3537 80 OPCODE := XINC;
3538 81 TEMPI^.INUSE:=FALSE
3539 82 END
3540 83 ELSE IF TEMPI^.OPCODE=XSB
3541 84 THEN BEGIN
3542 85 OPCODE:= XDEC;
3543 86 TEMPI^.INUSE := FALSE
3544 87 END
3545 88 (*480*) ELSE IF TEMPI^.OPCODE=XNG
3546 89 (*480*) THEN BEGIN
3547 90 (*480*) OPAND1 := -OPAND1;
3548 91 (*480*) TEMPI^.INUSE:=FALSE
3549 92 (*480*) END
3550 93 ELSE IF (OPAND1=0)
3551 94 AND (TEMPI^.OPCODE=XIXA)
3552 95 THEN BEGIN
3553 96 INUSE := FALSE;
3554 97 TEMPI^.INUSE:=FALSE
3555 98 END
3556 99 (*480*) ELSE IF (TEMPI^.OPCODE=XCVT)
3557 100 (*480*) AND (TEMPI^.D1TYPE=CTYP)
3558 101 (*480*) AND (TEMPI^.DTYPE=ITYP)
3559 102 (*480*) THEN BEGIN
3560 103 (*480*) TEMPI^.INUSE := FALSE;
3561 104 (*480*) DTYPE := ITYP;
3562 105 (*480*) OPAND1 :=ASCIIÆ
3563 106 (*480*) OPSTRING^.
3564 107 (*480*) VSTRINGAÆ1ÅÅ
3565 108 (*480*) END
3566 109 ELSE CHANGED := FALSE;
3567 110 END (*THEN*)
3568 111 (*480*) ELSE
3569 112 (*480*) BEGIN (* S OR V *)
3570 113 (*480*) CHANGED := TRUE;
3571 114 (*480*) OPTIM2 := NEXTPCOD(OPTIMI);
3572 115 (*480*) IF (OPTIM2^.OPCODE=XCVT)
3573 116 (*480*) AND (DTYPE = STYP)
3574 117 (*480*) AND (OPTIM2^.D1TYPE=STYP)
3575 118 (*480*) AND (OPTIM2^.DTYPE=VTYP)
3576 119 AND (OPTIM2^.OPAND1<=STRLENGTH)
3577 120 (*480*) THEN BEGIN
3578 121 (*480*) OPTIM2^.INUSE := FALSE;
3579 122 (*480*) OPAND1 := OPTIM2^.OPAND1;
3580 123 (*480*) DTYPE := VTYP;
3581 124 (*480*) END
3582 125 (*480*) ELSE IF (OPTIM2^.OPCODE=XSTR)
3583 126 (*480*) AND (OPTIM2^.DTYPE=VTYP)
3584 127 (*480*) AND(DTYPE = VTYP)
3585 128 AND (OPAND1<=STRLENGTH)
3586 129 (*480*) THEN BEGIN
3587 130 (*480*) OPTIM2^.INUSE := FALSE;
3588 131 (*480*) OPCODE := XSTC;
3589 132 (*480*) OPAND3 := OPAND1;
3590 133 (*480*) OPAND1:=OPTIM2^.OPAND1;
3591 134 (*480*) OPAND2:=OPTIM2^.OPAND2
3592 135 (*480*) END
3593 136 (*480*) ELSE CHANGED := FALSE
3594 137 (*480*) END (* S OR V *)
3595 138 END; (*XLDC*)
3596 139 XINC: BEGIN
3597 140 IF NOT (DTYPE IN LONGTYPES)
3598 141 AND (DTYPE<>JTYP) AND (DTYPE <> ATYP)
3599 142 THEN BEGIN
3600 143 TEMPI := NEXTPCOD(OPTIMI);
3601 144 IF TEMPI^.OPCODE=XDEC
3602 145 THEN BEGIN
3603 146 OPAND1:=OPAND1
3604 147 - TEMPI^.OPAND1;
3605 148 TEMPI^.INUSE:=FALSE;
3606 149 IF OPAND1 = 0
3607 150 THEN INUSE := FALSE
3608 151 ELSE CHANGED :=TRUE;
3609 152 END
3610 153 END
3611 154 END; (*XINC*)
3612 155 END; (*CASE*)
3613 156 END; (*THEN*)
3614 157 END; (*WITH*)
3615 158 IF NOT CHANGED THEN OPTIMI := OPTIMI^.NEXT ELSE OPTIMI:=FIRSTI;
3616 159 CHANGED := FALSE;
3617 160 END; (*WHILE*)
3618 161 TEMPI := FIRSTI;
3619 162 WHILE TEMPI <> NIL DO
3620 163 BEGIN
3621 164 IF TEMPI^.INUSE THEN BEGIN
3622 165 IF ODD(DEBUG DIV 2) THEN FLPC := TRUE;
3623 166 GENERATE(TEMPI);
3624 167 TEMPI^.INUSE := FALSE END;
3625 168 TEMPI := TEMPI^.NEXT
3626 169 END;
3627 170 LASTI := FIRSTI;
3628 171 TEMPLEVEL := -1; (*INVALIDATE A4 (POINTER TO INTERMED LEXICAL LEVEL*)
3629 END; (*FLUSH*)
3630
3631
3632
3633 (*-------------------------------------------------------------------------
3634 INPUT SCANNER SECTION
3635 -------------------------------------------------------------------------*)
3636
3637 PROCEDURE NEXTLINE ;
3638 VAR I: INTEGER ;
3639 0 BEGIN
3640 1 IF EOF(PCODE) THEN WRITELN(OUTPUT,'**** EOF ENCOUNTERED':24) ;
3641 2 (* HALT NEEDED INSIDE THIS 'THEN' *)
3642 3 REPEAT
3643 4 LINELEN := 1 ;
3644 5 WHILE NOT EOLN(PCODE) AND (LINELEN < LINELNGTH) DO
3645 6 BEGIN
3646 7 READ(PCODE,LINEBUFÆLINELENÅ);
3647 8 LINELEN := LINELEN + 1
3648 9 END;
3649 10 READLN(PCODE);
3650 11 LINEBUFÆLINELENÅ := ' ' ;
3651 12 IF LINEBUFÆ1Å = '.' THEN LINECOUNT := LINECOUNT+1 ;
3652 13 IF (ODD(DEBUG DIV 8) AND (LINEBUFÆ1Å='.'))
3653 14 OR (ODD(DEBUG DIV 4) AND (LINEBUFÆ1Å<>'.'))
3654 15 THEN BEGIN
3655 16 WRITE(LISTING, '*' );
3656 17 FOR I:=1 TO LINELEN DO WRITE(LISTING, LINEBUFÆIÅ) ;
3657 18 IF LINEBUFÆ1Å = '.'
3658 19 THEN WRITE(LISTING,' ':(95 - LINELEN),LINECOUNT:6);
3659 20 WRITELN(LISTING,' ')
3660 21 END;
3661 22 UNTIL (LINEBUFÆ1Å <> '.') OR EOF(PCODE);
3662 23 CHCNT := 1 ;
3663 END (* NEXTLINE *) ;
3664
3665
3666
3667
3668 PROCEDURE GETHEADER;
3669 VAR
3670 I: INTEGER;
3671 OKVAL: BOOLEAN;
3672 0 BEGIN
3673 1 NEXTLINE;
3674 2 LINEBUFÆLINELEN+1Å := ' ';
3675 3 IF LINEBUFÆ3Å<>'2'
3676 4 THEN WRITELN(OUTPUT,' ***** INPUT NOT M68000 PCODES!',
3677 5 ' COMPILER PHASE 2 ABORTING. *****');
3678 6 CHCNT := 5;
3679 7 GETSTRING; (* MODULE NAME *)
3680 8 MAINFLG := LINEBUFÆ17Å <> 'S'; (* MAIN OR SUBPROGRAM *)
3681 9 CHCNT := 18; (* POINT BEYOND OPTIONS *)
3682 10 OKVAL := GETHEX;
3683 11 IF OKVAL THEN EXPROC := LTEMP; (* NUMBER OF ENTRIES IN JUMP TABLE *)
3684 12 JTSIZE := GETINTEGER; (* NUMBER OF ENTRIES IN JUMP TABLE *)
3685 13 PC := EXPROC;
3686 14 SAD(PC,JTSIZE * 10);
3687 15 OKVAL := GETHEX;
3688 16 IF OKVAL THEN HEAPSTART := LTEMP;
3689 17 OKVAL := GETHEX;
3690 18 IF OKVAL THEN STKSTART := LTEMP;
3691 19 GENSTART := PC;
3692 20 IF MAINFLG THEN SAD(PC,24); (* LEAVE ROOM FOR INIT CODE *)
3693 21 GENLOC := PC;
3694 22 COREBASE := PC;
3695 END; (* GETHEADER *)
3696
3697
3698 PROCEDURE SCAN;
3699
3700 VAR XEXTERNAL: BOOLEAN;
3701 (*RM*) I: INTEGER; (* COUNTER FOR SET INIT *)
3702
3703
3704 PROCEDURE GETOPCODE; (*PROCESS INPUT LINE FOR A LEGAL OPCODE, LOOK
3705 IT UP IN 'MN', SET CURROPCODE, CURROPTYPE *)
3706 VAR I: INTEGER;
3707 J: MNS;
3708 0 BEGIN
3709 1 WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
3710 2 CHCNT := CHCNT + 1;
3711 3
3712 4 I := 1;
3713 5 WHILE (LINEBUFÆCHCNTÅ <> ' ') AND (I<5) AND (CHCNT < LINELEN) DO
3714 6 BEGIN
3715 7 OPSYMÆIÅ := LINEBUFÆCHCNTÅ;
3716 8 CHCNT := CHCNT + 1; I := I + 1;
3717 9 END;
3718 10 WHILE I < 5 DO BEGIN OPSYMÆIÅ := ' '; I := I + 1 END;
3719 11
3720 12 CURROPCODE := XNONE;
3721 13 IF (OPSYMÆ1Å<>'Y') AND (OPSYMÆ1Å<>'Z') THEN
3722 14 FOR J := FMNÆOPSYMÆ1ÅÅ TO PRED(FMNÆSUCCIBM(OPSYMÆ1Å)Å) DO
3723 15 IF MNÆJÅ = OPSYM THEN CURROPCODE := J;
3724 16 IF CURROPCODE = XNONE THEN BEGIN ERROR('ILLEGAL OPCODE ');
3725 17 CURROPTYPE := OP0
3726 18 END
3727 19 ELSE CURROPTYPE := OTÆCURROPCODEÅ;
3728 END; (*GETOPCODE*)
3729
3730
3731 PROCEDURE GETTYPE;
3732 0 BEGIN
3733 1 WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
3734 2 CHCNT := CHCNT + 1;
3735 3 WITH CURRI^ DO BEGIN
3736 4 DTYPE := NOTATYP;
3737 5 IF (LINEBUFÆCHCNTÅ>='A') AND (LINEBUFÆCHCNTÅ<='V') THEN
3738 6 CASE LINEBUFÆCHCNTÅ OF
3739 7 'D','E','F','G','K','L','M','N','O','T': ;
3740 8 'A': DTYPE := ATYP;
3741 9 (*RM*) 'H': DTYPE := HTYP;
3742 10 'I': DTYPE := ITYP;
3743 11 'J': DTYPE := JTYP;
3744 12 'R': DTYPE := RTYP;
3745 13 'Q': DTYPE := QTYP;
3746 14 (*RM*) 'U': DTYPE := UTYP;
3747 15 'V': DTYPE := VTYP;
3748 16 'S': DTYPE := STYP;
3749 17 'B': DTYPE := BTYP;
3750 18 'C': DTYPE := CTYP;
3751 19 'P': DTYPE := PTYP
3752 20 END;
3753 21 END;
3754 22 CHCNT := CHCNT + 1;
3755 END; (*GETTYPE*)
3756
3757
3758 PROCEDURE GETLABEL;
3759 0 BEGIN
3760 1 WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
3761 2 CHCNT := CHCNT + 1;
3762 3 IF LINEBUFÆCHCNTÅ = 'L' THEN DOLLAR := FALSE
3763 4 ELSE IF LINEBUFÆCHCNTÅ = '$' THEN DOLLAR := TRUE
3764 5 ELSE ERROR('LABEL EXPECTED ');
3765 6 CHCNT := CHCNT + 1;
3766 7 IF DOLLAR THEN CURRLABEL := GETINTEGER
3767 8 ELSE BEGIN CURRLABEL := GETINTEGER - LABELOFFSET ;
3768 9 IF CURRLABEL<0 THEN CURRLABEL:= 0; (* NEEDED IF OLD PCODES *)
3769 10 IF CURRLABEL > HIGHLABEL THEN HIGHLABEL:= CURRLABEL
3770 11 END
3771 END; (*GETLABEL*)
3772
3773
3774 PROCEDURE DEFINELABEL( ABSOL: BOOLEAN);
3775
3776 PROCEDURE FIXUP(ABSOL: BOOLEAN);
3777 VAR ADDR1: ^LABELREF; ADDR2: LINT;
3778 ADDR3: INTEGER;
3779 I: INTEGER;
3780 0 BEGIN
3781 1 ADDR1 := LABELTABLEÆCURRLABELÅ.REFCHAIN;
3782 2 REPEAT
3783 3 ADDR2 := ADDR1^.CORELOC ;
3784 4 LTEMP := ADDR2;
3785 5 LSB(LTEMP,COREBASE);
3786 6 SAD(LTEMP,1);
3787 7 LASGN(I, LTEMP);
3788 8 IF I <= 0
3789 9 THEN
3790 10 BEGIN
3791 11 GENSAVE := GENLOC;
3792 12 GENLOC := ADDR2;
3793 13 LOCOUNT := MAXCORE - 20;
3794 14 CORESAVE := CORECOUNT;
3795 15 CORECOUNT := MAXCORE - 19;
3796 16 END;
3797 17 IF NOT ABSOL
3798 18 THEN BEGIN
3799 19 LTEMP := PC;
3800 20 LSB(LTEMP, ADDR2);
3801 21 LASGN(I,LTEMP);
3802 22 IF LOCOUNT <> 1
3803 23 THEN ADDR3 := LOCOUNT
3804 24 ELSE
3805 25 BEGIN
3806 26 LTEMP := ADDR2;
3807 27 LSB(LTEMP, COREBASE);
3808 28 SAD(LTEMP, 1);
3809 29 LASGN(ADDR3,LTEMP)
3810 30 END;
3811 31 COREÆADDR3Å := I DIV 256;
3812 32 COREÆADDR3+1Å := I MOD 256
3813 33 END ELSE
3814 34 BEGIN
3815 35 IF LOCOUNT <> 1
3816 36 THEN ADDR3 := LOCOUNT
3817 37 ELSE
3818 38 BEGIN
3819 39 LTEMP := ADDR2;
3820 40 LSB(LTEMP,COREBASE);
3821 41 SAD (LTEMP,1);
3822 42 LASGN(ADDR3,LTEMP)
3823 43 END;
3824 44 LASGN(I, LABELTABLEÆCURRLABELÅ.LOCATION);
3825 45 COREÆADDR3Å := DEFVALUE DIV 256;
3826 46 COREÆADDR3+1Å := DEFVALUE MOD 256;
3827 47 IF (DEFVALUE < 0) OR (I < 0)
3828 48 THEN BEGIN
3829 49 COREÆADDR3Å := ABS(COREÆADDR3Å);
3830 50 COREÆADDR3+1Å:=ABS(COREÆADDR3+1Å);
3831 51 COREÆADDR3Å := 255 - COREÆADDR3Å;
3832 52 COREÆADDR3+1Å := 256 - COREÆADDR3+1Å;
3833 53 IF COREÆADDR3+1Å = 256
3834 54 THEN BEGIN
3835 55 COREÆADDR3+1Å := 0;
3836 56 COREÆADDR3Å := COREÆADDR3Å + 1;;
3837 57 IF COREÆADDR3Å = 256
3838 58 THEN COREÆADDR3Å := 0;
3839 59 END;
3840 60 END
3841 61 END ;
3842 62 IF LOCOUNT <> 1
3843 63 THEN
3844 64 BEGIN
3845 65 EMITCODE;
3846 66 GENLOC := GENSAVE;
3847 67 LOCOUNT := 1;
3848 68 CORECOUNT := CORESAVE;
3849 69 END;
3850 70 ADDR1 := ADDR1^.NEXT;
3851 71 UNTIL ADDR1 = NIL;
3852 END; (*FIXUPLABEL*)
3853
3854 0 BEGIN (*DEFINELABEL*)
3855 1 FLUSH;
3856 2 WITH LABELTABLEÆCURRLABELÅ DO BEGIN
3857 3 IF DEFINED THEN ERROR ('DOUBLY DEFINED LABEL')
3858 4 ELSE IF REFED THEN FIXUP(ABSOL);
3859 5 DEFINED := TRUE;
3860 6 IF NOT ABSOL THEN LOCATION := PC
3861 7 ELSE SASGN(LOCATION, DEFVALUE)
3862 8 END
3863 END; (*DEFINELABEL*)
3864
3865 PROCEDURE DEFINEPROC(ABSOL: BOOLEAN);
3866
3867 PROCEDURE FIXUPPROC;
3868 VAR
3869 ADDR1:^LABELREF; ADDR2: LINT; I: INTEGER;
3870 0 BEGIN
3871 1 GENSAVE := GENLOC;
3872 2 CORESAVE := CORECOUNT;
3873 3 ADDR1 := PROCTABLEÆCURRLABELÅ.REFCHAIN;
3874 4 REPEAT
3875 5 LOCOUNT := MAXCORE - 20;
3876 6 CORECOUNT := MAXCORE - 17; (* DATA IS IN -20 TO -17 *)
3877 7 ADDR2 := ADDR1^.CORELOC;
3878 8 IF CURROPCODE = XDEF
3879 9 THEN BEGIN
3880 10 LTEMP := EXPROC;
3881 11 LSB(LTEMP, ADDR2)
3882 12 END
3883 13 ELSE BEGIN
3884 14 LTEMP := PC;
3885 15 LSB(LTEMP, ADDR2)
3886 16 END;
3887 17 FOR I := 0 TO 3 DO
3888 18 COREÆLOCOUNT + IÅ := LTEMPÆIÅ;
3889 19 GENLOC := ADDR2;
3890 20 EMITCODE;
3891 21 ADDR1 := ADDR1^.NEXT;
3892 22 UNTIL ADDR1 = NIL;
3893 23 GENLOC := GENSAVE;
3894 24 LOCOUNT := 1;
3895 25 CORECOUNT := CORESAVE;
3896 END; (*FIXUPPROC*)
3897
3898 0 BEGIN
3899 1 FLUSH;
3900 2 WITH PROCTABLEÆCURRLABELÅ DO BEGIN
3901 3 IF CURROPCODE = XENT THEN EMITCODE;
3902 4 IF DEFINED THEN ERROR('DOUBLY DEFINED LABEL')
3903 5 ELSE IF REFED THEN FIXUPPROC;
3904 6 DEFINED := TRUE;
3905 7 IF NOT ABSOL THEN LOCATION := PC
3906 8 ELSE SASGN(LOCATION, DEFVALUE);
3907 9 IF CURROPCODE=XDEF
3908 10 THEN BEGIN
3909 11 LOCATION := EXPROC;
3910 12 SAD(EXPROC,10);
3911 13 END
3912 14 END
3913 END; (*DEFINEPROC*)
3914
3915
3916
3917 PROCEDURE QUAI(VAR NEWI: IPTR);(*"QUAI" IS "QUEUE UP ANOTHER INSTRUCTION"*)
3918
3919 0 BEGIN IF LASTI^.INUSE THEN
3920 1 IF LASTI^.NEXT = NIL THEN
3921 2 BEGIN NEW(TEMPI);
3922 3 TEMPI^.OPSTRING := NIL;
3923 4 TEMPI^.OPSET := NIL;
3924 5 TEMPI^.NEXT := NIL;
3925 6 LASTI^.NEXT := TEMPI;
3926 7 LASTI := TEMPI
3927 8 END
3928 9 ELSE LASTI := LASTI^.NEXT;
3929 10 NEWI := LASTI
3930 END; (*QUAI*)
3931
3932
3933 0 BEGIN (*SCAN*)
3934 1 NEXTLINE;
3935 2
3936 3 IF LINEBUFÆ1Å <> ' ' THEN BEGIN LABELED := TRUE; (*COLLECT LABEL*)
3937 4 (*RM*) GETLABEL; LASTLABEL := CURRLABEL
3938 5 END
3939 6 ELSE LABELED := FALSE;
3940 7 GETOPCODE;
3941 8
3942 9 IF CURROPCODE = XDEF
3943 10 THEN IF NOT DOLLAR
3944 11 THEN
3945 12 BEGIN
3946 13 DEFVALUE := GETINTEGER;
3947 14 ABSOL := TRUE
3948 15 END
3949 16 ELSE ABSOL := FALSE
3950 17 ELSE ABSOL := FALSE;
3951 18
3952 19 IF LABELED THEN IF DOLLAR THEN DEFINEPROC(ABSOL)
3953 20 ELSE DEFINELABEL(ABSOL);
3954 21
3955 22 QUAI(CURRI); (*GET A QUEUE SLOT FOR A NEW INSTRUCTION *)
3956 23 WITH CURRI^ DO BEGIN
3957 24 INUSE := TRUE; DTYPE := NOTATYP; D1TYPE := NOTATYP;
3958 25 OPCODE := CURROPCODE; OPTYPE := CURROPTYPE;
3959 26 OPAND1 := 0; OPAND2 := 0; OPAND3 := 0;
3960 27
3961 28 CASE OPTYPE OF
3962 29 ENDOP, OP0: BEGIN
3963 30 OPAND1 := CURRLABEL;
3964 31 IF CURROPCODE = XDEF THEN
3965 32 IF NOT DOLLAR THEN OPAND2 := DEFVALUE
3966 33 END;
3967 34 OPLI: BEGIN OPAND1 := GETINTEGER; OPAND2 := GETINTEGER;
3968 35 DTYPE := ATYP END;
3969 36 OPT: BEGIN GETTYPE;
3970 37 IF DTYPE IN LONGTYPES THEN OPAND1 := GETINTEGER
3971 38 END;
3972 39 OPLAB: BEGIN GETLABEL; OPAND1 := CURRLABEL END;
3973 40 (*RM*) OP2T: BEGIN GETTYPE; D1TYPE := DTYPE; GETTYPE;
3974 41 (*RM*) IF D1TYPE IN ÆSTYP,UTYP,VTYPÅ THEN
3975 42 (*RM*) OPAND1 := GETINTEGER END;
3976 43 OPTI: BEGIN GETTYPE;
3977 44 IF DTYPE = NOTATYP THEN CHCNT := CHCNT - 1;
3978 45 OPAND1 := GETINTEGER;
3979 46 IF (OPAND1=0) AND (OPCODE = XARG)
3980 47 THEN BEGIN
3981 48 OPCODE := XNONE;
3982 49 INUSE := FALSE
3983 50 END;
3984 51 IF DTYPE IN LONGTYPES THEN OPAND2 := GETINTEGER
3985 52 END;
3986 53 OPT2I: BEGIN
3987 54 GETTYPE;
3988 55 IF DTYPE <> JTYP
3989 56 THEN BEGIN OPAND1 := GETINTEGER;
3990 57 OPAND2 := GETINTEGER
3991 58 END
3992 59 ELSE BEGIN
3993 60 IF OPSET = NIL THEN NEW(OPSET);
3994 61 WITH OPSET^ DO BEGIN
3995 62 FOR I := 1 TO 8 DO BEGIN
3996 63 OPAND1 := GETINTEGER;
3997 64 SETVÆI*2-1Å :=
3998 65 HEXDATAÆOPAND1 DIV 16 + 1Å;
3999 66 SETVÆI*2Å :=
4000 67 HEXDATAÆOPAND1 MOD 16 + 1Å
4001 68 END
4002 69 END;
4003 70 OPAND1 := 1;
4004 71 END
4005 72 END;
4006 73 OPI: OPAND1 := GETINTEGER;
4007 74 OP3I: BEGIN OPAND1 := GETINTEGER;
4008 75 OPAND2 := GETINTEGER;
4009 76 OPAND3 := GETINTEGER
4010 77 END;
4011 78 OPTLI: BEGIN GETTYPE; OPAND1 := GETINTEGER;
4012 79 OPAND2 := GETINTEGER;
4013 80 IF DTYPE IN LONGTYPES THEN OPAND3 := GETINTEGER
4014 81 END;
4015 82 OPTL2I: BEGIN GETTYPE; OPAND1 := GETINTEGER;
4016 83 OPAND2 := GETINTEGER;
4017 84 OPAND3 := GETINTEGER END;
4018 85 OPTV: BEGIN GETTYPE;
4019 86 (*604*) IF DTYPE IN ÆITYP,HTYPÅ THEN OPAND1 := GETINTEGER
4020 87 (*604*) ELSE IF (DTYPE=ATYP) AND (OPCODE<>XLDC)
4021 88 (*604*) THEN OPAND1 := GETINTEGER
4022 89 ELSE IF DTYPE IN Æ STYP,CTYPÅ THEN BEGIN
4023 90 IF OPSTRING = NIL THEN NEW(OPSTRING);
4024 91 GETSTRING;
4025 92 IF DTYPE = CTYP THEN ALENGTH := 1;
4026 93 OPSTRING^.STRINGL := ALENGTH;
4027 94 OPSTRING^.VSTRINGA := VSTRING
4028 95 END
4029 96 ELSE IF DTYPE = BTYP THEN BEGIN
4030 97 OPAND1 := GETINTEGER
4031 98 END
4032 99 (*604*) ELSE IF DTYPE = PTYP THEN BEGIN
4033 100 (*RM*) IF OPSET = NIL THEN NEW(OPSET);
4034 101 (*RM*) WITH OPSET^ DO BEGIN
4035 102 (*RM*) FOR I := 1 TO 8 DO BEGIN
4036 103 (*RM*) OPAND1 := GETINTEGER;
4037 104 (*RM*) SETVÆI*2-1Å := HEXDATAÆOPAND1 DIV 16+1Å;
4038 105 (*RM*) SETVÆI*2Å := HEXDATAÆOPAND1 MOD 16 + 1Å;
4039 106 (*RM*) END
4040 107 (*RM*) END;
4041 108 OPAND1 := 0
4042 109 END ELSE IF DTYPE IN ÆATYP,JTYPÅ
4043 110 THEN BEGIN
4044 111 OPAND1 := GETINTEGER;
4045 112 OPAND2 := GETINTEGER;
4046 113 OPAND3 := GETINTEGER;
4047 114 OPAND4 := GETINTEGER
4048 115
4049 116 (*RM*) END ELSE ; (* R NOT IMPLEMENTED *)
4050 117 END;
4051 118 OPENT: BEGIN OPAND1 := GETINTEGER;
4052 119 OPAND2 := GETINTEGER; (*SEGSIZE LABEL*)
4053 120 GETSTRING; (*OPTIONS(IGNORED)*)
4054 121 IF (VSTRINGÆ1Å>='0') AND(VSTRINGÆ1Å<='9')
4055 122 THEN DEBUG := ORD(VSTRINGÆ1Å)-ORD('0');
4056 123 IF (VSTRINGÆ2Å>='0') AND (VSTRINGÆ2Å<='9')
4057 124 THEN DEBUG := DEBUG * 10 +
4058 125 ORD(VSTRINGÆ2Å)-ORD('0');
4059 126 GETSTRING; (*NAME*)
4060 127 END;
4061 128 OPENTB: (*NOT CURRENTLY IMPLEMENTED*)
4062 129 END (*CASE*)
4063 130 END (*WITH*)
4064 END; (*SCAN*)
4065
4066
4067
4068
4069
4070 (*-------------------------------------------------------------------------
4071 INITIALIZATION SECTION
4072 -------------------------------------------------------------------------*)
4073
4074 PROCEDURE INIT;
4075
4076 VAR I: INTEGER;
4077 J: MNS;
4078 R: REGISTER;
4079
4080 0 BEGIN
4081 1 ERRORWR := FALSE;
4082 2 WRITELN(LISTING,' ':10,'LLEN',' ':3,'120');
4083 3
4084 4
4085 5 STKPTR := -1;
4086 6 FLPC := FALSE;
4087 7 DALLOC := 0; AALLOC := 0;
4088 8 DTOP := DNONE; ATOP := ANONE;
4089 9 DBOT := DNONE; ABOT := ANONE;
4090 10 SP := A7;
4091 11
4092 12 DALLOCCNT := 0; AALLOCCNT := 0;
4093 13 DPUSHCNT := 0; APUSHCNT := 0;
4094 14 DPOPCNT := 0; APOPCNT := 0;
4095 15
4096 16 LONGTYPES := ÆPTYP,VTYP,STYP,UTYPÅ;
4097 17
4098 18 SASGN(PC,12388);
4099 19 DEBUG := 9;
4100 20 GENLOC := PC;
4101 21 CORECOUNT := 0;
4102 22 GENSTART := PC;
4103 23 LOCOUNT := 1;
4104 24 COREBASE := PC;
4105 25 CLR(PROGSTART);
4106 26 MAINFLG := FALSE;
4107 27 LINECOUNT := -1;
4108 28 SASGN(RTJUMP,490);
4109 29 STKSTARTÆ0Å := 0; STKSTARTÆ1Å := 0; STKSTARTÆ2Å := 127;
4110 30 STKSTARTÆ3Å := 254;
4111 31 HEAPSTARTÆ0Å := 255; HEAPSTARTÆ1Å := 255; HEAPSTARTÆ2Å := 255;
4112 32 HEAPSTARTÆ3Å := 255; (* INITIALIZE HEAPSTART TO HEX FFFFFFFF *)
4113 33 JTSIZE := 10;
4114 34 LEVEL := 0;
4115 35 TEMPLEVEL := -1; (*-1 WHENEVER A4 NOT POINTING TO A VALID DISPLAY LEVEL*)
4116 36
4117 37 HIGHLABEL := 0; LABELOFFSET := 0;
4118 38 TOPLABEL := 0;
4119 39 ABSOL := FALSE;
4120 40 FOR I:= 0 TO MAXLABEL DO BEGIN PROCTABLEÆIÅ.DEFINED :=FALSE;
4121 41 PROCTABLEÆIÅ.REFED :=FALSE;
4122 42 PROCTABLEÆIÅ.REFCHAIN := NIL;
4123 43 LABELTABLEÆIÅ.REFCHAIN := NIL;
4124 44 LABELTABLEÆIÅ.DEFINED :=FALSE;
4125 45 LABELTABLEÆIÅ.REFED :=FALSE
4126 46 END;
4127 47
4128 48 NEW(FIRSTESD); WITH FIRSTESD^ DO BEGIN NAME := XNONE;
4129 49 NEXT := NIL;
4130 50 SASGN(REFERENCE, 0);
4131 51 END;
4132 52
4133 53 SIZEÆATYPÅ := 4;
4134 54 SIZEÆITYPÅ := 2;
4135 55 SIZEÆJTYPÅ := 4;
4136 56 SIZEÆRTYPÅ := 4;
4137 57 SIZEÆQTYPÅ := 8;
4138 58 SIZEÆVTYPÅ := 4;
4139 59 SIZEÆSTYPÅ := 4;
4140 60 SIZEÆBTYPÅ := 1;
4141 61 SIZEÆPTYPÅ := 8;
4142 62 SIZEÆNOTATYPÅ := 0;
4143 63 SIZEÆCTYPÅ := 1;
4144 64 (*RM*) SIZEÆHTYPÅ := 1;
4145 65 (*RM*) SIZEÆUTYPÅ := 4;
4146 66
4147 67
4148 68 (*480*) NEW(FAKEI);
4149 69 (*480*) WITH FAKEI^ DO
4150 70 (*480*) BEGIN
4151 71 (*480*) OPCODE := XNONE; NEXT := NIL; OPAND1 := 0; INUSE := TRUE;
4152 72 (*480*) OPTYPE := OP0; DTYPE := NOTATYP; D1TYPE := NOTATYP;
4153 73 (*480*) OPAND2 := 0; OPAND3 := 0; OPSTRING := NIL; OPSET := NIL
4154 74 (*480*) END;
4155 75 NEW(FIRSTI); LASTI := FIRSTI; FIRSTI^.NEXT := NIL; FIRSTI^.INUSE := FALSE;
4156 76 FIRSTI^.OPSTRING := NIL; FIRSTI^.OPSET := NIL;
4157 77
4158 78 FOR I := 1 TO STRLENGTH DO BLANKSÆIÅ := ' ';
4159 79
4160 80 MNÆXAB Å :='AB '; MNÆXAD Å :='AD ';
4161 81 MNÆXAFI Å :='AFI '; MNÆXAND Å :='AND ';
4162 82 MNÆXARG Å :='ARG ';
4163 83 MNÆXAST Å :='AST '; MNÆXATN Å :='ATN ';
4164 84 MNÆXCHK Å :='CHK '; MNÆXCHKFÅ :='CHKF';
4165 85 MNÆXCLO Å :='CLO ';
4166 86 MNÆXCOS Å :='COS '; MNÆXCSP Å :='CSP ';
4167 87 MNÆXCSPFÅ :='CSPF'; MNÆXCUP Å :='CUP ';
4168 88 MNÆXCUPFÅ :='CUPF'; MNÆXCVB Å :='CVB ';
4169 89 MNÆXCVT Å :='CVT '; MNÆXDAS Å :='DAS ';
4170 90 MNÆXDATAÅ :='DATA'; MNÆXDATBÅ :='DATB';
4171 91 MNÆXDEC Å :='DEC '; MNÆXDEF Å :='DEF ';
4172 92 MNÆXDIF Å :='DIF '; MNÆXDIS Å :='DIS ';
4173 93 MNÆXDV Å :='DV '; MNÆXEIO Å :='EIO ';
4174 94 MNÆXEND Å :='END ';
4175 95 MNÆXENT Å :='ENT '; MNÆXENTBÅ :='ENTB';
4176 96 MNÆXEOF Å :='EOF ';
4177 97 MNÆXEOL Å :='EOL '; MNÆXEQU Å :='EQU ';
4178 98 (*1015B*) MNÆXEXI Å :='EXIT'; MNÆXEXP Å :='EXP ';
4179 99 MNÆXEXT Å :='EXT '; MNÆXFJP Å :='FJP ';
4180 100 MNÆXGEQ Å :='GEQ '; MNÆXGET Å :='GET ';
4181 101 MNÆXGRT Å :='GRT '; MNÆXIFD Å :='IFD ';
4182 102 MNÆXINC Å :='INC '; MNÆXIND Å :='IND ';
4183 103 MNÆXINN Å :='INN '; MNÆXINS Å :='INS ';
4184 104 MNÆXINT Å :='INT '; MNÆXIOR Å :='IOR ';
4185 105 MNÆXISC Å :='ISC '; MNÆXIXA Å :='IXA ';
4186 106 MNÆXLAB Å :='LAB '; MNÆXLCA Å :='LCA ';
4187 107 MNÆXLDA Å :='LDA '; MNÆXLDC Å :='LDC ';
4188 108 MNÆXLEQ Å :='LEQ '; MNÆXLES Å :='LES ';
4189 109 MNÆXLOD Å :='LOD '; MNÆXLOG Å :='LOG ';
4190 110 MNÆXLSC Å :='LSC '; MNÆXLSPAÅ :='LSPA';
4191 111 MNÆXLTA Å :='LTA '; MNÆXLUPAÅ :='LUPA';
4192 112 MNÆXMOD Å :='MOD '; MNÆXMOV Å :='MOV ';
4193 113 MNÆXMOVVÅ :='MOVV'; MNÆXMP Å :='MP ';
4194 114 MNÆXMRK Å :='MRK '; MNÆXMST Å :='MST ';
4195 115 MNÆXNEQ Å :='NEQ ';
4196 116 MNÆXNEW Å :='NEW '; MNÆXNG Å :='NG ';
4197 117 MNÆXNOT Å :='NOT '; MNÆXODD Å :='ODD ';
4198 118 MNÆXPAG Å :='PAG '; MNÆXPEE Å :='PEE ';
4199 119 MNÆXPOK Å :='POK '; MNÆXPOS Å :='POS ';
4200 120 MNÆXPUT Å :='PUT '; MNÆXRDB Å :='RDB ';
4201 121 MNÆXRDC Å :='RDC '; MNÆXRDE Å :='RDE ';
4202 122 MNÆXRDI Å :='RDI '; MNÆXRDJ Å :='RDJ ';
4203 123 (*604*) MNÆXRDH Å := 'RDH '; MNÆXWRH Å := 'WRH ';
4204 124 MNÆXRDQ Å :='RDQ '; MNÆXRDR Å :='RDR ';
4205 125 MNÆXRDS Å :='RDS '; MNÆXRDV Å :='RDV ';
4206 126 MNÆXRET Å :='RET ';
4207 127 MNÆXRLN Å :='RLN '; MNÆXRLS Å :='RLS ';
4208 128 MNÆXRND Å :='RND ';
4209 129 MNÆXRST Å :='RST '; MNÆXRWT Å :='RWT ';
4210 130 MNÆXSB Å :='SB '; MNÆXSCONÅ :='SCON';
4211 131 MNÆXSCOPÅ :='SCOP'; MNÆXSDELÅ :='SDEL';
4212 132 MNÆXSEE Å :='SEE '; MNÆXSGS Å :='SGS ';
4213 133 MNÆXSIN Å :='SIN '; MNÆXSINSÅ :='SINS';
4214 134 MNÆXSLENÅ :='SLEN'; MNÆXSPOSÅ :='SPOS';
4215 135 MNÆXSQR Å :='SQR '; MNÆXSQT Å :='SQT ';
4216 136 MNÆXSTC Å :='STC ';
4217 137 MNÆXSTO Å :='STO '; MNÆXSTP Å :='STP ';
4218 138 MNÆXSTR Å :='STR '; MNÆXTRC Å :='TRC ';
4219 139 MNÆXUJP Å :='UJP '; MNÆXUNI Å :='UNI ';
4220 140 (*RM*) MNÆXVJP Å :='VJP ';
4221 141 MNÆXWLN Å :='WLN '; MNÆXWRB Å :='WRB ';
4222 142 MNÆXWRC Å :='WRC '; MNÆXWRE Å :='WRE ';
4223 143 MNÆXWRI Å :='WRI '; MNÆXWRJ Å :='WRJ ';
4224 144 MNÆXWRQ Å :='WRQ '; MNÆXWRR Å :='WRR ';
4225 145 MNÆXWRS Å :='WRS '; MNÆXWRV Å :='WRV ';
4226 146 MNÆXXJP Å :='XJP ';
4227 147 MNÆXNONEÅ :=' ';
4228 148
4229 149 FMNÆ'A'Å :=XAB ; FMNÆ'B'Å :=XCHK;
4230 150 FMNÆ'C'Å :=XCHK; FMNÆ'D'Å :=XDAS;
4231 151 FMNÆ'E'Å :=XEIO; FMNÆ'F'Å :=XFJP;
4232 152 FMNÆ'G'Å :=XGEQ; FMNÆ'H'Å :=XIFD;
4233 153 FMNÆ'I'Å :=XIFD; FMNÆ'J'Å :=XLAB;
4234 154 FMNÆ'K'Å :=XLAB; FMNÆ'L'Å :=XLAB;
4235 155 FMNÆ'M'Å :=XMOD; FMNÆ'N'Å :=XNEQ;
4236 156 FMNÆ'O'Å :=XODD; FMNÆ'P'Å :=XPAG;
4237 157 FMNÆ'Q'Å :=XRDB; FMNÆ'R'Å :=XRDB;
4238 158 FMNÆ'S'Å :=XSB ; FMNÆ'T'Å :=XTRC;
4239 159 (*RM*) FMNÆ'U'Å :=XUJP; FMNÆ'V'Å :=XVJP;
4240 160 FMNÆ'W'Å :=XWLN; FMNÆ'X'Å :=XXJP;
4241 161 FMNÆ'Y'Å :=XNONE;FMNÆ'Z'Å :=XNONE;
4242 162
4243 163 TMNÆTMOVE Å :='MOVE '; TMNÆTLINK Å :='LINK '; TMNÆTUNLK Å :='UNLK ';
4244 164 TMNÆTRTS Å :='RTS '; TMNÆTTST Å :='TST '; TMNÆTBGT Å :='BGT.S';
4245 165 TMNÆTNEG Å :='NEG '; TMNÆTSUBQ Å :='SUB '; TMNÆTBTST Å :='BTST ';
4246 166 TMNÆTSNZ Å :='SNZ '; TMNÆTADD Å :='ADD '; TMNÆTSUB Å :='SUB ';
4247 167 TMNÆTAND Å :='AND '; TMNÆTOR Å :='OR '; TMNÆTMULS Å :='MULS ';
4248 168 TMNÆTDIVS Å :='DIVS '; TMNÆTCMP Å :='CMP '; TMNÆTCLR Å :='CLR ';
4249 169 TMNÆTTRAP Å :='TRAP '; TMNÆTDCNT Å :='DCNT '; TMNÆTBSR Å :='BSR.S';
4250 170 TMNÆTADDQ Å :='ADD '; TMNÆTCOMP Å :='NOT '; TMNÆTLBSR Å :='BSR ';
4251 171 TMNÆTMOVEQÅ :='MOVE '; TMNÆTSEQ Å :='SEQ '; TMNÆTSNE Å :='SNE ';
4252 172 TMNÆTSGE Å :='SGE '; TMNÆTSLT Å :='SLT '; TMNÆTSGT Å :='SGT ';
4253 173 TMNÆTSLE Å :='SLE '; TMNÆTLEA Å :='LEA '; TMNÆTLDQ Å :='MOVE ';
4254 174 TMNÆTBRAÅ :='BRA.S'; TMNÆTBNE Å :='BNE.S'; TMNÆTEQU Å :='EQU ';
4255 175 TMNÆTBEQÅ :='BEQ.S';
4256 176 TMNÆTLBGTÅ :='BGT '; TMNÆTLBRA Å :='BRA ';
4257 177 TMNÆTLBNEÅ :='BNE '; TMNÆTLBEQÅ :='BEQ ';
4258 178 TMNÆTLBLTÅ :='BLT '; TMNÆTASL Å := 'ASL ';
4259 179 TMNÆTBLT Å :='BLT.S'; TMNÆTJMPÅ := 'JMP ';
4260 180 TMNÆTPEA Å :='PEA '; TMNÆTBSETÅ := 'BSET ';
4261 181 TMNÆTBZ Å :='BEQ '; TMNÆTJSR Å := 'JSR ';
4262 182 (*RM*) TMNÆTEOR Å :='EOR ';
4263 183 (*RM*) TMNÆTEXTE Å := 'EXT '; TMNÆTSWAPÅ :='SWAP ';
4264 184 TMNÆTCMPM Å := 'CMPM ';
4265 185 TMNÆTBNZ Å := 'BNE.S'; TMNÆTBGE Å := 'BGE.S';
4266 186 TMNÆTBLE Å := 'BLE.S'; TMNÆTCHK Å := 'CHK ';
4267 187 TMNÆTDC Å := 'DC '; (*DUMMY INSTR*)
4268 188 TMNÆTLBLEÅ := 'BLE '; TMNÆTLBGEÅ := 'BGE ';
4269 189
4270 190
4271 191
4272 192 (*RM*) DNAMEÆATYPÅ := 'A'; DNAMEÆITYPÅ := 'I'; DNAMEÆJTYPÅ := 'J';
4273 193 (*RM*) DNAMEÆRTYPÅ := 'R'; DNAMEÆQTYPÅ := 'Q'; DNAMEÆVTYPÅ := 'V';
4274 194 (*RM*) DNAMEÆSTYPÅ := 'S'; DNAMEÆBTYPÅ := 'B'; DNAMEÆPTYPÅ := 'P';
4275 195 (*RM*) DNAMEÆNOTATYPÅ :=' '; DNAMEÆCTYPÅ := 'C'; DNAMEÆHTYPÅ :='H';
4276 196 (*RM*) DNAMEÆUTYPÅ := 'U';
4277 197
4278 198 FOR J := XAB TO XXJP DO OTÆJÅ := OP0;
4279 199
4280 200 OTÆXAB Å := OPT ; OTÆXAD Å := OPT ;
4281 201 (*604*) OTÆXARG Å := OPTI ; (* CHANGE FOR 6809 CHIPS STUFF *)
4282 202 OTÆXAST Å := OPTI ; OTÆXATN Å := OPT ;
4283 203 (*604*) OTÆXCHK Å := OPT2I ; OTÆXCHKFÅ := OPT ;
4284 204 OTÆXCOS Å := OPT ; OTÆXCSP Å := OPLAB ;
4285 205 OTÆXCUP Å := OPLAB ;
4286 206 OTÆXCVB Å := OP2T ;
4287 207 OTÆXCVT Å := OP2T ; OTÆXDAS Å := OPI ;
4288 208 (*DATA,DATB*)
4289 209 OTÆXDEC Å := OPTI ;
4290 210 OTÆXDIS Å := OPI ;
4291 211 OTÆXDV Å := OPT ; OTÆXEND Å := ENDOP ;
4292 212 OTÆXENT Å := OPENT ; OTÆXENTBÅ := OPENTB;
4293 213 OTÆXEQU Å := OPT ;
4294 214 OTÆXEXI Å := OPI ;
4295 215 OTÆXEXP Å := OPT ;
4296 216 OTÆXEXT Å := OPTL2I; OTÆXFJP Å := OPLAB ;
4297 217 OTÆXGEQ Å := OPT ;
4298 218 OTÆXGRT Å := OPT ;
4299 219 OTÆXINC Å := OPTI ; OTÆXIND Å := OPTI ;
4300 220 OTÆXINS Å := OP3I ;
4301 221 OTÆXIXA Å := OPI ;
4302 222 OTÆXLCA Å := OPTV ;
4303 223 OTÆXLDA Å := OPLI ; OTÆXLDC Å := OPTV ;
4304 224 OTÆXLEQ Å := OPT ; OTÆXLES Å := OPT ;
4305 225 OTÆXLOD Å := OPTLI ; OTÆXLOG Å := OPT ;
4306 226 OTÆXLSC Å := OPI ; OTÆXLSPAÅ := OPI ;
4307 227 OTÆXLUPAÅ := OPI ;
4308 228 OTÆXMOD Å := OPT ; OTÆXMOV Å := OPI ;
4309 229 OTÆXMP Å := OPT ;
4310 230 OTÆXNEQ Å := OPT ;
4311 231 OTÆXNEW Å := OPI ; OTÆXNG Å := OPT ;
4312 232 OTÆXODD Å := OPT ;
4313 233 OTÆXRET Å := OPLI ;
4314 234 OTÆXRND Å := OPT ;
4315 235 OTÆXSB Å := OPT ;
4316 236 OTÆXSIN Å := OPT ;
4317 237 OTÆXSQR Å := OPT ; OTÆXSQT Å := OPT ;
4318 238 OTÆXSTO Å := OPT ;
4319 239 OTÆXSTR Å := OPTLI ; OTÆXTRC Å := OPT ;
4320 240 OTÆXUJP Å := OPLAB ;
4321 241 (*RM*) OTÆXVJP Å := OPLAB;
4322 242 OTÆXXJP Å := OPLAB ;
4323 243
4324 244 FOR J := XAB TO XNONE DO FLÆJÅ := TRUE;
4325 245
4326 246 FLÆXAB Å := FALSE; FLÆXAD Å := FALSE; FLÆXAND Å := FALSE;
4327 247 FLÆXAST Å := FALSE; FLÆXCVB Å := FALSE; FLÆXCVT Å := FALSE;
4328 248 FLÆXDAS Å := FALSE;
4329 249 FLÆXDATAÅ := FALSE; FLÆXDATBÅ := FALSE; FLÆXDEC Å := FALSE;
4330 250 FLÆXDIF Å := FALSE; FLÆXDV Å := FALSE; FLÆXEQU Å := FALSE;
4331 251 FLÆXEXT Å := FALSE;
4332 252 FLÆXGEQ Å := FALSE; FLÆXGRT Å := FALSE; FLÆXINC Å := FALSE;
4333 253 FLÆXIND Å := FALSE; FLÆXINN Å := FALSE; FLÆXINS Å := FALSE;
4334 254 FLÆXINT Å := FALSE;
4335 255 FLÆXIOR Å := FALSE;
4336 256 FLÆXIXA Å := FALSE; FLÆXLCA Å := FALSE; FLÆXLDA Å := FALSE;
4337 257 FLÆXLDC Å := FALSE; FLÆXLEQ Å := FALSE; FLÆXLES Å := FALSE;
4338 258 FLÆXLOD Å := FALSE; FLÆXLSPAÅ := FALSE; FLÆXLTA Å := FALSE;
4339 259 FLÆXLUPAÅ := FALSE;
4340 260 FLÆXMOD Å := FALSE; FLÆXMOV Å := FALSE; FLÆXMP Å := FALSE;
4341 261 FLÆXNEQ Å := FALSE; FLÆXNG Å := FALSE; FLÆXNOT Å := FALSE;
4342 262 FLÆXODD Å := FALSE; FLÆXSB Å := FALSE; FLÆXSQR Å := FALSE;
4343 263 FLÆXUNI Å := FALSE; FLÆXNONEÅ := FALSE;
4344 264
4345 265 FOR J := XAB TO XXJP DO SUBTYPEÆJÅ := 0;
4346 266
4347 267 SUBTYPEÆXAB Å := 1; SUBTYPEÆXAD Å := 1;
4348 268 SUBTYPEÆXNG Å := 2; SUBTYPEÆXSB Å := 2;
4349 269 SUBTYPEÆXDEC Å := 3; SUBTYPEÆXAND Å := 3;
4350 270 SUBTYPEÆXINC Å := 4; SUBTYPEÆXIOR Å := 4;
4351 271 SUBTYPEÆXNOT Å := 5; SUBTYPEÆXMP Å := 5;
4352 272 SUBTYPEÆXODD Å := 6; SUBTYPEÆXDV Å := 6;
4353 273 SUBTYPEÆXSQR Å := 7; SUBTYPEÆXMOD Å := 7;
4354 274
4355 275 SUBTYPEÆXLOD Å := 1; SUBTYPEÆXEQU Å := 1;
4356 276 SUBTYPEÆXLDA Å := 2; SUBTYPEÆXNEQ Å := 2;
4357 277 SUBTYPEÆXSTR Å := 3; SUBTYPEÆXLES Å := 3;
4358 278 SUBTYPEÆXLEQ Å := 4;
4359 279 SUBTYPEÆXGRT Å := 5;
4360 280 SUBTYPEÆXGEQ Å := 6;
4361 281 SUBTYPEÆXUJP Å := 1;
4362 282 SUBTYPEÆXFJP Å := 2;
4363 283
4364 284 BUILDADDR(EANONE,NONE,ANONE,ANONE,0);
4365 285 BUILDADDR(EADDIR,DDIRECT,ANONE,ANONE,0);
4366 286 BUILDADDR(EAADIR,ADIRECT,ANONE,ANONE,0);
4367 287 BUILDADDR(EAIMMED,IMMED,ANONE,ANONE,0);
4368 288 BUILDADDR(EADEFER,DEFER,ANONE,ANONE,0);
4369 289 BUILDADDR(EAINCR,INCR,ANONE,ANONE,0);
4370 290 BUILDADDR(EAPOP,INCR,SP,ANONE,0);
4371 291 BUILDADDR(EAPUSH,DECR,SP,ANONE,0);
4372 292 BUILDADDR(EALIMM,LABIMMED,ANONE,ANONE,0);
4373 293 BUILDADDR(EAREL,RELATIVE,ANONE,ANONE,0);
4374 294 BUILDADDR(EALAB,LABELLED,ANONE,ANONE,0);
4375 295 (*RM*) BUILDADDR(EAPSET,PIMMED,ANONE,ANONE,0);
4376 296 BUILDADDR(EABASED,BASED,ANONE,ANONE,0);
4377 297 BUILDADDR(EALONG,LIMMED,ANONE,ANONE,0);
4378 298
4379 299 FOR R := DNONE TO A7 DO REGTYPEÆRÅ := NOTATYP;
4380 300
4381 301 R := D0;
4382 302 FOR I:= 0 TO NDREGS DO BEGIN DREGSÆIÅ := R;
4383 303 R := SUCC(R)
4384 304 END;
4385 305 R := A0;
4386 306 FOR I:= 0 TO NAREGS DO BEGIN AREGSÆIÅ := R;
4387 307 R := SUCC(R)
4388 308 END;
4389 309
4390 310 MACHCODE := ' ';
4391 311 MACHINDEX := 1;
4392 312 HEXDATA := '0123456789ABCDEF';
4393 313
4394 314 SASGN(EXPROC,12288); (* HEX 3000 *)
4395 315
4396 316 FOR C := CHR(0) TO CHR(127) DO ASCIIÆCÅ := 32; (*BLANK*)
4397 317 ASCIIÆ'a'Å:=97; ASCIIÆ'b'Å:=98; ASCIIÆ'c'Å:=99; ASCIIÆ'd'Å:=100;
4398 318 ASCIIÆ'e'Å:=101;ASCIIÆ'f'Å:=102;ASCIIÆ'g'Å:=103;ASCIIÆ'h'Å:=104;
4399 319 ASCIIÆ'i'Å:=105;ASCIIÆ'j'Å:=106;ASCIIÆ'k'Å:=107;ASCIIÆ'l'Å:=108;
4400 320 ASCIIÆ'm'Å:=109;ASCIIÆ'n'Å:=110;ASCIIÆ'o'Å:=111;ASCIIÆ'p'Å:=112;
4401 321 ASCIIÆ'q'Å:=113;ASCIIÆ'r'Å:=114;ASCIIÆ's'Å:=115;ASCIIÆ't'Å:=116;
4402 322 ASCIIÆ'u'Å:=117;ASCIIÆ'v'Å:=118;ASCIIÆ'w'Å:=119;ASCIIÆ'x'Å:=120;
4403 323 ASCIIÆ'y'Å:=121;ASCIIÆ'z'Å:=122;
4404 324 ASCIIÆ'A'Å:=65; ASCIIÆ'B'Å:=66; ASCIIÆ'C'Å:=67; ASCIIÆ'D'Å:=68;
4405 325 ASCIIÆ'E'Å:=69; ASCIIÆ'F'Å:=70; ASCIIÆ'G'Å:=71; ASCIIÆ'H'Å:=72;
4406 326 ASCIIÆ'I'Å:=73; ASCIIÆ'J'Å:=74; ASCIIÆ'K'Å:=75; ASCIIÆ'L'Å:=76;;
4407 327 ASCIIÆ'M'Å:=77; ASCIIÆ'N'Å:=78; ASCIIÆ'O'Å:=79; ASCIIÆ'P'Å:=80;
4408 328 ASCIIÆ'Q'Å:=81; ASCIIÆ'R'Å:=82; ASCIIÆ'S'Å:=83; ASCIIÆ'T'Å:=84;
4409 329 ASCIIÆ'U'Å:=85; ASCIIÆ'V'Å:=86; ASCIIÆ'W'Å:=87; ASCIIÆ'X'Å:=88;
4410 330 ASCIIÆ'Y'Å:=89; ASCIIÆ'Z'Å:=90;
4411 331 ASCIIÆ'0'Å:=48; ASCIIÆ'1'Å:=49; ASCIIÆ'2'Å:=50; ASCIIÆ'3'Å:=51;
4412 332 ASCIIÆ'4'Å:=52; ASCIIÆ'5'Å:=53; ASCIIÆ'6'Å:=54; ASCIIÆ'7'Å:=55;
4413 333 ASCIIÆ'8'Å:=56; ASCIIÆ'9'Å:=57;
4414 334 ASCIIÆ' 'Å:=32; ASCIIÆ'*'Å:=42; ASCIIÆ'>'Å:=62;
4415 335 ASCIIÆ'!'Å:=33; ASCIIÆ'+'Å:=43; ASCIIÆ'?'Å:=63;
4416 336 ASCIIÆ'"'Å:=34; ASCIIÆ','Å:=44; ASCIIÆ'^'Å:=64;
4417 337 ASCIIÆ'#'Å:=35; ASCIIÆ'-'Å:=45;
4418 338 ASCIIÆ'$'Å:=36; ASCIIÆ'.'Å:=46; ASCIIÆ'Ø'Å:=92;
4419 339 ASCIIÆ'%'Å:=37; ASCIIÆ'/'Å:=47;
4420 340 ASCIIÆ'&'Å:=38; ASCIIÆ':'Å:=58; ASCIIÆ'!'Å:=94;
4421 341 ASCIIÆ''''Å:=39;ASCIIÆ';'Å:=59;
4422 342 ASCIIÆ'('Å:=40; ASCIIÆ'<'Å:=60;
4423 343 ASCIIÆ')'Å:=41; ASCIIÆ'='Å:=61;
4424 344 ASCIIÆ'Æ'Å:=91; ASCIIÆ'Å'Å:=93;
4425 345 ASCIIÆ'_'Å:=95; ASCIIÆ'æ'Å:=123; ASCIIÆ'å'Å:=125;
4426 346 ASCIIÆ'`'Å:=96; ASCIIÆ'ø'Å:=124; ASCIIÆ'^'Å:=126;
4427 347
4428 348 RTÆXCVBÅ := 4228; RTÆXAFIÅ := 4112; RTÆXCLOÅ := 4116;
4429 349 RTÆXDISÅ := 4104; RTÆXEOFÅ := 4120; RTÆXEOLÅ := 4124;
4430 350 RTÆXEQUÅ := 4268; RTÆXEXIÅ := 4096; RTÆXGEQÅ := 4288;
4431 351 RTÆXENDÅ := 4096;
4432 352 RTÆXGETÅ := 4128; RTÆXGRTÅ := 4284; RTÆXIFDÅ := 4132;
4433 353 RTÆXINDÅ := 4264; RTÆXLEQÅ := 4280; RTÆXLESÅ := 4276;
4434 354 RTÆXLODÅ := 4264; RTÆXNEQÅ := 4272; RTÆXNEWÅ := 4108;
4435 355 RTÆXPAGÅ := 4136; RTÆXPEEÅ := 4140; RTÆXPOKÅ := 4144;
4436 356 RTÆXPOSÅ := 4148; RTÆXPUTÅ := 4152; RTÆXRDBÅ := 4176;
4437 357 RTÆXRDCÅ := 4180; RTÆXRDIÅ := 4184; RTÆXRDSÅ := 4188;
4438 358 RTÆXRDVÅ := 4212; RTÆXRLNÅ := 4156; RTÆXRSTÅ := 4160;
4439 359 RTÆXRWTÅ := 4164; RTÆXSCONÅ:= 4232; RTÆXSCOPÅ:= 4236;
4440 360 RTÆXSDELÅ:= 4240; RTÆXSEEÅ := 4168; RTÆXSINSÅ := 4244;
4441 361 RTÆXSLENÅ:= 4248; RTÆXSPOSÅ:= 4252; RTÆXSTOÅ := 4260;
4442 362 RTÆXSTPÅ := 4100; RTÆXSTRÅ := 4256; RTÆXWLNÅ := 4172;
4443 363 RTÆXWRBÅ := 4192; RTÆXWRCÅ := 4196; RTÆXWRIÅ := 4200;
4444 364 RTÆXWRSÅ := 4204; RTÆXWRVÅ := 4208; RTÆXCVTÅ := 4220;
4445 365 RTÆXCVTSUÅ := 4216; RTÆXCVTUSÅ := 4224; RTÆXLDCÅ := 4292;
4446 366 RTÆXSTRVÅ := 4296; RTÆXSTOVÅ := 4300; RTÆXINDVÅ := 4304;
4447 367 RTÆXLODVÅ := 4304; RTÆXEQUVÅ := 4308; RTÆXNEQVÅ := 4312;
4448 368 RTÆXLESVÅ := 4316; RTÆXLEQVÅ := 4320; RTÆXGRTVÅ := 4324;
4449 369 RTÆXGEQVÅ := 4328; RTÆXLDCVÅ := 4332; RTÆXSTCÅ := 4336;
4450 370 RTÆXMPÅ := 4340; RTÆXDVÅ := 4344; RTÆXMODÅ := 4348;
4451 371 RTÆXRLSÅ := 4148; RTÆXMRKÅ := 4144; RTÆXRDHÅ := 4528;
4452 372 RTÆXRDJÅ := 4532; RTÆXWRHÅ := 4520; RTÆXWRJÅ := 4524;
4453 373
4454 END; (*INIT*)
4455
4456
4457 (*-------------------------------------------------------------------------
4458 SUMMARY PROCEDURE
4459 -------------------------------------------------------------------------*)
4460
4461 PROCEDURE SUMMARIZE;
4462 0 BEGIN WRITELN(LISTING,'*D REGISTERS: ',DALLOCCNT,' ALLOCATIONS, REQUIRING ',
4463 1 DPUSHCNT,' PUSHES');
4464 2 WRITELN(LISTING,'* AND ', DPOPCNT,' POPS');
4465 3 WRITELN(LISTING,'*A REGISTERS: ',AALLOCCNT,' ALLOCATIONS, REQUIRING ',
4466 4 APUSHCNT,' PUSHES');
4467 5 WRITELN(LISTING,'* AND ', APOPCNT,' POPS');
4468 6 WRITELN(LISTING,'*');
4469 7 WRITE(LISTING,'*TOTAL OF ');
4470 8 LTEMP := PC;
4471 9 LSB(LTEMP,GENSTART);
4472 10 PLINT(LISTING,LTEMP);
4473 11 WRITELN(LISTING,' BYTES GENERATED.');
4474 12 WRITE(OUTPUT,' CODE GENERATOR PRODUCED ');
4475 13 PLINT(OUTPUT,LTEMP);
4476 14 WRITELN(OUTPUT,' BYTES OF CODE.');
4477 15 WRITELN(OUTPUT,' LABELS USED:',TOPLABEL:4);
4478 16 IF ERRORWR THEN WRITELN(OUTPUT,' ***** ERROR(S) DETECTED *****')
4479 17 ELSE WRITELN(OUTPUT,' NO ERRORS DETECTED.');
4480 18 WRITELN(OUTPUT,'STACKPTR = ',STKPTR:5);
4481 19 PAGE(LISTING)
4482 END;
4483
4484
4485 (*-------------------------------------------------------------------------
4486 MAIN PROGRAM
4487 -------------------------------------------------------------------------*)
4488
4489 0 BEGIN
4490 1 REWRITE(LISTING);
4491 2 WRITELN(LISTING,'* M68000 PASCAL COMPILER PHASE TWO VERSION 1.10 08/07/80 ');
4492 3 RESET(PCODE);
4493 4 REWRITE(OBJECT);
4494 5 WRITELN(OUTPUT,' M68000 PASCAL COMPILER PHASE TWO VERSION 1.10');
4495 6 WRITELN(OUTPUT,' COPYRIGHTED 1980 BY MOTOROLA, INC.');
4496 7 WRITELN(LISTING,' ');
4497 8 INIT;
4498 9 GETHEADER;
4499 10 IF LINEBUFÆ3Å = '2' THEN
4500 11 REPEAT
4501 12 SCAN;
4502 13 (*WITH CURRI^ DO
4503 14 WRITELN(LISTING,'* ',MNÆOPCODEÅ,ORD(OPTYPE),OPAND1,OPAND2,OPAND3);*)
4504 15 IF FLÆCURRI^.OPCODEÅ THEN FLUSH;
4505 16 UNTIL CURRI^.OPTYPE = ENDOP;
4506 17 SUMMARIZE;
4507 END.
Code: 52K + 348 Halfwords
end
blocksread = 999
▶EOF◀