From: cuz Date: Tue, 5 Apr 2005 21:11:10 +0000 (+0000) Subject: mainargs rewrite by Oliver Schmidt X-Git-Tag: V2.12.0~388 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=1c5c974200e03c968f84ad64c45a47f3b58ccff4;p=cc65 mainargs rewrite by Oliver Schmidt git-svn-id: svn://svn.cc65.org/cc65/trunk@3453 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/apple2/dosdetect.s b/libsrc/apple2/dosdetect.s index b8553ecbb..ff4ce291c 100644 --- a/libsrc/apple2/dosdetect.s +++ b/libsrc/apple2/dosdetect.s @@ -20,10 +20,10 @@ ; ProDOS 8 2.0.3 - $23 ; - .constructor initdostype - .export __dos_type + .constructor initdostype, 25 + .export __dos_type - .include "mli.inc" + .include "mli.inc" ; Identify DOS version according to: ; - "Beneath Apple ProDOS", chapter 6-63 @@ -33,16 +33,16 @@ .segment "INIT" initdostype: - lda ENTRY - cmp #$4C ; Is MLI present? (JMP opcode) - bne done - lda KVERSION ; ProDOS 8 kernel version - cmp #$10 - bcs :+ - ora #$10 ; Make high nibble match major version -: sta __dos_type + lda ENTRY + cmp #$4C ; Is MLI present? (JMP opcode) + bne done + lda KVERSION ; ProDOS 8 kernel version + cmp #$10 + bcs :+ + ora #$10 ; Make high nibble match major version +: sta __dos_type done: rts .bss -__dos_type: .res 1 +__dos_type: .res 1 diff --git a/libsrc/apple2/mainargs.s b/libsrc/apple2/mainargs.s index 004a1629f..bf4511c00 100644 --- a/libsrc/apple2/mainargs.s +++ b/libsrc/apple2/mainargs.s @@ -4,6 +4,7 @@ ; Based on code from Stefan A. Haubenthal , 2003-11-08 ; Greg King, 2003-05-18 ; Stefan Haubenthal, 2005-01-07 +; Oliver Schmidt, 2005-04-05 ; ; Scan a group of arguments that are in BASIC's input-buffer. ; Build an array that points to the beginning of each argument. @@ -19,132 +20,120 @@ ; spaces outside of quotes are ignored. ; TO-DO: -; - The "file-name" might be a path-name; don't copy the directory-components. -; - Add a control-character quoting mechanism. +; Add a control-character quoting mechanism. - .constructor initmainargs, 24 - .import __argc, __argv + .constructor initmainargs, 24 + .import __argc, __argv, __dos_type - .include "apple2.inc" + .include "zeropage.inc" + .include "apple2.inc" ; Maximum number of arguments allowed in the argument table. ; (An argument contains a comma, at least.) -; + +MAXARGS = 10 + BASIC_BUF = $200 -BASIC_BUF_LEN = 239 -FNAM_LEN = $280 -FNAM = $281 - -MAXARGS = 10 ; Maximum number of arguments allowed -REM = $B2 ; BASIC token-code -NAME_LEN = 15 ; maximum length of command-name - -; Validate sizes -.if MAXARGS > (BASIC_BUF_LEN - 2)/2 -.error "Too many arguments" -.endif +FNAM_LEN = $280 +FNAM = $281 +REM = $B2 ; BASIC token-code ; Get possible command-line arguments. Goes into the special INIT segment, ; which may be reused after the startup code is run -.segment "INIT" + .segment "INIT" 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 +; Assume that the program was loaded, a moment ago, by the traditional BLOAD +; statement of BASIC.SYSTEM. Save the "most-recent filename" as argument #0. + + ldx __dos_type ; No ProDOS -> argv[0] = "" + beq :+ + +; Terminate the filename with a zero to make it a valid C string. + + ldx FNAM_LEN +: lda #$00 + sta FNAM,x + + 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 #$00 +: lda BASIC_BUF,x + beq done ; No "rem" -> no args + inx + cmp #REM + bne :- + ldy #$01 * 2 ; Start with argv[1] ; Find the next argument. -next: lda BASIC_BUF,x - beq done - inx - cmp #' ' ; Skip leading spaces - beq next ; +next: lda BASIC_BUF,x + beq done + inx + cmp #' ' ; Skip leading spaces + 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 ; will check now for a quoted argument, in which case we will have to skip this ; first character. -found: cmp #'"' ; Is the argument quoted? - beq setterm ; Jump if so - dex ; Reset pointer to first argument character - lda #' ' ; A space ends the argument -setterm:sta term ; Set end of argument marker + cmp #'"' ; Is the argument quoted? + beq setterm ; Jump if so + dex ; Reset pointer to first argument character + lda #' ' ; A space ends the argument +setterm:sta tmp1 ; Set end of argument marker ; Now store a pointer to the argument into the next slot. Since the BASIC ; input buffer is located at the start of a RAM page, no calculations are ; necessary. - txa ; Get low byte - sta argv,y ; argv[y]= &arg - iny - lda #>BASIC_BUF - sta argv,y - iny - inc __argc ; Found another arg + txa ; Get low byte + 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 -argloop:lda BASIC_BUF,x - beq done - inx - cmp term - bne argloop +argloop:lda BASIC_BUF,x + beq done + inx + cmp tmp1 + bne argloop ; 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, ; replace the terminating character by a zero. - lda #0 - sta BASIC_BUF-1,x + lda #$00 + sta BASIC_BUF-1,x ; Check if the maximum number of command line arguments is reached. If not, ; parse the next one. - lda __argc ; Get low byte of argument count - cmp #MAXARGS ; Maximum number of arguments reached? - bcc next ; Parse next one if not + lda __argc ; Get low byte of argument count + cmp #MAXARGS ; Maximum number of arguments reached? + bcc next ; Parse next one if not ; (The last vector in argv[] already is NULL.) -done: lda #argv - sta __argv - stx __argv + 1 - rts +done: lda #argv + sta __argv + stx __argv+1 + rts -; These arrays are zeroed before initmainargs is called. -; char name[NAME_LEN+1]; -; char* argv[MAXARGS+1]={name}; +; This array is zeroed before initmainargs is called. +; char* argv[MAXARGS+1] = {FNAM}; -.bss -term: .res 1 -name: .res NAME_LEN + 1 + .data -.data -argv: .addr name - .res MAXARGS * 2 +argv: .addr FNAM + .res MAXARGS * 2