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