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 ldy #]1
ora (pData),y ora (pData),y
.EM .EM
*--------------------------------------
.MA EOR.G
ldy #]1
eor (pData),y
.EM
*-------------------------------------- *--------------------------------------
.MA CMP.G .MA CMP.G
ldy #]1 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 | | TCPIPD | Working | Socket API.ARP,IP,ICMP,UDP & TCP ok | 0.92 |
| DHCPCLNT| Working | rewritten to use new Socket API | 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 | | HTTPD | In Progress | | 0.9 |
## Internal Shell commands: ## 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 | | CD | Working | Improved syntax : now, 'CD ../BIN' works |
| MD | Working | Create a directory | | MD | Working | Create a directory |
| RD | Working | Delete an empty directory | | RD | Working | Delete an empty directory |
| PWD | Working | | | PWD | Working | Print Working Directory |
| DATE | Working | | | DATE | Working | |
| ECHO | Working | \b,\e,\f,\n,\\\ and \\% supported | | ECHO | Working | \b,\e,\f,\n,\\\ and \\% supported |
| EXIT | Working | | | EXIT | Working | exit shell |
| PAUSE | Working | | | PAUSE | Working | Wait until CR |
| READ | Working | -S : no echo (password) | | READ | Working | -S : no echo (password) |
| | | -P : "prompt message" | | | | -P : "prompt message" |
| TIME | Working | | | TIME | Working | |
| SET | Working | | | SET | Working | -X toggle debug mode |
| SLEEP | Working | | | SLEEP | Working | Wait <count> 10th sec |
| STARTPROC | Working | Used in A2osX.startup | | STARTPROC | Working | Used in A2osX.startup |
| IF ELSE FI | Working | [ -d direxists ] |
| | | [ -e fileordirexists ] |
| | | [ -f fileexists ] |
## Shell variables: ## Shell variables:

View File

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

View File

@ -52,13 +52,28 @@ Cmd.Exec >LDA.G CMD.IntCmd
.1 jmp (J.CMD.INT,x) .1 jmp (J.CMD.INT,x)
.8 clc
rts
.2 >PUSHB.G CMD.PSFlags .2 >PUSHB.G CMD.PSFlags
>LDYA ZPArgVBuf >LDYA ZPArgVBuf
>SYSCALL execv >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 rts
.3 >SLEEP Suspend this PID
.8 clc
.9 rts
*-------------------------------------- *--------------------------------------
* STARTPROC : intcmd = 0 * STARTPROC : intcmd = 0
*-------------------------------------- *--------------------------------------
@ -200,7 +215,19 @@ Cmd.INT.SET ldx #1
.8 clc .8 clc
.9 rts .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) lda (ZPPTR1)
cmp #'=' string is '=value' ? cmp #'=' string is '=value' ?
@ -231,6 +258,13 @@ Cmd.INT.SETVAR >STYA ZPPTR1
>SYSCALL UnsetEnv >SYSCALL UnsetEnv
rts rts
.8 clc
rts
.99 lda #E.SYN
sec
rts
* Print requested VAR * Print requested VAR
.3 >LDYA ZPPTR1 .3 >LDYA ZPPTR1
@ -239,12 +273,6 @@ Cmd.INT.SETVAR >STYA ZPPTR1
>PUSHYA push value >PUSHYA push value
>PUSHW ZPPTR1 push name >PUSHW ZPPTR1 push name
jsr Cmd.INT.SET.PRINT
.8 clc
.9 rts
.99 jmp Cmd.Exec.ERRSYN
*-------------------------------------- *--------------------------------------
Cmd.INT.SET.PRINT Cmd.INT.SET.PRINT
>PUSHBI 4 >PUSHBI 4
@ -274,37 +302,45 @@ Cmd.INT.TIME clc
>SYSCALL puts >SYSCALL puts
rts rts
*-------------------------------------- *--------------------------------------
Cmd.INT.ECHO ldx #1 Cmd.INT.ECHO lda #1
jsr Cmd.GetArgX >STA.G CMD.ArgIndex
bcs .71
>PUSHYA
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
bcs .9
ldx #2 tax
.1 phx
jsr Cmd.GetArgX jsr Cmd.GetArgX
bcs .7 bcs .7
>PUSHYA
lda #C.SPACE
>SYSCALL putchar
ldy #S.PS.hStdOut pha
lda (pPs),y >PUSHBI 0
>SYSCALL fputs pla
plx >SYSCALL printf
inx bcs .9
bcc .1
clc
rts
.7 plx >INC.G CMD.ArgIndex
.71 >LDA.G bECHO.N 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 bmi .8
>PUSHBI 0 >PUSHBI 0
@ -315,105 +351,53 @@ Cmd.INT.ECHO ldx #1
.8 clc .8 clc
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
Cmd.INT.READ ldx #1 Cmd.INT.READ lda #1
>STA.G CMD.ArgIndex
tax
jsr Cmd.GetArgX jsr Cmd.GetArgX
beq .9 bcs .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
.1 jsr CMD.IsSwitch
bcs .4
cmp #'S' cmp #'S'
bne .2 bne .2
lda #$80 lda #$ff
>STA.G bSecureRead >STA.G bREAD.S
jsr Cmd.NextCharPtr2 bra .7
beq .8
cmp #' '
bne .9
bra .1
.2 cmp #'P' .2 cmp #'P'
bne .9 bne .9
jsr Cmd.NextCharPtr2 >INC.G CMD.ArgIndex
beq .9 tax
jsr Cmd.GetArgX
cmp #' ' bcs .9
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 pha
>PUSHBI 0
inc pla
sta (pData),y >SYSCALL printf
bcs .99
ply
lda (ZPPtr2)
sta (ZPPTR1),y
iny
lda #0
sta (ZPPTR1),y
jsr Cmd.NextCharPtr2
beq .1
cmp #' '
beq .1
bra .7 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 beq .9
lda #$ff
>STA.G bReadMode
clc clc
rts
.9 lda #E.SYN
sec
.99 rts .99 rts
*-------------------------------------- *--------------------------------------
Cmd.INT.SLEEP ldx #1 Cmd.INT.SLEEP ldx #1
@ -506,11 +490,8 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
bcs .1 bcs .1
phx txa
ldx #3 >STA.G CMD.Operator
jsr Cmd.GetArgX
plx
bcs .9 we need one arg
jsr CMD.IF.UNARY jsr CMD.IF.UNARY
bcs .9 bcs .9
@ -524,11 +505,31 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
ldx #4 go check ] ldx #4 go check ]
bra .8 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 .8 jsr Cmd.GetArgX
beq .9 beq .9
@ -544,14 +545,20 @@ Cmd.INT.IF >LDA.G CMD.IF.PTR
bne .9 bne .9
clc 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 .9 lda #E.SYN
sec sec
rts rts
*--------------------------------------
CMD.IF.UNARY jmp (J.CMD.IF.TOKEN2,x)
CMD.IF.D jsr CMD.IF.DEF.7 CMD.IF.D jsr CMD.IF.DEF.7
bcs CMD.IF.DEF.9 bcs CMD.IF.DEF.9
>LDA.G CMD.Stat+S.STAT.P.TYPE >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 CMD.IF.DEF.9 ldx #0 false
clc 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 rts
*-------------------------------------- *--------------------------------------
Cmd.INT.ELSE >LDA.G CMD.IF.PTR Cmd.INT.ELSE >LDA.G CMD.IF.PTR
@ -623,52 +743,60 @@ Cmd.GetArgX >LDYA ZPArgVBuf
>STYA ZPPtr1 >STYA ZPPtr1
.1 jsr Cmd.NextArgPtr1 .1 lda (ZPPtr1)
bcs .9 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 dex
bpl .1 bpl .1
>LDYA ZPPtr1 >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 .8 clc
rts rts
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
Cmd.NextCharPtr2NB CMD.IsSwitch >STYA ZPPtr1
.1 jsr Cmd.NextCharPtr2 lda (ZPPtr1)
beq .9 cmp #'-'
cmp #C.SPACE bne .9
beq .1
.9 rts ldy #1
*-------------------------------------- lda (ZPPtr1),y
Cmd.NextCharPtr2 beq .9
inc ZPPtr2
bne .1 iny
inc ZPPtr2+1 lda (ZPPtr1),y
.1 lda (ZPPtr2) bne .9
rts
dey
lda (ZPPtr1),y
cmp #'a'
bcc .8
cmp #'z'+1
bcs .8
eor #$20
.8 clc
rts
.9 >LDYA ZPPtr1
sec
rts
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD SAVE /A2OSX.SRC/SBIN/SHELL.S.CMD

View File

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