1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-07 19:29:18 +00:00

Merge remote-tracking branch 'upstream/master' into soft80

This commit is contained in:
mrdudz 2015-10-15 15:07:44 +02:00
commit 63d4c93006
52 changed files with 396 additions and 331 deletions

View File

@ -24,6 +24,7 @@ SCREEN_PTR := $D1 ; Pointer to current char in text screen
CURS_X := $D3 ; Cursor column CURS_X := $D3 ; Cursor column
CURS_Y := $D6 ; Cursor row CURS_Y := $D6 ; Cursor row
CRAM_PTR := $F3 ; Pointer to current char in color RAM CRAM_PTR := $F3 ; Pointer to current char in color RAM
FREKZP := $FB ; Five unused bytes
BASIC_BUF := $200 ; Location of command-line BASIC_BUF := $200 ; Location of command-line
BASIC_BUF_LEN = 89 ; Maximum length 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 TP_FAST = $80 ; Switch Rossmoeller TurboProcess to fast mode
RAMONLY = $F8 ; (~(LORAM | HIRAM | IOEN)) & $FF RAMONLY = $F8 ; (~(LORAM | HIRAM | IOEN)) & $FF

View File

@ -18,7 +18,7 @@ SYMBOLS {
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -45,7 +45,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -5,7 +5,7 @@ SYMBOLS {
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two __LCSIZE__: type = weak, value = $0C00; # Rest of bank two
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -21,7 +21,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -10,7 +10,7 @@ SYMBOLS {
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two __LCSIZE__: type = weak, value = $0C00; # Rest of bank two
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -28,7 +28,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -18,7 +18,7 @@ SYMBOLS {
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -45,7 +45,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -5,7 +5,7 @@ SYMBOLS {
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two __LCSIZE__: type = weak, value = $0C00; # Rest of bank two
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -21,7 +21,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -10,7 +10,7 @@ SYMBOLS {
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two __LCSIZE__: type = weak, value = $0C00; # Rest of bank two
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__LOADADDR__: type = weak, value = __STARTUP_RUN__; __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__; __MOVE_LAST__ - __MOVE_START__;
} }
MEMORY { MEMORY {
@ -28,7 +28,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; 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; 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, optional = yes;
LC: load = MOVE, run = LC, type = ro, optional = yes; LC: load = MOVE, run = LC, type = ro, optional = yes;

View File

@ -22,6 +22,7 @@ SEGMENTS {
CODE: load = ROM, type = ro, define = yes; CODE: load = ROM, type = ro, define = yes;
RODATA: load = ROM, type = ro, optional = yes; RODATA: load = ROM, type = ro, optional = yes;
DATA: load = ROM, run = RAM, type = rw, define = yes, 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; BSS: load = RAM, type = bss, define = yes, optional = yes;
CARTHDR: load = CARTID, type = ro; CARTHDR: load = CARTID, type = ro;
ZEROPAGE: load = ZP, type = zp, optional = yes; ZEROPAGE: load = ZP, type = zp, optional = yes;

View File

@ -19,6 +19,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro, optional = yes; RODATA: load = RAM, type = ro, optional = yes;
DATA: load = RAM, type = rw, 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; BSS: load = RAM, type = bss, define = yes, optional = yes;
ZEROPAGE: load = ZP, type = zp, optional = yes; ZEROPAGE: load = ZP, type = zp, optional = yes;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -49,6 +49,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss, optional = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -37,6 +37,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss, optional = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -70,6 +70,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss, optional = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -82,6 +82,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss, optional = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -68,6 +68,7 @@ SEGMENTS {
CODE: load = RAM, type = ro, define = yes; CODE: load = RAM, type = ro, define = yes;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss, optional = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = zp, optional = yes; EXTZP: load = ZP, type = zp, optional = yes;

View File

@ -38,7 +38,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
OVL1ADDR: load = OVL1ADDR, type = ro; OVL1ADDR: load = OVL1ADDR, type = ro;

View File

@ -18,7 +18,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -18,7 +18,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -1,64 +1,71 @@
FEATURES {
STARTADDRESS: default = $0801;
}
SYMBOLS { SYMBOLS {
__LOADADDR__: type = import; __LOADADDR__: type = import;
__EXEHDR__: type = import; __EXEHDR__: type = import;
__OVERLAYADDR__: type = import; __OVERLAYADDR__: type = import;
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay __OVERLAYSIZE__: type = weak, value = $1000; # 4k overlay
__HIMEM__: type = weak, value = $D000;
__OVERLAYSTART__: type = export, value = __HIMEM__ - __OVERLAYSIZE__;
} }
MEMORY { MEMORY {
ZP: file = "", define = yes, start = $0002, size = $001A; ZP: file = "", define = yes, start = $0002, size = $001A;
LOADADDR: file = %O, start = $07FF, size = $0002; LOADADDR: file = %O, start = %S - 2, size = $0002;
HEADER: file = %O, start = $0801, size = $000C; HEADER: file = %O, define = yes, start = %S, size = $000D;
RAM: file = %O, define = yes, start = $080D, size = $C7F3 - __OVERLAYSIZE__ - __STACKSIZE__; MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__;
OVL1ADDR: file = "%O.1", start = $CFFE - __OVERLAYSIZE__, size = $0002; MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
OVL1: file = "%O.1", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
OVL2ADDR: file = "%O.2", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL1ADDR: file = "%O.1", start = __OVERLAYSTART__ - 2, size = $0002;
OVL2: file = "%O.2", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL1: file = "%O.1", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL3ADDR: file = "%O.3", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL2ADDR: file = "%O.2", start = __OVERLAYSTART__ - 2, size = $0002;
OVL3: file = "%O.3", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL2: file = "%O.2", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL4ADDR: file = "%O.4", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL3ADDR: file = "%O.3", start = __OVERLAYSTART__ - 2, size = $0002;
OVL4: file = "%O.4", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL3: file = "%O.3", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL5ADDR: file = "%O.5", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL4ADDR: file = "%O.4", start = __OVERLAYSTART__ - 2, size = $0002;
OVL5: file = "%O.5", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL4: file = "%O.4", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL6ADDR: file = "%O.6", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL5ADDR: file = "%O.5", start = __OVERLAYSTART__ - 2, size = $0002;
OVL6: file = "%O.6", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL5: file = "%O.5", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL7ADDR: file = "%O.7", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL6ADDR: file = "%O.6", start = __OVERLAYSTART__ - 2, size = $0002;
OVL7: file = "%O.7", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL6: file = "%O.6", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL8ADDR: file = "%O.8", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL7ADDR: file = "%O.7", start = __OVERLAYSTART__ - 2, size = $0002;
OVL8: file = "%O.8", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; OVL7: file = "%O.7", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL9ADDR: file = "%O.9", start = $CFFE - __OVERLAYSIZE__, size = $0002; OVL8ADDR: file = "%O.8", start = __OVERLAYSTART__ - 2, size = $0002;
OVL9: file = "%O.9", start = $D000 - __OVERLAYSIZE__, size = __OVERLAYSIZE__; 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 { SEGMENTS {
LOADADDR: load = LOADADDR, type = ro; ZEROPAGE: load = ZP, type = zp;
EXEHDR: load = HEADER, type = ro; LOADADDR: load = LOADADDR, type = ro;
STARTUP: load = RAM, type = ro; EXEHDR: load = HEADER, type = ro;
LOWCODE: load = RAM, type = ro, optional = yes; STARTUP: load = MAIN, type = ro;
INIT: load = RAM, type = ro, define = yes, optional = yes; LOWCODE: load = MAIN, type = ro, optional = yes;
CODE: load = RAM, type = ro; CODE: load = MAIN, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = MAIN, type = ro;
DATA: load = RAM, type = rw; DATA: load = MAIN, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = MAIN, type = bss, define = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = MAIN, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; INIT: load = MOVE, run = INIT, type = ro, define = yes;
OVL1ADDR: load = OVL1ADDR, type = ro; OVL1ADDR: load = OVL1ADDR, type = ro;
OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes; OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes;
OVL2ADDR: load = OVL2ADDR, type = ro; OVL2ADDR: load = OVL2ADDR, type = ro;
OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes; OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes;
OVL3ADDR: load = OVL3ADDR, type = ro; OVL3ADDR: load = OVL3ADDR, type = ro;
OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes; OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes;
OVL4ADDR: load = OVL4ADDR, type = ro; OVL4ADDR: load = OVL4ADDR, type = ro;
OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes; OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes;
OVL5ADDR: load = OVL5ADDR, type = ro; OVL5ADDR: load = OVL5ADDR, type = ro;
OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes; OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes;
OVL6ADDR: load = OVL6ADDR, type = ro; OVL6ADDR: load = OVL6ADDR, type = ro;
OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes; OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes;
OVL7ADDR: load = OVL7ADDR, type = ro; OVL7ADDR: load = OVL7ADDR, type = ro;
OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes; OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes;
OVL8ADDR: load = OVL8ADDR, type = ro; OVL8ADDR: load = OVL8ADDR, type = ro;
OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes; OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes;
OVL9ADDR: load = OVL9ADDR, type = ro; OVL9ADDR: load = OVL9ADDR, type = ro;
OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes; OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes;
} }
FEATURES { FEATURES {
CONDES: type = constructor, CONDES: type = constructor,

View File

@ -1,26 +1,32 @@
FEATURES {
STARTADDRESS: default = $0801;
}
SYMBOLS { SYMBOLS {
__LOADADDR__: type = import; __LOADADDR__: type = import;
__EXEHDR__: type = import; __EXEHDR__: type = import;
__STACKSIZE__: type = weak, value = $0800; # 2k stack __STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $D000;
} }
MEMORY { MEMORY {
ZP: file = "", define = yes, start = $0002, size = $001A; ZP: file = "", define = yes, start = $0002, size = $001A;
LOADADDR: file = %O, start = $07FF, size = $0002; LOADADDR: file = %O, start = %S - 2, size = $0002;
HEADER: file = %O, start = $0801, size = $000C; HEADER: file = %O, define = yes, start = %S, size = $000D;
RAM: file = %O, define = yes, start = $080D, size = $C7F3 - __STACKSIZE__; 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 { SEGMENTS {
LOADADDR: load = LOADADDR, type = ro; ZEROPAGE: load = ZP, type = zp;
EXEHDR: load = HEADER, type = ro; LOADADDR: load = LOADADDR, type = ro;
STARTUP: load = RAM, type = ro; EXEHDR: load = HEADER, type = ro;
LOWCODE: load = RAM, type = ro, optional = yes; STARTUP: load = MAIN, type = ro;
INIT: load = RAM, type = ro, define = yes, optional = yes; LOWCODE: load = MAIN, type = ro, optional = yes;
CODE: load = RAM, type = ro; CODE: load = MAIN, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = MAIN, type = ro;
DATA: load = RAM, type = rw; DATA: load = MAIN, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = MAIN, type = bss, define = yes;
BSS: load = RAM, type = bss, define = yes; BSS: load = MAIN, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; INIT: load = MOVE, run = INIT, type = ro, define = yes;
} }
FEATURES { FEATURES {
CONDES: type = constructor, CONDES: type = constructor,

View File

@ -22,6 +22,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = rw, define = yes; EXTZP: load = ZP, type = rw, define = yes;

View File

@ -19,6 +19,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = rw, define = yes; EXTZP: load = ZP, type = rw, define = yes;

View File

@ -18,7 +18,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -18,7 +18,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -20,7 +20,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -18,7 +18,7 @@ SEGMENTS {
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
ZPSAVE: load = RAM, type = bss; INITBSS: load = RAM, type = bss;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp; ZEROPAGE: load = ZP, type = zp;
} }

View File

@ -11,7 +11,7 @@
.import callmain .import callmain
.import __LC_START__, __LC_LAST__ ; Linker generated .import __LC_START__, __LC_LAST__ ; Linker generated
.import __INIT_RUN__, __INIT_SIZE__ ; Linker generated .import __INIT_RUN__, __INIT_SIZE__ ; Linker generated
.import __ZPSAVE_RUN__ ; Linker generated .import __INITBSS_RUN__ ; Linker generated
.include "zeropage.inc" .include "zeropage.inc"
.include "apple2.inc" .include "apple2.inc"
@ -29,14 +29,14 @@
bit $C081 bit $C081
; Set the source start address. ; Set the source start address.
lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__) lda #<(__INITBSS_RUN__ + __INIT_SIZE__)
ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__) ldy #>(__INITBSS_RUN__ + __INIT_SIZE__)
sta $9B sta $9B
sty $9C sty $9C
; Set the source last address. ; Set the source last address.
lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) lda #<(__INITBSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__)
ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) ldy #>(__INITBSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__)
sta $96 sta $96
sty $97 sty $97
@ -51,14 +51,14 @@
jsr $D39A ; BLTU2 jsr $D39A ; BLTU2
; Set the source start address. ; Set the source start address.
lda #<__ZPSAVE_RUN__ lda #<__INITBSS_RUN__
ldy #>__ZPSAVE_RUN__ ldy #>__INITBSS_RUN__
sta $9B sta $9B
sty $9C sty $9C
; Set the source last address. ; Set the source last address.
lda #<(__ZPSAVE_RUN__ + __INIT_SIZE__) lda #<(__INITBSS_RUN__ + __INIT_SIZE__)
ldy #>(__ZPSAVE_RUN__ + __INIT_SIZE__) ldy #>(__INITBSS_RUN__ + __INIT_SIZE__)
sta $96 sta $96
sty $97 sty $97
@ -201,7 +201,7 @@ q_param:.byte $04 ; param_count
; Final jump when we're done ; Final jump when we're done
done: jmp DOSWARM ; Potentially patched at runtime done: jmp DOSWARM ; Potentially patched at runtime
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -21,20 +21,21 @@ initcwd:
jsr callmli jsr callmli
; Check for null prefix ; Check for null prefix
lda __cwd ldx __cwd
beq done beq done
; Remove length byte and trailing slash ; Remove length byte and trailing slash
sta tmp1 dex
ldx #$01 stx tmp1
: lda __cwd,x ldx #$00
sta __cwd - 1,x : lda __cwd + 1,x
sta __cwd,x
inx inx
cpx tmp1 cpx tmp1
bcc :- bcc :-
; Add terminating zero ; Add terminating zero
lda #$00 lda #$00
sta __cwd - 1,x sta __cwd,x
done: rts done: rts

View File

@ -9,6 +9,8 @@
.proc initcwd .proc initcwd
lda #0
sta __cwd
jsr findfreeiocb jsr findfreeiocb
bne oserr bne oserr
lda #GETCWD lda #GETCWD
@ -19,13 +21,13 @@
sta ICBLH,x sta ICBLH,x
jsr CIOV jsr CIOV
bmi oserr bmi oserr
ldx #0 ; ATEOL -> \0 ldx #$FF ; ATEOL -> \0
: lda __cwd,x : inx
inx lda __cwd,x
cmp #ATEOL cmp #ATEOL
bne :- bne :-
lda #0 lda #0
sta __cwd-1,x sta __cwd,x
oserr: rts oserr: rts
.endproc .endproc

View File

@ -108,7 +108,7 @@ L2: lda zpsave,x
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Data ; Data
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -30,8 +30,7 @@
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run ; 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNAM_LEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 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 L0: lda #FNAM ; Load vector address for FETCH routine
ldx FNAM_BANK ; Load bank for FETCH routine ldx FNAM_BANK ; Load bank for FETCH routine
jsr INDFET ; Load byte from (FETVEC),y jsr INDFET ; Load byte from (FETVEC),y
sta name,y ; Save byte from filename L1: sta name,y ; Save byte from filename
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -73,7 +72,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -128,15 +127,13 @@ done: lda #<argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2

View File

@ -90,7 +90,7 @@ L2: lda zpsave,x
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -28,10 +28,9 @@
.include "plus4.inc" .include "plus4.inc"
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run ; which may be reused after the startup code is run
@ -42,25 +41,25 @@ initmainargs:
; Assume that the program was loaded, a moment ago, by the traditional LOAD ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNAM_LEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 bcc L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda #FNAM ; Vector address L0: lda #FNAM ; Vector address
jsr FETCH ; Load byte from RAM jsr FETCH ; Load byte from RAM
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -72,7 +71,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -127,15 +126,13 @@ done: lda #<argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2

View File

@ -4,12 +4,12 @@
.export _exit .export _exit
.export __STARTUP__ : absolute = 1 ; Mark as startup .export __STARTUP__ : absolute = 1 ; Mark as startup
.import initlib, donelib .import initlib, donelib
.import zerobss .import moveinit, zerobss, callmain
.import callmain .import BSOUT
.import RESTOR, BSOUT, CLRCH .import __MAIN_START__, __MAIN_SIZE__ ; Linker generated
.import __RAM_START__, __RAM_SIZE__ ; Linker generated .import __STACKSIZE__ ; from configure file
.import __STACKSIZE__ ; Linker generated
.importzp ST .importzp ST
.include "zeropage.inc" .include "zeropage.inc"
@ -23,14 +23,6 @@
Start: 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. ; Switch to the second charset.
lda #14 lda #14
@ -39,31 +31,34 @@ L1: lda sp,x
; Switch off the BASIC ROM. ; Switch off the BASIC ROM.
lda $01 lda $01
pha ; Remember the value sta mmusave ; Save the memory configuration
and #$F8 and #$F8
ora #$06 ; Enable Kernal+I/O, disable BASIC ora #$06 ; Enable Kernal+I/O, disable BASIC
sta $01 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 tsx
stx spsave ; Save the system stack ptr stx spsave ; Save the system stack ptr
lda #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) ; Allow some re-entrancy by skipping the next task if it already was done.
sta sp ; This sometimes can let us rerun the program without reloading it.
lda #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__)
sta sp+1 ; Set argument stack ptr
; Call the module constructors. ldx move_init
beq L0
jsr initlib ; Move the INIT segment from where it was loaded (over the bss segments)
; into where it must be run (over the BSS segment).
jsr moveinit
dec move_init ; Set to false
; Save space by putting some of the start-up code in the INIT segment,
; which can be re-used by the BSS segment, the heap and the C stack.
L0: jsr runinit
; Clear the BSS data.
jsr zerobss
; Push the command-line arguments; and, call main(). ; Push the command-line arguments; and, call main().
@ -98,14 +93,47 @@ L2: lda zpsave,x
rts rts
; ------------------------------------------------------------------------
.segment "INIT"
runinit:
; Save the zero-page locations that we need.
ldx #zpspace-1
L1: lda sp,x
sta zpsave,x
dex
bpl L1
; Set up the stack.
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.
jmp initlib
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Data ; Data
.segment "ZPSAVE" .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
.segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace
.bss
spsave: .res 1
mmusave:.res 1

View File

@ -28,10 +28,9 @@
.include "c64.inc" .include "c64.inc"
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run ; 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNAM_LEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 bcc L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (FNAM),y L0: lda (FNAM),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -71,7 +70,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -126,15 +125,13 @@ done: lda #<argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2

View File

@ -5,6 +5,7 @@
; ;
.include "cbm.inc"
.include "filedes.inc" .include "filedes.inc"
.code .code
@ -29,9 +30,14 @@ found: rts
;-------------------------------------------------------------------------- ;--------------------------------------------------------------------------
; Data ; Data
.bss .data
fdtab: .res MAX_FDS
unittab:.res MAX_FDS
fdtab: .byte LFN_READ
.byte LFN_WRITE
.byte LFN_WRITE
.res MAX_FDS-3
unittab:.byte CBMDEV_KBD
.byte CBMDEV_SCREEN
.byte CBMDEV_SCREEN
.res MAX_FDS-3

View File

@ -9,7 +9,7 @@
.importzp devnum .importzp devnum
.bss .segment "INITBSS"
curunit: curunit:
.res 1 .res 1

View File

@ -26,11 +26,8 @@
.proc initstdin .proc initstdin
lda #LFN_READ
sta fdtab+STDIN_FILENO
lda #STDIN_FILENO + LFN_OFFS lda #STDIN_FILENO + LFN_OFFS
ldx #CBMDEV_KBD ldx #CBMDEV_KBD
stx unittab+STDIN_FILENO
ldy #$FF ldy #$FF
jsr SETLFS jsr SETLFS
jmp OPEN ; Will always succeed jmp OPEN ; Will always succeed
@ -155,5 +152,3 @@ invalidfd:
.bss .bss
unit: .res 1 unit: .res 1

View File

@ -24,12 +24,6 @@
.proc initstdout .proc initstdout
lda #LFN_WRITE
sta fdtab+STDOUT_FILENO
sta fdtab+STDERR_FILENO
lda #CBMDEV_SCREEN
sta unittab+STDOUT_FILENO
sta unittab+STDERR_FILENO
lda #STDOUT_FILENO + LFN_OFFS lda #STDOUT_FILENO + LFN_OFFS
jsr @L1 jsr @L1
lda #STDERR_FILENO + LFN_OFFS lda #STDERR_FILENO + LFN_OFFS
@ -122,7 +116,3 @@ invalidfd:
jmp __directerrno ; Sets _errno, clears _oserror, returns -1 jmp __directerrno ; Sets _errno, clears _oserror, returns -1
.endproc .endproc

View File

@ -31,10 +31,9 @@
.macpack generic .macpack generic
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run. ; which may be reused after the startup code is run.
@ -61,40 +60,42 @@ initmainargs:
ldy #FNAM_LEN ldy #FNAM_LEN
lda (sysp0),y lda (sysp0),y
tay tay
lda #0 ; The terminating NUL character
stx IndReg ; Look for name in correct bank stx IndReg ; Look for name in correct bank
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
blt L1 blt L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (ptr1),y L0: lda (ptr1),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
jsr restore_bank jsr restore_bank
inc __argc ; argc always is equal to at least 1 inc __argc ; argc always is equal to at least 1
; Find a "rem" token. ; Find a "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
bze done ; no "rem," no args. bze done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
ldy #1 * 2 ldy #1 * 2
; Find the next argument. ; Find the next argument.
;
next: lda BASIC_BUF,x next: lda BASIC_BUF,x
bze done ; End of line reached bze done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; 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 ; will check now for a quoted argument; in which case, we will have to skip that
; first character. ; first character.
;
found: cmp #'"' ; Is the argument quoted? found: cmp #'"' ; Is the argument quoted?
beq setterm ; Jump if so beq setterm ; Jump if so
dex ; Reset pointer to first argument character dex ; Reset pointer to first argument character
@ -102,7 +103,7 @@ found: cmp #'"' ; Is the argument quoted?
setterm:sta term ; Set end-of-argument marker setterm:sta term ; Set end-of-argument marker
; Now, store a pointer to the argument into the next slot. ; Now, store a pointer to the argument into the next slot.
;
txa ; Get low byte txa ; Get low byte
add #<BASIC_BUF add #<BASIC_BUF
sta argv,y ; argv[y]= &arg sta argv,y ; argv[y]= &arg
@ -114,7 +115,7 @@ setterm:sta term ; Set end-of-argument marker
inc __argc ; Found another arg inc __argc ; Found another arg
; Search for the end of the argument. ; Search for the end of the argument.
;
argloop:lda BASIC_BUF,x argloop:lda BASIC_BUF,x
bze done bze done
inx inx
@ -124,7 +125,7 @@ argloop:lda BASIC_BUF,x
; We've found the end of the argument. X points one character behind it, and ; We've found the end of the argument. X points one character behind it, and
; A contains the terminating character. To make the argument a valid C string, ; A contains the terminating character. To make the argument a valid C string,
; replace the terminating character by a zero. ; replace the terminating character by a zero.
;
lda #$00 lda #$00
sta BASIC_BUF-1,x sta BASIC_BUF-1,x
@ -136,21 +137,20 @@ argloop:lda BASIC_BUF,x
blt next ; Parse next one if not blt next ; Parse next one if not
; (The last vector in argv[] already is NULL.) ; (The last vector in argv[] already is NULL.)
;
done: lda #<argv done: lda #<argv
ldx #>argv ldx #>argv
sta __argv sta __argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2, $00 .res MAXARGS * 2

View File

@ -31,10 +31,9 @@
.macpack generic .macpack generic
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run. ; 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 jsr sys_bank
ldy #FNAM ldy #FNAM
lda (sysp0),y ; Get file-name pointer from system bank lda (sysp0),y ; Get file-name pointer from system bank
@ -61,40 +58,42 @@ initmainargs:
ldy #FNAM_LEN ldy #FNAM_LEN
lda (sysp0),y lda (sysp0),y
tay tay
lda #0 ; The terminating NUL character
stx IndReg ; Look for name in correct bank stx IndReg ; Look for name in correct bank
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
blt L1 blt L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (ptr1),y L0: lda (ptr1),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
jsr restore_bank jsr restore_bank
inc __argc ; argc always is equal to at least 1 inc __argc ; argc always is equal to at least 1
; Find a "rem" token. ; Find a "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
bze done ; no "rem," no args. bze done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
ldy #1 * 2 ldy #1 * 2
; Find the next argument. ; Find the next argument.
;
next: lda BASIC_BUF,x next: lda BASIC_BUF,x
bze done ; End of line reached bze done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; 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 ; will check now for a quoted argument; in which case, we will have to skip that
; first character. ; first character.
;
found: cmp #'"' ; Is the argument quoted? found: cmp #'"' ; Is the argument quoted?
beq setterm ; Jump if so beq setterm ; Jump if so
dex ; Reset pointer to first argument character 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 setterm:sta term ; Set end-of-argument marker
; Now, store a pointer to the argument into the next slot. ; Now, store a pointer to the argument into the next slot.
;
txa ; Get low byte txa ; Get low byte
add #<BASIC_BUF add #<BASIC_BUF
sta argv,y ; argv[y]= &arg sta argv,y ; argv[y]= &arg
@ -114,7 +113,7 @@ setterm:sta term ; Set end-of-argument marker
inc __argc ; Found another arg inc __argc ; Found another arg
; Search for the end of the argument. ; Search for the end of the argument.
;
argloop:lda BASIC_BUF,x argloop:lda BASIC_BUF,x
bze done bze done
inx inx
@ -124,33 +123,32 @@ argloop:lda BASIC_BUF,x
; We've found the end of the argument. X points one character behind it, and ; We've found the end of the argument. X points one character behind it, and
; A contains the terminating character. To make the argument a valid C string, ; A contains the terminating character. To make the argument a valid C string,
; replace the terminating character by a zero. ; replace the terminating character by a zero.
;
lda #$00 lda #$00
sta BASIC_BUF-1,x sta BASIC_BUF-1,x
; Check if the maximum number of command-line arguments is reached. If not, ; Check if the maximum number of command-line arguments is reached. If not,
; parse the next one. ; parse the next one.
;
lda __argc ; Get low byte of argument count lda __argc ; Get low byte of argument count
cmp #MAXARGS ; Maximum number of arguments reached? cmp #MAXARGS ; Maximum number of arguments reached?
blt next ; Parse next one if not blt next ; Parse next one if not
; (The last vector in argv[] already is NULL.) ; (The last vector in argv[] already is NULL.)
;
done: lda #<argv done: lda #<argv
ldx #>argv ldx #>argv
sta __argv sta __argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2, $00 .res MAXARGS * 2

View File

@ -14,12 +14,12 @@
.import initcwd .import initcwd
.include "stdio.inc" .include "stdio.inc"
__cwd_buf_size = FILENAME_MAX __cwd_buf_size = FILENAME_MAX
cwd_init := initcwd cwd_init := initcwd
.bss .segment "INITBSS"
__cwd: .res __cwd_buf_size __cwd: .res __cwd_buf_size
@ -29,4 +29,3 @@ __cwd: .res __cwd_buf_size
; checking the other sources. ; checking the other sources.
.assert __cwd_buf_size < 256, error, "__cwd_buf_size must not be > 255" .assert __cwd_buf_size < 256, error, "__cwd_buf_size must not be > 255"

45
libsrc/common/moveinit.s Normal file
View File

@ -0,0 +1,45 @@
;
; 2015-10-07, Greg King
;
.export moveinit
.import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
.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 (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
; are indexed by the .Y register.
moveinit:
; First, move the last, partial page.
; Then, move all of the full pages.
ldy #<__INIT_SIZE__ ; size of partial page
ldx #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0) ; number of pages, including partial
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
bnz L1 ; page not finished
dec init_load+2
dec init_run+2
dex
bnz L1 ; move next page
rts

View File

@ -9,7 +9,7 @@
.importzp ptr1 .importzp ptr1
.segment "INIT" .code
zerobss: zerobss:
lda #<__BSS_RUN__ lda #<__BSS_RUN__
@ -41,6 +41,3 @@ L3: cpy #<__BSS_SIZE__
; Done ; Done
L4: rts L4: rts

View File

@ -113,6 +113,5 @@ fillloop:
rts rts
.rodata
font: font:
.include "vga.inc" .include "vga.inc"

View File

@ -94,7 +94,7 @@ L2: lda zpsave,x
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -12,7 +12,7 @@
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNLEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 bcc L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (FNADR),y L0: lda (FNADR),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -54,7 +54,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -111,14 +111,13 @@ done: lda #<argv
.endproc .endproc
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2

View File

@ -195,7 +195,7 @@ spsave: .res 1
irqcount: .byte 0 irqcount: .byte 0
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -26,12 +26,11 @@
.import __argc, __argv .import __argc, __argv
.include "plus4.inc" .include "plus4.inc"
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run ; 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNAM_LEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 bcc L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (FNAM),y L0: lda (FNAM),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -71,7 +70,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -125,17 +124,14 @@ done: lda #<argv
sta __argv sta __argv
stx __argv + 1 stx __argv + 1
rts rts
; -------------------------------------------------------------------------- .segment "INITBSS"
; These arrays are zeroed before initmainargs is called.
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2

View File

@ -31,9 +31,9 @@
;--------------------------------------------------------------------------- ;---------------------------------------------------------------------------
; Data ; Data
.bss .data
__argc: .res 2 __argc: .word 0
__argv: .res 2 __argv: .addr 0

View File

@ -101,14 +101,14 @@ Fail: lda #4
; ---------------------------------------------------------------------------- ; ----------------------------------------------------------------------------
; Data ; Data
.bss .segment "INITBSS"
; Initial stack pointer value. Stack is reset to this in case of overflows to ; Initial stack pointer value. Stack is reset to this in case of overflows to
; allow program exit processing. ; allow program exit processing.
initialsp: .word 0 initialsp: .res 2
; Stack low water mark. ; Stack low water mark.
lowwater: .word 0 lowwater: .res 2

View File

@ -86,7 +86,7 @@ L2: lda zpsave,x
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
.segment "ZPSAVE" .segment "INITBSS"
zpsave: .res zpspace zpsave: .res zpspace

View File

@ -28,10 +28,9 @@
.include "vic20.inc" .include "vic20.inc"
MAXARGS = 10 ; Maximum number of arguments allowed MAXARGS = 10 ; Maximum number of arguments allowed
REM = $8f ; BASIC token-code 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, ; Get possible command-line arguments. Goes into the special INIT segment,
; which may be reused after the startup code is run ; 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 ; Assume that the program was loaded, a moment ago, by the traditional LOAD
; statement. Save the "most-recent filename" as argument #0. ; 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 ldy FNAM_LEN
cpy #NAME_LEN + 1 cpy #NAME_LEN + 1
bcc L1 bcc L1
ldy #NAME_LEN - 1 ; limit the length ldy #NAME_LEN ; Limit the length
bne L1 ; Branch always
L0: lda (FNAM),y L0: lda (FNAM),y
sta name,y L1: sta name,y
L1: dey dey
bpl L0 bpl L0
inc __argc ; argc always is equal to, at least, 1 inc __argc ; argc always is equal to, at least, 1
; Find the "rem" token. ; Find the "rem" token.
;
ldx #0 ldx #0
L2: lda BASIC_BUF,x L2: lda BASIC_BUF,x
beq done ; no "rem," no args. beq done ; No "rem," no args.
inx inx
cmp #REM cmp #REM
bne L2 bne L2
@ -71,7 +70,7 @@ next: lda BASIC_BUF,x
beq done ; End of line reached beq done ; End of line reached
inx inx
cmp #' ' ; Skip leading spaces cmp #' ' ; Skip leading spaces
beq next ; beq next
; Found start of next argument. We've incremented the pointer in X already, so ; 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 ; it points to the second character of the argument. This is useful since we
@ -126,15 +125,13 @@ done: lda #<argv
stx __argv + 1 stx __argv + 1
rts rts
; These arrays are zeroed before initmainargs is called. .segment "INITBSS"
; char name[16+1];
; char* argv[MAXARGS+1]={name};
;
.bss
term: .res 1 term: .res 1
name: .res NAME_LEN + 1 name: .res NAME_LEN + 1
.data .data
; char* argv[MAXARGS+1]={name};
argv: .addr name argv: .addr name
.res MAXARGS * 2 .res MAXARGS * 2