X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;fp=sect.c;h=c7580631faa89cf9534f206bdfd34847cab5b13f;hp=7fcb2996bc30051a819e656b08f7ffa6db0b5e61;hb=7d0d2b9ecddea35722fd1d09c99735b98f6f0362;hpb=7d364a21bf389d947bb61cc235d00b3892aca89a diff --git a/sect.c b/sect.c index 7fcb299..c758063 100644 --- a/sect.c +++ b/sect.c @@ -455,12 +455,18 @@ int ResolveFixups(int sno) // // 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 @@ -483,6 +489,10 @@ int ResolveFixups(int sno) } eval -= loc; + + // In this instruction the PC is located a DWORD away + if (dw & FU_PCRELX) + eval += 2; } else { @@ -495,8 +505,15 @@ int ResolveFixups(int sno) 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; }