DEBUG { printf("AddFixup: sno=%u, l#=%u, attr=$%X, loc=$%X, expr=%p, sym=%p, org=$%X\n", cursect, fixup->lineno, fixup->attr, fixup->loc, (void *)fixup->expr, (void *)fixup->symbol, fixup->orgaddr);
if (symbol != NULL)
- printf(" name: %s, value: $lX\n", symbol->sname, symbol->svalue);
+ printf(" name: %s, value: $%lX\n", symbol->sname, symbol->svalue);
}
return 0;
break;
- // Fixup LONG forward references;
- // the long could be unaligned in the section buffer, so be careful
- // (again).
+ // Fixup LONG forward references; the long could be unaligned in the
+ // section buffer, so be careful (again).
case FU_LONG:
flags = MLONG;
SETBE32(locp, 0, eval);
break;
+ // Fixup QUAD forward references
+ // Need to add flags for OP uses... [DONE]
+ 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);
+ uint64_t addr = eval;
+
+ 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)
+ {
+ uint64_t quad = GETBE64(locp, 0);
+ uint64_t addr = eval;
+
+ if (fup->orgaddr)
+ addr = fup->orgaddr;
+
+ eval = (quad & 0x000007FFFFFFFFFFLL) | ((addr & 0xFFFFF8) << 40);
+ }
+
+ SETBE64(locp, 0, eval);
+//printf("(%016lX)\n", eval);
+ break;
+
// Fixup a 3-bit "QUICK" reference in bits 9..1
// (range of 1..8) in a word. [Really bits 1..3 in a byte.]
case FU_QUICK: