ref: 8c4b473d6f178a583bba81e1155febc7626b29c3
parent: a4fe274c250bd5a9375636c8aa840abdf8cea8f0
author: ISSOtm <eldredhabert0@gmail.com>
date: Mon Feb 3 21:05:33 EST 2020
Add more checks to section creation in RGBASM Fixes rednex#471, but also backports a couple more checks from RGBLINK
--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -159,6 +159,8 @@
void out_NewSection(char const *pzName, uint32_t secttype, int32_t org,
struct SectionSpec const *attributes)
{
+ uint32_t align = 1 << attributes->alignment;
+
if (attributes->bank != -1) {
if (secttype != SECTTYPE_ROMX && secttype != SECTTYPE_VRAM
&& secttype != SECTTYPE_SRAM && secttype != SECTTYPE_WRAMX)
@@ -169,6 +171,26 @@
typeNames[secttype], attributes->bank,
bankranges[secttype][0],
bankranges[secttype][1]);
+ }
+
+ if (align != 1) {
+ /* It doesn't make sense to have both set */
+ uint32_t mask = align - 1;
+
+ if (org != -1) {
+ if (org & mask)
+ yyerror("Section \"%s\"'s fixed address doesn't match its alignment",
+ pzName);
+ else
+ align = 1; /* Ignore it if it's satisfied */
+ }
+ }
+
+ if (org != -1) {
+ if (org < startaddr[secttype] || org > endaddr(secttype))
+ yyerror("Section \"%s\"'s fixed address %#x is outside of range [%#x; %#x]",
+ pzName, org, startaddr[secttype],
+ endaddr(secttype));
}
setCurrentSection(findSection(pzName, secttype, org, attributes->bank,
--- /dev/null
+++ b/test/asm/fixed-oob.asm
@@ -1,0 +1,15 @@
+SECTION "ROM0", ROM0[$BABE]
+
+SECTION "ROMX", ROMX[$BEEF]
+
+SECTION "VRAM", VRAM[$C0DE]
+
+SECTION "SRAM", SRAM[$CAFE]
+
+SECTION "WRAM0", WRAM0[$DEAD]
+
+SECTION "WRAMX", WRAMX[$DAD]
+
+SECTION "OAM", OAM[$CAB]
+
+SECTION "HRAM", HRAM[$BAD]
--- /dev/null
+++ b/test/asm/fixed-oob.err
@@ -1,0 +1,15 @@
+ERROR: fixed-oob.asm(1):
+ Section "ROM0"'s fixed address 0xbabe is outside of range [0; 0x7fff]
+ERROR: fixed-oob.asm(3):
+ Section "ROMX"'s fixed address 0xbeef is outside of range [0x4000; 0x7fff]
+ERROR: fixed-oob.asm(5):
+ Section "VRAM"'s fixed address 0xc0de is outside of range [0x8000; 0x9fff]
+ERROR: fixed-oob.asm(7):
+ Section "SRAM"'s fixed address 0xcafe is outside of range [0xa000; 0xbfff]
+ERROR: fixed-oob.asm(11):
+ Section "WRAMX"'s fixed address 0xdad is outside of range [0xd000; 0xdfff]
+ERROR: fixed-oob.asm(13):
+ Section "OAM"'s fixed address 0xcab is outside of range [0xfe00; 0xfe9f]
+ERROR: fixed-oob.asm(15):
+ Section "HRAM"'s fixed address 0xbad is outside of range [0xff80; 0xfffe]
+error: Assembly aborted (7 errors)!
--- a/test/link/fixed-oob.asm
+++ /dev/null
@@ -1,15 +1,0 @@
-SECTION "ROM0", ROM0[$BABE]
-
-SECTION "ROMX", ROMX[$BEEF]
-
-SECTION "VRAM", VRAM[$C0DE]
-
-SECTION "SRAM", SRAM[$CAFE]
-
-SECTION "WRAM0", WRAM0[$DEAD]
-
-SECTION "WRAMX", WRAMX[$DAD]
-
-SECTION "OAM", OAM[$CAB]
-
-SECTION "HRAM", HRAM[$BAD]
--- a/test/link/fixed-oob.out
+++ /dev/null
@@ -1,14 +1,0 @@
-warning: Section "VRAM"'s fixed address 0xc0de is outside of range [0x8000; 0x9fff]
-warning: Section "VRAM"'s end address 0xc0de is greater than last address 0xa000
-warning: Section "OAM"'s fixed address 0xcab is outside of range [0xfe00; 0xfe9f]
-warning: Section "WRAM0"'s fixed address 0xdead is outside of range [0xc000; 0xcfff]
-warning: Section "WRAM0"'s end address 0xdead is greater than last address 0xd000
-warning: Section "HRAM"'s fixed address 0xbad is outside of range [0xff80; 0xfffe]
-warning: Section "SRAM"'s fixed address 0xcafe is outside of range [0xa000; 0xbfff]
-warning: Section "SRAM"'s end address 0xcafe is greater than last address 0xc000
-warning: Section "WRAMX"'s fixed address 0xdad is outside of range [0xd000; 0xdfff]
-warning: Section "ROMX"'s fixed address 0xbeef is outside of range [0x4000; 0x7fff]
-warning: Section "ROMX"'s end address 0xbeef is greater than last address 0x8000
-warning: Section "ROM0"'s fixed address 0xbabe is outside of range [0; 0x3fff]
-warning: Section "ROM0"'s end address 0xbabe is greater than last address 0x4000
-error: Sanity checks failed