NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF *-------------------------------------- CMD.Init >LDYAI CmdLine.MAX+1 >SYSCALL GetMem bcs .9 >STYA ZPCMDBuf txa >STA.G hCmdBuf .9 rts *-------------------------------------- CMD.Quit >LDA.G hCmdBuf beq .9 >SYSCALL FreeMem .9 rts *-------------------------------------- * in: * ZPCMDBuf : CString command line * out: * ZPCMDBuf : Remove extra SPACE & comment * ZPCMDBuf : cmd\0 arg1\0 arg2\0 ... \0 *-------------------------------------- Cmd.Parse >LDYA ZPCMDBuf >SYSCALL ExpandStr bcs .99 >STYA ZPPtr1 Ptr to expanded CMD ARGS\0 txa >STA.G CMD.hCmdLine * SET +X >LDYA ZPPtr1 >SYSCALL puts bcs .90 ldy #0 lda (ZPPtr1) empty line...quit beq .9 .1 jsr Cmd.NextCharPtr1 beq .8 no more char, exit cmp #' ' skip leading spaces beq .1 cmp #'#' Comment ? beq .8 ignore remaining chars .3 sta (ZPCMDBuf),y add char to buffer iny jsr Cmd.NextCharPtr1 beq .8 cmp #' ' bne .3 lda #0 sta (ZPCMDBuf),y add \0 to buffer iny .5 jsr Cmd.NextCharPtr1 beq .8 cmp #' ' beq .5 skip additional spaces bne .3 no more space, add next word... .8 lda #0 sta (ZPCMDBuf),y .9 tya >STA.G CmdBuflen .90 >LDA.G CMD.hCmdLine >SYSCALL FreeMem .99 rts *-------------------------------------- * ZPCMDBuf-> argv[] (formatted & not empty) *-------------------------------------- CMD.Exec lda #S.PS.F.HOLD+S.PS.F.DUPENV >STA.G CMD.PSFlags >LDYA L.CMD.INT >STYA ZPPtr2 ldx #0 .1 phx >PUSHW ZPPtr2 >LDYA ZPCMDBuf >SYSCALL StrCaseCmp bcs .2 ldx #0 jsr Cmd.RemoveStrAtX Remove CMD... plx jmp (J.CMD.INT,x) Found an internal Cmd... .2 jsr Cmd.NextStrPtr2 lda (ZPPtr2) beq Cmd.Exec.EXT Array Ending 0, must be an external Cmd.... plx inx inx bra .1 *-------------------------------------- Cmd.Exec.EXT ldy #0 .10 lda (ZPCMDBuf),y beq .1 no / found, search... cmp #'/' beq .11 found /, some path specified, no search iny bra .10 .11 >LDYA ZPCMDBuf >SYSCALL realpath bcs .99 phy pha txa >STA.G CMD.hCmdLine pla ply >PUSHEA.G CMD.Stat Command line is already full path, no search >LDYA ZPCMDBuf >SYSCALL STAT bcc .2 rts .1 >LDYAI 256 Get a buffer for found path >SYSCALL GetMem bcs .99 txa >STA.G CMD.hCmdLine >LDYA L.ENV.PATH push ENVNAME=PATH for search >SYSCALL GetEnv get value for ENV=PATH bcs .99 No PATH, try in CD jsr Cmd.Exec.EXT.Search bcc .2 ldy #S.PS.hPREFIX not found, try in CD lda (pPs),y >SYSCALL GetMemPtr jsr Cmd.Exec.EXT.Search bcc .2 pha >LDA.G CMD.hCmdLine >SYSCALL FreeMem pla sec .99 rts * CMD.hCmdLine = /path/bin .2 ldx #0 jsr Cmd.RemoveStrAtX >LDA.G CMD.hCmdLine >SYSCALL GetMemPtr ldx #0 jsr CMD.InsertStrYAAtX >LDA.G CMD.hCmdLine >SYSCALL FreeMem ldy #CMD.Stat+S.STAT.P.TYPE lda (pData),y cmp #S.FI.T.TXT beq Cmd.Exec.EXT.TXT cmp #S.FI.T.BIN beq Cmd.Exec.EXT.BIN cmp #S.FI.T.SYS bne .9 bra * .9 lda #K.E.SYN sec rts *-------------------------------------- Cmd.Exec.EXT.Search pha phy >PUSHEA.G CMD.Stat >LDA.G CMD.hCmdLine >SYSCALL GetMemPtr >PUSHYA push dest full path ply pla >PUSHYA push search list >LDYA ZPCMDBuf push CMD >SYSCALL FileSearch rts *-------------------------------------- * TXT : Launch "/PATH/SHELL /PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.TXT lda #0 >SYSCALL GetArg ldx #0 jsr Cmd.InsertStrYAAtX *-------------------------------------- * BIN : Launch "/PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.BIN >PUSHB.G CMD.PSFlags >LDYA ZPCMDBuf >SYSCALL Exec rts *-------------------------------------- * Internal Commands *-------------------------------------- Cmd.INT.PWD ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtr >SYSCALL puts rts *-------------------------------------- Cmd.INT.CD lda (ZPCMDBuf) bne .1 >LDYA L.ENV.HOME >SYSCALL GetEnv bcs Cmd.INT.PWD >SYSCALL ExpandStr bcs .9 bra .4 .1 ldy #0 .2 lda (ZPCMDBuf),y tax iny lda (ZPCMDBuf),y bne .2 cpx #'/' beq .3 lda #'/' sta (ZPCMDBuf),y iny lda #0 sta (ZPCMDBuf),y .3 >LDYA ZPCMDBuf Get ARG0 >SYSCALL RealPath bcs .9 .4 >STYA ZPCMDBuf txa >STA.G CMD.hCmdLine ldy #1 lda (ZPCMDBuf),y beq .8 we have '/' >PUSHEA.G CMD.Stat >LDYA ZPPTR2 >SYSCALL STAT bcs .9 ldy #CMD.Stat+S.STAT.P.TYPE lda (pData),y cmp #$0F Directory ? bne Cmd.Exec.ERRSYN .8 >LDYA ZPCMDBuf >SYSCALL NewStr bcs .9 phx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL FreeMem pla ldy #S.PS.hPREFIX sta (pPs),y jsr SetPWD clc .9 rts *-------------------------------------- Cmd.Exec.ERRSYN lda #K.E.SYN sec rts *-------------------------------------- Cmd.INT.STARTPROC lda (ZPCMDBuf) beq Cmd.Exec.ERRSYN >LDA.G CMD.PSFlags and #$ff^S.PS.F.HOLD sta (pData),y jmp Cmd.Exec.EXT *-------------------------------------- Cmd.INT.SET lda (ZPCMDBuf) bne Cmd.INT.SETVAR * No arg, print all ENV ldy #S.PS.hENV lda (pPs),y >SYSCALL GetMemPtr >STYA ZPPTR1 .1 lda (ZPPTR1) beq .8 Ending 0 ? ldy #$ff .2 iny lda (ZPPTR1),y bne .2 tya sec adc ZPPTR1 sta ZPPTR2 lda #0 adc ZPPTR1+1 sta ZPPTR2+1 >PUSHW ZPPTR2 Push value >PUSHW ZPPTR1 Push name jsr Cmd.INT.SET.PRINT bcs .9 ldy #$ff .3 iny lda (ZPPTR2),y bne .3 tya sec adc ZPPTR2 sta ZPPTR1 lda #0 adc ZPPTR2+1 sta ZPPTR1+1 bra .1 .8 clc .9 rts *-------------------------------------- Cmd.INT.SETVAR cmp #'=' string is '=value' ? beq .99 syntax error ldy #0 .1 iny lda (ZPCMDBuf),y beq .3 no =, GetEnv cmp #'=' ARGS contains =, PutEnv bne .1 iny lda (ZPCMDBuf),y beq .2 "VAR=" go UnsetEnv >LDYA ZPCMDBuf String is VAR=VALUE... >SYSCALL PutEnv rts .2 dey String is "VAR=", Remove ending '=' lda #0 sta (ZPCMDBuf),y >LDYA ZPCMDBuf String is "VAR"... >SYSCALL UnsetEnv rts * Print requested VAR .3 >LDYA ZPCMDBuf >SYSCALL GetEnv bcs .8 >PUSHYA push value >PUSHW ZPCMDBuf push name jsr Cmd.INT.SET.PRINT .8 clc .9 rts .99 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.INT.SET.PRINT >PUSHBI 4 >LDYA L.MSG.PRINTENV >SYSCALL printf rts *-------------------------------------- Cmd.INT.DATE sec .HS 90 bcc Cmd.INT.TIME clc php >LEA.G CMD.Time >SYSCALL Time >PUSHEA.G CMD.Time plp bcc .1 >PUSHW L.FMT.DATE bra .2 .1 >PUSHW L.FMT.TIME .2 >LDYA ZPCMDBuf >SYSCALL StrFTime >LDYA ZPCMDBuf >SYSCALL puts rts *-------------------------------------- Cmd.INT.ECHO >LDYA ZPCMDBuf >SYSCALL puts rts *-------------------------------------- Cmd.INT.READ lda (ZPCMDBuf) beq .9 lda #0 >STA.G bSecureRead >STA.G CMD.VarName.LEN lda pData clc adc #CMD.VarName sta ZPPTR1 lda pData+1 adc #0 sta ZPPTR1+1 .1 lda (ZPPtr2) beq .8 cmp #' ' bne .11 jsr Cmd.NextCharPtr2 bra .1 .11 cmp #'-' bne .7 jsr Cmd.NextCharPtr2 beq .9 cmp #'S' bne .2 lda #$80 >STA.G bSecureRead jsr Cmd.NextCharPtr2 beq .8 cmp #' ' bne .9 bra .1 .2 cmp #'P' bne .9 jsr Cmd.NextCharPtr2 beq .9 cmp #' ' bne .9 jsr Cmd.NextCharPtr2 beq .9 cmp #'"' bne .9 .3 jsr Cmd.NextCharPtr2 beq .9 cmp #'"' beq .1 >SYSCALL PutChar bcs .99 bra .3 .9 jmp Cmd.Exec.ERRSYN .7 >LDA.G CMD.VarName.LEN cmp #VarLen.MAX beq .9 pha inc sta (pData),y ply lda (ZPPtr2) sta (ZPPTR1),y iny lda #0 sta (ZPPTR1),y jsr Cmd.NextCharPtr2 beq .1 cmp #' ' beq .1 bra .7 .8 >LDA.G CMD.VarName.LEN No var name ? SYNERR beq .9 lda #$ff >STA.G bReadMode clc .99 rts *-------------------------------------- Cmd.INT.SLEEP lda (ZPCMDBuf) beq .9 >LDYA ZPCMDBuf >SYSCALL AToL bcs .9 >PULLL.G Sleep clc rts .9 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.INT.PAUSE lda #$FF >STA.G bPause clc rts *-------------------------------------- Cmd.INT.EXIT lda #$FF >STA.G bExit clc rts *-------------------------------------- Cmd.INT.IF >STZ.G CMD.IFNOT lda (ZPCMDBuf) beq .9 cmp #'!' bne .1 lda #$ff sta (pData),y Y = #CMD.IFNOT jsr Cmd.NextCharPtr2NB beq .9 cmp #'(' bne .9 jsr Cmd.NextCharPtr2NB beq .9 cmp #'-' -d -e -f bne .1 jsr Cmd.NextCharPtr2NB beq .9 .1 >DEBUG >LDYA ZPCMDBuf >SYSCALL puts rts .9 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.InsertStrYAAtX >STYA ZPPtr3 new string to insert >LDYA ZPCMDBuf >STYA ZPPtr1 .1 dex bmi .2 jsr Cmd.NextStrPtr1 >STYA ZPPtr1 bra .1 .2 >LDYA ZPPtr1 >STYA ZPPtr4 Save Arg[x] ptr >LDYA ZPPtr3 >SYSCALL strlen pha tya sec +1 adc ZPPtr1 sta ZPPtr2 pla adc ZPPtr1+1 lda ZPPtr2+1 ldy #0 .3 lda (ZPPtr1),y sta (ZPPtr2),y beq .4 iny bne .3 .4 tay beq .5 jsr Cmd.NextStrPtr1 >STYA ZPPtr1 jsr Cmd.NextStrPtr2 >STYA ZPPtr2 bra .3 .5 ldy #0 .6 lda (ZPPtr3),y sta (ZPPtr4),y beq .8 iny bne .6 .8 rts *-------------------------------------- Cmd.RemoveStrAtX >LDYA ZPCMDBuf >STYA ZPPtr1 .1 dex bmi .2 jsr Cmd.NextStrPtr1 >STYA ZPPtr1 bra .1 .2 jsr Cmd.NextStrPtr1 >STYA ZPPtr2 ldy #0 .3 lda (ZPPtr2),y sta (ZPPtr1),y beq .4 iny bra .3 .4 tay we moved the ending \0 beq .8 jsr Cmd.NextStrPtr2 >STYA ZPPtr2 jsr Cmd.NextStrPtr1 >STYA ZPPtr1 bra .1 .8 rts *-------------------------------------- Cmd.NextStrPtr1 >LDYA ZPPtr1 >SYSCALL strlen pha tya sec +1 adc ZPPtr1 tay pla adc ZPPtr1+1 rts *-------------------------------------- Cmd.NextStrPtr2 >LDYA ZPPtr2 >SYSCALL strlen pha tya sec +1 adc ZPPtr2 tay pla adc ZPPtr2+1 rts *-------------------------------------- Cmd.NextCharPtr1 lda (ZPPtr1) beq .8 inc ZPPtr1 bne .8 inc ZPPtr1+1 never Z .8 rts *-------------------------------------- Cmd.NextCharPtr2NB .1 jsr Cmd.NextCharPtr2 beq .9 cmp #C.SPACE beq .1 .9 rts *-------------------------------------- Cmd.NextCharPtr2 inc ZPPtr2 bne .1 inc ZPPtr2+1 .1 lda (ZPPtr2) rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD LOAD /A2OSX.SRC/SBIN/SHELL.S ASM