NEW
  AUTO 3,1
*/--------------------------------------
* # Shift
* ## ASM
* A = argument index.
* ## RETURN VALUE 
* CC : success
* Y,A = PTR To Arg[A]
* CS : Out Of Bound
*\--------------------------------------
K.Shift			jsr K.ArgV
				bcs .9
				
				>STYA ZPPtr1
*				>STYA ZPPtr2			already set from ArgV

				ldy #$ff
				
.1				iny
				lda (ZPPtr1),y
				bne .1
				
.2				jsr SHARED.AddYp12P1

				ldy #$ff

.3				iny
				lda (ZPPtr1),y
				sta (ZPPtr2),y
				bne .3

				tya
				beq .8
				
				jsr SHARED.AddYp12P2
				bra .2
				
.8				ldy #S.PS.ARGC
				lda (pPS),y
				dec
				sta (pPS),y
				clc
				
.9				rts
*/--------------------------------------
* # ArgV
* ## ASM
* A = argument index.
* ## RETURN VALUE 
* CC : success
* Y,A = PTR To Arg[A]
* CS : Out Of Bound
*\--------------------------------------
K.ArgV			tax						save requested arg#
				ldy #S.PS.hARGV
				lda (pPS),y
				jsr K.GetMemPtr

				>STYA ZPPtr2			Use Ptr2, called from ExpandStr
.1				lda (ZPPtr2)			end of ARGV[] ?

				beq .9					yes, not found....

				dex
				bmi .7

.3				jsr SHARED.GetCP2	skip str
				bne .3

				jsr SHARED.NextCP2	skip \0
				bra .1

.7				>LDYA ZPPtr2
.8				clc
				rts

.9				lda #E.OOB
				sec
				rts	
*/--------------------------------------
* # Arg2ArgV
* Expand String and convert to StrV List
* ## C
* short int arg2argv(char* args, char* argv[])
* ## ASM
* `>PUSHW args`
* `>PUSHW argv`
* `>SYSCALL Arg2ArgV`
* ## RETURN VALUE
* A = Arg count
*\--------------------------------------
K.Arg2ArgV		>PULLW ZPPtr2			Get target buffer
				>PUSHWZ					allocate a new buffer
				jsr K.Expand			args on stack
				bcs .9

				>STYA ZPPtr1
				stx .80+1

				ldx #0					Arg Count
				ldy #0					bInQuote

.1				jsr SHARED.GetCP1
				beq .8

				cmp #C.SPACE
				beq .1					skip leading spaces

.2				cmp #'"'				found a quote ?
				bne .3
				
				tya
				eor #$ff
				tay
				bra .7				skip quote and check next char

.3				cmp #C.SPACE
				bne .6				regular char ...store...

				tya
				bmi .4				between quotes... store space...

				inx					Found one arg !!!
				lda #0				set this token End
				jsr SHARED.PutCP2
				bra .1
				
.4				lda #C.SPACE
.6				jsr SHARED.PutCP2

.7				jsr SHARED.GetCP1
				bne .2

				inx
				
.8				jsr SHARED.PutCP2	set Argv[x] Ending 0

				sta (ZPPtr2)		set Array Ending 0
				phx
.80				lda #$FF			SELF MODIFIED
				jsr K.FreeMem		Discard expanded string
				pla					get back Arg Count

*				clc

.9				rts
*/--------------------------------------
* # ArgVDup
* ## ASM
*  Y,A = Src StrV
* ## RETURN VALUE
*  X = hMem of new StrV
*  A = Str Count
*\--------------------------------------
K.ArgVDup		>STYA ZPPtr1
				>STYA ZPPtr2

				ldy #0
				ldx #0
				
.1				lda (ZPPtr2),y
				beq .2
				
.11				iny
				bne .1
				
				inx
				inc ZPPtr2+1
				bra .1
				
.2				iny
				bne .3
				inx
				inc ZPPtr2+1
				
.3				lda (ZPPtr2),y
				bne .11
				
				txa
				
				jsr K.getmem
				bcs .9
				
				>STYA ZPPtr2
				phx
				
				ldx #0
				ldy #0
				
.4				lda (ZPPtr1),y
				sta (ZPPtr2),y
				beq .6

.5				iny
				bne .4
				
				inc ZPPtr1+1
				inc ZPPtr2+1
				bra .4
				
.6				inx

				iny
				bne .7
				
				inc ZPPtr1+1
				inc ZPPtr2+1
				
.7				lda (ZPPtr1),y
				sta (ZPPtr2),y			Ending \0 ?
				bne .5
				
				txa						Count
				plx						hMem
				
				clc
.9				rts
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.arg
LOAD usr/src/sys/kernel.s
ASM
