2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // EAGEN0.C - Effective Address Code Generation
4 // Generated Code for eaN (Included twice by "eagen.c")
5 // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
6 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
7 // Source utilised with the kind permission of Landon Dyer
17 w = (WORD)(aNexattr & DEFINED);
18 tdb = (WORD)(aNexattr & TDB);
22 // "Do nothing" - they're in the opword
32 // This is a performance hit, though
40 rmark(cursect, sloc, tdb, MWORD, NULL);
42 if (v + 0x8000 >= 0x18000)
43 return error(range_error);
49 // Arrange for fixup later on
50 AddFixup(FU_WORD|FU_SEXT, sloc, aNexpr);
59 if ((aNexattr & TDB) == cursect)
61 else if ((aNexattr & TDB) != ABS)
64 if (v + 0x8000 >= 0x10000)
65 return error(range_error);
71 // Arrange for fixup later on
72 AddFixup(FU_WORD|FU_SEXT|FU_PCREL, sloc, aNexpr);
78 // Compute ixreg and size+scale
79 w = (WORD)((aNixreg << 12) | aNixsiz);
81 if (aNexattr & DEFINED)
86 return error(abs_error);
88 if (v + 0x80 >= 0x180)
89 return error(range_error);
96 // Fixup the byte later
97 AddFixup(FU_BYTE|FU_SEXT, sloc+1, aNexpr);
103 // Compute ixreg and size+scale
104 w = (WORD)((aNixreg << 12) | aNixsiz);
106 if (aNexattr & DEFINED)
109 if ((aNexattr & TDB) == cursect)
111 else if ((aNexattr & TDB) != ABS)
114 if (v + 0x80 >= 0x100)
115 return error(range_error);
122 // Fixup the byte later
123 AddFixup(FU_WBYTE|FU_SEXT|FU_PCREL, sloc, aNexpr);
135 return error("illegal byte-sized relative reference");
137 if (v + 0x100 >= 0x200)
138 return error(range_error);
144 AddFixup(FU_BYTE|FU_SEXT, sloc+1, aNexpr);
154 rmark(cursect, sloc, tdb, MWORD, NULL);
156 if (v + 0x10000 >= 0x20000)
157 return error(range_error);
163 AddFixup(FU_WORD|FU_SEXT, sloc, aNexpr);
172 rmark(cursect, sloc, tdb, MLONG, NULL);
178 AddFixup(FU_LONG, sloc, aNexpr);
184 // IMMED size problem
193 rmark(cursect, sloc, tdb, MWORD, NULL);
195 if (v + 0x8000 >= 0x10000)
196 return error(range_error);
202 AddFixup(FU_WORD|FU_SEXT, sloc, aNexpr);
211 rmark(cursect, sloc, tdb, MLONG, NULL);
217 AddFixup(FU_LONG, sloc, aNexpr);
228 return error("unsupported 68020 addressing mode");
230 // Bad addressing mode in ea gen
237 // Undefine dirty macros