]> Shamusworld >> Repos - rmac/blobdiff - sect.c
Version bump for last commit. ;-)
[rmac] / sect.c
diff --git a/sect.c b/sect.c
index 965fcf0dfeb24c12e5095457f72d320eb5be382d..7a6f9e15cb0a64a4aefede0d782050b9008c7360 100644 (file)
--- a/sect.c
+++ b/sect.c
@@ -7,6 +7,7 @@
 //
 
 #include "sect.h"
+#include "6502.h"
 #include "direct.h"
 #include "error.h"
 #include "expr.h"
@@ -16,7 +17,6 @@
 #include "riscasm.h"
 #include "symbol.h"
 #include "token.h"
-extern int m6502;              /* 1, assembler in .6502 mode */
 
 
 // Function prototypes
@@ -47,26 +47,26 @@ PTR fchptr;                         // Deposit point in fixup chunk buffer
 // Return a size (SIZB, SIZW, SIZL) or 0, depending on what kind of fixup is
 // associated with a location.
 static uint8_t fusiztab[] = {
-   0,  // FU_QUICK
-   1,  // FU_BYTE
-   2,  // FU_WORD
-   2,  // FU_WBYTE
-   4,  // FU_LONG
-   1,  // FU_BBRA
-   0,  // (unused)
-   1,  // FU_6BRA
+       0,      // FU_QUICK
+       1,      // FU_BYTE
+       2,      // FU_WORD
+       2,      // FU_WBYTE
+       4,      // FU_LONG
+       1,      // FU_BBRA
+       0,      // (unused)
+       1,      // FU_6BRA
 };
 
 // Offset to REAL fixup location
 static uint8_t fusizoffs[] = {
-   0,  // FU_QUICK
-   0,  // FU_BYTE
-   0,  // FU_WORD
-   1,  // FU_WBYTE
-   0,  // FU_LONG
-   1,  // FU_BBRA
-   0,  // (unused)
-   0,  // FU_6BRA
+       0,      // FU_QUICK
+       0,      // FU_BYTE
+       0,      // FU_WORD
+       1,      // FU_WBYTE
+       0,      // FU_LONG
+       1,      // FU_BBRA
+       0,      // (unused)
+       0,      // FU_6BRA
 };
 
 
@@ -116,7 +116,7 @@ void SwitchSection(int sno)
        cursect = sno;
        SECT * p = &sect[sno];
 
-    m6502 = (sno == M6502);    /* set 6502-mode */
+    m6502 = (sno == M6502);    // Set 6502-mode flag
 
        // Copy section vars
        scattr = p->scattr;
@@ -130,6 +130,10 @@ void SwitchSection(int sno)
                challoc = cp->challoc;
                ch_size = cp->ch_size;
                chptr = cp->chptr + ch_size;
+
+               // For 6502 mode, add the last org'd address
+               if (m6502)
+                       chptr = cp->chptr + orgaddr;
        }
        else
                challoc = ch_size = 0;
@@ -417,7 +421,7 @@ int ResolveFixups(int sno)
         */
        if (sno == M6502)
                cch->ch_size = cch->challoc;
-    
+
        do
        {
                fup.cp = ch->chptr;                                     // fup -> start of chunk
@@ -592,25 +596,25 @@ int ResolveFixups(int sno)
 
                                *locp = (uint8_t)eval;
                                break;
-            // Fixup high/low byte off word for 6502
-            case FU_BYTEH:
-                if (!(eattr & DEFINED))
-                {
-                    error("external byte reference");
-                    continue;
-                }
-
-                *locp = (uint8_t)((eval >> 8) & 0xff);
-                break;
-            case FU_BYTEL:
-                if (!(eattr & DEFINED))
-                {
-                    error("external byte reference");
-                    continue;
-                }
-
-                *locp = (uint8_t)(eval & 0xff);
-                break;
+                       // Fixup high/low byte off word for 6502
+                       case FU_BYTEH:
+                               if (!(eattr & DEFINED))
+                               {
+                                       error("external byte reference");
+                                       continue;
+                               }
+
+                               *locp = (uint8_t)((eval >> 8) & 0xFF);
+                               break;
+                       case FU_BYTEL:
+                               if (!(eattr & DEFINED))
+                               {
+                                       error("external byte reference");
+                                       continue;
+                               }
+
+                               *locp = (uint8_t)(eval & 0xFF);
+                               break;
                        // Fixup WORD forward references;
                        // the word could be unaligned in the section buffer, so we have to
                        // be careful.
@@ -741,15 +745,12 @@ int ResolveFixups(int sno)
                                        }
                                }
 
-                               if (sno != M6502)
-                               {
-                                       *locp++ = (char)(eval >> 8);
-                                       *locp = (char)eval;
-                               }
+                               // 6502 words are little endian, so handle that here
+                               if (sno == M6502)
+                                       SETLE16(locp, 0, eval)
                                else
-                               {
-                                   SETBE16(locp, 0, eval);
-                }
+                                   SETBE16(locp, 0, eval)
+
                                break;
                        // Fixup LONG forward references;
                        // the long could be unaligned in the section buffer, so be careful