NEW PREFIX AUTO 4,1 .LIST OFF *-------------------------------------- CL.PrintPrompt >LDYA L.ENV.PS1 >SYSCALL GetEnv bcs .1 >SYSCALL ExpandStr bcs .9 phx pha >PUSHBI 0 pla >SYSCALL printf pla >SYSCALL FreeMem .1 >PUSHBI 0 >LDYA L.MSG.PROMPT >SYSCALL printf .9 rts *-------------------------------------- CL.CHARIN tax >LDA.G bEscMode beq .13 cpx #'[' beq .9 lda #0 sta (pData),y Y=bEscMode txa ldx #EscChars.Cnt-1 .17 cmp EscChars,x beq .18 dex bpl .17 clc rts .18 txa asl tax jmp (J.ESC,x) *-------------------------------------- .13 cpx #$20 bcc CL.CHARIN.CTRL .1 cpx #$7f bne .2 jmp CL.SUPPR .2 jmp CL.Insert .9 clc rts *-------------------------------------- CL.CHARIN.CTRL cpx #C.CR bne .10 >PUSHBI 0 >LDYA L.MSG.ECHOCRLF >SYSCALL printf lda #$ff >STA.G CL.bExec clc rts .10 cpx #C.ESC bne .11 lda #$ff >STA.G bEscMode clc rts .11 cpx #3 Ctrl-C bne .12 jmp CL.CLR .12 cpx #24 Ctrl-X bne .13 jmp CL.DEL .13 clc rts *-------------------------------------- CL.Insert >LDA.G CL.Len cmp #CL.MAX beq .9 Buffer full, discard... inc sta (pData),y pha .1 ply dey lda (ZPCLBuf),y Move from Ptr To end of buffer forward... iny sta (ZPCLBuf),y dey phy tya >CMP.G CL.Ptr bne .1 ply Y=CL.Ptr * >LDA.G CL.Ptr txa sta (ZPCLBuf),y >LDA.G bREAD.S bpl .2 ldx #'*' .2 txa >SYSCALL PutChar >INC.G CL.Ptr jmp CL.PrintEOL .9 clc rts *-------------------------------------- CL.CLR lda (ZPCLBuf) beq CL.RESET.1 ldy #0 .1 lda #$7F sta (ZPCLBuf),y iny lda (ZPCLBuf),y bne .1 jsr CL.PrintCmdBuf *-------------------------------------- CL.RESET lda #0 sta (ZPCLBuf) CL.RESET.1 >STA.G CL.bExec >STA.G CL.Ptr >STA.G CL.Len rts *-------------------------------------- CL.BS >LDA.G CL.Ptr beq .9 dec sta (pData),y lda #C.BS >SYSCALL PutChar .9 rts *-------------------------------------- CL.NAK >LDA.G CL.Ptr >CMP.G CL.Len beq .9 inc >STA.G CL.Ptr lda #C.FS >SYSCALL PutChar .9 rts *-------------------------------------- * Erase char UNDER cursor *-------------------------------------- CL.SUPPR >LDA.G CL.Len beq CL.PrintEOL.8 >LDA.G CL.Ptr >CMP.G CL.Len beq CL.PrintEOL.8 bra CL.DEL.1 *-------------------------------------- * Erase char BEFORE cursor *-------------------------------------- CL.DEL >LDA.G CL.Len beq CL.PrintEOL.8 >LDA.G CL.Ptr beq CL.PrintEOL.8 lda #C.BS >SYSCALL PutChar >DEC.G CL.Ptr CL.DEL.1 pha .1 ply iny lda (ZPCLBuf),y dey sta (ZPCLBuf),y iny phy tya >CMP.G CL.Len bne .1 pla >DEC.G CL.Len *-------------------------------------- CL.PrintEOL >LDA.G CL.Ptr .1 >CMP.G CL.Len beq .2 pha tay lda (ZPCLBuf),y >SYSCALL PutChar pla inc bra .1 .2 lda #' ' >SYSCALL PutChar >LDA.G CL.Ptr .3 >CMP.G CL.Len beq .4 pha lda #C.BS >SYSCALL PutChar pla inc bra .3 .4 lda #C.BS >SYSCALL PutChar CL.PrintEOL.8 clc rts *-------------------------------------- CL.PrintCmdBuf >LDYA ZPCLBuf >PUSHYA ldy #S.PS.hStdOut lda (pPs),y >SYSCALL fputs rts *-------------------------------------- CL.GetLine >LDYA ZPFileBufPtr >STYA.G CMD.FileBufPtr lda #"a" sta $815 lda (ZPFileBufPtr) beq .9 inc $815 ldx #0 not in " ldy #0 .1 lda (ZPFileBufPtr),y beq .7 inc $815 cmp #C.CR beq .6 cmp #'"' bne .2 txa eor #$80 toggle " switch tax lda #'"' bra .5 .2 cmp #';' bne .5 txa beq .6 lda #';' .5 sta (ZPCLBuf),y iny cpy #CL.MAX bne .1 lda #E.SYN Line Too long !!! * sec rts .6 sec skip CR or ; .HS 90 BCC .7 clc tya adc ZPFileBufPtr sta ZPFileBufPtr bcc .8 inc ZPFileBufPtr+1 .8 lda #0 sta (ZPCLBuf),y tya >STA.G CL.Len lda #$ff >STA.G CL.bExec clc rts .9 lda #C.EOF sec rts *-------------------------------------- * in: * ZPCLBuf : CString command line * out: * ZPArgVBuf : * /path/excmd\0 arg1\0 arg2\0 ... \0 * - or - * intcmd\0 arg1\0 arg2\0 ... \0 *-------------------------------------- CL.Parse >STZ.G CMD.IntCmd lda #S.PS.F.HOLD+S.PS.F.DUPENV >STA.G CMD.PSFlags >PUSHW ZPCLBuf >LDYA ZPCLBuf >STYA ZPCLBufPtr >SYSCALL Args2ArgV lda #0 sta (ZPArgVBuf) lda (ZPCLBufPtr) beq .8 .1 cmp #'#' comment ? beq .8 yes, ignore remaining >LDA.G CMD.IntCmd bne .3 we already have Cmd, go check args ldy #1 lda (ZPCLBufPtr),y only one char ? bne .2 lda (ZPCLBufPtr) cmp #'.' leading dot ? bne .2 >LDA.G CMD.PSFlags yes, child process will run in same ENV and #$ff^S.PS.F.DUPENV sta (pData),y bra .6 and skip this token .2 jsr CL.CheckCmd bcc .6 success, skip token, already added by CheckCmd rts .3 jsr CL.CheckIO bcc .7 IO token & related args processed tay an error ? bne .9 yes...I/O error... jsr CL.AddCLBufPtrToArgV no...add as an arg bcs .9 .6 jsr CL.NextCLToken .7 lda (ZPCLBufPtr) bne .1 .8 clc .9 rts *-------------------------------------- * ZPCLBuf-> argv[] (formatted & not empty) *-------------------------------------- CL.CheckCmd ldy #$ff .1 iny lda (ZPCLBufPtr),y beq .2 cmp #'/' bne .1 >LDYA ZPCLBufPtr found /, some path specified, External, no search >SYSCALL realpath bcs .9 txa >STA.G CMD.hCmdLine bra .6 go check type... .2 >PUSHW ZPCLBufPtr >LDYA L.CMD.INT jsr Lookup no / found, search internal... bcs .4 not internal, search PATH phx plx bne .3 >LDA.G CMD.PSFlags if STARTPROC, skip keyword... and #$ff^S.PS.F.HOLD sta (pData),y ...and toggle S.PS.F.HOLD flag clc .9 rts .3 jsr CL.AddYAToArgV X unmodified bcs .9 txa >STA.G CMD.IntCmd clc rts .4 >LDYAI 256 Get a buffer for found path >SYSCALL GetMem bcs .9 txa >STA.G CMD.hCmdLine >LDYA L.ENV.PATH push ENVNAME=PATH for search >SYSCALL GetEnv get value for ENV=PATH bcs .5 no PATH, try workdir jsr CL.SearchExt bcc .6 found in PATH, go check Type .5 ldy #S.PS.hPREFIX not found, try in CD lda (pPs),y >SYSCALL GetMemPtr jsr CL.SearchExt bcs CL.CheckCmd.90 .6 >PUSHEA.G CMD.Stat >LDA.G CMD.hCmdLine >SYSCALL GetMemPtr >SYSCALL STAT bcs CL.CheckCmd.90 lda #$ff >STA.G CMD.IntCmd ldy #CMD.Stat+S.STAT.P.TYPE lda (pData),y cmp #S.FI.T.TXT beq CL.CheckCmd.BIN cmp #S.FI.T.BIN beq CL.CheckCmd.BIN cmp #S.FI.T.SYS beq CL.CheckCmd.SYS lda #E.BADFTYPE sec CL.CheckCmd.90 php pha >LDA.G CMD.hCmdLine >SYSCALL FreeMem pla plp CL.CheckCmd.RTS rts *-------------------------------------- * BIN : add "/PATH/CMD" *-------------------------------------- CL.CheckCmd.BIN >LDA.G CMD.hCmdLine >SYSCALL GetMemPtr jsr CL.AddYAToArgV bra CL.CheckCmd.90 *-------------------------------------- CL.CheckCmd.SYS bra * *-------------------------------------- CL.SearchExt pha phy >PUSHEA.G CMD.Stat >LDA.G CMD.hCmdLine >SYSCALL GetMemPtr >PUSHYA push dest full path ply pla >PUSHYA push search list >LDYA ZPCLBufPtr push CMD >SYSCALL FileSearch rts *-------------------------------------- CL.CheckIO >PUSHW ZPCLBufPtr >LDYA L.CL.IO jsr Lookup bcs .9 not a IO token...should be an arg.... phx jsr CL.NextCLToken skip this IO token plx jmp (J.CL.IO,x) .9 lda #0 rts *-------------------------------------- CL.IO.AMP >LDA.G CMD.PSFlags and #$ff^S.PS.F.HOLD sta (pData),y clc rts CL.IO.PIPE clc rts CL.IO.IN lda #O.RDONLY+O.TEXT jsr CL.IO.Open bcs .9 jsr IO.Set.In jsr CL.NextCLToken skip arg clc .9 rts CL.IO.OUTA CL.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT bra CL.IO.OUT.1 CL.IO.OUT CL.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT CL.IO.OUT.1 jsr CL.IO.Open bcs .9 jsr IO.Set.Out jsr CL.NextCLToken skip arg clc .9 rts CL.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT bra CL.IO.2OUT.1 CL.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT CL.IO.2OUT.1 jsr CL.IO.Open bcs .9 jsr IO.Set.Err jsr CL.NextCLToken skip arg clc .9 rts *-------------------------------------- CL.IO.Open pha lda (ZPCLBufPtr) beq .9 no arg left.... >PUSHWI 0 Aux type >PUSHBI S.FI.T.TXT ftype pla >PUSHA flags >LDYA ZPCLBufPtr >SYSCALL fopen rts .9 pla lda #E.CSYN sec rts *-------------------------------------- CL.NextCLToken lda (ZPCLBufPtr) inc ZPCLBufPtr bne .1 inc ZPCLBufPtr+1 .1 tax bne CL.NextCLToken rts *-------------------------------------- CL.AddCLBufPtrToArgV >LDYA ZPCLBufPtr CL.AddYAToArgV >STYA ZPPtr1 >LDYA ZPArgVBuf >STYA ZPPtr2 .1 lda (ZPPtr2) scan to end of argV beq .6 .2 inc ZPPtr2 bne .3 inc ZPPtr2+1 .3 lda (ZPPtr2) bne .2 inc ZPPtr2 bne .4 inc ZPPtr2+1 .4 lda (ZPPtr2) bne .2 .6 ldy #$ff .7 iny * beq .9 lda (ZPPtr1),y sta (ZPPtr2),y bne .7 including str ending \0 iny * beq .9 sta (ZPPtr2),y arg[] ending \0 clc rts .9 lda #E.BUF sec rts *-------------------------------------- MAN SAVE USR/SRC/BIN/SHELL.S.CL LOAD USR/SRC/BIN/SHELL.S ASM