int eaNgen(WORD siz)
{
- uint32_t vbd, v = (uint32_t)aNexval;
- WORD wbd, w = (WORD)(aNexattr & DEFINED);
- WORD tdbbd, tdb = (WORD)(aNexattr & TDB);
- vbd = (uint32_t)aNbdexval;
- wbd = (WORD)(aNbdexattr & DEFINED);
- tdbbd = (WORD)(aNbdexattr & TDB);
+ uint32_t v = (uint32_t)aNexval;
+ WORD w = (WORD)(aNexattr & DEFINED);
+ WORD tdb = (WORD)(aNexattr & TDB);
+ uint32_t vbd = (uint32_t)aNbdexval;
+ WORD wbd = (WORD)(aNbdexattr & DEFINED);
+ WORD tdbbd = (WORD)(aNbdexattr & TDB);
uint8_t extDbl[12];
switch (amN)
case AM_NONE:
// This is a performance hit, though
break;
+
case ADISP:
// expr(An)
if (w)
}
break;
+
case PCDISP:
if (w)
{
}
break;
+
case AINDEXED:
// Compute ixreg and size+scale
w = (WORD)((aNixreg << 12) | aNixsiz);
}
break;
+
case PCINDEXED:
// Compute ixreg and size+scale
w = (WORD)((aNixreg << 12) | aNixsiz);
}
break;
+
case IMMED:
switch (siz)
{
}
break;
+
case SIZW:
case SIZN:
if (w)
}
break;
+
case SIZL:
if (w)
{
}
break;
+
case SIZS:
// 68881/68882/68040 only
if (w)
}
break;
+
case SIZD:
// 68881/68882/68040 only
if (w)
}
break;
+
case SIZX:
// 68881/68882/68040 only
if (w)
}
else
{
+ // Why would this be anything other than a floating point
+ // expression??? Even if there were an undefined symbol in
+ // the expression, how would that be relevant? I can't see
+ // any use case where this would make sense.
AddFixup(FU_FLOATDOUB, sloc, aNexpr);
memset(extDbl, 0, 12);
D_extend(extDbl);
}
break;
+
default:
// IMMED size problem
interror(1);
}
break;
+
case SIZP:
// 68881/68882/68040 only
return error("Sorry, .p constant format is not implemented yet!");
break;
+
case ABSW:
if (w) // Defined
{
}
break;
+
case ABSL:
if (w) // Defined
{
}
break;
+
case DINDW:
D_word((0x190 | (aNixreg << 12)));
break;
+
case DINDL:
D_word((0x990 | (aNixreg << 12)));
break;
+
case ABASE:
case MEMPOST:
case MEMPRE:
case PCMPOST:
case PCMPRE:
D_word(aNexten);
+
// Deposit bd (if not suppressed)
if ((aNexten & 0x0030) == EXT_BDSIZE0)
{
else
{
// Arrange for fixup later on
- AddFixup(FU_WORD | FU_SEXT, sloc, aNbexpr);
+ AddFixup(FU_WORD | FU_SEXT | FU_PCRELX, sloc, aNbexpr);
D_word(0);
}
}
D_long(0);
}
}
+
// Deposit od (if not suppressed)
if ((aNexten & 7) == EXT_IISPRE0 || (aNexten & 7) == EXT_IISPREN
|| (aNexten & 7) == EXT_IISNOIN || (aNexten & 7) == EXT_IISPOSN)
break;
//return error("unsupported 68020 addressing mode");
+
default:
// Bad addressing mode in ea gen
interror(3);
uint8_t * buf; // Scratch area
uint8_t * p; // Temporary ptr
LONG trsize, drsize; // Size of relocations
- long unused; // For supressing 'write' warnings
+ uint32_t unused; // For supressing 'write' warnings
if (verb_flag)
{
WriteP56();
// Write all the things |o/
- ssize_t unused = write(fd, buf, chptr - buf);
+ unused = write(fd, buf, chptr - buf);
if (buf)
free(buf);
//
// PC-relative fixups must be DEFINED and either in the same section
// (whereupon the subtraction takes place) or ABS (with no subtract).
- if (dw & FU_PCREL)
+ if ((dw & FU_PCREL) || (dw & FU_PCRELX))
{
if (eattr & DEFINED)
{
if (tdb == sno)
+ {
eval -= loc;
+
+ // In this instruction the PC is located a DWORD away
+ if (dw & FU_PCRELX)
+ eval += 2;
+ }
else if (tdb)
{
// Allow cross-section PCREL fixups in Alcyon mode
}
eval -= loc;
+
+ // In this instruction the PC is located a DWORD away
+ if (dw & FU_PCRELX)
+ eval += 2;
}
else
{
warn("unoptimized short branch");
}
else if (obj_format == MWC)
+ {
eval -= loc;
+ // In this instruction the PC is located a DWORD away
+ if (dw & FU_PCRELX)
+ eval += 2;
+ }
+
+ // Be sure to clear any TDB flags, since we handled it just now
tdb = 0;
eattr &= ~TDB;
}