+; Start processing the arguments.
+
+ ldx #$00
+ ldy #$01 * 2 ; Start with argv[1]
+
+; Find the next argument. Stop if the end of the string or a character with the
+; hibit set is reached. The later is true if the string isn't already parsed by
+; BASIC (as expected) but is a still unprocessed input string. In this case the
+; string isn't the expected command-line at all. We found this out the hard way
+; by BRUNing the program with ProDOS on a machine with a slot-based clock (like
+; the Thunder Clock). ProDOS called the clock firmware which places the current
+; date as BASIC input string with hibits set in the input buffer. While looking
+; for the REM token we stumbled across the first '2' character ($32+$80 = $B2)
+; and interpreted the rest of the date as a spurious command-line parameter.
+
+next: lda buffer,x
+ beq done
+ bmi 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.
+
+ cmp #'"' ; Is the argument quoted?
+ beq :+ ; Jump if so
+ dex ; Reset pointer to first argument character
+ lda #' ' ; A space ends the argument
+: sta tmp1 ; Set end of argument marker
+
+; Now store a pointer to the argument into the next slot.
+
+ txa ; Get low byte
+ clc
+ adc #<buffer
+ sta argv,y ; argv[y] = &arg
+ iny
+ lda #$00
+ adc #>buffer
+ sta argv,y
+ iny
+ inc __argc ; Found another arg
+
+; Search for the end of the argument.
+
+: lda buffer,x
+ beq done
+ inx
+ cmp tmp1
+ bne :-
+
+; 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 #$00
+ sta buffer-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
+
+; (The last vector in argv[] already is NULL.)
+
+done: lda #<argv
+ ldx #>argv
+ sta __argv
+ stx __argv+1