//
// RMAC - Reboot's Macro Assembler for all Atari computers
// SECT.C - Code Generation, Fixups and Section Management
-// Copyright (C) 199x Landon Dyer, 2011-2019 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
// evexpr presumably issues the errors/warnings here
if (evexpr(fup->expr, &eval, &eattr, &esym) != OK)
continue;
+
+ if (optim_pc)
+ if (eattr & REFERENCED)
+ if (eattr & DEFINED)
+ if (!(eattr & EQUATED))
+ {
+ error("relocation not allowed");
+ continue;
+ }
}
// Simple symbol
else
SYM * sy = fup->symbol;
eattr = sy->sattr;
+ if (optim_pc)
+ if (eattr & REFERENCED)
+ if (eattr & DEFINED)
+ if (!(eattr & EQUATED))
+ {
+ error("relocation not allowed");
+ continue;
+ }
+
if (eattr & DEFINED)
eval = sy->svalue;
else
// from the location (that will happen in the linker when the external
// reference is resolved).
//
- // MWC expects PC-relative things to have the LOC subtracted from the
- // value, if the value is external (that is, undefined at this point).
- //
// 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) || (dw & FU_PCRELX))
else if (tdb)
{
// Allow cross-section PCREL fixups in Alcyon mode
- if (prg_flag)
+ if (prg_flag || (obj_format == RAW))
{
switch (tdb)
{
if (sbra_flag && (dw & FU_LBRA) && (eval + 0x80 < 0x100))
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;