]> Shamusworld >> Repos - rmac/blobdiff - sect.c
Fix a few minor problems with 030 mode PC relative fixups.
[rmac] / sect.c
diff --git a/sect.c b/sect.c
index 7fcb2996bc30051a819e656b08f7ffa6db0b5e61..c7580631faa89cf9534f206bdfd34847cab5b13f 100644 (file)
--- 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;
                }