Have jr offset wrap with 16 bits

Overflow with `int16_t` is defined to two's complement so it's OK
This could trigger when jumping from the top of ROM0 to HRAM
This commit is contained in:
ISSOtm
2020-01-02 14:03:54 +01:00
parent 8a1e920e23
commit 3564b3f9ea

View File

@@ -299,11 +299,11 @@ static void applyPatches(struct Section *section, void *arg)
struct Patch *patch = &section->patches[patchID];
int32_t value = computeRPNExpr(patch, section);
/* `jr` is quite unlike the others... */
if (patch->type == PATCHTYPE_JR) {
/* `jr` is quite unlike the others... */
uint16_t address = section->org + patch->offset;
/* Target is relative to the byte *after* the operand */
int32_t offset = value - (address + 1);
uint16_t address = section->org + patch->offset + 1;
int16_t offset = value - address;
if (offset < -128 || offset > 127)
errx(1, "%s(%d): jr target out of reach (%d)",