diff --git a/src/link/object.cpp b/src/link/object.cpp index 4115786f..fd17d85b 100644 --- a/src/link/object.cpp +++ b/src/link/object.cpp @@ -359,7 +359,7 @@ static void readSection( ); tryReadLong(tmp, file, "%s: Cannot read \"%s\"'s' size: %s", fileName, section.name.c_str()); if (tmp < 0 || tmp > UINT16_MAX) - errx("\"%s\"'s section size (%" PRId32 ") is invalid", section.name.c_str(), tmp); + errx("\"%s\"'s section size ($%" PRIx32 ") is invalid", section.name.c_str(), tmp); section.size = tmp; section.offset = 0; tryGetc( @@ -379,7 +379,7 @@ static void readSection( tryReadLong(tmp, file, "%s: Cannot read \"%s\"'s org: %s", fileName, section.name.c_str()); section.isAddressFixed = tmp >= 0; if (tmp > UINT16_MAX) { - error(nullptr, 0, "\"%s\"'s org is too large (%" PRId32 ")", section.name.c_str(), tmp); + error(nullptr, 0, "\"%s\"'s org is too large ($%" PRIx32 ")", section.name.c_str(), tmp); tmp = UINT16_MAX; } section.org = tmp; @@ -405,7 +405,7 @@ static void readSection( error( nullptr, 0, - "\"%s\"'s alignment offset is too large (%" PRId32 ")", + "\"%s\"'s alignment offset is too large ($%" PRIx32 ")", section.name.c_str(), tmp ); diff --git a/src/link/patch.cpp b/src/link/patch.cpp index a3724519..1d7d2764 100644 --- a/src/link/patch.cpp +++ b/src/link/patch.cpp @@ -101,9 +101,10 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector const &fil case RPN_DIV: value = popRPN(patch); if (value == 0) { - if (!isError) + if (!isError) { error(patch.src, patch.lineNo, "Division by 0"); - isError = true; + isError = true; + } popRPN(patch); value = INT32_MAX; } else { @@ -113,9 +114,10 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector const &fil case RPN_MOD: value = popRPN(patch); if (value == 0) { - if (!isError) + if (!isError) { error(patch.src, patch.lineNo, "Modulo by 0"); - isError = true; + isError = true; + } popRPN(patch); value = 0; } else { @@ -128,9 +130,10 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector const &fil case RPN_EXP: value = popRPN(patch); if (value < 0) { - if (!isError) - error(patch.src, patch.lineNo, "Exponent by negative"); - isError = true; + if (!isError) { + error(patch.src, patch.lineNo, "Exponent by negative value %" PRId32, value); + isError = true; + } popRPN(patch); value = 0; } else { @@ -342,9 +345,17 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector const &fil case RPN_HRAM: value = popRPN(patch); - if (!isError && (value < 0 || (value > 0xFF && value < 0xFF00) || value > 0xFFFF)) { - error(patch.src, patch.lineNo, "Value %" PRId32 " is not in HRAM range", value); - isError = true; + if (value < 0 || (value > 0xFF && value < 0xFF00) || value > 0xFFFF) { + if (!isError) { + error( + patch.src, + patch.lineNo, + "Address $%" PRIx32 " for LDH is not in HRAM range", + value + ); + isError = true; + } + value = 0; } value &= 0xFF; break; @@ -354,9 +365,11 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector const &fil // Acceptable values are 0x00, 0x08, 0x10, ..., 0x38 // They can be easily checked with a bitmask if (value & ~0x38) { - if (!isError) - error(patch.src, patch.lineNo, "Value %" PRId32 " is not a RST vector", value); - isError = true; + if (!isError) { + error(patch.src, patch.lineNo, "Value $%" PRIx32 " is not a RST vector", value); + isError = true; + } + value = 0; } value |= 0xC7; break; diff --git a/test/link/ldh-bad.asm b/test/link/ldh-bad.asm new file mode 100644 index 00000000..2bd5912e --- /dev/null +++ b/test/link/ldh-bad.asm @@ -0,0 +1,2 @@ +SECTION "bad", ROM0 + ldh [$1234+@], a diff --git a/test/link/ldh-bad.out b/test/link/ldh-bad.out new file mode 100644 index 00000000..1103de1e --- /dev/null +++ b/test/link/ldh-bad.out @@ -0,0 +1,2 @@ +error: ldh-bad.asm(2): Address $1234 for LDH is not in HRAM range +Linking failed with 1 error diff --git a/test/link/rst-bad.out b/test/link/rst-bad.out index e315a01b..283eac92 100644 --- a/test/link/rst-bad.out +++ b/test/link/rst-bad.out @@ -1,2 +1,2 @@ -error: rst-bad.asm(2): Value 1 is not a RST vector +error: rst-bad.asm(2): Value $1 is not a RST vector Linking failed with 1 error