//
#include "sect.h"
+#include "6502.h"
#include "direct.h"
#include "error.h"
#include "expr.h"
// 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
};
MakeSection(TEXT, SUSED | TEXT ); // TEXT
MakeSection(DATA, SUSED | DATA ); // DATA
MakeSection(BSS, SUSED | BSS | SBSS); // BSS
-// MakeSection(M6502, SUSED | TEXT ); // 6502 code section
+ MakeSection(M6502, SUSED | TEXT ); // 6502 code section
// Switch to TEXT for starters
SwitchSection(TEXT);
cursect = sno;
SECT * p = §[sno];
+ m6502 = (sno == M6502); // Set 6502-mode flag
+
// Copy section vars
scattr = p->scattr;
sloc = p->sloc;
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;
if (cch == NULL)
return 0;
+ /*
+ * Wire the 6502 segment's size to its allocated size (64K)
+ */
+ if (sno == M6502)
+ cch->ch_size = cch->challoc;
+
do
{
fup.cp = ch->chptr; // fup -> start of chunk
*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 WORD forward references;
// the word could be unaligned in the section buffer, so we have to
// be careful.
}
}
- SETBE16(locp, 0, eval);
+ // 6502 words are little endian, so handle that here
+ if (sno == M6502)
+ SETLE16(locp, 0, eval)
+ else
+ SETBE16(locp, 0, eval)
+
break;
// Fixup LONG forward references;
// the long could be unaligned in the section buffer, so be careful
ResolveFixups(TEXT);
DEBUG printf("Resolving DATA sections...\n");
ResolveFixups(DATA);
+ DEBUG printf("Resolving 6502 sections...\n");
+ ResolveFixups(M6502); /* fixup 6502 section (if any) */
return 0;
}