Kernel 0.92 SHELL, IF ELSE FI with unary and binary operators

This commit is contained in:
Rémy GIBERT 2018-11-13 16:54:10 +01:00
parent 90323830f4
commit 09b24372ac
7 changed files with 367 additions and 198 deletions

Binary file not shown.

Binary file not shown.

View File

@ -204,6 +204,11 @@ AUTO 4,1
ldy #]1
ora (pData),y
.EM
*--------------------------------------
.MA EOR.G
ldy #]1
eor (pData),y
.EM
*--------------------------------------
.MA CMP.G
ldy #]1

View File

@ -255,7 +255,7 @@ OApple+1,OApple+2,OApple+3 to switch between screens : Kernel Log, text, DHGR.
| ---- | ------ | ------- | ----- |
| TCPIPD | Working | Socket API.ARP,IP,ICMP,UDP & TCP ok | 0.92 |
| DHCPCLNT| Working | rewritten to use new Socket API | 0.92 |
| TELNETD | In Progress | | 0.9 |
| TELNETD | In Progress | | 0.92 |
| HTTPD | In Progress | | 0.9 |
## Internal Shell commands:
@ -265,17 +265,20 @@ OApple+1,OApple+2,OApple+3 to switch between screens : Kernel Log, text, DHGR.
| CD | Working | Improved syntax : now, 'CD ../BIN' works |
| MD | Working | Create a directory |
| RD | Working | Delete an empty directory |
| PWD | Working | |
| PWD | Working | Print Working Directory |
| DATE | Working | |
| ECHO | Working | \b,\e,\f,\n,\\\ and \\% supported |
| EXIT | Working | |
| PAUSE | Working | |
| EXIT | Working | exit shell |
| PAUSE | Working | Wait until CR |
| READ | Working | -S : no echo (password) |
| | | -P : "prompt message" |
| TIME | Working | |
| SET | Working | |
| SLEEP | Working | |
| SET | Working | -X toggle debug mode |
| SLEEP | Working | Wait <count> 10th sec |
| STARTPROC | Working | Used in A2osX.startup |
| IF ELSE FI | Working | [ -d direxists ] |
| | | [ -e fileordirexists ] |
| | | [ -f fileexists ] |
## Shell variables:

View File

@ -128,7 +128,7 @@ CL.Insert >LDA.G CL.Len
txa
sta (ZPCMDBuf),y
>LDA.G bSecureRead
>LDA.G bREAD.S
bpl .2
ldx #'*'
@ -259,7 +259,10 @@ CL.PrintEOL.8 clc
rts
*--------------------------------------
CL.PrintCmdBuf >LDYA ZPCMDBuf
>SYSCALL printf
>PUSHYA
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
rts
*--------------------------------------
CL.GetLine lda (ZPFileBufPtr)
@ -351,12 +354,11 @@ CL.Parse >STZ.G CMD.IntCmd
>LDA.G CMD.IntCmd
bne .3 we already have Cmd, go check args
ldy #2
ldy #1
lda (ZPCMDBuf),y only one char ?
bne .2
dey
lda (ZPCMDBuf),y
lda (ZPCMDBuf)
cmp #'.' leading dot ?
bne .2

View File

@ -52,13 +52,28 @@ Cmd.Exec >LDA.G CMD.IntCmd
.1 jmp (J.CMD.INT,x)
.8 clc
rts
.2 >PUSHB.G CMD.PSFlags
>LDYA ZPArgVBuf
>SYSCALL execv
bcs .9
tax CPID
>LDA.G CMD.PSFlags
and #S.PS.F.HOLD
bne .3
txa
>PUSHA
>PUSHBI 1
>LDYA L.MSG.PID
>SYSCALL printf
rts
.3 >SLEEP Suspend this PID
.8 clc
.9 rts
*--------------------------------------
* STARTPROC : intcmd = 0
*--------------------------------------
@ -200,7 +215,19 @@ Cmd.INT.SET ldx #1
.8 clc
.9 rts
*--------------------------------------
Cmd.INT.SETVAR >STYA ZPPTR1
Cmd.INT.SETVAR jsr CMD.IsSwitch
bcs .10
cmp #'X'
bne .99
>LDA.G bSET.X
eor #$ff
sta (pData),y
clc
rts
.10 >STYA ZPPTR1
lda (ZPPTR1)
cmp #'=' string is '=value' ?
@ -231,6 +258,13 @@ Cmd.INT.SETVAR >STYA ZPPTR1
>SYSCALL UnsetEnv
rts
.8 clc
rts
.99 lda #E.SYN
sec
rts
* Print requested VAR
.3 >LDYA ZPPTR1
@ -239,12 +273,6 @@ Cmd.INT.SETVAR >STYA ZPPTR1
>PUSHYA push value
>PUSHW ZPPTR1 push name
jsr Cmd.INT.SET.PRINT
.8 clc
.9 rts
.99 jmp Cmd.Exec.ERRSYN
*--------------------------------------
Cmd.INT.SET.PRINT
>PUSHBI 4
@ -274,37 +302,45 @@ Cmd.INT.TIME clc
>SYSCALL puts
rts
*--------------------------------------
Cmd.INT.ECHO ldx #1
jsr Cmd.GetArgX
bcs .71
>PUSHYA
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
bcs .9
Cmd.INT.ECHO lda #1
>STA.G CMD.ArgIndex
ldx #2
.1 phx
tax
jsr Cmd.GetArgX
bcs .7
>PUSHYA
lda #C.SPACE
>SYSCALL putchar
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
plx
inx
bcc .1
clc
rts
pha
>PUSHBI 0
pla
>SYSCALL printf
bcs .9
.7 plx
.71 >LDA.G bECHO.N
>INC.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
bcs .7
.1 lda #C.SPACE
>SYSCALL putchar
bcs .9
>PUSHBI 0
>LDA.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
>SYSCALL printf
bcs .9
>INC.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
bcc .1
.7 >LDA.G bECHO.N
bmi .8
>PUSHBI 0
@ -315,105 +351,53 @@ Cmd.INT.ECHO ldx #1
.8 clc
.9 rts
*--------------------------------------
Cmd.INT.READ ldx #1
Cmd.INT.READ lda #1
>STA.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
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
bcs .9
.1 jsr CMD.IsSwitch
bcs .4
cmp #'S'
bne .2
lda #$80
>STA.G bSecureRead
lda #$ff
>STA.G bREAD.S
jsr Cmd.NextCharPtr2
beq .8
cmp #' '
bne .9
bra .1
bra .7
.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
>INC.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
bcs .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
>PUSHBI 0
pla
>SYSCALL printf
bcs .99
bra .7
.8 >LDA.G CMD.VarName.LEN No var name ? SYNERR
.4 >SYSCALL newstr
txa
>STA.G hVarName
.7 >INC.G CMD.ArgIndex
tax
jsr Cmd.GetArgX
bcc .1
>LDA.G hVarName
beq .9
lda #$ff
>STA.G bReadMode
clc
rts
.9 lda #E.SYN
sec
.99 rts
*--------------------------------------
Cmd.INT.SLEEP ldx #1
@ -506,11 +490,8 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
bcs .1
phx
ldx #3
jsr Cmd.GetArgX
plx
bcs .9 we need one arg
txa
>STA.G CMD.Operator
jsr CMD.IF.UNARY
bcs .9
@ -524,11 +505,31 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
ldx #4 go check ]
bra .8
.1
.9 lda #E.SYN
sec
rts
.1 ldx #3
jsr Cmd.GetArgX
beq .9
>PUSHYA
>LDYA L.CMD.IF.TOKEN3 -eq -ne .... ?
jsr Lookup
bcs .9
txa
>STA.G CMD.Operator
ldx #5
jsr CMD.IF.BINARY
bcs .9
>LDA.G CMD.IF.PTR
tay
txa
eor (pData),y
sta (pData),y
ldx #5 go check ]
.8 jsr Cmd.GetArgX
beq .9
@ -544,14 +545,20 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
bne .9
clc
.99 rts
rts
*--------------------------------------
CMD.IF.UNARY ldx #3
jsr Cmd.GetArgX
bcs .9 we need one arg
>LDA.G CMD.Operator
tax
jmp (J.CMD.IF.TOKEN2,x)
.9 lda #E.SYN
sec
rts
*--------------------------------------
CMD.IF.UNARY jmp (J.CMD.IF.TOKEN2,x)
CMD.IF.D jsr CMD.IF.DEF.7
bcs CMD.IF.DEF.9
>LDA.G CMD.Stat+S.STAT.P.TYPE
@ -583,6 +590,119 @@ CMD.IF.DEF.8 ldx #$ff true
CMD.IF.DEF.9 ldx #0 false
clc
rts
*--------------------------------------
CMD.IF.BINARY ldx #2
jsr Cmd.GetArgX
bcs .9
ldx #4
jsr Cmd.GetArgX
bcs .9
>LDA.G CMD.Operator
beq .1 =
cmp #2 !=
bne CMD.IF.BINARY.NUM
lda #$ff
>STA.G CMD.Operator
.1 ldx #2
jsr Cmd.GetArgX
>PUSHYA
ldx #4
jsr Cmd.GetArgX
>SYSCALL strcmp
lsr CS if !=
>EOR.G CMD.Operator
tax
clc
rts
.9 lda #E.SYN
sec
rts
CMD.IF.BINARY.NUM
ldx #2
jsr Cmd.GetArgX
bcs .9
>SYSCALL AToL
bcs .9
>PULLL.G CMD.NumArg1
ldx #4
jsr Cmd.GetArgX
bcs .9
>SYSCALL AToL
bcs .9
>PULLL.G CMD.NumArg2
ldx #4
ldy #CMD.NumArg2+3
.1 lda (pData),y
pha
dey
dex
bne .1
ldx #4
ldy #CMD.NumArg1
sec
.2 pla
sbc (pData),y
sta (pData),y
iny
dex
bne .2
bcc .5 CC if Arg1 < Arg2
ldy #CMD.NumArg1
lda (pData),y
iny
ora (pData),y
iny
ora (pData),y
iny
ora (pData),y Z if Arg1 = Arg2
bne .4
.3 lda #%001 001 arg1 = arg2
bra .6
.4 lda #%010 010 arg1 > arg2
bra .6
.5 lda #%100 100 Arg1 < Arg2
.6 pha
>LDA.G CMD.Operator
lsr
tax
pla
eor CMD.IF.TOKEN3.BITS,x
bne .80
ldx #$ff true
clc
rts
.80 ldx #0 false
clc
rts
.9 lda #E.SYN
sec
rts
*--------------------------------------
Cmd.INT.ELSE >LDA.G CMD.IF.PTR
@ -623,52 +743,60 @@ Cmd.GetArgX >LDYA ZPArgVBuf
>STYA ZPPtr1
.1 jsr Cmd.NextArgPtr1
bcs .9
.1 lda (ZPPtr1)
beq .9
.2 inc ZPPtr1
bne .3
inc ZPPtr1+1
.3 lda (ZPPtr1)
bne .2
inc ZPPtr1
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1)
beq .9
dex
bpl .1
>LDYA ZPPtr1
.8 clc
.9 rts
*--------------------------------------
Cmd.NextArgPtr1 lda (ZPPtr1)
beq .9
.1 inc ZPPtr1
bne .2
inc ZPPtr1+1
.2 lda (ZPPtr1)
bne .1
inc ZPPtr1
bne .3
inc ZPPtr1+1
.3 lda (ZPPtr1)
beq .9
.8 clc
rts
.9 sec
rts
*--------------------------------------
Cmd.NextCharPtr2NB
.1 jsr Cmd.NextCharPtr2
beq .9
cmp #C.SPACE
beq .1
CMD.IsSwitch >STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .9
.9 rts
*--------------------------------------
Cmd.NextCharPtr2
inc ZPPtr2
bne .1
inc ZPPtr2+1
.1 lda (ZPPtr2)
rts
ldy #1
lda (ZPPtr1),y
beq .9
iny
lda (ZPPtr1),y
bne .9
dey
lda (ZPPtr1),y
cmp #'a'
bcc .8
cmp #'z'+1
bcs .8
eor #$20
.8 clc
rts
.9 >LDYA ZPPtr1
sec
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD

View File

@ -45,9 +45,8 @@ ZPCSHStack .EQ ZPBIN+18
.FIN
*--------------------------------------
CmdLine.MAX .EQ 127
VarLen.MAX .EQ 15
History.MAX .EQ 256
CMD.IF.STACK.MAX .EQ 4
CMD.IF.STACK.MAX .EQ 8
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@ -80,6 +79,7 @@ L.MSG.ECHOCRLF .DA MSG.ECHOCRLF
L.MSG.BATCHERR .DA MSG.BATCHERR
L.MSG.ERROR .DA MSG.ERROR
L.MSG.PRINTENV .DA MSG.PRINTENV
L.MSG.PID .DA MSG.PID
L.ENV.PATH .DA ENV.PATH
L.ENV.PWD .DA ENV.PWD
L.ENV.PS1 .DA ENV.PS1
@ -165,7 +165,7 @@ CS.RUN jsr SetPWD
*--------------------------------------
CS.RUN.LOOP jsr CL.Reset
jsr IO.Reset
.1 jsr CheckSleep
beq .3
@ -205,7 +205,7 @@ CS.RUN.LOOP jsr CL.Reset
>STZ.G bPause
.6 >LDA.G bReadMode READ Command ?
.6 >LDA.G hVarName read mode ?
bne .7
>LDA.G hFileBuf batch mode ?
@ -218,8 +218,6 @@ CS.RUN.LOOP jsr CL.Reset
rts
*--------------------------------------
CS.RUN.INTERCATIVE
>STZ.G bSecureRead Clear password mode
jsr CL.PrintPrompt
bcs .9
@ -258,16 +256,31 @@ CS.RUN.READ
>LDA.G CL.bExec
bpl .1
>STZ.G bReadMode
lda (ZPCMDBuf)
beq .8
bne .2
>PUSHW ZPCMDBuf
>LDA.G hVarName
>SYSCALL GetMemPtr
>SYSCALL UnSetEnv
bra .7
.2 >PUSHW ZPCMDBuf
>LEA.G CMD.VarName
>LDA.G hVarName
>SYSCALL GetMemPtr
>SYSCALL SetEnv
.7 php
pha
>LDA.G hVarName
>SYSCALL freemem
>STZ.G hVarName
>STA.G bREAD.S
pla
plp
.8 jmp CS.RUN.LOOP.END
*--------------------------------------
CS.RUN.BATCH >SYSCALL GetChar
@ -319,7 +332,6 @@ CS.RUN.Exec jsr CL.Parse
lda (ZPArgVBuf)
beq CS.RUN.LOOP.8
jsr CMD.Exec
>SLEEP if S.PS.HOLD
*--------------------------------------
CS.RUN.LOOP.END ldy #S.PS.RC
sta (pPs),y
@ -450,6 +462,7 @@ MSG.ECHOCRLF .AZ "\r\n"
MSG.BATCHERR .AZ "^\r\nLine #%D:"
MSG.ERROR .AZ "[$%h]:%S.\r\n"
MSG.PRINTENV .AZ "%s=%s\r\n"
MSG.PID .AZ "PID=%d\r\n"
FMT.DATE .AZ "%A (%w), %B %d %Y"
FMT.TIME .AZ "%H:%M:%S (%I:%M:%S%p)"
*--------------------------------------
@ -489,16 +502,31 @@ CMD.INT .AZ "STARTPROC"
.AZ "FI"
.HS 00
*--------------------------------------
CMD.IF.TOKEN1 .AZ "["
.AZ "!["
CMD.IF.TOKEN1 .AZ "!["
.AZ "["
.HS 00
CMD.IF.TOKEN2 .AZ "-d"
.AZ "-e"
.AZ "-f"
.HS 00
CMD.IF.TOKEN3 .AZ "-eq"
CMD.IF.TOKEN3 .AZ "="
.AZ "!="
.AZ "-eq"
.AZ "-ne"
.HS 00
.AZ "-lt"
.AZ "-le"
.AZ "-gt"
.AZ "-ge"
.HS 00
CMD.IF.TOKEN3.BITS
.DA #%000
.DA #%000
.DA #%001
.DA #%110
.DA #%100
.DA #%101
.DA #%010
.DA #%011
*--------------------------------------
.DO CSH=1
.INB /A2OSX.SRC/SBIN/SHELL.C.CSH
@ -511,15 +539,15 @@ EscChars.Cnt .EQ *-EscChars
.DUMMY
.OR 0
DS.START
hFileBuf .BS 1
hFileBuf .BS 1 batch mode
hVarName .BS 1 read mode
bEscMode .BS 1
bPause .BS 1
bExit .BS 1
bSET.X .BS 1
bECHO.N .BS 1
bReadMode .BS 1
bSecureRead .BS 1
bREAD.S .BS 1
Sleep .BS 4
@ -532,9 +560,12 @@ CMD.hCmdLine .BS 1
CMD.hCmdBuf .BS 1
CMD.hArgVBuf .BS 1
CMD.ArgIndex .BS 1
CMD.Operator .BS 1
CMD.NumArg1 .BS 4
CMD.NumArg2 .BS 4
CMD.PSFlags .BS 1
CMD.VarName.LEN .BS 1
CMD.VarName .BS VarLen.MAX+1
CMD.Stat .BS S.STAT
CMD.Time .BS S.TIME