1 2 /* Speed and space hacks for BCC */ 3 #ifdef __AS386_16__ 4 #define LOW_BYTE 0 /* must be changed for big-endian */ 5 #else 6 7 #define S_ALIGNMENT sizeof(long) 8 #endif 9 10 /* const.h - constants for assembler */ 11 12 /* major switches */ 13 14 /* #define MC6809 */ /* generate 6809 code */ 15 #ifndef MC6809 16 #define I80386 /* generate 80386 code */ 17 #endif 18 #define MNSIZE /* allow byte size in mnemonic, e.g. "movb" */ 19 #undef SOS_EDOS /* source OS is EDOS */ 20 21 /* defaults */ 22 23 #define DIRCHAR '/' /* character separating filename from dir */ 24 #define INBUFSIZE 8192 25 #define SOS_EOLSTR "\012" 26 27 /* defaults modified by switches */ 28 29 #ifdef SOS_EDOS 30 # undef INBUFSIZE 31 # define INBUFSIZE 512 32 # undef SOS_EOLSTR 33 # define SOS_EOLSTR "\015\012" 34 # define STAKSIZ 256 /* table grows up to stack less this */ 35 #endif 36 37 #ifdef __AS386_16__ 38 # undef INBUFSIZE 39 # define INBUFSIZE 512 40 # define STAKSIZ 512 /* table grows up to stack less this */ 41 #endif 42 43 /* booleans */ 44 45 #define FALSE 0 46 #define TRUE 1 47 48 /* ASCII constants */ 49 50 #define ETB 23 51 52 /* C tricks */ 53 54 #define EXTERN extern 55 #define FORWARD static 56 #define PRIVATE static 57 #define PUBLIC 58 #define NUL_PTR ((void*)0) 59 60 /* O/S constants */ 61 62 #define CREAT_PERMS 0666 63 #define EOF (-1) 64 #define STDIN 0 65 #define STDOUT 1 66 67 enum 68 { 69 /* Register codes (internal to assembler). */ 70 #ifdef I80386 71 72 /* Index regs must be first. */ 73 BPREG, 74 BXREG, 75 DIREG, 76 SIREG, 77 #define MAX16BITINDREG SIREG 78 79 EAXREG, 80 EBPREG, 81 EBXREG, 82 ECXREG, 83 EDIREG, 84 EDXREG, 85 ESIREG, 86 ESPREG, 87 #define MAXINDREG ESPREG 88 89 AXREG, 90 CXREG, 91 DXREG, 92 SPREG, 93 94 AHREG, 95 ALREG, 96 BHREG, 97 BLREG, 98 CHREG, 99 CLREG, 100 DHREG, 101 DLREG, 102 103 CSREG, 104 DSREG, 105 ESREG, 106 FSREG, 107 GSREG, 108 SSREG, 109 110 CR0REG, 111 CR2REG, 112 CR3REG, 113 DR0REG, 114 DR1REG, 115 DR2REG, 116 DR3REG, 117 DR6REG, 118 DR7REG, 119 TR3REG, 120 TR4REG, 121 TR5REG, 122 TR6REG, 123 TR7REG, 124 125 ST0REG, 126 ST1REG, 127 ST2REG, 128 ST3REG, 129 ST4REG, 130 ST5REG, 131 ST6REG, 132 ST7REG, 133 #endif /* I80386 */ 134 135 #ifdef MC6809 136 137 /* Index regs must be first, then PC. */ 138 SREG, 139 UREG, 140 XREG, 141 YREG, 142 #define MAXINDREG YREG 143 144 PCREG, 145 AREG, 146 BREG, 147 CCREG, 148 DPREG, 149 DREG, 150 #endif /* MC6809 */ 151 152 NOREG 153 }; 154 155 #ifdef I80386 156 enum 157 { 158 /* Type and size keywords. */ 159 BYTEOP, 160 DWORDOP, 161 FWORDOP, 162 FAROP, 163 PTROP, 164 PWORDOP, 165 QWORDOP, 166 TBYTEOP, 167 WORDOP 168 }; 169 #endif /* I80386 */ 170 171 /* special chars */ 172 173 #define EOL 0 174 #define MACROCHAR '?' 175 176 enum 177 { 178 /* Symbol codes. */ 179 180 /* The first 2 must be from chars in identifiers. */ 181 IDENT, 182 INTCONST, 183 184 /* The next few are best for other possibly-multi-char tokens. */ 185 ADDOP, /* also ++ */ 186 BINCONST, 187 CHARCONST, 188 GREATERTHAN, /* also >> and context-sensitive */ 189 HEXCONST, 190 LESSTHAN, /* also << and context-sensitive */ 191 SUBOP, /* also -- */ 192 WHITESPACE, 193 194 ANDOP, 195 COMMA, 196 EOLSYM, 197 EQOP, 198 IMMEDIATE, 199 INDIRECT, 200 LBRACKET, 201 LPAREN, 202 MACROARG, 203 NOTOP, 204 OROP, 205 OTHERSYM, 206 POSTINCOP, 207 PREDECOP, 208 RBRACKET, 209 RPAREN, 210 SLASH, /* context-sensitive */ 211 SLOP, 212 SROP, 213 STAR, /* context-sensitive */ 214 STRINGCONST, 215 COLON 216 }; 217 218 /* symbol table entry */ 219 220 /* type entry contains following flags */ 221 #define ENTBIT (1<<0) /* entry point (= OBJ_N_MASK) */ 222 #define COMMBIT (1<<1) /* common */ 223 #define LABIT (1<<2) /* label (a PC location or defined by EQU) */ 224 #define MNREGBIT (1<<3) /* mnemonic for op or pseudo-op, or register */ 225 #define MACBIT (1<<4) /* macro */ 226 #define REDBIT (1<<5) /* redefined (if with LABIT or VARBIT), to do 227 * with SA_MASK (if with COMMBIT), otherwise 228 * means globl */ 229 #define VARBIT (1<<6) /* variable (i.e. something defined by SET) */ 230 #define EXPBIT (1<<7) /* exported (= OBJ_E_MASK) */ 231 232 /* data entry contains following flags, valid */ 233 /* for expressions as well as syms */ 234 #define PAGE1 (1<<0) /* page 1 machine op = MNREGBIT | PAGE1 */ 235 #define PAGE2 (1<<1) /* page 2 machine op = MNREGBIT | PAGE2 */ 236 #define REGBIT (1<<2) /* register = MNREGBIT | REGBIT */ 237 #define SIZEBIT (1<<3) /* sizing mnemonic = MNREGBIT | SIZEBIT */ 238 #define SEGM 0x0F /* 1st 4 bits reused for segment if !MNREGBIT */ 239 #define RELBIT (1<<4) /* relative (= OBJ_A_MASK) */ 240 #define FORBIT (1<<5) /* forward referenced */ 241 #define IMPBIT (1<<6) /* imported (= OBJ_I_MASK) */ 242 #define UNDBIT (1<<7) /* undefined */ 243 244 /* object code format (Introl) */ 245 246 #define OBJ_SEGSZ_TWO 0x02 /* size 2 code for segment size descriptor */ 247 248 #define OBJ_MAX_ABS_LEN 64 /* max length of chunk of absolute code */ 249 250 #define OBJ_ABS 0x40 /* absolute code command */ 251 #define OBJ_OFFSET_REL 0x80 /* offset relocation command */ 252 #define OBJ_SET_SEG 0x20 /* set segment command */ 253 #define OBJ_SKIP_1 0x11 /* skip with 1 byte count */ 254 #define OBJ_SKIP_2 0x12 /* skip with 2 byte count */ 255 #define OBJ_SKIP_4 0x13 /* skip with 4 byte count */ 256 #define OBJ_SYMBOL_REL 0xC0 /* symbol relocation command */ 257 258 #define OBJ_A_MASK 0x10 /* absolute bit(symbols) */ 259 #if OBJ_A_MASK - RELBIT /* must match internal format (~byte 1 -> 0) */ 260 oops - RELBIT misplaced 261 #endif 262 #define OBJ_E_MASK 0x80 /* exported bit (symbols) */ 263 #if OBJ_E_MASK - EXPBIT /* must match internal format (byte 0 -> 0) */ 264 oops - EXPBIT misplaced 265 #endif 266 #define OBJ_I_MASK 0x40 /* imported bit (symbols) */ 267 #if OBJ_I_MASK - IMPBIT /* must match internal format (byte 1 -> 0) */ 268 oops - IMPBIT misplaced 269 #endif 270 #define OBJ_N_MASK 0x01 /* entry bit (symbols) */ 271 #if OBJ_N_MASK - ENTBIT /* must match internal format (byte 0 -> 1) */ 272 oops - ENTBIT misplaced 273 #endif 274 #define OBJ_SA_MASK 0x20 /* size allocation bit (symbols) */ 275 #define OBJ_SZ_ONE 0x40 /* size one code for symbol value */ 276 #define OBJ_SZ_TWO 0x80 /* size two code for symbol value */ 277 #define OBJ_SZ_FOUR 0xC0 /* size four code for symbol value */ 278 279 #define OBJ_R_MASK 0x20 /* PC-rel bit (off & sym reloc commands) */ 280 #define OBJ_SEGM_MASK 0x0F /* segment mask (symbols, off reloc command) */ 281 282 #define OBJ_OF_MASK 0x03 /* offset size code for symbol reloc */ 283 #define OBJ_S_MASK 0x04 /* symbol number size code for symbol reloc */ 284 285 #define SYMLIS_NAMELEN 26 286 #define SYMLIS_LEN (sizeof (struct sym_listing_s)) 287 288 #define FILNAMLEN 64 /* max length of a file name */ 289 #define LINLEN 256 /* max length of input line */ 290 #define LINUM_LEN 5 /* length of formatted line number */ 291 292 #define SPTSIZ 1024 /* number of symbol ptrs */ 293 /* pseudo-op flags */ 294 #define POPHI 1 /* set to print hi byte of adr */ 295 #define POPLO 2 /* to print lo byte of ADR */ 296 #define POPLC 4 /* to print LC */ 297 #define POPLONG 8 /* to print high word of ADR */ 298 #define MAXBLOCK 8 /* max nesting level of BLOCK stack */ 299 #define MAXGET 8 /* max nesting level of GET stack */ 300 #define MAXIF 8 /* max nesting level of IF stack */ 301 #define MACPSIZ (128 / sizeof (struct schain_s)) 302 /* size of macro param buffer */ 303 #define MAXMAC 8 /* max nesting level of macro stack */ 304 #define NLOC 16 /* number of location counters */ 305 #ifdef I80386 306 #define NO_SIB 0340 /* illegal sib (3 with 4) to mean no sib */ 307 #endif 308 309 /* special segments */ 310 311 #define BSSLOC 3 312 #define DATALOC 3 313 #define DPLOC 2 314 #define STRLOC 1 315 #define TEXTLOC 0 316 317 #include "errors.h" 318 319