A2osX/SBIN/SHELL.S.CMD.txt

640 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
CMD.Init >LDYAI CmdLine.MAX+1
>SYSCALL GetMem.YA
bcs .9
txa
>SETG.A hCmdBuf
.9 rts
*--------------------------------------
* ZPCMDBuf : Remove extra SPACE & comment
*--------------------------------------
Cmd.Parse >LDYA ZPCMDBuf
>STYA ZPPtr1
lda (ZPCMDBuf) empty line...quit
beq .9
ldy #0
.1 jsr Cmd.Parse.NextC
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.Parse.NextC
beq .8
cmp #' '
bne .3
sta (ZPCMDBuf),y add One SPACE to buffer
iny
.5 jsr Cmd.Parse.NextC
beq .8
cmp #' '
beq .5 skip additional spaces
bne .3 no more space, add next word...
.8 lda #0
sta (ZPCMDBuf),y
.9 rts
Cmd.Parse.NextC lda (ZPPtr1)
beq .8
inc ZPPtr1
bne .8
inc ZPPtr1+1 never Z
.8 rts
*--------------------------------------
* ZPCMDBuf-> Command line (formatted & not empty)
*--------------------------------------
Cmd.Exec stz bStartProc
>LDYA ZPCMDBuf
Cmd.ExecYA >SYSCALL ExpandStr.YA
>STYA ZPPtr1 Ptr to CMD
txa
>SETG.A CMD.hCmdLine
ldy #$ff CMD Len
.1 iny
lda (ZPPtr1),y Get CMD char...
beq .2
cmp #" " we reached blank between CMD ARGS
bne .1
.2 phy Y=CMD len
>LDYA L.INTCMDS
>STYA ZPPtr2
ldx #0
.3 lda (ZPPtr2)
beq Cmd.Exec.EXT Array Ending 0, must be an external Cmd....
pla get back CMD len
pha
cmp (ZPPtr2) Same Len ?
beq .5
.4 inx
inx
lda ZPPtr2
sec
adc (ZPPtr2)
sta ZPPtr2
bcc .3
inc ZPPtr2+1
bra .3
.5 tay
dey
lda (ZPPtr1),y
cmp #'a' To Uppercase
bcc .6
cmp #'z'+1
bcs .6
eor #$20
.6 iny
cmp (ZPPtr2),y
bne .4
dey
dey
bne .5
ply get back Cmd Len
lda (ZPPtr1),y
beq .7 ARGS = ""
iny skip " "
.7 tya
clc
adc ZPPtr1
sta ZPPtr2
lda #0
adc ZPPtr1+1
sta ZPPtr2+1 ZPPtr2->ARGS
jsr Cmd.Exec.INT Found an internal Cmd...
bcs .9
lda #0
.9 ldy #S.PS.RC
sta (pPS),y
Cmd.Exec.Done php
pha
>GETG.A CMD.hCmdLine
>SYSCALL FreeMem.A
pla
plp
rts
*--------------------------------------
Cmd.Exec.INT jmp (J.INTCMDS,x)
*--------------------------------------
Cmd.Exec.EXT pla Discard CMD len
lda (ZPPtr1)
cmp #'/' Command line is already full path, no search
bne .10
jmp .3
.10 >LDYA L.ENV.PATH push ENVNAME=PATH for search
>SYSCALL GetEnv.YA get value for ENV=PATH
bcs .1 No PATH, try in CD
>PUSHYA push search list
>PUSHW ZPPtr1 push filename
>PUSHWI UsrBuf256
>PUSHW L.STAT
>SYSCALL FileSearch
bcc .2
.1 ldy #S.PS.hPREFIX not found, try in CD
lda (pPs),y
>SYSCALL GetMemPtr.A
>PUSHYA push search list
>PUSHW ZPPtr1
>PUSHWI UsrBuf256
>PUSHW L.STAT
>SYSCALL FileSearch
bcs .99
.2 phx save X=hMem, Y,A = Filename
>PUSHYA
>PUSHW L.CMD replace CMD in TmpBuffer with full path
>SYSCALL StrCpy
pla
>SYSCALL FreeMem.A 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 jmp Cmd.Exec.Done
*--------------------------------------
* TXT : Launch "/PATH/SHELL /PATH/CMD ARGS"
*--------------------------------------
Cmd.Exec.EXT.TXT
lda #0 Get arg[0] = /PATH/SHELL
>SYSCALL GetArg.A
>PUSHYA
>PUSHWI UsrBuf256
>SYSCALL StrCpy
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 StrCat
lda ARGS
beq .1
inc UsrBuf256 Add a space....
ldy UsrBuf256
lda #' '
sta UsrBuf256,y
>PUSHW L.ARGS
>PUSHWI UsrBuf256
>SYSCALL StrCat
.1 >LDYAI UsrBuf256
bit bStartProc
bmi .2 startproc
>SYSCALL ExecProcessNewEnvYA
jmp Cmd.Exec.Done
.2 >SYSCALL CreateProcessYA
jmp Cmd.Exec.Done
*--------------------------------------
* Internal Commands
*--------------------------------------
Cmd.Exec.CD lda ARGS
bne Cmd.Exec.CD1
Cmd.Exec.PWD ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL GetMemPtr.A
>PUSHYA
>LDYA L.MSG.PSTRCR
>SYSCALL PrintF.YA
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 GetMemPtr.A
>PUSHYA
>PUSHWI UsrBuf256
>SYSCALL StrCpy
.1 >PUSHW L.ARGS Append ARG to buffer
>PUSHWI UsrBuf256
>SYSCALL StrCat
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 NewStr.YA
bcs .9
phx
ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL FreeMem.A
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 bStartProc
>LDYA L.ARGS
jmp Cmd.ExecYA
*--------------------------------------
Cmd.Exec.SET lda ARGS
bne Cmd.Exec.SETVAR
ldy #S.PS.hENV
lda (pPs),y
>SYSCALL GetMemPtr.A
>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 PrintF.YA
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 PutEnv.YA
rts
.2 dec ARGS String is "VAR=", Remove endig '='
>LDYA L.ARGS String is "VAR"...
>SYSCALL UnsetEnv.YA
rts
* Print requested VAR
.3 >LDYA L.ARGS
>SYSCALL GetEnv.YA
bcs .8
>PUSHYA push value
>PUSHW L.ARGS push name
>LDYA L.MSG.PRINTENV
>SYSCALL PrintF.YA
.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 StrFTime
>LDYAI UsrBuf256
>SYSCALL PrintF.YA
bcs Cmd.Exec.ECHO.RTS
bra Cmd.Exec.ECHO.CR
*--------------------------------------
Cmd.Exec.ECHO lda ARGS
beq Cmd.Exec.ECHO.CR
>PUSHW L.ARGS
>LDYA L.MSG.PSTRCR
>SYSCALL PrintF.YA
rts
Cmd.Exec.ECHO.CR
lda #13
>SYSCALL PutChar.A
bcs Cmd.Exec.ECHO.RTS
lda #10
>SYSCALL PutChar.A
Cmd.Exec.ECHO.RTS
rts
*--------------------------------------
Cmd.Exec.READ lda ARGS
beq .9
lda #0
>SETG.A bSecureRead
lda pData
clc
adc #CMD.VarName
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
lda #$80
>SETG.A bSecureRead
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 PutChar.A
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.SLEEP lda ARGS
beq .9
lda #Sleep
clc
adc pData
tay
lda /Sleep
adc pData+1
>PUSHYA
>PUSHW L.ARGS
>SYSCALL AToI.YA
bcs .9
rts
.9 jmp Cmd.Exec.ERRSYN
*--------------------------------------
Cmd.Exec.PAUSE lda #$FF
>SETG.A bPause
clc
rts
*--------------------------------------
Cmd.Exec.EXIT lda #$FF
>SETG.A bExit
clc
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD
LOAD /A2OSX.SRC/SBIN/SHELL.S
ASM