123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /* Speed and space hacks for BCC */
- #ifdef __AS386_16__
- #define LOW_BYTE 0 /* must be changed for big-endian */
- #else
- #define S_ALIGNMENT sizeof(long)
- #endif
- /* const.h - constants for assembler */
- /* major switches */
- /* #define MC6809 */ /* generate 6809 code */
- #ifndef MC6809
- #define I80386 /* generate 80386 code */
- #endif
- #define MNSIZE /* allow byte size in mnemonic, e.g. "movb" */
- #undef SOS_EDOS /* source OS is EDOS */
- /* defaults */
- #define DIRCHAR '/' /* character separating filename from dir */
- #define INBUFSIZE 8192
- #define SOS_EOLSTR "\012"
- /* defaults modified by switches */
- #ifdef SOS_EDOS
- # undef INBUFSIZE
- # define INBUFSIZE 512
- # undef SOS_EOLSTR
- # define SOS_EOLSTR "\015\012"
- # define STAKSIZ 256 /* table grows up to stack less this */
- #endif
- #ifdef __AS386_16__
- # undef INBUFSIZE
- # define INBUFSIZE 512
- # define STAKSIZ 512 /* table grows up to stack less this */
- #endif
- /* booleans */
- #define FALSE 0
- #define TRUE 1
- /* ASCII constants */
- #define ETB 23
- /* C tricks */
- #define EXTERN extern
- #define FORWARD static
- #define PRIVATE static
- #define PUBLIC
- #define NUL_PTR ((void*)0)
- /* O/S constants */
- #define CREAT_PERMS 0666
- #define EOF (-1)
- #define STDIN 0
- #define STDOUT 1
- enum
- {
- /* Register codes (internal to assembler). */
- #ifdef I80386
- /* Index regs must be first. */
- BPREG,
- BXREG,
- DIREG,
- SIREG,
- #define MAX16BITINDREG SIREG
- EAXREG,
- EBPREG,
- EBXREG,
- ECXREG,
- EDIREG,
- EDXREG,
- ESIREG,
- ESPREG,
- #define MAXINDREG ESPREG
- AXREG,
- CXREG,
- DXREG,
- SPREG,
- AHREG,
- ALREG,
- BHREG,
- BLREG,
- CHREG,
- CLREG,
- DHREG,
- DLREG,
- CSREG,
- DSREG,
- ESREG,
- FSREG,
- GSREG,
- SSREG,
- CR0REG,
- CR2REG,
- CR3REG,
- DR0REG,
- DR1REG,
- DR2REG,
- DR3REG,
- DR6REG,
- DR7REG,
- TR3REG,
- TR4REG,
- TR5REG,
- TR6REG,
- TR7REG,
- ST0REG,
- ST1REG,
- ST2REG,
- ST3REG,
- ST4REG,
- ST5REG,
- ST6REG,
- ST7REG,
- #endif /* I80386 */
- #ifdef MC6809
- /* Index regs must be first, then PC. */
- SREG,
- UREG,
- XREG,
- YREG,
- #define MAXINDREG YREG
- PCREG,
- AREG,
- BREG,
- CCREG,
- DPREG,
- DREG,
- #endif /* MC6809 */
- NOREG
- };
- #ifdef I80386
- enum
- {
- /* Type and size keywords. */
- BYTEOP,
- DWORDOP,
- FWORDOP,
- FAROP,
- PTROP,
- PWORDOP,
- QWORDOP,
- TBYTEOP,
- WORDOP
- };
- #endif /* I80386 */
- /* special chars */
- #define EOL 0
- #define MACROCHAR '?'
- enum
- {
- /* Symbol codes. */
- /* The first 2 must be from chars in identifiers. */
- IDENT,
- INTCONST,
- /* The next few are best for other possibly-multi-char tokens. */
- ADDOP, /* also ++ */
- BINCONST,
- CHARCONST,
- GREATERTHAN, /* also >> and context-sensitive */
- HEXCONST,
- LESSTHAN, /* also << and context-sensitive */
- SUBOP, /* also -- */
- WHITESPACE,
- ANDOP,
- COMMA,
- EOLSYM,
- EQOP,
- IMMEDIATE,
- INDIRECT,
- LBRACKET,
- LPAREN,
- MACROARG,
- NOTOP,
- OROP,
- OTHERSYM,
- POSTINCOP,
- PREDECOP,
- RBRACKET,
- RPAREN,
- SLASH, /* context-sensitive */
- SLOP,
- SROP,
- STAR, /* context-sensitive */
- STRINGCONST,
- COLON
- };
- /* symbol table entry */
- /* type entry contains following flags */
- #define ENTBIT (1<<0) /* entry point (= OBJ_N_MASK) */
- #define COMMBIT (1<<1) /* common */
- #define LABIT (1<<2) /* label (a PC location or defined by EQU) */
- #define MNREGBIT (1<<3) /* mnemonic for op or pseudo-op, or register */
- #define MACBIT (1<<4) /* macro */
- #define REDBIT (1<<5) /* redefined (if with LABIT or VARBIT), to do
- * with SA_MASK (if with COMMBIT), otherwise
- * means globl */
- #define VARBIT (1<<6) /* variable (i.e. something defined by SET) */
- #define EXPBIT (1<<7) /* exported (= OBJ_E_MASK) */
- /* data entry contains following flags, valid */
- /* for expressions as well as syms */
- #define PAGE1 (1<<0) /* page 1 machine op = MNREGBIT | PAGE1 */
- #define PAGE2 (1<<1) /* page 2 machine op = MNREGBIT | PAGE2 */
- #define REGBIT (1<<2) /* register = MNREGBIT | REGBIT */
- #define SIZEBIT (1<<3) /* sizing mnemonic = MNREGBIT | SIZEBIT */
- #define SEGM 0x0F /* 1st 4 bits reused for segment if !MNREGBIT */
- #define RELBIT (1<<4) /* relative (= OBJ_A_MASK) */
- #define FORBIT (1<<5) /* forward referenced */
- #define IMPBIT (1<<6) /* imported (= OBJ_I_MASK) */
- #define UNDBIT (1<<7) /* undefined */
- /* object code format (Introl) */
- #define OBJ_SEGSZ_TWO 0x02 /* size 2 code for segment size descriptor */
- #define OBJ_MAX_ABS_LEN 64 /* max length of chunk of absolute code */
- #define OBJ_ABS 0x40 /* absolute code command */
- #define OBJ_OFFSET_REL 0x80 /* offset relocation command */
- #define OBJ_SET_SEG 0x20 /* set segment command */
- #define OBJ_SKIP_1 0x11 /* skip with 1 byte count */
- #define OBJ_SKIP_2 0x12 /* skip with 2 byte count */
- #define OBJ_SKIP_4 0x13 /* skip with 4 byte count */
- #define OBJ_SYMBOL_REL 0xC0 /* symbol relocation command */
- #define OBJ_A_MASK 0x10 /* absolute bit(symbols) */
- #if OBJ_A_MASK - RELBIT /* must match internal format (~byte 1 -> 0) */
- oops - RELBIT misplaced
- #endif
- #define OBJ_E_MASK 0x80 /* exported bit (symbols) */
- #if OBJ_E_MASK - EXPBIT /* must match internal format (byte 0 -> 0) */
- oops - EXPBIT misplaced
- #endif
- #define OBJ_I_MASK 0x40 /* imported bit (symbols) */
- #if OBJ_I_MASK - IMPBIT /* must match internal format (byte 1 -> 0) */
- oops - IMPBIT misplaced
- #endif
- #define OBJ_N_MASK 0x01 /* entry bit (symbols) */
- #if OBJ_N_MASK - ENTBIT /* must match internal format (byte 0 -> 1) */
- oops - ENTBIT misplaced
- #endif
- #define OBJ_SA_MASK 0x20 /* size allocation bit (symbols) */
- #define OBJ_SZ_ONE 0x40 /* size one code for symbol value */
- #define OBJ_SZ_TWO 0x80 /* size two code for symbol value */
- #define OBJ_SZ_FOUR 0xC0 /* size four code for symbol value */
- #define OBJ_R_MASK 0x20 /* PC-rel bit (off & sym reloc commands) */
- #define OBJ_SEGM_MASK 0x0F /* segment mask (symbols, off reloc command) */
- #define OBJ_OF_MASK 0x03 /* offset size code for symbol reloc */
- #define OBJ_S_MASK 0x04 /* symbol number size code for symbol reloc */
- #define SYMLIS_NAMELEN 26
- #define SYMLIS_LEN (sizeof (struct sym_listing_s))
- #define FILNAMLEN 64 /* max length of a file name */
- #define LINLEN 256 /* max length of input line */
- #define LINUM_LEN 5 /* length of formatted line number */
- #define SPTSIZ 1024 /* number of symbol ptrs */
- /* pseudo-op flags */
- #define POPHI 1 /* set to print hi byte of adr */
- #define POPLO 2 /* to print lo byte of ADR */
- #define POPLC 4 /* to print LC */
- #define POPLONG 8 /* to print high word of ADR */
- #define MAXBLOCK 8 /* max nesting level of BLOCK stack */
- #define MAXGET 8 /* max nesting level of GET stack */
- #define MAXIF 8 /* max nesting level of IF stack */
- #define MACPSIZ (128 / sizeof (struct schain_s))
- /* size of macro param buffer */
- #define MAXMAC 8 /* max nesting level of macro stack */
- #define NLOC 16 /* number of location counters */
- #ifdef I80386
- #define NO_SIB 0340 /* illegal sib (3 with 4) to mean no sib */
- #endif
- /* special segments */
- #define BSSLOC 3
- #define DATALOC 3
- #define DPLOC 2
- #define STRLOC 1
- #define TEXTLOC 0
- #include "errors.h"
|