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 #