head     56.3;
access   paws bayes jws quist brad dew jwh;
symbols  ;
locks    ; strict;
comment  @# @;


56.3
date     93.01.27.13.35.11;  author jwh;  state Exp;
branches ;
next     56.2;

56.2
date     93.01.27.12.11.23;  author jwh;  state Exp;
branches ;
next     56.1;

56.1
date     91.11.05.09.25.19;  author jwh;  state Exp;
branches ;
next     55.1;

55.1
date     91.08.25.10.02.35;  author jwh;  state Exp;
branches ;
next     54.1;

54.1
date     91.03.18.15.12.45;  author jwh;  state Exp;
branches ;
next     53.1;

53.1
date     91.03.11.19.13.42;  author jwh;  state Exp;
branches ;
next     52.1;

52.1
date     91.02.19.08.58.52;  author jwh;  state Exp;
branches ;
next     51.1;

51.1
date     91.01.30.15.57.47;  author jwh;  state Exp;
branches ;
next     50.1;

50.1
date     90.10.29.16.10.41;  author jwh;  state Exp;
branches ;
next     49.1;

49.1
date     90.08.14.13.59.54;  author jwh;  state Exp;
branches ;
next     48.1;

48.1
date     90.07.26.11.05.16;  author jwh;  state Exp;
branches ;
next     47.1;

47.1
date     90.05.14.10.39.20;  author dew;  state Exp;
branches ;
next     46.1;

46.1
date     90.05.07.08.29.07;  author jwh;  state Exp;
branches ;
next     45.1;

45.1
date     90.04.19.15.36.10;  author jwh;  state Exp;
branches ;
next     44.1;

44.1
date     90.04.01.21.53.50;  author jwh;  state Exp;
branches ;
next     43.1;

43.1
date     90.03.20.13.43.41;  author jwh;  state Exp;
branches ;
next     42.1;

42.1
date     90.01.23.17.29.04;  author jwh;  state Exp;
branches ;
next     41.1;

41.1
date     89.12.22.11.11.39;  author jwh;  state Exp;
branches ;
next     40.2;

40.2
date     89.11.21.10.43.02;  author jwh;  state Exp;
branches ;
next     40.1;

40.1
date     89.09.29.11.34.48;  author jwh;  state Exp;
branches ;
next     39.1;

39.1
date     89.09.26.16.20.15;  author dew;  state Exp;
branches ;
next     38.1;

38.1
date     89.08.29.11.10.11;  author jwh;  state Exp;
branches ;
next     37.1;

37.1
date     89.05.12.11.23.07;  author dew;  state Exp;
branches ;
next     36.1;

36.1
date     89.02.06.10.02.13;  author dew;  state Exp;
branches ;
next     35.1;

35.1
date     89.02.02.13.11.41;  author dew;  state Exp;
branches ;
next     34.1;

34.1
date     89.01.23.15.47.50;  author jwh;  state Exp;
branches ;
next     33.1;

33.1
date     89.01.16.11.24.19;  author dew;  state Exp;
branches ;
next     32.1;

32.1
date     89.01.10.11.28.55;  author bayes;  state Exp;
branches ;
next     31.1;

31.1
date     88.12.14.17.49.50;  author bayes;  state Exp;
branches ;
next     30.1;

30.1
date     88.12.09.13.28.19;  author dew;  state Exp;
branches ;
next     29.1;

29.1
date     88.10.31.15.12.35;  author bayes;  state Exp;
branches ;
next     28.1;

28.1
date     88.10.06.10.43.15;  author dew;  state Exp;
branches ;
next     27.1;

27.1
date     88.09.29.11.04.45;  author bayes;  state Exp;
branches ;
next     26.1;

26.1
date     88.09.28.12.17.00;  author bayes;  state Exp;
branches ;
next     25.1;

25.1
date     88.03.02.08.58.14;  author bayes;  state Exp;
branches ;
next     24.1;

24.1
date     87.08.31.08.56.48;  author jws;  state Exp;
branches ;
next     23.1;

23.1
date     87.08.26.09.33.44;  author bayes;  state Exp;
branches ;
next     22.1;

22.1
date     87.08.17.10.10.20;  author bayes;  state Exp;
branches ;
next     21.1;

21.1
date     87.08.12.12.59.23;  author bayes;  state Exp;
branches ;
next     20.1;

20.1
date     87.07.30.10.10.16;  author bayes;  state Exp;
branches ;
next     19.1;

19.1
date     87.06.01.07.31.35;  author jws;  state Exp;
branches ;
next     18.1;

18.1
date     87.05.20.14.23.04;  author bayes;  state Exp;
branches ;
next     17.1;

17.1
date     87.04.30.09.39.54;  author jws;  state Exp;
branches ;
next     16.1;

16.1
date     87.04.26.14.57.03;  author jws;  state Exp;
branches ;
next     15.1;

15.1
date     87.04.13.08.19.31;  author jws;  state Exp;
branches ;
next     14.1;

14.1
date     87.04.01.14.03.43;  author jws;  state Exp;
branches ;
next     13.1;

13.1
date     87.02.28.17.49.19;  author jws;  state Exp;
branches ;
next     12.1;

12.1
date     87.02.02.12.33.54;  author jws;  state Exp;
branches ;
next     11.1;

11.1
date     87.01.19.09.00.19;  author jws;  state Exp;
branches ;
next     10.1;

10.1
date     86.12.24.10.03.34;  author jws;  state Exp;
branches ;
next     9.1;

9.1
date     86.12.12.13.20.34;  author bayes;  state Exp;
branches ;
next     8.1;

8.1
date     86.11.27.11.01.48;  author jws;  state Exp;
branches ;
next     7.1;

7.1
date     86.11.20.12.47.04;  author hal;  state Exp;
branches ;
next     6.1;

6.1
date     86.11.04.16.42.19;  author paws;  state Exp;
branches ;
next     5.1;

5.1
date     86.10.28.14.02.25;  author hal;  state Exp;
branches ;
next     4.1;

4.1
date     86.09.30.18.27.15;  author hal;  state Exp;
branches ;
next     3.1;

3.1
date     86.09.01.11.14.24;  author hal;  state Exp;
branches ;
next     2.2;

2.2
date     86.08.26.11.18.09;  author geli;  state Exp;
branches ;
next     2.1;

2.1
date     86.07.30.14.03.18;  author hal;  state Exp;
branches ;
next     1.1;

1.1
date     86.06.30.12.55.32;  author danm;  state tmp;
branches ;
next     ;


desc
@Base file for PWS 3.2 release.

@


56.3
log
@
pws2rcs automatic delta on Wed Jan 27 13:14:25 MST 1993
@
text
@{modifications made by jch on 08/26/86 }
{       allow '_' and '@@' at the beginning of a word (label)}
{       # register mask for movem}

IMPLEMENT

PROCEDURE PASS1;   { THIS PROCEDURE DOES ALL THE PASS 1 PROCESSING }
VAR SP: STREF;
    LABKIND: SYMKIND;
    REFTYPE: SYMKIND;
    STARTCOL: SHORTINT;
    LEN: SHORTINT;
    STRTEMP: STRING80;


PROCEDURE REFLIST;
CONST OPSOK=100; BADOPS=101;

VAR VAL: WORD32;
    COL:SHORTINT;
    TEMPIO: INTEGER;

BEGIN
TRY
VAL.HIHALF:=0;
REPEAT
  IF NOT(LINE[CURCOL] IN ['A'..'Z','_','@@']) THEN ESCAPE(BADOPS); {jch 08/26/86}
  STARTCOL:=CURCOL;
  REPEAT
    CURCOL:=CURCOL+1
  UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
  LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
  VAL.LOHALF:=0;
  LOOKUPSYMBOL(SP);
  IF SP=NIL THEN ENTERSYMBOL(SP, TRUE, REFTYPE, VAL);
  IF NOT(SP^.EXT) AND ((SP^.DEFINED=-1) OR (SP^.DEFINED=LINENO))  THEN BEGIN
    WITH SP^ DO
      BEGIN
      SKIND:=REFTYPE;
      SVALUE.LONGINT:=EXTSIZE DIV 4;
      EXT:=TRUE;
      DEFINED:=LINENO;
      END;
    TRY
      NEWBYTES(EXTFILE,SIZEOF(EXTREC)-80+LENGTH(LAB))
    RECOVER BEGIN
      if escapecode=-2 then begin
	WRITELN(LP,'MEMORY OVERFLOW!');
	LPCHECK;   { 3/2/84 }
	IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
	ESCAPE(-1);
      end else escape(escapecode);
    END;
    EXTFILE^.EXTNAME:=LAB;
    IF EXTHEAD = NIL THEN EXTHEAD:=EXTFILE
      ELSE EXTTAIL^.EXTNEXT:=EXTFILE;
    EXTTAIL:=EXTFILE;
    EXTFILE^.EXTNEXT:=NIL;
    EXTSIZE:=EXTSIZE+LENGTH(LAB)+4-(LENGTH(LAB) MOD 4);
    EXTCTR:=EXTCTR+1;
  END
  ELSE ERROR(ERRDUPDEFSYM);
  IF LINE[CURCOL]=BLANK THEN ESCAPE(OPSOK);
  IF LINE[CURCOL]<>COMMA THEN ESCAPE(BADOPS);
  CURCOL:=CURCOL+1;
UNTIL FALSE;
RECOVER
  IF ESCAPECODE=BADOPS THEN ERROR(ERRBADSYNTAX)
    ELSE IF ESCAPECODE<>OPSOK THEN ESCAPE(ESCAPECODE);
END;


PROCEDURE MODELIST(MFLAG:FORCEMODE);

CONST OPSOK=100; BADOPS=101;

VAR
  STARTCOL: SHORTINT;
  SP: STREF;

BEGIN
TRY
  REPEAT
    STARTCOL:=CURCOL;
    IF NOT(LINE[CURCOL] IN ['A'..'Z','@@','_']) THEN ESCAPE(BADOPS);{jch 08/26/86}
    REPEAT
      CURCOL:=CURCOL+1;
    UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
    LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
    LOOKUPSYMBOL(SP);
    IF SP<>NIL THEN
      IF NOT SP^.EXT THEN
	BEGIN
	  ERROR(ERRMODEDECL);
	  ESCAPE(BADOPS);
	END;
    ENTERSYMBOL(SP, FALSE, ABSOLUT, ZERO32);
    SP^.SMODE:=MFLAG;
    IF LINE[CURCOL]=BLANK THEN ESCAPE(OPSOK);
    IF LINE[CURCOL]<>COMMA THEN ESCAPE(BADOPS);
    CURCOL:=CURCOL+1;
  UNTIL FALSE;
RECOVER
  IF ESCAPECODE=BADOPS THEN ERROR(ERRBADSYNTAX)
    ELSE IF ESCAPECODE<>OPSOK THEN ESCAPE(ESCAPECODE);
END;


PROCEDURE PASS1PSEUDOS;  { PSEUDO-OP PROCESSING FOR PASS 1 }

VAR COUNT: SHORTINT; SYM: STREF;
    COL:SHORTINT;
    TEMPSOURCE: SOURCEPTR;


PROCEDURE CHARSTRING1;

VAR BYTECOUNT:SHORTINT;
    DONE: BOOLEAN;

BEGIN
DONE:=FALSE;
BYTECOUNT:=0;
REPEAT
  CURCOL:=CURCOL+1;
  IF CURCOL<>LENGTH(LINE) THEN BEGIN
    IF LINE[CURCOL]=CHR(39) THEN BEGIN
      IF LINE[CURCOL+1]<>CHR(39) THEN
	DONE:=TRUE
      ELSE BEGIN
	BYTECOUNT:=BYTECOUNT+1;
	CURCOL:=CURCOL+1;
      END
    END
    ELSE BYTECOUNT:=BYTECOUNT+1
  END
  ELSE BEGIN
    ERROR(ERRBADSYNTAX);
    DONE:=TRUE;
  END;
UNTIL DONE;
IF CURCOL<>LENGTH(LINE) THEN CURCOL:=CURCOL+1;
LOCCTR.LONGINT := LOCCTR.LONGINT + BYTECOUNT;
IF {LOCCTR.BITS[0]} ODD(LOCCTR.LOHALF) AND (SIZE=2) THEN
  LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
IF (SIZE=4) THEN WHILE BYTECOUNT MOD 4 <> 0  DO BEGIN
       LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
       BYTECOUNT:=BYTECOUNT+1;
     END;
END;



BEGIN
  CASE CURROP.CODE OF

   0: { COMMENT };

   1: { DC }
     BEGIN
       COUNT:=0;
       IF LINE[CURCOL]=CHR(39) THEN CHARSTRING1
       ELSE BEGIN
$if fpimmed$
	if sizesuffix = 'D' then
	  begin
	    if not fpimmedexp(false,evalok,evalue,curcol) then
	      begin     (* pass 2 will flag error *)
	      end;
	  end
	else
$end$
	 EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
	 COUNT:=1;
       END;
       WHILE LINE[CURCOL]=',' DO BEGIN
	 CURCOL:=CURCOL+1;
	 IF LINE[CURCOL]=CHR(39) THEN CHARSTRING1
	 ELSE BEGIN
	   COUNT:=COUNT+1;
$if fpimmed$
	   if sizesuffix = 'D' then
	     begin
	       if not fpimmedexp(false,evalok,evalue,curcol) then
		 begin  (* pass 2 will flag error *)
		 end;
	     end
	   else
$end$
	   EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
	 END;
       END;
       LOCCTR.LONGINT := LOCCTR.LONGINT + SIZE*COUNT;
     END;
   2: { DS }
     BEGIN
       EXPRESS(false, EVALOK, EVALUE, CURCOL);
       IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL)  and
	  (evalue.base=absolut) THEN
	   LOCCTR.LONGINT:=SIZE*EVALUE.OFFSET.LONGINT
		 +LOCCTR.LONGINT
     END;

   3: {END};  { NO ACTION }

   4: {MNAME}
      BEGIN
	IF GOTMODNAME THEN ERROR(ERRMODNAME)
	ELSE BEGIN
	  IF CHTYPE[LINE[CURCOL]]=ALPHABETIC THEN BEGIN
	    COL:=CURCOL;
	    REPEAT
	      COL:=COL+1;
	    UNTIL CHTYPE[LINE[COL]]=SPECIAL;
	    MODNAME:=COPY(LINE,CURCOL,COL-CURCOL);
	    if strlen(modname) > 15 then
	      setstrlen(modname,15);
	    GOTMODNAME:=TRUE;
	    IF LINE[COL]<>' ' THEN ERROR(ERREOLEXP);
	  END
	  ELSE ERROR(ERRSYMBEXP)
	END
      END;


   5: { EQU }
     BEGIN
       IF LAB='' THEN ERROR(ERRLABELREQD)
       ELSE BEGIN
	 LOOKUPSYMBOL(SYM);
	 IF CHECKREGS THEN
	   WITH SYM^ DO
	     BEGIN
	     SKIND:=CHECKREGMODE;
	     SVALUE.HIHALF:=0;
	     SVALUE.LOHALF:=CHECKREGNO;
	     SEXTPTR:=NIL;
	     EXT:=FALSE;
	     END
	 ELSE IF CHECKSPREGS THEN
	   WITH SYM^ DO
	     BEGIN
	     SKIND:=CHECKREGMODE;
	     SVALUE.HIHALF:=0;
	     SVALUE.LOHALF:=CHECKREGNO;
	     SEXTPTR:=NIL;
	     EXT:=FALSE;
	     END
	 ELSE BEGIN
	   EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
	   IF EVALOK=OK1 THEN
	     WITH SYM^ DO
	       BEGIN
	       SVALUE:=EVALUE.OFFSET;
	       SEXTPTR:=EVALUE.EXPREFS;
	       SKIND:=EVALUE.BASE;
	       if smode=nomode then SMODE:=EVALUE.EMODE;
	       EXT:=FALSE
	       END
	   ELSE
	     WITH SYM^ DO
	       BEGIN
	       ERROR(ERRBADEXPR);
	       SVALUE:=ZERO32;
	       SEXTPTR:=NIL;
	       SKIND:=ABSOLUT;
	       EXT:=FALSE;
	       END
	 END
       END
     END;

   6: BEGIN { SRC }
	IF CURCOL < LENGTH(PRINTLINE) THEN BEGIN
	  COUNT:=LENGTH(PRINTLINE) - CURCOL + 1;
	  TRY
	    NEWBYTES(TEMPSOURCE, COUNT+5)
	  RECOVER BEGIN
	    if escapecode=-2 then begin
	      WRITELN(LP,'MEMORY OVERFLOW!');
	      LPCHECK;   { 3/2/84 }
	      IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
	      ESCAPE(-1);
	    end else escape(escapecode);
	  END;
	  TEMPSOURCE^.SOURCELINE[0]:=CHR(COUNT);
	  FOR COL:=CURCOL TO LENGTH(PRINTLINE) DO
	    TEMPSOURCE^.SOURCELINE[COL-CURCOL+1]:=PRINTLINE[COL];
	  IF SOURCEHEAD=NIL THEN SOURCEHEAD:=TEMPSOURCE
	    ELSE SOURCETAIL^.NEXTSOURCE:=TEMPSOURCE;
	  SOURCETAIL:=TEMPSOURCE;
	  TEMPSOURCE^.NEXTSOURCE:=NIL;
	END
      END;


   8,10,12,14,16,17,18, 20, 29: ;  { NO PASS 1 ACTION }

   9: { LLEN }
      BEGIN
	EXPRESS(false, EVALOK, EVALUE, CURCOL);
	IF (EVALUE.EXPREFS<>NIL) OR (EVALOK<>OK1) OR
	   NOT((EVALUE.OFFSET.HIHALF=0) AND
	       (EVALUE.OFFSET.LOHALF>=32) AND
	       (EVALUE.OFFSET.LOHALF<=132)) THEN
	else LLEN:=EVALUE.OFFSET.LOHALF;
      END;

   11: { NOOBJ }
       object:=false;

   13,15: { ORG, RORG }
      BEGIN
	STRTEMP:=LAB;
	EXPRESS(false, EVALOK, EVALUE, CURCOL);
	IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL) THEN BEGIN
	  LOCCTR:=EVALUE.OFFSET;
	  IF CURROP.CODE=13 THEN PCMODE:=ABS ELSE PCMODE:=REL;
	  IF STRTEMP<>'' THEN BEGIN
	    LAB:=STRTEMP;
	    LOOKUPSYMBOL(SP);
	    SP^.SVALUE:=EVALUE.OFFSET;
	    IF PCMODE=ABS THEN SP^.SKIND:=ABSOLUT
	      ELSE SP^.SKIND:=RELATIVE;
	  END;
	  IF SIZE=4 THEN ORGMODE:=LONGFWDS ELSE ORGMODE:=SHORTFWDS;
	END
      END;

   19: { COM }
      BEGIN
       IF GOTCOM THEN ERROR(ERRBADCOM)
       ELSE BEGIN
	 GOTCOM:=TRUE;
	 IF LINE[CURCOL] IN ['A'..'Z','_','@@'] THEN BEGIN       {jch 08/26/86}
	   STARTCOL:=CURCOL;
	   REPEAT
	     CURCOL:=CURCOL+1;
	   UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
	   LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
	   ENTERSYMBOL(SP, TRUE, ABSOLUT, ZERO32);
	   SP^.EXT:=TRUE;
	   IF LINE[CURCOL]=COMMA THEN BEGIN
	     CURCOL:=CURCOL+1;
	     EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
	     IF (EVALOK=OK1) AND
		   (EVALUE.EXPREFS=NIL) THEN BEGIN
	       if evalue.base<>absolut then
		 error(errbadbase);
	       SP^.SVALUE.LONGINT:=1;
	       TRY
		 NEWBYTES(DEFFILE,SIZEOF(DEFREC)-80+LENGTH(LAB))
	       RECOVER BEGIN
		 if escapecode=-2 then begin
		   WRITELN(LP,'MEMORY OVERFLOW!');
		   LPCHECK;   { 3/2/84 }
		   IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
		   ESCAPE(-1);
		 end else escape(escapecode);
	       END;
	       DEFFILE^.IDNAME:=LAB;
	       DEFFILE^.DEFTYPE:=GLOBAL;
	       IF EVALUE.OFFSET.LONGINT<0 THEN
	       BEGIN
		 GLOBALSIZE:=-EVALUE.OFFSET.LONGINT;
		 DEFFILE^.LOCATION.LONGINT:=0;
	       END
	       ELSE BEGIN
		 GLOBALSIZE:=EVALUE.OFFSET.LONGINT;
		 DEFFILE^.LOCATION.LONGINT:=-GLOBALSIZE;
	       END;
	       IF DEFHEAD=NIL THEN DEFHEAD:=DEFFILE
		 ELSE DEFTAIL^.DEFNEXT:=DEFFILE;
	       DEFTAIL:=DEFFILE;
	       globalptr:=deffile;
	       DEFFILE^.DEFNEXT:=NIL;
	       DEFCTR:=DEFCTR+1;
	     END
	     ELSE ERROR(ERRBADCONST)
	   END
	   ELSE ERROR(ERRCOMMAEXP)
	 END
	 ELSE ERROR(ERRSYMBEXP);
       END
     END;


  21: {REFA}
      BEGIN
	REFTYPE:=ABSOLUT;
	REFLIST;
      END;

  22: {REFR}
      BEGIN
	REFTYPE:=RELATIVE;
	REFLIST;
      END;

  25: { LMODE }
     MODELIST(LMODE);

  26: { SMODE }
     MODELIST(SMODE);

  27: { RMODE }
     MODELIST(RMODE);

  30: { INCLUDE }
      INCLUDEINSTR;  { PROCEDURE IS IN READER MODULE }

  31, 32: { SPRINT, LPRINT };

  33: { START }
  BEGIN
    IF GOTSTART THEN ERROR(ERRGOTSTART)
    ELSE BEGIN
      EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
      IF (EVALUE.EXPREFS<>NIL) OR (EVALOK<>OK1)
	     THEN ERROR(ERRBADEXPR)
      ELSE BEGIN
	STARTLOC:=EVALUE.OFFSET;
	if evalue.base=absolut then startmode:=absolute
	  else startmode:=relocatable;
	GOTSTART:=TRUE;
      END
    END
  END;

  34: { DECIMAL }
      decimal:=true;

END; { OF CASE }

END;  { OF PROCEDURE PASS1PSEUDOS }



PROCEDURE PASS1STUFF;
VAR
  CMPI_PCREL: BOOLEAN;

$include 'M68KPAS1B'$


{THIS ROUTINE HANDLES ALL PASS1 PROCESSING FOR INSTRUCTIONS}
BEGIN
if currop.class = 99 then pass1pseudos
else
$if mc68881$
 if (currop.class >= fpbase) and (currop.class <= fptop) then
   pass1fpops
 else
$end$
  CASE CURROP.CLASS OF

  0: BEGIN { ILLEGAL OP}
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
     END;


  1,4,15,16,24,26,28,30,31,34,35: {ABCD, SBCD, ADDX, SUBX, EXG, EXT, MOVEQ, RTM}
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2;

  2,5: {ADD,ADDA, SUB, SUBA, AND, OR}
       BEGIN
	 PARSEOPERAND(OPERAND1);
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE;
	 IF LINE[CURCOL]=',' THEN BEGIN
	   CURCOL:=CURCOL+1;
	   PARSEOPERAND(OPERAND2);
	   IF CURROP.NAME[4]=' ' THEN BEGIN
	     IF ((OPERAND1.MODE<>0) AND (OPERAND2.MODE<>0)) OR
	       (NOT(MEMALT(OPERAND2)) AND (OPERAND2.MODE<>0)) THEN
		 OPERAND2.SIZE:=0;
	   END
	   ELSE IF OPERAND2.MODE<>1 THEN OPERAND2.SIZE:=0;
	   LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END;
       END;

 3: { ADDQ, SUBQ }
    BEGIN
      IF LINE[CURCOL] <> '#'   THEN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2
      ELSE BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	PARSEOPERAND(OPERAND1);
	IF LINE[CURCOL]=',' THEN
	  BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF ALTERABLE(OPERAND2) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
      END
    END;

6: { ASL, ASR, LSL, LSR, ROL, ROR, ROXL, ROXR }
   BEGIN
     PARSEOPERAND(OPERAND1);
     IF MEMALT(OPERAND1) THEN
       LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE
     ELSE LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
   END;

7: { Bcc, BSR }
   BEGIN
   IF      (SIZESUFFIX='S') OR (SIZESUFFIX='B') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2
   ELSE IF (SIZESUFFIX='W') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 4
   ELSE IF (SIZESUFFIX='L') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 6
   ELSE
     BEGIN
     EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
     IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL) THEN
       BEGIN
       EVALUE.OFFSET.LONGINT := EVALUE.OFFSET.LONGINT - 2 - LOCCTR.LONGINT;
       IF FITSIN8(EVALUE.OFFSET) AND
	  (EVALUE.EXPREFS=NIL) AND
	  not ((evalue.base=absolut ) and (pcmode=rel)) and
	  not ((evalue.base=relative) and (pcmode=abs)) THEN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2
       ELSE
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
       END (* EVALOK=OK1 *)
     ELSE
       LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
     END; (* SIZESUFFIX <> 'S' *)
   END; (* Bcc *)

8: { Bx BIT OPERATIONS }
    BEGIN
      LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
      PARSEOPERAND(OPERAND1);
      IF (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
      IF (OPERAND1.MODE=0) OR ((OPERAND1.MODE=7) AND (OPERAND1.REG=4)) THEN
	BEGIN
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF CURROP.NAME='BTST     ' THEN BEGIN
	      IF (OPERAND2.MODE=1) OR
		 ((OPERAND2.MODE=7) AND (OPERAND2.REG=4) AND
		 (OPERAND1.MODE<>0)) OR
		 ((OPERAND2.MODE=7) AND (OPERAND2.REG>4))
		THEN OPERAND2.SIZE:=0
	    END
	    ELSE IF NOT DATALTERABLE(OPERAND2) THEN OPERAND2.SIZE:=0;
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
	END
    END;

  9,10,11,25: {CHK, DIVS, DIVU, CLR, NBCD, NEG, NEGX, CMP, CMPA}
       BEGIN
	 PARSEOPERAND(OPERAND1);
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE;

	 IF (CURROP.NAME = 'TAS      ') AND
	    (OPERAND1.MODE <> 0 {Dreg}) THEN
	   ERROR(errTASwarn);

       END;

  12,13,23,32,41: { STOP, DBCC, MOVEP, MOVEC, PACK }
	    LOCCTR.LONGINT := LOCCTR.LONGINT + 4;

   14: {EOR}
       BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	 PARSEOPERAND(OPERAND1);
	 IF OPERAND1.MODE=0  THEN
	   IF LINE[CURCOL]=',' THEN BEGIN
	     CURCOL:=CURCOL+1;
	     PARSEOPERAND(OPERAND2);
	     LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END;
       END;

   17,19: { (JMP, JSR, PEA), LEA }
	  BEGIN
	    PARSEOPERAND(OPERAND1);
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE+2;
	  END;

   18,27: { ADDI, SUBI, CMPI, ANDI, ORI, EORI }
       BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	 PARSEOPERAND(OPERAND1);
	 IF (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN BEGIN
	   LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	   IF LINE[CURCOL]=',' THEN BEGIN
	     CURCOL:=CURCOL+1;
	     PARSEOPERAND(OPERAND2);
	     CMPI_PCREL:=(CURROP.NAME='CMPI     ') AND (OPERAND2.MODE=7) AND
	       ((OPERAND2.REG=2) OR (OPERAND2.REG=3));
	     IF ((CURROP.CLASS=18) AND (DATALTERABLE(OPERAND2) OR CMPI_PCREL)) OR
		((CURROP.CLASS=27) AND (DATALTERABLE(OPERAND2) OR
		  ((OPERAND2.MODE=7) AND (OPERAND2.REG>4) and
		   (operand2.reg<7)))) THEN
	       LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END
	 END
	 ELSE IF SIZE=1 THEN
		LOCCTR.LONGINT := LOCCTR.LONGINT + 2
	      ELSE
		LOCCTR.LONGINT := LOCCTR.LONGINT + SIZE
       END;

    20: { LINK }
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2 + SIZE;

    21: { MOVE }
	BEGIN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	  PARSEOPERAND(OPERAND1);
	  LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
	END;

    22: { MOVEM }
	BEGIN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	  IF (CHECKREGS OR (LINE[CURCOL] = '#')) THEN BEGIN     {jch 08/26/86}
$if mc68881$
	    if checkregmode = fpreg then error( errfpregnotallowed );
$end$
	    WHILE (LINE[CURCOL]<>' ') AND (LINE[CURCOL]<>',') DO
	      CURCOL:=CURCOL+1;
	    IF LINE[CURCOL]=',' THEN BEGIN
	      CURCOL:=CURCOL+1;
	      PARSEOPERAND(OPERAND2);
	      IF CONTROLMODE(OPERAND2) AND ALTERABLE(OPERAND2)
		THEN LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	    END;
	  END
	  ELSE BEGIN
	    PARSEOPERAND(OPERAND1);
	    IF CONTROLMODE(OPERAND1) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	  END
	END;

    29: { TRAP }
	BEGIN
	PARSEOPERAND(OPERAND1);
	IF LINE[CURCOL]=','
	  THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 4
	  ELSE LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	END;

    33: { MOVES }
	BEGIN
	  LOCCTR.LONGINT:=LOCCTR.LONGINT+4;
	  PARSEOPERAND(OPERAND1);
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF ((OPERAND1.MODE<=1) OR (OPERAND2.MODE<=1)) AND
	       (MEMALT(OPERAND1) OR MEMALT(OPERAND2)) THEN
	       LOCCTR.LONGINT:=LOCCTR.LONGINT+OPERAND1.SIZE+
		  OPERAND2.SIZE;
	  END;
	END;

    36: { TRAPcc }
	IF      SIZESUFFIX='L' THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 6
	ELSE IF SIZESUFFIX='W' THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 4
	ELSE                        LOCCTR.LONGINT := LOCCTR.LONGINT + 2;

    37: { CALLM }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF NOT CONTROLMODE(OPERAND2) THEN (* BAD MODE *)
	    OPERAND2.SIZE:=0;
	  LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END;
	END;

    38: { CAS }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	    BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND3);
	    IF MEMALT(OPERAND3) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND3.SIZE;
	    END;
	  END;
	END;

    39: { CAS2 }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 6;
	END;

    40,42,43,45: { (CHK2, CMP2), BFCHG, BFEXTS, DIVS.L }
	BEGIN
	PARSEOPERAND(OPERAND1);
	CASE CURROP.CLASS OF
	  40: { CHK2, CMP2 }
	    IF NOT CONTROLMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  42: { BFTST, BFCHG, BFCLR, BFSET }
	    IF NOT ((OPERAND1.MODE=0) OR
	      ((CURROP.NAME<>'BFTST    ') AND CONTROLALTERABLE(OPERAND1)) OR
	      ((CURROP.NAME ='BFTST    ') AND      CONTROLMODE(OPERAND1))) THEN
	      OPERAND1.SIZE:=0;
	  43: { BFEXTU, BFEXTS, BFFFO }
	    IF (OPERAND1.MODE<>0) AND NOT CONTROLMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  45: { DIVS.L, DIVSL.L, DIVU.L, DIVUL.L, MULS.L, MULU.L }
	    IF NOT DATAMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  END;
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4 + OPERAND1.SIZE;
	END;

    44: { BFINS }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF (OPERAND2.MODE=0) OR CONTROLALTERABLE(OPERAND2) THEN
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  (* ELSE BAD MODE *)
	  END;
	END;
    46: { MOVE16 - ADDED 6/30/89 JWH }
	BEGIN { 4 Bytes or 6 Bytes ????? }
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF OPERAND1.MODE = 7 THEN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 2
	ELSE
	  IF (LINE[CURCOL]=',') THEN
	  BEGIN
	   CURCOL:=CURCOL+1;
	   PARSEOPERAND(OPERAND2);
	   IF (OPERAND2.MODE = 7) THEN
	    LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	  (* ELSE BAD MODE - PASS2 WILL CATCH IT ????? *)
	  END;
	END;    { CASE 46 }
  47,48,49,50,51,52 :
	BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	END;  { CASES 47,48,49,50,51,52 }

  END; { OF CASE }
END;  { OF PROCEDURE PASS1STUFF }


BEGIN
  GETLINE;
  WHILE (LINE<>' END') AND (CURROP.NAME<>'END      ') DO BEGIN
    IF ODD(LOCCTR.LOHALF) AND NOT(((CURROP.NAME='DS       ') OR
	(CURROP.NAME='DC       ')) AND (SIZE=1))
	and (currop.name<>'         ') THEN
      LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
    IF LAB<>'' THEN BEGIN
      IF PCMODE=ABS THEN LABKIND:=ABSOLUT ELSE LABKIND:=RELATIVE;
      if ((ord(lab[1])>=ord('A')) and (ord(lab[1])<=ord('Z'))
	 OR (ORD(LAB[1]) = ORD('_')) OR (ORD(LAB[1]) = ORD('@@'))) then  {jch 08/26/86}
      begin
	ENTERSYMBOL(SP,TRUE, LABKIND, LOCCTR);
	SP^.EXT:=FALSE; { OVERRIDE ANY REFS FOR THIS SYMBOL }
      end
      else error(errbadsyntax);
    END;
    OPERAND1.VALUE.EXPREFS:=NIL;
    OPERAND2.VALUE.EXPREFS:=NIL;
    OPERAND3.VALUE.EXPREFS:=NIL;
    OPERAND4.VALUE.EXPREFS:=NIL;
    OPERAND5.VALUE.EXPREFS:=NIL;
    OPERAND6.VALUE.EXPREFS:=NIL;
    PASS1STUFF;
    IF OPERAND1.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND1.VALUE.EXPREFS);
    IF OPERAND2.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND2.VALUE.EXPREFS);
    IF OPERAND3.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND3.VALUE.EXPREFS);
    IF OPERAND4.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND4.VALUE.EXPREFS);
    IF OPERAND5.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND5.VALUE.EXPREFS);
    IF OPERAND6.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND6.VALUE.EXPREFS);
    GETLINE;
  END;
END;



@


56.2
log
@
pws2rcs automatic delta on Wed Jan 27 11:57:27 MST 1993
@
text
@d1 811
@


56.1
log
@Automatic bump of revision number for PWS version 3.25
@
text
@a0 811
{modifications made by jch on 08/26/86 }
{       allow '_' and '@@' at the beginning of a word (label)}
{       # register mask for movem}

IMPLEMENT

PROCEDURE PASS1;   { THIS PROCEDURE DOES ALL THE PASS 1 PROCESSING }
VAR SP: STREF;
    LABKIND: SYMKIND;
    REFTYPE: SYMKIND;
    STARTCOL: SHORTINT;
    LEN: SHORTINT;
    STRTEMP: STRING80;


PROCEDURE REFLIST;
CONST OPSOK=100; BADOPS=101;

VAR VAL: WORD32;
    COL:SHORTINT;
    TEMPIO: INTEGER;

BEGIN
TRY
VAL.HIHALF:=0;
REPEAT
  IF NOT(LINE[CURCOL] IN ['A'..'Z','_','@@']) THEN ESCAPE(BADOPS); {jch 08/26/86}
  STARTCOL:=CURCOL;
  REPEAT
    CURCOL:=CURCOL+1
  UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
  LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
  VAL.LOHALF:=0;
  LOOKUPSYMBOL(SP);
  IF SP=NIL THEN ENTERSYMBOL(SP, TRUE, REFTYPE, VAL);
  IF NOT(SP^.EXT) AND ((SP^.DEFINED=-1) OR (SP^.DEFINED=LINENO))  THEN BEGIN
    WITH SP^ DO
      BEGIN
      SKIND:=REFTYPE;
      SVALUE.LONGINT:=EXTSIZE DIV 4;
      EXT:=TRUE;
      DEFINED:=LINENO;
      END;
    TRY
      NEWBYTES(EXTFILE,SIZEOF(EXTREC)-80+LENGTH(LAB))
    RECOVER BEGIN
      if escapecode=-2 then begin
	WRITELN(LP,'MEMORY OVERFLOW!');
	LPCHECK;   { 3/2/84 }
	IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
	ESCAPE(-1);
      end else escape(escapecode);
    END;
    EXTFILE^.EXTNAME:=LAB;
    IF EXTHEAD = NIL THEN EXTHEAD:=EXTFILE
      ELSE EXTTAIL^.EXTNEXT:=EXTFILE;
    EXTTAIL:=EXTFILE;
    EXTFILE^.EXTNEXT:=NIL;
    EXTSIZE:=EXTSIZE+LENGTH(LAB)+4-(LENGTH(LAB) MOD 4);
    EXTCTR:=EXTCTR+1;
  END
  ELSE ERROR(ERRDUPDEFSYM);
  IF LINE[CURCOL]=BLANK THEN ESCAPE(OPSOK);
  IF LINE[CURCOL]<>COMMA THEN ESCAPE(BADOPS);
  CURCOL:=CURCOL+1;
UNTIL FALSE;
RECOVER
  IF ESCAPECODE=BADOPS THEN ERROR(ERRBADSYNTAX)
    ELSE IF ESCAPECODE<>OPSOK THEN ESCAPE(ESCAPECODE);
END;


PROCEDURE MODELIST(MFLAG:FORCEMODE);

CONST OPSOK=100; BADOPS=101;

VAR
  STARTCOL: SHORTINT;
  SP: STREF;

BEGIN
TRY
  REPEAT
    STARTCOL:=CURCOL;
    IF NOT(LINE[CURCOL] IN ['A'..'Z','@@','_']) THEN ESCAPE(BADOPS);{jch 08/26/86}
    REPEAT
      CURCOL:=CURCOL+1;
    UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
    LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
    LOOKUPSYMBOL(SP);
    IF SP<>NIL THEN
      IF NOT SP^.EXT THEN
	BEGIN
	  ERROR(ERRMODEDECL);
	  ESCAPE(BADOPS);
	END;
    ENTERSYMBOL(SP, FALSE, ABSOLUT, ZERO32);
    SP^.SMODE:=MFLAG;
    IF LINE[CURCOL]=BLANK THEN ESCAPE(OPSOK);
    IF LINE[CURCOL]<>COMMA THEN ESCAPE(BADOPS);
    CURCOL:=CURCOL+1;
  UNTIL FALSE;
RECOVER
  IF ESCAPECODE=BADOPS THEN ERROR(ERRBADSYNTAX)
    ELSE IF ESCAPECODE<>OPSOK THEN ESCAPE(ESCAPECODE);
END;


PROCEDURE PASS1PSEUDOS;  { PSEUDO-OP PROCESSING FOR PASS 1 }

VAR COUNT: SHORTINT; SYM: STREF;
    COL:SHORTINT;
    TEMPSOURCE: SOURCEPTR;


PROCEDURE CHARSTRING1;

VAR BYTECOUNT:SHORTINT;
    DONE: BOOLEAN;

BEGIN
DONE:=FALSE;
BYTECOUNT:=0;
REPEAT
  CURCOL:=CURCOL+1;
  IF CURCOL<>LENGTH(LINE) THEN BEGIN
    IF LINE[CURCOL]=CHR(39) THEN BEGIN
      IF LINE[CURCOL+1]<>CHR(39) THEN
	DONE:=TRUE
      ELSE BEGIN
	BYTECOUNT:=BYTECOUNT+1;
	CURCOL:=CURCOL+1;
      END
    END
    ELSE BYTECOUNT:=BYTECOUNT+1
  END
  ELSE BEGIN
    ERROR(ERRBADSYNTAX);
    DONE:=TRUE;
  END;
UNTIL DONE;
IF CURCOL<>LENGTH(LINE) THEN CURCOL:=CURCOL+1;
LOCCTR.LONGINT := LOCCTR.LONGINT + BYTECOUNT;
IF {LOCCTR.BITS[0]} ODD(LOCCTR.LOHALF) AND (SIZE=2) THEN
  LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
IF (SIZE=4) THEN WHILE BYTECOUNT MOD 4 <> 0  DO BEGIN
       LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
       BYTECOUNT:=BYTECOUNT+1;
     END;
END;



BEGIN
  CASE CURROP.CODE OF

   0: { COMMENT };

   1: { DC }
     BEGIN
       COUNT:=0;
       IF LINE[CURCOL]=CHR(39) THEN CHARSTRING1
       ELSE BEGIN
$if fpimmed$
	if sizesuffix = 'D' then
	  begin
	    if not fpimmedexp(false,evalok,evalue,curcol) then
	      begin     (* pass 2 will flag error *)
	      end;
	  end
	else
$end$
	 EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
	 COUNT:=1;
       END;
       WHILE LINE[CURCOL]=',' DO BEGIN
	 CURCOL:=CURCOL+1;
	 IF LINE[CURCOL]=CHR(39) THEN CHARSTRING1
	 ELSE BEGIN
	   COUNT:=COUNT+1;
$if fpimmed$
	   if sizesuffix = 'D' then
	     begin
	       if not fpimmedexp(false,evalok,evalue,curcol) then
		 begin  (* pass 2 will flag error *)
		 end;
	     end
	   else
$end$
	   EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
	 END;
       END;
       LOCCTR.LONGINT := LOCCTR.LONGINT + SIZE*COUNT;
     END;
   2: { DS }
     BEGIN
       EXPRESS(false, EVALOK, EVALUE, CURCOL);
       IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL)  and
	  (evalue.base=absolut) THEN
	   LOCCTR.LONGINT:=SIZE*EVALUE.OFFSET.LONGINT
		 +LOCCTR.LONGINT
     END;

   3: {END};  { NO ACTION }

   4: {MNAME}
      BEGIN
	IF GOTMODNAME THEN ERROR(ERRMODNAME)
	ELSE BEGIN
	  IF CHTYPE[LINE[CURCOL]]=ALPHABETIC THEN BEGIN
	    COL:=CURCOL;
	    REPEAT
	      COL:=COL+1;
	    UNTIL CHTYPE[LINE[COL]]=SPECIAL;
	    MODNAME:=COPY(LINE,CURCOL,COL-CURCOL);
	    if strlen(modname) > 15 then
	      setstrlen(modname,15);
	    GOTMODNAME:=TRUE;
	    IF LINE[COL]<>' ' THEN ERROR(ERREOLEXP);
	  END
	  ELSE ERROR(ERRSYMBEXP)
	END
      END;


   5: { EQU }
     BEGIN
       IF LAB='' THEN ERROR(ERRLABELREQD)
       ELSE BEGIN
	 LOOKUPSYMBOL(SYM);
	 IF CHECKREGS THEN
	   WITH SYM^ DO
	     BEGIN
	     SKIND:=CHECKREGMODE;
	     SVALUE.HIHALF:=0;
	     SVALUE.LOHALF:=CHECKREGNO;
	     SEXTPTR:=NIL;
	     EXT:=FALSE;
	     END
	 ELSE IF CHECKSPREGS THEN
	   WITH SYM^ DO
	     BEGIN
	     SKIND:=CHECKREGMODE;
	     SVALUE.HIHALF:=0;
	     SVALUE.LOHALF:=CHECKREGNO;
	     SEXTPTR:=NIL;
	     EXT:=FALSE;
	     END
	 ELSE BEGIN
	   EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
	   IF EVALOK=OK1 THEN
	     WITH SYM^ DO
	       BEGIN
	       SVALUE:=EVALUE.OFFSET;
	       SEXTPTR:=EVALUE.EXPREFS;
	       SKIND:=EVALUE.BASE;
	       if smode=nomode then SMODE:=EVALUE.EMODE;
	       EXT:=FALSE
	       END
	   ELSE
	     WITH SYM^ DO
	       BEGIN
	       ERROR(ERRBADEXPR);
	       SVALUE:=ZERO32;
	       SEXTPTR:=NIL;
	       SKIND:=ABSOLUT;
	       EXT:=FALSE;
	       END
	 END
       END
     END;

   6: BEGIN { SRC }
	IF CURCOL < LENGTH(PRINTLINE) THEN BEGIN
	  COUNT:=LENGTH(PRINTLINE) - CURCOL + 1;
	  TRY
	    NEWBYTES(TEMPSOURCE, COUNT+5)
	  RECOVER BEGIN
	    if escapecode=-2 then begin
	      WRITELN(LP,'MEMORY OVERFLOW!');
	      LPCHECK;   { 3/2/84 }
	      IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
	      ESCAPE(-1);
	    end else escape(escapecode);
	  END;
	  TEMPSOURCE^.SOURCELINE[0]:=CHR(COUNT);
	  FOR COL:=CURCOL TO LENGTH(PRINTLINE) DO
	    TEMPSOURCE^.SOURCELINE[COL-CURCOL+1]:=PRINTLINE[COL];
	  IF SOURCEHEAD=NIL THEN SOURCEHEAD:=TEMPSOURCE
	    ELSE SOURCETAIL^.NEXTSOURCE:=TEMPSOURCE;
	  SOURCETAIL:=TEMPSOURCE;
	  TEMPSOURCE^.NEXTSOURCE:=NIL;
	END
      END;


   8,10,12,14,16,17,18, 20, 29: ;  { NO PASS 1 ACTION }

   9: { LLEN }
      BEGIN
	EXPRESS(false, EVALOK, EVALUE, CURCOL);
	IF (EVALUE.EXPREFS<>NIL) OR (EVALOK<>OK1) OR
	   NOT((EVALUE.OFFSET.HIHALF=0) AND
	       (EVALUE.OFFSET.LOHALF>=32) AND
	       (EVALUE.OFFSET.LOHALF<=132)) THEN
	else LLEN:=EVALUE.OFFSET.LOHALF;
      END;

   11: { NOOBJ }
       object:=false;

   13,15: { ORG, RORG }
      BEGIN
	STRTEMP:=LAB;
	EXPRESS(false, EVALOK, EVALUE, CURCOL);
	IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL) THEN BEGIN
	  LOCCTR:=EVALUE.OFFSET;
	  IF CURROP.CODE=13 THEN PCMODE:=ABS ELSE PCMODE:=REL;
	  IF STRTEMP<>'' THEN BEGIN
	    LAB:=STRTEMP;
	    LOOKUPSYMBOL(SP);
	    SP^.SVALUE:=EVALUE.OFFSET;
	    IF PCMODE=ABS THEN SP^.SKIND:=ABSOLUT
	      ELSE SP^.SKIND:=RELATIVE;
	  END;
	  IF SIZE=4 THEN ORGMODE:=LONGFWDS ELSE ORGMODE:=SHORTFWDS;
	END
      END;

   19: { COM }
      BEGIN
       IF GOTCOM THEN ERROR(ERRBADCOM)
       ELSE BEGIN
	 GOTCOM:=TRUE;
	 IF LINE[CURCOL] IN ['A'..'Z','_','@@'] THEN BEGIN       {jch 08/26/86}
	   STARTCOL:=CURCOL;
	   REPEAT
	     CURCOL:=CURCOL+1;
	   UNTIL CHTYPE[LINE[CURCOL]]=SPECIAL;
	   LAB:=COPY(LINE, STARTCOL, CURCOL-STARTCOL);
	   ENTERSYMBOL(SP, TRUE, ABSOLUT, ZERO32);
	   SP^.EXT:=TRUE;
	   IF LINE[CURCOL]=COMMA THEN BEGIN
	     CURCOL:=CURCOL+1;
	     EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
	     IF (EVALOK=OK1) AND
		   (EVALUE.EXPREFS=NIL) THEN BEGIN
	       if evalue.base<>absolut then
		 error(errbadbase);
	       SP^.SVALUE.LONGINT:=1;
	       TRY
		 NEWBYTES(DEFFILE,SIZEOF(DEFREC)-80+LENGTH(LAB))
	       RECOVER BEGIN
		 if escapecode=-2 then begin
		   WRITELN(LP,'MEMORY OVERFLOW!');
		   LPCHECK;   { 3/2/84 }
		   IF LISTNAME<>'CONSOLE:' THEN WRITELN('MEMORY OVERFLOW!');
		   ESCAPE(-1);
		 end else escape(escapecode);
	       END;
	       DEFFILE^.IDNAME:=LAB;
	       DEFFILE^.DEFTYPE:=GLOBAL;
	       IF EVALUE.OFFSET.LONGINT<0 THEN
	       BEGIN
		 GLOBALSIZE:=-EVALUE.OFFSET.LONGINT;
		 DEFFILE^.LOCATION.LONGINT:=0;
	       END
	       ELSE BEGIN
		 GLOBALSIZE:=EVALUE.OFFSET.LONGINT;
		 DEFFILE^.LOCATION.LONGINT:=-GLOBALSIZE;
	       END;
	       IF DEFHEAD=NIL THEN DEFHEAD:=DEFFILE
		 ELSE DEFTAIL^.DEFNEXT:=DEFFILE;
	       DEFTAIL:=DEFFILE;
	       globalptr:=deffile;
	       DEFFILE^.DEFNEXT:=NIL;
	       DEFCTR:=DEFCTR+1;
	     END
	     ELSE ERROR(ERRBADCONST)
	   END
	   ELSE ERROR(ERRCOMMAEXP)
	 END
	 ELSE ERROR(ERRSYMBEXP);
       END
     END;


  21: {REFA}
      BEGIN
	REFTYPE:=ABSOLUT;
	REFLIST;
      END;

  22: {REFR}
      BEGIN
	REFTYPE:=RELATIVE;
	REFLIST;
      END;

  25: { LMODE }
     MODELIST(LMODE);

  26: { SMODE }
     MODELIST(SMODE);

  27: { RMODE }
     MODELIST(RMODE);

  30: { INCLUDE }
      INCLUDEINSTR;  { PROCEDURE IS IN READER MODULE }

  31, 32: { SPRINT, LPRINT };

  33: { START }
  BEGIN
    IF GOTSTART THEN ERROR(ERRGOTSTART)
    ELSE BEGIN
      EXPRESS(TRUE, EVALOK, EVALUE, CURCOL);
      IF (EVALUE.EXPREFS<>NIL) OR (EVALOK<>OK1)
	     THEN ERROR(ERRBADEXPR)
      ELSE BEGIN
	STARTLOC:=EVALUE.OFFSET;
	if evalue.base=absolut then startmode:=absolute
	  else startmode:=relocatable;
	GOTSTART:=TRUE;
      END
    END
  END;

  34: { DECIMAL }
      decimal:=true;

END; { OF CASE }

END;  { OF PROCEDURE PASS1PSEUDOS }



PROCEDURE PASS1STUFF;
VAR
  CMPI_PCREL: BOOLEAN;

$include 'M68KPAS1B'$


{THIS ROUTINE HANDLES ALL PASS1 PROCESSING FOR INSTRUCTIONS}
BEGIN
if currop.class = 99 then pass1pseudos
else
$if mc68881$
 if (currop.class >= fpbase) and (currop.class <= fptop) then
   pass1fpops
 else
$end$
  CASE CURROP.CLASS OF

  0: BEGIN { ILLEGAL OP}
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
     END;


  1,4,15,16,24,26,28,30,31,34,35: {ABCD, SBCD, ADDX, SUBX, EXG, EXT, MOVEQ, RTM}
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2;

  2,5: {ADD,ADDA, SUB, SUBA, AND, OR}
       BEGIN
	 PARSEOPERAND(OPERAND1);
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE;
	 IF LINE[CURCOL]=',' THEN BEGIN
	   CURCOL:=CURCOL+1;
	   PARSEOPERAND(OPERAND2);
	   IF CURROP.NAME[4]=' ' THEN BEGIN
	     IF ((OPERAND1.MODE<>0) AND (OPERAND2.MODE<>0)) OR
	       (NOT(MEMALT(OPERAND2)) AND (OPERAND2.MODE<>0)) THEN
		 OPERAND2.SIZE:=0;
	   END
	   ELSE IF OPERAND2.MODE<>1 THEN OPERAND2.SIZE:=0;
	   LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END;
       END;

 3: { ADDQ, SUBQ }
    BEGIN
      IF LINE[CURCOL] <> '#'   THEN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2
      ELSE BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	PARSEOPERAND(OPERAND1);
	IF LINE[CURCOL]=',' THEN
	  BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF ALTERABLE(OPERAND2) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
      END
    END;

6: { ASL, ASR, LSL, LSR, ROL, ROR, ROXL, ROXR }
   BEGIN
     PARSEOPERAND(OPERAND1);
     IF MEMALT(OPERAND1) THEN
       LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE
     ELSE LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
   END;

7: { Bcc, BSR }
   BEGIN
   IF      (SIZESUFFIX='S') OR (SIZESUFFIX='B') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 2
   ELSE IF (SIZESUFFIX='W') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 4
   ELSE IF (SIZESUFFIX='L') THEN
     LOCCTR.LONGINT := LOCCTR.LONGINT + 6
   ELSE
     BEGIN
     EXPRESS(FALSE, EVALOK, EVALUE, CURCOL);
     IF (EVALOK=OK1) AND (EVALUE.EXPREFS=NIL) THEN
       BEGIN
       EVALUE.OFFSET.LONGINT := EVALUE.OFFSET.LONGINT - 2 - LOCCTR.LONGINT;
       IF FITSIN8(EVALUE.OFFSET) AND
	  (EVALUE.EXPREFS=NIL) AND
	  not ((evalue.base=absolut ) and (pcmode=rel)) and
	  not ((evalue.base=relative) and (pcmode=abs)) THEN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2
       ELSE
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
       END (* EVALOK=OK1 *)
     ELSE
       LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
     END; (* SIZESUFFIX <> 'S' *)
   END; (* Bcc *)

8: { Bx BIT OPERATIONS }
    BEGIN
      LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
      PARSEOPERAND(OPERAND1);
      IF (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
      IF (OPERAND1.MODE=0) OR ((OPERAND1.MODE=7) AND (OPERAND1.REG=4)) THEN
	BEGIN
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF CURROP.NAME='BTST     ' THEN BEGIN
	      IF (OPERAND2.MODE=1) OR
		 ((OPERAND2.MODE=7) AND (OPERAND2.REG=4) AND
		 (OPERAND1.MODE<>0)) OR
		 ((OPERAND2.MODE=7) AND (OPERAND2.REG>4))
		THEN OPERAND2.SIZE:=0
	    END
	    ELSE IF NOT DATALTERABLE(OPERAND2) THEN OPERAND2.SIZE:=0;
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
	END
    END;

  9,10,11,25: {CHK, DIVS, DIVU, CLR, NBCD, NEG, NEGX, CMP, CMPA}
       BEGIN
	 PARSEOPERAND(OPERAND1);
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2+OPERAND1.SIZE;

	 IF (CURROP.NAME = 'TAS      ') AND
	    (OPERAND1.MODE <> 0 {Dreg}) THEN
	   ERROR(errTASwarn);

       END;

  12,13,23,32,41: { STOP, DBCC, MOVEP, MOVEC, PACK }
	    LOCCTR.LONGINT := LOCCTR.LONGINT + 4;

   14: {EOR}
       BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	 PARSEOPERAND(OPERAND1);
	 IF OPERAND1.MODE=0  THEN
	   IF LINE[CURCOL]=',' THEN BEGIN
	     CURCOL:=CURCOL+1;
	     PARSEOPERAND(OPERAND2);
	     LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END;
       END;

   17,19: { (JMP, JSR, PEA), LEA }
	  BEGIN
	    PARSEOPERAND(OPERAND1);
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE+2;
	  END;

   18,27: { ADDI, SUBI, CMPI, ANDI, ORI, EORI }
       BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	 PARSEOPERAND(OPERAND1);
	 IF (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN BEGIN
	   LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	   IF LINE[CURCOL]=',' THEN BEGIN
	     CURCOL:=CURCOL+1;
	     PARSEOPERAND(OPERAND2);
	     CMPI_PCREL:=(CURROP.NAME='CMPI     ') AND (OPERAND2.MODE=7) AND
	       ((OPERAND2.REG=2) OR (OPERAND2.REG=3));
	     IF ((CURROP.CLASS=18) AND (DATALTERABLE(OPERAND2) OR CMPI_PCREL)) OR
		((CURROP.CLASS=27) AND (DATALTERABLE(OPERAND2) OR
		  ((OPERAND2.MODE=7) AND (OPERAND2.REG>4) and
		   (operand2.reg<7)))) THEN
	       LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	   END
	 END
	 ELSE IF SIZE=1 THEN
		LOCCTR.LONGINT := LOCCTR.LONGINT + 2
	      ELSE
		LOCCTR.LONGINT := LOCCTR.LONGINT + SIZE
       END;

    20: { LINK }
	LOCCTR.LONGINT := LOCCTR.LONGINT + 2 + SIZE;

    21: { MOVE }
	BEGIN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	  PARSEOPERAND(OPERAND1);
	  LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END
	END;

    22: { MOVEM }
	BEGIN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	  IF (CHECKREGS OR (LINE[CURCOL] = '#')) THEN BEGIN     {jch 08/26/86}
$if mc68881$
	    if checkregmode = fpreg then error( errfpregnotallowed );
$end$
	    WHILE (LINE[CURCOL]<>' ') AND (LINE[CURCOL]<>',') DO
	      CURCOL:=CURCOL+1;
	    IF LINE[CURCOL]=',' THEN BEGIN
	      CURCOL:=CURCOL+1;
	      PARSEOPERAND(OPERAND2);
	      IF CONTROLMODE(OPERAND2) AND ALTERABLE(OPERAND2)
		THEN LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	    END;
	  END
	  ELSE BEGIN
	    PARSEOPERAND(OPERAND1);
	    IF CONTROLMODE(OPERAND1) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND1.SIZE;
	  END
	END;

    29: { TRAP }
	BEGIN
	PARSEOPERAND(OPERAND1);
	IF LINE[CURCOL]=','
	  THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 4
	  ELSE LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	END;

    33: { MOVES }
	BEGIN
	  LOCCTR.LONGINT:=LOCCTR.LONGINT+4;
	  PARSEOPERAND(OPERAND1);
	  IF LINE[CURCOL]=',' THEN BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND2);
	    IF ((OPERAND1.MODE<=1) OR (OPERAND2.MODE<=1)) AND
	       (MEMALT(OPERAND1) OR MEMALT(OPERAND2)) THEN
	       LOCCTR.LONGINT:=LOCCTR.LONGINT+OPERAND1.SIZE+
		  OPERAND2.SIZE;
	  END;
	END;

    36: { TRAPcc }
	IF      SIZESUFFIX='L' THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 6
	ELSE IF SIZESUFFIX='W' THEN LOCCTR.LONGINT := LOCCTR.LONGINT + 4
	ELSE                        LOCCTR.LONGINT := LOCCTR.LONGINT + 2;

    37: { CALLM }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=7) AND (OPERAND1.REG=4) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF NOT CONTROLMODE(OPERAND2) THEN (* BAD MODE *)
	    OPERAND2.SIZE:=0;
	  LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  END;
	END;

    38: { CAS }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	    BEGIN
	    CURCOL:=CURCOL+1;
	    PARSEOPERAND(OPERAND3);
	    IF MEMALT(OPERAND3) THEN
	      LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND3.SIZE;
	    END;
	  END;
	END;

    39: { CAS2 }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 6;
	END;

    40,42,43,45: { (CHK2, CMP2), BFCHG, BFEXTS, DIVS.L }
	BEGIN
	PARSEOPERAND(OPERAND1);
	CASE CURROP.CLASS OF
	  40: { CHK2, CMP2 }
	    IF NOT CONTROLMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  42: { BFTST, BFCHG, BFCLR, BFSET }
	    IF NOT ((OPERAND1.MODE=0) OR
	      ((CURROP.NAME<>'BFTST    ') AND CONTROLALTERABLE(OPERAND1)) OR
	      ((CURROP.NAME ='BFTST    ') AND      CONTROLMODE(OPERAND1))) THEN
	      OPERAND1.SIZE:=0;
	  43: { BFEXTU, BFEXTS, BFFFO }
	    IF (OPERAND1.MODE<>0) AND NOT CONTROLMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  45: { DIVS.L, DIVSL.L, DIVU.L, DIVUL.L, MULS.L, MULU.L }
	    IF NOT DATAMODE(OPERAND1) THEN
	      OPERAND1.SIZE:=0;
	  END;
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4 + OPERAND1.SIZE;
	END;

    44: { BFINS }
	BEGIN
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF (LINE[CURCOL]=',') AND (OPERAND1.MODE=0) THEN
	  BEGIN
	  CURCOL:=CURCOL+1;
	  PARSEOPERAND(OPERAND2);
	  IF (OPERAND2.MODE=0) OR CONTROLALTERABLE(OPERAND2) THEN
	    LOCCTR.LONGINT := LOCCTR.LONGINT + OPERAND2.SIZE;
	  (* ELSE BAD MODE *)
	  END;
	END;
    46: { MOVE16 - ADDED 6/30/89 JWH }
	BEGIN { 4 Bytes or 6 Bytes ????? }
	LOCCTR.LONGINT := LOCCTR.LONGINT + 4;
	PARSEOPERAND(OPERAND1);
	IF OPERAND1.MODE = 7 THEN
	  LOCCTR.LONGINT := LOCCTR.LONGINT + 2
	ELSE
	  IF (LINE[CURCOL]=',') THEN
	  BEGIN
	   CURCOL:=CURCOL+1;
	   PARSEOPERAND(OPERAND2);
	   IF (OPERAND2.MODE = 7) THEN
	    LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	  (* ELSE BAD MODE - PASS2 WILL CATCH IT ????? *)
	  END;
	END;    { CASE 46 }
  47,48,49,50,51,52 :
	BEGIN
	 LOCCTR.LONGINT := LOCCTR.LONGINT + 2;
	END;  { CASES 47,48,49,50,51,52 }

  END; { OF CASE }
END;  { OF PROCEDURE PASS1STUFF }


BEGIN
  GETLINE;
  WHILE (LINE<>' END') AND (CURROP.NAME<>'END      ') DO BEGIN
    IF ODD(LOCCTR.LOHALF) AND NOT(((CURROP.NAME='DS       ') OR
	(CURROP.NAME='DC       ')) AND (SIZE=1))
	and (currop.name<>'         ') THEN
      LOCCTR.LONGINT := LOCCTR.LONGINT + 1;
    IF LAB<>'' THEN BEGIN
      IF PCMODE=ABS THEN LABKIND:=ABSOLUT ELSE LABKIND:=RELATIVE;
      if ((ord(lab[1])>=ord('A')) and (ord(lab[1])<=ord('Z'))
	 OR (ORD(LAB[1]) = ORD('_')) OR (ORD(LAB[1]) = ORD('@@'))) then  {jch 08/26/86}
      begin
	ENTERSYMBOL(SP,TRUE, LABKIND, LOCCTR);
	SP^.EXT:=FALSE; { OVERRIDE ANY REFS FOR THIS SYMBOL }
      end
      else error(errbadsyntax);
    END;
    OPERAND1.VALUE.EXPREFS:=NIL;
    OPERAND2.VALUE.EXPREFS:=NIL;
    OPERAND3.VALUE.EXPREFS:=NIL;
    OPERAND4.VALUE.EXPREFS:=NIL;
    OPERAND5.VALUE.EXPREFS:=NIL;
    OPERAND6.VALUE.EXPREFS:=NIL;
    PASS1STUFF;
    IF OPERAND1.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND1.VALUE.EXPREFS);
    IF OPERAND2.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND2.VALUE.EXPREFS);
    IF OPERAND3.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND3.VALUE.EXPREFS);
    IF OPERAND4.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND4.VALUE.EXPREFS);
    IF OPERAND5.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND5.VALUE.EXPREFS);
    IF OPERAND6.VALUE.EXPREFS<>NIL THEN DISPOSE(OPERAND6.VALUE.EXPREFS);
    GETLINE;
  END;
END;



@


55.1
log
@Automatic bump of revision number for PWS version 3.25A
@
text
@@


54.1
log
@Automatic bump of revision number for PWS version 3.24
@
text
@@


53.1
log
@Automatic bump of revision number for PWS version 3.24B
@
text
@@


52.1
log
@Automatic bump of revision number for PWS version 3.24A
@
text
@@


51.1
log
@Automatic bump of revision number for PWS version 3.24d
@
text
@@


50.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


49.1
log
@Automatic bump of revision number for PWS version 3.24b
@
text
@@


48.1
log
@Automatic bump of revision number for PWS version 3.24a
@
text
@@


47.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


46.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


45.1
log
@Automatic bump of revision number for PWS version 3.23C
@
text
@@


44.1
log
@Automatic bump of revision number for PWS version 3.23B
@
text
@@


43.1
log
@Automatic bump of revision number for PWS version 3.23aA
@
text
@@


42.1
log
@Automatic bump of revision number for PWS version 3.23e
@
text
@@


41.1
log
@Automatic bump of revision number for PWS version 3.23d
@
text
@@


40.2
log
@
        Added code to handle the new 68040 instructions MOVE16,
    CINV, and CPUSH.

        JWH 11/21/89.
@
text
@@


40.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@d751 20
@


39.1
log
@Automatic bump of revision number for PWS version 3.23b
@
text
@@


38.1
log
@Automatic bump of revision number for PWS version 3.23a
@
text
@@


37.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


36.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


35.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


34.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


33.1
log
@Automatic bump of revision number for PWS version 3.22D
@
text
@@


32.1
log
@Automatic bump of revision number for PWS version 3.22C
@
text
@@


31.1
log
@Automatic bump of revision number for PWS version 3.22B
@
text
@@


30.1
log
@Automatic bump of revision number for PWS version 3.22A
@
text
@@


29.1
log
@Automatic bump of revision number for PWS version 3.22b
@
text
@@


28.1
log
@Automatic bump of revision number for PWS version 3.3b
@
text
@@


27.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


26.1
log
@Automatic bump of revision number for PWS version 3.3 Synch
@
text
@@


25.1
log
@Automatic bump of revision number for PWS version 3.2Y
@
text
@@


24.1
log
@Automatic bump of revision number for PWS version 3.2
@
text
@@


23.1
log
@Automatic bump of revision number for PWS version 3.2P
@
text
@@


22.1
log
@Automatic bump of revision number for PWS version 3.2N
@
text
@@


21.1
log
@Automatic bump of revision number for PWS version 3.2M
@
text
@@


20.1
log
@Automatic bump of revision number for PWS version 3.2L
@
text
@@


19.1
log
@Automatic bump of revision number for PWS version 3.2K
@
text
@@


18.1
log
@Automatic bump of revision number for PWS version 3.2J
@
text
@@


17.1
log
@Automatic bump of revision number for PWS version 3.2I+
@
text
@@


16.1
log
@Automatic bump of revision number for PWS version 3.2I
@
text
@@


15.1
log
@Automatic bump of revision number for PWS version 3.2H
@
text
@@


14.1
log
@Automatic bump of revision number for PWS version 3.2G
@
text
@@


13.1
log
@Automatic bump of revision number for PWS version 3.2F
@
text
@@


12.1
log
@Automatic bump of revision number for PWS version 3.2E
@
text
@@


11.1
log
@Automatic bump of revision number for PWS version 3.2D
@
text
@@


10.1
log
@Automatic bump of revision number for PWS version 3.2C
@
text
@@


9.1
log
@Automatic bump of revision number for PWS version 3.2B
@
text
@@


8.1
log
@Automatic bump of revision number for PWS version 3.2A
@
text
@@


7.1
log
@Automatic bump of revision number for PWS version 3.2l
@
text
@@


6.1
log
@Automatic bump of revision number for PWS version 3.2k
@
text
@@


5.1
log
@Automatic bump of revision number for PWS version 3.2j
@
text
@@


4.1
log
@Automatic bump of revision number for PWS version 3.2i
@
text
@@


3.1
log
@Automatic bump of revision number for PWS version 3.2h
@
text
@@


2.2
log
@changes to be able to assemble PAWS C compiler output
@
text
@@


2.1
log
@Auto bump rev number to 2.1 for sys 3.2e.
@
text
@d1 3
d27 1
a27 1
  IF NOT(LINE[CURCOL] IN ['A'..'Z']) THEN ESCAPE(BADOPS);
d85 1
a85 1
    IF NOT(LINE[CURCOL] IN ['A'..'Z']) THEN ESCAPE(BADOPS);
d335 1
a335 1
	 IF LINE[CURCOL] IN ['A'..'Z'] THEN BEGIN
d632 1
a632 1
	  IF CHECKREGS THEN BEGIN
d765 3
a767 1
      if (ord(lab[1])>=ord('A')) and (ord(lab[1])<=ord('Z')) then begin
@


1.1
log
@Initial revision
@
text
@@
