- // Obtain the existing long word segment data and flip words if the
- // relocation flags indicate it relates to a RISC MOVEI instruction
- olddata = GetLong(sptr + addr);
+ // Obtain the existing long word (or word) segment data and flip words
+ // if the relocation flags indicate it relates to a RISC MOVEI
+ // instruction
+ olddata = (wordreloc ? GetWord(sptr + addr) : GetLong(sptr + addr));
+
+ // If it's a OP QUAD relocation, get the data out of the DATA bits.
+ // Note that because we can't afford to lose the bottom 3 bits of the
+ // relocation record, we lose 3 off the top--which means the maximum
+ // this can store is $1FFFF8 (vs. $FFFFF8).
+ if (opreloc)
+ {
+ saveBits2 = (GetLong(sptr + addr + 8) & 0xE0000000) >> 8; // Upper 3 of data addr
+ saveBits = olddata & 0x7FF;
+ olddata = (olddata & 0xFFFFF800) >> 11;
+ olddata |= saveBits2; // Restore upper 3 bits of data addr
+ }