|
|
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: 190464 (0x2e800)
Types: TextFile
Names: »hpasc1«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »hpasc1«
(*$L+*)
(* M20 *)
(* COPYRIGHTED 1980 BY MOTOROLA, INC. *)
PROGRAM DIRECT(OUTPUT,PCODE,OBJECT,LISTING);
(* AUGUST 7, 1980 *)
(* GENERATES S-RECORDS *)
(* 370 VERSION *)
(* LONG ADDRESSES *)
(* DIRECT CODE VERSION *)
(* 01/08/82 @ REPLACED BY ^ *
* (. REPLACED BY Æ *
* .) REPLACED BY Å *
* EXTERNAL REPLACED BY XEXTERNAL *
* FILE OF CHAR REPLACED BY TEXT *
* HENRIK JACOBSEN HC *)
CONST STRLENGTH = 64;
LINELNGTH = 133;
BITSPERDIGIT = 8;
LDIGIT = 3;
TOPDIGIT = 255;
MAXDIGIT = 256;
MAXLABEL = 400;
MAXCORE = 1044;
STKMAX = 32;
NDREGS = 5; NAREGS = 3; (*NBR OF REGS TO BE ALLOCATED FOR STACK*)
TYPE OPTYPS = (OP0, OPLI, OPT, OP2T, OPTI, OPT2I, OPI, OPTLI,
OP3I, OPTL2I, OPTL, OPENT, OPENTB, OPTV, OPLAB, ENDOP);
PCODES=(XAB, XAD, XAFI, XAND, XARG,
XAST, XATN, XCHK, XCHKF, XCLO, XCOS, XCSP,
XCSPF,XCUP, XCUPF,XCVB, XCVT, XDAS, XDATA,XDATB,XDEC, XDEF, XDIF,
XDIS, XDV, XEIO, XEND, XENT, XENTB,XEOF, XEOL, XEQU, XEXI, XEXP,
XEXT, XFJP, XGEQ, XGET, XGRT, XIFD, XINC, XIND, XINN, XINS, XINT,
XIOR, XISC, XIXA, XLAB, XLCA, XLDA, XLDC, XLEQ, XLES, XLOD, XLOG,
XLSC, XLSPA,XLTA, XLUPA,XMOD, XMOV, XMOVV,XMP, XMRK, XMST, XNEQ,
XNEW, XNG, XNOT, XODD, XPAG, XPEE, XPOK, XPOS, XPUT, XRDB, XRDC,
(*604*) XRDE, XRDH, XRDI, XRDJ, XRDQ, XRDR, XRDS, XRDV, XRET, XRLN, XRLS, XRND,
XRST, XRWT, XSB, XSCON,XSCOP,XSDEL,XSEE, XSGS, XSIN, XSINS,XSLEN,
(*RM*) XSPOS,XSQR, XSQT, XSTO, XSTP, XSTR, XTRC, XUJP, XUNI, XVJP, XWLN, XWRB,
(*604*) XWRC, XWRE, XWRH, XWRI, XWRJ, XWRQ, XWRR, XWRS, XWRV, XXJP, XSTC, XNONE,
XINDV, XLODV, XSTRV, XSTOV, XEQUV, XNEQV, XLESV, XLEQV,
XGRTV, XGEQV, XCVTSU, XCVTUS, XLDCV);
MNS = XAB .. XNONE;
TARGETOP = (TMOVE, TLINK, TUNLK, TRTS , TTST, TBGT, TNEG, TSUBQ,
TBTST, TSNZ, TADD, TSUB, TAND, TOR, TMULS, TDIVS,
TCMP, TCLR, TTRAP, TDCNT, TBSR, TADDQ,TCOMP, TLBSR,
TMOVEQ,TSEQ, TSNE, TSLT, TSLE, TSGT, TSGE, TLEA ,
TLBGT, TLBRA, TLBNE, TLBEQ, TLBLT, TASL, TBLT, TJMP,
(*RM*) TPEA, TBSET, TBZ, TSWAP, TCMPM, TJSR,
TBNZ, TBGE, TBLE, TCHK, TLBLE, TLBGE,
(*RM*) TLDQ, TEXTE, TBRA, TBNE, TEQU, TBEQ, TEOR, TDC );
DATATYPE = (ATYP,ITYP,JTYP,RTYP,QTYP,VTYP,STYP,BTYP,
(*RM*) PTYP,NOTATYP,CTYP,HTYP,UTYP);
MESSAGE = PACKED ARRAYÆ1..15Å OF CHAR;
ERRORMESSAGE = PACKED ARRAYÆ1..20Å OF CHAR;
IPTR = ^INSTRUCTION;
INSTRUCTION = RECORD INUSE : BOOLEAN;
NEXT : IPTR;
(*PREV : IPTR;*)
OPCODE: MNS;
OPTYPE: OPTYPS;
DTYPE,D1TYPE: DATATYPE;
OPAND1: INTEGER;
OPAND2: INTEGER;
OPAND3: INTEGER;
OPAND4: INTEGER;
OPSTRING: ^VSTRINGV;
(*RM*) OPSET: ^SETR
END;
VSTRINGV = RECORD STRINGL: 0..STRLENGTH;
VSTRINGA: PACKED ARRAY Æ 1..STRLENGTHÅ OF CHAR
END;
LINT = ARRAY Æ0..LDIGITÅ OF INTEGER; (*MULTIPLE PRECISION*)
ADDRESS = LINT; (*SHOULD BE "RECORD BYTE1,BYTE2,BYTE3:0..255 END"*)
LABELREF = RECORD CORELOC: ADDRESS;
NEXT: ^LABELREF
END;
LABL = RECORD LOCATION: ADDRESS;
DEFINED: BOOLEAN;
REFED: BOOLEAN;
REFCHAIN: ^LABELREF;
END;
LABTABLE = ARRAYÆ0..MAXLABELÅ OF LABL;
ESD = RECORD NAME: MNS; (*XEXTERNAL SYMBOL DEFINITION LIST*)
REFERENCE: ADDRESS;
NEXT: ^ESD
END;
EAMODE = (NONE,DDIRECT,ADIRECT,DEFER,INCR,DECR,
(*RM*) BASED,INDEX, PCINDEX, STSHORT,
RELATIVE,XEXTERNAL,LABELLED, LABIMMED,
(*RM*) PIMMED,
LIMMED,
(*RM*) IMMED,ABSOLUTE,STLONG); (* THIS ORDER IS IMPORTANT *)
REGISTER = (DNONE,D0,D1,D2,D3,D4,D5,D6,D7,
ANONE,A0,A1,A2,A3,A4,A5,A6,A7);
REGKIND = (AREG, DREG);
EFFADDR = RECORD MODE: EAMODE;
REG: REGISTER;
XREG: REGISTER;
DISPL: INTEGER
END;
(*RM*) SETR = RECORD
(*RM*) SETV: PACKED ARRAYÆ1..16Å OF CHAR
(*RM*) END;
VAR
DEBUG: INTEGER; (*DIAGNOTSIC FLAG *)
CHANGED: BOOLEAN;
ASCII: ARRAYÆCHARÅ OF INTEGER;
C: CHAR;
ERRORWR: BOOLEAN;
LISTING: TEXT;
PCODE: TEXT;
OBJECT: TEXT;
CHCNT,LINELEN: 1..LINELNGTH;
LINEBUF: ARRAYÆ1..LINELNGTHÅ OF CHAR;
LINECOUNT: INTEGER;
MACHINDEX: INTEGER;
SIZE: ARRAYÆDATATYPEÅ OF INTEGER;
(*RM*) DNAME: PACKED ARRAYÆDATATYPEÅ OF CHAR;
LONGTYPES: SET OF DATATYPE; (* = ÆPTYP,VTYP,STYPÅ*)
(*RM*) LASTLABEL: INTEGER; (* LABEL OF LAST LABELLED PCODE *)
FIRSTI, LASTI, CURRI, OPTIMI, TEMPI : IPTR;
(*480*) FAKEI: IPTR; (* DUMMY PCODE *)
OPTIM2,OPTIM3,OPTIM4,OPTIM5 : IPTR;
CURROPCODE: MNS; CURROPTYPE: OPTYPS;
TEMPLEVEL: INTEGER; (*LEVEL OF DISPLAY VECTOR CURRENTLY IN A4*)
COMMUTATIVE, SWITCH: BOOLEAN;
OPSYM: PACKED ARRAYÆ1..4Å OF CHAR;
MACHCODE: PACKED ARRAYÆ1..20Å OF CHAR;
VSTRING, BLANKS: PACKED ARRAYÆ1..STRLENGTHÅ OF CHAR;
CURRLABEL, HIGHLABEL, LABELOFFSET, DEFVALUE: INTEGER;
TOPLABEL : INTEGER;
LABELED, DOLLAR, ABSOL: BOOLEAN;
LEVEL, ALENGTH: INTEGER;
FLPC: BOOLEAN;
FMN: ARRAYÆ'A'..'Z'Å OF MNS;
MN: ARRAYÆMNSÅ OF PACKED ARRAYÆ1..4Å OF CHAR;
OT: ARRAYÆMNSÅ OF OPTYPS;
SUBTYPE: ARRAYÆMNSÅ OF 0..255;
RT: ARRAYÆPCODESÅ OF INTEGER; (* ADDRESSES OF RUNTIME ROUTINES*)
FL: ARRAYÆMNSÅ OF BOOLEAN;
TMN: ARRAYÆTARGETOPÅ OF PACKED ARRAYÆ1..5Å OF CHAR;
LABELTABLE, PROCTABLE: LABTABLE;
PC: ADDRESS;
LTEMP: LINT; (* TEMPORARY FOR LONG ARITHMETIC *)
CORE: ARRAYÆ1..MAXCOREÅ OF INTEGER;
GENLOC: LINT; (* CURRENT CODEGEN ADDRESS *)
GENSTART: LINT; (* FIRST ADDRESS OF CODE *)
GENSAVE: LINT; (*TEMP TO SAVE GENLOC *)
EXPROC: ADDRESS; (* SLOT TO STORE JUMP TO DISTANT PROC IN *)
CORECOUNT: 0..MAXCORE;
CORESAVE: 0..MAXCORE;
LOCOUNT: 0..MAXCORE;
MAINFLG: BOOLEAN; (* MAIN PROGRAM ENCOUNTERED *)
COREBASE: ADDRESS;
PROGSTART: ADDRESS;
RTJUMP: ADDRESS; (* START OF RUNTIME JUMP TABLE *)
STKSTART: ADDRESS; (* START OF STACK *)
HEAPSTART: ADDRESS; (* START OF HEAP *)
JTSIZE: INTEGER; (* NUMBER OF JUMP TABLE ELEMENTS *)
FIRSTESD: ^ESD;
SP: REGISTER;
DALLOC,AALLOC: 0..8;
DTOP,DBOT: DNONE..D7;
ATOP,ABOT: ANONE..A7;
(*REGISTER ALLOCATION VARIABLES*)
(*VALUE OF -1 MEANS NONE CURRENTLY ASSIGNED*)
REGTYPE: ARRAYÆREGISTERÅ OF DATATYPE;
TYPESTK: ARRAYÆ-1..STKMAXÅ OF DATATYPE;
KINDSTK: ARRAYÆ-1..STKMAXÅ OF REGKIND;
STKPTR: -1..STKMAX;
DREGS: ARRAYÆ0..NDREGSÅ OF REGISTER;
AREGS: ARRAYÆ0..NAREGSÅ OF REGISTER;
EADDIR, EAADIR, EAPOP, EAPUSH, EAIMMED, EAINCR,
(*RM*) EALIMM, EAREL, EALAB, EAPSET, EALONG,
EABASED, EANONE, EADEFER: EFFADDR;
AALLOCCNT, DALLOCCNT, DPUSHCNT, APUSHCNT, DPOPCNT, APOPCNT: INTEGER;
TEMPESD: ^ESD;
TEMPLABREF: ^LABELREF;
(*RM*) HEXDATA: PACKED ARRAYÆ1..16Å OF CHAR;
FUNCTION SUCCIBM(CH:CHAR):CHAR; (* HANDLES EBCDIC ALPHABET *)
BEGIN
IF CH = 'I' THEN SUCCIBM := 'J'
ELSE IF CH ='R' THEN SUCCIBM := 'S'
ELSE SUCCIBM := SUCC(CH)
END (* SUCCIBM *) ;
FUNCTION HEXBIN(I: INTEGER): INTEGER; (* CONVERT HEX CHAR TO BINARY *)
BEGIN
IF I >= 65
THEN HEXBIN := I - 55
ELSE HEXBIN := I - 48
END; (* HEXBIN *)
PROCEDURE ERROR(MSG: ERRORMESSAGE);
BEGIN ERRORWR:=TRUE;WRITELN(LISTING,'**ERROR** ',MSG) END; (* ERROR *)
(*480*) FUNCTION NEXTPCOD (PCODE: IPTR) : IPTR;
(*480*) (* GIVEN A PCODE, FIND NEXT ACTIVE ONE; IF NONE, RETURN FAKE ONE *)
(*480*) BEGIN
(*480*) REPEAT
(*480*) PCODE := PCODE^.NEXT;
(*480*) IF PCODE = NIL THEN PCODE := FAKEI
(*480*) UNTIL PCODE^.INUSE;
(*480*) NEXTPCOD := PCODE
(*480*) END; (*NEXTPCOD *)
FUNCTION CONDITIONAL(INST:IPTR):INTEGER;
(* IF CONDITIONAL P-CODE, RETURN NUMBER, ELSE RETURN 0 *)
BEGIN
WITH INST^ DO
BEGIN
CONDITIONAL := 0;
IF OPCODE = XNEQ THEN CONDITIONAL := 1 ELSE
IF OPCODE = XEQU THEN CONDITIONAL := 2 ELSE
IF OPCODE = XLES THEN CONDITIONAL := 3 ELSE
IF OPCODE = XLEQ THEN CONDITIONAL := 4 ELSE
IF OPCODE = XGRT THEN CONDITIONAL := 5 ELSE
IF OPCODE = XGEQ THEN CONDITIONAL := 6
END (*WITH*)
END; (*CONDITIONAL*)
FUNCTION GETHEX:BOOLEAN;
VAR I: INTEGER;
BEGIN
GETHEX := FALSE;
WHILE (LINEBUFÆCHCNTÅ=' ') AND (CHCNT<LINELEN) DO CHCNT := CHCNT + 1;
IF LINEBUFÆCHCNTÅ <> ' '
THEN BEGIN
GETHEX := TRUE;
FOR I := 0 TO 3 DO
BEGIN
LTEMPÆIÅ := 16 * HEXBIN(ASCIIÆLINEBUFÆCHCNTÅÅ) +
HEXBIN(ASCIIÆLINEBUFÆCHCNT + 1ÅÅ);
CHCNT := CHCNT + 2
END
END;
IF LINEBUFÆCHCNTÅ <> ' ' THEN GETHEX := FALSE;
END ; (*GETHEX*)
PROCEDURE GETSTRING;
BEGIN
WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
CHCNT := CHCNT + 1;
IF LINEBUFÆCHCNTÅ <> '''' THEN
BEGIN ERROR('STRING EXPECTED ');
VSTRING := BLANKS END
ELSE BEGIN
ALENGTH := 0;
REPEAT
REPEAT
CHCNT := CHCNT + 1;
ALENGTH := ALENGTH + 1;
IF ALENGTH <= STRLENGTH THEN
VSTRINGÆALENGTHÅ := LINEBUFÆCHCNTÅ;
UNTIL (LINEBUFÆCHCNTÅ = '''') OR (CHCNT = LINELEN);
CHCNT := CHCNT + 1
UNTIL LINEBUFÆCHCNTÅ <> '''';
IF ALENGTH > STRLENGTH
THEN ALENGTH := STRLENGTH
ELSE ALENGTH := ALENGTH - 1;
END
END; (*GETSTRING*)
FUNCTION GETINTEGER :INTEGER;
VAR I: INTEGER;
CH: CHAR;
MINUS: BOOLEAN;
BEGIN
WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
CHCNT := CHCNT + 1;
I := 0;
MINUS := LINEBUFÆCHCNTÅ = '-';
IF MINUS THEN CHCNT := CHCNT + 1;
WHILE (LINEBUFÆCHCNTÅ <> ' ') AND (CHCNT < LINELEN) DO
BEGIN
CH := LINEBUFÆCHCNTÅ;
IF (CH >= '0') AND (CH <= '9')
THEN I := I*10 + ORD(CH)-ORD('0')
(*RM*) ELSE IF LINEBUFÆCHCNTÅ <> ',' THEN ERROR('MALFORMED INTEGER ');
CHCNT := CHCNT + 1
END;
IF MINUS THEN GETINTEGER := -1*I ELSE GETINTEGER := I
END; (*GETINTEGER*)
PROCEDURE BUILDADDR (VAR ADDR: EFFADDR; KMODE: EAMODE;
KREG, KXREG: REGISTER; KDISPL: INTEGER);
BEGIN WITH ADDR DO BEGIN
MODE := KMODE;
REG := KREG;
XREG := KXREG;
DISPL:= KDISPL
END END; (*BUILDADDR*)
(*----------------------------------------------------------------------
MULTIPLE PRECISION ARITHMETIC ROUTINES
-----------------------------------------------------------------------*)
PROCEDURE PLINT(VAR FIL:TEXT; X:LINT); (* WRITE LONG VALUE *)
VAR I: INTEGER;
BEGIN
FOR I := 0 TO LDIGIT DO
WRITE(FIL,HEXDATAÆ(XÆIÅ DIV 16) + 1Å:1,
HEXDATAÆ(XÆIÅ MOD 16) + 1Å:1);
END; (*PLINT*)
FUNCTION SDV(VAR X: LINT; S: INTEGER): INTEGER; (*DIVIDE LONG BY INTEGER *)
(* X := X / S (UNSIGNED) *)
VAR
I, CARRY: INTEGER;
Z: LINT;
BEGIN
FOR I := LDIGIT DOWNTO 0 DO ZÆIÅ := 0;
IF S > 0 THEN
BEGIN
CARRY := 0;
FOR I := 0 TO LDIGIT DO
BEGIN
CARRY := CARRY * MAXDIGIT + XÆIÅ;
WHILE CARRY >= S DO
BEGIN
ZÆIÅ := ZÆIÅ + 1;
CARRY := CARRY - S;
END;
END;
END;
FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
SDV := CARRY;
END; (*SDV*)
FUNCTION SHORT(VAR X:LINT):BOOLEAN; (* DETERMINE IF LINT IS SHORT*)
VAR
I: INTEGER;
BEGIN
SHORT := FALSE;
IF ((XÆ0Å=0) AND (XÆ1Å=0) AND (XÆ2Å<128))
OR ((XÆ0Å=255) AND (XÆ1Å=255) AND (XÆ2Å>127))
THEN SHORT := TRUE
END; (*SHORT*)
PROCEDURE CLR(VAR X: LINT); (* CLEAR LONG VALUE *)
(* X := 0 *)
VAR
I: INTEGER;
BEGIN
FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := 0;
END; (*CLR*)
PROCEDURE LSB(VAR X: LINT; Y: LINT); (* SUBTRACT LONG FROM LONG *)
VAR
I, B: INTEGER;
BEGIN
B := 0; (* SET BORROW TO 0 *)
FOR I := LDIGIT DOWNTO 0 DO
BEGIN
XÆIÅ := XÆIÅ - YÆIÅ - B;
B := 0; (* RESET CARRY *)
IF XÆIÅ < 0
THEN
BEGIN
XÆIÅ := XÆIÅ + 256;
B := 1
END (*THEN*)
END (*FOR*)
END; (*LSB*)
PROCEDURE SSB(VAR X: LINT; S: INTEGER); FORWARD;
PROCEDURE SAD(VAR X: LINT; S: INTEGER); (* ADD INTEGER TO LONG *)
(* X := X + S *)
VAR
I,CARRY: INTEGER;
Z: LINT;
BEGIN
IF S < 0
THEN SSB(X, -S)
ELSE
BEGIN
CARRY := S;
FOR I := LDIGIT DOWNTO 0 DO
BEGIN
ZÆIÅ := XÆIÅ + CARRY;
IF ZÆIÅ > TOPDIGIT
THEN
BEGIN
CARRY := ZÆIÅ DIV MAXDIGIT;
ZÆIÅ := ZÆIÅ MOD MAXDIGIT;
END
ELSE CARRY := 0;
END;
FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
END
END; (*SAD*)
PROCEDURE SSB(* (VAR X: LINT; S: INTEGER) *); (* SUBTRACT INTEGER FROM LONG *)
(* X := X - S *)
VAR
I,BORROW: INTEGER;
Z: LINT;
BEGIN
(*0321D*) IF (S<0) AND (-S > 0) (* CHECKS FOR -32768 *)
THEN SAD(X, -S)
ELSE
BEGIN
BORROW := S;
FOR I := LDIGIT DOWNTO 0 DO
BEGIN
ZÆIÅ := XÆIÅ - BORROW;
IF ZÆIÅ < 0
THEN
BEGIN
BORROW := - (ZÆIÅ DIV MAXDIGIT);
ZÆIÅ := ZÆIÅ MOD MAXDIGIT;
IF ZÆIÅ < 0
THEN
BEGIN
BORROW := BORROW + 1;
ZÆIÅ := ZÆIÅ + MAXDIGIT;
END; (*BEGIN*)
END (*THEN*)
ELSE BORROW := 0;
END; (*FOR*)
FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
END (*ELSE*)
END; (*SSB*)
PROCEDURE LASGN(VAR X: INTEGER; Y: LINT); (* MOVE LONG TO SHORT*)
VAR
I, J: INTEGER;
BEGIN
J := YÆLDIGIT -1Å;
IF J > 127 THEN J := J - 256;
X := 256 * J + YÆLDIGITÅ
END; (* LASGN *)
PROCEDURE ASGN(VAR X: LINT; Y: LINT); (* MOVE LONG TO LONG *)
(* X := Y *)
BEGIN
X := Y;
END; (*ASGN*)
PROCEDURE SASGN(VAR X: LINT; Y: INTEGER); (* MOVE INTEGER TO LONG *)
(* X := LINT Y *)
VAR
I: INTEGER;
BEGIN
CLR(X);
IF Y > 0
THEN SAD(X,Y)
ELSE IF Y < 0
THEN SSB(X,-Y);
END; (*ASGN*)
PROCEDURE SHL(VAR X: LINT; S: INTEGER); (* SHIFT LONG LEFT INTEGER TIMES*)
(* X := X SHIFTED LEFT BY S BITS *)
VAR
I,J,CARRY: INTEGER;
Z: LINT;
BEGIN
FOR I := LDIGIT DOWNTO 0 DO ZÆIÅ := XÆIÅ;
FOR J := 1 TO S DIV BITSPERDIGIT DO
BEGIN
FOR I := 0 TO LDIGIT - 1 DO ZÆIÅ := ZÆI + 1Å;
ZÆLDIGITÅ := 0;
END;
FOR J := 1 TO S MOD BITSPERDIGIT DO
BEGIN
CARRY := 0;
FOR I := LDIGIT DOWNTO 0 DO
BEGIN
ZÆIÅ := 2 * ZÆIÅ + CARRY;
IF ZÆIÅ > TOPDIGIT
THEN
BEGIN
ZÆIÅ := ZÆIÅ - MAXDIGIT;
CARRY := 1;
END (*THEN*)
ELSE CARRY := 0;
END (*FOR*)
END; (*FOR*)
FOR I := LDIGIT DOWNTO 0 DO XÆIÅ := ZÆIÅ;
END; (*SHL*)
(*-------------------------------------------------------------------------
CODE GENERATION SECTION
-------------------------------------------------------------------------*)
(*604*) PROCEDURE PCPRINT;
(*604*) BEGIN
(*604*) IF ODD(DEBUG)
(*604*) THEN
(*604*) BEGIN
(*604*) PLINT(LISTING,PC);
(*604*) WRITE(LISTING,' ':21)
(*604*) END
(*604*) END; (* PCPRINT*)
PROCEDURE EMITCODE;
VAR
II, I, J, HI, MD, LO, CHKSUM: INTEGER;
SAVE: LINT;
PROCEDURE EMITBYTE(DATA: INTEGER); (*EXPAND BYTE INTO TWO HEX DIGITS*)
VAR
HI, LO: INTEGER;
CH: CHAR;
BEGIN (*EMITBYTE*)
CHKSUM := CHKSUM + DATA;
HI := DATA DIV 16;
LO := DATA MOD 16;
IF HI < 10
THEN CH := CHR(ORD('0') + HI)
ELSE CH := CHR(ORD('A') + HI - 10);
WRITE(OBJECT,CH);
IF LO < 10
THEN CH := CHR(ORD('0') + LO)
ELSE CH := CHR(ORD('A') + LO - 10);
WRITE(OBJECT,CH);
END; (*EMITBYTE*)
BEGIN (*EMITCODE*)
IF (CORECOUNT>0)
THEN
BEGIN
I := LOCOUNT;
WHILE I <= CORECOUNT DO
BEGIN
CHKSUM := 0;
IF CORECOUNT - I >= 31
THEN J := I + 31
ELSE J := CORECOUNT;
ASGN(SAVE,GENLOC);
(* LO := GENLOCÆLDIGITÅ; *)
(* MD := GENLOCÆLDIGIT-1Å; *)
(* HI := GENLOCÆLDIGIT-2Å; *)
LO := SDV(GENLOC,256);
MD := SDV(GENLOC,256);
HI := SDV(GENLOC,256);
ASGN(GENLOC,SAVE);
IF HI = 0
THEN BEGIN
WRITE(OBJECT,'S1');
EMITBYTE(J-I+4)
END
ELSE BEGIN
WRITE(OBJECT,'S2');
EMITBYTE(J-I+5)
END;
IF HI <> 0
THEN EMITBYTE(HI);
EMITBYTE(MD);
EMITBYTE(LO); (* EMIT ADDRESS FIELD *)
FOR II := I TO J DO
BEGIN
IF (COREÆIIÅ < 0) OR (COREÆIIÅ > 256)
THEN
BEGIN
ERROR('BAD EMIT DATA ');
WRITELN(LISTING,'VALUE ',COREÆIIÅ,' AT ',II,
' PC=') ;
PLINT(LISTING,PC)
END; (*THEN*)
EMITBYTE(COREÆIIÅ);
END; (*FOR*)
EMITBYTE(255-(CHKSUM MOD 256));
WRITELN(OBJECT,' ');
SAD(GENLOC,J-I+1);
I := J + 1;
END; (*WHILE*)
CORECOUNT := 0;
IF LOCOUNT = 1 THEN COREBASE := PC;
END; (*THEN*)
END; (*EMITCODE*)
PROCEDURE EMITEND;
BEGIN
WRITELN(OBJECT,'S9030000FC');
END; (*EMITEND*)
PROCEDURE FLUSH; (*CURRENTLY CALLED AT END OF EACH BASIC BLOCK*)
(*I.E. ONLY LOCAL OPTIMIZATION IS BEING DONE*)
PROCEDURE GENERATE(INSTR: IPTR);
VAR SOURCE, DEST: EFFADDR;
TEMPESD: ^ESD;
K: INTEGER;
OPCDE: TARGETOP;
PROCEDURE RESETLABEL;
VAR I: INTEGER;
BEGIN
FOR I:= 0 TO HIGHLABEL DO
BEGIN LABELTABLEÆIÅ.DEFINED :=FALSE;
LABELTABLEÆIÅ.REFCHAIN := NIL;
LABELTABLEÆIÅ.REFED :=FALSE
END;
IF TOPLABEL < HIGHLABEL THEN TOPLABEL := HIGHLABEL;
(*#*) LABELOFFSET := LABELOFFSET + HIGHLABEL; HIGHLABEL := 0;
END;
PROCEDURE GENX(OP: TARGETOP; SIZE: INTEGER; EA1,EA2: EFFADDR); FORWARD;
(*RM*) PROCEDURE VSTRINGIMMED(STARTCH,COUNT: INTEGER);
(*RM*) VAR K: INTEGER;
(*RM*) BEGIN
WITH INSTR^ DO BEGIN
WRITE(LISTING,'''':1);
K := STARTCH;
(*RM*) WHILE K < STARTCH + COUNT DO BEGIN
EAIMMED.DISPL := ASCIIÆOPSTRING^.VSTRINGAÆKÅÅ;
GENX(TDC,1,EAIMMED,EANONE);
(*RM*) IF OPSTRING^.VSTRINGAÆKÅ = '''' THEN WRITE(LISTING,'''''':2)
(*RM*) ELSE WRITE(LISTING,OPSTRING^.VSTRINGAÆKÅ:1);
(*RM*) K := K + 1
(*RM*) END;
(*RM*) WRITE(LISTING,'''':1)
(*RM*) END (* WITH *)
(*RM*) END; (* VSTRINGIMMED *)
(*RM*) PROCEDURE HEXVSTRING(K:INTEGER);
(*RM*) VAR I:INTEGER;
CH:CHAR;
(*RM*) BEGIN
(*RM*) WITH INSTR^ DO BEGIN
(*RM*) FOR I := 1 TO 8 DO
BEGIN
CH:=OPSET^.SETVÆ K + 1 Å;
(*RM*) WRITE(LISTING, CH :1) ;
IF NOT ODD(I)
THEN BEGIN
EAIMMED.DISPL := 16 *
HEXBIN(ASCIIÆOPSET^.SETVÆK + I - 1ÅÅ) +
HEXBIN(ASCIIÆOPSET^.SETVÆK + IÅÅ);
GENX(TDC,1,EAIMMED,EANONE);
END; (*IF*)
(*RM*) END (*FOR*)
END; (*WITH*)
(*RM*) END; (* HEXVSTRING *)
PROCEDURE GENX (* (OP:TARGETOP; SIZE: INTEGER; EA1,EA2: EFFADDR) *) ;
VAR I, SUBOP, OPC, OPI: INTEGER;
PROCEDURE PRINTINSTRUCTION;
VAR BYTES: INTEGER;
PROCEDURE PRINTEA(EA: EFFADDR);
VAR AR: INTEGER;
BEGIN WITH EA DO
BEGIN
AR := ORD(REG)-ORD(A0);
CASE MODE OF
NONE: ;
DDIRECT: WRITE(LISTING, 'D',ORD(REG)-ORD(D0):1);
ADIRECT: WRITE(LISTING, 'A', AR:1);
DEFER: WRITE(LISTING, '(A', AR:1, ')');
INCR: WRITE(LISTING, '(A', AR:1,')+');
DECR: WRITE(LISTING, '-(A', AR:1,')');
BASED: WRITE(LISTING, DISPL:1, '(A', AR:1,
')');
INDEX: WRITE(LISTING, DISPL:1,
'(A', AR:1, ',', 'D', ORD(XREG)-ORD(D0):1,')');
ABSOLUTE: WRITE(LISTING,DISPL:1);
IMMED: WRITE(LISTING,'#',DISPL:1);
RELATIVE: BEGIN
WRITE(LISTING,'*');
IF DISPL> 0 THEN
WRITE(LISTING,'+',DISPL:1)
ELSE IF DISPL< 0 THEN WRITE(LISTING,DISPL:1)
END;
LABELLED: IF CURROPCODE = XCUP
THEN WRITE(LISTING,'USER':4,DISPL:1)
ELSE WRITE(LISTING,
'L',DISPL + LABELOFFSET:1);
LABIMMED: BEGIN
IF DISPL <0 THEN WRITE(LISTING,'#-L',-DISPL:1)
ELSE WRITE(LISTING,'#L',DISPL + LABELOFFSET:1)
END;
(*RM*) PIMMED: BEGIN
(*RM*) WRITE(LISTING,'#$':2);
(*RM*) HEXVSTRING(DISPL)
(*RM*) END;
(*RM*) STSHORT: BEGIN
(*RM*) WRITE(LISTING,'#':1);
(*RM*) VSTRINGIMMED(DISPL,2)
(*RM*) END;
(*RM*) STLONG : BEGIN
(*RM*) WRITE(LISTING,'#':1);
(*RM*) VSTRINGIMMED(DISPL,4)
(*RM*) END;
LIMMED: BEGIN
WITH INSTR^ DO BEGIN
WRITE(LISTING,'#$');
WRITE(LISTING,HEXDATAÆOPAND1 DIV 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND1 MOD 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND2 DIV 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND2 MOD 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND3 DIV 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND3 MOD 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND4 DIV 16 + 1Å);
WRITE(LISTING,HEXDATAÆOPAND4 MOD 16 + 1Å);
END
END;
(*RM*) XEXTERNAL: BEGIN WRITE(LISTING,'X',MNÆINSTR^.OPCODEÅ:3);
IF INSTR^.D1TYPE <> NOTATYP THEN
WRITE(LISTING,DNAMEÆINSTR^.D1TYPEÅ:1);
IF INSTR^.DTYPE <> NOTATYP THEN
WRITE(LISTING,DNAMEÆINSTR^.DTYPEÅ:1);
END; (* XEXTERNAL *)
PCINDEX: BEGIN WRITE(LISTING,'***PCINDEX***') END;
END END;
END; (*PRINTEA*)
BEGIN (*PRINTINSTRUCTION*)
WRITE(LISTING, ' ':10);
FOR BYTES:=1 TO 5 DO IF TMNÆOP,BYTESÅ<>' ' THEN WRITE
(LISTING, TMNÆOP,BYTESÅ);
IF SIZE = 1 THEN WRITE(LISTING,'.B ')
ELSE IF SIZE >= 4 THEN WRITE(LISTING,'.L ')
ELSE WRITE(LISTING,' ');
PRINTEA(EA1);
IF EA2.MODE <> NONE THEN BEGIN
WRITE(LISTING,',');
PRINTEA(EA2);
END;
IF FLPC THEN
BEGIN
WRITE(LISTING,' ':2,'***** FLUSH ',
MNÆINSTR^.OPCODEÅ);
FLPC := FALSE
END;
IF EA1.REG = A3
THEN WRITE(LISTING,' ',MNÆINSTR^.OPCODEÅ:3,
DNAMEÆINSTR^.D1TYPEÅ:1,
DNAMEÆINSTR^.DTYPEÅ:1);
WRITELN(LISTING,' ');
END; (*PRINTINSTRUCTION*)
PROCEDURE BUFFER(VALU: LINT; SIZE: INTEGER); (* PUT LONG VALUE IN CORE*)
VAR
I,B: INTEGER;
V: LINT;
PROCEDURE HEXWRITE(DATA: INTEGER); (*WRITE CONTENTS OF CORE CELL*)
VAR HI, LO: INTEGER;
CH: CHAR;
BEGIN
IF (DATA < 0) OR (DATA > 256)
THEN ERROR('BAD DATA IN HEXWRITE');
HI := DATA DIV 16;
LO := DATA MOD 16;
IF HI < 10
THEN CH := CHR(ORD('0') + HI)
ELSE CH := CHR(ORD('A') + HI - 10);
IF ODD(DEBUG) AND (OP <> TDC) THEN
BEGIN
MACHCODEÆMACHINDEXÅ := CH;
MACHINDEX := MACHINDEX + 1
END;
IF LO < 10
THEN CH := CHR(ORD('0') + LO)
ELSE CH := CHR(ORD('A') + LO - 10);
IF ODD(DEBUG) AND (OP <> TDC) THEN
BEGIN
MACHCODEÆMACHINDEXÅ := CH;
MACHINDEX := MACHINDEX + 1
END;
END; (*HEXWRITE*)
BEGIN (* BUFFER *)
IF SIZE + CORECOUNT > MAXCORE - 22
THEN EMITCODE;
FOR I := 1 TO SIZE DO
COREÆCORECOUNT + IÅ := VALUÆLDIGIT - SIZE + IÅ;
FOR I := 1 TO SIZE DO HEXWRITE(COREÆCORECOUNT + IÅ );
CORECOUNT := CORECOUNT + SIZE;
SAD(PC, SIZE);
IF ODD(DEBUG) AND (OP <> TDC) THEN MACHINDEX := MACHINDEX + 1;
END; (*BUFFER *)
PROCEDURE GEN8(A: INTEGER);
VAR
L: LINT;
BEGIN
SASGN(L, A);
BUFFER(L, 1);
END; (* GEN8*)
PROCEDURE GEN16(A: INTEGER);
VAR
L: LINT;
BEGIN
SASGN(L, A);
BUFFER(L, 2);
END; (*GEN16*)
PROCEDURE GEN448(A,B,C: INTEGER);
VAR
L: LINT;
BEGIN
IF C < 0 THEN C := C + 256; (* ADJUST TO ONE BYTE *)
SASGN(L, A);
SHL(L, 4); SAD(L, B);
SHL(L, 8); SAD(L, C);
BUFFER(L, 2)
END; (*GEN448*)
PROCEDURE GEN43333(A,B,C,D,E: INTEGER);
VAR
L: LINT;
BEGIN
SASGN(L, A);
SHL(L, 3); SAD(L, B);
SHL(L, 3); SAD(L, C);
SHL(L, 3); SAD(L, D);
SHL(L, 3); SAD(L, E);
BUFFER(L, 2);
END; (*GEN43333*)
PROCEDURE GEN4318(A,B,C,D: INTEGER);
VAR
L: LINT;
BEGIN
IF D < 0 THEN D := D + 256; (* ADJUST LENGTH OF OPERAND *)
SASGN(L, A);
SHL(L, 3); SAD(L, B);
SHL(L, 1); SAD(L, C);
SHL(L, 8); SAD(L, D);
BUFFER(L, 2);
END; (*GEN4318*)
PROCEDURE GENNULL; (* WRITE SOME SPACES*)
BEGIN
END; (*GENNULL*)
PROCEDURE GENEAEXT(E: EFFADDR);
VAR
R: INTEGER;
K: LINT;
BEGIN
IF E.MODE >= BASED
THEN IF (E.MODE=INDEX) OR (E.MODE=PCINDEX)
THEN
BEGIN
IF E.DISPL < 0 THEN E.DISPL := E.DISPL + 256;
IF E.XREG < ANONE
THEN R := ORD(E.XREG) - ORD(D0)
ELSE R := ORD(E.XREG) - ORD(A0) + 8;
SASGN(K, R);
SHL(K, 1);
IF NOT(REGTYPEÆE.XREGÅ IN ÆITYP,BTYP,CTYP,HTYPÅ)
THEN SAD(K, 1);
SHL(K, 11); SAD(K, E.DISPL);
BUFFER(K, 2);
END
ELSE
BEGIN
IF E.MODE = RELATIVE THEN E.DISPL := E.DISPL - 2;
SASGN(K, E.DISPL);
IF (E.MODE = IMMED) AND (SIZE = 4) THEN BUFFER(K,4) ELSE
IF NOT ( E.MODE IN ÆPIMMED, STSHORT, STLONG,LIMMEDÅ ) THEN
BUFFER(K, 2) (* 4 INSTEAD OF 2 FOR ABS/IMMED LONG*)
ELSE IF E.MODE = LIMMED
THEN BEGIN
WITH INSTR^ DO BEGIN
KÆ0Å := OPAND1;
KÆ1Å := OPAND2;
KÆ2Å := OPAND3;
KÆ3Å := OPAND4;
BUFFER(K,4)
END
END
END
ELSE IF OP <> TMOVE
THEN GENNULL
END; (*GENEAEXT*)
FUNCTION REG(EA: EFFADDR): INTEGER;
(* GENERATE CODED VALUE OF REG FIELD FOR GIVEN EFFECTIVE ADDRESS *)
BEGIN
IF EA.MODE < STSHORT
THEN IF (EA.REG = DNONE) OR (EA.REG = ANONE)
THEN ERROR('A/DNONE IN SUBR REG ')
ELSE IF EA.REG < ANONE
THEN REG := ORD(EA.REG) - ORD(D0)
ELSE REG := ORD(EA.REG) - ORD(A0)
ELSE CASE EA.MODE OF
ABSOLUTE: REG := 0;
RELATIVE: REG := 2;
PCINDEX: REG := 3;
IMMED: REG := 4;
LIMMED: REG := 4;
LABELLED: REG := 2; (*?*)
LABIMMED: REG := 4; (*?*)
PIMMED: REG := 4;
STSHORT: REG := 4;
STLONG: REG := 4;
XEXTERNAL: REG := 2;
END (*CASE*)
END; (*REG*)
FUNCTION MODE(EA: EFFADDR): INTEGER;
(* GENERATE CODED VALUE OF MODE FIELD FOR GIVEN EFFECTIVE ADDRESS*)
BEGIN
CASE EA.MODE OF
DDIRECT: MODE := 0;
ADIRECT: MODE := 1;
DEFER: MODE := 2;
INCR: MODE := 3;
DECR: MODE := 4;
BASED: MODE := 5;
INDEX: MODE := 6;
PCINDEX: MODE := 7;
ABSOLUTE:MODE := 7;
IMMED: MODE := 7;
LIMMED: MODE := 7;
RELATIVE:MODE := 7;
LABELLED:MODE := 7; (*?*)
LABIMMED:MODE := 7; (*?*)
NONE: MODE := 7;
PIMMED: MODE := 7;
STSHORT: MODE := 7;
STLONG: MODE := 7;
XEXTERNAL:MODE := 7;
END (* CASE*)
END; (*MODE*)
BEGIN (*GENX*)
IF EA1.MODE = LIMMED
THEN WITH INSTR^ DO
IF OPAND1 + OPAND2 + OPAND3 + OPAND4 = 0
THEN BEGIN
IF (OP=TMOVE) OR (OP=TCMP)
THEN BEGIN
EA1.MODE := IMMED;
EA1.DISPL := 0
END
END
ELSE IF OPAND1 + OPAND2 + OPAND3 = 0
THEN BEGIN
IF (OP=TADD) OR (OP=TSUB)
AND (OPAND4 > 0) AND (OPAND4 <= 8)
THEN BEGIN
EA1.MODE := IMMED;
EA1.DISPL := OPAND4
END
ELSE
IF (OP=TMOVE)
AND (OPAND4 > 0) AND (OPAND4 < 128)
THEN BEGIN
EA1.MODE := IMMED;
EA1.DISPL := OPAND4
END
END
ELSE
IF (OPAND1 + OPAND2 + OPAND3 = 765)
AND (OP=TMOVE)
AND (OPAND4 > 127) AND (OPAND4 < 256)
THEN BEGIN
EA1.MODE := IMMED;
EA1.DISPL := OPAND4 -256
END;
(* CHECK FOR MOVEQ, ADDQ, SUBQ *)
IF OP = TMOVE
THEN
BEGIN
IF ((EA1.MODE=IMMED) AND (EA1.DISPL=0) AND (EA2.MODE<>ADIRECT))
THEN
BEGIN
EA1 := EA2;
EA2 := EANONE;
OP := TCLR;
END
ELSE
(*0423A*) IF (EA2.MODE = DDIRECT) AND (EA1.DISPL > -128)
AND (EA1.DISPL < 128)
AND (EA1.MODE = IMMED)
THEN
BEGIN
OP := TMOVEQ;
SIZE := 4
END; (*THEN*)
END; (* THEN*)
IF (OP = TADD) OR (OP = TSUB)
THEN
BEGIN
IF (EA1.MODE=IMMED) AND (EA1.DISPL > 0) AND (EA1.DISPL<=8)
THEN
BEGIN
IF OP = TADD
THEN OP := TADDQ
ELSE OP := TSUBQ
END (*THEN*)
END; (*THEN*)
(* CHECK FOR CMP THAT CAN BE TST *)
IF OP = TCMP
THEN
BEGIN
IF ((EA1.MODE=IMMED) AND (EA1.DISPL = 0) AND (EA2.MODE<>ADIRECT))
THEN
BEGIN
EA1 := EA2;
EA2 := EANONE;
OP := TTST
END
END;
IF ODD(DEBUG) AND (OP <> TDC) AND (OP<>TEQU) THEN BEGIN PLINT(LISTING,PC);
WRITE(LISTING,' ')
END ;
CASE OP OF
TMOVE: BEGIN
CASE SIZE OF 1: I:=1;
2: I:=3;
(*RM*) 4: I:=2
END; (*CASE*)
GEN43333(I, REG(EA2), MODE(EA2), MODE(EA1), REG(EA1));
GENEAEXT(EA1); GENEAEXT(EA2);
IF (EA1.MODE < BASED) AND (EA2.MODE < BASED)
THEN GENNULL
END; (*TMOVE*)
TLINK: BEGIN
GEN43333(4,7,1,2,ORD(EA1.REG)-ORD(A0));
GENEAEXT(EA2)
END; (*TLINK*)
TUNLK: BEGIN
GEN43333(4,7,1,3,ORD(EA1.REG)-ORD(A0));
GENNULL
END;
TRTS : BEGIN
GEN43333(4,7,1,6,5);
GENNULL
END;
TTST, TCLR, TNEG, TCOMP:
BEGIN
IF SIZE = 1
THEN I := 0
ELSE IF SIZE = 4
THEN I := 2
ELSE I := 1;
CASE OP OF TTST: SUBOP := 5;
TCLR: SUBOP := 1;
TNEG: SUBOP := 2;
TCOMP: SUBOP := 3
END (*CASE*);
GEN43333(4,SUBOP,I,MODE(EA1),REG(EA1));
GENEAEXT(EA1);
END; (*TTST*)
TBTST, TBSET:
BEGIN
IF OP = TBTST
THEN SUBOP := 0 (*BTST*)
ELSE SUBOP := 3; (*BSET*)
IF EA1.MODE = IMMED
THEN
BEGIN
GEN43333(0,4,SUBOP,MODE(EA2),REG(EA2));
GENEAEXT(EA2);
GENEAEXT(EA1) (* BIT NUMBER *)
END
ELSE
BEGIN
GEN43333(0,REG(EA1),4+SUBOP,MODE(EA2),REG(EA2));
GENEAEXT(EA2);
END
END; (*TBTST*)
TOR, TEOR, TSUB, TAND, TADD, TCMP:
BEGIN
IF SIZE = 1
THEN I := 0
ELSE IF SIZE = 4
THEN I := 2
ELSE I := 1;
CASE OP OF
TOR: BEGIN OPC := 8; OPI := 0 END;
TEOR:BEGIN OPC := 11; OPI := 5 END;
TSUB: BEGIN OPC := 9; OPI := 2 END;
TCMP: BEGIN OPC := 11; OPI := 6 END;
TAND: BEGIN OPC := 12; OPI := 1 END;
TADD: BEGIN OPC := 13; OPI := 3 END
END; (*CASE*)
IF (EA1.MODE IN ÆIMMED,LABELLED,LABIMMED,LIMMED,
PIMMED,STSHORT,STLONGÅ) AND (EA2.MODE <> ADIRECT)
THEN
BEGIN
GEN43333(0,OPI,I,MODE(EA2),REG(EA2));
GENEAEXT(EA1);
IF EA2.MODE >= BASED
THEN GENEAEXT(EA2);
END (*THEN*)
ELSE
IF EA2.MODE = ADIRECT
THEN
BEGIN
IF I = 2
THEN SUBOP := 7
ELSE SUBOP := 3;
GEN43333(OPC,REG(EA2),SUBOP,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END (*THEN*)
ELSE
IF (EA2.MODE=DDIRECT) AND (OP<>TEOR)
THEN
BEGIN
GEN43333(OPC,REG(EA2),I,
MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END (*THEN*)
ELSE
IF EA1.MODE = DDIRECT
THEN
BEGIN
IF OP = TCMP
THEN
ERROR('TO MEMORY COMPARE ');
GEN43333(OPC,REG(EA1),4+I,
MODE(EA2),REG(EA2));
GENEAEXT(EA2)
END (*THEN*)
ELSE ERROR('MEMORY/MEMORY +-ETC ')
END; (*TOR*)
TMULS, TDIVS:
BEGIN
CASE OP OF
TMULS: OPC := 12;
TDIVS: OPC := 8
END; (*CASE*)
GEN43333(OPC,REG(EA2),7,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END; (*TMULS*)
TTRAP: BEGIN
GEN448(4,14,64 + EA1.DISPL);
GENNULL
END; (*TTRAP*)
TSEQ, TSNE, TSLT, TSNZ, TSLE, TSGT, TSGE:
BEGIN
CASE OP OF
TSEQ: SUBOP := 7;
TSNE: SUBOP := 6;
TSNZ: SUBOP := 6;
TSLT: SUBOP := 13;
TSLE: SUBOP := 15;
TSGT: SUBOP := 14;
TSGE: SUBOP := 12;
END; (*CASE*)
GEN43333(5,SUBOP DIV 2,4*(SUBOP MOD 2) + 3,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END; (*TSEQ*)
TJMP, TJSR: BEGIN
CASE OP OF
TJMP: SUBOP := 3;
TJSR: SUBOP := 2
END; (*CASE*)
GEN43333(4,7,SUBOP,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END; (*TJMP*)
TBRA, TBNE, TBNZ, TBGT, TBGE, TBSR, TBEQ, TBZ, TBLT, TBLE:
BEGIN
CASE OP OF
TBRA: SUBOP := 0;
TBSR: SUBOP := 1;
TBNE: SUBOP := 6;
TBNZ: SUBOP := 6;
TBEQ: SUBOP := 7;
TBZ: SUBOP := 7;
TBGE: SUBOP := 12;
TBLT: SUBOP := 13;
TBGT: SUBOP := 14;
TBLE: SUBOP := 15
END; (*CASE*)
I := EA1.DISPL;
IF EA1.MODE = RELATIVE
THEN I := I -2
ELSE IF EA1.MODE = LABELLED
THEN IF ((LABELTABLEÆIÅ.DEFINED)
AND (CURROPCODE <> XCUP))
OR ((PROCTABLEÆIÅ.DEFINED)
AND (CURROPCODE = XCUP))
THEN
BEGIN
IF CURROPCODE = XCUP
THEN LTEMP := PROCTABLEÆIÅ.LOCATION
ELSE LTEMP := LABELTABLEÆIÅ.LOCATION;
LSB(LTEMP, PC);
SSB(LTEMP, 2);
LASGN(I, LTEMP)
END
ELSE I := 0; (* FORWARD REFERENCE*)
GEN448(6,SUBOP,I);
GENNULL
END; (*TBRA*)
TMOVEQ, TLDQ: BEGIN
GEN4318(7,REG(EA2),0,EA1.DISPL);
GENNULL
END; (*TMOVEQ*)
TADDQ, TSUBQ:
BEGIN
IF SIZE = 1
THEN I := 0
ELSE IF SIZE = 4
THEN I := 2
ELSE I := 1;
IF OP = TADDQ
THEN SUBOP := 0
ELSE SUBOP := 4; (* SUBQ*)
IF EA1.DISPL = 8 THEN EA1.DISPL := 0; (* ADJUST FOR IMMED 8 *)
GEN43333(5,EA1.DISPL,SUBOP+I,MODE(EA2),REG(EA2));
IF EA1.DISPL = 0 THEN EA1.DISPL := 8; (*REPAIR IMMED 8*)
GENEAEXT(EA2)
END; (*TADDQ*)
TLEA, TCHK:
BEGIN
IF OP = TLEA
THEN SUBOP := 7
ELSE SUBOP := 6; (*CHK*)
GEN43333(4,REG(EA2),SUBOP,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END; (*TLEA*)
TPEA: BEGIN
GEN43333(4,4,1,MODE(EA1),REG(EA1));
GENEAEXT(EA1)
END; (*TPEA*)
TDC: BEGIN
IF SIZE = 1
THEN GEN8(EA1.DISPL);
IF SIZE = 2
THEN GEN16(EA1.DISPL);
END; (*TDC*)
TLBSR, TLBLT, TLBEQ, TLBRA, TLBGT, TLBNE, TLBLE, TLBGE:
BEGIN
CASE OP OF
TLBRA: SUBOP := 0;
TLBSR: SUBOP := 1;
TLBNE: SUBOP := 6;
TLBEQ: SUBOP := 7;
TLBGE: SUBOP := 12;
TLBLT: SUBOP := 13;
TLBGT: SUBOP := 14;
TLBLE: SUBOP := 15;
END; (*CASE*)
I := EA1.DISPL;
IF EA1.MODE = RELATIVE
THEN I := I
ELSE IF EA1.MODE = LABELLED
THEN IF (LABELTABLEÆIÅ.DEFINED
AND (CURROPCODE <> XCUP))
OR (PROCTABLEÆIÅ.DEFINED
AND (CURROPCODE = XCUP))
THEN
BEGIN
IF CURROPCODE = XCUP
THEN LTEMP := PROCTABLEÆIÅ.LOCATION
ELSE LTEMP := LABELTABLEÆIÅ.LOCATION;
LSB(LTEMP, PC);
SSB(LTEMP, 2);
LASGN(I, LTEMP)
END
ELSE I := 0 (*FORWARD REF*)
ELSE IF EA1.MODE = XEXTERNAL
THEN I := -(I );
GEN448(6,SUBOP,0);
SUBOP := EA1.DISPL;
EA1.DISPL := I;
GENEAEXT(EA1);
EA1.DISPL := SUBOP;
END; (*TLBSR*)
TSWAP: BEGIN
GEN43333(4,4,1,0,REG(EA1));
GENNULL
END; (*TSWAP*)
TEXTE: BEGIN
IF SIZE = 4
THEN I := 3
ELSE I := 2;
GEN43333(4,4,I,0,REG(EA1));
GENNULL
END; (*TEXTE*)
TCMPM: BEGIN
CASE SIZE OF
1: I := 4;
2: I := 5;
4: I := 6
END; (*CASE*)
GEN43333(11,REG(EA2),I,1,REG(EA1));
GENNULL
END; (*TCMPM*)
TDCNT: BEGIN (* WARNING: THIS IS OLD DCNT *)
GEN4318(7,REG(EA1),1,256 - EA2.DISPL);
GENNULL
END (*TDCNT*) ;
TASL: WRITELN(LISTING,'****ASL NOT SUPPORTED YET***');
TEQU: ;
END; (*CASE*)
IF OP <> TDC THEN
BEGIN
IF (OP <> TEQU) AND ODD(DEBUG) THEN WRITE(LISTING,MACHCODE);
MACHCODE := ' ';
MACHINDEX := 1;
PRINTINSTRUCTION
END;
END; (*GENX*)
PROCEDURE PUSHDREG;
VAR K: INTEGER;
BEGIN IF DALLOC <= 0 THEN ERROR('NO D REG TO PUSH ')
ELSE BEGIN K := SIZEÆREGTYPEÆDBOTÅÅ;
(*1204B*) IF K = 8 THEN K := 4; (* POWERSETS*)
EADDIR.REG := DBOT;
GENX(TMOVE,K,EADDIR,EAPUSH);
STKPTR:=STKPTR + 1;
IF STKPTR > STKMAX THEN ERROR('TOO MANY REG PUSHES ');
KINDSTKÆSTKPTRÅ := DREG;
TYPESTKÆSTKPTRÅ := REGTYPEÆDBOTÅ;
DALLOC := DALLOC - 1;
IF DALLOC = 0 THEN
BEGIN
DBOT := DNONE;
DTOP := DNONE
END
ELSE
DBOT := DREGSÆ(ORD(DBOT)-ORD(D0)+1) MOD NDREGSÅ;
END
END; (*PUSHDREG*)
PROCEDURE PUSHAREG;
VAR K: INTEGER;
BEGIN IF AALLOC <= 0 THEN ERROR('NO A REG TO PUSH ')
ELSE BEGIN K := SIZEÆREGTYPEÆABOTÅÅ;
EAADIR.REG := ABOT;
GENX(TMOVE,K,EAADIR,EAPUSH);
STKPTR:=STKPTR + 1;
IF STKPTR > STKMAX THEN ERROR('TOO MANY REG PUSHES ');
KINDSTKÆSTKPTRÅ := AREG;
TYPESTKÆSTKPTRÅ := REGTYPEÆABOTÅ;
AALLOC := AALLOC -1;
IF AALLOC = 0 THEN BEGIN ABOT := ANONE; ATOP := ANONE END
ELSE
ABOT := AREGSÆ(ORD(ABOT)-ORD(A0) + 1) MOD NAREGSÅ;
END
END; (*PUSHAREG*)
PROCEDURE PUSHALLD;
BEGIN WHILE DALLOC > 0 DO PUSHDREG END;
PROCEDURE PUSHALL;
BEGIN WHILE AALLOC > 0 DO PUSHAREG;
WHILE DALLOC > 0 DO PUSHDREG
END;
PROCEDURE FREEALL;
BEGIN
DALLOC := 0; DTOP := DNONE; DBOT := DNONE;
AALLOC := 0; ATOP := ANONE; ABOT := ANONE
END; (*FREEALL*)
PROCEDURE POPREG(KIND: REGKIND);
PROCEDURE POPD;
VAR K: INTEGER;
(*RM*) BEGIN
(*RM*) IF DBOT = DNONE THEN
(*RM*) BEGIN
(*RM*) DBOT := D0;
(*RM*) DTOP := D0
(*RM*) END ELSE
DBOT :=
DREGSÆ (ORD(DBOT)-ORD(D0)-1+NDREGS) MOD NDREGSÅ;
DALLOC := DALLOC + 1;
IF STKPTR < 0 THEN ERROR('POPPING EMPTY STACK ')
ELSE BEGIN
K := SIZEÆTYPESTKÆSTKPTRÅÅ;
(*1204B*) IF K = 8 THEN K := 4; (*POWERSETS*)
EADDIR.REG := DBOT;
GENX(TMOVE,K,EAPOP, EADDIR);
REGTYPEÆDBOTÅ := TYPESTKÆSTKPTRÅ;
IF STKPTR >= 0 THEN STKPTR := STKPTR -1;
DPOPCNT := DPOPCNT + 1;
END
END; (*POPD*)
PROCEDURE POPA;
VAR K: INTEGER;
(*RM*) BEGIN IF ABOT = ANONE THEN
(*RM*) BEGIN
(*RM*) ABOT := A0;
(*RM*) ATOP := A0
(*RM*) END
ELSE ABOT :=
AREGSÆ (ORD(ABOT)-ORD(A0)-1+NAREGS) MOD NAREGSÅ;
AALLOC := AALLOC + 1;
IF STKPTR < 0 THEN ERROR('POPPING EMPTY STACK ')
ELSE BEGIN
K := SIZEÆTYPESTKÆSTKPTRÅÅ;
EAADIR.REG := ABOT;
GENX(TMOVE,K,EAPOP, EAADIR);
REGTYPEÆABOTÅ := TYPESTKÆSTKPTRÅ;
IF STKPTR >= 0 THEN STKPTR := STKPTR -1;
APOPCNT := APOPCNT + 1;
END
END; (*POPA*)
BEGIN IF KIND = DREG THEN
BEGIN WHILE KINDSTKÆSTKPTRÅ <> DREG DO POPA;
(*RM*) IF STKPTR >= 0 THEN POPD
ELSE ERROR('NO D REG TO POP ')
END
ELSE
BEGIN WHILE KINDSTKÆSTKPTRÅ <> AREG DO POPD;
(*RM*) IF STKPTR >= 0 THEN POPA
ELSE ERROR('NO A REG TO POP ')
END
END;
FUNCTION PREVIOUS(R:REGISTER):REGISTER;
BEGIN
PREVIOUS := DREGSÆ(ORD(R)-ORD(D0)-1+NDREGS) MOD NDREGSÅ
END; (* PREVIOUS *)
PROCEDURE ALLOCDREG;
BEGIN
DALLOCCNT := DALLOCCNT + 1;
IF DALLOC >= NDREGS THEN BEGIN PUSHDREG;
DPUSHCNT:=DPUSHCNT+1
END;
DALLOC := DALLOC + 1;
DTOP := DREGSÆ(ORD(DTOP)-ORD(D0)+1) MOD NDREGSÅ;
IF DBOT = DNONE THEN DBOT := DTOP;
REGTYPEÆDTOPÅ := INSTR^.DTYPE;
END; (*ALLOCDREG*)
PROCEDURE ALLOCAREG;
BEGIN
AALLOCCNT := AALLOCCNT + 1;
IF AALLOC >= NAREGS THEN BEGIN PUSHAREG;
APUSHCNT:=APUSHCNT+1
END;
AALLOC := AALLOC + 1;
ATOP := AREGSÆ(ORD(ATOP)-ORD(A0)+1) MOD NAREGSÅ;
IF ABOT = ANONE THEN ABOT := ATOP;
(*1011*) REGTYPEÆATOPÅ := ATYP;
END; (*ALLOCAREG*)
PROCEDURE FREEDREG;
BEGIN IF DALLOC > 1 THEN BEGIN
DALLOC := DALLOC -1;
DTOP := DREGSÆ(ORD(DTOP)-ORD(D0)+NDREGS-1) MOD NDREGSÅ
(*-1 AND WRAPAROUND*)
END
ELSE IF DALLOC = 1 THEN BEGIN
DALLOC := 0;
(*RM*) DBOT := DNONE;
DTOP := DNONE
END
ELSE ERROR('FREE NONALLOC''D DREG')
END; (*FREEDREG*)
PROCEDURE FREEAREG;
BEGIN IF AALLOC > 1 THEN BEGIN
AALLOC := AALLOC -1;
ATOP := AREGSÆ(ORD(ATOP)-ORD(A0)+NAREGS-1) MOD NAREGSÅ
(*-1 AND WRAPAROUND*)
END
ELSE IF AALLOC = 1 THEN BEGIN
AALLOC := 0;
(*RM*) ABOT := ANONE;
ATOP := ANONE
END
ELSE ERROR('FREE NONALLOC''D AREG')
END; (*FREEAREG*)
PROCEDURE EFFADDRESS(INSTR: IPTR; VAR OPADDR: EFFADDR);
(*USED BY LOD, LDA, STR, TAKES LEVEL, OFFSET
IN OPAND1 AND OPAND2 AND RETURNS MODE,
REGISTER, AND DISPLACEMENT OF CORRESPONDING
68000 ADDRESS*)
VAR SRC: EFFADDR;
BEGIN WITH INSTR^ DO
BEGIN IF OPAND1 (*LEVEL*) = 0 THEN (*GLOBAL ACCESS*)
OPADDR.REG := A5 (*GLOBAL BASE REGISTER*)
ELSE IF OPAND1 = LEVEL THEN (*LOCAL ACCESS*)
OPADDR.REG := A6 (*FRAME POINTER*)
ELSE BEGIN
IF TEMPLEVEL <> OPAND1 THEN
BEGIN
EAADIR.REG := A4;
BUILDADDR(SRC,BASED,A5,ANONE,4*OPAND1 + 8);
GENX(TMOVE,4,SRC,EAADIR);
TEMPLEVEL := OPAND1
(*SAVE LEVEL OF DISPLAY ENTRY
CURRENTLY HELD IN A4*)
END;
OPADDR.REG := A4; (*TEMPORARY INTERMEDIATE PTR*)
END;
OPADDR.MODE := BASED;
OPADDR.DISPL := OPAND2; (*OFFSET*)
IF (OPADDR.REG = A4) OR (OPADDR.REG = A6) THEN
IF OPAND2 >= 0 THEN OPADDR.DISPL := OPAND2 + 12;
IF OPADDR.DISPL = 0 THEN OPADDR.MODE := DEFER
END;
END; (*EFFADDRESS*)
PROCEDURE DOUBLEOP(VAR SRC, DST:EFFADDR; COMMUTATIVE: BOOLEAN;
VAR SWITCH: BOOLEAN);
(*RM*) BEGIN
(*RM*) IF INSTR^.DTYPE = ATYP THEN BEGIN
(*RM*) IF NOT COMMUTATIVE OR (AALLOC>=2) THEN
(*RM*) BEGIN
(*RM*) WHILE AALLOC <= 1 DO POPREG(AREG);
(*RM*) BUILDADDR(SRC,ADIRECT,ATOP,ANONE,0);
(*RM*) FREEAREG;
(*RM*) BUILDADDR(DST,ADIRECT,ATOP,ANONE,0);
(*RM*) SWITCH := FALSE
(*RM*) END ELSE
(*RM*) BEGIN
(*RM*) IF AALLOC < 1 THEN POPREG(AREG);
(*RM*) (*AALLOC = 1 AT THIS POINT *)
(*RM*) BUILDADDR(DST,ADIRECT,ATOP,ANONE,0);
(*RM*) BUILDADDR(SRC,INCR,SP,ANONE,0);
(*RM*) SWITCH := TRUE;
(*RM*) IF NOT (INSTR^.DTYPE IN LONGTYPES) THEN STKPTR := STKPTR -1;
(*RM*) END
(*RM*) END ELSE
BEGIN IF NOT COMMUTATIVE OR (DALLOC >= 2) THEN
BEGIN
WHILE DALLOC <= 1 DO POPREG(DREG);
BUILDADDR(SRC,DDIRECT,DTOP,ANONE,0);
FREEDREG;
BUILDADDR(DST,DDIRECT,DTOP,ANONE,0);
SWITCH := FALSE
END
ELSE BEGIN
IF DALLOC < 1 THEN POPREG(DREG);
(*DALLOC = 1 AT THIS POINT*)
BUILDADDR(DST,DDIRECT,DTOP,ANONE,0);
BUILDADDR(SRC,INCR,SP,ANONE,0);
SWITCH := TRUE;
(*RM*) IF NOT (INSTR^.DTYPE IN LONGTYPES) THEN STKPTR := STKPTR -1;
END
(*RM*) END
(*RM*) END;
PROCEDURE SINGLEOP(VAR SRC:EFFADDR);
(*RM*) BEGIN
(*RM*) IF INSTR^.DTYPE = ATYP THEN
(*RM*) BEGIN IF AALLOC = 0 THEN POPREG(AREG);
(*RM*) BUILDADDR(SRC,ADIRECT,ATOP,ANONE,0)
(*RM*) END ELSE
BEGIN IF DALLOC = 0 THEN POPREG(DREG);
BUILDADDR(SRC,DDIRECT,DTOP,ANONE,0);
(*RM*) END
END;
PROCEDURE LOADBIG(ADDR: EFFADDR; BYTES: INTEGER);
(* PROCEDURE TO LOAD POWERSETS ONTO STACK *)
BEGIN
ALLOCDREG;
EADDIR.REG := DTOP;
GENX(TMOVE,4,ADDR,EADDIR);
IF ADDR.MODE = BASED
THEN ADDR.DISPL := ADDR.DISPL + 4
ELSE IF ADDR.MODE=DEFER
THEN BEGIN
ADDR.MODE := BASED;
ADDR.DISPL := 4
END
ELSE ERROR('LOADBIG W/BAD MODE ');
ALLOCDREG;
EADDIR.REG := DTOP;
GENX(TMOVE,4,ADDR,EADDIR);
END; (*LOADBIG*)
PROCEDURE STOREBIG(ADDR: EFFADDR; BYTES: INTEGER);
(* PROCEDURE TO STORE POWERSETS OFF THE STACK *)
BEGIN
EADDIR.REG := PREVIOUS(DTOP);
GENX(TMOVE,4,EADDIR,ADDR);
IF ADDR.MODE = BASED
THEN ADDR.DISPL := ADDR.DISPL + 4
ELSE IF ADDR.MODE = DEFER
THEN BEGIN
ADDR.MODE := BASED;
ADDR.DISPL := 4
END
ELSE ERROR('STOREBIG W/BAD MODE ');
EADDIR.REG := DTOP;
FREEDREG;
GENX(TMOVE,4,EADDIR,ADDR);
FREEDREG
END; (*STOREBIG*)
PROCEDURE STORELITTLE; (*GEN CODE TO MOVE TOP DATA ITEM TO MEMORY*)
BEGIN IF DALLOC > 0 THEN
BEGIN EADDIR.REG := DTOP;
GENX(TMOVE,SIZEÆINSTR^.DTYPEÅ,EADDIR,SOURCE);
FREEDREG;
END
ELSE BEGIN GENX(TMOVE,SIZEÆINSTR^.DTYPEÅ,EAPOP,SOURCE);
STKPTR := STKPTR - 1;
END
END; (*STORELITTLE*)
PROCEDURE REFERENCELABEL(LABL: INTEGER; WHERE: ADDRESS);
(* CALLED TO SAVE FORWARD REFERENCE INFO *)
BEGIN
NEW(TEMPLABREF);
WITH TEMPLABREF^ DO
BEGIN
IF INSTR^.OPCODE=XCUP
THEN NEXT := PROCTABLEÆLABLÅ.REFCHAIN
ELSE NEXT := LABELTABLEÆLABLÅ.REFCHAIN;
CORELOC := WHERE
END; (*WITH*)
IF INSTR^.OPCODE=XCUP
THEN BEGIN
PROCTABLEÆLABLÅ.REFCHAIN := TEMPLABREF;
PROCTABLEÆLABLÅ.REFED := TRUE;
CLR (PROCTABLEÆLABLÅ.LOCATION);
PROCTABLEÆLABLÅ.LOCATIONÆ0Å := 1
END (*ELSE*)
ELSE BEGIN
LABELTABLEÆLABLÅ.REFCHAIN := TEMPLABREF ;
LABELTABLEÆLABLÅ.REFED := TRUE;
IF INSTR^.OPCODE = XENT
THEN SASGN(LABELTABLEÆLABLÅ.LOCATION, -1)
ELSE CLR(LABELTABLEÆLABLÅ.LOCATION);
END; (*ELSE*)
END; (*REFERENCELABEL*)
PROCEDURE LONGBSR; (* RUNTIME ROUTINE BRANCH CALCULATION *)
VAR
I: INTEGER;
RTNAME: PCODES;
BEGIN
WITH INSTR^ DO
BEGIN
RTNAME := OPCODE;
IF DTYPE = VTYP
THEN BEGIN
IF RTNAME = XIND THEN RTNAME := XINDV
ELSE IF RTNAME = XLOD THEN RTNAME := XLODV
ELSE IF RTNAME = XSTR THEN RTNAME := XSTRV
ELSE IF RTNAME = XSTO THEN RTNAME := XSTOV
ELSE IF RTNAME = XEQU THEN RTNAME := XEQUV
ELSE IF RTNAME = XNEQ THEN RTNAME := XNEQV
ELSE IF RTNAME = XLES THEN RTNAME := XLESV
ELSE IF RTNAME = XLEQ THEN RTNAME := XLEQV
ELSE IF RTNAME = XGRT THEN RTNAME := XGRTV
ELSE IF RTNAME = XGEQ THEN RTNAME := XGEQV
ELSE IF RTNAME = XLDC THEN RTNAME := XLDCV
END
ELSE IF RTNAME = XCVT
THEN IF (D1TYPE=STYP) AND (DTYPE=UTYP)
THEN RTNAME := XCVTSU
ELSE IF (D1TYPE=UTYP) AND (DTYPE=STYP)
THEN RTNAME := XCVTUS;
CLR(LTEMP);
LSB(LTEMP,RTJUMP);
SAD(LTEMP,RTÆRTNAMEÅ);
SSB(LTEMP,4096);
LASGN(SOURCE.DISPL,LTEMP);
BUILDADDR(SOURCE,BASED,A3,ANONE,SOURCE.DISPL);
GENX(TJSR,2,SOURCE,EANONE)
END (*WITH*)
END; (*LONGBSR*)
PROCEDURE MAIN;
BEGIN
IF INSTR^.OPAND1 = 0 THEN
BEGIN
PROGSTART := PC;
MAINFLG := TRUE;
WRITELN(LISTING,'MAIN',' ':6,'EQU *');
END
ELSE WRITELN(LISTING,'USER':4,CURRLABEL:1,' EQU *')
END ; (* MAIN *)
PROCEDURE GENXXJP;
BEGIN
(*0421B*) IF DALLOC = 0 THEN POPREG(DREG);
EADDIR.REG := DTOP;
EALIMM.DISPL := INSTR^.OPAND1 + 1;
GENX(TCMP,2,EALIMM,EADDIR);
LTEMP := PC;
SSB(LTEMP, 2);
REFERENCELABEL(EALIMM.DISPL,LTEMP);
(*RM*) EAREL.DISPL := 20;
GENX(TBGT,2,EAREL,EANONE);
EALIMM.DISPL := INSTR^.OPAND1;
GENX(TSUB,2,EALIMM,EADDIR);
LTEMP := PC;
SSB(LTEMP, 2);
REFERENCELABEL(EALIMM.DISPL,LTEMP);
(*RM*) EAREL.DISPL := 14;
GENX(TBLT,2,EAREL,EANONE);
EALAB.DISPL := INSTR^.OPAND1 + 2;
ALLOCAREG;
EAADIR.REG := ATOP;
GENX(TLEA,2,EALAB,EAADIR);
LTEMP := PC;
SSB(LTEMP, 2);
REFERENCELABEL(EALAB.DISPL,LTEMP);
GENX(TADD,2,EADDIR,EADDIR);
BUILDADDR(SOURCE,INDEX,ATOP,DTOP,0);
GENX(TADD,2,SOURCE,EAADIR);
EADEFER.REG := ATOP;
GENX(TJMP,2,EADEFER,EANONE);
FREEDREG; FREEAREG
END (* GENXXJP *) ;
(*RM*) PROCEDURE LOADPSET;
(*RM*) BEGIN
(*RM*) WITH INSTR^ DO BEGIN
(*RM*) ALLOCDREG;
(*RM*) EADDIR.REG := DTOP;
(*RM*) EAPSET.DISPL := 0;
(*RM*) GENX(TMOVE,4,EAPSET,EADDIR);
(*RM*) ALLOCDREG;
(*RM*) EADDIR.REG := DTOP;
(*RM*) EAPSET.DISPL := 8;
(*RM*) GENX(TMOVE,4,EAPSET,EADDIR)
(*RM*) END
(*RM*) END; (* LOADPSET *)
PROCEDURE SETOPS;
BEGIN
WITH INSTR^ DO BEGIN
WHILE DALLOC < 4 DO POPREG(DREG);
IF OPCODE = XDIF THEN BEGIN
EADDIR.REG := DTOP;
(*1324A*) GENX(TCOMP,4,EADDIR,EANONE);
EADDIR.REG := PREVIOUS(DTOP);
(*1324A*) GENX(TCOMP,4,EADDIR,EANONE);
END;
IF OPCODE = XUNI THEN OPCDE := TOR
ELSE OPCDE := TAND;
BUILDADDR(SOURCE,DDIRECT,DTOP,DNONE,0);
EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
GENX(OPCDE,4,SOURCE,EADDIR);
SOURCE.REG := PREVIOUS(DTOP);
EADDIR.REG := PREVIOUS(PREVIOUS(PREVIOUS(DTOP)));
GENX(OPCDE,4,SOURCE,EADDIR);
FREEDREG;FREEDREG;
END
END; (* SETOPS *)
PROCEDURE PXLAB;
BEGIN WITH INSTR^ DO BEGIN
IF OPAND1 = 0 THEN OPAND1 := -1;
(*604*) PCPRINT;
WRITE(LISTING,'L',OPAND1 + LABELOFFSET:1);
BUILDADDR(SOURCE,RELATIVE,ANONE,ANONE,0);
GENX(TEQU,0,SOURCE,EANONE)
END;
END; (* PXLAB *)
PROCEDURE PXEND;
VAR I: INTEGER;
BEGIN
EMITCODE;
IF MAINFLG THEN BEGIN
GENLOC := GENSTART;
WRITE(LISTING,' RORG $');
PLINT(LISTING,GENSTART);
LTEMP := PC;
WRITELN(LISTING,' ');
LSB(LTEMP,GENSTART);
SSB(LTEMP,20);
GENSAVE := PC;
PC := GENSTART;
(* LOAD STACK *)
WRITE(LISTING,' ':39,'MOVE.L $');
PLINT(LISTING,STKSTART);
WRITELN(LISTING,',A7');
EAIMMED.DISPL := 11900; (* TMOVE 2E7C *)
GENX(TDC,2,EAIMMED,EANONE);
EAIMMED.DISPL := STKSTARTÆ0Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := STKSTARTÆ1Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := STKSTARTÆ2Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := STKSTARTÆ3Å;
GENX(TDC,1,EAIMMED,EANONE);
(* LEA 11EA,A3 *)
WRITE(LISTING,' ':39,'LEA $');
LTEMP := RTJUMP;
SAD(LTEMP,4096);
PLINT(LISTING,LTEMP);
WRITELN(LISTING,',A3');
EAIMMED.DISPL := 18425; (* LEA 47F9 *)
GENX(TDC,2,EAIMMED,EANONE);
EAIMMED.DISPL := LTEMPÆ0Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := LTEMPÆ1Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := LTEMPÆ2Å;
GENX(TDC,1,EAIMMED,EANONE);
EAIMMED.DISPL := LTEMPÆ3Å;
GENX(TDC,1,EAIMMED,EANONE);
(* JSR -490(A3) INITIALIZE ENVIRONMENT *)
LONGBSR;
IF (HEAPSTARTÆ0Å=255) AND (HEAPSTARTÆ1Å=255)
AND (HEAPSTARTÆ2Å=255) AND (HEAPSTARTÆ3Å=255)
THEN BEGIN
HEAPSTART := GENSAVE;
SAD(HEAPSTART,10)
END;
WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
PLINT(LISTING,HEAPSTART);
WRITELN(LISTING,' ');
FOR I := 0 TO 3 DO
BEGIN
EAIMMED.DISPL := HEAPSTARTÆIÅ;
GENX(TDC,1,EAIMMED,EANONE)
END;
(* BRA OR JSR TO MAIN *)
LTEMP := PROGSTART;
LSB(LTEMP,PC);
IF SHORT(LTEMP) THEN BEGIN
LASGN(EAREL.DISPL, LTEMP);
GENX(TLBRA,2,EAREL,EANONE);
END ELSE
BEGIN
EADEFER.REG := A3;
SSB(LTEMP,2);
GENX(TJSR,2,EADEFER,EANONE);
WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
PLINT(LISTING,LTEMP);
WRITELN(LISTING,' ');
FOR I := 0 TO 3 DO
BEGIN
EAIMMED.DISPL := LTEMPÆIÅ;
GENX(TDC,1,EAIMMED,EANONE)
END
END;
PC := GENSAVE;
EMITCODE;
END; (*BEGIN*)
EMITEND
;WRITELN(LISTING,' END');
END; (*PXEND*)
PROCEDURE PXDEF;
BEGIN WITH INSTR^ DO BEGIN
IF LABELED AND NOT DOLLAR THEN
BEGIN
IF OPAND1= 0 THEN OPAND1 := 1-LABELOFFSET;
(*604*) PCPRINT;
WRITE(LISTING,'L',OPAND1 + LABELOFFSET:1);
BUILDADDR(SOURCE,ABSOLUTE,ANONE,ANONE,OPAND2);
GENX(TEQU,0,SOURCE,EANONE)
END;
IF LABELED AND DOLLAR THEN
BEGIN GETSTRING;
WRITE(OUTPUT,'***** REFERENCE TO EXTERNAL PROCEDURE ',
VSTRING:ALENGTH,' AT LOCATION ');
LTEMP := EXPROC;
SSB(LTEMP,10);
PLINT(OUTPUT,LTEMP);
WRITELN(OUTPUT,' ');
END
ELSE IF NOT LABELED THEN
ERROR('DEF WITH NO LABEL ')
END;
END; (*PXDEF*)
PROCEDURE PXENT; (* OPAND1 IS NEW LEVEL*)
BEGIN WITH INSTR^ DO BEGIN
(*OPAND2 IS LABEL WHICH GIVES LOCAL DATA SZ*)
(*VSTRING IS NEW PROC/FUNC NAME*)
EMITCODE;
RESETLABEL;
MAIN;
LEVEL := OPAND1;
IF TEMPLEVEL = LEVEL THEN TEMPLEVEL := -1;
(*INVALIDATE A4 (POINTER TO INTERMEDIATE
LEXICAL LEVEL) IF DISPLAY ENTRY CHANGES*)
IF LEVEL = 1 THEN
BEGIN
WRITE(OUTPUT,'*****ENTRY TO PROCEDURE ':25,
VSTRING:ALENGTH,' AT LOCATION ');
PLINT(OUTPUT,PC);
WRITELN(OUTPUT,' ')
END;
(*1212A*) IF LEVEL = 0 THEN
(*1212A*) BEGIN
(*1212A*) EAADIR.REG := A7;
(*1212A*) EALIMM.DISPL := -OPAND2;
(*1212A*) GENX(TADD,0,EALIMM,EAADIR);
LTEMP := PC;
SSB(LTEMP, 2);
(*1212A*) REFERENCELABEL(OPAND2 - LABELOFFSET,LTEMP)
(*1212A*) END
(*1212A*) ELSE BEGIN
BUILDADDR(SOURCE,BASED,A5,ANONE,8+4*LEVEL);
(*DISPLAY IS ^A5(6)*)
GENX(TMOVE,4,SOURCE,EAPUSH);
EAADIR.REG := A6; (*FRAME POINTER*)
EALIMM.DISPL := -OPAND2 ;
GENX(TLINK,0,EAADIR,EALIMM) ;
LTEMP := PC;
SSB( LTEMP, 2);
REFERENCELABEL(OPAND2 - LABELOFFSET,LTEMP);
GENX(TMOVE,4,EAADIR,SOURCE);
(*1212A*) END;
END;
END; (* PXENT *)
PROCEDURE PXRET;
BEGIN WITH INSTR^ DO BEGIN
IF OPAND1 <> LEVEL THEN
ERROR('ENT/RET LEVELS NOT =');
EAADIR.REG := A6; (*FRAME POINTER*)
GENX(TUNLK,0,EAADIR,EANONE);
BUILDADDR(SOURCE,BASED,A5,ANONE,8+4*LEVEL);
GENX(TMOVE,4,EAPOP,SOURCE);
(*RM*) (* CODE TO FLUSH ARGUMENTS FROM STACK *)
(*RM*) IF OPAND2 <> 0 THEN
(*RM*) BEGIN
(*RM*) ALLOCAREG;
(*RM*) EAADIR.REG := ATOP;
(*RM*) GENX(TMOVE,4,EAPOP,EAADIR);
(*RM*) EAIMMED.DISPL := OPAND2;
(*RM*) EAADIR.REG := SP;
(*RM*) GENX(TADD,4,EAIMMED,EAADIR);
(*RM*) EADEFER.REG := ATOP;
(*RM*) GENX(TJMP,0,EADEFER,EANONE);
(*RM*) FREEAREG
(*RM*) END ELSE
GENX(TRTS,0,EANONE,EANONE)
END;
END; (*PXRET*)
(*604*) PROCEDURE PXAD; FORWARD;
PROCEDURE PXAB;
BEGIN WITH INSTR^ DO BEGIN
SINGLEOP(SOURCE);
(*RM*) K := SIZEÆDTYPEÅ;
CASE SUBTYPEÆOPCODEÅ OF
(*604*) 1 (*AB *): BEGIN GENX(TTST,K,SOURCE,EANONE);
(*RM*) EAREL.DISPL := 4;
GENX(TBGT,0,EAREL,EANONE);
(*604*) GENX(TNEG,K,SOURCE,EANONE)
END;
(*604*) 2 (*NG *): GENX(TNEG,K,SOURCE,EANONE);
(*RM*) 3 (*DEC*): BEGIN EAIMMED.DISPL := OPAND1;
GENX(TSUB,K,EAIMMED,SOURCE)
(*RM*) END;
(*RM*) 4 (*INC*): BEGIN EAIMMED.DISPL := OPAND1;
(*480*) IF DTYPE = ATYP THEN K := 2;
(*RM*) GENX(TADD,K,EAIMMED,SOURCE) END;
5 (*NOT*): BEGIN
OPTIMI := NEXTPCOD(INSTR);
IF OPTIMI^.OPCODE=XFJP
THEN BEGIN
OPTIMI^.OPAND3 := 102; (*BEQ TO FJP*)
END
ELSE BEGIN
(*RM*) EAIMMED.DISPL := 1;
(*RM*) GENX(TEOR,1,EAIMMED,SOURCE)
END
(*RM*) END;
(*0421C*) 6 (*ODD*): BEGIN EAIMMED.DISPL := 1;(*BIT # = 0*)
(*0421C*) GENX(TAND,1,EAIMMED,SOURCE);
(*0421C*) REGTYPEÆDTOPÅ := BTYP;
END;
(*RM*) 7 (*SQR*): (*CHECK SIZES??*)
(*604*) IF DTYPE = JTYP
(*604*) THEN BEGIN
(*604*) IF DALLOC < 1
(*604*) THEN POPREG(DREG);
(*604*) EADDIR.REG := DTOP;
(*604*) ALLOCDREG;
(*604*) BUILDADDR(DEST,DDIRECT,
(*604*) DTOP,ANONE,0);
(*604*) GENX(TMOVE,4,EADDIR,DEST);
(*604*) OPCODE := XMP;
(*604*) PXAD;
(*604*) END ELSE
(*604*) BEGIN
(*604*) IF DTYPE = HTYP
(*604*) THEN BEGIN
(*604*) IF DALLOC<1 THEN POPREG(DREG);
(*604*) BUILDADDR(SOURCE,DDIRECT,DTOP,
(*604*) ANONE,0);
(*604*) GENX(TEXTE,2,SOURCE,EANONE)
(*604*) END;
(*RM*) GENX(TMULS,2,SOURCE,SOURCE);
(*604*) END;
(* CHECK OVFL
MOV.W TO TEMP
EXT.L TEMP
CMP TEMP WITH SOURCE
BNE *+2
TRAP OVFL *)
END
END;
END; (*PXAB*)
PROCEDURE PXAD;
BEGIN WITH INSTR^ DO BEGIN
CASE SUBTYPEÆOPCODEÅ OF
(*604*) 1,3,4: COMMUTATIVE := TRUE;
(*604*) 5: IF DTYPE IN ÆJTYP,HTYPÅ THEN COMMUTATIVE := FALSE
(*604*) ELSE COMMUTATIVE := TRUE;
2,6,7: COMMUTATIVE := FALSE
END;
DOUBLEOP(SOURCE,DEST,COMMUTATIVE,SWITCH);
K := SIZEÆDTYPEÅ;
IF DTYPE = NOTATYP THEN K := 1; (* ASSUME BOOLEAN*)
(*604*) IF (DTYPE = JTYP)
(*604*) AND (SUBTYPEÆOPCODEÅ IN Æ5,6,7Å)
(*604*) THEN BEGIN
(*604*) LONGBSR;
(*604*) EAIMMED.DISPL := ORD(DEST.REG) - ORD(D0);
(*604*) PCPRINT;
(*604*) WRITELN(LISTING,' ':10,'DC.W ',
(*604*) EAIMMED.DISPL:0);
(*604*) GENX(TDC,2,EAIMMED,EANONE);
(*604*) END ELSE
CASE SUBTYPEÆOPCODEÅ OF
1 (*ADD*): GENX(TADD,K,SOURCE, DEST);
2 (*SB *): GENX(TSUB,K,SOURCE, DEST);
3 (*AND*): GENX(TAND,K,SOURCE, DEST);
4 (*IOR*): GENX(TOR, K,SOURCE, DEST);
(*604*) 5 (*MP *): BEGIN
(***CHECK OVFL; SEE CODE FOR SQR*)
(*604*) IF DTYPE = HTYP
(*604*) THEN GENX(TEXTE,2,SOURCE,EANONE);
(*604*) IF (DTYPE = HTYP)
(*604*) THEN GENX(TEXTE,2,DEST,EANONE);
(*604*) GENX(TMULS,2,SOURCE,DEST)
END;
(*604*) 6 (*DV *): BEGIN
(*604*) IF DTYPE = HTYP
(*604*) THEN BEGIN
(*604*) GENX(TEXTE,2,SOURCE,EANONE);
(*604*) GENX(TEXTE,2,DEST,EANONE)
(*604*) END;
(*604*) GENX(TEXTE,4,DEST,EANONE);
(*RM*) GENX(TDIVS,2,SOURCE,DEST)
END;
(*604*) 7 (*MOD*): BEGIN
(*604*) IF DTYPE = HTYP
(*604*) THEN BEGIN
(*604*) GENX(TEXTE,2,SOURCE,EANONE);
(*604*) GENX(TEXTE,2,DEST,EANONE)
(*604*) END;
(*604*) GENX(TEXTE,4,DEST,EANONE);
(*RM*) GENX(TDIVS,2,SOURCE,DEST);
(*RM*) GENX(TSWAP,2,DEST,EANONE)
END;
END
END;
END; (*PXAD*)
PROCEDURE PXCLO;
VAR I:INTEGER;
BEGIN WITH INSTR^ DO BEGIN
IF SHORT(FIRSTESD^.REFERENCE)
AND (FIRSTESD^.REFERENCEÆ2Å=0)
AND (FIRSTESD^.REFERENCEÆ3Å=0) THEN
BEGIN TEMPESD:= FIRSTESD;
NEW(FIRSTESD); FIRSTESD^.NEXT:=TEMPESD;
END;
LTEMP := PC;
SAD(LTEMP, 2);
FIRSTESD^.REFERENCE := LTEMP;
FIRSTESD^.NAME := OPCODE;
IF (OPCODE=XWRB) OR (OPCODE=XWRC) OR (OPCODE=XWRI)
(*604*) OR (OPCODE=XWRH) OR (OPCODE=XWRJ)
THEN BEGIN
(*0610B*) IF OPCODE=XWRC THEN DTYPE := CTYP
(*0610B*) ELSE IF OPCODE=XWRI THEN DTYPE := ITYP
(*0610B*) ELSE IF OPCODE=XWRH THEN DTYPE := HTYP
(*0610B*) ELSE IF OPCODE=XWRJ THEN DTYPE := JTYP;
IF DALLOC + AALLOC = 0
THEN BEGIN
EADDIR.REG := D1;
GENX(TMOVE,2,EAPOP,EADDIR);
EADDIR.REG := D0;
(*0610B*) GENX(TMOVE,SIZEÆDTYPEÅ,EAPOP,EADDIR);
EAADIR.REG := A0;
GENX(TMOVE,4,EAPOP,EAADIR);
STKPTR := STKPTR - 3;
DPOPCNT := DPOPCNT + 3;
END
ELSE IF (DALLOC=1) AND (AALLOC=0)
THEN BEGIN
BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
EADDIR.REG := D1;
GENX(TMOVE,2,SOURCE,EADDIR);
EADDIR.REG := D0;
(*0610B*) GENX(TMOVE,SIZEÆDTYPEÅ,EAPOP,EADDIR);
EAADIR.REG := A0;
GENX(TMOVE,4,EAPOP,EAADIR);
STKPTR := STKPTR -2;
DPOPCNT := DPOPCNT +2;
(*1015E*) END
(*1015E*) ELSE IF (DALLOC=2) AND (AALLOC=0)
(*1015E*) THEN BEGIN
(*1015E*) EAADIR.REG := A0;
(*1015E*) GENX(TMOVE,4,EAPOP,EAADIR);
(*1015E*) STKPTR := STKPTR -1;
(*1015E*) DPOPCNT := DPOPCNT +1;
(*1015E*) END;
END;
IF (OPCODE=XWRV) OR (OPCODE=XWRS)
(*1205B*) THEN BEGIN PUSHALLD; STKPTR := STKPTR -2 END;
(*1207C*) IF OPCODE = XWRV THEN STKPTR := STKPTR - 1;
IF (OPCODE=XPEE)
THEN
BEGIN
IF AALLOC = 0 THEN POPREG(AREG)
END;
(*MAKE SURE PARAMETERS ARE IN RIGHT PLACE?*)
DTYPE := NOTATYP;
(*RM*) IF OPCODE <> XEIO THEN LONGBSR
ELSE IF AALLOC = 0 THEN BEGIN
(* REMOVE FILE POINTER FROM STACK *)
EAIMMED.DISPL := 4;
EAADIR.REG := SP;
GENX(TADD,2,EAIMMED,EAADIR)
END;
(*RM*) FREEALL ;
(*1031A*) IF (OPCODE=XEOL) OR (OPCODE=XEOF) OR (OPCODE=XPOS)
(*1031A*) THEN
(*1031A*) BEGIN
(*1031A*) ALLOCDREG;
(*1031A*) IF OPCODE=XPOS
(*1031A*) THEN REGTYPEÆDTOPÅ := ITYP
(*1031A*) ELSE REGTYPEÆDTOPÅ := BTYP;
(*1031A*) END
(*RM*) ELSE IF (OPCODE <> XEIO) AND (OPCODE<>XCLO) AND (OPCODE<>XIFD)
(*RM*) AND (OPCODE<>XSEE) AND (OPCODE<>XRST) AND (OPCODE<>XRWT)
(*RM*) AND (OPCODE<>XRLN) AND (OPCODE<>XWLN)
(*1023A*) AND (OPCODE<>XGET) AND (OPCODE<>XPUT)
(*1206A*) AND (OPCODE<>XPAG)
(*RM*) THEN ALLOCAREG;
(*1207H*) IF OPCODE = XAFI THEN STKPTR := STKPTR - 1;
END;
END (*PXCLO*) ;
PROCEDURE PXLOD;
BEGIN WITH INSTR^ DO BEGIN
EFFADDRESS(INSTR,SOURCE);
CASE SUBTYPEÆOPCODEÅ OF
1 (*LOD*): BEGIN IF DTYPE = ATYP THEN
BEGIN
OPTIMI := NEXTPCOD(INSTR);
IF OPTIMI^.OPCODE=XARG
THEN BEGIN GENX(TMOVE,4,SOURCE,EAPUSH);
OPTIMI^.INUSE := FALSE END
ELSE IF ( OPTIMI^.OPCODE=XSTR)
AND ((OPTIMI^.OPAND1=LEVEL)
OR (OPTIMI^.OPAND1=0)
OR (OPTIMI^.OPAND1=OPAND1))
THEN BEGIN
EFFADDRESS(OPTIMI,DEST);
OPTIMI^.INUSE := FALSE;
GENX(TMOVE,4,SOURCE,DEST)
END
ELSE
BEGIN ALLOCAREG;
EAADIR.REG := ATOP;
GENX(TMOVE,4,SOURCE,EAADIR);
END;
END
ELSE IF NOT (DTYPE IN LONGTYPES) THEN
BEGIN
OPTIMI := NEXTPCOD(INSTR);
EADDIR.REG := DTOP;
OPTIMI^.INUSE := FALSE;
OPTIM2 := NEXTPCOD(OPTIMI);
IF ((OPTIMI^.OPCODE=XAD)
OR (OPTIMI^.OPCODE=XSB)
OR (OPTIMI^.OPCODE=XAND)
OR (OPTIMI^.OPCODE=XIOR))
AND (DTOP<>DNONE)
THEN BEGIN
CASE SUBTYPEÆOPTIMI^.OPCODEÅ OF
1: OPCDE := TADD;
2: OPCDE := TSUB;
3: OPCDE := TAND;
4: OPCDE := TOR;
END; (*CASE*)
GENX(OPCDE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
END
ELSE IF (OPTIMI^.OPCODE = XLDC)
AND (CONDITIONAL(OPTIM2)>0)
THEN BEGIN
EAIMMED.DISPL := OPTIMI^.OPAND1;
IF DTYPE = CTYP
THEN EAIMMED.DISPL :=
ASCIIÆOPTIMI^.OPSTRING^.VSTRINGAÆ1ÅÅ;
IF OPTIMI^.DTYPE=JTYP
THEN BEGIN
OPAND1 := OPTIMI^.OPAND1;
OPAND2 := OPTIMI^.OPAND2;
OPAND3 := OPTIMI^.OPAND3;
OPAND4 := OPTIMI^.OPAND4;
GENX(TCMP,4,EALONG,SOURCE);
END
ELSE
IF EAIMMED.DISPL = 0
THEN GENX(TTST,SIZEÆDTYPEÅ,
SOURCE,EANONE)
ELSE GENX(TCMP,SIZEÆDTYPEÅ,
EAIMMED,SOURCE);
OPTIM2^.OPAND3 := 200; (*FLAG SET*)
END
ELSE IF OPTIMI^.OPCODE=XARG
THEN GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EAPUSH)
ELSE IF OPTIMI^.OPCODE=XSTO
THEN BEGIN
EADEFER.REG := ATOP;
GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADEFER)
;FREEAREG
END
ELSE IF (OPTIMI^.OPCODE = XSTR)
AND ((OPTIMI^.OPAND1 = LEVEL)
OR (OPTIMI^.OPAND1 = 0)
OR (OPTIMI^.OPAND1 = OPAND1))
THEN BEGIN
EABASED.DISPL :=OPTIMI^.OPAND2;
IF (EABASED.DISPL >=0) AND
(OPTIMI^.OPAND1=LEVEL)
THEN EABASED.DISPL := EABASED.DISPL+12;
IF OPTIMI^.OPAND1 = 0
THEN EABASED.REG := A5
ELSE IF OPTIMI^.OPAND1 = LEVEL
THEN EABASED.REG := A6
ELSE EABASED.REG := A4;
GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EABASED)
END
ELSE IF (((OPTIMI^.OPCODE=XINC)
OR (OPTIMI^.OPCODE=XDEC))
AND ((OPTIM2^.OPCODE=XSTR)
AND (OPTIM2^.OPAND1=OPAND1)
AND (OPTIM2^.OPAND2=OPAND2)))
THEN BEGIN
OPTIM2^.INUSE := FALSE;
IF OPTIMI^.OPCODE = XDEC
THEN OPCDE := TSUB
ELSE OPCDE := TADD;
EAIMMED.DISPL := OPTIMI^.OPAND1;
GENX(OPCDE,SIZEÆDTYPEÅ,EAIMMED,SOURCE)
END
ELSE IF ( CONDITIONAL(OPTIMI) > 0)
AND (DTOP<>DNONE)
THEN BEGIN
GENX(TCMP,SIZEÆDTYPEÅ,SOURCE,EADDIR);
OPTIMI^.OPAND3 := 100; (*SET FLAG *)
OPTIMI^.INUSE := TRUE
END
ELSE BEGIN
ALLOCDREG;
EADDIR.REG := DTOP;
GENX(TMOVE,SIZEÆDTYPEÅ,
SOURCE,EADDIR) ;
OPTIMI^.INUSE:= TRUE
END
END
ELSE (*LONG TYPE: P, S, OR V*)
(*RM*) BEGIN IF DTYPE = PTYP THEN OPAND3:=8;
IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
(*1015D*) PUSHALL;
EAADIR.REG := A0;
GENX(TLEA,2,SOURCE,EAADIR);
IF (AALLOC<>0) OR (DALLOC<>0)
THEN ERROR
('REGISTERS NOT EMPTY ');
FREEALL;
LONGBSR;
IF DTYPE = VTYP THEN BEGIN
(*604*) PCPRINT;
WRITELN(LISTING,' ':10,
'DC.W ',OPAND3:0);
EAIMMED.DISPL := OPAND3;
GENX(TDC,2,EAIMMED,EANONE);
END
END ELSE
LOADBIG(SOURCE,OPAND3 (*SIZE*))
(*RM*) END
END;
2 (*LDA*): BEGIN
(*480*) OPTIMI := NEXTPCOD(INSTR);
IF (OPTIMI^.OPCODE=XARG) OR (OPTIMI^.OPCODE=XMST)
(*480*) OR (((OPTIMI^.OPCODE=XLDC) OR (OPTIMI^.OPCODE=XLOD)
(*480*) OR (OPTIMI^.OPCODE=XIND))
(*480*) AND (OPTIMI^.DTYPE IN ÆSTYP,VTYPÅ))
THEN BEGIN
OPTIMI^.INUSE := FALSE;
(*480*) IF (OPTIMI^.OPCODE<>XMST)AND(OPTIMI^.OPCODE<>XARG)
(*480*) THEN OPTIMI^.INUSE := TRUE;
(*480*) IF OPTIMI^.OPCODE <> XARG
THEN BEGIN
PUSHALL;
STKPTR := STKPTR + 1;
KINDSTKÆSTKPTRÅ := AREG;
TYPESTKÆSTKPTRÅ := ATYP;
END;
GENX(TPEA,2,SOURCE,EANONE)
END ELSE BEGIN
ALLOCAREG;
EAADIR.REG := ATOP;
GENX(TLEA,2,SOURCE,EAADIR)
END
END;
3 (*STR*): BEGIN IF DTYPE = ATYP THEN
BEGIN IF AALLOC > 0 THEN
BEGIN EAADIR.REG := ATOP;
GENX(TMOVE,4,EAADIR,SOURCE);
FREEAREG
END
ELSE BEGIN
GENX(TMOVE,4,EAPOP,SOURCE);
STKPTR := STKPTR - 1;
END
END ELSE (*DTYPE <> ATYP*)
IF NOT (DTYPE IN LONGTYPES) THEN
STORELITTLE
(*RM*) ELSE BEGIN
(*RM*) IF DTYPE = PTYP THEN OPAND3:=8;
IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
EADDIR.REG := D0;
EAIMMED.DISPL := OPAND3;
IF DTYPE = STYP THEN
GENX(TMOVE,4,EAIMMED,EADDIR);
EAADIR.REG := A0;
GENX(TLEA,2,SOURCE,EAADIR);
IF (AALLOC<>0) OR (DALLOC<>0)
THEN ERROR
('REGISTERS NOT EMPTY ');
FREEALL;
LONGBSR;
IF DTYPE = VTYP THEN BEGIN
PCPRINT;
WRITELN(LISTING,' ':10,'DC.W ',
OPAND3:0);
GENX(TDC,2,EAIMMED,EANONE)
END
END ELSE
(*RM*) STOREBIG(SOURCE,OPAND3)
(*RM*) END
END
END
END;
END; (*PXLOD*)
PROCEDURE PXIXA;
BEGIN WITH INSTR^ DO BEGIN
(*T <- T' + T * OPAND1; WHERE T' IS ADDR AND T IS DATA*)
IF DALLOC <= 0 THEN POPREG(DREG);
EADDIR.REG := DTOP;
IF OPAND1 = 2 THEN
GENX(TADD,2,EADDIR,EADDIR)
(***MORE OPTIMIZATION POSSIBLE FOR SMALL OPAND1'S*)
ELSE BEGIN EAIMMED.DISPL := OPAND1;
(*OP*) IF OPAND1 <> 1 THEN
GENX(TMULS,2,EAIMMED,EADDIR) END;
IF AALLOC <= 0 THEN POPREG(AREG);
EAADIR.REG := ATOP;
(*OP*) EADDIR.REG := DTOP;
(*OP*) GENX(TADD,2,EADDIR,EAADIR);
FREEDREG;
END;
END; (*PXIXA*)
PROCEDURE PXIND;
BEGIN WITH INSTR^ DO BEGIN
(*T <- MEMÆT + OPAND1Å*)
IF AALLOC <= 0 THEN POPREG(AREG);
BUILDADDR(SOURCE,BASED,ATOP,ANONE,OPAND1);
IF OPAND1 = 0 THEN SOURCE.MODE := DEFER;
IF DTYPE = ATYP
THEN
BEGIN
OPTIMI := NEXTPCOD(INSTR);
IF OPTIMI^.OPCODE = XSTR
THEN
BEGIN
EFFADDRESS(OPTIMI,DEST);
OPTIMI^.INUSE := FALSE;
GENX(TMOVE,4,SOURCE,DEST)
;FREEAREG
END
ELSE
BEGIN
EAADIR.REG := ATOP;
GENX(TMOVE,4,SOURCE,EAADIR)
END
END
ELSE BEGIN
IF NOT (DTYPE IN LONGTYPES) THEN
BEGIN
OPTIMI := NEXTPCOD(INSTR);
OPTIMI^.INUSE := FALSE;
(*0610A*) IF (DTOP=DNONE) AND ((OPTIMI^.OPCODE=XAD)
(*0610A*) OR (OPTIMI^.OPCODE=XSB) OR
(*0610A*) (OPTIMI^.OPCODE=XAND) OR
(*0610A*) (OPTIMI^.OPCODE=XIOR))
(*0610A*) THEN POPREG(DREG);
EADDIR.REG := DTOP;
FREEAREG;
OPTIM2 := NEXTPCOD(OPTIMI);
IF OPTIMI^.OPCODE = XARG
THEN GENX(TMOVE,SIZEÆDTYPEÅ,
SOURCE,EAPUSH)
ELSE
IF OPTIMI^.OPCODE=XAD
THEN GENX(TADD,SIZEÆDTYPEÅ,SOURCE,EADDIR)
ELSE IF OPTIMI^.OPCODE=XSB
THEN GENX(TSUB,SIZEÆDTYPEÅ,SOURCE,EADDIR)
ELSE IF OPTIMI^.OPCODE=XAND
THEN GENX(TAND,SIZEÆDTYPEÅ,SOURCE,EADDIR)
ELSE IF OPTIMI^.OPCODE=XIOR
THEN GENX(TOR,SIZEÆDTYPEÅ,SOURCE,EADDIR)
ELSE IF OPTIMI^.OPCODE = XSTR
THEN
BEGIN
EFFADDRESS(OPTIMI,DEST);
GENX(TMOVE,SIZEÆDTYPEÅ,
SOURCE,DEST)
END
ELSE IF (OPTIMI^.OPCODE = XLDC)
AND (CONDITIONAL(OPTIM2)>0)
THEN
BEGIN
EAIMMED.DISPL :=
OPTIMI^.OPAND1;
IF DTYPE = CTYP
THEN EAIMMED.DISPL :=
ASCIIÆOPTIMI^.OPSTRING^.VSTRINGAÆ1ÅÅ;
IF OPTIMI^.DTYPE=JTYP
THEN BEGIN
OPAND1 := OPTIMI^.OPAND1;
OPAND2 := OPTIMI^.OPAND2;
OPAND3 := OPTIMI^.OPAND3;
OPAND4 := OPTIMI^.OPAND4;
GENX(TCMP,4,EALONG,SOURCE);
END
ELSE
IF EAIMMED.DISPL = 0
THEN GENX(TTST,SIZEÆDTYPEÅ
,SOURCE,EANONE)
ELSE GENX(TCMP,SIZEÆDTYPEÅ
,EAIMMED,SOURCE);
OPTIM2^.OPAND3 :=200
END
ELSE BEGIN
OPTIMI^.INUSE := TRUE;
ALLOCDREG;
EADDIR.REG := DTOP;
GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
END;
END
ELSE BEGIN IF DTYPE = PTYP THEN OPAND2 :=8;
IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
FREEAREG;
PUSHALL;
EAADIR.REG := A0;
GENX(TLEA,2,SOURCE,EAADIR);
LONGBSR;
IF DTYPE = VTYP THEN BEGIN
(*604*) PCPRINT;
WRITELN(LISTING,' ':10,
'DC.W ',OPAND2:0);
EAIMMED.DISPL := OPAND2;
GENX(TDC,2,EAIMMED,EANONE)
END
END ELSE BEGIN (*PTYP*)
LOADBIG(SOURCE,OPAND2);
(*1207E*) IF DTYPE = PTYP THEN FREEAREG;
END;
END;
END
END;
END ; (*PXIND*)
PROCEDURE PXSTO;
BEGIN WITH INSTR^ DO BEGIN
(* MEMÆT'Å <- T *)
IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
IF (AALLOC<>0) OR (DALLOC<>0) THEN
ERROR('REGISTERS NOT EMPTY ');
FREEALL;
IF DTYPE = STYP THEN BEGIN
ALLOCDREG;
EAIMMED.DISPL := OPAND1;
EADDIR.REG := DTOP;
GENX(TMOVE,2,EAIMMED,EADDIR);
END;
LONGBSR;
IF DTYPE = VTYP THEN BEGIN
(*604*) PCPRINT;
WRITELN(LISTING,'DC.W ',OPAND1:0);
EAIMMED.DISPL := OPAND1;
GENX(TDC,2,EAIMMED,EANONE)
END ELSE
FREEDREG;
(*1207D*) STKPTR := STKPTR - 1;
END ELSE
IF DTYPE = PTYP THEN BEGIN
WHILE DALLOC<2 DO POPREG(DREG);
IF AALLOC < 1 THEN POPREG(AREG);
(*1303A*) BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
STOREBIG(SOURCE,8);
FREEAREG;
END ELSE
IF DTYPE = ATYP THEN
BEGIN WHILE AALLOC < 2 DO POPREG(AREG);
EAADIR.REG := ATOP;
FREEAREG;
BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
GENX(TMOVE,4,EAADIR,SOURCE);
FREEAREG
END
ELSE BEGIN IF DALLOC < 1 THEN POPREG(DREG);
IF AALLOC < 1 THEN POPREG(AREG);
BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
STORELITTLE;
FREEAREG;
END
END;
END; (*PXSTO *)
PROCEDURE PXLDC;
VAR J,K: INTEGER;
BEGIN WITH INSTR^ DO BEGIN
IF DTYPE = ATYP THEN
BEGIN ALLOCAREG;
EAADIR.REG := ATOP;
(*604*) GENX(TMOVE,4,EALONG,EAADIR) (* LOAD 4 CONSTS *)
END ELSE
(*604*) IF DTYPE = JTYP
(*604*) THEN BEGIN
(*604*) ALLOCDREG;
(*604*) EADDIR.REG := DTOP;
(*604*) GENX(TMOVE,4,EALONG,EADDIR)
(*604*) END ELSE
(*480*) IF DTYPE IN ÆSTYP,VTYPÅ THEN
BEGIN
(*480*) IF DTYPE = VTYP THEN
(*480*) BEGIN
(*480*) K := OPSTRING^.STRINGL; (* STRING LEN*)
(*480*) (*IF STC THRU HERE *) IF OPCODE = XLDC THEN OPAND3:=OPAND1;
(*480*) OPSTRING^.STRINGL := OPAND3; (*VEC *)
(*480*) IF K < OPAND3
(*480*) THEN FOR J := K + 1 TO OPAND3 DO
(*480*) OPSTRING^.VSTRINGAÆJÅ := ' '
(*480*) END;
PUSHALL;
LONGBSR;
K := OPSTRING^.STRINGL;
EAIMMED.DISPL := K;
IF ODD(K) THEN K := K + 1;
(*604*) PCPRINT;
WRITELN(LISTING,' ':10,'DC.W ',
EAIMMED.DISPL:0);
GENX(TDC,2,EAIMMED,EANONE);
(*604*) PCPRINT;
WRITE(LISTING,' ':10,'DC.W ');
VSTRINGIMMED(1,K);
WRITELN(LISTING,' ');
END
ELSE
(*RM*) IF DTYPE = PTYP THEN
(*RM*) LOADPSET
(*RM*) ELSE
BEGIN
IF DTYPE = CTYP THEN
EAIMMED.DISPL := ASCIIÆOPSTRING^.VSTRINGAÆ1ÅÅ
ELSE
EAIMMED.DISPL := OPAND1;
OPTIMI := NEXTPCOD(INSTR);
OPTIMI^.INUSE := FALSE;
IF (OPTIMI^.OPCODE=XARG) OR (OPTIMI^.OPCODE=XEXI)
OR (OPTIMI^.OPCODE=XWRS) OR (OPTIMI^.OPCODE=XWRV)
THEN BEGIN
IF (OPTIMI^.OPCODE=XWRS) OR (OPTIMI^.OPCODE=XWRV)
THEN PUSHALLD;
IF OPTIMI^.OPCODE<>XARG THEN BEGIN
OPTIMI^.INUSE := TRUE;
OPTIMI^.DTYPE := DTYPE
(*1205B*) ;
(*1205B*) IF OPTIMI^.OPCODE<>XEXI THEN BEGIN
(*1205B*) STKPTR := STKPTR +1;
(*1205B*) TYPESTKÆSTKPTRÅ := DTYPE;
(*1205B*) KINDSTKÆSTKPTRÅ := DREG;
(*1205B*) END END;
GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EAPUSH)
; OPTIMI^.DTYPE := NOTATYP
END
ELSE IF OPTIMI^.OPCODE=XSTO
THEN BEGIN
EADEFER.REG := ATOP;
GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EADEFER)
;FREEAREG
END
ELSE IF (OPTIMI^.OPCODE = XSTR)
AND ((OPTIMI^.OPAND1 = LEVEL)
OR (OPTIMI^.OPAND1 = 0))
THEN BEGIN
EABASED.DISPL := OPTIMI^.OPAND2;
IF (EABASED.DISPL>=0) AND (OPTIMI^.OPAND1=LEVEL)
THEN EABASED.DISPL := EABASED.DISPL+12;
IF OPTIMI^.OPAND1 = 0
THEN EABASED.REG := A5
ELSE EABASED.REG := A6;
GENX(TMOVE,SIZEÆOPTIMI^.DTYPEÅ,EAIMMED,EABASED)
END
ELSE IF (CONDITIONAL(OPTIMI) > 0)
AND (DTOP<>DNONE)
THEN BEGIN
EADDIR.REG := DTOP;
IF EAIMMED.DISPL=0 THEN
GENX(TTST,SIZEÆDTYPEÅ,EADDIR,EANONE)
ELSE
GENX(TCMP,SIZEÆDTYPEÅ,EAIMMED,EADDIR);
OPTIMI^.OPAND3 := 100; (* SET FLAG *)
OPTIMI^.INUSE := TRUE
END
ELSE IF OPTIMI^.OPCODE=XIXA
THEN BEGIN
EAIMMED.DISPL := OPAND1 * OPTIMI^.OPAND1;
EAADIR.REG := ATOP;
GENX(TADD,2,EAIMMED,EAADIR)
END
ELSE
BEGIN
ALLOCDREG;
OPTIMI^.INUSE := TRUE;
EADDIR.REG := DTOP;
GENX(TMOVE ,2,EAIMMED,EADDIR);
END
END
END;
END; (*PXLDC*)
(*480*) PROCEDURE PXSTC;
(*480*) BEGIN WITH INSTR^ DO BEGIN
(*480*) EFFADDRESS(INSTR,SOURCE);
(*480*) PUSHALL;
(*480*) EAADIR.REG := A0;
(*480*) GENX(TLEA,2,SOURCE,EAADIR);
(*480*) PXLDC (* LET LOAD CONSTANT PROCESSOR DO REST *)
(*480*) END (* WITH *)
(*480*) END; (*PXSTC*)
PROCEDURE PXLTA;
BEGIN WITH INSTR^ DO BEGIN
ALLOCAREG;
EAADIR.REG := SP;
BUILDADDR(SOURCE,DEFER,ATOP,ANONE,0);
GENX(TMOVE,4,EAADIR,SOURCE)
END;
END; (*PXLTA*)
PROCEDURE PXLCA;
BEGIN
;(*LEAVE INDICATION TO ALLOCATE STORAGE AT END
OF THIS BLOCK; GEN LEA ATOP WITH PC^(DISPL)*)
END; (* PXLCA*)
PROCEDURE PXISC;
BEGIN WITH INSTR^ DO BEGIN
EAIMMED.DISPL := 1;
EADEFER.REG := A5;
GENX(TADD,4,EAIMMED,EADEFER) (*'SC' IS ^A5*)
END;
END; (*PXISC*)
PROCEDURE PXLSC;
BEGIN WITH INSTR^ DO BEGIN
EAIMMED.DISPL := OPAND1;
EADEFER.REG := A5;
GENX(TMOVE,4,EAIMMED,EADEFER) (*'SC' IS ^A5*)
END;
END; (*PXLSC*)
PROCEDURE PXEQU;
VAR FLAG: BOOLEAN; (* TRUE MEANS NO DREG WAS ALLOC YET *)
BEGIN WITH INSTR^ DO BEGIN
FLAG := FALSE;
IF OPAND3 = 200
THEN BEGIN
FLAG := TRUE;
OPAND3 := 100
END;
IF DTYPE IN ÆSTYP,VTYPÅ THEN BEGIN
LONGBSR;
IF DTYPE = VTYP
THEN
BEGIN
EAIMMED.DISPL := OPAND1; (* VEC LEN *)
(*604*) PCPRINT;
IF DEBUG <> 0 THEN
WRITELN(LISTING,' ':10,'DC.W ',
OPAND1:0);
GENX(TDC,2,EAIMMED,EANONE)
(*604*) END;
IF (AALLOC<>0) OR (DALLOC<>0) THEN
ERROR('REGISTERS NOT EMPTY ');
FREEALL;
ALLOCDREG;
(*0326A*) REGTYPEÆDTOPÅ := BTYP;
END ELSE IF DTYPE = PTYP THEN BEGIN
WHILE DALLOC < 4 DO POPREG(DREG);
(*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
WHEN ONE ARGUMENT IS A CONSTANT*)
CASE SUBTYPEÆOPCODEÅ OF
1 (*EQU*) : OPCDE := TEOR;
2 (*NEQ*) : OPCDE := TEOR;
4 (*LEQ*) : BEGIN
OPCDE := TAND;
EADDIR.REG := DTOP;
GENX(TCOMP,4,EADDIR,EANONE);
EADDIR.REG := PREVIOUS(DTOP);
GENX(TCOMP,4,EADDIR,EANONE);
END;
6 (*GEQ*) : BEGIN
OPCDE := TAND;
EADDIR.REG :=
PREVIOUS(PREVIOUS(DTOP));
GENX(TCOMP,4,EADDIR,EANONE);
EADDIR.REG :=
PREVIOUS(PREVIOUS(PREVIOUS(DTOP)));
GENX(TCOMP,4,EADDIR,EANONE);
END;
END; (*CASE*)
BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
FREEDREG;
BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),ANONE,0);
GENX(OPCDE,4,SOURCE,DEST);
SOURCE.REG := DTOP;
FREEDREG;
DEST.REG := PREVIOUS(DTOP);
GENX(OPCDE,4,SOURCE,DEST);
SOURCE.REG := DTOP;
FREEDREG;
DEST.REG := DTOP;
GENX(TOR,4,SOURCE,DEST);
SWITCH := FALSE;
IF OPCODE <> XNEQ THEN OPCODE := XEQU;
END ELSE BEGIN
OPTIMI := NEXTPCOD(INSTR);
SWITCH := FALSE;
IF OPAND3<>100 THEN BEGIN (*CMP ALREADY DONE*)
DOUBLEOP(SOURCE,DEST,TRUE(*COMMUTATIVITY*),SWITCH);
K := SIZEÆDTYPEÅ;
GENX(TCMP,K,SOURCE,DEST);
(*1207A*) IF DTYPE = ATYP THEN FREEAREG;
END
END;
IF DTYPE <> STYP THEN BEGIN
EADDIR.REG := DTOP;
CASE SUBTYPEÆOPCODEÅ OF
1 (*EQU*) : OPCDE:=TSEQ;
2 (*NEQ*) : OPCDE:=TSNE;
3 (*LES*) : IF SWITCH THEN
OPCDE:=TSGT
ELSE OPCDE:=TSLT;
4 (*LEQ*) : IF SWITCH THEN
OPCDE:=TSGE
ELSE OPCDE:=TSLE;
5 (*GRT*) : IF SWITCH THEN
OPCDE:=TSLT
ELSE OPCDE:=TSGT;
6 (*GEQ*) : IF SWITCH THEN
OPCDE:=TSLE
ELSE OPCDE:=TSGE;
END;
(*RM*) IF DTYPE = ATYP THEN BEGIN
(*RM*) ALLOCDREG;
(*RM*) EADDIR.REG := DTOP
(*RM*) END;
IF OPTIMI = NIL THEN OPTIMI:=INSTR; (*FORCE NOTEQ*)
IF OPTIMI^.OPCODE = XFJP
THEN
BEGIN
OPTIMI^.OPAND3 := 100 + CONDITIONAL(INSTR)
;IF FLAG
THEN OPTIMI^.OPAND3 := OPTIMI^.OPAND3 + 100
END
ELSE BEGIN
IF FLAG
THEN BEGIN
ALLOCDREG;
EADDIR.REG := DTOP
END;
IF DTYPE <> VTYP
THEN
BEGIN
GENX(OPCDE,2,EADDIR,EANONE);
REGTYPEÆDTOPÅ := BTYP;
GENX(TNEG,1,EADDIR,EANONE)
END
END
END;
END;
END; (*PXEQU*)
PROCEDURE PXSTP;
BEGIN WITH INSTR^ DO BEGIN
PUSHALL;
(*PUSH ZERO ARGUMENT ON STACK*)
GENX(TCLR,2,EAPUSH,EANONE);
EAIMMED.DISPL := 14;
GENX(TTRAP,2,EAIMMED,EANONE);
EAIMMED.DISPL := 3;
GENX(TDC,2,EAIMMED,EANONE);
END;
END; (*PXSTP*)
PROCEDURE PXEXI;
BEGIN WITH INSTR^ DO BEGIN
PUSHALL;
(*EXIT ARGUMENT ALREADY ON STACK*)
EAIMMED.DISPL := 14;
GENX(TTRAP,2,EAIMMED,EANONE);
EAIMMED.DISPL := OPAND1 + 3;
GENX(TDC,2,EAIMMED,EANONE);
END;
END; (*PXEXI*)
PROCEDURE PXDIS;
BEGIN WITH INSTR^ DO BEGIN
IF AALLOC < 1 THEN POPREG(AREG);
(*604*) LONGBSR;
(*604*) EAIMMED.DISPL := OPAND1;
(*604*) PCPRINT;
(*604*) WRITELN(LISTING,' ':10,'DC.W ',OPAND1:0);
(*604*) GENX(TDC,2,EAIMMED,EANONE);
FREEAREG;
END;
END; (*PXDIS*)
PROCEDURE PXNEW;
BEGIN WITH INSTR^ DO BEGIN
(*RM*) (*HEAP POINTER IS ^A5(4) *)
IF AALLOC < 1 THEN POPREG(AREG);
(*604*) LONGBSR;
(*604*) EAIMMED.DISPL := OPAND1; (* LENGTH TO ALLOC *)
(*604*) PCPRINT;
(*604*) WRITELN(LISTING,' ':10,'DC.W ',OPAND1:0);
(*604*) GENX(TDC,2,EAIMMED,EANONE);
(*604*) FREEAREG;
END;
END; (*PXNEW*)
PROCEDURE PXMRK;
BEGIN WITH INSTR^ DO BEGIN
IF AALLOC < 1 THEN POPREG(AREG);
(*604*) LONGBSR;
FREEAREG;
END;
END; (*PXMRK*)
PROCEDURE PXRLS;
BEGIN WITH INSTR^ DO BEGIN
(*604*) IF AALLOC < 1 THEN POPREG(AREG);
(*604*) LONGBSR;
(*604*) FREEAREG;
END;
END; (*PXRLS*)
PROCEDURE PXMST;
BEGIN
PUSHALL;
END; (*PXMST*)
PROCEDURE PXARG;
BEGIN WITH INSTR^ DO BEGIN
(*604*) IF OPAND1 <> 0 THEN BEGIN
(*RM*) IF (DALLOC=2) AND (DTYPE=PTYP) THEN
(*1205A*) BEGIN
(*1205A*) EADDIR.REG := DTOP;
(*1205A*) GENX(TMOVE,4,EADDIR,EAPUSH);
(*1205A*) EADDIR.REG := DBOT;
(*1205A*) GENX(TMOVE,4,EADDIR,EAPUSH);
(*1205A*) FREEDREG;FREEDREG
(*1205A*) END;
(*1205G*) IF (NOT (DTYPE IN LONGTYPES)) AND (DALLOC=0) AND (AALLOC=0)
(*1205G*) THEN STKPTR := STKPTR -1;
(*RM*) IF AALLOC = 1 THEN BEGIN PUSHAREG;
STKPTR:=STKPTR-1 END;
(*RM*) IF DALLOC = 1 THEN BEGIN PUSHDREG;
STKPTR := STKPTR -1 END;
IF (DALLOC <> 0) OR (AALLOC <> 0)
THEN ERROR('STK NONEMPTY IN ARG ')
(*604*) END
END;
END; (*PXARG*)
PROCEDURE PXAST;
BEGIN WITH INSTR^ DO BEGIN
(*ASSUMES PREVIOUS 'MST' HAS DONE PUSHALL*)
IF ODD(OPAND1) THEN OPAND1:=OPAND1+1;
EAIMMED.DISPL := OPAND1;(*SHOULD BE LONG #*)
EAADIR.REG := SP;
GENX(TSUB,4,EAIMMED,EAADIR);
(*0416A*) IF NOT (DTYPE IN LONGTYPES) THEN BEGIN
STKPTR := STKPTR +1;
IF STKPTR>STKMAX THEN
ERROR('TOO MANY REG PUSHES ');
IF OPAND1=4 THEN KINDSTKÆSTKPTRÅ
:= AREG ELSE KINDSTKÆSTKPTRÅ
:= DREG;
IF OPAND1=4 THEN TYPESTKÆSTKPTRÅ:=ATYP
ELSE IF OPAND1=2 THEN TYPESTKÆSTKPTRÅ:=ITYP
ELSE IF OPAND1=1 THEN TYPESTKÆSTKPTRÅ:=BTYP
ELSE IF OPAND1=8 THEN TYPESTKÆSTKPTRÅ:=PTYP
ELSE TYPESTKÆSTKPTRÅ:=VTYP;
IF DTYPE <> NOTATYP THEN BEGIN
TYPESTKÆSTKPTRÅ:=DTYPE;
IF DTYPE = ATYP
THEN KINDSTKÆSTKPTRÅ := AREG
ELSE KINDSTKÆSTKPTRÅ := DREG;
END;
(*0416A*) END; (* LONGTYPES CODE *)
END;
END; (*PXAST*)
PROCEDURE PXMOV;
BEGIN WITH INSTR^ DO BEGIN
WHILE AALLOC < 2 DO POPREG(AREG);
IF OPCODE = XMOV THEN
BEGIN ALLOCDREG;
EAIMMED.DISPL := OPAND1;
EADDIR.REG := DTOP;
GENX(TMOVE,2,EAIMMED,EADDIR)
END
ELSE IF DALLOC < 1 THEN POPREG(DREG);
(*BYTE COUNT IS NOW IN DTOP*)
BUILDADDR(SOURCE,INCR,ATOP,ANONE,0);
FREEAREG;
BUILDADDR(DEST,INCR,ATOP,ANONE,0);
(*RM*) GENX(TMOVE,1,SOURCE,DEST);
(*ONLY MOVES BYTE AT A TIME NOW*)(*FIX LIKE '_BIG'*)
EADDIR.REG := DTOP;
(*RM*) EAIMMED.DISPL := 1;
(*RM*) GENX(TSUB,2,EAIMMED,EADDIR);
(*RM*) EAREL.DISPL := -4;
(*RM*) GENX(TBNE,0,EAREL,EANONE);
FREEAREG;FREEDREG;
END;
END; (*PXMOV*)
PROCEDURE PXCUP;
BEGIN WITH INSTR^ DO BEGIN
IF NOT PROCTABLEÆCURRLABELÅ.DEFINED THEN
BEGIN
LTEMP := PC;
SAD(LTEMP, 2);
REFERENCELABEL(CURRLABEL,LTEMP)
END;
PROCTABLEÆCURRLABELÅ.REFED := TRUE;
PUSHALL;
LTEMP := PROCTABLEÆCURRLABELÅ.LOCATION ;
LSB(LTEMP, PC);
IF SHORT(LTEMP) THEN BEGIN
LASGN(EAREL.DISPL, LTEMP);
IF (EAREL.DISPL >-128) AND (EAREL.DISPL < 127) THEN
BEGIN
EALAB.DISPL := CURRLABEL;
GENX(TBSR, 2,EALAB,EANONE) ;
END
ELSE BEGIN
EALAB.DISPL := CURRLABEL;
GENX(TLBSR,2,EALAB,EANONE);
END;
END ELSE
BEGIN
EADEFER.REG := A3;
GENX(TJSR,2,EADEFER,EANONE);
(*604*) PCPRINT;
WRITE(LISTING,' ':10,'DC.L ':7,'$':1);
SSB(LTEMP,2);
PLINT(LISTING,LTEMP);
WRITELN(LISTING,' ');
FOR K := 0 TO 3 DO
BEGIN
EAIMMED.DISPL := LTEMPÆKÅ;
GENX(TDC,1,EAIMMED,EANONE)
END
END
END;
END; (*PXCUP*)
PROCEDURE PXVJP;
BEGIN WITH INSTR^ DO BEGIN
(*604*) PCPRINT;
(*RM*) WRITELN(LISTING,' ':10,'DC.W L',
(*RM*) OPAND1 + LABELOFFSET:0,'-L',
(*RM*) LASTLABEL + LABELOFFSET:0); (* GENX!!*)
IF LABELTABLEÆOPAND1Å.DEFINED
THEN
BEGIN
LTEMP := LABELTABLEÆOPAND1Å.LOCATION;
LSB(LTEMP,LABELTABLEÆLASTLABELÅ.LOCATION);
LASGN(EAIMMED.DISPL, LTEMP)
END
ELSE
BEGIN
LTEMP := LABELTABLEÆLASTLABEL-1Å.LOCATION;
LSB(LTEMP,LABELTABLEÆLASTLABEL-2Å.LOCATION);
SAD(LTEMP,1);
SHL(LTEMP,1); (*TIMES 2*)
(*0401A*)
LASGN(EAIMMED.DISPL,LTEMP)
END;
GENX(TDC,2,EAIMMED,EANONE);
(*RM*) END;
END; (*PXVJP*)
PROCEDURE PXUJP;
VAR FLAG: BOOLEAN; (* INDICATES THAT CMP ALREADY DONE *)
BEGIN WITH INSTR^ DO BEGIN
FLAG := OPAND3 >= 200;
IF FLAG THEN OPAND3 := OPAND3 - 100;
IF LABELTABLEÆOPAND1Å.DEFINED = TRUE
THEN
BEGIN
LTEMP := LABELTABLEÆOPAND1Å.LOCATION;
LSB(LTEMP, PC);
SSB(LTEMP,2);
LASGN(K, LTEMP)
END
ELSE K := 200;
CASE SUBTYPEÆOPCODEÅ OF
1 (*UJP*) : BEGIN OPCDE := TBRA;
IF (K<-127) OR (K>127) THEN OPCDE := TLBRA END;
2 (*FJP*) : BEGIN OPCDE := TBEQ ;
IF (K<-127) OR (K>127) THEN OPCDE := TLBEQ ;
IF (DALLOC = 0) AND (OPAND3 < 100)
THEN POPREG(DREG);
END
END;
BUILDADDR(SOURCE,LABELLED,ANONE,ANONE,OPAND1);
IF OPAND3 >100
THEN BEGIN
OPAND3 := OPAND3 - 100;
IF SWITCH THEN
BEGIN
IF (OPAND3=3) OR (OPAND3=4) THEN OPAND3:=OPAND3+2
ELSE IF (OPAND3=5) OR (OPAND3=6) THEN OPAND3:=OPAND3-2;
END ;
CASE OPAND3 OF
1: ; (* NEQ ALREADY TURNED AROUND *)
2: IF OPCDE = TBEQ THEN OPCDE := TBNE
ELSE OPCDE := TLBNE;
3: IF OPCDE = TBEQ THEN OPCDE := TBGE
ELSE OPCDE := TLBGE;
4: IF OPCDE = TBEQ THEN OPCDE := TBGT
ELSE OPCDE := TLBGT;
5: IF OPCDE = TBEQ THEN OPCDE := TBLE
ELSE OPCDE := TLBLE;
6: IF OPCDE = TBEQ THEN OPCDE := TBLT
ELSE OPCDE := TLBLT;
END; (*CASE*)
END;
GENX(OPCDE,0,SOURCE,EANONE) ;
IF LABELTABLEÆOPAND1Å.DEFINED = FALSE THEN
BEGIN
LTEMP := PC;
SSB(LTEMP, 2);
REFERENCELABEL(OPAND1,LTEMP);
END;
IF (OPCODE = XFJP) AND (NOT FLAG) THEN FREEDREG;
END;
END; (*PXUJP*)
PROCEDURE PXDIF;
BEGIN
(*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
WHEN ONE ARGUMENT IS A CONSTANT *)
SETOPS;
END; (*PXDIF*)
(*604*) PROCEDURE PXSPOS;
(*604*) BEGIN
(*604*) WITH INSTR^ DO
(*604*) BEGIN
(*604*) LONGBSR;
(*604*) IF OPCODE <> XSCON
THEN BEGIN
DTYPE := ITYP;
ALLOCDREG
END
(*604*) END
(*604*) END; (* PXSPOS *)
PROCEDURE PXSDEL;
BEGIN
WITH INSTR^ DO
BEGIN
IF DALLOC = 0
THEN BEGIN
EADDIR.REG := D1;
GENX(TMOVE,2,EAPOP,EADDIR);
EADDIR.REG := D0;
GENX(TMOVE,2,EAPOP,EADDIR);
STKPTR := STKPTR - 2;
DPOPCNT := DPOPCNT + 2
END ELSE
IF DALLOC = 1
THEN BEGIN
BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
EADDIR.REG := D1;
GENX(TMOVE,2,SOURCE,EADDIR);
EADDIR.REG := D0;
GENX(TMOVE,2,EAPOP,EADDIR);
STKPTR := STKPTR - 1;
DPOPCNT := DPOPCNT + 1
END;
LONGBSR
END;
FREEDREG;FREEDREG
END; (* PXSDEL *)
(*604*) PROCEDURE PXSINS;
BEGIN
WITH INSTR^ DO
BEGIN
IF DALLOC = 0 THEN POPREG(DREG);
IF DTOP <> D0
THEN BEGIN
BUILDADDR(SOURCE,DDIRECT,DTOP,ANONE,0);
EADDIR.REG := D0;
GENX(TMOVE,2,SOURCE,EADDIR)
END;
LONGBSR;
FREEDREG;
END
END; (* PXSINS *)
PROCEDURE PXINN;
BEGIN WITH INSTR^ DO BEGIN
WHILE DALLOC < 3 DO POPREG(DREG);
(* THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
WHERE ONE ARGUMENT IS A CONSTANT*)
(*RM*) EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
EAIMMED.DISPL := 32;
(*RM*) GENX(TCMP,1,EAIMMED,EADDIR);
(*RM*) EAREL.DISPL := 6;
(*RM*) GENX(TBLT,0,EAREL,EANONE);
BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),DNONE,0);
GENX(TBTST,0,EADDIR,DEST);
(*RM*) EAREL.DISPL := 4;
(*RM*) GENX(TBRA,0,EAREL,EANONE);
(*RM*) BUILDADDR(DEST,DDIRECT,DTOP,DNONE,0);
GENX(TBTST,0,EADDIR,DEST);
FREEDREG; FREEDREG;
EADDIR.REG := DTOP;
(*RM*) GENX(TSNE,0,EADDIR,EANONE);
(*1015A*) GENX(TNEG,1,EADDIR,EANONE);
(*1323A*) REGTYPEÆDTOPÅ := BTYP;
END;
END; (*PXINN*)
PROCEDURE PXSGS;
BEGIN WITH INSTR^ DO BEGIN
IF DALLOC < 1 THEN POPREG(DREG);
(*THE BELOW SHOULD BE OPTIMIZED FOR THE CASE
WHEN ONE ARGUMENT IS A CONSTANT*)
(*RM*) ALLOCDREG;ALLOCDREG;
(*RM*) EADDIR.REG := DTOP;
(*RM*) GENX(TCLR,4,EADDIR,EANONE);
(*RM*) EADDIR.REG := PREVIOUS(DTOP);
(*RM*) GENX(TCLR,4,EADDIR,EANONE);
(*RM*) EADDIR.REG := PREVIOUS(PREVIOUS(DTOP));
(*RM*) EAIMMED.DISPL := 32;
(*RM*) GENX(TCMP,1,EAIMMED,EADDIR);
(*RM*) EAREL.DISPL := 6;
(*1204A*) GENX(TBGE,0,EAREL,EANONE);
(*RM*) BUILDADDR(DEST,DDIRECT,PREVIOUS(DTOP),DNONE,0);
(*RM*) GENX(TBSET,0,EADDIR,DEST);
(*RM*) EAREL.DISPL := 4;
(*RM*) GENX(TBRA,0,EAREL,EANONE);
(*RM*) BUILDADDR(DEST,DDIRECT,DTOP,DNONE,0);
(*RM*) GENX(TBSET,0,EADDIR,DEST);
(*1204A*) GENX(TMOVE,4,DEST,EADDIR);
(*1204A*) FREEDREG;
END;
END; (*PXSGS*)
PROCEDURE PXCHK;
BEGIN
WITH INSTR^ DO
BEGIN
EADDIR.REG := D7; (* USE D7 FOR CHECKING *)
SOURCE := EADDIR;
(*604*) IF ((DTYPE<>ATYP) AND (DTOP=DNONE)) OR ((DTYPE=ATYP) AND (ATOP=ANONE))
THEN BEGIN
SOURCE.REG := A7;
SOURCE.MODE := DEFER
END
(*604*) ELSE IF DTYPE=ATYP THEN BEGIN
(*604*) SOURCE.REG := ATOP;
(*604*) SOURCE.MODE := ADIRECT
(*604*) END
(*604*) ELSE SOURCE.REG := DTOP;
(*604*) GENX(TMOVE,SIZEÆDTYPEÅ,SOURCE,EADDIR);
IF SIZEÆDTYPEÅ = 1
THEN GENX(TEXTE,2,EADDIR,EANONE);
(*604*) IF DTYPE IN ÆATYP,JTYPÅ
(*604*) THEN BEGIN OPAND1:=1; OPAND2:=1 END; (* FAKE OUT NEXT INSTRS*)
IF OPAND2 = 0
THEN BEGIN
GENX(TNEG,2,EADDIR,EANONE);
EAIMMED.DISPL := -OPAND1
END;
IF OPAND1 = 0 THEN EAIMMED.DISPL := OPAND2;
IF (OPAND1=0) OR (OPAND2=0)
THEN GENX(TCHK,2,EAIMMED,EADDIR)
ELSE
(*604*) IF NOT (DTYPE IN ÆJTYP,ATYPÅ)
(*604*) THEN BEGIN
SASGN(LTEMP,OPAND2);
IF OPAND1 > 0
THEN SAD (LTEMP,OPAND1)
ELSE SSB(LTEMP,OPAND1);
IF SHORT(LTEMP)
THEN BEGIN
EAIMMED.DISPL := OPAND1;
GENX(TSUB,2,EAIMMED,EADDIR);
EAIMMED.DISPL := OPAND2 - OPAND1;
GENX(TCHK,2,EAIMMED,EADDIR)
END
ELSE BEGIN
EAIMMED.DISPL := OPAND1;
GENX(TCMP,2,EAIMMED,EADDIR);
EAREL.DISPL := 8;
GENX(TBLT,0,EAREL,EANONE);
EAIMMED.DISPL := OPAND2;
GENX(TCMP,2,EAIMMED,EADDIR);
EAREL.DISPL := 2;
GENX(TBLE,0,EAREL,EANONE);
EAIMMED.DISPL := 13;
GENX(TTRAP,2,EAIMMED,EANONE)
END
END
(*604*) ELSE IF DTYPE=JTYP THEN BEGIN (*JTYP*)
(*604*) EAPSET.DISPL := 0;
(*604*) GENX(TCMP,4,EAPSET,EADDIR);
(*604*) EAREL.DISPL := 10;
(*604*) GENX(TBLT,0,EAREL,EANONE);
(*604*) EAPSET.DISPL := 8;
(*604*) GENX(TCMP,4,EAPSET,EADDIR);
(*604*) EAREL.DISPL := 4;
(*604*) GENX(TBLE,0,EAREL,EANONE);
(*604*) EAIMMED.DISPL := 13;
(*604*) GENX(TTRAP,2,EAIMMED,EANONE)
(*604*) END
(*604*) ELSE BEGIN (*ATYP*)
(*604*) EABASED.DISPL := 368;
(*604*) EABASED.REG := A5;
(*604*) GENX(TCMP,4,EABASED,EADDIR);
(*604*) EAREL.DISPL := 6;
(*604*) GENX(TBLT,0,EAREL,EANONE);
(*604*) EABASED.DISPL := 4;
(*604*) GENX(TCMP,4,EABASED,EADDIR);
(*604*) EAREL.DISPL := 4;
(*604*) GENX(TBLE,0,EAREL,EANONE);
(*604*) EAIMMED.DISPL := 13;
(*604*) GENX(TTRAP,2,EAIMMED,EANONE)
(*604*) END
END (* WITH *)
END; (*PXCHK*)
(*RM*) PROCEDURE PXCVB;
BEGIN WITH INSTR^ DO BEGIN
(*604*) IF (NOT (DTYPE IN LONGTYPES))
(*604*) THEN BEGIN
(*604*) IF DALLOC < 1 THEN POPREG(DREG);
(*604*) IF OPCODE = XCVB
(*604*) THEN BEGIN
(*604*) IF DALLOC < 2 THEN POPREG(DREG);
(*604*) EADDIR.REG := PREVIOUS(DTOP)
(*604*) END
(*604*) ELSE EADDIR.REG := DTOP;
(*604*) REGTYPEÆEADDIR.REGÅ := DTYPE;
(*604*) IF (D1TYPE=HTYP) AND (DTYPE=JTYP)
(*604*) THEN GENX(TEXTE,2,EADDIR,EANONE);
(*604*) IF SIZEÆDTYPEÅ > SIZEÆD1TYPEÅ
(*604*) THEN GENX(TEXTE,SIZEÆDTYPEÅ,EADDIR,EANONE);
(*604*) END;
(*604*) IF (D1TYPE=CTYP) AND (DTYPE=STYP)
(*604*) THEN BEGIN
(*604*) IF DALLOC<1 THEN POPREG(DREG);
(*604*) EADDIR.REG := DTOP;
(*604*) FREEDREG;
PUSHALL;
GENX(TMOVE,1,EADDIR,EAPUSH);
(*604*) EAIMMED.DISPL := 1;
(*604*) GENX(TMOVE,2,EAIMMED,EAPUSH)
(*604*) END;
(*RM*) IF ((D1TYPE=VTYP) AND (DTYPE=STYP)) THEN BEGIN
(*RM*) EAIMMED.DISPL := OPAND1;
(*RM*) GENX(TMOVE,2,EAIMMED,EAPUSH);
(*RM*) END;
(*RM*) IF ((D1TYPE=STYP) AND (DTYPE=VTYP))
(*RM*) OR ((D1TYPE=STYP) AND (DTYPE=UTYP))
(*RM*) OR ((D1TYPE=UTYP) AND (DTYPE=STYP)) THEN BEGIN
(*RM*) ALLOCDREG;
(*RM*) EADDIR.REG := DTOP;
(*RM*) EAIMMED.DISPL := OPAND1;
(*RM*) GENX(TMOVE,4,EAIMMED,EADDIR);
(*RM*) FREEDREG;
LONGBSR;
(*RM*) END
(*RM*) END;
END; (*PXCVB*)
BEGIN (* GENERATE *)
CASE INSTR^.OPCODE OF
XATN,XCOS,XSIN,XEXP,XSQT,XLOG,XRND,XTRC:
ERROR('REAL NOT IMPLEMENTED');
(*604*) XSCON,XSPOS,XSLEN: PXSPOS;
(*604*) XSINS : PXSINS;
XSDEL,XSCOP : PXSDEL;
XLAB: PXLAB;
(*RM*) XEND: PXEND;
XDEF: PXDEF;
XENT,XENTB: PXENT;
XRET: PXRET;
XAB,XNG,XSQR,XNOT,XDEC,XINC,XODD: PXAB;
XAD,XSB,XMP,XDV,XMOD,XIOR,XAND: PXAD;
XCLO,XIFD,XAFI,XEOL,XEOF,XGET,XPUT,XPOS,XSEE,XPEE,XPOK,
(*604*) XRDH, XWRH,
XRST,XRWT,XRLN,XWLN,XPAG,XEIO,
XRDB,XRDC,XRDE,XRDI,XRDJ,XRDQ,XRDR,XRDS,XRDV,
XWRB,XWRC,XWRE,XWRI,XWRJ,XWRQ,XWRR,XWRS,XWRV: PXCLO;
XLOD,XLDA,XSTR: PXLOD;
XIXA: PXIXA;
XIND: PXIND;
XSTO: PXSTO;
(*480*) XSTC: PXSTC;
XLDC: PXLDC;
XLTA: PXLTA;
XLCA: PXLCA;
XISC: PXISC;
XLSC: PXLSC;
XEQU,XNEQ,XLES,XLEQ,XGRT,XGEQ: PXEQU;
XSTP: PXSTP;
XEXI: PXEXI;
XDIS: PXDIS;
XNEW: PXNEW;
XMRK: PXMRK;
XRLS: PXRLS;
XMST: PXMST;
XARG: PXARG;
XAST: PXAST;
XMOV,XMOVV: PXMOV;
XCUP: PXCUP;
XXJP: GENXXJP;
XVJP: PXVJP;
XUJP,XFJP: PXUJP;
XDIF,XINT,XUNI: PXDIF;
XINN: PXINN;
XSGS: PXSGS;
XCHK:PXCHK ;
XCVB,XCVT: PXCVB;
XCHKF,XDAS,XEXT,XINS,XLUPA,XLSPA,XCSP,XCSPF,XCUPF,XDATA,XDATB: ;
(*NOT CURRENTLY GEN'ED BY COMPILER*)
XNONE: ;
END (*CASES*)
END; (*GENERATE*)
BEGIN (*FLUSH*)
OPTIMI := FIRSTI;
CHANGED := FALSE;
WHILE OPTIMI <> NIL DO
BEGIN
WITH OPTIMI^ DO
BEGIN
(*480*) IF INUSE AND ((OPCODE = XLDC) OR (OPCODE = XINC)
(*480*) OR (OPCODE = XLDA))
THEN
BEGIN
CASE OPCODE OF
(*480*) XLDA: BEGIN
(*480*) IF NOT (DTYPE IN LONGTYPES)
(*480*) THEN
(*480*) BEGIN
(*480*) OPTIM2 := NEXTPCOD(OPTIMI);
(*480*) OPTIM3 := NEXTPCOD(OPTIM2);
(*480*) IF (OPTIM2^.OPCODE=XLDC)
(*480*) AND (OPTIM2^.DTYPE=ITYP)
(*480*) AND(OPTIM3^.OPCODE=XIXA)
(*480*) THEN BEGIN
(*480*) OPTIM2^.INUSE :=FALSE;
(*480*) OPTIM3^.INUSE := FALSE;
(*480*) OPTIMI^.OPAND2 :=
(*480*) OPTIMI^.OPAND2 +
(*480*) OPTIM2^.OPAND1 *
(*480*) OPTIM3^.OPAND1;
(*480*) CHANGED := TRUE
(*480*) END
(*480*) ELSE IF ((OPTIM2^.OPCODE=XLDC)
(*480*) OR (OPTIM2^.OPCODE=XLOD))
(*480*) AND (OPTIM3^.OPCODE=XSTO)
(*480*) THEN BEGIN
(*480*) INUSE := FALSE;
(*480*) CHANGED := TRUE;
(*480*) OPTIM3^.OPAND3 :=
(*480*) OPTIM3^.OPAND1;
(*480*) OPTIM3^.OPAND1:=OPAND1;
(*480*) OPTIM3^.OPAND2:=OPAND2;
(*480*) OPTIM3^.OPCODE:=XSTR
(*480*) END
(*480*) ELSE IF OPTIM2^.OPCODE=XIND
(*480*) THEN BEGIN
(*480*) OPTIM2^.INUSE :=FALSE;
(*480*) CHANGED := TRUE;
(*480*) OPTIMI^.OPCODE := XLOD;
(*480*) OPTIMI^.DTYPE :=
(*480*) OPTIM2^.DTYPE;
(*480*) OPTIMI^.OPTYPE := OPTLI;
(*480*) OPTIMI^.OPAND2 :=
(*480*) OPTIMI^.OPAND2 +
(*480*) OPTIM2^.OPAND1;
(*480*) OPTIMI^.OPAND3 :=
(*480*) OPTIM2^.OPAND2;
(*480*) END
(*480*) END
(*480*) END; (* XLDA*)
XLDC: BEGIN
IF NOT (DTYPE IN LONGTYPES)
AND (DTYPE <> JTYP) AND (DTYPE<>ATYP)
THEN
BEGIN
CHANGED := TRUE; (*ASSUME*)
(*480*) TEMPI := NEXTPCOD(OPTIMI);
IF TEMPI^.OPCODE=XDEC
THEN
BEGIN
OPAND1:=OPAND1
- TEMPI^.OPAND1;
TEMPI^.INUSE:=FALSE;
END (*THEN*)
ELSE IF TEMPI^.OPCODE=XINC
THEN BEGIN
OPAND1:=OPAND1+
TEMPI^.OPAND1;
TEMPI^.INUSE:=FALSE
END
ELSE IF TEMPI^.OPCODE=XAD
THEN BEGIN
OPCODE := XINC;
TEMPI^.INUSE:=FALSE
END
ELSE IF TEMPI^.OPCODE=XSB
THEN BEGIN
OPCODE:= XDEC;
TEMPI^.INUSE := FALSE
END
(*480*) ELSE IF TEMPI^.OPCODE=XNG
(*480*) THEN BEGIN
(*480*) OPAND1 := -OPAND1;
(*480*) TEMPI^.INUSE:=FALSE
(*480*) END
ELSE IF (OPAND1=0)
AND (TEMPI^.OPCODE=XIXA)
THEN BEGIN
INUSE := FALSE;
TEMPI^.INUSE:=FALSE
END
(*480*) ELSE IF (TEMPI^.OPCODE=XCVT)
(*480*) AND (TEMPI^.D1TYPE=CTYP)
(*480*) AND (TEMPI^.DTYPE=ITYP)
(*480*) THEN BEGIN
(*480*) TEMPI^.INUSE := FALSE;
(*480*) DTYPE := ITYP;
(*480*) OPAND1 :=ASCIIÆ
(*480*) OPSTRING^.
(*480*) VSTRINGAÆ1ÅÅ
(*480*) END
ELSE CHANGED := FALSE;
END (*THEN*)
(*480*) ELSE
(*480*) BEGIN (* S OR V *)
(*480*) CHANGED := TRUE;
(*480*) OPTIM2 := NEXTPCOD(OPTIMI);
(*480*) IF (OPTIM2^.OPCODE=XCVT)
(*480*) AND (DTYPE = STYP)
(*480*) AND (OPTIM2^.D1TYPE=STYP)
(*480*) AND (OPTIM2^.DTYPE=VTYP)
AND (OPTIM2^.OPAND1<=STRLENGTH)
(*480*) THEN BEGIN
(*480*) OPTIM2^.INUSE := FALSE;
(*480*) OPAND1 := OPTIM2^.OPAND1;
(*480*) DTYPE := VTYP;
(*480*) END
(*480*) ELSE IF (OPTIM2^.OPCODE=XSTR)
(*480*) AND (OPTIM2^.DTYPE=VTYP)
(*480*) AND(DTYPE = VTYP)
AND (OPAND1<=STRLENGTH)
(*480*) THEN BEGIN
(*480*) OPTIM2^.INUSE := FALSE;
(*480*) OPCODE := XSTC;
(*480*) OPAND3 := OPAND1;
(*480*) OPAND1:=OPTIM2^.OPAND1;
(*480*) OPAND2:=OPTIM2^.OPAND2
(*480*) END
(*480*) ELSE CHANGED := FALSE
(*480*) END (* S OR V *)
END; (*XLDC*)
XINC: BEGIN
IF NOT (DTYPE IN LONGTYPES)
AND (DTYPE<>JTYP) AND (DTYPE <> ATYP)
THEN BEGIN
TEMPI := NEXTPCOD(OPTIMI);
IF TEMPI^.OPCODE=XDEC
THEN BEGIN
OPAND1:=OPAND1
- TEMPI^.OPAND1;
TEMPI^.INUSE:=FALSE;
IF OPAND1 = 0
THEN INUSE := FALSE
ELSE CHANGED :=TRUE;
END
END
END; (*XINC*)
END; (*CASE*)
END; (*THEN*)
END; (*WITH*)
IF NOT CHANGED THEN OPTIMI := OPTIMI^.NEXT ELSE OPTIMI:=FIRSTI;
CHANGED := FALSE;
END; (*WHILE*)
TEMPI := FIRSTI;
WHILE TEMPI <> NIL DO
BEGIN
IF TEMPI^.INUSE THEN BEGIN
IF ODD(DEBUG DIV 2) THEN FLPC := TRUE;
GENERATE(TEMPI);
TEMPI^.INUSE := FALSE END;
TEMPI := TEMPI^.NEXT
END;
LASTI := FIRSTI;
TEMPLEVEL := -1; (*INVALIDATE A4 (POINTER TO INTERMED LEXICAL LEVEL*)
END; (*FLUSH*)
(*-------------------------------------------------------------------------
INPUT SCANNER SECTION
-------------------------------------------------------------------------*)
PROCEDURE NEXTLINE ;
VAR I: INTEGER ;
BEGIN
IF EOF(PCODE) THEN WRITELN(OUTPUT,'**** EOF ENCOUNTERED':24) ;
(* HALT NEEDED INSIDE THIS 'THEN' *)
REPEAT
LINELEN := 1 ;
WHILE NOT EOLN(PCODE) AND (LINELEN < LINELNGTH) DO
BEGIN
READ(PCODE,LINEBUFÆLINELENÅ);
LINELEN := LINELEN + 1
END;
READLN(PCODE);
LINEBUFÆLINELENÅ := ' ' ;
IF LINEBUFÆ1Å = '.' THEN LINECOUNT := LINECOUNT+1 ;
IF (ODD(DEBUG DIV 8) AND (LINEBUFÆ1Å='.'))
OR (ODD(DEBUG DIV 4) AND (LINEBUFÆ1Å<>'.'))
THEN BEGIN
WRITE(LISTING, '*' );
FOR I:=1 TO LINELEN DO WRITE(LISTING, LINEBUFÆIÅ) ;
IF LINEBUFÆ1Å = '.'
THEN WRITE(LISTING,' ':(95 - LINELEN),LINECOUNT:6);
WRITELN(LISTING,' ')
END;
UNTIL (LINEBUFÆ1Å <> '.') OR EOF(PCODE);
CHCNT := 1 ;
END (* NEXTLINE *) ;
PROCEDURE GETHEADER;
VAR
I: INTEGER;
OKVAL: BOOLEAN;
BEGIN
NEXTLINE;
LINEBUFÆLINELEN+1Å := ' ';
IF LINEBUFÆ3Å<>'2'
THEN WRITELN(OUTPUT,' ***** INPUT NOT M68000 PCODES!',
' COMPILER PHASE 2 ABORTING. *****');
CHCNT := 5;
GETSTRING; (* MODULE NAME *)
MAINFLG := LINEBUFÆ17Å <> 'S'; (* MAIN OR SUBPROGRAM *)
CHCNT := 18; (* POINT BEYOND OPTIONS *)
OKVAL := GETHEX;
IF OKVAL THEN EXPROC := LTEMP; (* NUMBER OF ENTRIES IN JUMP TABLE *)
JTSIZE := GETINTEGER; (* NUMBER OF ENTRIES IN JUMP TABLE *)
PC := EXPROC;
SAD(PC,JTSIZE * 10);
OKVAL := GETHEX;
IF OKVAL THEN HEAPSTART := LTEMP;
OKVAL := GETHEX;
IF OKVAL THEN STKSTART := LTEMP;
GENSTART := PC;
IF MAINFLG THEN SAD(PC,24); (* LEAVE ROOM FOR INIT CODE *)
GENLOC := PC;
COREBASE := PC;
END; (* GETHEADER *)
PROCEDURE SCAN;
VAR XEXTERNAL: BOOLEAN;
(*RM*) I: INTEGER; (* COUNTER FOR SET INIT *)
PROCEDURE GETOPCODE; (*PROCESS INPUT LINE FOR A LEGAL OPCODE, LOOK
IT UP IN 'MN', SET CURROPCODE, CURROPTYPE *)
VAR I: INTEGER;
J: MNS;
BEGIN
WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
CHCNT := CHCNT + 1;
I := 1;
WHILE (LINEBUFÆCHCNTÅ <> ' ') AND (I<5) AND (CHCNT < LINELEN) DO
BEGIN
OPSYMÆIÅ := LINEBUFÆCHCNTÅ;
CHCNT := CHCNT + 1; I := I + 1;
END;
WHILE I < 5 DO BEGIN OPSYMÆIÅ := ' '; I := I + 1 END;
CURROPCODE := XNONE;
IF (OPSYMÆ1Å<>'Y') AND (OPSYMÆ1Å<>'Z') THEN
FOR J := FMNÆOPSYMÆ1ÅÅ TO PRED(FMNÆSUCCIBM(OPSYMÆ1Å)Å) DO
IF MNÆJÅ = OPSYM THEN CURROPCODE := J;
IF CURROPCODE = XNONE THEN BEGIN ERROR('ILLEGAL OPCODE ');
CURROPTYPE := OP0
END
ELSE CURROPTYPE := OTÆCURROPCODEÅ;
END; (*GETOPCODE*)
PROCEDURE GETTYPE;
BEGIN
WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
CHCNT := CHCNT + 1;
WITH CURRI^ DO BEGIN
DTYPE := NOTATYP;
IF (LINEBUFÆCHCNTÅ>='A') AND (LINEBUFÆCHCNTÅ<='V') THEN
CASE LINEBUFÆCHCNTÅ OF
'D','E','F','G','K','L','M','N','O','T': ;
'A': DTYPE := ATYP;
(*RM*) 'H': DTYPE := HTYP;
'I': DTYPE := ITYP;
'J': DTYPE := JTYP;
'R': DTYPE := RTYP;
'Q': DTYPE := QTYP;
(*RM*) 'U': DTYPE := UTYP;
'V': DTYPE := VTYP;
'S': DTYPE := STYP;
'B': DTYPE := BTYP;
'C': DTYPE := CTYP;
'P': DTYPE := PTYP
END;
END;
CHCNT := CHCNT + 1;
END; (*GETTYPE*)
PROCEDURE GETLABEL;
BEGIN
WHILE (LINEBUFÆCHCNTÅ = ' ') AND (CHCNT < LINELEN) DO
CHCNT := CHCNT + 1;
IF LINEBUFÆCHCNTÅ = 'L' THEN DOLLAR := FALSE
ELSE IF LINEBUFÆCHCNTÅ = '$' THEN DOLLAR := TRUE
ELSE ERROR('LABEL EXPECTED ');
CHCNT := CHCNT + 1;
IF DOLLAR THEN CURRLABEL := GETINTEGER
ELSE BEGIN CURRLABEL := GETINTEGER - LABELOFFSET ;
IF CURRLABEL<0 THEN CURRLABEL:= 0; (* NEEDED IF OLD PCODES *)
IF CURRLABEL > HIGHLABEL THEN HIGHLABEL:= CURRLABEL
END
END; (*GETLABEL*)
PROCEDURE DEFINELABEL( ABSOL: BOOLEAN);
PROCEDURE FIXUP(ABSOL: BOOLEAN);
VAR ADDR1: ^LABELREF; ADDR2: LINT;
ADDR3: INTEGER;
I: INTEGER;
BEGIN
ADDR1 := LABELTABLEÆCURRLABELÅ.REFCHAIN;
REPEAT
ADDR2 := ADDR1^.CORELOC ;
LTEMP := ADDR2;
LSB(LTEMP,COREBASE);
SAD(LTEMP,1);
LASGN(I, LTEMP);
IF I <= 0
THEN
BEGIN
GENSAVE := GENLOC;
GENLOC := ADDR2;
LOCOUNT := MAXCORE - 20;
CORESAVE := CORECOUNT;
CORECOUNT := MAXCORE - 19;
END;
IF NOT ABSOL
THEN BEGIN
LTEMP := PC;
LSB(LTEMP, ADDR2);
LASGN(I,LTEMP);
IF LOCOUNT <> 1
THEN ADDR3 := LOCOUNT
ELSE
BEGIN
LTEMP := ADDR2;
LSB(LTEMP, COREBASE);
SAD(LTEMP, 1);
LASGN(ADDR3,LTEMP)
END;
COREÆADDR3Å := I DIV 256;
COREÆADDR3+1Å := I MOD 256
END ELSE
BEGIN
IF LOCOUNT <> 1
THEN ADDR3 := LOCOUNT
ELSE
BEGIN
LTEMP := ADDR2;
LSB(LTEMP,COREBASE);
SAD (LTEMP,1);
LASGN(ADDR3,LTEMP)
END;
LASGN(I, LABELTABLEÆCURRLABELÅ.LOCATION);
COREÆADDR3Å := DEFVALUE DIV 256;
COREÆADDR3+1Å := DEFVALUE MOD 256;
IF (DEFVALUE < 0) OR (I < 0)
THEN BEGIN
COREÆADDR3Å := ABS(COREÆADDR3Å);
COREÆADDR3+1Å:=ABS(COREÆADDR3+1Å);
COREÆADDR3Å := 255 - COREÆADDR3Å;
COREÆADDR3+1Å := 256 - COREÆADDR3+1Å;
IF COREÆADDR3+1Å = 256
THEN BEGIN
COREÆADDR3+1Å := 0;
COREÆADDR3Å := COREÆADDR3Å + 1;;
IF COREÆADDR3Å = 256
THEN COREÆADDR3Å := 0;
END;
END
END ;
IF LOCOUNT <> 1
THEN
BEGIN
EMITCODE;
GENLOC := GENSAVE;
LOCOUNT := 1;
CORECOUNT := CORESAVE;
END;
ADDR1 := ADDR1^.NEXT;
UNTIL ADDR1 = NIL;
END; (*FIXUPLABEL*)
BEGIN (*DEFINELABEL*)
FLUSH;
WITH LABELTABLEÆCURRLABELÅ DO BEGIN
IF DEFINED THEN ERROR ('DOUBLY DEFINED LABEL')
ELSE IF REFED THEN FIXUP(ABSOL);
DEFINED := TRUE;
IF NOT ABSOL THEN LOCATION := PC
ELSE SASGN(LOCATION, DEFVALUE)
END
END; (*DEFINELABEL*)
PROCEDURE DEFINEPROC(ABSOL: BOOLEAN);
PROCEDURE FIXUPPROC;
VAR
ADDR1:^LABELREF; ADDR2: LINT; I: INTEGER;
BEGIN
GENSAVE := GENLOC;
CORESAVE := CORECOUNT;
ADDR1 := PROCTABLEÆCURRLABELÅ.REFCHAIN;
REPEAT
LOCOUNT := MAXCORE - 20;
CORECOUNT := MAXCORE - 17; (* DATA IS IN -20 TO -17 *)
ADDR2 := ADDR1^.CORELOC;
IF CURROPCODE = XDEF
THEN BEGIN
LTEMP := EXPROC;
LSB(LTEMP, ADDR2)
END
ELSE BEGIN
LTEMP := PC;
LSB(LTEMP, ADDR2)
END;
FOR I := 0 TO 3 DO
COREÆLOCOUNT + IÅ := LTEMPÆIÅ;
GENLOC := ADDR2;
EMITCODE;
ADDR1 := ADDR1^.NEXT;
UNTIL ADDR1 = NIL;
GENLOC := GENSAVE;
LOCOUNT := 1;
CORECOUNT := CORESAVE;
END; (*FIXUPPROC*)
BEGIN
FLUSH;
WITH PROCTABLEÆCURRLABELÅ DO BEGIN
IF CURROPCODE = XENT THEN EMITCODE;
IF DEFINED THEN ERROR('DOUBLY DEFINED LABEL')
ELSE IF REFED THEN FIXUPPROC;
DEFINED := TRUE;
IF NOT ABSOL THEN LOCATION := PC
ELSE SASGN(LOCATION, DEFVALUE);
IF CURROPCODE=XDEF
THEN BEGIN
LOCATION := EXPROC;
SAD(EXPROC,10);
END
END
END; (*DEFINEPROC*)
PROCEDURE QUAI(VAR NEWI: IPTR);(*"QUAI" IS "QUEUE UP ANOTHER INSTRUCTION"*)
BEGIN IF LASTI^.INUSE THEN
IF LASTI^.NEXT = NIL THEN
BEGIN NEW(TEMPI);
TEMPI^.OPSTRING := NIL;
TEMPI^.OPSET := NIL;
TEMPI^.NEXT := NIL;
LASTI^.NEXT := TEMPI;
LASTI := TEMPI
END
ELSE LASTI := LASTI^.NEXT;
NEWI := LASTI
END; (*QUAI*)
BEGIN (*SCAN*)
NEXTLINE;
IF LINEBUFÆ1Å <> ' ' THEN BEGIN LABELED := TRUE; (*COLLECT LABEL*)
(*RM*) GETLABEL; LASTLABEL := CURRLABEL
END
ELSE LABELED := FALSE;
GETOPCODE;
IF CURROPCODE = XDEF
THEN IF NOT DOLLAR
THEN
BEGIN
DEFVALUE := GETINTEGER;
ABSOL := TRUE
END
ELSE ABSOL := FALSE
ELSE ABSOL := FALSE;
IF LABELED THEN IF DOLLAR THEN DEFINEPROC(ABSOL)
ELSE DEFINELABEL(ABSOL);
QUAI(CURRI); (*GET A QUEUE SLOT FOR A NEW INSTRUCTION *)
WITH CURRI^ DO BEGIN
INUSE := TRUE; DTYPE := NOTATYP; D1TYPE := NOTATYP;
OPCODE := CURROPCODE; OPTYPE := CURROPTYPE;
OPAND1 := 0; OPAND2 := 0; OPAND3 := 0;
CASE OPTYPE OF
ENDOP, OP0: BEGIN
OPAND1 := CURRLABEL;
IF CURROPCODE = XDEF THEN
IF NOT DOLLAR THEN OPAND2 := DEFVALUE
END;
OPLI: BEGIN OPAND1 := GETINTEGER; OPAND2 := GETINTEGER;
DTYPE := ATYP END;
OPT: BEGIN GETTYPE;
IF DTYPE IN LONGTYPES THEN OPAND1 := GETINTEGER
END;
OPLAB: BEGIN GETLABEL; OPAND1 := CURRLABEL END;
(*RM*) OP2T: BEGIN GETTYPE; D1TYPE := DTYPE; GETTYPE;
(*RM*) IF D1TYPE IN ÆSTYP,UTYP,VTYPÅ THEN
(*RM*) OPAND1 := GETINTEGER END;
OPTI: BEGIN GETTYPE;
IF DTYPE = NOTATYP THEN CHCNT := CHCNT - 1;
OPAND1 := GETINTEGER;
IF (OPAND1=0) AND (OPCODE = XARG)
THEN BEGIN
OPCODE := XNONE;
INUSE := FALSE
END;
IF DTYPE IN LONGTYPES THEN OPAND2 := GETINTEGER
END;
OPT2I: BEGIN
GETTYPE;
IF DTYPE <> JTYP
THEN BEGIN OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER
END
ELSE BEGIN
IF OPSET = NIL THEN NEW(OPSET);
WITH OPSET^ DO BEGIN
FOR I := 1 TO 8 DO BEGIN
OPAND1 := GETINTEGER;
SETVÆI*2-1Å :=
HEXDATAÆOPAND1 DIV 16 + 1Å;
SETVÆI*2Å :=
HEXDATAÆOPAND1 MOD 16 + 1Å
END
END;
OPAND1 := 1;
END
END;
OPI: OPAND1 := GETINTEGER;
OP3I: BEGIN OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER;
OPAND3 := GETINTEGER
END;
OPTLI: BEGIN GETTYPE; OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER;
IF DTYPE IN LONGTYPES THEN OPAND3 := GETINTEGER
END;
OPTL2I: BEGIN GETTYPE; OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER;
OPAND3 := GETINTEGER END;
OPTV: BEGIN GETTYPE;
(*604*) IF DTYPE IN ÆITYP,HTYPÅ THEN OPAND1 := GETINTEGER
(*604*) ELSE IF (DTYPE=ATYP) AND (OPCODE<>XLDC)
(*604*) THEN OPAND1 := GETINTEGER
ELSE IF DTYPE IN Æ STYP,CTYPÅ THEN BEGIN
IF OPSTRING = NIL THEN NEW(OPSTRING);
GETSTRING;
IF DTYPE = CTYP THEN ALENGTH := 1;
OPSTRING^.STRINGL := ALENGTH;
OPSTRING^.VSTRINGA := VSTRING
END
ELSE IF DTYPE = BTYP THEN BEGIN
OPAND1 := GETINTEGER
END
(*604*) ELSE IF DTYPE = PTYP THEN BEGIN
(*RM*) IF OPSET = NIL THEN NEW(OPSET);
(*RM*) WITH OPSET^ DO BEGIN
(*RM*) FOR I := 1 TO 8 DO BEGIN
(*RM*) OPAND1 := GETINTEGER;
(*RM*) SETVÆI*2-1Å := HEXDATAÆOPAND1 DIV 16+1Å;
(*RM*) SETVÆI*2Å := HEXDATAÆOPAND1 MOD 16 + 1Å;
(*RM*) END
(*RM*) END;
OPAND1 := 0
END ELSE IF DTYPE IN ÆATYP,JTYPÅ
THEN BEGIN
OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER;
OPAND3 := GETINTEGER;
OPAND4 := GETINTEGER
(*RM*) END ELSE ; (* R NOT IMPLEMENTED *)
END;
OPENT: BEGIN OPAND1 := GETINTEGER;
OPAND2 := GETINTEGER; (*SEGSIZE LABEL*)
GETSTRING; (*OPTIONS(IGNORED)*)
IF (VSTRINGÆ1Å>='0') AND(VSTRINGÆ1Å<='9')
THEN DEBUG := ORD(VSTRINGÆ1Å)-ORD('0');
IF (VSTRINGÆ2Å>='0') AND (VSTRINGÆ2Å<='9')
THEN DEBUG := DEBUG * 10 +
ORD(VSTRINGÆ2Å)-ORD('0');
GETSTRING; (*NAME*)
END;
OPENTB: (*NOT CURRENTLY IMPLEMENTED*)
END (*CASE*)
END (*WITH*)
END; (*SCAN*)
(*-------------------------------------------------------------------------
INITIALIZATION SECTION
-------------------------------------------------------------------------*)
PROCEDURE INIT;
VAR I: INTEGER;
J: MNS;
R: REGISTER;
BEGIN
ERRORWR := FALSE;
WRITELN(LISTING,' ':10,'LLEN',' ':3,'120');
STKPTR := -1;
FLPC := FALSE;
DALLOC := 0; AALLOC := 0;
DTOP := DNONE; ATOP := ANONE;
DBOT := DNONE; ABOT := ANONE;
SP := A7;
DALLOCCNT := 0; AALLOCCNT := 0;
DPUSHCNT := 0; APUSHCNT := 0;
DPOPCNT := 0; APOPCNT := 0;
LONGTYPES := ÆPTYP,VTYP,STYP,UTYPÅ;
SASGN(PC,12388);
DEBUG := 9;
GENLOC := PC;
CORECOUNT := 0;
GENSTART := PC;
LOCOUNT := 1;
COREBASE := PC;
CLR(PROGSTART);
MAINFLG := FALSE;
LINECOUNT := -1;
SASGN(RTJUMP,490);
STKSTARTÆ0Å := 0; STKSTARTÆ1Å := 0; STKSTARTÆ2Å := 127;
STKSTARTÆ3Å := 254;
HEAPSTARTÆ0Å := 255; HEAPSTARTÆ1Å := 255; HEAPSTARTÆ2Å := 255;
HEAPSTARTÆ3Å := 255; (* INITIALIZE HEAPSTART TO HEX FFFFFFFF *)
JTSIZE := 10;
LEVEL := 0;
TEMPLEVEL := -1; (*-1 WHENEVER A4 NOT POINTING TO A VALID DISPLAY LEVEL*)
HIGHLABEL := 0; LABELOFFSET := 0;
TOPLABEL := 0;
ABSOL := FALSE;
FOR I:= 0 TO MAXLABEL DO BEGIN PROCTABLEÆIÅ.DEFINED :=FALSE;
PROCTABLEÆIÅ.REFED :=FALSE;
PROCTABLEÆIÅ.REFCHAIN := NIL;
LABELTABLEÆIÅ.REFCHAIN := NIL;
LABELTABLEÆIÅ.DEFINED :=FALSE;
LABELTABLEÆIÅ.REFED :=FALSE
END;
NEW(FIRSTESD); WITH FIRSTESD^ DO BEGIN NAME := XNONE;
NEXT := NIL;
SASGN(REFERENCE, 0);
END;
SIZEÆATYPÅ := 4;
SIZEÆITYPÅ := 2;
SIZEÆJTYPÅ := 4;
SIZEÆRTYPÅ := 4;
SIZEÆQTYPÅ := 8;
SIZEÆVTYPÅ := 4;
SIZEÆSTYPÅ := 4;
SIZEÆBTYPÅ := 1;
SIZEÆPTYPÅ := 8;
SIZEÆNOTATYPÅ := 0;
SIZEÆCTYPÅ := 1;
(*RM*) SIZEÆHTYPÅ := 1;
(*RM*) SIZEÆUTYPÅ := 4;
(*480*) NEW(FAKEI);
(*480*) WITH FAKEI^ DO
(*480*) BEGIN
(*480*) OPCODE := XNONE; NEXT := NIL; OPAND1 := 0; INUSE := TRUE;
(*480*) OPTYPE := OP0; DTYPE := NOTATYP; D1TYPE := NOTATYP;
(*480*) OPAND2 := 0; OPAND3 := 0; OPSTRING := NIL; OPSET := NIL
(*480*) END;
NEW(FIRSTI); LASTI := FIRSTI; FIRSTI^.NEXT := NIL; FIRSTI^.INUSE := FALSE;
FIRSTI^.OPSTRING := NIL; FIRSTI^.OPSET := NIL;
FOR I := 1 TO STRLENGTH DO BLANKSÆIÅ := ' ';
MNÆXAB Å :='AB '; MNÆXAD Å :='AD ';
MNÆXAFI Å :='AFI '; MNÆXAND Å :='AND ';
MNÆXARG Å :='ARG ';
MNÆXAST Å :='AST '; MNÆXATN Å :='ATN ';
MNÆXCHK Å :='CHK '; MNÆXCHKFÅ :='CHKF';
MNÆXCLO Å :='CLO ';
MNÆXCOS Å :='COS '; MNÆXCSP Å :='CSP ';
MNÆXCSPFÅ :='CSPF'; MNÆXCUP Å :='CUP ';
MNÆXCUPFÅ :='CUPF'; MNÆXCVB Å :='CVB ';
MNÆXCVT Å :='CVT '; MNÆXDAS Å :='DAS ';
MNÆXDATAÅ :='DATA'; MNÆXDATBÅ :='DATB';
MNÆXDEC Å :='DEC '; MNÆXDEF Å :='DEF ';
MNÆXDIF Å :='DIF '; MNÆXDIS Å :='DIS ';
MNÆXDV Å :='DV '; MNÆXEIO Å :='EIO ';
MNÆXEND Å :='END ';
MNÆXENT Å :='ENT '; MNÆXENTBÅ :='ENTB';
MNÆXEOF Å :='EOF ';
MNÆXEOL Å :='EOL '; MNÆXEQU Å :='EQU ';
(*1015B*) MNÆXEXI Å :='EXIT'; MNÆXEXP Å :='EXP ';
MNÆXEXT Å :='EXT '; MNÆXFJP Å :='FJP ';
MNÆXGEQ Å :='GEQ '; MNÆXGET Å :='GET ';
MNÆXGRT Å :='GRT '; MNÆXIFD Å :='IFD ';
MNÆXINC Å :='INC '; MNÆXIND Å :='IND ';
MNÆXINN Å :='INN '; MNÆXINS Å :='INS ';
MNÆXINT Å :='INT '; MNÆXIOR Å :='IOR ';
MNÆXISC Å :='ISC '; MNÆXIXA Å :='IXA ';
MNÆXLAB Å :='LAB '; MNÆXLCA Å :='LCA ';
MNÆXLDA Å :='LDA '; MNÆXLDC Å :='LDC ';
MNÆXLEQ Å :='LEQ '; MNÆXLES Å :='LES ';
MNÆXLOD Å :='LOD '; MNÆXLOG Å :='LOG ';
MNÆXLSC Å :='LSC '; MNÆXLSPAÅ :='LSPA';
MNÆXLTA Å :='LTA '; MNÆXLUPAÅ :='LUPA';
MNÆXMOD Å :='MOD '; MNÆXMOV Å :='MOV ';
MNÆXMOVVÅ :='MOVV'; MNÆXMP Å :='MP ';
MNÆXMRK Å :='MRK '; MNÆXMST Å :='MST ';
MNÆXNEQ Å :='NEQ ';
MNÆXNEW Å :='NEW '; MNÆXNG Å :='NG ';
MNÆXNOT Å :='NOT '; MNÆXODD Å :='ODD ';
MNÆXPAG Å :='PAG '; MNÆXPEE Å :='PEE ';
MNÆXPOK Å :='POK '; MNÆXPOS Å :='POS ';
MNÆXPUT Å :='PUT '; MNÆXRDB Å :='RDB ';
MNÆXRDC Å :='RDC '; MNÆXRDE Å :='RDE ';
MNÆXRDI Å :='RDI '; MNÆXRDJ Å :='RDJ ';
(*604*) MNÆXRDH Å := 'RDH '; MNÆXWRH Å := 'WRH ';
MNÆXRDQ Å :='RDQ '; MNÆXRDR Å :='RDR ';
MNÆXRDS Å :='RDS '; MNÆXRDV Å :='RDV ';
MNÆXRET Å :='RET ';
MNÆXRLN Å :='RLN '; MNÆXRLS Å :='RLS ';
MNÆXRND Å :='RND ';
MNÆXRST Å :='RST '; MNÆXRWT Å :='RWT ';
MNÆXSB Å :='SB '; MNÆXSCONÅ :='SCON';
MNÆXSCOPÅ :='SCOP'; MNÆXSDELÅ :='SDEL';
MNÆXSEE Å :='SEE '; MNÆXSGS Å :='SGS ';
MNÆXSIN Å :='SIN '; MNÆXSINSÅ :='SINS';
MNÆXSLENÅ :='SLEN'; MNÆXSPOSÅ :='SPOS';
MNÆXSQR Å :='SQR '; MNÆXSQT Å :='SQT ';
MNÆXSTC Å :='STC ';
MNÆXSTO Å :='STO '; MNÆXSTP Å :='STP ';
MNÆXSTR Å :='STR '; MNÆXTRC Å :='TRC ';
MNÆXUJP Å :='UJP '; MNÆXUNI Å :='UNI ';
(*RM*) MNÆXVJP Å :='VJP ';
MNÆXWLN Å :='WLN '; MNÆXWRB Å :='WRB ';
MNÆXWRC Å :='WRC '; MNÆXWRE Å :='WRE ';
MNÆXWRI Å :='WRI '; MNÆXWRJ Å :='WRJ ';
MNÆXWRQ Å :='WRQ '; MNÆXWRR Å :='WRR ';
MNÆXWRS Å :='WRS '; MNÆXWRV Å :='WRV ';
MNÆXXJP Å :='XJP ';
MNÆXNONEÅ :=' ';
FMNÆ'A'Å :=XAB ; FMNÆ'B'Å :=XCHK;
FMNÆ'C'Å :=XCHK; FMNÆ'D'Å :=XDAS;
FMNÆ'E'Å :=XEIO; FMNÆ'F'Å :=XFJP;
FMNÆ'G'Å :=XGEQ; FMNÆ'H'Å :=XIFD;
FMNÆ'I'Å :=XIFD; FMNÆ'J'Å :=XLAB;
FMNÆ'K'Å :=XLAB; FMNÆ'L'Å :=XLAB;
FMNÆ'M'Å :=XMOD; FMNÆ'N'Å :=XNEQ;
FMNÆ'O'Å :=XODD; FMNÆ'P'Å :=XPAG;
FMNÆ'Q'Å :=XRDB; FMNÆ'R'Å :=XRDB;
FMNÆ'S'Å :=XSB ; FMNÆ'T'Å :=XTRC;
(*RM*) FMNÆ'U'Å :=XUJP; FMNÆ'V'Å :=XVJP;
FMNÆ'W'Å :=XWLN; FMNÆ'X'Å :=XXJP;
FMNÆ'Y'Å :=XNONE;FMNÆ'Z'Å :=XNONE;
TMNÆTMOVE Å :='MOVE '; TMNÆTLINK Å :='LINK '; TMNÆTUNLK Å :='UNLK ';
TMNÆTRTS Å :='RTS '; TMNÆTTST Å :='TST '; TMNÆTBGT Å :='BGT.S';
TMNÆTNEG Å :='NEG '; TMNÆTSUBQ Å :='SUB '; TMNÆTBTST Å :='BTST ';
TMNÆTSNZ Å :='SNZ '; TMNÆTADD Å :='ADD '; TMNÆTSUB Å :='SUB ';
TMNÆTAND Å :='AND '; TMNÆTOR Å :='OR '; TMNÆTMULS Å :='MULS ';
TMNÆTDIVS Å :='DIVS '; TMNÆTCMP Å :='CMP '; TMNÆTCLR Å :='CLR ';
TMNÆTTRAP Å :='TRAP '; TMNÆTDCNT Å :='DCNT '; TMNÆTBSR Å :='BSR.S';
TMNÆTADDQ Å :='ADD '; TMNÆTCOMP Å :='NOT '; TMNÆTLBSR Å :='BSR ';
TMNÆTMOVEQÅ :='MOVE '; TMNÆTSEQ Å :='SEQ '; TMNÆTSNE Å :='SNE ';
TMNÆTSGE Å :='SGE '; TMNÆTSLT Å :='SLT '; TMNÆTSGT Å :='SGT ';
TMNÆTSLE Å :='SLE '; TMNÆTLEA Å :='LEA '; TMNÆTLDQ Å :='MOVE ';
TMNÆTBRAÅ :='BRA.S'; TMNÆTBNE Å :='BNE.S'; TMNÆTEQU Å :='EQU ';
TMNÆTBEQÅ :='BEQ.S';
TMNÆTLBGTÅ :='BGT '; TMNÆTLBRA Å :='BRA ';
TMNÆTLBNEÅ :='BNE '; TMNÆTLBEQÅ :='BEQ ';
TMNÆTLBLTÅ :='BLT '; TMNÆTASL Å := 'ASL ';
TMNÆTBLT Å :='BLT.S'; TMNÆTJMPÅ := 'JMP ';
TMNÆTPEA Å :='PEA '; TMNÆTBSETÅ := 'BSET ';
TMNÆTBZ Å :='BEQ '; TMNÆTJSR Å := 'JSR ';
(*RM*) TMNÆTEOR Å :='EOR ';
(*RM*) TMNÆTEXTE Å := 'EXT '; TMNÆTSWAPÅ :='SWAP ';
TMNÆTCMPM Å := 'CMPM ';
TMNÆTBNZ Å := 'BNE.S'; TMNÆTBGE Å := 'BGE.S';
TMNÆTBLE Å := 'BLE.S'; TMNÆTCHK Å := 'CHK ';
TMNÆTDC Å := 'DC '; (*DUMMY INSTR*)
TMNÆTLBLEÅ := 'BLE '; TMNÆTLBGEÅ := 'BGE ';
(*RM*) DNAMEÆATYPÅ := 'A'; DNAMEÆITYPÅ := 'I'; DNAMEÆJTYPÅ := 'J';
(*RM*) DNAMEÆRTYPÅ := 'R'; DNAMEÆQTYPÅ := 'Q'; DNAMEÆVTYPÅ := 'V';
(*RM*) DNAMEÆSTYPÅ := 'S'; DNAMEÆBTYPÅ := 'B'; DNAMEÆPTYPÅ := 'P';
(*RM*) DNAMEÆNOTATYPÅ :=' '; DNAMEÆCTYPÅ := 'C'; DNAMEÆHTYPÅ :='H';
(*RM*) DNAMEÆUTYPÅ := 'U';
FOR J := XAB TO XXJP DO OTÆJÅ := OP0;
OTÆXAB Å := OPT ; OTÆXAD Å := OPT ;
(*604*) OTÆXARG Å := OPTI ; (* CHANGE FOR 6809 CHIPS STUFF *)
OTÆXAST Å := OPTI ; OTÆXATN Å := OPT ;
(*604*) OTÆXCHK Å := OPT2I ; OTÆXCHKFÅ := OPT ;
OTÆXCOS Å := OPT ; OTÆXCSP Å := OPLAB ;
OTÆXCUP Å := OPLAB ;
OTÆXCVB Å := OP2T ;
OTÆXCVT Å := OP2T ; OTÆXDAS Å := OPI ;
(*DATA,DATB*)
OTÆXDEC Å := OPTI ;
OTÆXDIS Å := OPI ;
OTÆXDV Å := OPT ; OTÆXEND Å := ENDOP ;
OTÆXENT Å := OPENT ; OTÆXENTBÅ := OPENTB;
OTÆXEQU Å := OPT ;
OTÆXEXI Å := OPI ;
OTÆXEXP Å := OPT ;
OTÆXEXT Å := OPTL2I; OTÆXFJP Å := OPLAB ;
OTÆXGEQ Å := OPT ;
OTÆXGRT Å := OPT ;
OTÆXINC Å := OPTI ; OTÆXIND Å := OPTI ;
OTÆXINS Å := OP3I ;
OTÆXIXA Å := OPI ;
OTÆXLCA Å := OPTV ;
OTÆXLDA Å := OPLI ; OTÆXLDC Å := OPTV ;
OTÆXLEQ Å := OPT ; OTÆXLES Å := OPT ;
OTÆXLOD Å := OPTLI ; OTÆXLOG Å := OPT ;
OTÆXLSC Å := OPI ; OTÆXLSPAÅ := OPI ;
OTÆXLUPAÅ := OPI ;
OTÆXMOD Å := OPT ; OTÆXMOV Å := OPI ;
OTÆXMP Å := OPT ;
OTÆXNEQ Å := OPT ;
OTÆXNEW Å := OPI ; OTÆXNG Å := OPT ;
OTÆXODD Å := OPT ;
OTÆXRET Å := OPLI ;
OTÆXRND Å := OPT ;
OTÆXSB Å := OPT ;
OTÆXSIN Å := OPT ;
OTÆXSQR Å := OPT ; OTÆXSQT Å := OPT ;
OTÆXSTO Å := OPT ;
OTÆXSTR Å := OPTLI ; OTÆXTRC Å := OPT ;
OTÆXUJP Å := OPLAB ;
(*RM*) OTÆXVJP Å := OPLAB;
OTÆXXJP Å := OPLAB ;
FOR J := XAB TO XNONE DO FLÆJÅ := TRUE;
FLÆXAB Å := FALSE; FLÆXAD Å := FALSE; FLÆXAND Å := FALSE;
FLÆXAST Å := FALSE; FLÆXCVB Å := FALSE; FLÆXCVT Å := FALSE;
FLÆXDAS Å := FALSE;
FLÆXDATAÅ := FALSE; FLÆXDATBÅ := FALSE; FLÆXDEC Å := FALSE;
FLÆXDIF Å := FALSE; FLÆXDV Å := FALSE; FLÆXEQU Å := FALSE;
FLÆXEXT Å := FALSE;
FLÆXGEQ Å := FALSE; FLÆXGRT Å := FALSE; FLÆXINC Å := FALSE;
FLÆXIND Å := FALSE; FLÆXINN Å := FALSE; FLÆXINS Å := FALSE;
FLÆXINT Å := FALSE;
FLÆXIOR Å := FALSE;
FLÆXIXA Å := FALSE; FLÆXLCA Å := FALSE; FLÆXLDA Å := FALSE;
FLÆXLDC Å := FALSE; FLÆXLEQ Å := FALSE; FLÆXLES Å := FALSE;
FLÆXLOD Å := FALSE; FLÆXLSPAÅ := FALSE; FLÆXLTA Å := FALSE;
FLÆXLUPAÅ := FALSE;
FLÆXMOD Å := FALSE; FLÆXMOV Å := FALSE; FLÆXMP Å := FALSE;
FLÆXNEQ Å := FALSE; FLÆXNG Å := FALSE; FLÆXNOT Å := FALSE;
FLÆXODD Å := FALSE; FLÆXSB Å := FALSE; FLÆXSQR Å := FALSE;
FLÆXUNI Å := FALSE; FLÆXNONEÅ := FALSE;
FOR J := XAB TO XXJP DO SUBTYPEÆJÅ := 0;
SUBTYPEÆXAB Å := 1; SUBTYPEÆXAD Å := 1;
SUBTYPEÆXNG Å := 2; SUBTYPEÆXSB Å := 2;
SUBTYPEÆXDEC Å := 3; SUBTYPEÆXAND Å := 3;
SUBTYPEÆXINC Å := 4; SUBTYPEÆXIOR Å := 4;
SUBTYPEÆXNOT Å := 5; SUBTYPEÆXMP Å := 5;
SUBTYPEÆXODD Å := 6; SUBTYPEÆXDV Å := 6;
SUBTYPEÆXSQR Å := 7; SUBTYPEÆXMOD Å := 7;
SUBTYPEÆXLOD Å := 1; SUBTYPEÆXEQU Å := 1;
SUBTYPEÆXLDA Å := 2; SUBTYPEÆXNEQ Å := 2;
SUBTYPEÆXSTR Å := 3; SUBTYPEÆXLES Å := 3;
SUBTYPEÆXLEQ Å := 4;
SUBTYPEÆXGRT Å := 5;
SUBTYPEÆXGEQ Å := 6;
SUBTYPEÆXUJP Å := 1;
SUBTYPEÆXFJP Å := 2;
BUILDADDR(EANONE,NONE,ANONE,ANONE,0);
BUILDADDR(EADDIR,DDIRECT,ANONE,ANONE,0);
BUILDADDR(EAADIR,ADIRECT,ANONE,ANONE,0);
BUILDADDR(EAIMMED,IMMED,ANONE,ANONE,0);
BUILDADDR(EADEFER,DEFER,ANONE,ANONE,0);
BUILDADDR(EAINCR,INCR,ANONE,ANONE,0);
BUILDADDR(EAPOP,INCR,SP,ANONE,0);
BUILDADDR(EAPUSH,DECR,SP,ANONE,0);
BUILDADDR(EALIMM,LABIMMED,ANONE,ANONE,0);
BUILDADDR(EAREL,RELATIVE,ANONE,ANONE,0);
BUILDADDR(EALAB,LABELLED,ANONE,ANONE,0);
(*RM*) BUILDADDR(EAPSET,PIMMED,ANONE,ANONE,0);
BUILDADDR(EABASED,BASED,ANONE,ANONE,0);
BUILDADDR(EALONG,LIMMED,ANONE,ANONE,0);
FOR R := DNONE TO A7 DO REGTYPEÆRÅ := NOTATYP;
R := D0;
FOR I:= 0 TO NDREGS DO BEGIN DREGSÆIÅ := R;
R := SUCC(R)
END;
R := A0;
FOR I:= 0 TO NAREGS DO BEGIN AREGSÆIÅ := R;
R := SUCC(R)
END;
MACHCODE := ' ';
MACHINDEX := 1;
HEXDATA := '0123456789ABCDEF';
SASGN(EXPROC,12288); (* HEX 3000 *)
FOR C := CHR(0) TO CHR(127) DO ASCIIÆCÅ := 32; (*BLANK*)
ASCIIÆ'a'Å:=97; ASCIIÆ'b'Å:=98; ASCIIÆ'c'Å:=99; ASCIIÆ'd'Å:=100;
ASCIIÆ'e'Å:=101;ASCIIÆ'f'Å:=102;ASCIIÆ'g'Å:=103;ASCIIÆ'h'Å:=104;
ASCIIÆ'i'Å:=105;ASCIIÆ'j'Å:=106;ASCIIÆ'k'Å:=107;ASCIIÆ'l'Å:=108;
ASCIIÆ'm'Å:=109;ASCIIÆ'n'Å:=110;ASCIIÆ'o'Å:=111;ASCIIÆ'p'Å:=112;
ASCIIÆ'q'Å:=113;ASCIIÆ'r'Å:=114;ASCIIÆ's'Å:=115;ASCIIÆ't'Å:=116;
ASCIIÆ'u'Å:=117;ASCIIÆ'v'Å:=118;ASCIIÆ'w'Å:=119;ASCIIÆ'x'Å:=120;
ASCIIÆ'y'Å:=121;ASCIIÆ'z'Å:=122;
ASCIIÆ'A'Å:=65; ASCIIÆ'B'Å:=66; ASCIIÆ'C'Å:=67; ASCIIÆ'D'Å:=68;
ASCIIÆ'E'Å:=69; ASCIIÆ'F'Å:=70; ASCIIÆ'G'Å:=71; ASCIIÆ'H'Å:=72;
ASCIIÆ'I'Å:=73; ASCIIÆ'J'Å:=74; ASCIIÆ'K'Å:=75; ASCIIÆ'L'Å:=76;;
ASCIIÆ'M'Å:=77; ASCIIÆ'N'Å:=78; ASCIIÆ'O'Å:=79; ASCIIÆ'P'Å:=80;
ASCIIÆ'Q'Å:=81; ASCIIÆ'R'Å:=82; ASCIIÆ'S'Å:=83; ASCIIÆ'T'Å:=84;
ASCIIÆ'U'Å:=85; ASCIIÆ'V'Å:=86; ASCIIÆ'W'Å:=87; ASCIIÆ'X'Å:=88;
ASCIIÆ'Y'Å:=89; ASCIIÆ'Z'Å:=90;
ASCIIÆ'0'Å:=48; ASCIIÆ'1'Å:=49; ASCIIÆ'2'Å:=50; ASCIIÆ'3'Å:=51;
ASCIIÆ'4'Å:=52; ASCIIÆ'5'Å:=53; ASCIIÆ'6'Å:=54; ASCIIÆ'7'Å:=55;
ASCIIÆ'8'Å:=56; ASCIIÆ'9'Å:=57;
ASCIIÆ' 'Å:=32; ASCIIÆ'*'Å:=42; ASCIIÆ'>'Å:=62;
ASCIIÆ'!'Å:=33; ASCIIÆ'+'Å:=43; ASCIIÆ'?'Å:=63;
ASCIIÆ'"'Å:=34; ASCIIÆ','Å:=44; ASCIIÆ'^'Å:=64;
ASCIIÆ'#'Å:=35; ASCIIÆ'-'Å:=45;
ASCIIÆ'$'Å:=36; ASCIIÆ'.'Å:=46; ASCIIÆ'Ø'Å:=92;
ASCIIÆ'%'Å:=37; ASCIIÆ'/'Å:=47;
ASCIIÆ'&'Å:=38; ASCIIÆ':'Å:=58; ASCIIÆ'!'Å:=94;
ASCIIÆ''''Å:=39;ASCIIÆ';'Å:=59;
ASCIIÆ'('Å:=40; ASCIIÆ'<'Å:=60;
ASCIIÆ')'Å:=41; ASCIIÆ'='Å:=61;
ASCIIÆ'Æ'Å:=91; ASCIIÆ'Å'Å:=93;
ASCIIÆ'_'Å:=95; ASCIIÆ'æ'Å:=123; ASCIIÆ'å'Å:=125;
ASCIIÆ'`'Å:=96; ASCIIÆ'ø'Å:=124; ASCIIÆ'^'Å:=126;
RTÆXCVBÅ := 4228; RTÆXAFIÅ := 4112; RTÆXCLOÅ := 4116;
RTÆXDISÅ := 4104; RTÆXEOFÅ := 4120; RTÆXEOLÅ := 4124;
RTÆXEQUÅ := 4268; RTÆXEXIÅ := 4096; RTÆXGEQÅ := 4288;
RTÆXENDÅ := 4096;
RTÆXGETÅ := 4128; RTÆXGRTÅ := 4284; RTÆXIFDÅ := 4132;
RTÆXINDÅ := 4264; RTÆXLEQÅ := 4280; RTÆXLESÅ := 4276;
RTÆXLODÅ := 4264; RTÆXNEQÅ := 4272; RTÆXNEWÅ := 4108;
RTÆXPAGÅ := 4136; RTÆXPEEÅ := 4140; RTÆXPOKÅ := 4144;
RTÆXPOSÅ := 4148; RTÆXPUTÅ := 4152; RTÆXRDBÅ := 4176;
RTÆXRDCÅ := 4180; RTÆXRDIÅ := 4184; RTÆXRDSÅ := 4188;
RTÆXRDVÅ := 4212; RTÆXRLNÅ := 4156; RTÆXRSTÅ := 4160;
RTÆXRWTÅ := 4164; RTÆXSCONÅ:= 4232; RTÆXSCOPÅ:= 4236;
RTÆXSDELÅ:= 4240; RTÆXSEEÅ := 4168; RTÆXSINSÅ := 4244;
RTÆXSLENÅ:= 4248; RTÆXSPOSÅ:= 4252; RTÆXSTOÅ := 4260;
RTÆXSTPÅ := 4100; RTÆXSTRÅ := 4256; RTÆXWLNÅ := 4172;
RTÆXWRBÅ := 4192; RTÆXWRCÅ := 4196; RTÆXWRIÅ := 4200;
RTÆXWRSÅ := 4204; RTÆXWRVÅ := 4208; RTÆXCVTÅ := 4220;
RTÆXCVTSUÅ := 4216; RTÆXCVTUSÅ := 4224; RTÆXLDCÅ := 4292;
RTÆXSTRVÅ := 4296; RTÆXSTOVÅ := 4300; RTÆXINDVÅ := 4304;
RTÆXLODVÅ := 4304; RTÆXEQUVÅ := 4308; RTÆXNEQVÅ := 4312;
RTÆXLESVÅ := 4316; RTÆXLEQVÅ := 4320; RTÆXGRTVÅ := 4324;
RTÆXGEQVÅ := 4328; RTÆXLDCVÅ := 4332; RTÆXSTCÅ := 4336;
RTÆXMPÅ := 4340; RTÆXDVÅ := 4344; RTÆXMODÅ := 4348;
RTÆXRLSÅ := 4148; RTÆXMRKÅ := 4144; RTÆXRDHÅ := 4528;
RTÆXRDJÅ := 4532; RTÆXWRHÅ := 4520; RTÆXWRJÅ := 4524;
END; (*INIT*)
(*-------------------------------------------------------------------------
SUMMARY PROCEDURE
-------------------------------------------------------------------------*)
PROCEDURE SUMMARIZE;
BEGIN WRITELN(LISTING,'*D REGISTERS: ',DALLOCCNT,' ALLOCATIONS, REQUIRING ',
DPUSHCNT,' PUSHES');
WRITELN(LISTING,'* AND ', DPOPCNT,' POPS');
WRITELN(LISTING,'*A REGISTERS: ',AALLOCCNT,' ALLOCATIONS, REQUIRING ',
APUSHCNT,' PUSHES');
WRITELN(LISTING,'* AND ', APOPCNT,' POPS');
WRITELN(LISTING,'*');
WRITE(LISTING,'*TOTAL OF ');
LTEMP := PC;
LSB(LTEMP,GENSTART);
PLINT(LISTING,LTEMP);
WRITELN(LISTING,' BYTES GENERATED.');
WRITE(OUTPUT,' CODE GENERATOR PRODUCED ');
PLINT(OUTPUT,LTEMP);
WRITELN(OUTPUT,' BYTES OF CODE.');
WRITELN(OUTPUT,' LABELS USED:',TOPLABEL:4);
IF ERRORWR THEN WRITELN(OUTPUT,' ***** ERROR(S) DETECTED *****')
ELSE WRITELN(OUTPUT,' NO ERRORS DETECTED.');
WRITELN(OUTPUT,'STACKPTR = ',STKPTR:5);
PAGE(LISTING)
END;
(*-------------------------------------------------------------------------
MAIN PROGRAM
-------------------------------------------------------------------------*)
BEGIN
REWRITE(LISTING);
WRITELN(LISTING,'* M68000 PASCAL COMPILER PHASE TWO VERSION 1.10 08/07/80 ');
RESET(PCODE);
REWRITE(OBJECT);
WRITELN(OUTPUT,' M68000 PASCAL COMPILER PHASE TWO VERSION 1.10');
WRITELN(OUTPUT,' COPYRIGHTED 1980 BY MOTOROLA, INC.');
WRITELN(LISTING,' ');
INIT;
GETHEADER;
IF LINEBUFÆ3Å = '2' THEN
REPEAT
SCAN;
(*WITH CURRI^ DO
WRITELN(LISTING,'* ',MNÆOPCODEÅ,ORD(OPTYPE),OPAND1,OPAND2,OPAND3);*)
IF FLÆCURRI^.OPCODEÅ THEN FLUSH;
UNTIL CURRI^.OPTYPE = ENDOP;
SUMMARIZE;
END.
▶EOF◀