NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/SH
*--------------------------------------
HISTORY.MAX		.EQ 256
CORE.STACK.MAX	.EQ 128
PUSHD.STACK.MAX	.EQ 4
*--------------------------------------
C...			.EQ 0
C..				.EQ 1
C.CD			.EQ 2
C.NOHUP			.EQ 3
C.DATE			.EQ 4
C.ECHO			.EQ 5
C.EXIT			.EQ 6
C.GETKEY		.EQ 7
C.MD			.EQ 8
C.PAUSE			.EQ 9
C.PWD			.EQ 10
C.RD			.EQ 11
C.READ			.EQ 12
C.REN			.EQ 13
C.SET			.EQ 14
C.SLEEP			.EQ 15
C.SHIFT			.EQ 16
C.TIME			.EQ 17
C.PUSHD			.EQ 18
C.POPD			.EQ 19
C.FUNCTION		.EQ 20
C.CALL			.EQ 21
C.BREAK			.EQ 22
C.SWITCH		.EQ 23
C.CASE			.EQ 24
C.DEFAULT		.EQ 25
*--------------------------------------
C.FOR			.EQ 26
C.FOR.LIST			.EQ 0
C.FOR.FILEEXEC		.EQ 1
C.WHILE			.EQ 27
C.IF			.EQ 28
C.NEXT			.EQ 29
C.LOOP			.EQ 30
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
E.STKOVERFLOW	.EQ $C3
E.NOWHILE		.EQ $C4
E.NOFOR			.EQ $C5
E.NOIF			.EQ $C6
E.BADFTYPE		.EQ $C7
E.FUNDEF		.EQ $C8
E.UNEXPEOF		.EQ $C9
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/MLI.I
				.INB INC/MLI.E.I
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPCLBuf			.BS 2
ZPInputBuf		.BS 2
ZPInputBufPtr	.BS 2
ZPInputCmdPtr	.BS 2
ZPArgVBuf		.BS 2
ZPArgVBufPrev	.BS 2
ZPArgVBufPtr	.BS 2
ZPVarNamePtr	.BS 2

CORE.PSFlags	.BS 1
CORE.IntCmd		.BS 1
CORE.Operator	.BS 1
CORE.LogicOp	.BS 1
CORE.TestResult	.BS 1
CORE.PrevTestResult	.BS 1

ZPPtr1			.BS 2
ZPPtr2			.BS 2
ZPTmpW			.BS 2

M32.ACC			.BS 4

ZS.END			.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #64					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT
				.DA	CS.QUIT
*--------------------------------------
L.MSG.GREETINGS	.DA MSG.GREETINGS
L.MSG.PROMPT	.DA MSG.PROMPT
L.MSG.PROMPTCRLF	.DA MSG.PROMPTCRLF
L.MSG.TRACE		.DA MSG.TRACE
L.MSG.ECHOCRLF	.DA MSG.ECHOCRLF
L.MSG.BATCHLINE	.DA MSG.BATCHLINE
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.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
				.DA CL.NAK			right arrow
L.CD..			.DA CD..
L.IN			.DA IN
L.CMD			.DA CMD
J.CMD			.DA CMD...
				.DA CMD..
				.DA CMD.CD
				.DA CMD.NOHUP
				.DA CMD.DATE
				.DA CMD.ECHO
				.DA CMD.EXIT
				.DA CMD.GETKEY
				.DA CMD.MD
				.DA CMD.PAUSE
				.DA CMD.PWD
				.DA CMD.RD
				.DA CMD.READ
				.DA CMD.REN
				.DA CMD.SET
				.DA CMD.SLEEP
				.DA CMD.SHIFT
				.DA CMD.TIME
				.DA CMD.PUSHD
				.DA CMD.POPD
				.DA CMD.FUNCTION
				.DA CMD.CALL
				.DA CMD.BREAK
				.DA CMD.SWITCH
				.DA CMD.CASE
				.DA CMD.DEFAULT
				.DA CMD.FOR
				.DA CMD.WHILE
				.DA CMD.IF
				.DA CMD.NEXT
				.DA CMD.LOOP
				.DA CMD.ELSE
				.DA CMD.FI
				.DA CMD.END
L.CORE.IO		.DA CORE.IO
J.CORE.IO		.DA CORE.IO.AMP
				.DA CORE.IO.IN
				.DA CORE.IO.OUTA
				.DA CORE.IO.OUT
				.DA CORE.IO.1OUTA
				.DA CORE.IO.1OUT
				.DA CORE.IO.2OUTA
				.DA CORE.IO.2OUT
L.EXP.BEGIN		.DA EXP.BEGIN
L.EXP.OP.UNARY	.DA EXP.OP.UNARY
J.EXP.OP.UNARY	.DA EXP.OP.UNARY.D
				.DA EXP.OP.UNARY.E
				.DA EXP.OP.UNARY.F
				.DA EXP.OP.UNARY.N
				.DA EXP.OP.UNARY.Z
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.PROFILE	.DA HOME.PROFILE
L.HOME			.DA HOME
L.PS1			.DA PS1
L.ERR.Codes		.DA ERR.Codes
L.ERR.Messages	.DA ERR.Messages
				.DA 0
*--------------------------------------
CS.INIT			clc
CS.INIT.RTS		rts
*--------------------------------------
CS.RUN			jsr CL.Init
				jsr CORE.Init

				ldy #S.PS.ARGC
				lda (pPS),y
				beq .1					no arg, continue starting interactive

				lda #$ff
				>STA.G bExitOnEOF
				lda #0
				jsr CMD.SHIFTA			Remove $0=/bin/sh

				ldy #S.PS.hARGV
				lda (pPS),y
				>SYSCALL GetMemPtr

				jsr IO.Load
				bcs CS.INIT.RTS
				phx
				ldy #S.PS.hARGV
				lda (pPS),y
				>SYSCALL GetMemPtr
				plx
				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
				jsr HIS.Init
				bcs CS.INIT.RTS

				>PUSHWI K.VER
				>PUSHBI 2
				>LDYA L.MSG.GREETINGS
				>SYSCALL printf
				bcs CS.INIT.RTS

				>LDYA L.HOME.PROFILE
				jsr IO.Load
				bcs CS.RUN.LOOP			No profile...

				>LDYA L.HOME.PROFILE
				jsr CORE.Load.YAX		Exec profile and continue
				bcs CS.RUN.LOOP
				lda #$C0+C..
				jsr CORE.StkPush
*--------------------------------------
CS.RUN.LOOP		>SLEEP

.1				jsr CheckSleep
				beq .2

				ldy #S.PS.hStdIn
				lda (pPS),y
				>SYSCALL feof
				bcs .9
				tay
				bne CS.RUN.LOOP
				>SYSCALL GetChar
				bcs .9					I/O err
				cmp #3					Ctrl-C
				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

				lda #$80
				>STA.G bPause
				bra CS.RUN.LOOP
*--------------------------------------
.8				lda #3					User Interrupt
				sec
.9				rts
*--------------------------------------
.2				>LDA.G bPause
				bpl .6
.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 
.2				cmp #C.EOF				....or Ctrl-D
				beq .9					CS

				jsr CL.CHARIN

				>LDA.G CL.bReady			Something to execute ?
				bpl .1
				>PUSHBI 0
				>LDYA L.MSG.PROMPTCRLF
				>SYSCALL printf
				bcs .9
				lda (ZPCLBuf)
				beq .8					Empty line

				jsr HIS.Add

				>LDYA ZPCLBuf
				>SYSCALL strdup
				bcs .8
				phx
				ldy #S.PS.hARGV
				lda (pPS),y
				>SYSCALL GetMemPtr		Y,A =ARGV
				plx
				jsr CORE.Load.YAX		Exec CL
				bcs .9
				lda #$C0+C.CLEXEC
				jsr CORE.StkPush

.6				jsr CORE.Run
.8				jmp CS.RUN.LOOP.END

.9				rts			
*--------------------------------------
CS.RUN.BATCH	>LDA.G bSET.X
				beq .5

				ldy #$ff
.3				iny
				lda (ZPInputBufPtr),y
				sta (ZPArgVBuf),y
				beq .4
				eor #C.CR
				bne .3
				sta (ZPArgVBuf),y
.4				>PUSHW ZPArgVBuf
				>PUSHBI 2
				>LDYA L.MSG.TRACE
				>SYSCALL printf
				bcs CS.RUN.LOOP.RTS

.5				jsr CORE.Run
CS.RUN.LOOP.END	ldy #S.PS.RC
				sta (pPs),y
				bcc CS.RUN.LOOP.80
				tay
				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
.1				ldy #S.PS.RC
				lda (pPs),y
				jsr IO.PrintErrMsg
				bcs CS.RUN.LOOP.RTS

CS.RUN.LOOP.80	lda (pData)				something on stack ?
				bne .8
				>LDA.G bExitOnEOF
				bmi CS.RUN.LOOP.EXIT

.8				jmp CS.RUN.LOOP
CS.RUN.LOOP.EXIT
				ldy #S.PS.RC
				lda (pPs),y
				sec
CS.RUN.LOOP.RTS	rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .9

				jsr CheckSleep
				beq .9

*				ldy #Sleep				already set by CheckSleep
				ldx #4
				clc
.1				lda (pData),y
				sbc #0
				sta (pData),y
				iny
				dex
				bne .1

.9				sec
				rts
*--------------------------------------
CS.QUIT			jsr HIS.Quit
				jsr CL.Quit
				jsr CORE.Quit

				clc
				rts
*--------------------------------------
CheckSleep		ldy #Sleep+3
				lda (pData),y
				dey
				ora (pData),y
				dey
				ora (pData),y
				dey
				ora (pData),y
				rts
*--------------------------------------
RemoveStrFromArgV
				>STYA ZPPtr1
				>STYA ZPPtr2

				jsr GetPtr1LenY
.2				jsr AddYp1Ptr1

				jsr StrCpyPtr1Ptr2
				tya
				beq .8
				jsr AddAp1Ptr2
				bra .2
.8				rts
*--------------------------------------
GetPtr1Next		lda (ZPPtr1)
				beq IncPtr1.8

IncPtr1			inc ZPPtr1
				bne IncPtr1.8
				inc ZPPtr1+1
IncPtr1.8		rts
*--------------------------------------
GetPtr1LenY		ldy #$ff
.1				iny
				lda (ZPPtr1),y
				bne .1
				rts
*--------------------------------------
AddYp1Ptr1		tya
AddAp1Ptr1		sec
				.HS 90					BCC
AddAPtr1		clc
				adc ZPPtr1
				sta ZPPtr1
				bcc .8
				inc ZPPtr1+1
.8				rts
*--------------------------------------
AddAp1Ptr2		sec
				adc ZPPtr2
				sta ZPPtr2
				bcc .8
				inc ZPPtr2+1
.8				rts
*--------------------------------------
StrCpyPtr1Ptr2	ldy #$ff
.1				iny
				lda (ZPPtr1),y
				sta (ZPPtr2),y
				bne .1

				rts
*--------------------------------------
ToUpperCase		cmp #'a'
				bcc .8
				cmp #'z'+1
				bcs .8
				eor #$20
.8				clc						exit CC to allow Jmp to
				rts
*--------------------------------------
				.INB USR/SRC/BIN/SH.S.CL
				.INB USR/SRC/BIN/SH.S.HIS
				.INB USR/SRC/BIN/SH.S.CORE
				.INB USR/SRC/BIN/SH.S.IO
				.INB USR/SRC/BIN/SH.S.CMD
				.INB USR/SRC/BIN/SH.S.EXP
*--------------------------------------
CS.END
*--------------------------------------
MSG.GREETINGS	.AZ "\r\nA2osX-SH %d.%d\r\n\r\n"
MSG.PROMPT		.AZ "\e[?7h$ "			Enable Line Wrap
MSG.PROMPTCRLF	.AZ "\e[?7l\r\n"		Disable Line Wrap
MSG.TRACE		.AS ">"
MSG.BATCHLINE	.AZ "%s\r\n"
MSG.BATCHERR	.AZ "%s^\r\nLine #%D:"
MSG.ERROR		.AS "[$%h]:%S."
MSG.ECHOCRLF	.AZ "\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)"
FMT.GETKEY		.AZ "%d"
FMT.Long		.AZ "%L"
*--------------------------------------
HOME.PROFILE	.AZ "${HOME}PROFILE"
				.HS 00					To Make It ArgV
PS1				.AZ "${PS1}"
HOME			.AZ "${HOME}"
*--------------------------------------
EscChars		.AS 'DBAC'
EscChars.Cnt	.EQ *-EscChars
EscChars.Remap	.DA #C.BS,#C.VT,#C.LF,#C.FS
*--------------------------------------
CD..			.AZ ".."
*--------------------------------------
IN				.AZ "IN"
*--------------------------------------
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
*--------------------------------------
EXP.OP.BINARY.BITS
				.DA #%010
				.DA #%101
				.DA #%100
				.DA #%110
				.DA #%001
				.DA #%011

				.DA #%010
				.DA #%101
				.DA #%100
				.DA #%110
				.DA #%001
				.DA #%011

EXP.OP.MATH.FPU	.DA #FPU.ADD32,#FPU.SUB32,#FPU.IMUL32,#FPU.IDIV32,#FPU.IMOD32
*--------------------------------------
				.INB USR/SRC/SHARED/X.ERRORS.S
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
CORE.STACK		.BS CORE.STACK.MAX+1	pData (0 = Stack Ptr)
PUSHD.STACK		.BS PUSHD.STACK.MAX+1

hFuncList		.BS 1

bExitOnEOF		.BS 1

bEscMode		.BS 1
bPause			.BS 1

bSET.C			.BS 1
bSET.E			.BS 1
bSET.X			.BS 1

bREAD.S			.BS 1
READ.N			.BS 1

Sleep			.BS 4
StatBuf			.BS S.STAT
TimeBuf			.BS S.TIME

CL.hCLBuf		.BS 1
CL.Ptr			.BS 1
CL.Len			.BS 1
CL.bReady		.BS 1

CORE.hArgVBuf	.BS 1

HIS.hBuf		.BS 1
HIS.Count		.BS 1
HIS.Index		.BS 1

IO.hIn			.BS 1
IO.hOut			.BS 1
IO.hErr			.BS 1

*M32.BUF		.BS 12					-1234567890\0
M32.BUF			.EQ *
IO.FIFO			.BS 12					/DEV/FIFOxx\0
*--------------------------------------
DS.END			.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/SH.S
ASM