diff --git a/src/link/section.c b/src/link/section.c index 4f3a6823..6c87094d 100644 --- a/src/link/section.c +++ b/src/link/section.c @@ -165,6 +165,9 @@ static void mergeSections(struct Section *target, struct Section *other, enum Se if (!target->data) errx(1, "Failed to concatenate \"%s\"'s fragments", target->name); memcpy(target->data + target->size - other->size, other->data, other->size); + /* Adjust patches' PC offsets */ + for (uint32_t patchID = 0; patchID < other->nbPatches; patchID++) + other->patches[patchID].pcOffset += other->offset; } break; diff --git a/test/link/section-fragment/jr-offset-load/a.asm b/test/link/section-fragment/jr-offset-load/a.asm new file mode 100644 index 00000000..825a41fe --- /dev/null +++ b/test/link/section-fragment/jr-offset-load/a.asm @@ -0,0 +1,4 @@ +SECTION FRAGMENT "output", ROM0 +LOAD FRAGMENT "loaded", SRAM + ds 128 +ENDL diff --git a/test/link/section-fragment/jr-offset-load/b.asm b/test/link/section-fragment/jr-offset-load/b.asm new file mode 100644 index 00000000..2b1af8f9 --- /dev/null +++ b/test/link/section-fragment/jr-offset-load/b.asm @@ -0,0 +1,6 @@ +SECTION FRAGMENT "output", ROM0 +LOAD FRAGMENT "loaded", SRAM +label: + jr nz, label2 +label2: +ENDL diff --git a/test/link/section-fragment/jr-offset-load/ref.out.bin b/test/link/section-fragment/jr-offset-load/ref.out.bin new file mode 100644 index 00000000..55edf813 Binary files /dev/null and b/test/link/section-fragment/jr-offset-load/ref.out.bin differ diff --git a/test/link/section-fragment/jr-offset/a.asm b/test/link/section-fragment/jr-offset/a.asm new file mode 100644 index 00000000..f3db7ecd --- /dev/null +++ b/test/link/section-fragment/jr-offset/a.asm @@ -0,0 +1,2 @@ +SECTION FRAGMENT "output", ROM0 + ds 128 diff --git a/test/link/section-fragment/jr-offset/b.asm b/test/link/section-fragment/jr-offset/b.asm new file mode 100644 index 00000000..a28c42bd --- /dev/null +++ b/test/link/section-fragment/jr-offset/b.asm @@ -0,0 +1,4 @@ +SECTION FRAGMENT "output", ROM0 +label: + jr nz, label2 +label2: diff --git a/test/link/section-fragment/jr-offset/ref.out.bin b/test/link/section-fragment/jr-offset/ref.out.bin new file mode 100644 index 00000000..55edf813 Binary files /dev/null and b/test/link/section-fragment/jr-offset/ref.out.bin differ diff --git a/test/link/test.sh b/test/link/test.sh index e47d3c51..f90e1059 100755 --- a/test/link/test.sh +++ b/test/link/test.sh @@ -151,6 +151,24 @@ rc=$(($? || $rc)) tryCmp overlay/out.gb $gbtemp rc=$(($? || $rc)) +i="section-fragment/jr-offset.asm" +startTest +$RGBASM -o $otemp section-fragment/jr-offset/a.asm +$RGBASM -o $gbtemp2 section-fragment/jr-offset/b.asm +rgblinkQuiet -o $gbtemp $otemp $gbtemp2 +dd if=$gbtemp count=1 bs=$(printf %s $(wc -c < section-fragment/jr-offset/ref.out.bin)) > $otemp 2>/dev/null +tryCmp section-fragment/jr-offset/ref.out.bin $otemp +rc=$(($? || $rc)) + +i="section-fragment/jr-offset-load.asm" +startTest +$RGBASM -o $otemp section-fragment/jr-offset-load/a.asm +$RGBASM -o $gbtemp2 section-fragment/jr-offset-load/b.asm +rgblinkQuiet -o $gbtemp $otemp $gbtemp2 +dd if=$gbtemp count=1 bs=$(printf %s $(wc -c < section-fragment/jr-offset-load/ref.out.bin)) > $otemp 2>/dev/null +tryCmp section-fragment/jr-offset-load/ref.out.bin $otemp +rc=$(($? || $rc)) + i="section-union/good.asm" startTest $RGBASM -o $otemp section-union/good/a.asm