/*------------------------------------------------------------------*/
/*								    */
/*		      MC68000 Cross Assembler			    */
/*								    */
/*	       Copyright (c) 1985 by Brian R. Anderson		    */
/*								    */
/*		 Global	variables - January 4, 1989		    */
/*								    */
/*   This program may be copied	for personal, non-commercial use    */
/*   only, provided that the above copyright notice is included	    */
/*   on	all copies of the source code.	Copying	for any	other use   */
/*   without the consent of the	author is prohibited.		    */
/*								    */
/*------------------------------------------------------------------*/
/*								    */
/*		Originally published (in Modula-2) in		    */
/*	    Dr.	Dobb's Journal, April, May, and June 1986.          */
/*								    */
/*	 AmigaDOS conversion copyright 1989 by Charlie Gibbs.	    */
/*								    */
/*------------------------------------------------------------------*/

#ifdef PRIMARY
#define	GLOBAL
#else
#define	GLOBAL extern
#endif

GLOBAL char SourceFN[MAXFN];	/* Source file name */
GLOBAL char HeaderFN[MAXFN];	/* Header file name (-h) */
GLOBAL char SrecFN[MAXFN];	/* Object file name (-o) */
GLOBAL char InclList[MAXLINE];	/* List	of directories to search (-i) */
GLOBAL char IdntName[MAXLINE];	/* Program unit	name */

struct fs {
    int	fd;		/* File	handle */
    char *Buf;		/* Pointer to buffer */
    char *Ptr;		/* Current position in buffer */
    char *Lim;		/* Logical end of buffer */
};
GLOBAL struct fs In;	/* Input file */
GLOBAL struct fs Eq;	/* Equate file */
GLOBAL struct fs List;	/* Listing file	*/
GLOBAL struct fs Srec;	/* Object file */

/*	Command-line options	*/
GLOBAL int DumpSym;	/* -d Dump the symbol table */
GLOBAL int FwdProc;	/* -f Special processing for forward references	*/
GLOBAL int KeepTabs;	/* -k Keep tabs	in the listing file */
GLOBAL int SuppList;	/* (neither -l nor -x) Suppress	listing	file */
GLOBAL int LnMax;	/* -p Maximum number of	lines per page */
GLOBAL int Quiet;	/* -q Line no. display interval	(0 to suppress)	*/
GLOBAL long HashSize;	/* -w Number of	entries	in the hash table */
GLOBAL int XrefList;	/* -x Produce a	cross-reference	listing	*/
GLOBAL int HashStats;	/* -y Display hashing statistics */
GLOBAL int DebugStart;	/* -z Debug display starts here	*/
GLOBAL int DebugEnd;	/* -z Debug display ends here */

GLOBAL char TTLstring[MAXLINE];	/* Title string	*/

GLOBAL int  LabLine;		/* Last	labeled	line number */
GLOBAL int  LineCount;		/* Source line counter */
GLOBAL char Line[MAXLINE];	/* Current source line */
GLOBAL char Label[MAXLINE];	/* Instruction label */
GLOBAL char OpCode[MAXLINE];	/* Instruction mnemonic	*/
GLOBAL char SrcOp[MAXLINE];	/* First (source) operand */
GLOBAL char DestOp[MAXLINE];	/* Second (destination)	operand	*/
GLOBAL int  LabLoc, OpLoc;	/* Label and mnemonic start here */
GLOBAL int  SrcLoc, DestLoc;	/* Operands start here */
GLOBAL int  Dir, PrevDir;	/* Assembler directive */
GLOBAL int  NumSyms;		/* Number of symbols */
GLOBAL long ObjOp;		/* OpCode object code */
GLOBAL long ObjSrc;		/* Source operand object code */
GLOBAL long ObjDest;		/* Destination operand object code */
GLOBAL char ObjString[MAXLINE];	/* String data */
GLOBAL int  nO,	nS, nD,	nX;	/* Length of above components */
GLOBAL int  PrntAddr;		/* Print AddrCnt on listing */
GLOBAL int  MakeHunk;		/* We must make	a hunk */
GLOBAL int  ListOff;		/* NOLIST is supressing	listing	lines */
GLOBAL int  LnCnt;		/* Number of lines on current page */
GLOBAL int  PgCnt;		/* Page	number */
GLOBAL long Hunk2;		/* Hunk	number (from GetValue) */
GLOBAL int  DefLine2;		/* Definition line number */
GLOBAL int  GotEqur;		/* We have register equates */
GLOBAL int  SmallData;		/* Small data model */
GLOBAL int  AnyNear;		/* We got at least one NEAR directive */
GLOBAL int  FwdShort;		/* Forward reference could be made short */

GLOBAL int  Pass2;	/* Pass	2 flag */
GLOBAL long AddrCnt;	/* Location counter */
GLOBAL long AddrAdv;	/* Bump	AddrCnt	by this	much */
GLOBAL long OrgHigh;	/* Highest address reached if we ORG backwards */
GLOBAL long OrgSeek;	/* Return here in Srec if we ORG backwards */
GLOBAL long EndAddr;	/* END statement transfer address */
GLOBAL long SectStart;	/* Current section (or portion)	starts here */
GLOBAL int  SectLine;	/* Line	number where section started */
GLOBAL int  HunkSeq;	/* Hunk	sequence number	*/
GLOBAL long HunkType;	/* Current hunk	type */
GLOBAL long HunkFlags;	/* Hunk	flags (MEMF_FAST or MEMF_CHIP) */
GLOBAL long CurrHunk;	/* Current hunk	number */
GLOBAL long NextHunk;	/* Next	available hunk number */
GLOBAL long LenPos;	/* Seek	position of current hunk length	*/
GLOBAL char *LenPtr;	/* Pointer to length if	in buffer, else	NULL */
GLOBAL int  InclErrs;	/* Error processing INCLUDE statement(s) */
GLOBAL int  InnrFMac;	/* An inner file has been read by a user macro */
GLOBAL int  OrgFlag;	/* ORG may require object file fixup */

GLOBAL int  SFormat;	/* Generate S-record format */
GLOBAL long StartAddr;	/* Address that	record starts on */
GLOBAL long TempAddr;	/* Address of where we are now */

GLOBAL int  IncStart;	/* Start line number of	skippable INCLUDE */
GLOBAL struct InFCtl *IncPtr;	/* Copy	of InF for skippable INCLUDE */
struct SkipEnt {		/* Skippable INCLUDE description */
    struct SetFixup *Set1;	/*  Pointer to first SET fixup */
    int	Start;			/*  Starting line number of INCLUDE */
    int	Finish;			/*  Ending line	number of INCLUDE */
    int	MCount;			/*  Value of MacCount at end of	INCLUDE	*/
};
struct SetFixup	{		/* SET symbol fixup entry */
    struct SymTab *Sym;		/* Pointer to symbol table entry */
    long Val;			/* Fixup value */
    long Hunk;			/* Fixup hunk number */
};
GLOBAL struct SkipEnt *SkipLim;	/* Logical end of skippable INCLUDEs */
GLOBAL struct SkipEnt *SkipIdx;	/* Current skippable INCLUDE entry */
GLOBAL struct SetFixup *SetFixLim;	/* Next	available SetFixup */

struct SymTab {				/* Symbol table	*/
    struct SymTab *Link;	/* Link	to next	entry in hash chain */
    char *Nam;	/* Pointer to symbol */
    long Val;	/* Value */
    long Hunk;	/* Hunk	number (ORed with MEMF_CHIP or MEM_FAST
			if applicable SECTION
		   ~(pointer to	symbol)	if XREF
		   Pointer to macro text if MACRO		*/
    int	 Defn;	/* Line	number where defined */
    int	 Flags;	/* Flags bits:	0 - XREF
				1 - XDEF
				2 - SET
				3 - MACRO (symbol is preceded by blank)
				4 - SECTION (name preceded by 2	blanks
					and 4-digit hex	sequence number)
				5 - register name (EQUR)
				6 - register list (REG)
				7 - PUBLIC (XREF or XDEF will be set) */
    struct Ref *Ref1;	/* Pointer to first reference entry */
};
GLOBAL struct SymTab *SymStart;	/* The symbol table starts here	*/
GLOBAL struct SymTab *SymLim;	/* The symbol table ends here */
GLOBAL struct SymTab *SymCurr;	/* Start of current chunk of data */
GLOBAL struct SymTab *Sym;	/* ReadSymTab sets this	up */
GLOBAL struct SymTab *Sect;	/* Current section's entry */
GLOBAL struct SymTab *SymChunk;	/* Current symbol chunk	for NextSym */
GLOBAL struct SymTab *SymChLim;	/* End of *SymChunk chunk */
GLOBAL struct SymTab **Hash;	/* Pointer to hash table */
GLOBAL struct SymTab **SymSort;	/* Symbol sort area */
GLOBAL int  *HashCount;		/* Hashing summary table */

struct NameChunk {		/* Chunk of labels or macro text */
    struct NameChunk *Link;	/* Link	to the next chunk */
    char *Data[CHUNKSIZE-sizeof(struct NameChunk *)];	/* Data	area */
};
GLOBAL struct NameChunk	*NameStart;	/* Start of first name chunk */
GLOBAL char		*NameLim;	/* Next	available name entry */
GLOBAL struct NameChunk	*NameCurr;	/* Start of current name chunk */

struct Ref {			/* Reference entry */
    struct Ref *NextRef;	/* Pointer to next reference entry */
    int	RefNum[MAXREF];		/* Reference line numbers */
};
GLOBAL struct Ref *RefLim;	/* Next	available reference entry */

struct RelTab {			/* Relocation table entry */
    struct RelTab *Link;	/* Link	to the next entry */
    long Offset;		/* Offset to relocatable value */
    long Hunk;			/* Hunk	type to	relocate relative to */
    int	Size;			/* Size	of relocatable value */
};
GLOBAL struct RelTab *RelStart;	/* Relocation data starts here */
GLOBAL struct RelTab *RelLim;	/* Relocation data ends	here */
GLOBAL struct RelTab *RelCurr;	/* Start of current chunk of data */
GLOBAL struct RelTab *RelLast;	/* Last	relocation entry added */

struct TermStack {		/* Parser's term stack */
    long value;		/* Value */
    long hunk;		/* Hunk	number */
    int	 oploc;		/* Location in source statement	*/
    int	 defline;	/* Line	number where defined */
};
GLOBAL struct TermStack	*Term;	/* Term	stack pointer */

struct OpStack {		/* Parser's operator stack */
    char chr;		/* Operator character */
    int	 prec;		/* Precedence */
};
GLOBAL struct OpStack *Ops;	/* Operator stack pointer */

GLOBAL char OpPrec[256];	/* Operator precedence look-up table */

GLOBAL int  InFNum;		/* Current input nesting level */
struct InFCtl {
    long Pos;			/* Current position in input */
    char *UPtr;			/* Current position in user macro or 0 */
    char *NPtr;			/* File	name stack pointer */
    int	 Line;			/* Current line	number in this file */
    int	 NArg;			/* Number of macro arguments or	-1 */
    int	 MCnt;			/* Macro expansion number (for \@) */
};
GLOBAL struct InFCtl *InF;	/* Macro/include file stack pointer */
GLOBAL struct InFCtl *LowInF;	/* "Low-water mark" for InF */
GLOBAL char *Heap2;		/* Secondary heap */
GLOBAL char *NextFNS;		/* Next	input file path/name */
GLOBAL char *High2;		/* Secondary high-water	mark */
GLOBAL char *Low2;		/* Low limit from top of heap */

GLOBAL int  OuterMac;		/* Level number	of outermost macro */
GLOBAL int  MacCount;		/* Number of macros expanded */
GLOBAL int  SkipNest;		/* Skipped IF/ENDC nesting count */
GLOBAL char MacSize[2];		/* Macro call size ("B", "W", or "L") */

struct OpConfig	{		/* Operand configuration */
    long Value;	/* Value */
    long Hunk;	/* Hunk	number */
    int	 Defn;	/* Line	number where defined */
    int	 Mode;	/* Addressing mode */
    int	 Loc;	/* Location of operand on Line */
    int	 Rn;	/* Register number */
    int	 Xn;	/* Index register number */
    int	 Xsize;	/* Size	of index */
    int	 X;	/* Is index Data or Address reg? */
};
GLOBAL struct OpConfig Src, Dest;   /* Source and destination operands */

GLOBAL int Size;	/* size	for OpCode */
GLOBAL int InstSize;	/* Size	of instruction,	including operands */
GLOBAL int AdrModeA;	/* Addressing modes for	this instruction */
GLOBAL int AdrModeB;	/*		 ditto			 */
GLOBAL int Op;		/* Raw bit pattern for OpCode */

GLOBAL int ErrorCount;

/* Error message tables	*/
GLOBAL int ErrLim, ErrCode[ERRMAX], ErrPos[ERRMAX];
