From 074e10d28877647862d2dc94c2a8ce93e07585a1 Mon Sep 17 00:00:00 2001 From: Greg King Date: Mon, 5 Oct 2015 05:47:43 -0400 Subject: [PATCH 1/8] Adapted, to the c64 target, the INIT-segment overlay scheme from the apple2 targets. When a program starts running, INIT is moved from one place to another place. Then, INIT's code is executed; and, the first place is re-used for variables. After the INIT code has finished, the second place can be re-used by the heap and the C stack. That means that initiation code and data won't waste any RAM space after they stop being needed. --- asminc/c64.inc | 2 +- cfg/c64-overlay.cfg | 112 +++++++++++++++++++++------------------ cfg/c64.cfg | 35 ++++++------ libsrc/c64/crt0.s | 101 +++++++++++++++++++++++------------ libsrc/common/moveinit.s | 54 +++++++++++++++++++ 5 files changed, 200 insertions(+), 104 deletions(-) create mode 100644 libsrc/common/moveinit.s diff --git a/asminc/c64.inc b/asminc/c64.inc index 5815bebf9..ababb1ea0 100644 --- a/asminc/c64.inc +++ b/asminc/c64.inc @@ -24,6 +24,7 @@ SCREEN_PTR := $D1 ; Pointer to current char in text screen CURS_X := $D3 ; Cursor column CURS_Y := $D6 ; Cursor row CRAM_PTR := $F3 ; Pointer to current char in color RAM +FREKZP := $FB ; Five unused bytes BASIC_BUF := $200 ; Location of command-line BASIC_BUF_LEN = 89 ; Maximum length of command-line @@ -212,4 +213,3 @@ CASSMOT = $20 ; Cassette motor on TP_FAST = $80 ; Switch Rossmoeller TurboProcess to fast mode RAMONLY = $F8 ; (~(LORAM | HIRAM | IOEN)) & $FF - diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 2f7693e6e..58612e18e 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -1,64 +1,70 @@ +FEATURES { + STARTADDRESS: default = $0801; +} SYMBOLS { __LOADADDR__: type = import; __EXEHDR__: type = import; __OVERLAYADDR__: type = import; - __STACKSIZE__: type = weak, value = $0800; # 2k stack - __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay + __STACKSIZE__: type = weak, value = $0800; # 2k stack + __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay + __HIMEM__: type = weak, value = $D000; + __HIMEM2__: type = export, value = __HIMEM__ - 2; } MEMORY { - ZP: file = "", define = yes, start = $0002, size = $001A; - LOADADDR: file = %O, start = $07FF, size = $0002; - HEADER: file = %O, start = $0801, size = $000C; - RAM: file = %O, define = yes, start = $080D, size = $C7F3 - __OVERLAYSIZE__ - __STACKSIZE__; - OVL1ADDR: file = "%O.1", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL1: file = "%O.1", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL2ADDR: file = "%O.2", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL2: file = "%O.2", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL3ADDR: file = "%O.3", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL3: file = "%O.3", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL4ADDR: file = "%O.4", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL4: file = "%O.4", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL5ADDR: file = "%O.5", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL5: file = "%O.5", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL6ADDR: file = "%O.6", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL6: file = "%O.6", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL7ADDR: file = "%O.7", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL7: file = "%O.7", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL8ADDR: file = "%O.8", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL8: file = "%O.8", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL9ADDR: file = "%O.9", start = $CFFE - __OVERLAYSIZE__, size = $0002; - OVL9: file = "%O.9", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + 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; + RAM: file = %O, start = __HEADER_LAST__, size = __HIMEM__ - __OVERLAYSIZE__ - __STACKSIZE__ - __HEADER_LAST__; + MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; + OVL1ADDR: file = "%O.1", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL1: file = "%O.1", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL2ADDR: file = "%O.2", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL2: file = "%O.2", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL3ADDR: file = "%O.3", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL3: file = "%O.3", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL4ADDR: file = "%O.4", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL4: file = "%O.4", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL5ADDR: file = "%O.5", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL5: file = "%O.5", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL6ADDR: file = "%O.6", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL6: file = "%O.6", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL7ADDR: file = "%O.7", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL7: file = "%O.7", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL8ADDR: file = "%O.8", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL8: file = "%O.8", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + OVL9ADDR: file = "%O.9", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; + OVL9: file = "%O.9", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; } SEGMENTS { - LOADADDR: load = LOADADDR, type = ro; - EXEHDR: load = HEADER, type = ro; - STARTUP: load = RAM, type = ro; - LOWCODE: load = RAM, type = ro, optional = yes; - INIT: load = RAM, type = ro, define = yes, optional = yes; - CODE: load = RAM, type = ro; - RODATA: load = RAM, type = ro; - DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; - BSS: load = RAM, type = bss, define = yes; - ZEROPAGE: load = ZP, type = zp; - OVL1ADDR: load = OVL1ADDR, type = ro; - OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; - OVL2ADDR: load = OVL2ADDR, type = ro; - OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes; - OVL3ADDR: load = OVL3ADDR, type = ro; - OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes; - OVL4ADDR: load = OVL4ADDR, type = ro; - OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes; - OVL5ADDR: load = OVL5ADDR, type = ro; - OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes; - OVL6ADDR: load = OVL6ADDR, type = ro; - OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes; - OVL7ADDR: load = OVL7ADDR, type = ro; - OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes; - OVL8ADDR: load = OVL8ADDR, type = ro; - OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes; - OVL9ADDR: load = OVL9ADDR, type = ro; - OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes; + ZEROPAGE: load = ZP, type = zp; + LOADADDR: load = LOADADDR, type = ro; + EXEHDR: load = HEADER, type = ro; + STARTUP: load = RAM, type = ro; + LOWCODE: load = RAM, type = ro, optional = yes; + CODE: load = RAM, type = ro; + RODATA: load = RAM, type = ro; + DATA: load = RAM, type = rw; + ZPSAVE: load = RAM, type = bss, define = yes; + BSS: load = RAM, type = bss, define = yes; + INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; + OVL1ADDR: load = OVL1ADDR, type = ro; + OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; + OVL2ADDR: load = OVL2ADDR, type = ro; + OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes; + OVL3ADDR: load = OVL3ADDR, type = ro; + OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes; + OVL4ADDR: load = OVL4ADDR, type = ro; + OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes; + OVL5ADDR: load = OVL5ADDR, type = ro; + OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes; + OVL6ADDR: load = OVL6ADDR, type = ro; + OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes; + OVL7ADDR: load = OVL7ADDR, type = ro; + OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes; + OVL8ADDR: load = OVL8ADDR, type = ro; + OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes; + OVL9ADDR: load = OVL9ADDR, type = ro; + OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes; } FEATURES { CONDES: type = constructor, diff --git a/cfg/c64.cfg b/cfg/c64.cfg index 5d8befd02..861e19faf 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -1,26 +1,31 @@ +FEATURES { + STARTADDRESS: default = $0801; +} SYMBOLS { __LOADADDR__: type = import; __EXEHDR__: type = import; __STACKSIZE__: type = weak, value = $0800; # 2k stack + __HIMEM__: type = weak, value = $D000; } MEMORY { - ZP: file = "", define = yes, start = $0002, size = $001A; - LOADADDR: file = %O, start = $07FF, size = $0002; - HEADER: file = %O, start = $0801, size = $000C; - RAM: file = %O, define = yes, start = $080D, size = $C7F3 - __STACKSIZE__; + 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; + RAM: file = %O, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__; + MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; } SEGMENTS { - LOADADDR: load = LOADADDR, type = ro; - EXEHDR: load = HEADER, type = ro; - STARTUP: load = RAM, type = ro; - LOWCODE: load = RAM, type = ro, optional = yes; - INIT: load = RAM, type = ro, define = yes, optional = yes; - CODE: load = RAM, type = ro; - RODATA: load = RAM, type = ro; - DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; - BSS: load = RAM, type = bss, define = yes; - ZEROPAGE: load = ZP, type = zp; + ZEROPAGE: load = ZP, type = zp; + LOADADDR: load = LOADADDR, type = ro; + EXEHDR: load = HEADER, type = ro; + STARTUP: load = RAM, type = ro; + LOWCODE: load = RAM, type = ro, optional = yes; + CODE: load = RAM, type = ro; + RODATA: load = RAM, type = ro; + DATA: load = RAM, type = rw; + ZPSAVE: load = RAM, type = bss, define = yes; + BSS: load = RAM, type = bss, define = yes; + INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; } FEATURES { CONDES: type = constructor, diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index 24fe4376b..5a69f1584 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -3,13 +3,13 @@ ; .export _exit + .exportzp init_load_, init_run_ .export __STARTUP__ : absolute = 1 ; Mark as startup + .import initlib, donelib - .import zerobss - .import callmain + .import move_init, zerobss, callmain .import RESTOR, BSOUT, CLRCH - .import __RAM_START__, __RAM_SIZE__ ; Linker generated - .import __STACKSIZE__ ; Linker generated + .import __HIMEM__ ; from configure file .importzp ST .include "zeropage.inc" @@ -19,18 +19,17 @@ ; ------------------------------------------------------------------------ ; Startup code +; Two zero-page pointers are needed before any zero-page stuff is saved. +; Choose locations that are not used by anything. + +init_load_ := FREKZP +init_run_ := FREKZP+2 + + .segment "STARTUP" Start: -; Save the zero-page locations that we need. - - ldx #zpspace-1 -L1: lda sp,x - sta zpsave,x - dex - bpl L1 - ; Switch to the second charset. lda #14 @@ -39,35 +38,30 @@ L1: lda sp,x ; Switch off the BASIC ROM. lda $01 - pha ; Remember the value + sta mmusave ; Save the memory configuration and #$F8 ora #$06 ; Enable Kernal+I/O, disable BASIC sta $01 -; Clear the BSS data. - - jsr zerobss - -; Save some system settings; and, set up the stack. - - pla - sta mmusave ; Save the memory configuration - tsx stx spsave ; Save the system stack ptr - lda #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) - sta sp - lda #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) - sta sp+1 ; Set argument stack ptr +; Allow some re-entrancy by skipping the next task if it already was done. +; This often can let us rerun the program without reloading it. -; Call the module constructors. + ldx moveinit + beq L0 - jsr initlib +; Move the INIT segment from where it was loaded (over ZPSAVE and BSS) +; into where it must be run (in the heap). -; Push the command-line arguments; and, call main(). + jsr move_init + dec moveinit ; set to false - jsr callmain +; Save space by putting the rest of the start-up code in the INIT segment, +; which can be re-used by the heap. + +L0: jsr initstart ; Back from main() [this is also the exit() entry]. Run the module destructors. @@ -98,14 +92,51 @@ L2: lda zpsave,x rts + +; ------------------------------------------------------------------------ + +.segment "INIT" + +initstart: + +; Save the zero-page locations that we need. + + ldx #zpspace-1 +L1: lda sp,x + sta zpsave,x + dex + bpl L1 + +; Clear the BSS data. + + jsr zerobss + +; Set up the stack. + + lda #<__HIMEM__ + ldx #>__HIMEM__ + sta sp + stx sp+1 ; Set argument stack ptr + +; Call the module constructors. + + jsr initlib + +; Push the command-line arguments; and, call main(). + + jmp callmain + + ; ------------------------------------------------------------------------ ; Data +.data + +mmusave:.res 1 +spsave: .res 1 +moveinit: + .byte 1 + .segment "ZPSAVE" zpsave: .res zpspace - -.bss - -spsave: .res 1 -mmusave:.res 1 diff --git a/libsrc/common/moveinit.s b/libsrc/common/moveinit.s new file mode 100644 index 000000000..e9cd5fb64 --- /dev/null +++ b/libsrc/common/moveinit.s @@ -0,0 +1,54 @@ +; +; 2015-10-04, Greg King +; + + .export move_init + + .import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated + .importzp init_load_, init_run_ + + .macpack cpu + .macpack generic + + +; Move the INIT segment from where it was loaded (over the bss segments) +; into where it must be run (in the heap). The two areas might overlap; and, +; the segment is moved upwards. Therefore, this code starts at the highest +; address, and decrements to the lowest address. The low bytes of the starting +; pointers are not sums. The high bytes are sums; but, they do not include the +; carry. Both the low-byte sums and the carries will be done when the pointers +; are indexed by the .Y register. + +move_init: + lda #<__INIT_LOAD__ + ldx #>__INIT_LOAD__ + >__INIT_SIZE__ + sta init_load_ + stx init_load_+1 + lda #<__INIT_RUN__ + ldx #>__INIT_RUN__ + >__INIT_SIZE__ + sta init_run_ + stx init_run_+1 + +; First, move the last, partial page. +; Then, move all of the full pages. + + ldx #>__INIT_SIZE__ + 1 ; number of pages, including partial + ldy #<__INIT_SIZE__ ; size of partial page +.if .cpu & CPU_ISET_65SC02 + bra L3 +.else + jmp L3 +.endif + +L1: dec init_load_+1 + dec init_run_+1 + +L2: dey + lda (init_load_),y + sta (init_run_),y + tya +L3: bnz L2 ; page not finished + + dex + bnz L1 ; move next page + rts From 8a880580dc08238fd4f05e18e27c23316d47a167 Mon Sep 17 00:00:00 2001 From: Greg King Date: Wed, 7 Oct 2015 14:56:14 -0400 Subject: [PATCH 2/8] Reduced the size of the moveinit subroutine. Made other changes that were recommended by Oliver. * Changed its name from move_init to moveinit. * Used self-modifying code in the subroutine. * The INIT segment doesn't need to be optional (it's used by the start-up file). --- cfg/c64-overlay.cfg | 2 +- cfg/c64.cfg | 2 +- libsrc/c64/crt0.s | 22 +++++++-------------- libsrc/common/moveinit.s | 41 ++++++++++++++++------------------------ 4 files changed, 25 insertions(+), 42 deletions(-) diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 58612e18e..5d0f611cb 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -46,7 +46,7 @@ SEGMENTS { DATA: load = RAM, type = rw; ZPSAVE: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; - INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; + INIT: load = MOVE, run = RAM, type = ro, 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 861e19faf..e4e275f2e 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -25,7 +25,7 @@ SEGMENTS { DATA: load = RAM, type = rw; ZPSAVE: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; - INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; + INIT: load = MOVE, run = RAM, type = ro, define = yes; } FEATURES { CONDES: type = constructor, diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index 5a69f1584..4953d4ade 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -3,12 +3,11 @@ ; .export _exit - .exportzp init_load_, init_run_ .export __STARTUP__ : absolute = 1 ; Mark as startup .import initlib, donelib - .import move_init, zerobss, callmain - .import RESTOR, BSOUT, CLRCH + .import moveinit, zerobss, callmain + .import BSOUT .import __HIMEM__ ; from configure file .importzp ST @@ -19,13 +18,6 @@ ; ------------------------------------------------------------------------ ; Startup code -; Two zero-page pointers are needed before any zero-page stuff is saved. -; Choose locations that are not used by anything. - -init_load_ := FREKZP -init_run_ := FREKZP+2 - - .segment "STARTUP" Start: @@ -49,17 +41,17 @@ Start: ; Allow some re-entrancy by skipping the next task if it already was done. ; This often can let us rerun the program without reloading it. - ldx moveinit + ldx move_init beq L0 ; Move the INIT segment from where it was loaded (over ZPSAVE and BSS) ; into where it must be run (in the heap). - jsr move_init - dec moveinit ; set to false + jsr moveinit + dec move_init ; set to false ; Save space by putting the rest of the start-up code in the INIT segment, -; which can be re-used by the heap. +; which can be re-used by the heap and the C stack. L0: jsr initstart @@ -134,7 +126,7 @@ L1: lda sp,x mmusave:.res 1 spsave: .res 1 -moveinit: +move_init: .byte 1 .segment "ZPSAVE" diff --git a/libsrc/common/moveinit.s b/libsrc/common/moveinit.s index e9cd5fb64..2186adf0e 100644 --- a/libsrc/common/moveinit.s +++ b/libsrc/common/moveinit.s @@ -1,16 +1,19 @@ ; -; 2015-10-04, Greg King +; 2015-10-07, Greg King ; - .export move_init + .export moveinit .import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated - .importzp init_load_, init_run_ .macpack cpu .macpack generic +; Put this in the DATA segment because it is self-modifying code. + +.data + ; Move the INIT segment from where it was loaded (over the bss segments) ; into where it must be run (in the heap). The two areas might overlap; and, ; the segment is moved upwards. Therefore, this code starts at the highest @@ -19,36 +22,24 @@ ; carry. Both the low-byte sums and the carries will be done when the pointers ; are indexed by the .Y register. -move_init: - lda #<__INIT_LOAD__ - ldx #>__INIT_LOAD__ + >__INIT_SIZE__ - sta init_load_ - stx init_load_+1 - lda #<__INIT_RUN__ - ldx #>__INIT_RUN__ + >__INIT_SIZE__ - sta init_run_ - stx init_run_+1 +moveinit: ; First, move the last, partial page. ; Then, move all of the full pages. - ldx #>__INIT_SIZE__ + 1 ; number of pages, including partial ldy #<__INIT_SIZE__ ; size of partial page -.if .cpu & CPU_ISET_65SC02 - bra L3 -.else - jmp L3 -.endif + ldx #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0) ; number of pages, including partial -L1: dec init_load_+1 - dec init_run_+1 - -L2: dey - lda (init_load_),y - sta (init_run_),y +L1: dey +init_load: + lda __INIT_LOAD__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y +init_run: + sta __INIT_RUN__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y tya -L3: bnz L2 ; page not finished + bnz L1 ; page not finished + dec init_load+2 + dec init_run+2 dex bnz L1 ; move next page rts From ca70700a0b730ca546c715f159a32d86b5cd0165 Mon Sep 17 00:00:00 2001 From: Greg King Date: Thu, 8 Oct 2015 05:05:48 -0400 Subject: [PATCH 3/8] Restored the old C-stack initiation code. I had forgotten that the stack must be put below the CBM overlays. --- cfg/c64-overlay.cfg | 2 +- cfg/c64.cfg | 2 +- libsrc/c64/crt0.s | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 5d0f611cb..a95c1f6ef 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -14,7 +14,7 @@ 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; - RAM: file = %O, start = __HEADER_LAST__, size = __HIMEM__ - __OVERLAYSIZE__ - __STACKSIZE__ - __HEADER_LAST__; + RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __OVERLAYSIZE__ - __STACKSIZE__ - __HEADER_LAST__; MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; OVL1ADDR: file = "%O.1", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; OVL1: file = "%O.1", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; diff --git a/cfg/c64.cfg b/cfg/c64.cfg index e4e275f2e..8fe1c0c6f 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -11,7 +11,7 @@ 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; - RAM: file = %O, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__; + RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__; MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; } SEGMENTS { diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index 4953d4ade..a846897fe 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -8,7 +8,8 @@ .import initlib, donelib .import moveinit, zerobss, callmain .import BSOUT - .import __HIMEM__ ; from configure file + .import __RAM_START__, __RAM_SIZE__ ; Linker generated + .import __STACKSIZE__ ; from configure file .importzp ST .include "zeropage.inc" @@ -105,8 +106,8 @@ L1: lda sp,x ; Set up the stack. - lda #<__HIMEM__ - ldx #>__HIMEM__ + lda #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) + ldx #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) sta sp stx sp+1 ; Set argument stack ptr From 8b89f4f5a6f58763826f378da8cbf20e4a74d999 Mon Sep 17 00:00:00 2001 From: Greg King Date: Thu, 8 Oct 2015 06:11:37 -0400 Subject: [PATCH 4/8] Reduced c64-overlay.cfg's size by factoring out a different common expression. --- cfg/c64-overlay.cfg | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index a95c1f6ef..07ce9e4b6 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -1,39 +1,39 @@ FEATURES { - STARTADDRESS: default = $0801; + STARTADDRESS: default = $0801; } SYMBOLS { - __LOADADDR__: type = import; - __EXEHDR__: type = import; - __OVERLAYADDR__: type = import; - __STACKSIZE__: type = weak, value = $0800; # 2k stack - __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay - __HIMEM__: type = weak, value = $D000; - __HIMEM2__: type = export, value = __HIMEM__ - 2; + __LOADADDR__: type = import; + __EXEHDR__: type = import; + __OVERLAYADDR__: type = import; + __STACKSIZE__: type = weak, value = $0800; # 2k stack + __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay + __HIMEM__: type = weak, value = $D000; + __OVERLAYSTART__: type = export, value = __HIMEM__ - __OVERLAYSIZE__; } 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; - RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __OVERLAYSIZE__ - __STACKSIZE__ - __HEADER_LAST__; - MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; - OVL1ADDR: file = "%O.1", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL1: file = "%O.1", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL2ADDR: file = "%O.2", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL2: file = "%O.2", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL3ADDR: file = "%O.3", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL3: file = "%O.3", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL4ADDR: file = "%O.4", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL4: file = "%O.4", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL5ADDR: file = "%O.5", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL5: file = "%O.5", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL6ADDR: file = "%O.6", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL6: file = "%O.6", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL7ADDR: file = "%O.7", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL7: file = "%O.7", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL8ADDR: file = "%O.8", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL8: file = "%O.8", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; - OVL9ADDR: file = "%O.9", start = __HIMEM2__ - __OVERLAYSIZE__, size = $0002; - OVL9: file = "%O.9", start = __HIMEM__ - __OVERLAYSIZE__, size = __OVERLAYSIZE__; + 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; + RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__; + MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_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; + OVL2: file = "%O.2", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL3ADDR: file = "%O.3", start = __OVERLAYSTART__ - 2, size = $0002; + OVL3: file = "%O.3", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL4ADDR: file = "%O.4", start = __OVERLAYSTART__ - 2, size = $0002; + OVL4: file = "%O.4", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL5ADDR: file = "%O.5", start = __OVERLAYSTART__ - 2, size = $0002; + OVL5: file = "%O.5", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL6ADDR: file = "%O.6", start = __OVERLAYSTART__ - 2, size = $0002; + OVL6: file = "%O.6", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL7ADDR: file = "%O.7", start = __OVERLAYSTART__ - 2, size = $0002; + OVL7: file = "%O.7", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL8ADDR: file = "%O.8", start = __OVERLAYSTART__ - 2, size = $0002; + OVL8: file = "%O.8", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; + OVL9ADDR: file = "%O.9", start = __OVERLAYSTART__ - 2, size = $0002; + OVL9: file = "%O.9", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; } SEGMENTS { ZEROPAGE: load = ZP, type = zp; From 8c609dd931106e73ccc5ee576d0a5ee832a1072e Mon Sep 17 00:00:00 2001 From: Greg King Date: Fri, 9 Oct 2015 12:00:41 -0400 Subject: [PATCH 5/8] Explained why two variables were moved out of the BSS segment. --- libsrc/c64/crt0.s | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index a846897fe..a2abe91af 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -40,7 +40,7 @@ Start: stx spsave ; Save the system stack ptr ; Allow some re-entrancy by skipping the next task if it already was done. -; This often can let us rerun the program without reloading it. +; This sometimes can let us rerun the program without reloading it. ldx move_init beq L0 @@ -125,8 +125,12 @@ L1: lda sp,x .data +; These two variables were moved out of the BSS segment, and into DATA, because +; we need to use them before INIT is moved off of BSS, and before BSS is zeroed. + mmusave:.res 1 spsave: .res 1 + move_init: .byte 1 From 023b461bb8a9ad86c22d3c8624d48895d38b1dd1 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Wed, 14 Oct 2015 11:50:54 +0200 Subject: [PATCH 6/8] According to the contributor the VGA data is accessed only by the constructor. --- libsrc/pce/conio.s | 1 - 1 file changed, 1 deletion(-) diff --git a/libsrc/pce/conio.s b/libsrc/pce/conio.s index 64df87018..b2bb0f9d5 100644 --- a/libsrc/pce/conio.s +++ b/libsrc/pce/conio.s @@ -113,6 +113,5 @@ fillloop: rts - .rodata font: .include "vga.inc" From 0ee9b2e446198746c3a05b142ecd00784becf727 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Wed, 14 Oct 2015 22:52:09 +0200 Subject: [PATCH 7/8] Changed run location of INIT segment. So far the INIT segment was run from the later heap+stack. Now the INIT segment is run from the later BSS. The background is that so far the INIT segment was pretty small (from $80 to $180 bytes). But upcoming changes will increase the INIT segment in certain scenarios up to ~ $1000 bytes. So programs with very limited heap+stack might just not been able to move the INIT segment to its run location. But moving the INIT segment to the later BSS allows it to occupy the later BSS+heap+stack. In order to allow that the constructors are _NOT_ allowed anymore to access the BSS. Rather they must use the DATA segment or the new INITBSS segment. The latter isn't cleared at any point so the constructors may use it to expose values to the main program. However they must make sure to always write the values as they are not pre-initialized. --- cfg/c128-overlay.cfg | 2 +- cfg/c128.cfg | 2 +- cfg/c16.cfg | 2 +- cfg/c64-overlay.cfg | 63 ++++++++++++++++++++------------------- cfg/c64.cfg | 33 ++++++++++---------- cfg/cbm510.cfg | 1 + cfg/cbm610.cfg | 1 + cfg/pet.cfg | 2 +- cfg/plus4.cfg | 2 +- cfg/vic20-32k.cfg | 2 +- cfg/vic20.cfg | 2 +- libsrc/atari/initcwd.s | 2 ++ libsrc/c128/crt0.s | 2 +- libsrc/c128/mainargs.s | 31 +++++++++---------- libsrc/c16/crt0.s | 2 +- libsrc/c16/mainargs.s | 31 +++++++++---------- libsrc/c64/crt0.s | 40 ++++++++++++------------- libsrc/c64/mainargs.s | 31 +++++++++---------- libsrc/cbm/filedes.s | 14 ++++++--- libsrc/cbm/filevars.s | 2 +- libsrc/cbm/read.s | 5 ---- libsrc/cbm/write.s | 10 ------- libsrc/cbm510/mainargs.s | 40 ++++++++++++------------- libsrc/cbm610/mainargs.s | 46 ++++++++++++++-------------- libsrc/common/_cwd.s | 5 ++-- libsrc/common/moveinit.s | 4 +-- libsrc/common/zerobss.s | 5 +--- libsrc/pet/crt0.s | 2 +- libsrc/pet/mainargs.s | 29 +++++++++--------- libsrc/plus4/crt0.s | 2 +- libsrc/plus4/mainargs.s | 34 ++++++++++----------- libsrc/runtime/callmain.s | 6 ++-- libsrc/runtime/stkchk.s | 6 ++-- libsrc/vic20/crt0.s | 2 +- libsrc/vic20/mainargs.s | 31 +++++++++---------- 35 files changed, 234 insertions(+), 260 deletions(-) diff --git a/cfg/c128-overlay.cfg b/cfg/c128-overlay.cfg index e16ad4b2e..f2cc3c40c 100644 --- a/cfg/c128-overlay.cfg +++ b/cfg/c128-overlay.cfg @@ -38,7 +38,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; OVL1ADDR: load = OVL1ADDR, type = ro; diff --git a/cfg/c128.cfg b/cfg/c128.cfg index 0e1259111..ef2aa4184 100644 --- a/cfg/c128.cfg +++ b/cfg/c128.cfg @@ -18,7 +18,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/cfg/c16.cfg b/cfg/c16.cfg index 78c1739d3..efb42991f 100644 --- a/cfg/c16.cfg +++ b/cfg/c16.cfg @@ -18,7 +18,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 07ce9e4b6..1c3b19c09 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -14,8 +14,9 @@ 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; - RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__; - MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_RUN__; + MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__; + MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__; + INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_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; @@ -36,35 +37,35 @@ MEMORY { OVL9: file = "%O.9", start = __OVERLAYSTART__, size = __OVERLAYSIZE__; } SEGMENTS { - ZEROPAGE: load = ZP, type = zp; - LOADADDR: load = LOADADDR, type = ro; - EXEHDR: load = HEADER, type = ro; - STARTUP: load = RAM, type = ro; - LOWCODE: load = RAM, type = ro, optional = yes; - CODE: load = RAM, type = ro; - RODATA: load = RAM, type = ro; - DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; - BSS: load = RAM, type = bss, define = yes; - INIT: load = MOVE, run = RAM, type = ro, define = yes; - OVL1ADDR: load = OVL1ADDR, type = ro; - OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; - OVL2ADDR: load = OVL2ADDR, type = ro; - OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes; - OVL3ADDR: load = OVL3ADDR, type = ro; - OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes; - OVL4ADDR: load = OVL4ADDR, type = ro; - OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes; - OVL5ADDR: load = OVL5ADDR, type = ro; - OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes; - OVL6ADDR: load = OVL6ADDR, type = ro; - OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes; - OVL7ADDR: load = OVL7ADDR, type = ro; - OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes; - OVL8ADDR: load = OVL8ADDR, type = ro; - OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes; - OVL9ADDR: load = OVL9ADDR, type = ro; - OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes; + ZEROPAGE: load = ZP, type = zp; + LOADADDR: load = LOADADDR, type = ro; + EXEHDR: load = HEADER, type = ro; + STARTUP: load = MAIN, type = ro; + LOWCODE: load = MAIN, type = ro, optional = yes; + CODE: load = MAIN, type = ro; + RODATA: load = MAIN, type = ro; + DATA: load = MAIN, type = rw; + INITBSS: load = MAIN, type = bss, define = yes; + BSS: load = MAIN, type = bss, define = yes; + INIT: load = MOVE, run = INIT, type = ro, define = yes; + OVL1ADDR: load = OVL1ADDR, type = ro; + OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; + OVL2ADDR: load = OVL2ADDR, type = ro; + OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes; + OVL3ADDR: load = OVL3ADDR, type = ro; + OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes; + OVL4ADDR: load = OVL4ADDR, type = ro; + OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes; + OVL5ADDR: load = OVL5ADDR, type = ro; + OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes; + OVL6ADDR: load = OVL6ADDR, type = ro; + OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes; + OVL7ADDR: load = OVL7ADDR, type = ro; + OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes; + OVL8ADDR: load = OVL8ADDR, type = ro; + OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes; + OVL9ADDR: load = OVL9ADDR, type = ro; + OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes; } FEATURES { CONDES: type = constructor, diff --git a/cfg/c64.cfg b/cfg/c64.cfg index 8fe1c0c6f..2a105c7f1 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -8,24 +8,25 @@ 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; - RAM: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__; - MOVE: file = %O, start = __ZPSAVE_LOAD__, size = __HIMEM__ - __INIT_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__ - __STACKSIZE__ - __HEADER_LAST__; + MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__; + INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__; } SEGMENTS { - ZEROPAGE: load = ZP, type = zp; - LOADADDR: load = LOADADDR, type = ro; - EXEHDR: load = HEADER, type = ro; - STARTUP: load = RAM, type = ro; - LOWCODE: load = RAM, type = ro, optional = yes; - CODE: load = RAM, type = ro; - RODATA: load = RAM, type = ro; - DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; - BSS: load = RAM, type = bss, define = yes; - INIT: load = MOVE, run = RAM, type = ro, define = yes; + ZEROPAGE: load = ZP, type = zp; + LOADADDR: load = LOADADDR, type = ro; + EXEHDR: load = HEADER, type = ro; + STARTUP: load = MAIN, type = ro; + LOWCODE: load = MAIN, type = ro, optional = yes; + CODE: load = MAIN, type = ro; + RODATA: load = MAIN, type = ro; + DATA: load = MAIN, type = rw; + INITBSS: load = MAIN, type = bss, define = yes; + BSS: load = MAIN, type = bss, define = yes; + INIT: load = MOVE, run = INIT, type = ro, define = yes; } FEATURES { CONDES: type = constructor, diff --git a/cfg/cbm510.cfg b/cfg/cbm510.cfg index 7635c6eeb..d0775b6f2 100644 --- a/cfg/cbm510.cfg +++ b/cfg/cbm510.cfg @@ -22,6 +22,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = rw, define = yes; diff --git a/cfg/cbm610.cfg b/cfg/cbm610.cfg index 48b5eba0c..ae66f4c4a 100644 --- a/cfg/cbm610.cfg +++ b/cfg/cbm610.cfg @@ -19,6 +19,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = rw, define = yes; diff --git a/cfg/pet.cfg b/cfg/pet.cfg index ef8b82e54..80d89ee50 100644 --- a/cfg/pet.cfg +++ b/cfg/pet.cfg @@ -18,7 +18,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/cfg/plus4.cfg b/cfg/plus4.cfg index c756f45a1..6eeddf12e 100644 --- a/cfg/plus4.cfg +++ b/cfg/plus4.cfg @@ -18,7 +18,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/cfg/vic20-32k.cfg b/cfg/vic20-32k.cfg index c66b35247..23cd718df 100644 --- a/cfg/vic20-32k.cfg +++ b/cfg/vic20-32k.cfg @@ -20,7 +20,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/cfg/vic20.cfg b/cfg/vic20.cfg index f356eb61e..9a5ce9a63 100644 --- a/cfg/vic20.cfg +++ b/cfg/vic20.cfg @@ -18,7 +18,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss; + INITBSS: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } diff --git a/libsrc/atari/initcwd.s b/libsrc/atari/initcwd.s index d7b574314..074b9476f 100644 --- a/libsrc/atari/initcwd.s +++ b/libsrc/atari/initcwd.s @@ -9,6 +9,8 @@ .proc initcwd + lda #0 + sta __cwd jsr findfreeiocb bne oserr lda #GETCWD diff --git a/libsrc/c128/crt0.s b/libsrc/c128/crt0.s index 9bfdca49f..4c6a0f7d9 100644 --- a/libsrc/c128/crt0.s +++ b/libsrc/c128/crt0.s @@ -108,7 +108,7 @@ L2: lda zpsave,x ; ------------------------------------------------------------------------ ; Data -.segment "ZPSAVE" +.segment "INITBSS" zpsave: .res zpspace diff --git a/libsrc/c128/mainargs.s b/libsrc/c128/mainargs.s index fb5fd1554..dcd5a11bd 100644 --- a/libsrc/c128/mainargs.s +++ b/libsrc/c128/mainargs.s @@ -30,8 +30,7 @@ MAXARGS = 10 ; Maximum number of arguments allowed REM = $8f ; BASIC token-code -NAME_LEN = 16 ; maximum length of command-name - +NAME_LEN = 16 ; Maximum length of command-name ; Get possible command-line arguments. Goes into the special INIT segment, ; which may be reused after the startup code is run @@ -42,26 +41,26 @@ initmainargs: ; Assume that the program was loaded, a moment ago, by the traditional LOAD ; statement. Save the "most-recent filename" as argument #0. -; Because the buffer, that we're copying into, was zeroed out, -; we don't need to add a NUL character. -; + + lda #0 ; The terminating NUL character ldy FNAM_LEN cpy #NAME_LEN + 1 bcc L1 - ldy #NAME_LEN - 1 ; limit the length + ldy #NAME_LEN ; Limit the length + bne L1 ; Branch always L0: lda #FNAM ; Load vector address for FETCH routine ldx FNAM_BANK ; Load bank for FETCH routine jsr INDFET ; Load byte from (FETVEC),y - sta name,y ; Save byte from filename -L1: dey +L1: sta name,y ; Save byte from filename + dey bpl L0 inc __argc ; argc always is equal to, at least, 1 ; Find the "rem" token. -; + ldx #0 L2: lda BASIC_BUF,x - beq done ; no "rem," no args. + beq done ; No "rem," no args. inx cmp #REM bne L2 @@ -73,7 +72,7 @@ next: lda BASIC_BUF,x beq done ; End of line reached inx cmp #' ' ; Skip leading spaces - beq next ; + beq next ; Found start of next argument. We've incremented the pointer in X already, so ; it points to the second character of the argument. This is useful since we @@ -128,15 +127,13 @@ done: lda #(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) + lda #<(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__) + ldx #>(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__) sta sp stx sp+1 ; Set argument stack ptr ; Call the module constructors. - jsr initlib - -; Push the command-line arguments; and, call main(). - - jmp callmain + jmp initlib ; ------------------------------------------------------------------------ @@ -134,6 +134,6 @@ spsave: .res 1 move_init: .byte 1 -.segment "ZPSAVE" +.segment "INITBSS" zpsave: .res zpspace diff --git a/libsrc/c64/mainargs.s b/libsrc/c64/mainargs.s index 1c9031eb0..a31c1b54f 100644 --- a/libsrc/c64/mainargs.s +++ b/libsrc/c64/mainargs.s @@ -28,10 +28,9 @@ .include "c64.inc" - MAXARGS = 10 ; Maximum number of arguments allowed REM = $8f ; BASIC token-code -NAME_LEN = 16 ; maximum length of command-name +NAME_LEN = 16 ; Maximum length of command-name ; Get possible command-line arguments. Goes into the special INIT segment, ; which may be reused after the startup code is run @@ -42,24 +41,24 @@ initmainargs: ; Assume that the program was loaded, a moment ago, by the traditional LOAD ; statement. Save the "most-recent filename" as argument #0. -; Because the buffer, that we're copying into, was zeroed out, -; we don't need to add a NUL character. -; + + lda #0 ; The terminating NUL character ldy FNAM_LEN cpy #NAME_LEN + 1 bcc L1 - ldy #NAME_LEN - 1 ; limit the length + ldy #NAME_LEN ; Limit the length + bne L1 ; Branch always L0: lda (FNAM),y - sta name,y -L1: dey +L1: sta name,y + dey bpl L0 inc __argc ; argc always is equal to, at least, 1 ; Find the "rem" token. -; + ldx #0 L2: lda BASIC_BUF,x - beq done ; no "rem," no args. + beq done ; No "rem," no args. inx cmp #REM bne L2 @@ -71,7 +70,7 @@ next: lda BASIC_BUF,x beq done ; End of line reached inx cmp #' ' ; Skip leading spaces - beq next ; + beq next ; Found start of next argument. We've incremented the pointer in X already, so ; it points to the second character of the argument. This is useful since we @@ -126,15 +125,13 @@ done: lda #argv sta __argv stx __argv + 1 rts -; These arrays are zeroed before initmainargs is called. -; char name[16+1]; -; char* argv[MAXARGS+1]={name}; -; -.bss +.segment "INITBSS" + term: .res 1 name: .res NAME_LEN + 1 .data + +; char* argv[MAXARGS+1]={name}; argv: .addr name - .res MAXARGS * 2, $00 + .res MAXARGS * 2 diff --git a/libsrc/cbm610/mainargs.s b/libsrc/cbm610/mainargs.s index 9388eac81..02461ac26 100644 --- a/libsrc/cbm610/mainargs.s +++ b/libsrc/cbm610/mainargs.s @@ -31,10 +31,9 @@ .macpack generic - MAXARGS = 10 ; Maximum number of arguments allowed REM = $8f ; BASIC token-code -NAME_LEN = 16 ; maximum length of command-name +NAME_LEN = 16 ; Maximum length of command-name ; Get possible command-line arguments. Goes into the special INIT segment, ; which may be reused after the startup code is run. @@ -45,9 +44,7 @@ initmainargs: ; Assume that the program was loaded, a moment ago, by the traditional LOAD ; statement. Save the "most-recent filename" as argument #0. -; Because the buffer, that we're copying into, was zeroed out, -; we don't need to add a NUL character. -; + jsr sys_bank ldy #FNAM lda (sysp0),y ; Get file-name pointer from system bank @@ -61,40 +58,42 @@ initmainargs: ldy #FNAM_LEN lda (sysp0),y tay + lda #0 ; The terminating NUL character stx IndReg ; Look for name in correct bank cpy #NAME_LEN + 1 blt L1 - ldy #NAME_LEN - 1 ; limit the length + ldy #NAME_LEN ; Limit the length + bne L1 ; Branch always L0: lda (ptr1),y - sta name,y -L1: dey +L1: sta name,y + dey bpl L0 jsr restore_bank inc __argc ; argc always is equal to at least 1 ; Find a "rem" token. -; + ldx #0 L2: lda BASIC_BUF,x - bze done ; no "rem," no args. + bze done ; No "rem," no args. inx cmp #REM bne L2 ldy #1 * 2 ; Find the next argument. -; + next: lda BASIC_BUF,x bze done ; End of line reached inx cmp #' ' ; Skip leading spaces - beq next ; + beq next ; Found start of next argument. We've incremented the pointer in X already, so ; it points to the second character of the argument. That is useful because we ; will check now for a quoted argument; in which case, we will have to skip that ; first character. -; + found: cmp #'"' ; Is the argument quoted? beq setterm ; Jump if so dex ; Reset pointer to first argument character @@ -102,7 +101,7 @@ found: cmp #'"' ; Is the argument quoted? setterm:sta term ; Set end-of-argument marker ; Now, store a pointer to the argument into the next slot. -; + txa ; Get low byte add #argv sta __argv stx __argv + 1 rts -; These arrays are zeroed before initmainargs is called. -; char name[16+1]; -; char* argv[MAXARGS+1]={name}; -; -.bss +.segment "INITBSS" + term: .res 1 name: .res NAME_LEN + 1 .data + +; char* argv[MAXARGS+1]={name}; argv: .addr name - .res MAXARGS * 2, $00 + .res MAXARGS * 2 diff --git a/libsrc/common/_cwd.s b/libsrc/common/_cwd.s index eeda10f1d..7b4031f52 100644 --- a/libsrc/common/_cwd.s +++ b/libsrc/common/_cwd.s @@ -14,12 +14,12 @@ .import initcwd .include "stdio.inc" - + __cwd_buf_size = FILENAME_MAX cwd_init := initcwd -.bss +.segment "INITBSS" __cwd: .res __cwd_buf_size @@ -29,4 +29,3 @@ __cwd: .res __cwd_buf_size ; checking the other sources. .assert __cwd_buf_size < 256, error, "__cwd_buf_size must not be > 255" - diff --git a/libsrc/common/moveinit.s b/libsrc/common/moveinit.s index 2186adf0e..2b22be02d 100644 --- a/libsrc/common/moveinit.s +++ b/libsrc/common/moveinit.s @@ -15,8 +15,8 @@ .data ; Move the INIT segment from where it was loaded (over the bss segments) -; into where it must be run (in the heap). The two areas might overlap; and, -; the segment is moved upwards. Therefore, this code starts at the highest +; into where it must be run (over the BSS segment). The two areas might overlap; +; and, the segment is moved upwards. Therefore, this code starts at the highest ; address, and decrements to the lowest address. The low bytes of the starting ; pointers are not sums. The high bytes are sums; but, they do not include the ; carry. Both the low-byte sums and the carries will be done when the pointers diff --git a/libsrc/common/zerobss.s b/libsrc/common/zerobss.s index de160aeef..2c500f773 100644 --- a/libsrc/common/zerobss.s +++ b/libsrc/common/zerobss.s @@ -9,7 +9,7 @@ .importzp ptr1 -.segment "INIT" +.code zerobss: lda #<__BSS_RUN__ @@ -41,6 +41,3 @@ L3: cpy #<__BSS_SIZE__ ; Done L4: rts - - - diff --git a/libsrc/pet/crt0.s b/libsrc/pet/crt0.s index 66aed0366..c1c805308 100644 --- a/libsrc/pet/crt0.s +++ b/libsrc/pet/crt0.s @@ -94,7 +94,7 @@ L2: lda zpsave,x ; ------------------------------------------------------------------------ -.segment "ZPSAVE" +.segment "INITBSS" zpsave: .res zpspace diff --git a/libsrc/pet/mainargs.s b/libsrc/pet/mainargs.s index 0d5b18987..8ba6e3117 100644 --- a/libsrc/pet/mainargs.s +++ b/libsrc/pet/mainargs.s @@ -12,7 +12,7 @@ MAXARGS = 10 ; Maximum number of arguments allowed REM = $8f ; BASIC token-code -NAME_LEN = 16 ; maximum length of command-name +NAME_LEN = 16 ; Maximum length of command-name ;--------------------------------------------------------------------------- @@ -25,24 +25,24 @@ NAME_LEN = 16 ; maximum length of command-name ; Assume that the program was loaded, a moment ago, by the traditional LOAD ; statement. Save the "most-recent filename" as argument #0. -; Because the buffer, that we're copying into, was zeroed out, -; we don't need to add a NUL character. -; + + lda #0 ; The terminating NUL character ldy FNLEN cpy #NAME_LEN + 1 bcc L1 - ldy #NAME_LEN - 1 ; limit the length + ldy #NAME_LEN ; Limit the length + bne L1 ; Branch always L0: lda (FNADR),y - sta name,y -L1: dey +L1: sta name,y + dey bpl L0 inc __argc ; argc always is equal to, at least, 1 ; Find the "rem" token. -; + ldx #0 L2: lda BASIC_BUF,x - beq done ; no "rem," no args. + beq done ; No "rem," no args. inx cmp #REM bne L2 @@ -54,7 +54,7 @@ next: lda BASIC_BUF,x beq done ; End of line reached inx cmp #' ' ; Skip leading spaces - beq next ; + beq next ; Found start of next argument. We've incremented the pointer in X already, so ; it points to the second character of the argument. This is useful since we @@ -111,14 +111,13 @@ done: lda # Date: Thu, 15 Oct 2015 00:15:38 +0200 Subject: [PATCH 8/8] Adjusted current working directory initialization on Apple and Atari. Moving __cwd from BSS into INITBSS does of course ;-) not only impact the CBM targets but all targets with disk I/O support. Note: Code using `__cwd-1` may trigger an ld65 range error because __cwd may end up at the very begining of a segment. As far as I see this is an ld65 bug which I'm not try to fix - at least here. --- cfg/apple2-overlay.cfg | 4 ++-- cfg/apple2-system.cfg | 4 ++-- cfg/apple2.cfg | 4 ++-- cfg/apple2enh-overlay.cfg | 4 ++-- cfg/apple2enh-system.cfg | 4 ++-- cfg/apple2enh.cfg | 4 ++-- cfg/atari-cart.cfg | 1 + cfg/atari-cassette.cfg | 1 + cfg/atari-overlay.cfg | 1 + cfg/atari.cfg | 1 + cfg/atarixl-largehimem.cfg | 1 + cfg/atarixl-overlay.cfg | 1 + cfg/atarixl.cfg | 1 + libsrc/apple2/crt0.s | 20 ++++++++++---------- libsrc/apple2/initcwd.s | 13 +++++++------ libsrc/atari/initcwd.s | 8 ++++---- 16 files changed, 40 insertions(+), 32 deletions(-) diff --git a/cfg/apple2-overlay.cfg b/cfg/apple2-overlay.cfg index d0b34692f..244e4582f 100644 --- a/cfg/apple2-overlay.cfg +++ b/cfg/apple2-overlay.cfg @@ -18,7 +18,7 @@ SYMBOLS { __STACKSIZE__: type = weak, value = $0800; # 2k stack __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -45,7 +45,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/apple2-system.cfg b/cfg/apple2-system.cfg index 33ab04f5e..f07208e45 100644 --- a/cfg/apple2-system.cfg +++ b/cfg/apple2-system.cfg @@ -5,7 +5,7 @@ SYMBOLS { __LCSIZE__: type = weak, value = $0C00; # Rest of bank two __STACKSIZE__: type = weak, value = $0800; # 2k stack __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -21,7 +21,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/apple2.cfg b/cfg/apple2.cfg index 5673302d1..27eb706c4 100644 --- a/cfg/apple2.cfg +++ b/cfg/apple2.cfg @@ -10,7 +10,7 @@ SYMBOLS { __LCSIZE__: type = weak, value = $0C00; # Rest of bank two __STACKSIZE__: type = weak, value = $0800; # 2k stack __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -28,7 +28,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/apple2enh-overlay.cfg b/cfg/apple2enh-overlay.cfg index d0b34692f..244e4582f 100644 --- a/cfg/apple2enh-overlay.cfg +++ b/cfg/apple2enh-overlay.cfg @@ -18,7 +18,7 @@ SYMBOLS { __STACKSIZE__: type = weak, value = $0800; # 2k stack __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -45,7 +45,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/apple2enh-system.cfg b/cfg/apple2enh-system.cfg index 33ab04f5e..f07208e45 100644 --- a/cfg/apple2enh-system.cfg +++ b/cfg/apple2enh-system.cfg @@ -5,7 +5,7 @@ SYMBOLS { __LCSIZE__: type = weak, value = $0C00; # Rest of bank two __STACKSIZE__: type = weak, value = $0800; # 2k stack __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -21,7 +21,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/apple2enh.cfg b/cfg/apple2enh.cfg index 5673302d1..27eb706c4 100644 --- a/cfg/apple2enh.cfg +++ b/cfg/apple2enh.cfg @@ -10,7 +10,7 @@ SYMBOLS { __LCSIZE__: type = weak, value = $0C00; # Rest of bank two __STACKSIZE__: type = weak, value = $0800; # 2k stack __LOADADDR__: type = weak, value = __STARTUP_RUN__; - __LOADSIZE__: type = weak, value = __ZPSAVE_RUN__ - __STARTUP_RUN__ + + __LOADSIZE__: type = weak, value = __INITBSS_RUN__ - __STARTUP_RUN__ + __MOVE_LAST__ - __MOVE_START__; } MEMORY { @@ -28,7 +28,7 @@ SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + INITBSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes; INIT: load = MOVE, run = RAM, type = ro, define = yes, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes; diff --git a/cfg/atari-cart.cfg b/cfg/atari-cart.cfg index db9486a9f..58457c606 100644 --- a/cfg/atari-cart.cfg +++ b/cfg/atari-cart.cfg @@ -22,6 +22,7 @@ SEGMENTS { CODE: load = ROM, type = ro, define = yes; RODATA: load = ROM, type = ro, optional = yes; DATA: load = ROM, run = RAM, type = rw, define = yes, optional = yes; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes, optional = yes; CARTHDR: load = CARTID, type = ro; ZEROPAGE: load = ZP, type = zp, optional = yes; diff --git a/cfg/atari-cassette.cfg b/cfg/atari-cassette.cfg index 2116aecd0..80b5c695f 100644 --- a/cfg/atari-cassette.cfg +++ b/cfg/atari-cassette.cfg @@ -19,6 +19,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro, optional = yes; DATA: load = RAM, type = rw, optional = yes; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes, optional = yes; ZEROPAGE: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/cfg/atari-overlay.cfg b/cfg/atari-overlay.cfg index 1d339b208..b3abad988 100644 --- a/cfg/atari-overlay.cfg +++ b/cfg/atari-overlay.cfg @@ -49,6 +49,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/cfg/atari.cfg b/cfg/atari.cfg index dce593f05..97b289d7e 100644 --- a/cfg/atari.cfg +++ b/cfg/atari.cfg @@ -37,6 +37,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/cfg/atarixl-largehimem.cfg b/cfg/atarixl-largehimem.cfg index 01fc76a26..f96096995 100644 --- a/cfg/atarixl-largehimem.cfg +++ b/cfg/atarixl-largehimem.cfg @@ -70,6 +70,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/cfg/atarixl-overlay.cfg b/cfg/atarixl-overlay.cfg index 68d0f524e..7356fc03e 100644 --- a/cfg/atarixl-overlay.cfg +++ b/cfg/atarixl-overlay.cfg @@ -82,6 +82,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/cfg/atarixl.cfg b/cfg/atarixl.cfg index aad3ce613..84992a205 100644 --- a/cfg/atarixl.cfg +++ b/cfg/atarixl.cfg @@ -68,6 +68,7 @@ SEGMENTS { CODE: load = RAM, type = ro, define = yes; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; + INITBSS: load = RAM, type = bss, optional = yes; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; EXTZP: load = ZP, type = zp, optional = yes; diff --git a/libsrc/apple2/crt0.s b/libsrc/apple2/crt0.s index 445039b1e..f061b212b 100644 --- a/libsrc/apple2/crt0.s +++ b/libsrc/apple2/crt0.s @@ -11,7 +11,7 @@ .import callmain .import __LC_START__, __LC_LAST__ ; Linker generated .import __INIT_RUN__, __INIT_SIZE__ ; Linker generated - .import __ZPSAVE_RUN__ ; Linker generated + .import __INITBSS_RUN__ ; Linker generated .include "zeropage.inc" .include "apple2.inc" @@ -29,14 +29,14 @@ bit $C081 ; Set the source start address. - lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__) - ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__) + lda #<(__INITBSS_RUN__ + __INIT_SIZE__) + ldy #>(__INITBSS_RUN__ + __INIT_SIZE__) sta $9B sty $9C ; Set the source last address. - lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) - ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) + lda #<(__INITBSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) + ldy #>(__INITBSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) sta $96 sty $97 @@ -51,14 +51,14 @@ jsr $D39A ; BLTU2 ; Set the source start address. - lda #<__ZPSAVE_RUN__ - ldy #>__ZPSAVE_RUN__ + lda #<__INITBSS_RUN__ + ldy #>__INITBSS_RUN__ sta $9B sty $9C ; Set the source last address. - lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__) - ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__) + lda #<(__INITBSS_RUN__ + __INIT_SIZE__) + ldy #>(__INITBSS_RUN__ + __INIT_SIZE__) sta $96 sty $97 @@ -201,7 +201,7 @@ q_param:.byte $04 ; param_count ; Final jump when we're done done: jmp DOSWARM ; Potentially patched at runtime - .segment "ZPSAVE" + .segment "INITBSS" zpsave: .res zpspace diff --git a/libsrc/apple2/initcwd.s b/libsrc/apple2/initcwd.s index 044076e3f..7af29c75e 100644 --- a/libsrc/apple2/initcwd.s +++ b/libsrc/apple2/initcwd.s @@ -21,20 +21,21 @@ initcwd: jsr callmli ; Check for null prefix - lda __cwd + ldx __cwd beq done ; Remove length byte and trailing slash - sta tmp1 - ldx #$01 -: lda __cwd,x - sta __cwd - 1,x + dex + stx tmp1 + ldx #$00 +: lda __cwd + 1,x + sta __cwd,x inx cpx tmp1 bcc :- ; Add terminating zero lda #$00 - sta __cwd - 1,x + sta __cwd,x done: rts diff --git a/libsrc/atari/initcwd.s b/libsrc/atari/initcwd.s index 074b9476f..c292e72c3 100644 --- a/libsrc/atari/initcwd.s +++ b/libsrc/atari/initcwd.s @@ -21,13 +21,13 @@ sta ICBLH,x jsr CIOV bmi oserr - ldx #0 ; ATEOL -> \0 -: lda __cwd,x - inx + ldx #$FF ; ATEOL -> \0 +: inx + lda __cwd,x cmp #ATEOL bne :- lda #0 - sta __cwd-1,x + sta __cwd,x oserr: rts .endproc