A2osX/SBIN/SHELL.S.CMD.txt
2018-10-19 17:26:21 +02:00

846 lines
14 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.

NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
.LIST OFF
*--------------------------------------
CMD.Init >LDYAI 256
>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 lda #S.PS.F.HOLD+S.PS.F.DUPENV
>STA.G CMD.PSFlags
>LDYA ZPCMDBuf
>SYSCALL ExpandStr
bcs .9
phx save expanded string
pha
>PUSHW ZPCMDBuf
pla
>SYSCALL Args2ArgV
plx
>SYSCALL FreeMem
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPArgVBuf
txa
>STA.G hArgVBuf
lda #0
sta (ZPArgVBuf)
.1 lda (ZPCMDBuf)
beq .8
>LDA.G CMD.hCmdLine
bne .6 we already have Cmd
jsr CMD.CheckExternal
bcs .9
.6 jsr CMD.AddToArgV
bcs .9
.7 jsr CMD.NextCmdBufToken
bra .1
.8 clc
rts
.9 rts
*--------------------------------------
* ZPCMDBuf-> argv[] (formatted & not empty)
*--------------------------------------
Cmd.Exec.CheckExternal
ldy #$ff
.1 iny
lda (ZPCMDBuf),y
beq .2 no / found, search...
cmp #'/'
bne .1
>LDYA ZPCMDBuf found /, some path specified, no search
>SYSCALL realpath
bcs .9
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
bcs .9
.2 >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 .9 No PATH, try in CD
jsr Cmd.Exec.EXT.Search
bcc Cmd.Exec.EXT.ARGS
ldy #S.PS.hPREFIX not found, try in CD
lda (pPs),y
>SYSCALL GetMemPtr
jsr Cmd.Exec.EXT.Search
bcc Cmd.Exec.EXT.ARGS
pha
>LDA.G CMD.hCmdLine
>SYSCALL FreeMem
pla
sec
.9 rts
*--------------------------------------
* CMD.hCmdLine = /path/bin
*--------------------------------------
Cmd.Exec.EXT.ARGS
ldx #0
jsr Cmd.RemoveStrAtX
>LDYA ZPCMDBuf
>SYSCALL puts
>DEBUG
>LDA.G CMD.hCmdLine
>SYSCALL GetMemPtr
ldx #0
jsr CMD.InsertStrYAAtX
>LDYA ZPCMDBuf
>SYSCALL puts
>DEBUG
>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 ArgV
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.Exec.INT >LDYA L.CMD.INT
>STYA ZPPtr2
ldx #0
.1 phx
>PUSHW ZPPtr2
>LDYA ZPCMDBuf
>SYSCALL StrCaseCmp
bcs .2
plx
jmp (J.CMD.INT,x) Found an internal Cmd...
.2 inc ZPPtr2
bne .3
inc ZPPtr2+1
.3 lda (ZPPtr2)
bne .2
inc ZPPtr2
bne .4
inc ZPPtr2+1
.4 plx
inx
inx
lda (ZPPtr2) Array Ending 0, must be an external Cmd....
bne .1
sec
rts
*--------------------------------------
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 >PUSHW ZPCMDBuf
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
bcs .9
ldx #1
.1 phx
jsr Cmd.GetStrAtX
bcs .7
>PUSHYA
lda #C.SPACE
>SYSCALL putchar
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
plx
inx
bcc .1
rts
.7 plx
>LDA.G bECHO.N
bmi .8
>PUSHBI 0
>LDYA L.MSG.ECHOCRLF
>SYSCALL printf
rts
.8 clc
.9 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.NextCmdBufToken
lda (ZPCMDBuf)
inc ZPCMDBuf
bne .1
inc ZPCMDBuf+1
.1 tax
bne CMD.NextCmdBuf
rts
*--------------------------------------
CMD.AddToArgV >LDYA ZPArgVBuf
>STYA ZPPtr1
.1 lda (ZPPtr1) scan to end of argV
beq .6
.2 inc ZPPtr1
bne .3
inc ZPPtr1+1
.3 lda (ZPPtr1)
bne .2
inc ZPPtr1
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1)
bne .2
.6 ldy #$ff
.7 iny
beq .9
lda (ZPCMDBuf),y
sta (ZPPtr1),y
bne .7 including str ending \0
iny
beq .9
sta (ZPPtr1),y arg[] ending \0
clc
rts
.9 lda #K.E.BUF
sec
rts
*--------------------------------------
Cmd.InsertStrYAAtX
>STYA ZPPtr3 new str to insert
jsr Cmd.GetStrAtX get ptr1=arg[x]
bcs .9
>STYA ZPPtr4 Save ptr where to insert
ldy $ff
.1 iny get new str len
lda (ZPPtr3),y
bne .1
tya
sec +1
adc ZPPtr1
sta ZPPtr2
lda #0
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 #ff copy new str in hole created
.6 iny
lda (ZPPtr3),y
sta (ZPPtr4),y
bne .6
.8 clc
.9 rts
*--------------------------------------
Cmd.RemoveStrAtX
jsr Cmd.GetStrAtX
bcs .9
jsr Cmd.NextStrPtr1
>STYA ZPPtr2
.3 ldy #0
.4 lda (ZPPtr2),y
sta (ZPPtr1),y
beq .5
iny
bra .4
.5 tya we moved the ending \0
beq .8
sec
adc ZPPtr2
sta ZPPtr2
bcc .6
inc ZPPtr2+1
.6 tya
sec
adc ZPPtr1
sta ZPPtr1
bcc .3
inc ZPPtr2+1
bra .3
.8 rts
*--------------------------------------
Cmd.GetStrAtX >LDYA ZPCMDBuf
.1 dex
bmi .8
>STYA ZPPtr1
jsr Cmd.NextStrPtr1
bcc .1
rts
.8 >LDYA ZPPtr1
clc
rts
*--------------------------------------
Cmd.NextStrPtr1 lda (ZPPtr1)
beq .9
.1 inc ZPPtr1
bne .2
inc ZPPtr1+1
.2 lda (ZPPtr1)
bne .1
inc ZPPtr1
bne .8
inc ZPPtr1+1
.8 clc
rts
.9 sec
rts
*--------------------------------------
Cmd.NextStrPtr2 lda (ZPPtr2)
beq .9
>LDYA ZPPtr2
>SYSCALL strlen
pha
tya
sec +1
adc ZPPtr2
tay
pla
adc ZPPtr2+1
* clc
rts
.9 sec
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