		      {file GENDEFINE}

import
  globals,symtable,compio,compinit,loader,
  sysglobals;

export

  type
    opcodetype = (add,adda,addi,addq,andd,andi,asl,asr,
		  bra,bdummy,bhi,bls,bcc,bcs,bne,beq,bvc,
		  bvs,bpl,bmi,bge,blt,bgt,ble,
		  bchg,bclr,bset,btst,chk,clr,
		  cmp,cmpa,cmpm,cmpi,divs,
		  $IF MC68020$ divsl,extb,bfexts,bfextu,bfins,chk2, $END$
		  ext,jmp,jsr,lea,link,lsl,lsr,
		  move,movea,movetoCCR,movefromSR,moveI,movem,moveq,
		  muls,neg,nott,orr,pea,rts,
		  st,sf,shi,sls,scc,scs,sne,seq,svc,
		  svs,spl,smi,sge,slt,sgt,sle,
		  sub,suba,subi,subq,swap,trap,trapv,tst,unlk
		  $IF MC68020$ {68881 instructions}
		  ,fmovem,fmove,fsqrt,fabs,fcos,fsin,flogn,
		  fatan,fetox,fadd,fcmp,fdiv,fneg,fmul,fsub,
		  flognp1,fblt
                  ,fbne,fbeq,fble,fbge,fbgt        { Don Novy  1/17/90 }
                  ,fslt,fsne,fseq,fsle,fsge,fsgt   { Don Novy  1/22/90 }
                  $END$
		  );

    reftype = (abs16,abs32,rel16,rel16v,glob16,rel32);

  procedure genbody(curbody: stptr; fprocp: ctp);
  procedure codegeninit;

const
     SB =        5;     (* A5 is the stack base pointer *)
     localbase = 6;     (* A6 is local stack frame base register *)
     SP =        7;     (* A7 is top of stack pointer *)
     escapecodedisp = -2;
     FIBptrdisp =     -6;
     lastrecovdisp = -10;
     heapptrdisp =   -14;
     staticdisp = 8;    (* displacement of static link from stack marker *)
     {stackfudge = 700;  (* allowance for run time stack temporaries *)

     coderecs = 4;      (* number of 512 byte code buffers *)
     maxdir = 38;

   type
     dirange = 0..maxdir;
     libdirectory = array[dirange] of direntry;
     bytebufs = packed array[0..511] of byt;
     codebuffer = array[1..coderecs] of bytebufs;
     sizetype = (sby,sw,sl,fp,ub,uw);

     masktype = packed array[0..15] of boolean;

     flagtype = packed record case boolean of{8 bits}
		  true: (typ: reloctype;
			 size: sizetype;
			 patchable: boolean;
			 valueextend: boolean;
			 longoffset: boolean);
		  false: (b: byt);
		end;



   var
     globalattrlist: ^attrptr;   { points to the current statements attr list }
     freeattr: attrptr;          { points to a list of free attribute records }
     maxLCpatch: reflistptr;
     linenum: integer;
     bodylev,proclev: levrange;
     PCperline: integer;

     modulebody,ovflcheck,iocheck,
	       rangecheck,shortcircuit: boolean;
     callmode: callmodetype;
     curproc: ctp;
     PCcount: integer;

		    {Structured Constants}

     dedicatedregs: set of regrange;
     memorymodes: set of addrtype;
     conditionis: opcodetype;

		    {Files}

     codefileopen: boolean;
     file_name: fid;

     codephile: record
		  fileid: file;
		  buffer: ^codebuffer;
		  bytecount,
		  windowptr: addrrange;
		  headerblock,
		  startblock: shortint;
		end;

     defile: record
		fileid: file;
		buffer: ^bytebufs;
		bite,
		block: shortint;
	      end;

     refile: record
		fileid: file;
		buffer: ^bytebufs;
		bite,
		block: shortint;
	      end;

     totalbytesofcode : addrrange;
     startaddr : addrrange;                  { relative start address }

     defstartblock,refstartblock,extstartblock : shortint;
     sizeofdefs,sizeofrefs,sizeofexts : integer;

     libraryptr : ^libdirectory;
     nextmodule : dirrange;

   const
     max_module_nesting {minus 2} = 8;
   var
     def_ext_table: array[1..max_module_nesting]
				   of string[15];
     def_ext_top: shortint;

     ensure_valid_condition_code: boolean;

     OVERLAY,ADDRESS: string[7];
     EXEC: string[4];

