From a3a22733f8f83f0cf8547a9d2cf34d8056b97c97 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Sun, 13 Mar 2016 14:32:07 +0100 Subject: [PATCH] Cleaned up C64 linker configs. The BSS segment and the ONCE segment share the same start address. So they need to be placed in two different memory areas. So far BSS was placed in the MAIN memory area and ONCE was placed in an additional memory area. Both memory areas were written to the output file. They just "happened" to be loadable and runnable at a stretch. Now ONCE is placed in the MAIN memory area and BSS is placed in an additional memory area. Only MAIN is written to the output file. It becomes more obvious that BSS is "just" defined to share memory with ONCE. --- cfg/c64-asm.cfg | 2 +- cfg/c64-overlay.cfg | 10 +++++----- cfg/c64.cfg | 16 ++++++++-------- libsrc/c64/crt0.s | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cfg/c64-asm.cfg b/cfg/c64-asm.cfg index 224bd704a..25d12ee71 100644 --- a/cfg/c64-asm.cfg +++ b/cfg/c64-asm.cfg @@ -10,11 +10,11 @@ MEMORY { MAIN: file = %O, start = %S, size = $D000 - %S; } SEGMENTS { + ZEROPAGE: load = ZP, type = zp, optional = yes; LOADADDR: load = LOADADDR, type = ro; EXEHDR: load = MAIN, type = ro, optional = yes; CODE: load = MAIN, type = rw, optional = yes; RODATA: load = MAIN, type = ro, optional = yes; DATA: load = MAIN, type = rw, optional = yes; BSS: load = MAIN, type = bss, optional = yes; - ZEROPAGE: load = ZP, type = zp, optional = yes; } diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 872fdd775..e88bffe00 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -1,5 +1,5 @@ FEATURES { - STARTADDRESS: default = $0801; + STARTADDRESS: default = $0801; } SYMBOLS { __LOADADDR__: type = import; @@ -14,8 +14,8 @@ MEMORY { ZP: file = "", define = yes, start = $0002, size = $001A; LOADADDR: file = %O, start = %S - 2, size = $0002; HEADER: file = %O, define = yes, start = %S, size = $000D; - MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__; - INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__; + MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __HEADER_LAST__; + BSS: file = "", start = __ONCE_RUN__, size = __OVERLAYSTART__ - __STACKSIZE__ - __ONCE_RUN__; OVL1ADDR: file = "%O.1", start = __OVERLAYSTART__ - 2, size = $0002; OVL1: file = "%O.1", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; OVL2ADDR: file = "%O.2", start = __OVERLAYSTART__ - 2, size = $0002; @@ -45,8 +45,8 @@ SEGMENTS { RODATA: load = MAIN, type = ro; DATA: load = MAIN, type = rw; INIT: load = MAIN, type = rw; - BSS: load = MAIN, type = bss, define = yes; - ONCE: load = INIT, type = ro; + ONCE: load = MAIN, type = ro, define = yes; + BSS: load = BSS, type = bss, define = yes; OVL1ADDR: load = OVL1ADDR, type = ro; OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; OVL2ADDR: load = OVL2ADDR, type = ro; diff --git a/cfg/c64.cfg b/cfg/c64.cfg index 3735a0a65..43ccce2ca 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -1,5 +1,5 @@ FEATURES { - STARTADDRESS: default = $0801; + STARTADDRESS: default = $0801; } SYMBOLS { __LOADADDR__: type = import; @@ -8,11 +8,11 @@ SYMBOLS { __HIMEM__: type = weak, value = $D000; } MEMORY { - ZP: file = "", define = yes, start = $0002, size = $001A; - LOADADDR: file = %O, start = %S - 2, size = $0002; - HEADER: file = %O, define = yes, start = %S, size = $000D; - MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__; - INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__; + ZP: file = "", define = yes, start = $0002, size = $001A; + LOADADDR: file = %O, start = %S - 2, size = $0002; + HEADER: file = %O, define = yes, start = %S, size = $000D; + MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __HEADER_LAST__; + BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__; } SEGMENTS { ZEROPAGE: load = ZP, type = zp; @@ -24,8 +24,8 @@ SEGMENTS { RODATA: load = MAIN, type = ro; DATA: load = MAIN, type = rw; INIT: load = MAIN, type = rw; - BSS: load = MAIN, type = bss, define = yes; - ONCE: load = INIT, type = ro, define = yes; + ONCE: load = MAIN, type = ro, define = yes; + BSS: load = BSS, type = bss, define = yes; } FEATURES { CONDES: type = constructor, diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index c8a7386cb..7bd294ca7 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -93,8 +93,8 @@ L1: lda sp,x ; Set up the stack. - lda #<(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__) - ldx #>(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__) + lda #<(__MAIN_START__ + __MAIN_SIZE__) + ldx #>(__MAIN_START__ + __MAIN_SIZE__) sta sp stx sp+1 ; Set argument stack ptr -- 2.39.5