//
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+// RMAC - Reboot's Macro Assembler for all Atari computers
// EAGEN0.C - Effective Address Code Generation
// Generated Code for eaN (Included twice by "eagen.c")
-// Copyright (C) 199x Landon Dyer, 2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
int eaNgen(WORD siz)
{
- VALUE vbd, v = aNexval;
+ uint32_t vbd, v = (uint32_t)aNexval;
WORD wbd, w = (WORD)(aNexattr & DEFINED);
WORD tdbbd, tdb = (WORD)(aNexattr & TDB);
- vbd = aNbdexval;
+ vbd = (uint32_t)aNbdexval;
wbd = (WORD)(aNbdexattr & DEFINED);
tdbbd = (WORD)(aNbdexattr & TDB);
if (tdb)
MarkRelocatable(cursect, sloc, tdb, MWORD, NULL);
- if ((v == 0) && optim_flags[OPT_INDIRECT_DISP] && !movep)
+ if ((v == 0) && CHECK_OPTS(OPT_INDIRECT_DISP) && !movep)
{
// If expr is 0, size optimise the opcode. Generally the lower
// 6 bits of the opcode for expr(ax) are 101rrr where rrr=the
{
// Just deposit it
if ((aNexattr & TDB) == cursect)
- v -= (VALUE)sloc;
+ v -= (uint32_t)sloc;
else if ((aNexattr & TDB) != ABS)
error(rel_error);
{
// Deposit a byte...
if ((aNexattr & TDB) == cursect)
- v -= (VALUE)sloc;
+ v -= (uint32_t)sloc;
else if ((aNexattr & TDB) != ABS)
error(rel_error);
D_long(0);
}
+ break;
+ case SIZS:
+ // 68881/68882/68040 only
+ if (w)
+ {
+ float vv;
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MSINGLE, NULL);
+
+ vv = (float)v;
+
+ D_single(vv);
+ }
+ else
+ {
+ float vv = 0;
+ AddFixup(FU_FLOATSING, sloc, aNexpr);
+
+ D_single(vv);
+ }
+
+ break;
+ case SIZD:
+ // 68881/68882/68040 only
+ if (w)
+ {
+ double vv;
+ unsigned long long vvv;
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MDOUBLE, NULL);
+
+ // We want to store the IEE754 float into ram from a generic
+ // 32-bit int. First, convert it to double float, then cast
+ // that to 64-bit, then convert to big endian (if needed)
+ // and then store it (phew!)
+ vv = *(float *)&aNexval;
+ vvv = BYTESWAP64(*(unsigned long long *)&vv);
+
+ D_double(vvv);
+ }
+ else
+ {
+ unsigned long long vvv = 0;
+ AddFixup(FU_FLOATDOUB, sloc, aNexpr);
+
+ D_double(vvv);
+ }
+
+ break;
+ case SIZX:
+ // 68881/68882/68040 only
+ if (w)
+ {
+ long double vv;
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MEXTEND, NULL);
+
+ // We want to store the IEE754 float into ram from a generic
+ // 32-bit int. First, convert it to double float, then cast
+ // that to 96-bit, then convert to big endian (if needed)
+ // and then store it (phew!)
+ vv = (double)aNexval;
+
+ //*chptr++ = (char)((*(unsigned long long *)&vv) >> 32) | 0x80 /* assume that the number is normalised */;
+ D_extend(vv);
+ }
+ else
+ {
+ long double vvv = 0;
+ AddFixup(FU_FLOATDOUB, sloc, aNexpr);
+
+ D_extend(vvv);
+ }
+
break;
default:
// IMMED size problem
D_long(0);
}
+ break;
+ case DINDW:
+ D_word((0x190 | (aNixreg << 12)));
+ break;
+ case DINDL:
+ D_word((0x990 | (aNixreg << 12)));
break;
case ABASE:
case MEMPOST:
case PCMPRE:
D_word(aNexten);
// Deposit bd (if not suppressed)
- if ((aNexten&0x0030)==EXT_BDSIZE0)
+ if ((aNexten & 0x0030) == EXT_BDSIZE0)
{
// Don't deposit anything (suppressed)
}
- else if ((aNexten&0x0030)==EXT_BDSIZEW)
+ else if ((aNexten & 0x0030) == EXT_BDSIZEW)
{
// Deposit word bd
if (wbd)
else
{
// Arrange for fixup later on
- AddFixup(FU_WORD|FU_SEXT, sloc, aNexpr);
+ AddFixup(FU_WORD|FU_SEXT, sloc, aNbexpr);
D_word(0);
}
}
else
{
// Arrange for fixup later on
- AddFixup(FU_LONG|FU_SEXT, sloc, aNexpr);
+ AddFixup(FU_LONG, sloc, aNbexpr);
D_long(0);
}
}
#undef aNixreg
#undef aNixsiz
#undef aNexten
+#undef aNbexpr
#undef aNbdexval
#undef aNbdexattr
#undef AnESYM