DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦4f2908826⟧ TextFile

    Length: 244992 (0x3bd00)
    Types: TextFile
    Names: »list1«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »list1« 

TextFile

82.01.12.      12.40.                           pascal    version  1980.06.17

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

end
blocksread = 999
▶EOF◀