X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fplus4%2Fmainargs.s;h=42e2ba029fd4768f3ba7307078e91d0bea32c347;hb=0de44517ac5780b59969dd92ad081d5a68b2dc47;hp=7365b1478da2dbba8a71565d1ff470f1db9e925b;hpb=d0bee35728a55148fea9bd8d90bfef36b7e7de86;p=cc65 diff --git a/libsrc/plus4/mainargs.s b/libsrc/plus4/mainargs.s index 7365b1478..42e2ba029 100644 --- a/libsrc/plus4/mainargs.s +++ b/libsrc/plus4/mainargs.s @@ -22,48 +22,47 @@ ; - The "file-name" might be a path-name; don't copy the directory-components. ; - Add a control-character quoting mechanism. - .constructor initmainargs, 24 - .import __argc, __argv + .constructor initmainargs, 24 + .import __argc, __argv - .include "plus4.inc" - + .include "plus4.inc" -MAXARGS = 10 ; Maximum number of arguments allowed -REM = $8f ; BASIC token-code -NAME_LEN = 16 ; maximum length of command-name +MAXARGS = 10 ; Maximum number of arguments allowed +REM = $8f ; BASIC token-code +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 ONCE segment, ; which may be reused after the startup code is run -.segment "INIT" +.segment "ONCE" 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. -; - ldy FNAM_LEN - cpy #NAME_LEN + 1 - bcc L1 - ldy #NAME_LEN - 1 ; limit the length -L0: lda (FNAM),y - sta name,y -L1: dey - bpl L0 - inc __argc ; argc always is equal to, at least, 1 + + lda #0 ; The terminating NUL character + ldy FNAM_LEN + cpy #NAME_LEN + 1 + bcc L1 + ldy #NAME_LEN ; Limit the length + bne L1 ; Branch always +L0: lda (FNAM),y +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. - inx - cmp #REM - bne L2 - ldy #1 * 2 + + ldx #0 +L2: lda BASIC_BUF,x + beq done ; No "rem," no args. + inx + cmp #REM + bne L2 + ldy #1 * 2 ; Find the next argument @@ -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 @@ -89,11 +88,11 @@ setterm:sta term ; Set end of argument marker ; necessary. txa ; Get low byte - sta argv,y ; argv[y]= &arg - iny - lda #>BASIC_BUF - sta argv,y - iny + sta argv,y ; argv[y]= &arg + iny + lda #>BASIC_BUF + sta argv,y + iny inc __argc ; Found another arg ; Search for the end of the argument @@ -120,22 +119,19 @@ argloop:lda BASIC_BUF,x ; (The last vector in argv[] already is NULL.) -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 -term: .res 1 -name: .res NAME_LEN + 1 +done: lda #argv + sta __argv + stx __argv + 1 + rts + +.segment "INIT" + +term: .res 1 +name: .res NAME_LEN + 1 .data -argv: .addr name - .res MAXARGS * 2 +; char* argv[MAXARGS+1]={name}; +argv: .addr name + .res MAXARGS * 2