#include "riscasm.h"
#include "symbol.h"
#include "token.h"
+extern int m6502; /* 1, assembler in .6502 mode */
// Function prototypes
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 */
+
// Copy section vars
scattr = p->scattr;
sloc = p->sloc;
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);
+ if (sno != M6502)
+ {
+ *locp++ = (char)(eval >> 8);
+ *locp = (char)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;
}