xa65/xa/src/xah.h

281 lines
8.6 KiB
C

/* xa65 - 65xx/65816 cross-assembler and utility suite
*
* Copyright (C) 1989-1997 André Fachat (a.fachat@physik.tu-chemnitz.de)
* Maintained by Cameron Kaiser
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __XA65_XAH_H__
#define __XA65_XAH_H__
/*
* Note: the computations to get the number of bytes necessary to allocate are
* a historic remnant of the Atari ST (the original platform) not being able to efficiently allocate small chunks
* of memory so I had to allocate a large chunk myself and manage the tables myself.
* This has changed and some parts of xa65 are modified to just do a malloc() now.
* These fixed numbers should actually go away. AF 20110623
*/
#define ANZLAB 5000 /* multiplied by sizeof(Labtab) -> Byte */
#define LABMEM 40000L
#define MAXLAB 32
#define MAXBLK 16
#define MAXFILE 7
#define MAXLINE 2048
#define MAXPP 40000L
#define ANZDEF 2340 /* multiplied by sizeof(List) -> Byte, ANZDEF * 20 < 32768 */
#define TMPMEM 2000000L /* temporary memory buffer from Pass1 to Pass 2 (includes all source, thus enlarged) */
typedef enum {
STD = 0,
CHEAP = 1,
UNNAMED = 2,
UNNAMED_DEF = 3
} xalabel_t;
typedef struct LabOcc {
struct LabOcc *next;
int line;
char *fname;
} LabOcc;
/**
* struct that defines a label, after it has been parsed
*/
typedef struct {
int blk;
int origblk; // only for fl=3
int val;
int len;
int fl; /* 0 = label value not valid/known,
* 1 = label value known
* 2 = label value not known, external global label (imported on link)
* 3 = label value not known, temporarily on external global label list (for -U)
*/
int afl; /* 0 = no address (no relocation), 1 = address label */
int nextindex;
xalabel_t is_cll; /* 0 is normal label, 1 is cheap local label (used for listing) */
char *n;
struct LabOcc *occlist;
// within a block, make a linked list for the unnamed label counting
// use indexes, as the label table can be re-alloced (so pointers change)
// -1 is the "undef'd" end of list
int blknext;
int blkprev;
} Labtab;
typedef struct {
char *search;
int s_len;
char *replace;
int p_anz;
int nextindex;
} List;
#define MEMLEN (4 + TMPMEM + MAXPP + LABMEM + \
(long)(sizeof (Labtab) * ANZLAB) + \
(long)(sizeof (List) * ANZDEF))
#define DIRCHAR '/'
#define DIRCSTRING "/"
/* for Atari:
#define DIRCHAR '\\'
#define DIRCSTRING "\\"
*/
#define BUFSIZE 4096 /* File-Puffegroesse (wg Festplatte) */
#define E_OK 0 /* No error */
#define E_SYNTAX -1 /* Syntax error */
#define E_LABDEF -2 /* Label already defined (duplicate label definition) */
#define E_NODEF -3 /* Label not defined */
#define E_LABFULL -4 /* Label table full */
#define E_LABEXP -5 /* Label expected but not found */
#define E_NOMEM -6 /* out of memory */
#define E_ILLCODE -7 /* Illegal Opcode */
#define E_ADRESS -8 /* Illegal Addressing mode */
#define E_RANGE -9 /* Branch out of range */
#define E_OVERFLOW -10 /* overflow */
#define E_DIV -11 /* Division by zero */
#define E_PSOEXP -12 /* Pseudo-Opcode expected but not found */
#define E_BLKOVR -13 /* Block-Stack overflow */
#define E_FNF -14 /* File not found (pp) */
#define E_EOF -15 /* End of File */
#define E_BLOCK -16 /* Block inkonsistent */
#define E_NOBLK -17
#define E_NOKEY -18
#define E_NOLINE -19
#define E_OKDEF -20 /* okdef */
#define E_DSB -21
#define E_NEWLINE -22
#define E_NEWFILE -23
#define E_CMOS -24
#define E_ANZPAR -25
#define E_ILLPOINTER -26 /* illegal pointer arithmetic! */
#define E_ILLSEGMENT -27 /* illegal pointer arithmetic! */
#define E_OPTLEN -28 /* file header option too long */
#define E_ROMOPT -29 /* header option not directly after
* file start in romable mode
*/
#define E_ILLALIGN -30 /* illegal align value */
#define E_65816 -31
#define E_ORECMAC -32 /* exceeded recursion limit for label eval */
#define E_OPENPP -33 /* open preprocessor directive */
#define E_OUTOFDATA -34 /* out of data */
#define E_ILLQUANT -35 /* generic illegal quantity error */
#define E_BIN -36 /* okdef */
#define E_UERROR -37 /* #error */
#define E_AERROR -38 /* .assert failed */
#define E_NEGDSBLEN -39 /* .dsb has negative length */
/* errors thru 64 are placeholders available for use */
#define W_ADRRELOC -65 /* word relocation in byte value */
#define W_BYTRELOC -66 /* byte relocation in word value */
#define E_WPOINTER -67 /* illegal pointer arithmetic! */
#define W_ADDRACC -68 /* addr access to low or high byte pointer */
#define W_HIGHACC -69 /* high byte access to low byte pointer */
#define W_LOWACC -70 /* low byte access to high byte pointer */
#define W_FORLAB -71 /* no zp-optimization for a forward label */
#define W_OPENPP -72 /* warning about open preprocessor directive */
#define W_OVER64K -73 /* included binary over 64K in 6502 mode */
#define W_OVER16M -74 /* included binary over 16M in 65816 mode */
#define W_SUBTRACT -75 /* subtract a segment pointer from a constant - not supported in -R mode */
/* warnings 75-77 are placeholders available for use */
/* Meta-values for the token list. Note must not overlap with the
* K* definitions in xat.c, which have outgrown the positive numbers
* and are now growing up from -128 ... */
#define T_VALUE -1 /* following is a 24 bit value in the token list */
#define T_LABEL -2 /* referring to a label, following the token is the 16bit label number */
#define T_OP -3 /* label oriented operation; following is the label number (16bit), plus the operation char (e.g. '+') */
#define T_END -4 /* end of line marker */
#define T_LINE -5 /* new line indicator; following is the 16 bit line number */
#define T_FILE -6 /* new file indicator; following is the 16 bit line number, then the file name (zero-term) */
#define T_POINTER -7 /* ??? */
#define T_COMMENT -8 /* unused */
#define T_DEFINE -9 /* define a label; inserted at conversion and discarded in pass1, only used in listing output */
#define T_LISTING -10 /* meta token, inserted after conversion before pass1, used after pass2 to create listing */
#define T_CAST -11 /* token inserted for a cast */
#define P_START 0 /* arithmetic operation priorities */
#define P_LOR 1 /* of any two operations, the one with */
#define P_LAND 2 /* the higher priority will be done first */
#define P_OR 3
#define P_XOR 4
#define P_AND 5
#define P_EQU 6
#define P_CMP 7
#define P_SHIFT 8
#define P_ADD 9
#define P_MULT 10
#define P_INV 11
#define A_ADR 0x8000 /* all are or'd with (afl = segment type)<<8 */
#define A_HIGH 0x4000 /* or'd with the low byte */
#define A_LOW 0x2000
#define A_MASK 0xe000 /* reloc type mask */
#define A_FMASK 0x0f00 /* segment type mask */
#define A_LONG 0xc000
/* o65 file format mode bits */
#define FM_OBJ 0x1000
#define FM_SIZE 0x2000
#define FM_RELOC 0x4000
#define FM_CPU 0x8000
#define FM_CPU2 0x00f0
#define FM_CPU2_6502 0x0000
#define FM_CPU2_65C02 0x0010
#define FM_CPU2_65SC02 0x0020
#define FM_CPU2_65CE02 0x0030
#define FM_CPU2_NMOS 0x0040
#define FM_CPU2_65816E 0x0050
/* segment definitions */
#define SEG_ABS 0
#define SEG_UNDEF 1
#define SEG_TEXT 2
#define SEG_DATA 3
#define SEG_BSS 4
#define SEG_ZERO 5
#define SEG_MAX 6
#define SEG_UNDEFZP 7 /* is being mapped to UNDEF */
typedef struct Fopt {
signed char *text; /* text after pass1 */
int len;
} Fopt;
typedef struct relocateInfo {
int next;
int adr;
int afl;
int lab;
} relocateInfo;
typedef struct File {
int fmode;
int slen;
int relmode;
int old_abspc;
int base[SEG_MAX];
int len[SEG_MAX];
struct {
// temporary memory between pass1 and pass2
signed char *tmp;
// write pointer
unsigned long tmpz;
// read pointer
unsigned long tmpe;
} mn;
struct {
int *ulist;
int un;
int um;
} ud;
struct {
relocateInfo *rlist;
int mlist;
int nlist;
int first;
} rt;
struct {
relocateInfo *rlist;
int mlist;
int nlist;
int first;
} rd;
struct {
Fopt *olist;
int mlist;
int nlist;
} fo;
struct {
int hashindex[256];
Labtab *lt;
int lti;
int ltm;
} la;
} File;
extern File *afile;
#endif /* __XA65_XAH_H__ */