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 >PUSHWI 0 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