/*
*      Z80 - Assembler
*      Copyright (C) 1987-1992 by Udo Munk
*
*      History:
*      17-SEP-1987 Development under Digital Research CP/M 2.2
*      28-JUN-1988 Switched to Unix System V.3
*/

/*
*      Rechner und Betriebssystem abhaengige Definitionen
*/
#define LENFN           128     /* max. Laenge von Filenamen */
#define READA           "r"     /* file open mode read ascii */
#define WRITEA          "w"     /* file open mode write ascii */
#define WRITEB          "w"     /* file open mode write binary */

/*
*      Diverse Konstanten
*/
#define REL             "1.1"
#define COPYR           "Copyright (C) 1988, 89, 90 by Udo Munk"
#define SRCEXT          ".asm"  /* Filenamen-Extension der Quelle */
#define OBJEXT          ".bin"  /* Filenamen-Extension des Object Code */
#define LSTEXT          ".lis"  /* Filenamen-Extension des Listings */
#define OUTBIN          1       /* Format der Objektdatei: binaer */
#define OUTMOS          2       /*                         Mostek binaer */
#define OUTHEX          3       /*                         Intel hex */
#define OUTDEF          OUTMOS  /* Default-Format der Objektdatei */
#define COMMENT         ';'     /* Kommentar-Zeichen */
#define LINCOM          '*'     /* wenn in Spalte 1, Kommentarzeile */
#define LABSEP          ':'     /* Label-Seperator */
#define STRSEP          '\''    /* String-Separator */
#define ENDFILE         "END"   /* Ende der Quelle */
#define MAXFN           512     /* max. Anzahl Quellen */
#define MAXLINE         128     /* max. Laenge einer Zeile Quelle */
#define PLENGTH         65      /* Default Anzahl Zeilen/Seite im Listing */
#define SYMSIZE         8       /* max. Laenge Symbole */
#define INCNEST         5       /* INCLUDE Verschachtelungstiefe */
#define IFNEST          5       /* IF..    Verschachtelungstiefe */
#define HASHSIZE        500     /* Anzahl Eintraege in Symbol-Hash-Array */
#define OPCARRAY        256     /* Groesse des Arrays fuer generierte Ops */
#define SYMINC          100     /* Anfangsgroesse des sortierten Symbol-Array */

/*
*      Struktur der OP-Code Tabelle
*/
struct opc {
       char *op_name;          /* Op-Code Name */
       int (*op_fun) ();       /* Pointer auf Funktion zur Codeerzeugung */
       int  op_c1;             /* erster Basis-OP-Code */
       int  op_c2;             /* zweiter Basis-OP-Code */
};

/*
*      Struktur der Operanden Tabelle
*/
struct ope {
       char *ope_name;         /* Operand Name */
       int ope_sym;            /* Symbolischer Wert des Operanden */
};

/*
*      Struktur der Symbol-Tabelleneintraege
*/
struct sym {
       char *sym_name;         /* Symbol Name */
       int  sym_wert;          /* Symbol Wert */
       struct sym *sym_next;   /* naechster Eintrag */
};

/*
*      Struktur fuer verschachtelte INCLUDE's
*/
struct inc {
       unsigned inc_line;      /* Zeilenzaehler fuers Listing */
       char *inc_fn;           /* Filename der Datei mit INCLUDE */
       FILE *inc_fp;           /* Filepointer der Datei mit INCLUDE */
};

/*
*      Definition der Symbole fuer die Operanden.
*      Die Definitionen fuer Register A, B, C, D, H, L
*      und (HL) entsprechen den Bits in den Opcodes
*      und duerfen auf keinen Fall geaendert werden!
*/
#define REGB            0       /* Register B */
#define REGC            1       /* Register C */
#define REGD            2       /* Register D */
#define REGE            3       /* Register E */
#define REGH            4       /* Register H */
#define REGL            5       /* Register L */
#define REGIHL          6       /* Register indirekt HL */
#define REGA            7       /* Register A */
#define REGI            8       /* Register I */
#define REGR            9       /* Register R */
#define REGAF           10      /* Registerpaar AF */
#define REGBC           11      /* Registerpaar BC */
#define REGDE           12      /* Registerpaar DE */
#define REGHL           13      /* Registerpaar HL */
#define REGIX           14      /* Register IX */
#define REGIY           15      /* Register IY */
#define REGSP           16      /* Register SP */
#define REGIBC          17      /* Register indirekt BC */
#define REGIDE          18      /* Register indirekt DE */
#define REGIIX          19      /* Register indirekt IX */
#define REGIIY          20      /* Register indirekt IY */
#define REGISP          21      /* Register indirekt SP */
#define FLGNC           30      /* Flag no carry */
#define FLGNZ           31      /* Flag not zerro */
#define FLGZ            32      /* Flag zerro */
#define FLGM            33      /* Flag minus */
#define FLGP            34      /* Flag plus */
#define FLGPE           35      /* Flag parrity even */
#define FLGPO           36      /* Flag parrity odd */
#define NOOPERA         98      /* kein Operand vorhanden */
#define NOREG           99      /* Operand ist kein Register */

/*
*      Definition der Assembler-Fehler-Nummern, die
*      zu Fehlermeldungen im Listfile fuehren
*      (siehe asmerr)
*/
#define E_ILLOPC        0       /* illegaler Opcode */
#define E_ILLOPE        1       /* illegaler Operand */
#define E_MISOPE        2       /* fehlender Operand */
#define E_MULSYM        3       /* mehrfach definiertes Symbol */
#define E_UNDSYM        4       /* undefiniertes Symbol */
#define E_VALOUT        5       /* Wert ausserhalb Bereich */
#define E_MISPAR        6       /* Klammer fehlt */
#define E_MISHYP        7       /* String Separator fehlt */
#define E_MEMOVR        8       /* memory override (ORG) */
#define E_MISIFF        9       /* fehlendes IF bei ELSE oder ENDIF */
#define E_IFNEST        10      /* IF zu tief verschachtelt */
#define E_MISEIF        11      /* fehlendes ENDIF */
#define E_INCNEST       12      /* INCLUDE zu tief verschachtelt */

/*
*      Definition der Fehlernummern, die zum sofortigen
*      Abbruch des Programms fuehren (siehe fatal)
*/
#define F_OUTMEM        0       /* out of memory */
#define F_USAGE         1       /* usage: .... */
#define F_HALT          2       /* Assembly halted */
#define F_FOPEN         3       /* can't open file */
#define F_INTERN        4       /* internal error */