From b92683ed4331df6c7f1a3d09f2be8e60902290c3 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 25 Apr 2021 20:48:21 -0400 Subject: [PATCH] REL DS calculation is based on the total segment size, not the current file. additionally, it was block moving the size of the DS fill rather than the size of the relocation records. --- src/link/linker.1.s | 16 ++++++++++++---- testdata/3012-rel-ds-1.S | 6 ++++++ testdata/3012-rel-ds-2.S | 16 ++++++++++++++++ testdata/3012-rel-ds-3.S | 9 +++++++++ testdata/3012-rel-ds-link.S | 15 +++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 testdata/3012-rel-ds-1.S create mode 100644 testdata/3012-rel-ds-2.S create mode 100644 testdata/3012-rel-ds-3.S create mode 100644 testdata/3012-rel-ds-link.S diff --git a/src/link/linker.1.s b/src/link/linker.1.s index 60f5ca5..242d7bc 100644 --- a/src/link/linker.1.s +++ b/src/link/linker.1.s @@ -1800,7 +1800,7 @@ lnkop sec bit :dsvalid jpl :xit ldy :dsy - lda :aux + lda :rel and #$FF eor #$FF inc @@ -1820,6 +1820,15 @@ lnkop sec psl :handle _GetHandleSize pll :size + + sec + lda :size + sbc :aux + sta :rsize + lda :size+2 + sbc #0 + sta :rsize+2 + lda :more clc adc :size @@ -1867,9 +1876,7 @@ lnkop sec sta :dest+2 psl :src psl :dest - pea $00 - lda :more - pha + psl :rsize _BlockMove ldy :aux ldx #$00 @@ -1912,6 +1919,7 @@ lnkop sec :dest ds 4 :byte ds 2 :temp ds 4 +:rsize ds 4 :constrainterr php rep $30 diff --git a/testdata/3012-rel-ds-1.S b/testdata/3012-rel-ds-1.S new file mode 100644 index 0000000..33ea185 --- /dev/null +++ b/testdata/3012-rel-ds-1.S @@ -0,0 +1,6 @@ + rel + + nop + nop + + sav 3012-rel-ds-1.L diff --git a/testdata/3012-rel-ds-2.S b/testdata/3012-rel-ds-2.S new file mode 100644 index 0000000..037d488 --- /dev/null +++ b/testdata/3012-rel-ds-2.S @@ -0,0 +1,16 @@ + rel + + +a ent +b ent +c ent + nop + nop + +* should generate $100 - 4 bytes of $ff since 2 bytes in first file, 2 bytes above. +* extra ent labels to verify the DS padding algorithm adjusts the relacation records. + + ds \,$ff +d ent + + sav 3012-rel-ds-2.L diff --git a/testdata/3012-rel-ds-3.S b/testdata/3012-rel-ds-3.S new file mode 100644 index 0000000..01e981f --- /dev/null +++ b/testdata/3012-rel-ds-3.S @@ -0,0 +1,9 @@ + rel + + ext a,b,c,d + + dw a,b,c,d + + ds \,$00 + + sav 3012-rel-ds-3.L diff --git a/testdata/3012-rel-ds-link.S b/testdata/3012-rel-ds-link.S new file mode 100644 index 0000000..914a5af --- /dev/null +++ b/testdata/3012-rel-ds-link.S @@ -0,0 +1,15 @@ +* +* test rel DS \ command to verify it uses the current segment offset, +* not the current file offset. +* + + ovr all + asm 3012-rel-ds-1.S + asm 3012-rel-ds-2.S + asm 3012-rel-ds-3.S + + lnk 3012-rel-ds-1.L + lnk 3012-rel-ds-2.L + lnk 3012-rel-ds-3.L + + sav 3012-rel-ds