/*------------------------------------------------------------------*/ /* */ /* MC68000 Cross Assembler */ /* */ /* Copyright (c) 1985 by Brian R. Anderson */ /* */ /* #define statements - January 6, 1989 */ /* */ /* This program may be copied for personal, non-commercial use */ /* only, provided that the above copyright notice is included */ /* on all copies of the source code. Copying for any other use */ /* without the consent of the author is prohibited. */ /* */ /*------------------------------------------------------------------*/ /* */ /* Originally published (in Modula-2) in */ /* Dr. Dobb's Journal, April, May, and June 1986. */ /* */ /* AmigaDOS conversion copyright 1989 by Charlie Gibbs. */ /* */ /*------------------------------------------------------------------*/ #ifdef AZTEC_C #include #endif extern char *malloc(); extern int open(), creat(), read(), write(), close(), unlink(); extern long lseek(); #define TRUE 1 #define FALSE 0 #define NODEF 32767 /* High line number for undefined symbols */ /* Assembler configuration parameters */ #define MAXLINE 128 /* Longest source line */ #define MAXFN 41 /* Maximum length of file name */ #define MAXSREC 16 /* Maximum S-record data length */ #define MAXREF 4 /* Number of line numbers in reference entry */ #define DEFHASH 2047 /* Default number of elements in hash table */ #define DEFHEAP2 1024 /* Default size for secondary heap */ #define INCSKSIZ 2048 /* Size of INCLUDE skip table */ #ifdef MSDOS #define CHUNKSIZE 2048 /* Memory chunks for Itty Bitty Memories */ #else #define CHUNKSIZE 8192 /* Size of memory chunks allocated for tables */ #endif #define BUFFSIZE 2048 /* File buffer size */ #define ObjMAX 32 /* Max. hex object code digits in listing */ /* Hunk number definitions */ #define HunkNone 0 /* Not in a hunk */ #define HunkUnit 999 #define HunkName 1000 #define HunkCode 1001 #define HunkData 1002 #define HunkBSS 1003 #define HunkR32 1004 #define HunkR16 1005 #define HunkR8 1006 #define HunkExt 1007 #define HunkSym 1008 #define HunkDbg 1009 #define HunkEnd 1010 #define MEMF_FAST 0x80000000L /* Hunk must load in FAST memory */ #define MEMF_CHIP 0x40000000L /* Hunk must load in CHIP memory */ /* Hunk numbers denoting special symbol attributes */ #define ABSHUNK 32767 /* Absolute */ /* Addressing mode flag values */ #define DReg 1 /* Data Register */ #define ARDir 2 /* Address Register Direct */ #define ARInd 3 /* Address Register Indirect */ #define ARPost 4 /* Address Register with Post-Increment */ #define ARPre 5 /* Address Register with Pre-Decrement */ #define ARDisp 6 /* Address Register with Displacement */ #define ARDisX 7 /* Address Register with Disp. & Index */ #define AbsW 8 /* Absolute Short (16-bit Address) */ #define AbsL 9 /* Absolute Long (32-bit Address) */ #define PCDisp 10 /* Program Counter Relative, with Displacement */ #define PCDisX 11 /* Program Counter Relative, with Disp. & Index */ #define Imm 12 /* Immediate */ #define MultiM 13 /* Multiple Register Move */ #define SR 14 /* Status Register */ #define CCR 15 /* Condition Code Register */ #define USP 16 /* User's Stack Pointer */ #define Null 0 /* Error Condition, or Operand missing */ #define X0 0 /* Register types */ #define Dreg 1 #define Areg 2 #define S0 0 /* Size types */ #define Byte 1 #define Word 2 #define S3 3 #define Long 4 #define CMPM 0xB108 #define JMP 0x4EC0 #define JSR 0x4E80 #define LEA 0x41C0 #define LINK 0x4E50 #define NOP 0x4E71 #define PEA 0x4840 #define STOP 0x4E72 #define SWAP 0x4840 #define UNLK 0x4E58 #define None 0 /* Assembler directives */ #define Org 1 #define DC 2 #define DS 3 #define Even 4 #define End 5 #define Cnop 6 #define Section 7 #define CSeg 8 #define DSeg 9 #define BSS 10 #define Idnt 11 #define DCB 12 #define Near 13 #define Far 14 #define BadMac 15 #define SkipDir 16 /* Skippable INCLUDE directives start here */ #define Equ 16 #define Public 17 #define Xdef 18 #define Xref 19 #define Page 20 #define DoList 21 #define NoList 22 #define Space 23 #define Title 24 #define Include 25 #define Set 26 #define Macro 27 #define IfEQ 28 #define IfNE 29 #define IfGT 30 #define IfGE 31 #define IfLT 32 #define IfLE 33 #define IfC 34 #define IfNC 35 #define IfD 36 #define IfND 37 #define EndC 38 #define Equr 39 #define Reg 40 #define MacCall 41 /* BITSETs of the modes MISSING from effective address modes */ #define ea 0x0000 /* Effective addressing - all modes */ #define dea 0x0002 /* Data effective addressing */ #define mea 0x0003 /* Memory effective addressing */ #define cea 0x081B /* Control effective addressing */ #define aea 0x0E00 /* Alterable effective addressing */ #define xxx 0xE000 /* extra modes: CCR/SR/USP */ #define IN & /* Simulated BITSET test */ /* AdrModeA bit definitions */ #define RegMem3 0x0001 /* 0 = register, 1 = memory */ #define Ry02 0x0002 /* Register Rx - bits 0-2 */ #define Rx911 0x0004 /* Register Ry - bits 9-11 */ #define Data911 0x0008 /* Immediate data - bits 9-11 */ #define CntR911 0x0010 /* Count register or immediate data */ #define Brnch 0x0020 /* Relative branch */ #define DecBr 0x0040 /* Decrement and branch */ #define Data03 0x0080 /* TRAP vector in 0-3 */ #define Data07 0x0100 /* Data in 0-7 (MOVEQ) */ #define OpM68D 0x0200 /* Data register in 6-8 */ #define OpM68A 0x0400 /* Address register in 6-8 (ADDA/CMPA/SUBA) */ #define OpM68C 0x0800 /* CMP (Compare) */ #define OpM68X 0x1000 /* EOR (Exclusive or) */ #define OpM68S 0x2000 /* EXT (Sign extension) */ #define OpM68R 0x4000 /* MOVEP (Register/memory) */ #define OpM37 0x8000 /* EXG (Exchange registers) */ #define TwoOpsA 0xDF4D /* Two operands are required */ /* AdrModeB bit definitions */ #define Bit811 0x0001 /* Bit operations - bits 8-11 as switch */ #define Size67 0x0002 /* 00 = byte, 01 = word, 10 = long */ #define Size6 0x0004 /* 0 = word, 1 = long */ #define Sz1213A 0x0008 /* 01 = byte, 11 = word, 10 = long */ #define Sz1213 0x0010 /* 11 = word, 10 = long */ #define Exten 0x0020 /* Opcode extension is required */ #define EA05a 0x0040 /* Effective address - all */ #define EA05b 0x0080 /* All except ARDir */ #define EA05c 0x0100 /* All except ARDIR and Imm */ #define EA05d 0x0200 /* All except PCDisp, PCDisx, and Imm */ #define EA05e 0x0400 /* All except ARDir, PCDisp, PCDisx, and Imm */ #define EA05f 0x0800 /* All except Dreg, ARDir, ARPost, ARPre, Imm */ #define EA05x 0x1000 /* Dual mode - AND/OR */ #define EA05y 0x2000 /* Dual mode - ADD/SUB */ #define EA05z 0x4000 /* Dual mode - MOVEM */ #define EA611 0x8000 /* Eff. Adr. in 6-11 (used only by MOVE) */ #define TwoOpsB 0xF3DD /* Two operands are required */ #define ImmMode 0x0422 /* Immediate instructions */ #define SrcPC 0xF8C0 /* Source operand may be PCDisp */ #define Dummy 0 /* Error codes */ #define AlignErr 1 #define NoCode 2 #define SymDup 3 #define Undef 4 #define ModeErr 5 #define OperErr 6 #define BraErr 7 #define AddrErr 8 #define SizeErr 9 #define EndErr 10 #define AbsReq 11 #define RelErr 12 #define NoIncl 13 #define FwdRef 14 #define NotSFmt 15 #define NeedLab 16 #define Phase 17 #define NoENDM 18 #define NoENDC 19 #define ManyENDC 20 #define DCOflo 21 #define ManySect 22 #define DupMac 23 #define MultLab 24 #define NoStrEnd 25 #define BccSDsp0 26 #define ERRMAX 10 /* Size of error message table */