A2osX/SBIN/SHELL.S.CMD.txt

628 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
*--------------------------------------
* Remove extra SPACE & comment
*--------------------------------------
Cmd.Normalize >LDYA pData
>STYA ZPPtr1
lda (pData) empty line...quit
beq .9
tax Char count
ldy #0
.1 jsr Cmd.Normalize.Next
beq .8 no more char, exit
cmp #' ' skip leading spaces
beq .1
cmp #'#' Comment ?
beq .8 ignore remaining chars
.3 iny add char to buffer
sta (pData),y
jsr Cmd.Normalize.Next
beq .8
cmp #' '
bne .3
iny add One SPACE to buffer
sta (pData),y
.5 jsr Cmd.Normalize.Next
beq .8
cmp #' '
beq .5 skip additional spaces
bne .3 no more space, add next word...
.8 tya
sta (pData)
.9 rts
Cmd.Normalize.Next
txa
beq .8
dex
inc ZPPtr1
bne .1
inc ZPPtr1+1
.1 lda (ZPPtr1)
.8 rts
*--------------------------------------
* Y,A -> Command line (formatted & not empty)
*--------------------------------------
Cmd.ExecYA stz bStartProc
Cmd.ExecYA.1 >SYSCALL ExpandPStrYA
>STYA ZPPtr1
phx
ldy #1
ldx #0 ARGS len
lda (ZPPtr1),y
.10 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.INTCMDS
>STYA ZPPtr2
ldx #0
.1 lda (ZPPtr2)
beq Cmd.Exec.EXT Ending 0, must be an external Cmd....
cmp CMD Same Len ?
bne .4
tay
.2 lda CMD,y
cmp #'a' To Uppercase
bcc .21
cmp #'z'+1
bcs .21
eor #$20
.21 cmp (ZPPtr2),y
bne .4
dey
bne .2
jsr .5 Found an internal Cmd...
bcs .3
lda #0
.3 ldy #S.PS.RC
sta (pPS),y
rts
.5 jmp (J.INTCMDS,x)
.4 inx
inx
lda ZPPtr2
sec
adc (ZPPtr2)
sta ZPPtr2
bcc .1
inc ZPPtr2+1
bra .1
*--------------------------------------
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 bStartProc
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
>PUSHYA
>LDYA L.MSG.PSTRCR
>SYSCALL PrintFYA
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 bStartProc
>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 PrintFYA
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 PrintFYA
.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 PrintFYA
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 PrintFYA
rts
Cmd.Exec.ECHO.CR
lda #13
>SYSCALL PutCharA
bcs Cmd.Exec.ECHO.RTS
lda #10
>SYSCALL PutCharA
Cmd.Exec.ECHO.RTS
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 PutCharA
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
bcs .9
rts
.9 jmp Cmd.Exec.ERRSYN
*--------------------------------------
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 /A2OSX.SRC/SBIN/SHELL.S.CMD
LOAD /A2OSX.SRC/SBIN/SHELL.S
ASM