Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warn when SGB compatibility is set without old licensee 0x33 #1196

Merged
merged 2 commits into from
Nov 2, 2023
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
2 changes: 1 addition & 1 deletion contrib/gbdiff.bash
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ diff <(xxd "$1") <(xxd "$2") | while read -r LINE; do
while read -r SYMADDR SYM; do
SYMADDR=$((0x${SYMADDR#*:}))
if [[ $SYMADDR -le $ADDR ]]; then
printf " (%s+%#x)\n" "$SYM" $((ADDR - SYMADDR))
printf " (%s+0x%x)\n" "$SYM" $((ADDR - SYMADDR))
fi
# TODO: assumes sorted sym files
done | tail -n 1
Expand Down
4 changes: 2 additions & 2 deletions src/asm/section.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,8 @@ static struct Section *getSection(char const *name, enum SectionType type, uint3

if (org != (uint32_t)-1) {
if (org < sectionTypeInfo[type].startAddr || org > endaddr(type))
error("Section \"%s\"'s fixed address %#" PRIx32
" is outside of range [%#" PRIx16 "; %#" PRIx16 "]\n",
error("Section \"%s\"'s fixed address $%04" PRIx32
" is outside of range [$%04" PRIx16 "; $%04" PRIx16 "]\n",
name, org, sectionTypeInfo[type].startAddr, endaddr(type));
}

Expand Down
6 changes: 5 additions & 1 deletion src/fix/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,10 @@ static void processFile(int input, int output, char const *name, off_t fileSize)

if (oldLicensee != UNSPECIFIED)
overwriteByte(rom0, 0x14B, oldLicensee, "old licensee code");
else if (sgb && rom0[0x14B] != 0x33)
fprintf(stderr,
"warning: SGB compatibility enabled, but old licensee was 0x%02x, not 0x33\n",
rom0[0x14B]);

if (romVersion != UNSPECIFIED)
overwriteByte(rom0, 0x14C, romVersion, "mask ROM version number");
Expand Down Expand Up @@ -1436,7 +1440,7 @@ do { \

if (sgb && oldLicensee != UNSPECIFIED && oldLicensee != 0x33)
fprintf(stderr,
"warning: SGB compatibility enabled, but old licensee is %#x, not 0x33\n",
"warning: SGB compatibility enabled, but old licensee is 0x%02x, not 0x33\n",
oldLicensee);

argv += musl_optind;
Expand Down
2 changes: 1 addition & 1 deletion src/link/patch.c
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio
if (!isError && (value < types[patch->type].min
|| value > types[patch->type].max))
error(patch->src, patch->lineNo,
"Value %#" PRIx32 "%s is not %u-bit",
"Value %" PRId32 "%s is not %u-bit",
value, value < 0 ? " (maybe negative?)" : "",
types[patch->type].size * 8U);
for (uint8_t i = 0; i < types[patch->type].size; i++) {
Expand Down
15 changes: 8 additions & 7 deletions src/link/section.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,9 @@ static void doSanityChecks(struct Section *section, void *ptr)

// Check if section has a chance to be placed
if (section->size > sectionTypeInfo[section->type].size)
error(NULL, 0, "Section \"%s\" is bigger than the max size for that type: %#" PRIx16 " > %#" PRIx16,
section->name, section->size, sectionTypeInfo[section->type].size);
error(NULL, 0, "Section \"%s\" is bigger than the max size for that type: $%"
PRIx16 " > $%" PRIx16,
section->name, section->size, sectionTypeInfo[section->type].size);

// Translate loose constraints to strong ones when they're equivalent

Expand All @@ -296,14 +297,14 @@ static void doSanityChecks(struct Section *section, void *ptr)
// Ensure the target address is valid
if (section->org < sectionTypeInfo[section->type].startAddr
|| section->org > endaddr(section->type))
error(NULL, 0, "Section \"%s\"'s fixed address %#" PRIx16 " is outside of range [%#"
PRIx16 "; %#" PRIx16 "]", section->name, section->org,
error(NULL, 0, "Section \"%s\"'s fixed address $%04" PRIx16 " is outside of range [$%04"
PRIx16 "; $%04" PRIx16 "]", section->name, section->org,
sectionTypeInfo[section->type].startAddr, endaddr(section->type));

if (section->org + section->size > endaddr(section->type) + 1)
error(NULL, 0, "Section \"%s\"'s end address %#x is greater than last address %#x",
section->name, section->org + section->size,
endaddr(section->type) + 1);
error(NULL, 0, "Section \"%s\"'s end address $%04x is greater than last address $%04x",
section->name, section->org + section->size,
endaddr(section->type) + 1);
}

#undef fail
Expand Down
14 changes: 7 additions & 7 deletions test/asm/fixed-oob.err
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
error: fixed-oob.asm(1):
Section "ROM0"'s fixed address 0xbabe is outside of range [0; 0x7fff]
Section "ROM0"'s fixed address $babe is outside of range [$0000; $7fff]
error: fixed-oob.asm(3):
Section "ROMX"'s fixed address 0xbeef is outside of range [0x4000; 0x7fff]
Section "ROMX"'s fixed address $beef is outside of range [$4000; $7fff]
error: fixed-oob.asm(5):
Section "VRAM"'s fixed address 0xc0de is outside of range [0x8000; 0x9fff]
Section "VRAM"'s fixed address $c0de is outside of range [$8000; $9fff]
error: fixed-oob.asm(7):
Section "SRAM"'s fixed address 0xcafe is outside of range [0xa000; 0xbfff]
Section "SRAM"'s fixed address $cafe is outside of range [$a000; $bfff]
error: fixed-oob.asm(11):
Section "WRAMX"'s fixed address 0xdad is outside of range [0xd000; 0xdfff]
Section "WRAMX"'s fixed address $0dad is outside of range [$d000; $dfff]
error: fixed-oob.asm(13):
Section "OAM"'s fixed address 0xcab is outside of range [0xfe00; 0xfe9f]
Section "OAM"'s fixed address $0cab is outside of range [$fe00; $fe9f]
error: fixed-oob.asm(15):
Section "HRAM"'s fixed address 0xbad is outside of range [0xff80; 0xfffe]
Section "HRAM"'s fixed address $0bad is outside of range [$ff80; $fffe]
error: Assembly aborted (7 errors)!
Binary file added test/fix/sgb-old-licensee.bin
Binary file not shown.
2 changes: 2 additions & 0 deletions test/fix/sgb-old-licensee.err
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
warning: Overwrote a non-zero byte in the SGB flag
warning: SGB compatibility enabled, but old licensee was 0xc5, not 0x33
1 change: 1 addition & 0 deletions test/fix/sgb-old-licensee.flags
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-s
Binary file modified test/fix/sgb.bin
Binary file not shown.
Binary file modified test/fix/sgb.gb
Binary file not shown.
2 changes: 1 addition & 1 deletion test/link/rom0-tiny-no-t.out
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
error: Section "rom" is bigger than the max size for that type: 0x8000 > 0x4000
error: Section "rom" is bigger than the max size for that type: $8000 > $4000
Linking failed with 1 error