X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=mark.c;h=53eaf871854bb87bcd7e32f6a36e519ebcf8250f;hp=6c065b52e83928cfdd9589d970a2f79a5958c138;hb=9153334781cd2e23750f4dc002e847606c07a1f0;hpb=005275defacb4b5d2f511bf7357ac7720f807761 diff --git a/mark.c b/mark.c index 6c065b5..53eaf87 100644 --- a/mark.c +++ b/mark.c @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // MARK.C - A record of things that are defined relative to any of the sections -// Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -90,16 +90,13 @@ if (symbol) // // Complain about some things are not allowed in '-p' (PRG) mode: - // o Marks that aren't to LONGs - // o External references + // o Marks that aren't to LONGs + // o External references // if (prg_flag) { - if ((flags & MLONG) == 0) - error("illegal word relocatable (in .PRG mode)"); - if (symbol != NULL) - errors("illegal external reference (in .PRG mode) to '%s'", + error("illegal external reference (in .PRG mode) to '%s'", symbol->sname); } @@ -224,7 +221,7 @@ uint32_t MarkImage(register uint8_t * mp, uint32_t siz, uint32_t tsize, int okfl w |= symbol->senv << 3; *wp++ = w >> 8; - *wp = w; + *wp = (uint8_t)w; } } else @@ -380,6 +377,12 @@ printf(" validsegment: raddr = $%08X\n", loc); if (w & MMOVEI) rflag |= 0x00000001; + // This tells the linker to do a WORD relocation (otherwise it + // defaults to doing a LONG, throwing things off for WORD sized + // fixups) + if (!(w & MLONG)) + rflag |= 0x00000002; + if (symbol != NULL) { // Deposit external reference @@ -417,7 +420,7 @@ printf(" validsegment(3): rflag = $%08X\n", rflag); if (from == DATA) dp += tsize; - uint32_t diff = GETBE32(dp, 0); + uint32_t diff = (rflag & 0x02 ? GETBE16(dp, 0) : GETBE32(dp, 0)); DEBUG printf("diff=%uX ==> ", diff); #ifdef DEBUG_IMAGE_MARKING printf(" validsegment(4): diff = $%08X --> ", diff); @@ -433,7 +436,21 @@ printf(" validsegment(4): diff = $%08X --> ", diff); if (rflag & 0x01) diff = WORDSWAP32(diff); - SETBE32(dp, 0, diff); + // Make sure to deposit the correct size payload + // N.B.: The braces around the SETBExx macros are needed + // because the macro supplies its own set of braces, + // thus leaving a naked semicolon afterwards to + // screw up the if/else structure. This is the price + // you pay when using macros pretending to be code. + if (rflag & 0x02) + { + SETBE16(dp, 0, diff); + } + else + { + SETBE32(dp, 0, diff); + } + DEBUG printf("%uX\n", diff); #ifdef DEBUG_IMAGE_MARKING printf("$%08X\n", diff); @@ -466,6 +483,7 @@ uint32_t CreateELFRelocationRecord(uint8_t * buf, uint8_t * secBuf, uint16_t sec // Setup pointer for D_long/word/byte macros chptr = buf; + ch_size = 0; for(MCHUNK * mch=firstmch; mch!=NULL; mch=mch->mcnext) { @@ -527,25 +545,11 @@ uint32_t CreateELFRelocationRecord(uint8_t * buf, uint8_t * secBuf, uint16_t sec else r_type = 1; // R_68K_32 -#ifdef DEBUG_IMAGE_MARKING -if (symbol) -{ - printf("CreateELFReloc: symbol-svalue = $%08X\n", symbol->svalue); -} - -printf("CreateELFReloc: deposited value = $%08X\n", GETBE32(secBuf + r_offset, 0)); - -#endif -//Turns out this is pretty much bollocks. So now we punt all the time :-) -//N.B.: Once this is proved out, this will go for good. -// if (symbol != NULL) -// r_addend = symbol->svalue; // Mark offset into section -// else - r_addend = GETBE32(secBuf + r_offset, 0); + r_addend = GETBE32(secBuf + r_offset, 0); // Deposit the relocation record D_long(r_offset); - D_long((r_sym << 8) | r_type); + D_long(((r_sym << 8) | r_type)); D_long(r_addend); rsize += 0x0C; }