X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;h=59f7977160b11dee3d3057e050f166f426bc74ea;hp=26fe2f95f304a84e9139de36bfb0c196ffced331;hb=66b362fa203d0850e8dce8045adb454e354c22ce;hpb=fe673c9fe1498448453f74d753e7dd4c8655e1b1 diff --git a/sect.c b/sect.c index 26fe2f9..59f7977 100644 --- a/sect.c +++ b/sect.c @@ -290,7 +290,7 @@ int AddFixup(uint32_t attr, uint32_t loc, TOKEN * fexpr) 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; @@ -679,9 +679,8 @@ int ResolveFixups(int sno) 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; @@ -702,6 +701,38 @@ int ResolveFixups(int sno) SETBE32(locp, 0, eval); break; + // Fixup QUAD forward references (mainly used by the OP assembler) + case FU_QUAD: + if (w & FU_OBJLINK) + { + uint64_t quad = GETBE64(locp, 0); + uint64_t addr = eval; + + if (fup->orgaddr) + addr = fup->orgaddr; + + + eval = (quad & 0xFFFFFC0000FFFFFFLL) | ((addr & 0x3FFFF8) << 21); + } + 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; + + if (fup->orgaddr) + addr = fup->orgaddr; + + eval = (quad & 0x000007FFFFFFFFFFLL) | ((addr & 0xFFFFF8) << 40); + } + + SETBE64(locp, 0, 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: @@ -727,6 +758,21 @@ int ResolveFixups(int sno) *locp = (uint8_t)eval; break; + // Fixup a 4-byte float + case FU_FLOATSING: + warn("FU_FLOATSING missing implementation\n%s", "And you may ask yourself, \"Self, how did I get here?\""); + break; + + // Fixup a 8-byte float + case FU_FLOATDOUB: + warn("FU_FLOATDOUB missing implementation\n%s", "And you may ask yourself, \"Self, how did I get here?\""); + break; + + // Fixup a 12-byte float + case FU_FLOATEXT: + warn("FU_FLOATEXT missing implementation\n%s", "And you may ask yourself, \"Self, how did I get here?\""); + break; + default: // Bad fixup type--this should *never* happen! // Once we call this function, it winds down immediately; it