diff --git a/src/link/assign.cpp b/src/link/assign.cpp index 334960bd..1e3c93bd 100644 --- a/src/link/assign.cpp +++ b/src/link/assign.cpp @@ -144,6 +144,8 @@ static std::optional getPlacement(Section const §ion, MemoryLocation location.address = section.org; } else if (section.isAlignFixed) { // Move to next aligned location + // We have previously ensured alignment to 15 or fewer bits, so this will progress + assume(section.alignMask < (1 << 16) - 1); // Move back to alignment boundary location.address -= section.alignOfs; // Ensure we're there (e.g. on first check) diff --git a/src/link/section.cpp b/src/link/section.cpp index 20040cdf..907535ec 100644 --- a/src/link/section.cpp +++ b/src/link/section.cpp @@ -321,6 +321,17 @@ static void doSanityChecks(Section §ion) { ); } } + + // An alignment of 16 is impossible to output from RGBASM, since it's treated as + // fixing the address, but is still satisfiable. A fixed address different from the + // alignment offset would not be, but we checked for that already above. + if (section.isAlignFixed && section.alignMask == (1 << 16) - 1) { + assume(!section.isAddressFixed || section.org == section.alignOfs); + section.isAddressFixed = true; + section.org = section.alignOfs; + section.isAlignFixed = false; + section.alignMask = section.alignOfs = 0; + } } void sect_DoSanityChecks() {