X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;h=7a6f9e15cb0a64a4aefede0d782050b9008c7360;hp=965fcf0dfeb24c12e5095457f72d320eb5be382d;hb=005275defacb4b5d2f511bf7357ac7720f807761;hpb=052be802baa4836564801c780b1d432cfe17c576 diff --git a/sect.c b/sect.c index 965fcf0..7a6f9e1 100644 --- 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 = §[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