//
void MakeSection(int sno, uint16_t attr)
{
- SECT * p = §[sno];
- p->scattr = attr;
- p->sloc = 0;
- p->orgaddr = 0;
- p->scode = p->sfcode = NULL;
- p->sfix = p->sffix = NULL;
+ SECT * sp = §[sno];
+ sp->scattr = attr;
+ sp->sloc = 0;
+ sp->orgaddr = 0;
+ sp->scode = sp->sfcode = NULL;
+ sp->sfix = sp->sffix = NULL;
}
{
CHUNK * cp;
cursect = sno;
- SECT * p = §[sno];
+ SECT * sp = §[sno];
m6502 = (sno == M6502); // Set 6502-mode flag
// Copy section vars
- scattr = p->scattr;
- sloc = p->sloc;
- scode = p->scode;
- orgaddr = p->orgaddr;
+ scattr = sp->scattr;
+ sloc = sp->sloc;
+ scode = sp->scode;
+ orgaddr = sp->orgaddr;
// Copy code chunk vars
if ((cp = scode) != NULL)
chptr = cp->chptr + ch_size;
// For 6502 mode, add the last org'd address
+// Why?
+/*
+Because the way this is set up it treats the 6502 assembly space as a single 64K space (+ 16 bytes, for some reason) and just bobbles around inside that space and uses a stack of org "pointers" to show where the data ended up.
+
+This is a piss poor way to handle things, and for fucks sake, we can do better than this!
+*/
if (m6502)
chptr = cp->chptr + orgaddr;
}
//
void SaveSection(void)
{
- SECT * p = §[cursect];
+ SECT * sp = §[cursect];
- p->scattr = scattr; // Bailout section vars
- p->sloc = sloc;
- p->orgaddr = orgaddr;
+ sp->scattr = scattr; // Bailout section vars
+ sp->sloc = sloc;
+ sp->orgaddr = orgaddr;
if (scode != NULL) // Bailout code chunk
scode->ch_size = ch_size;
SETBE32(locp, 0, eval);
break;
- // Fixup QUAD forward references
- // Need to add flags for OP uses... [DONE]
+ // Fixup QUAD forward references (mainly used by the OP assembler)
case FU_QUAD:
- // If the symbol is undefined, make sure to pass the symbol in
- // to the MarkRelocatable() function.
-/* if (!(eattr & DEFINED))
- MarkRelocatable(sno, loc, 0, MQUAD, esym);
- else if (tdb)
- MarkRelocatable(sno, loc, tdb, MQUAD, NULL);//*/
-
if (w & FU_OBJLINK)
{
uint64_t quad = GETBE64(locp, 0);
if (fup->orgaddr)
addr = fup->orgaddr;
-//printf("sect.c: FU_OBJLINK quad=%016lX, addr=%016lX ", quad, addr);
-
eval = (quad & 0xFFFFFC0000FFFFFFLL) | ((addr & 0x3FFFF8) << 21);
-//printf("(%016lX)\n", eval);
}
else if (w & FU_OBJDATA)
{
+ // If it's in a TEXT or DATA section, be sure to mark for a
+ // fixup later
+ if (tdb)
+ MarkRelocatable(sno, loc, tdb, MQUAD, NULL);
+
uint64_t quad = GETBE64(locp, 0);
uint64_t addr = eval;
}
SETBE64(locp, 0, eval);
-//printf("(%016lX)\n", eval);
break;
// Fixup a 3-bit "QUICK" reference in bits 9..1