Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 26 additions & 23 deletions src/asm/section.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,30 +583,33 @@ void sect_AlignPC(uint8_t alignment, uint16_t offset) {
actualOffset
);
}
} else if (uint32_t actualOffset =
((sect->alignOfs + curOffset) % (1u << sect->align)) % alignSize;
sect->align != 0 && actualOffset != offset) {
error(
"Section is misaligned ($%04" PRIx32 " bytes into the section, expected ALIGN[%" PRIu32
", %" PRIu32 "], got ALIGN[%" PRIu32 ", %" PRIu32 "])\n",
curOffset,
alignment,
offset,
alignment,
actualOffset
);
} else if (alignment >= 16) {
// Treat an alignment large enough as fixing the address.
// Note that this also ensures that a section's alignment never becomes 16 or greater.
if (alignment > 16) {
error("Alignment must be between 0 and 16, not %u\n", alignment);
} else {
if (uint32_t actualOffset = (sect->alignOfs + curOffset) % alignSize,
sectAlignSize = 1 << sect->align;
sect->align != 0 && actualOffset % sectAlignSize != offset % sectAlignSize) {
error(
"Section is misaligned ($%04" PRIx32
" bytes into the section, expected ALIGN[%" PRIu32 ", %" PRIu32
"], got ALIGN[%" PRIu32 ", %" PRIu32 "])\n",
curOffset,
alignment,
offset,
alignment,
actualOffset
);
} else if (alignment >= 16) {
// Treat an alignment large enough as fixing the address.
// Note that this also ensures that a section's alignment never becomes 16 or greater.
if (alignment > 16) {
error("Alignment must be between 0 and 16, not %u\n", alignment);
}
sect->align = 0; // Reset the alignment, since we're fixing the address.
sect->org = offset - curOffset;
} else if (alignment > sect->align) {
sect->align = alignment;
// We need `(sect->alignOfs + curOffset) % alignSize == offset`
sect->alignOfs = (offset - curOffset) % alignSize;
}
sect->align = 0; // Reset the alignment, since we're fixing the address.
sect->org = offset - curOffset;
} else if (alignment > sect->align) {
sect->align = alignment;
// We need `(sect->alignOfs + curOffset) % alignSize == offset`
sect->alignOfs = (offset - curOffset) % alignSize;
}
}

Expand Down
15 changes: 15 additions & 0 deletions test/asm/align-increasing.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
SECTION "test1", ROM0
align 4 ; PC = $xxx0
dw $0123
align 4, 2 ; PC = $xxx2
ds align [8, $C2] ; PC = $xxC2 (ds 0)
align 8, $C2 ; PC = $xxC2
dw $4567

SECTION "test2", ROM0[$01C0]
align 4 ; PC = $01C0
dw $89ab
align 4, 2 ; PC = $01C2
ds align [8, $C2] ; PC = $01C2 (ds 0)
align 8, $C2 ; PC = $01C2
dw $cdef
Binary file added test/asm/align-increasing.out.bin
Binary file not shown.
Loading