diff --git a/.Docs/Shell Developers Guide.md b/.Docs/Shell Developers Guide.md
index 99351e3d..6a1288e0 100644
--- a/.Docs/Shell Developers Guide.md
+++ b/.Docs/Shell Developers Guide.md
@@ -134,7 +134,7 @@ Notice that the DO X and DO Y logic is swapped between the two cases.
| PUSHD | Working | Save actual working directory
PUSHD \
do also a CD to \ |
| PWD | Working | Print Working Directory |
| RD | Working | Delete an empty directory |
-| READ | Working | -S : no echo (password)
-P : "prompt message" |
+| READ | Working | -S : no echo (password)
-P : "prompt message"
-N maxchar |
| REN | Working | Rename a file, directory or volume |
| SET | Working | -X : toggle debug mode
-C : toggle Control-C break mode
-E : toggle error printing mode
-F : delete all declared functions |
| SHIFT | Working | Remove $1 from cmd line |
diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po
index 2fd5e3a4..d4090cd6 100644
Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ
diff --git a/BIN/SH.S.CL.txt b/BIN/SH.S.CL.txt
index 7f7ed903..07b858a5 100644
--- a/BIN/SH.S.CL.txt
+++ b/BIN/SH.S.CL.txt
@@ -104,9 +104,10 @@ CL.CHARIN.CTRL cpx #C.CR
rts
*--------------------------------------
CL.Insert >LDA.G CL.Len
+ >CMP.G READ.N
+ beq .8 Buffer full, discard...
inc
- beq .9 Buffer full, discard...
- sta (pData),y
+ >STA.G CL.Len
pha
@@ -128,21 +129,23 @@ CL.Insert >LDA.G CL.Len
txa
sta (ZPCLBuf),y
- >LDA.G bREAD.S
- bpl .2
-
>INC.G CL.Ptr
- clc
- rts
-.2 txa
+ >LDA.G bREAD.S
+ bmi .7
+
+ txa
>SYSCALL PutChar
+ jsr CL.PrintEOL
- >INC.G CL.Ptr
+.7 >LDA.G READ.N READ N = 1, don't wait for CR
+ dec
+ bne .8
- jmp CL.PrintEOL
+ lda #$ff
+ >STA.G CL.bReady
-.9 clc
+.8 clc
rts
*--------------------------------------
CL.CLR lda (ZPCLBuf)
diff --git a/BIN/SH.S.CMD.txt b/BIN/SH.S.CMD.txt
index f377fd0e..79203d07 100644
--- a/BIN/SH.S.CMD.txt
+++ b/BIN/SH.S.CMD.txt
@@ -7,12 +7,16 @@ CMD.. lda (ZPArgVBufPtr)
>LDYA ZPArgVBufPtr
jsr IO.Load
- bcs .99
- >LDYA ZPArgVBufPtr
- jmp CORE.Load.YAX exec cmd file and continue
+ bcs CMD.SHIFTA.RTS
-.9 jmp CMD.Exec.CSYN
-.99 rts
+ >LDYA ZPArgVBufPtr
+ jsr CORE.Load.YAX Exec . file
+ bcs CMD.SHIFTA.RTS
+
+ lda #$C0+C..
+ jmp CORE.StkPush
+
+.9 jmp CMD.E.CSYN
*--------------------------------------
CMD.NOHUP lda #S.PS.F.NOHUP
tsb CORE.PSFlags
@@ -33,7 +37,7 @@ CMD.SHIFTA >SYSCALL ArgV
sta (pPS),y
.8 clc
- rts
+CMD.SHIFTA.RTS rts
*--------------------------------------
CMD.PUSHD >LDA.G PUSHD.STACK
cmp #PUSHD.STACK+PUSHD.STACK.MAX
@@ -69,7 +73,7 @@ CMD.POPD >LDA.G PUSHD.STACK
CMD.POPD.RTS
rts
-CMD.POPD.CSYN jmp CMD.Exec.CSYN
+CMD.POPD.CSYN jmp CMD.E.CSYN
*--------------------------------------
CMD.PWD ldy #S.PS.hCWD
lda (pPs),y
@@ -285,7 +289,7 @@ CMD.SET.1
.8 clc
.9 rts
-.99 jmp CMD.Exec.CSYN
+.99 jmp CMD.E.CSYN
CMD.SET.UNSET >LDYA ZPVarNamePtr
>SYSCALL UnsetEnv
@@ -319,16 +323,16 @@ CMD.SET.EXEC jsr CORE.ArgV.NextChar skip "`"
jsr IO.Pipe.In
bcs .9
- lda #$ff
- >STA.G bREAD.S secret
- >STA.G bReadMode
+ lda #255
+ >STA.G READ.N
+ >STA.G bREAD.S
+
+ jmp CMD.READ.VAR
- >SLEEP
- clc
.9 rts
*--------------------------------------
CMD.DATE sec
- .HS 90 bcc
+ .HS 90 BCC
CMD.TIME clc
php
>LEA.G TimeBuf
@@ -444,10 +448,16 @@ CMD.GETKEY lda (ZPArgVBufPtr)
>LDYA ZPArgVBufPtr
>SYSCALL SetEnv
-.9 rts
+.9
+CMD.GETKEY.RTS rts
*--------------------------------------
CMD.READ lda (ZPArgVBufPtr)
- beq .9
+ beq .9
+
+ stz ZPVarNamePtr+1
+ >STZ.G bREAD.S
+ dec
+ >STA.G READ.N
.1 jsr CMD.IsSwitch
bcs .4
@@ -457,10 +467,10 @@ CMD.READ lda (ZPArgVBufPtr)
lda #$ff
>STA.G bREAD.S
- bra .7
+ bra .5
-.2 cmp #'P'
- bne .9
+.2 cmp #'P'
+ bne .3
jsr CORE.ArgV.Next
beq .9
@@ -468,39 +478,73 @@ CMD.READ lda (ZPArgVBufPtr)
>PUSHBI 0
>LDYA ZPArgVBufPtr
>SYSCALL printf
- bcs .99
- bra .7
+ bcs CMD.GETKEY.RTS
+ bra .5
+
+.9 jmp CMD.E.CSYN
+
+.3 cmp #'N'
+ bne .9
+
+ jsr CORE.ArgV.Next
+ beq .9
+
+ >LDYA ZPArgVBufPtr
+ >SYSCALL AToL
+ bcs CMD.GETKEY.RTS
+
+ >PULLA
+ >STA.G READ.N
+
+ inc pStack
+ inc pStack
+ inc pStack
+
+ bra .5
.4 >LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
- >LDA.G bReadMode
- bne .9
- lda #$ff
- >STA.G bReadMode
-
-.7 jsr CORE.ArgV.Next
+.5 jsr CORE.ArgV.Next
bne .1
- >LDA.G bReadMode
+ lda ZPVarNamePtr+1
beq .9
- clc
-.99 rts
-.9 jmp CMD.Exec.CSYN
+CMD.READ.VAR jsr CL.Reset
+
+.1 >SYSCALL GetChar
+ bcs .9
+
+ jsr CL.CHARIN
+
+ >LDA.G CL.bReady
+ bpl .1
+
+ lda (ZPCLBuf)
+ bne .2
+
+ >LDYA ZPVarNamePtr
+ >SYSCALL UnSetEnv
+ rts
+
+.2 >PUSHW ZPCLBuf
+
+ >LDYA ZPVarNamePtr
+ >SYSCALL SetEnv
+
+.9 rts
*--------------------------------------
CMD.SLEEP lda (ZPArgVBufPtr)
- beq .9
+ beq CMD.REN.CSYN
>LDYA ZPArgVBufPtr
>SYSCALL AToL
- bcs .9
+ bcs CMD.REN.CSYN
>PULLL.G Sleep
clc
rts
-
-.9 jmp CMD.Exec.CSYN
*--------------------------------------
CMD.PAUSE lda #$FF
>STA.G bPause
@@ -508,13 +552,11 @@ CMD.PAUSE lda #$FF
rts
*--------------------------------------
CMD.MD lda (ZPArgVBufPtr)
- beq .9
+ beq CMD.REN.CSYN
>LDYA ZPArgVBufPtr
>SYSCALL MKDir
rts
-
-.9 jmp CMD.Exec.CSYN
*--------------------------------------
CMD.REN lda (ZPArgVBufPtr)
beq .9
@@ -529,10 +571,11 @@ CMD.REN lda (ZPArgVBufPtr)
rts
.90 >PULLYA
-.9 jmp CMD.Exec.CSYN
+.9
+CMD.REN.CSYN jmp CMD.E.CSYN
*--------------------------------------
CMD.RD lda (ZPArgVBufPtr)
- beq .9
+ beq CMD.REN.CSYN
>PUSHEA.G StatBuf
>LDYA ZPArgVBufPtr
@@ -541,13 +584,11 @@ CMD.RD lda (ZPArgVBufPtr)
>LDA.G StatBuf+S.STAT.P.TYPE
cmp #S.FI.T.DIR
- bne .9
+ bne CMD.REN.CSYN
>LDYA ZPArgVBufPtr
>SYSCALL Remove
.99 rts
-
-.9 jmp CMD.Exec.CSYN
*--------------------------------------
CMD.FUNCTION lda (ZPArgVBufPtr)
beq .9
@@ -580,7 +621,7 @@ CMD.FUNCTION lda (ZPArgVBufPtr)
lda (ZPArgVBufPtr),y
beq .11
-.9 jmp CMD.Exec.CSYN
+.9 jmp CMD.E.CSYN
.99 rts
*--------------------------------------
@@ -659,7 +700,11 @@ CMD.CALL >LDA.G hFuncList
bcs CMD.CALL.RTS
>LDYA ZPArgVBufPtr FUNC PARAM1 PARAM2...
- jmp CORE.Load.YAX
+ jsr CORE.Load.YAX Exec FUNC
+ bcs CMD.CALL.RTS
+
+ lda #$C0+C.CALL
+ jmp CORE.StkPush
*--------------------------------------
CMD.EXIT lda (ZPArgVBufPtr)
beq .1 no arg, exit 0
@@ -678,12 +723,18 @@ CMD.EXIT lda (ZPArgVBufPtr)
inc pStack
.1 sta M32.ACC
-
-.2 jsr CORE.StkPull
+
+.2 jsr CORE.StkPull Pull everything until CALL . CL...
bcs .9
- cmp #$C0 in CALL / . context ?
- beq CMD.EXIT.CALL
+ cmp #$C0+C.. in CALL . CL context ?
+ beq CMD.EXIT.FILE
+
+ cmp #$C0+C.CALL
+ beq CMD.EXIT.FILE
+
+ cmp #$C0+C.CLEXEC
+ beq CMD.EXIT.SH
jsr CMD.EXIT.POP
bcc .2
@@ -694,7 +745,14 @@ CMD.EXIT lda (ZPArgVBufPtr)
* sec
rts
*--------------------------------------
-CMD.EXIT.CALL jsr CORE.StkPull
+CMD.EXIT.SH jsr CMD.EXIT.FILE
+
+ lda #$ff
+ >STA.G bExitOnEOF
+ clc
+ rts
+*--------------------------------------
+CMD.EXIT.FILE jsr CORE.StkPull
>SYSCALL freemem Code buffer
ldy #S.PS.hARGV
@@ -776,11 +834,12 @@ CMD.BREAK jsr CORE.StkGetCtx Get context in CORE.TestResult
jsr CORE.StkPull remove C.CASE
jsr CORE.StkGet
and #$7F
+
sta (pDATA),y
.8 clc
rts
-.9 jmp CMD.Exec.CSYN
+.9 jmp CMD.E.CSYN
*--------------------------------------
* stack-1 hVALUE
* stack SWITCH TOKEN
@@ -793,6 +852,7 @@ CMD.SWITCH jsr CORE.StkGetCtx
jsr EXP.GET
bcs .9
+
>SYSCALL strdup
bcs .9
@@ -850,17 +910,20 @@ CMD.CASE jsr CORE.StkGetCtx Get context in CORE.TestResult
ora #C.CASE
jmp CORE.StkPush
-.9 jmp CMD.Exec.CSYN
+.9
+CMD.E.CSYN lda #E.CSYN
+ sec
+ rts
*--------------------------------------
CMD.DEFAULT jsr CORE.StkGetCtx Get context in CORE.TestResult
- bcs .9
+ bcs CMD.E.CSYN
and #$3F
cmp #C.SWITCH
beq .1
cmp #C.CASE
- bne .9
+ bne CMD.E.CSYN
jsr CORE.StkPull remove C.CASE
@@ -868,11 +931,9 @@ CMD.DEFAULT jsr CORE.StkGetCtx Get context in CORE.TestResult
and #$C0
ora #C.DEFAULT
jmp CORE.StkPush
-
-.9 jmp CMD.Exec.CSYN
*--------------------------------------
CMD.END jsr CORE.StkGetCtx Get context in CORE.TestResult
- bcs CMD.END.CSYN
+ bcs CMD.E.CSYN
and #$3F
cmp #C.SWITCH
@@ -882,7 +943,7 @@ CMD.END jsr CORE.StkGetCtx Get context in CORE.TestResult
beq .2
cmp #C.DEFAULT
- bne CMD.END.CSYN
+ bne CMD.E.CSYN
.2 jsr CORE.StkPull remove C.CASE or C.DEFAULT
@@ -890,27 +951,25 @@ CMD.END jsr CORE.StkGetCtx Get context in CORE.TestResult
jsr CORE.StkPull get hVALUE
>SYSCALL freemem
rts
-
-CMD.END.CSYN jmp CMD.Exec.CSYN
*--------------------------------------
CMD.FOR jsr CORE.StkGetCtx
lda (ZPArgVBufPtr)
- beq CMD.END.CSYN
+ beq CMD.E.CSYN
>LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
jsr CORE.ArgV.Next
- beq CMD.END.CSYN
+ beq CMD.E.CSYN
>PUSHW ZPArgVBufPtr
>LDYA L.IN
>SYSCALL StrCaseCmp
- bcs CMD.END.CSYN
+ bcs CMD.E.CSYN
jsr CORE.ArgV.Next
- beq CMD.END.CSYN
+ beq CMD.E.CSYN
lda #8 Make sure 8 bytes free on stack
jsr CORE.StkCheck
diff --git a/BIN/SH.S.CORE.txt b/BIN/SH.S.CORE.txt
index 146e537e..c9634a19 100644
--- a/BIN/SH.S.CORE.txt
+++ b/BIN/SH.S.CORE.txt
@@ -21,20 +21,18 @@ CORE.FUNCRESET >LDA.G hFuncList
>SYSCALL SListFree
>STZ.G hFuncList
-.8
-CORE.FUNCRESET.RTS
- rts
+.8 rts
*--------------------------------------
-CORE.Load.YAX stx M32.ACC X=Code to Execute
+CORE.Load.YAX stx M32.ACC X = Code to Execute
jsr CORE.ArgV.Dup Y,A = ArgV
- bcs CORE.FUNCRESET.RTS
- sta M32.ACC+2 A=ARGC
- stx M32.ACC+1 X=ARGV
+ bcs .9
+ sta M32.ACC+2 A = ARGC
+ stx M32.ACC+1 X = hARGV
lda #8
jsr CORE.StkCheck
- bcs CORE.FUNCRESET.RTS
+ bcs .9
>LDYA ZPInputBuf
jsr CORE.StkPushYA
@@ -48,7 +46,7 @@ CORE.Load.YAX stx M32.ACC X=Code to Execute
ldy #S.PS.hARGV
lda (pPS),y
- jsr CORE.StkPush old ARGV
+ jsr CORE.StkPush old hARGV
ldy #S.PS.ARGC
lda M32.ACC+2 new ARGC
@@ -56,18 +54,18 @@ CORE.Load.YAX stx M32.ACC X=Code to Execute
iny #S.PS.hARGV
lda M32.ACC+1
- sta (pPS),y new ARGV
+ sta (pPS),y new hARGV
lda M32.ACC new code
jsr CORE.StkPush
- lda M32.ACC
+* lda M32.ACC
>SYSCALL GetMemPtr
>STYA ZPInputBuf
>STYA ZPInputBufPtr
- lda #$C0
- jmp CORE.StkPush
+* clc
+.9 rts
*--------------------------------------
* http://heirloom.sourceforge.net/sh/sh.1.html
*--------------------------------------
@@ -94,13 +92,16 @@ CORE.Load.YAX stx M32.ACC X=Code to Execute
* set hStdOut = Std
*--------------------------------------
CORE.Run.EOF jsr CORE.StkPull
- bcs .9
+ bcs *
- cmp #$C0 in CALL / . context ?
+ cmp #$C0+C.. check CALL . CL context
+ beq .1
+ cmp #$C0+C.CALL
+ beq .1
+ cmp #$C0+C.CLEXEC
bne .9
- jsr CMD.EXIT.CALL
- bcs .9
+.1 jsr CMD.EXIT.FILE
jsr IO.Reset
@@ -108,7 +109,7 @@ CORE.Run.EOF jsr CORE.StkPull
sec
rts Ending 0, CS,A=0
-.9 lda #E.UNEXP
+.9 lda #E.UNEXPEOF
sec
rts
*--------------------------------------
@@ -305,12 +306,14 @@ CORE.SkipLine jsr CORE.GetNextCharNB
* search ZPInputBufPtr/ZPArgVBufPtr in Y,A table
*--------------------------------------
CORE.LookupInputBuf
- >STYA ZPPtr1
- >LDYA ZPInputBufPtr
- bra CORE.Lookup
-CORE.LookupArgVBuf
- >STYA ZPPtr1
+ sec
+ .HS 90 BCC
+CORE.LookupArgVBuf
+ clc
+ >STYA ZPPtr1 Keywords table
>LDYA ZPArgVBufPtr
+ bcc CORE.Lookup
+ >LDYA ZPInputBufPtr
CORE.Lookup >STYA ZPPtr2
@@ -318,47 +321,59 @@ CORE.Lookup >STYA ZPPtr2
.1 ldy #$ff
-.2 iny
- lda (ZPPtr2),y
- beq .3 Src Keyword end
-
- jsr CORE.IsSpaceOrEndCmd
- bcc .3 Src Keyword end
+.2 jsr .7 get next valid char in src text
+ bcs .3
- lda (ZPPtr1),y
- beq .4 Table Keyword end
- lda (ZPPtr2),y
+.20 jsr ToUpperCase
+
+ eor (ZPPtr1),y match table char ?
+ asl compare only 7 bits
+ bne .4 no match...get next table keyword
- jsr ToUpperCase
-
- cmp (ZPPtr1),y
- beq .2
+ bcc .2 not last char in this keyword
+
+ jsr .7 next char in text...
+ bcc .4 valid....failed
+
+.8 tya Keyword Len
- bra .4
-
-.3 lda (ZPPtr1),y
- bne .4
-
- tya Keyword Len
- dey
clc
-.8 rts
-
-.4 jsr IncPtr1
+ rts
- lda (ZPPtr1)
- bne .4
+.3 dey
+ lda (ZPPtr1),y was last char in this keyword ?
+ bmi .8
+
+ iny
+
+.41 jsr IncPtr1 skip chars to next keyword
+
+.4 lda (ZPPtr1)
+ bpl .41
jsr IncPtr1
.6 inx
- lda (ZPPtr1) Array Ending 0, must be an external Cmd....
+ lda (ZPPtr1) Array Ending 0, lookup failed
bne .1
lda #E.SYN
sec
rts
+
+.7 iny
+ lda (ZPPtr2),y Get Src text char...
+ beq .9 end of text
+
+ jsr CORE.IsSpaceOrEndCmd
+ bcc .9 end of valid chars
+
+ clc
+ rts
+
+.9 sec
+ rts
*--------------------------------------
* ArgV
*--------------------------------------
@@ -388,7 +403,7 @@ CORE.ArgV.Dup >STYA ZPPtr1
>STYA ZPPtr2
- lda #$ff Arg count-1 (skip $0)
+ lda #$ff Arg count-1 (skip $0)
pha
.5 pla
@@ -666,16 +681,22 @@ CORE.StkGetCtx jsr CORE.StkGet
tax
bcs .1 no context...
- cmp #$C0 in a call...
+ cmp #$C0+C.. in a call...
beq .1 CS
+ cmp #$C0+C.CALL
+ beq .1 CS
+
+ cmp #$C0+C.CLEXEC
+ beq .1 CS
+
and #$80 get current..
lsr becomes parent
- bra .2
+ bra .8
.1 lda #$40 ...set Parent = true
-.2 sta CORE.TestResult
+.8 sta CORE.TestResult
txa
rts
diff --git a/BIN/SH.S.EXP.txt b/BIN/SH.S.EXP.txt
index d7e5adc5..1440c89c 100644
--- a/BIN/SH.S.EXP.txt
+++ b/BIN/SH.S.EXP.txt
@@ -28,11 +28,11 @@ EXP.GET jsr CORE.ArgV.Next
jsr EXP.FPU.EXEC
- jsr CORE.ArgV.Next another op ?
+ jsr CORE.ArgV.Next another op ?
bne .2
.8 >PUSHBI 4 ACC on stack
- >PUSHW L.M32.Printf
+ >PUSHW L.FMT.Long
>LEA.G M32.BUF
>SYSCALL sprintf
bcs .9
diff --git a/BIN/SH.S.IO.txt b/BIN/SH.S.IO.txt
index 8bbb1107..6b090e24 100644
--- a/BIN/SH.S.IO.txt
+++ b/BIN/SH.S.IO.txt
@@ -199,7 +199,7 @@ IO.PrintBatchErrMsg
>PUSHBI 2
>PUSHW L.MSG.BATCHLINE
- jsr .80
+ jsr IO.PrintErr
ldy #$ff
ldx #'-'
@@ -217,11 +217,7 @@ IO.PrintBatchErrMsg
>PUSHBI 4
>PUSHW L.MSG.BATCHERR
-.80 ldy #S.PS.hStdErr
- lda (pPS),y
- >SYSCALL fprintf
-
-.9 rts
+.80 bra IO.PrintErr
*--------------------------------------
IO.PrintErrMsg pha Save EC for PrintF
@@ -255,7 +251,8 @@ IO.PrintErrMsg pha Save EC for PrintF
>PUSHA
>PUSHBI 3
>PUSHW L.MSG.ERROR
- ldy #S.PS.hStdErr
+
+IO.PrintErr ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL fprintf
rts
diff --git a/BIN/SH.S.txt b/BIN/SH.S.txt
index f2b01988..d67699b9 100644
--- a/BIN/SH.S.txt
+++ b/BIN/SH.S.txt
@@ -1,5 +1,5 @@
NEW
- AUTO 4,1
+ AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
@@ -48,6 +48,8 @@ C.ELSE .EQ 31
C.FI .EQ 32
C.END .EQ 33
*--------------------------------------
+C.CLEXEC .EQ 63
+*--------------------------------------
E.CSYN .EQ $C0
E.ESYN .EQ $C1
E.STACKERROR .EQ $C2
@@ -57,7 +59,7 @@ E.NOFOR .EQ $C5
E.NOIF .EQ $C6
E.BADFTYPE .EQ $C7
E.FUNDEF .EQ $C8
-E.UNEXP .EQ $C9
+E.UNEXPEOF .EQ $C9
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
@@ -125,6 +127,7 @@ L.MSG.PID .DA MSG.PID
L.FMT.DATE .DA FMT.DATE
L.FMT.TIME .DA FMT.TIME
L.FMT.GETKEY .DA FMT.GETKEY
+L.FMT.Long .DA FMT.Long
J.ESC .DA CL.BS left arrow
.DA HIS.GetNext
.DA HIS.GetPrev
@@ -187,10 +190,9 @@ J.EXP.OP.UNARY .DA EXP.OP.UNARY.D
L.EXP.OP.BINARY .DA EXP.OP.BINARY
L.EXP.OP.MATH .DA EXP.OP.MATH
L.EXP.OP.LOGIC .DA EXP.OP.LOGIC
-L.HOME .DA HOME
L.HOME.PROFILE .DA HOME.PROFILE
+L.HOME .DA HOME
L.PS1 .DA PS1
-L.M32.Printf .DA M32.Printf
L.ERR.Codes .DA ERR.Codes
L.ERR.Messages .DA ERR.Messages
.DA 0
@@ -222,7 +224,12 @@ CS.RUN jsr CL.Init
lda (pPS),y
>SYSCALL GetMemPtr
plx
- jsr CORE.Load.YAX
+ jsr CORE.Load.YAX Exec Batch file
+ bcs CS.INIT.RTS
+
+ lda #$C0+C..
+ jsr CORE.StkPush
+
bra CS.RUN.LOOP
*--------------------------------------
.1 jsr CMD.CD.HOME
@@ -235,26 +242,22 @@ CS.RUN jsr CL.Init
>SYSCALL printf
bcs CS.INIT.RTS
- >PUSHEA.G StatBuf
- >LDYA L.HOME.PROFILE
- >SYSCALL STAT
- bcs CS.RUN.LOOP no profile...
-
>LDYA L.HOME.PROFILE
jsr IO.Load
- bcs CS.RUN.LOOP
+ bcs CS.RUN.LOOP No profile...
+
>LDYA L.HOME.PROFILE
- jsr CORE.Load.YAX exec profile and continue
+ jsr CORE.Load.YAX Exec profile and continue
-* bcs CS.RUN.LOOP
+ bcs CS.RUN.LOOP
+
+ lda #$C0+C..
+ jsr CORE.StkPush
*--------------------------------------
CS.RUN.LOOP >SLEEP
.1 jsr CheckSleep
- beq .3
-
- >LDA.G bSET.C
- bne CS.RUN.LOOP
+ beq .2
ldy #S.PS.hStdIn
lda (pPS),y
@@ -268,67 +271,69 @@ CS.RUN.LOOP >SLEEP
bcs .9 I/O err
cmp #3 Ctrl-C
- bne CS.RUN.LOOP
+ bne .11
lda (pData) batch mode ?
beq CS.RUN.LOOP
>LDA.G bSET.C
beq .8
+
bra CS.RUN.LOOP
+
+.11 cmp #19 test Ctrl-s
+ bne CS.RUN.LOOP
-.3 >LDA.G bPause
- bpl .6
-
-.4 >SYSCALL GetChar
- bcs .9 I/O err
-
-.5 cmp #3 Ctrl-C
- bne .60
-
- lda (pData) batch mode ?
- beq .61
-
- >LDA.G bSET.C
- beq .8
- bra .61
-
-.60 tax
-
- >LDA.G bPause
- asl
- bpl .61 not from PAUSE command
-
- cpx #C.CR
- bne .4
-
-.61 >STZ.G bPause
- bra .62
-
-.6 >LDA.G bReadMode read mode ?
- bne .7
-
-.62 lda (pData) batch mode ?
- beq CS.RUN.INTERACTIVE
-
- jmp CS.RUN.BATCH
-.7 jmp CS.RUN.READ
-
+ lda #$80
+ >STA.G bPause
+ bra CS.RUN.LOOP
+*--------------------------------------
.8 lda #3 User Interrupt
sec
.9 rts
*--------------------------------------
-CS.RUN.INTERACTIVE
- >LDA.G bExitOnEOF
- beq .10
-
- jmp CS.RUN.LOOP.EXIT
+.2 >LDA.G bPause
+ bpl .6
-.10 jsr IO.Reset
+.3 >SYSCALL GetChar
+ bcs .9 I/O err
+
+ cmp #3 Ctrl-C
+ bne .4
+
+ lda (pData) batch mode ?
+ beq .5
+
+ >LDA.G bSET.C
+ beq .8
+ bra .5
+
+.4 tax
+
+ >LDA.G bPause
+ asl $ff ?
+ bpl .5 not from PAUSE command
+
+ cpx #C.CR
+ bne .3
+
+.5 >STZ.G bPause
+*--------------------------------------
+.6 lda (pData) batch mode ?
+
+ bne CS.RUN.BATCH
+*--------------------------------------
+CS.RUN.INTERACTIVE
+ jsr IO.Reset
jsr CL.Reset
+
jsr CL.PrintPrompt
bcs .9
-
+
+ >STZ.G bREAD.S
+ dec
+ >STA.G READ.N
+
.1 >SYSCALL GetChar
bcs .9 I/O error
@@ -361,7 +366,11 @@ CS.RUN.INTERACTIVE
>SYSCALL GetMemPtr Y,A =ARGV
plx
- jsr CORE.Load.YAX X = Copy of CL
+ jsr CORE.Load.YAX Exec CL
+ bcs .9
+
+ lda #$C0+C.CLEXEC
+ jsr CORE.StkPush
.6 jsr CORE.Run
@@ -369,68 +378,7 @@ CS.RUN.INTERACTIVE
.9 rts
*--------------------------------------
-CS.RUN.READ jsr CL.RESET
-
-.1 >SYSCALL GetChar
- bcs CS.RUN.READ.9
-
- jsr CL.CHARIN
-
- >LDA.G CL.bReady
- bpl .1
-
- lda (ZPCLBuf)
- bne .2
-
- >LDYA ZPVarNamePtr
- >SYSCALL UnSetEnv
- bra .7
-
-.2 >PUSHW ZPCLBuf
-
- >LDYA ZPVarNamePtr
- >SYSCALL SetEnv
-
-.7 php
- pha
-
- >STZ.G bReadMode
- >STA.G bREAD.S
-
- pla
- plp
-
-.8 jmp CS.RUN.LOOP.END
-CS.RUN.READ.9 rts
-*--------------------------------------
-CS.RUN.BATCH >LDA.G bSET.C
- bne .2
-
- ldy #S.PS.hStdIn
- lda (pPS),y
- >SYSCALL feof
- bcs .2 unsupported
-
- tay
- bne .2
-
- >SYSCALL GetChar
- bcs CS.RUN.READ.9
-
- cmp #3 test Ctrl-c
- bne .1
-
- bra CS.RUN.LOOP.END CS
-
-.1 cmp #19 test Ctrl-s
- bne .2
-
- lda #$80
- >STA.G bPause
- clc
- jmp CS.RUN.LOOP.END
-
-.2 >LDA.G bSET.X
+CS.RUN.BATCH >LDA.G bSET.X
beq .5
ldy #$ff
@@ -452,27 +400,25 @@ CS.RUN.BATCH >LDA.G bSET.C
bcs CS.RUN.LOOP.RTS
.5 jsr CORE.Run
- bcc CS.RUN.LOOP.END
-
- tay 0 = EOF
- bne CS.RUN.LOOP.END
-
- lda #0
- sec
CS.RUN.LOOP.END ldy #S.PS.RC
sta (pPs),y
bcc CS.RUN.LOOP.80
tay
- beq CS.RUN.LOOP.80
+ beq CS.RUN.LOOP.80 0 = EOF
>LDA.G bSET.E
bmi CS.RUN.LOOP.80
+
+ jsr CORE.StkGet
+ cmp #$C0+C.CLEXEC
+ beq .1
+
jsr IO.PrintBatchErrMsg
bcs CS.RUN.LOOP.RTS
- ldy #S.PS.RC
+.1 ldy #S.PS.RC
lda (pPs),y
jsr IO.PrintErrMsg
@@ -518,6 +464,7 @@ CS.DOEVENT lda (pEvent)
CS.QUIT jsr HIS.Quit
jsr CL.Quit
jsr CORE.Quit
+
clc
rts
*--------------------------------------
@@ -621,12 +568,12 @@ 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)"
FMT.GETKEY .AZ "%d"
-M32.Printf .AZ "%L"
+FMT.Long .AZ "%L"
*--------------------------------------
-HOME .AZ "${HOME}"
HOME.PROFILE .AZ "${HOME}PROFILE"
-PS1 .AZ "${PS1}"
.HS 00 To Make It ArgV
+PS1 .AZ "${PS1}"
+HOME .AZ "${HOME}"
*--------------------------------------
EscChars .AS 'DBAC'
EscChars.Cnt .EQ *-EscChars
@@ -634,76 +581,82 @@ EscChars.Remap .DA #C.BS,#C.VT,#C.LF,#C.FS
*--------------------------------------
IN .AZ "IN"
*--------------------------------------
-CMD .AZ ".."
- .AZ "."
- .AZ "CD"
- .AZ "NOHUP"
- .AZ "DATE"
- .AZ "ECHO"
- .AZ "EXIT"
- .AZ "GETKEY"
- .AZ "MD"
- .AZ "PAUSE"
- .AZ "PWD"
- .AZ "RD"
- .AZ "READ"
- .AZ "REN"
- .AZ "SET"
- .AZ "SLEEP"
- .AZ "SHIFT"
- .AZ "TIME"
- .AZ "PUSHD"
- .AZ "POPD"
- .AZ "FUNCTION"
- .AZ "CALL"
- .AZ "BREAK"
- .AZ "SWITCH"
- .AZ "CASE"
- .AZ "DEFAULT"
- .AZ "FOR"
- .AZ "WHILE"
- .AZ "IF"
- .AZ "NEXT"
- .AZ "LOOP"
- .AZ "ELSE"
- .AZ "FI"
- .AZ "END"
+CMD .AT ".."
+ .AT "."
+ .AT "CD"
+ .AT "NOHUP"
+ .AT "DATE"
+ .AT "ECHO"
+ .AT "EXIT"
+ .AT "GETKEY"
+ .AT "MD"
+ .AT "PAUSE"
+ .AT "PWD"
+ .AT "RD"
+ .AT "READ"
+ .AT "REN"
+ .AT "SET"
+ .AT "SLEEP"
+ .AT "SHIFT"
+ .AT "TIME"
+ .AT "PUSHD"
+ .AT "POPD"
+ .AT "FUNCTION"
+ .AT "CALL"
+ .AT "BREAK"
+ .AT "SWITCH"
+ .AT "CASE"
+ .AT "DEFAULT"
+ .AT "FOR"
+ .AT "WHILE"
+ .AT "IF"
+ .AT "NEXT"
+ .AT "LOOP"
+ .AT "ELSE"
+ .AT "FI"
+ .AT "END"
+ .HS 00
+CORE.IO .AT "&"
+ .AT "<"
+ .AT ">>"
+ .AT ">"
+ .AT "1>>"
+ .AT "1>"
+ .AT "2>>"
+ .AT "2>"
+ .HS 00
+EXP.BEGIN .AT "!["
+ .AT "["
+ .HS 00
+EXP.OP.UNARY .AT "-D"
+ .AT "-E"
+ .AT "-F"
+ .AT "-N"
+ .AT "-Z"
+ .HS 00
+EXP.OP.BINARY .AT "="
+ .AT "!="
+ .AT ".<"
+ .AT "<="
+ .AT ".>"
+ .AT ">="
+ .AT "-EQ"
+ .AT "-NE"
+ .AT "-LT"
+ .AT "-LE"
+ .AT "-GT"
+ .AT "-GE"
+ .HS 00
+EXP.OP.MATH .AT "+"
+ .AT "-"
+ .AT "*"
+ .AT "/"
+ .AT "MOD"
+ .HS 00
+EXP.OP.LOGIC .AT "AND"
+ .AT "OR"
.HS 00
*--------------------------------------
-* https://www.tldp.org/LDP/abs/html/io-redirection.html
-*--------------------------------------
-CORE.IO .AZ "&"
- .AZ "<"
- .AZ ">>"
- .AZ ">"
- .AZ "1>>"
- .AZ "1>"
- .AZ "2>>"
- .AZ "2>"
- .HS 00
-*--------------------------------------
-EXP.BEGIN .AZ "!["
- .AZ "["
- .HS 00
-EXP.OP.UNARY .AZ "-D"
- .AZ "-E"
- .AZ "-F"
- .AZ "-N"
- .AZ "-Z"
- .HS 00
-EXP.OP.BINARY .AZ "="
- .AZ "!="
- .AZ ".<"
- .AZ "<="
- .AZ ".>"
- .AZ ">="
- .AZ "-EQ"
- .AZ "-NE"
- .AZ "-LT"
- .AZ "-LE"
- .AZ "-GT"
- .AZ "-GE"
- .HS 00
EXP.OP.BINARY.BITS
.DA #%010
.DA #%101
@@ -718,16 +671,8 @@ EXP.OP.BINARY.BITS
.DA #%110
.DA #%001
.DA #%011
-EXP.OP.MATH .AZ "+"
- .AZ "-"
- .AZ "*"
- .AZ "/"
- .AZ "MOD"
- .HS 00
+
EXP.OP.MATH.FPU .DA #FPU.ADD32,#FPU.SUB32,#FPU.IMUL32,#FPU.IDIV32,#FPU.IMOD32
-EXP.OP.LOGIC .AZ "AND"
- .AZ "OR"
- .HS 00
*--------------------------------------
.INB USR/SRC/SHARED/X.ERRORS.S
*--------------------------------------
@@ -739,7 +684,6 @@ PUSHD.STACK .BS PUSHD.STACK.MAX+1
hFuncList .BS 1
-bReadMode .BS 1
bExitOnEOF .BS 1
bEscMode .BS 1
@@ -750,6 +694,7 @@ bSET.E .BS 1
bSET.X .BS 1
bREAD.S .BS 1
+READ.N .BS 1
Sleep .BS 4
StatBuf .BS S.STAT
diff --git a/SHARED/X.ERRORS.S.txt b/SHARED/X.ERRORS.S.txt
index 78506bc4..1754452f 100644
--- a/SHARED/X.ERRORS.S.txt
+++ b/SHARED/X.ERRORS.S.txt
@@ -41,7 +41,7 @@ ERR.Codes .DA #MLI.E.IO
.DA #E.NOIF
.DA #E.BADFTYPE
.DA #E.FUNDEF
- .DA #E.UNEXP
+ .DA #E.UNEXPEOF
*--------------------------------------
ERR.Count .EQ *-ERR.Codes
*--------------------------------------