From 0ee9b2e446198746c3a05b142ecd00784becf727 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt 
Date: Wed, 14 Oct 2015 22:52:09 +0200
Subject: [PATCH] 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     #