1 /*------------------------------------------------------------------*/ 2 /* */ 3 /* MC68000 Cross Assembler */ 4 /* */ 5 /* Copyright 1985 by Brian R. Anderson */ 6 /* */ 7 /* #define statements - May 23, 1992 */ 8 /* */ 9 /* This program may be copied for personal, non-commercial use */ 10 /* only, provided that the above copyright notice is included */ 11 /* on all copies of the source code. Copying for any other use */ 12 /* without the consent of the author is prohibited. */ 13 /* */ 14 /*------------------------------------------------------------------*/ 15 /* */ 16 /* Originally published (in Modula-2) in */ 17 /* Dr. Dobb's Journal, April, May, and June 1986. */ 18 /* */ 19 /* AmigaDOS conversion copyright 1991 by Charlie Gibbs. */ 20 /* */ 21 /*------------------------------------------------------------------*/ 22 23 #include <stdio.h> 24 #include <ctype.h> 25 #include <fcntl.h> 26 #include <stdlib.h> /* now for all compilers - v.2.71.F3d, Kevin Kofler */ 27 #include <string.h> /* now for all compilers - v.2.71.F3d, Kevin Kofler */ 28 #include "protos.h" 29 30 /* Now including most header files in all compilers - v.2.71.F3d, Kevin Kofler */ 31 #ifdef __SASC 32 /* #include <stdlib.h> */ /* now for all compilers - v.2.71.F3d, Kevin Kofler */ 33 #include <stddef.h> 34 /* #include <string.h> 35 #include <fcntl.h> */ 36 #else 37 /* extern char *malloc(); */ /* (2.71.F3d) should be declared in stdlib.h */ 38 /* (2.71.F3w) now using unistd.h everywhere except on Visual C++ */ 39 #ifdef _MSC_VER 40 /* (2.71.F3u) open, creat should be declared in fcntl.h and cause a conflict 41 with GCC 3.4 */ 42 extern int /*open(), creat(),*/ read(), write(), close(), unlink(); 43 extern long lseek(); 44 #else 45 #include <unistd.h> 46 #endif 47 /* Win32 port in 2.71.F3a by Kevin Kofler for the TIGCC Team 48 Declare _fmode when compiling with Microsoft Visual C++. 49 Thanks to Paul Froissart. 50 I have also added a check for Cygwin, since it needs that 51 declaration too. */ 52 /* #if defined(_MSC_VER) || defined(__CYGWIN__) */ 53 #ifdef __CYGWIN__ 54 extern int _fmode; 55 #endif /* (2.71.F3d) should be declared in fcntl.h on MSDOS or WIN32 */ 56 /* Another addition by Paul Froissart for Visual C++ support: */ 57 /* #ifdef _MSC_VER 58 extern void exit(); 59 extern int free(); 60 extern int abs(); 61 #endif */ /* should be declared in the appropriate header files */ 62 #endif 63 64 #ifdef ST_VERSION 65 #undef fflush /* This is for the ST version. */ 66 int fflush (FILE *); 67 #endif /* ST_VERSION */ /* That should always have been a comment! 68 - Kevin Kofler, v.2.71.F3e */ 69 70 /* Win32 port in 2.71.F3a by Kevin Kofler for the TIGCC Team 71 modifications marked with (TIGCC) */ 72 73 #if (defined(__CYGWIN__)||defined(__WIN32__)||defined(_WIN32))&&!defined(WIN32) /* (TIGCC) */ 74 /* (TIGCC) Define WIN32 if some other WIN32 identifier, but not WIN32 is detected. */ 75 #define WIN32 76 #endif 77 78 #ifdef WIN32 79 #define MSDOS /* (TIGCC) Use the same code for Win32 as for DOS. */ 80 #endif 81 82 #ifdef _MSC_VER 83 #define strcasecmp(str1,str2) stricmp(str1,str2) 84 /* (TIGCC) define strcasecmp when compiling with Microsoft Visual C++ */ 85 /* extern int strcasecmp(); */ /* added in v.2.71.F3c (Paul Froissart again) */ 86 /* removed in v.2.71.F3d (Kevin Kofler). We are now including the correct 87 include files instead of using this dirty extern statement. Moreover, it 88 should have been extern int stricmp(); Sorry, I had not applied Paul 89 Froissart's defines exactly verbatim and I have made a mistake.*/ 90 #ifndef _CHAR_UNSIGNED /* /J is the equivalent of -funsigned-char */ 91 #error You must use the /J switch when compiling with Visual C++. 92 #endif /* Sorrily, I cannot do the same check with GCC. */ 93 #endif /* Thanks to Paul Froissart */ 94 95 #ifndef TRUE 96 #define TRUE 1 97 #define FALSE 0 98 #endif 99 100 #define NOFD (int) -1 101 #define NOMODE (int) 0 102 103 /*#define NODEF 32767*/ /* High line number for undefined symbols */ 104 #define NODEF ((int)(((unsigned)-1)>>1)) /* Kevin Kofler, v.2.71.F3s */ 105 106 /* Assembler configuration parameters */ 107 #if 1 /* Same settings for all platforms -- Kevin Kofler, v.2.71.F3s */ 108 /*defined(WIN32)||defined(__linux__)*/ /* (TIGCC) no need to save memory under Win32 */ 109 /* no need to save memory under GNU/Linux either (Kevin Kofler, v.2.71.F3c) */ 110 #define MAXLINE 256 /* Longest source line 111 Increased by Paul Froissart */ 112 #define MAXFN 259 /* Maximum length of file name 113 Increased by Kevin Kofler */ 114 #define MAXSREC 16 /* Maximum S-record data length */ 115 #define MAXREF 4 /* Number of line numbers in reference entry */ 116 #define DEFHASH 4095 /* Default number of elements in hash table 117 Increased by Paul Froissart */ 118 #define DEFHEAP2 2048 /* Default size for secondary heap 119 Increased by Paul Froissart */ 120 #define INCSKSIZ 2048 /* Size of INCLUDE skip table */ 121 #define CHUNKSIZE 8192 /* Size of memory chunks allocated for tables */ 122 #define FWDSIZE 1024 /* Size of forward branch optimization log */ 123 #define BUFFSIZE 2048 /* File buffer size */ 124 #define ObjMAX 32 /* Max. hex object code digits in listing */ 125 #else /* (TIGCC) */ 126 #define MAXLINE 128 /* Longest source line */ 127 #define MAXFN 41 /* Maximum length of file name */ 128 #define MAXSREC 16 /* Maximum S-record data length */ 129 #define MAXREF 4 /* Number of line numbers in reference entry */ 130 #define DEFHASH 2047 /* Default number of elements in hash table */ 131 #define DEFHEAP2 1024 /* Default size for secondary heap */ 132 #define INCSKSIZ 2048 /* Size of INCLUDE skip table */ 133 #ifdef MSDOS 134 #define CHUNKSIZE 2048 /* Memory chunks for Itty Bitty Memories */ 135 #else 136 #define CHUNKSIZE 8192 /* Size of memory chunks allocated for tables */ 137 #endif 138 #define FWDSIZE 1024 /* Size of forward branch optimization log */ 139 #define BUFFSIZE 2048 /* File buffer size */ 140 #define ObjMAX 32 /* Max. hex object code digits in listing */ 141 #endif /* (TIGCC) */ 142 143 /* Hunk number definitions */ 144 #define HunkNone 0 /* Not in a hunk */ 145 #define HunkUnit 999 146 #define HunkName 1000 147 #define HunkCode 1001 148 #define HunkData 1002 149 #define HunkBSS 1003 150 #define HunkR32 1004 151 #define HunkR16 1005 152 #define HunkR8 1006 153 #define HunkExt 1007 154 #define HunkSym 1008 155 #define HunkDbg 1009 156 #define HunkEnd 1010 157 /* The following hunk types are TIGCC extensions and should ONLY be used 158 with the -a switch! -- Kevin Kofler, v.2.71.F3l */ 159 #define HunkA32 0x716CC0L 160 #define HunkA16 0x716CC1L 161 #define HunkA8 0x716CC2L 162 163 #define MEMF_FAST 0x80000000L /* Hunk must load in FAST memory. */ 164 #define MEMF_CHIP 0x40000000L /* Hunk must load in CHIP memory. */ 165 166 /* Hunk numbers denoting special symbol attributes */ 167 #define ABSHUNK 32767 /* Absolute */ 168 169 /* Addressing mode flag values */ 170 #define DReg 1 /* Data Register */ 171 #define ARDir 2 /* Address Register Direct */ 172 #define ARInd 3 /* Address Register Indirect */ 173 #define ARPost 4 /* Address Register with Post-Increment */ 174 #define ARPre 5 /* Address Register with Pre-Decrement */ 175 #define ARDisp 6 /* Address Register with Displacement */ 176 #define ARDisX 7 /* Address Register with Disp. & Index */ 177 #define AbsW 8 /* Absolute Short (16-bit Address) */ 178 #define AbsL 9 /* Absolute Long (32-bit Address) */ 179 #define PCDisp 10 /* Program Counter Relative, with Displacement */ 180 #define PCDisX 11 /* Program Counter Relative, with Disp. & Index */ 181 #define Imm 12 /* Immediate */ 182 #define MultiM 13 /* Multiple Register Move */ 183 #define SR 14 /* Status Register */ 184 #define CCR 15 /* Condition Code Register */ 185 #define USP 16 /* User's Stack Pointer */ 186 #define Null 0 /* Error Condition, or Operand missing */ 187 188 #define X0 0 /* Register types */ 189 #define Dreg 1 190 #define Areg 2 191 192 #define S0 0 /* Size types */ 193 #define Byte 1 194 #define Word 2 195 #define Long 4 196 197 #define CMPM 0xB108 198 #define JMP 0x4EC0 199 #define JSR 0x4E80 200 #define LEA 0x41C0 201 #define LINK 0x4E50 202 #define NOP 0x4E71 203 #define PEA 0x4840 204 #define STOP 0x4E72 205 #define SWAP 0x4840 206 #define UNLK 0x4E58 207 208 #define None 0 /* Assembler directives */ 209 #define Org 1 210 #define DC 2 211 #define DS 3 212 #define Even 4 213 #define End 5 214 #define Cnop 6 215 #define Section 7 216 #define CSeg 8 217 #define DSeg 9 218 #define BSS 10 219 #define Idnt 11 220 #define DCB 12 221 #define Near 13 222 #define Far 14 223 #define BadMac 15 224 #define Incbin 16 225 #define SkipDir 17 /* Skippable INCLUDE directives start here. */ 226 #define Equ 17 227 #define Public 18 228 #define Xdef 19 229 #define Xref 20 230 #define Page 21 231 #define DoList 22 232 #define NoList 23 233 #define Space 24 234 #define Title 25 235 #define Include 26 236 #define Set 27 237 #define Macro 28 238 #define IfEQ 29 239 #define IfNE 30 240 #define IfGT 31 241 #define IfGE 32 242 #define IfLT 33 243 #define IfLE 34 244 #define IfC 35 245 #define IfNC 36 246 #define IfD 37 247 #define IfND 38 248 #define EndC 39 249 #define Equr 40 250 #define Reg 41 251 #define MacCall 42 252 253 /* BITSETs of the modes MISSING from effective address modes */ 254 #define ea 0x0000 /* Effective addressing - all modes */ 255 #define dea 0x0002 /* Data effective addressing */ 256 #define mea 0x0003 /* Memory effective addressing */ 257 #define cea 0x081B /* Control effective addressing */ 258 #define aea 0x0E00 /* Alterable effective addressing */ 259 #define xxx 0xE000 /* extra modes: CCR/SR/USP */ 260 261 #define IN & /* Simulated BITSET test */ 262 263 /* AdrModeA bit definitions */ 264 #define RegMem3 0x0001 /* 0 = register, 1 = memory */ 265 #define Ry02 0x0002 /* Register Rx - bits 0-2 */ 266 #define Rx911 0x0004 /* Register Ry - bits 9-11 */ 267 #define Data911 0x0008 /* Immediate data - bits 9-11 */ 268 #define CntR911 0x0010 /* Count register or immediate data */ 269 #define Brnch 0x0020 /* Relative branch */ 270 #define DecBr 0x0040 /* Decrement and branch */ 271 #define Data03 0x0080 /* TRAP vector in 0-3 */ 272 #define Data07 0x0100 /* Data in 0-7 (MOVEQ) */ 273 #define OpM68D 0x0200 /* Data register in 6-8 */ 274 #define OpM68A 0x0400 /* Address register in 6-8 (ADDA/CMPA/SUBA) */ 275 #define OpM68C 0x0800 /* CMP (Compare) */ 276 #define OpM68X 0x1000 /* EOR (Exclusive or) */ 277 #define OpM68S 0x2000 /* EXT (Sign extension) */ 278 #define OpM68R 0x4000 /* MOVEP (Register/memory) */ 279 #define OpM37 0x8000 /* EXG (Exchange registers) */ 280 #define TwoOpsA 0xDF4D /* Two operands are required. */ 281 282 /* AdrModeB bit definitions */ 283 #define Bit811 0x0001 /* Bit operations - bits 8-11 as switch */ 284 #define Size67 0x0002 /* 00 = byte, 01 = word, 10 = long */ 285 #define Size6 0x0004 /* 0 = word, 1 = long */ 286 #define Sz1213A 0x0008 /* 01 = byte, 11 = word, 10 = long */ 287 #define Sz1213 0x0010 /* 11 = word, 10 = long */ 288 #define Exten 0x0020 /* Opcode extension is required. */ 289 #define EA05a 0x0040 /* Effective address - all */ 290 #define EA05b 0x0080 /* All except ARDir */ 291 #define EA05c 0x0100 /* All except ARDIR and Imm */ 292 #define EA05d 0x0200 /* All except PCDisp, PCDisx, and Imm */ 293 #define EA05e 0x0400 /* All except ARDir, PCDisp, PCDisx, and Imm */ 294 #define EA05f 0x0800 /* All except Dreg, ARDir, ARPost, ARPre, Imm */ 295 #define EA05x 0x1000 /* Dual mode - AND/OR */ 296 #define EA05y 0x2000 /* Dual mode - ADD/SUB */ 297 #define EA05z 0x4000 /* Dual mode - MOVEM */ 298 #define EA611 0x8000 /* Eff. Adr. in 6-11 (used only by MOVE) */ 299 #define TwoOpsB 0xF3DD /* Two operands are required. */ 300 #define ImmMode 0x0422 /* Immediate instructions */ 301 #define SrcPC 0xF8C0 /* Source operand may be PCDisp. */ 302 303 #define Dummy 0 /* Error codes */ 304 #define AlignErr 1 305 #define NoCode 2 306 #define SymDup 3 307 #define Undef 4 308 #define ModeErr 5 309 #define OperErr 6 310 #define BraErr 7 311 #define AddrErr 8 312 #define SizeErr 9 313 #define EndErr 10 314 #define AbsReq 11 315 #define RelErr 12 316 #define NoIncl 13 317 #define FwdRef 14 318 #define NotSFmt 15 319 #define NeedLab 16 320 #define Phase 17 321 #define NoENDM 18 322 #define NoENDC 19 323 #define ManyENDC 20 324 #define DCOflo 21 325 #define ManySect 22 326 #define DupMac 23 327 #define MultLab 24 328 #define NoStrEnd 25 329 #define BccSDsp0 26 330 331 #define ERRMAX 10 /* Size of error message table */ 332 333 /* defines added by Paul Froissart in v.2.71.F3c: */ 334 #define OPTIM_MOVEM 0x0001 /* optimization MOVEM with 1 register -> MOVE on/off */ 335 #define OPTIM_LEA 0x0002 /* optimization LEA with 1 register and +/- 1 to 8 336 -> ADDQ/SUBQ on/off */ 337 #define OPTIM_ADDA 0x0004 /* optimization ADDA/SUBA (or ADD/SUB to An) with 338 8 to 32767 -> LEA on/off */ 339 340 /* define added by Kevin Kofler in v.2.71.F3t: */ 341 #ifdef NO_UNOPTIMIZABLE_RELOCS 342 #define UNOPTIMIZABLE 0 343 #else 344 #define UNOPTIMIZABLE 0x80000000 345 #endif 346 347