PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * Y,A -> Command line (formatted & not empty) *-------------------------------------- Cmd.ExecYA stz Cmd.Exec.Mode Cmd.ExecYA.1 >SYSCALL ExpandPStrYA >STYA ZPPtr1 phx ldy #1 ldx #0 ARGS len lda (ZPPtr1),y .10 cmp #'a' bcc .11 cmp #'z'+1 bcs .11 eor #$20 to Uppercase .11 sta CMD,y Store Cmd in Buffer sty CMD update CMD len tya cmp (ZPPtr1) beq .13 end of string iny lda (ZPPtr1),y cmp #' ' bne .10 .12 tya cmp (ZPPtr1) beq .13 end of string iny lda (ZPPtr1),y inx sta ARGS,x bra .12 .13 stx ARGS update ARGS len pla >SYSCALL FreeMemA >LDYA L.CMDS >STYA ZPPtr2 ldx #0 .1 lda (ZPPtr2) beq Cmd.Exec.EXT Ending 0, must be an external Cmd.... cmp CMD bne .4 tay .2 lda CMD,y .3 cmp (ZPPtr2),y bne .4 dey bne .2 jsr .5 Found an internal Cmd... bcs .31 lda #0 .31 ldy #S.PS.RC sta (pPS),y rts .4 inx inx lda ZPPtr2 sec adc (ZPPtr2) sta ZPPtr2 bcc .1 inc ZPPtr2+1 bra .1 .5 jmp (J.INTCMDS,x) *-------------------------------------- Cmd.Exec.EXT ldy #1 lda CMD,y cmp #'/' Command line is already full path, no search beq .3 >LDYA L.ENV.PATH push ENVNAME=PATH for search >SYSCALL GetEnvYA get value for ENV=PATH bcs .1 No PATH, try in CD >PUSHYA push search list >PUSHW L.CMD >SYSCALL FileSearch bcc .2 .1 ldy #S.PS.hPREFIX not found, try in CD lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA push search list >PUSHW L.CMD >SYSCALL FileSearch bcs .99 .2 phx save X=hMem, Y,A = Filename >PUSHYA >PUSHW L.CMD replace CMD in TmpBuffer with full path >SYSCALL PStrCpy pla >SYSCALL FreeMemA Discard this string... .3 stz UsrBuf256 reset UsrBuf256 for final CMDLINE >PUSHW L.STAT >PUSHW L.CMD >SYSCALL STAT bcs .99 lda STAT+S.STAT.P.TYPE cmp #$04 TXT File ? beq Cmd.Exec.EXT.TXT cmp #$06 BIN File ? beq Cmd.Exec.EXT.BIN cmp #$ff SYS File ? bne .9 bra * .9 lda #SYSMGR.ERRSYN sec .99 rts *-------------------------------------- * TXT : Launch "/PATH/SHELL /PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.TXT lda #0 Get arg[0] = /PATH/SHELL >SYSCALL GetArgA >PUSHYA >PUSHWI UsrBuf256 >SYSCALL PStrCpy inc UsrBuf256 Add a space.... ldy UsrBuf256 lda #' ' sta UsrBuf256,y *-------------------------------------- * BIN : Launch "/PATH/CMD ARGS" *-------------------------------------- Cmd.Exec.EXT.BIN >PUSHW L.CMD >PUSHWI UsrBuf256 >SYSCALL PStrCat lda ARGS beq .1 inc UsrBuf256 Add a space.... ldy UsrBuf256 lda #' ' sta UsrBuf256,y >PUSHW L.ARGS >PUSHWI UsrBuf256 >SYSCALL PStrCat .1 >LDYAI UsrBuf256 bit Cmd.Exec.Mode bmi .2 startproc >SYSCALL ExecProcessNewEnvYA rts .2 >SYSCALL CreateProcessYA rts *-------------------------------------- * Internal Commands *-------------------------------------- Cmd.Exec.CD lda ARGS bne Cmd.Exec.CD1 Cmd.Exec.PWD ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >SYSCALL PPrintFYA bcs .9 lda #13 >SYSCALL PutCA .9 rts Cmd.Exec.CD1 stz UsrBuf256 lda ARGS+1 cmp #'/' Full Path? beq .1 ldy #S.PS.hPREFIX no, init target prefix with actual prefix lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA >PUSHWI UsrBuf256 >SYSCALL PStrCpy .1 >PUSHW L.ARGS Append ARG to buffer >PUSHWI UsrBuf256 >SYSCALL PStrCat lda #'/' ldx UsrBuf256 cmp UsrBuf256,x Ending '/' ? beq .2 sta UsrBuf256+1,x no, add one... inc UsrBuf256 .2 ldx #0 path is something like : /dir1/../dir2/ .3 ldy #0 reset char counter .4 cpx UsrBuf256 beq .8 inx lda UsrBuf256,x cmp #'/' beq .5 iny char=char+1!!! bra .4 .5 tya any char count? beq .4 no, start counting... cpy #2 do we have /xx/? bne .3 no, skip this token lda #'.' cmp UsrBuf256-1,x /yy/x./ ? bne .3 cmp UsrBuf256-2,x /yy/../ ? bne .3 cpx #4 /../ ? beq Cmd.Exec.ERRSYN illegal txa tay save end of /../ sec sbc #3 remove ../ tax .6 dex lda UsrBuf256,x Found beginning of dir before /../ cmp #'/' bne .6 .7 lda UsrBuf256,y strip dir/../ sta UsrBuf256,x cpy UsrBuf256 beq .71 iny inx bra .7 .71 stx UsrBuf256 bra .2 Start over... .8 cpx #1 beq .80 we have '/' go change prefix >PUSHW L.STAT >PUSHWI UsrBuf256 >SYSCALL STAT bcs .9 lda STAT+S.STAT.P.TYPE cmp #$0F Directory ? bne Cmd.Exec.ERRSYN .80 >LDYAI UsrBuf256 >SYSCALL NewPStrYA bcs .9 phx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL FreeMemA pla ldy #S.PS.hPREFIX sta (pPs),y jsr SetPWD clc .9 rts *-------------------------------------- Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN sec rts *-------------------------------------- Cmd.Exec.STARTPROC lda ARGS beq Cmd.Exec.ERRSYN sec ror Cmd.Exec.Mode >LDYA L.ARGS jmp Cmd.ExecYA.1 *-------------------------------------- Cmd.Exec.SET lda ARGS bne Cmd.Exec.SETVAR ldy #S.PS.hENV lda (pPs),y >SYSCALL GetMemPtrA >STYA ZPPTR1 * No arg, print all ENV .1 lda (ZPPTR1) beq .8 Ending 0 ? lda ZPPTR1 get next for value sec adc (ZPPTR1) Add len+1 to PTR sta ZPPTR2 lda ZPPTR1+1 adc #0 sta ZPPTR2+1 lda (ZPPTR2) just in case... beq .8 >PUSHW ZPPTR2 Push value >PUSHW ZPPTR1 Push name >LDYA L.MSG.PRINTENV >SYSCALL CPrintFYA bcs .9 lda ZPPTR2 sec adc (ZPPTR2) Add len+1 to PTR sta ZPPTR1 lda ZPPTR2+1 adc #0 sta ZPPTR1+1 bra .1 .8 clc .9 rts Cmd.Exec.SETVAR tax lda ARGS,x cmp #'=' ARGS ends with =, UnsetEnv beq .2 .1 dex beq .3 no =, GetEnv lda ARGS,x cmp #'=' ARGS contains =, PutEnv bne .1 cpx #1 string is '=value' ? beq .99 syntax error >LDYA L.ARGS String is VAR=VALUE... >SYSCALL PutEnvYA rts .2 dec ARGS String is "VAR=", Remove endig '=' >LDYA L.ARGS String is "VAR"... >SYSCALL UnsetEnvYA rts * Print requested VAR .3 >LDYA L.ARGS >SYSCALL GetEnvYA bcs .8 >PUSHYA push value >PUSHW L.ARGS push name >LDYA L.MSG.PRINTENV >SYSCALL CPrintFYA .8 clc .9 rts .99 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.Exec.DATE sec .HS 90 bcc Cmd.Exec.TIME clc php >LDYA L.TIME >SYSCALL TimeYA >PUSHWI UsrBuf256 plp bcc .1 >PUSHW L.FMT.DATE bra .2 .1 >PUSHW L.FMT.TIME .2 >PUSHW L.TIME >SYSCALL PStrFTime >LDYAI UsrBuf256 >SYSCALL PPrintFYA bcs .9 lda #13 >SYSCALL PutCA .9 rts *-------------------------------------- Cmd.Exec.ECHO lda ARGS beq .1 >LDYA L.ARGS >SYSCALL PPrintFYA bcs .9 .1 lda #13 >SYSCALL PutCA .9 rts *-------------------------------------- Cmd.Exec.READ lda ARGS beq .9 lda #0 ldy #bSecureRead sta (pData),y lda pData clc adc #VarBuffer sta ZPPTR1 lda pData+1 adc #0 sta ZPPTR1+1 ldx #0 .1 cpx ARGS beq .8 inx lda ARGS,x cmp #' ' beq .1 cmp #'-' bne .7 cpx ARGS beq .9 inx lda ARGS,x cmp #'S' bne .2 ldy #bSecureRead lda #$80 sta (pData),y bra .1 .2 cmp #'P' bne .9 cpx ARGS beq .9 inx lda ARGS,x cmp #' ' bne .9 cpx ARGS beq .9 inx lda ARGS,x cmp #'"' bne .9 .3 cpx ARGS beq .9 inx lda ARGS,x cmp #'"' beq .1 phx >SYSCALL PutCA plx bcs .99 bra .3 .9 jmp Cmd.Exec.ERRSYN .70 inx lda ARGS,x cmp #' ' beq .1 .7 lda (ZPPTR1) cmp #VarLen.MAX beq .9 inc sta (ZPPTR1) tay lda ARGS,x sta (ZPPTR1),y cpx ARGS bne .70 .8 lda (ZPPTR1) No var name ? SYNERR beq .9 clc .99 rts *-------------------------------------- Cmd.Exec.PAUSE ldy #bPause lda #$80 sta (pData),y clc rts *-------------------------------------- Cmd.Exec.EXIT ldy #bEXIT lda #$FF sta (pData),y clc rts *-------------------------------------- MAN SAVE SBIN/SHELL.S.CMD LOAD SBIN/SHELL.S ASM