A2osX/SBIN/SHELL.S.txt

569 lines
11 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
2015-03-15 22:00:40 +00:00
PREFIX /A2OSX.BUILD
2015-03-14 21:48:35 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/SHELL
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/PRODOS.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
ZPPTR3 .EQ ZPBIN+4
*--------------------------------------
CmdBuffer.MAX .EQ 127
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
*--------------------------------------
L.LIBSTR .DA LIBSTR
L.CmdBuffer .DA CmdBuffer
L.MSG.GREETINGS .DA MSG.GREETINGS
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.SYNERR .DA MSG.SYNERR
L.CMDS .DA CMDS
T.INTCMDS .DA EXEC.CMD.CD
.DA EXEC.CMD.SET
.DA EXEC.CMD.DATE
.DA EXEC.CMD.TIME
.DA EXEC.CMD.ECHO
.DA EXEC.CMD.TYPE
.DA EXEC.CMD.EXIT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT stz bEXIT
stz CmdHistory
stz CmdHistory.IDX
stz CmdHistory.END
>LIBLOADP L.LIBSTR
bcs .99
sta hLIBSTR
ldy #S.PS.ID
lda (pPsContext),y
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>PUSHA
ldy #S.PS.hINDEV
lda (pPsContext),y
>PUSHA
>PUSHW L.MSG.GREETINGS
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.99 rts
*--------------------------------------
CS.RUN stz CmdBuffer
lda #"$"
jsr COUT
lda #" "
jsr COUT
.1 lda CmdBuffer
bmi .2
jsr A2osX.SLEEP
bra .1
.2 and #$7F
sta CmdBuffer
beq CS.RUN Empty line
>PUSHW L.CmdBuffer
>SYSCALL SYS.NewPStr
bcs .99
sta hCMDLINE
jsr HISTORY.ADD
jsr EXEC.CMD
bcc .3
pha
lda #"["
jsr COUT
pla
jsr PRBYTE
lda #"]"
jsr COUT
jsr CROUT
.3 lda hCMDLINE
>SYSCALL SYS.FreeMemA
stz hCMDLINE
lda bEXIT
bne .99
clc
rts
.99 sec
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$1F
bpl .1
jsr CS.EVENT.CTRL.CHAR
bra .8
.1 cmp #$7f
bne .2
jsr CmdBuffer.DEL
bra .8
.2 ldx CmdBuffer
cpx #CmdBuffer.MAX
beq .8
inx
sta CmdBuffer,x
inc CmdBuffer
ora #$80
jsr COUT
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.EVENT.CTRL.CHAR
cmp #13 CR
bne .10
jsr CROUT
lda CmdBuffer
ora #$80
sta CmdBuffer
clc
rts
.10 cmp #3
bne .1
jsr CmdBuffer.CLR
clc
rts
.1 cmp #8 BS (left arrow)
bne .2
jsr CmdBuffer.DEL
clc
rts
.2 cmp #10 LF (down arrow)
bne .3
jsr HISTORY.GETNEXT
clc
rts
.3 cmp #11 VT (up arrow)
bne .4
jsr HISTORY.GETPREV
clc
rts
.4 cmp #21 NAK (right arrow)
bne .8
clc
rts
.8 jsr PRBYTE
clc
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
EXEC.CMD >PUSHB hCMDLINE
>PUSHBI $20 Push SEP=' '
>PUSHBI 0 Push 0 for getting CMD & ARGS
>SYSCALL SYS.PStrGetTkn
bcs .99
sta hCMD
stx hARGS
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.UCASEP
>PUSHW L.CMDS
>SYSCALL SYS.GetPStrIndex
bcs .1 Not An internal command
jsr EXEC.CMD.INT
bcs .98
jsr .98
clc
rts
.1 jsr .98 Discard CMD & ARGS
lda hCMDLINE
>SYSCALL SYS.ExecProcessA
rts
.98 pha
lda hCMD
>SYSCALL SYS.FreeMemA
lda hARGS
>SYSCALL SYS.FreeMemA
pla
sec
.99 rts
*--------------------------------------
EXEC.CMD.INT asl
tax
jmp (T.INTCMDS,x)
*--------------------------------------
EXEC.CMD.CD lda hARGS
bne EXEC.CMD.CD.C
ldy #S.PS.hPREFIX
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.PRINTP
jsr CROUT
clc
rts
EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA
>STYA ZPPTR2
ldy #S.PS.hPREFIX
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPPTR1
>PUSHWI MLI.MAXPATH+1 Get a buffer for new PATH
>PUSHBI 0 no particular Option
>SYSCALL SYS.GetMem
bcs .99
stx hNEWPATH
>STYA ZPPTR3
lda #0
sta (ZPPTR3)
ldy #1
lda (ZPPTR2),y
cmp #'/' Full Path?
beq .3
cmp #'.' ".." ?
bne .2
lda (ZPPTR2)
cmp #2
bne .97
iny
lda (ZPPTR2),y
cmp #'.'
bne .97
lda (ZPPTR1)
tay
.1 dey
beq .97
lda (ZPPTR1),y
cmp #'/'
bne .1
tya
sta (ZPPTR3)
.11 lda (ZPPTR1),y
sta (ZPPTR3),y
dey
bne .11
bra .4
.97 lda #SYSMGR.ERRSYN
.98 pha
lda hNEWPATH
>SYSCALL SYS.FreeMemA
pla
sec
.99 rts
.2 >PUSHW ZPPTR1
>PUSHW ZPPTR3
>LIBCALL hLIBSTR,LIBSTR.STRCPYP
.3 >PUSHW ZPPTR2
>PUSHW ZPPTR3
>LIBCALL hLIBSTR,LIBSTR.STRCATP
lda (ZPPTR3)
tay
lda #'/' Ending with '/'?
cmp (ZPPTR3),y
beq .4
iny
sta (ZPPTR3),y
tya
sta (ZPPTR3)
.4 lda hNEWPATH
>SYSCALL SYS.CheckPrefixA
bcs .98
ldy #S.PS.hPREFIX
lda (pPsContext),y
pha
lda hNEWPATH
sta (pPsContext),y
pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
EXEC.CMD.SET clc
rts
*--------------------------------------
EXEC.CMD.DATE jsr MLI
.DA #MLIGETTIME
.DA 0
bcs .9
>PUSHW DATELO
>LIBCALL hLIBSTR,LIBSTR.PRINTDATE
jsr CROUT
clc
.9 rts
*--------------------------------------
EXEC.CMD.TIME jsr MLI
.DA #MLIGETTIME
.DA 0
bcs .9
>PUSHW TIMELO
>LIBCALL hLIBSTR,LIBSTR.PRINTTIME
jsr CROUT
clc
.9 rts
*--------------------------------------
EXEC.CMD.ECHO lda #$DD
sec
rts
*--------------------------------------
EXEC.CMD.TYPE lda hARGS
beq .98
>SYSCALL SYS.LoadFileA
bcs .99
>STYA ZPPTR2 store file len
phx
txa
>SYSCALL SYS.GetMemPtrA
>STYA ZPPTR1
.1 lda ZPPTR2
bne .2
lda ZPPTR2+1
beq .3
dec ZPPTR2+1
.2 dec ZPPTR2
lda (ZPPTR1)
ora #$80
jsr COUT
inc ZPPTR1
bne .1
inc ZPPTR1+1
bra .1
.3 pla
>SYSCALL SYS.FreeMemA
clc
rts
.98 lda #SYSMGR.ERRSYN
.99 rts
*--------------------------------------
EXEC.CMD.EXIT lda #$FF
sta bEXIT
clc
rts
*--------------------------------------
HISTORY.ADD lda CmdHistory.END ending 0
inc keep room for new ending 0
sec add len+1
adc CmdBuffer
bcc .2 enough room
ldx CmdHistory get len of oldest string
ldy #0
.1 inx
iny
lda CmdHistory,x move back until 0 found
sta CmdHistory-1,y
bne .1
sty CmdHistory.END mark new end of history
bra HISTORY.ADD retry....
.2 ldx CmdHistory.END
ldy #$FF
.3 iny
lda CmdBuffer,y
sta CmdHistory,x
inx
cpy CmdBuffer
bne .3
stz CmdHistory,x set ending 0
stx CmdHistory.IDX
stx CmdHistory.END
.9 rts
*--------------------------------------
HISTORY.GETPREV lda CmdHistory.END
beq HISTORY.RTS empty history,nothing to do
lda CmdHistory.IDX
beq HISTORY.RTS already oldest,nothing to do
lda #0
.1 tax save current index
sec
adc CmdHistory,x
cmp CmdHistory.IDX
bne .1 not yet reached current index
stx CmdHistory.IDX set new index
bra HISTORY.SETBUF
HISTORY.RTS rts
*--------------------------------------
HISTORY.GETNEXT ldx CmdHistory.END
beq HISTORY.RTS empty history,nothing to do
cpx CmdHistory.IDX
beq HISTORY.RTS
ldx CmdHistory.IDX
lda CmdHistory,x
sec
adc CmdHistory.IDX
cmp CmdHistory.END
sta CmdHistory.IDX
beq CmdBuffer.CLR end of history, just blank buffer
*--------------------------------------
HISTORY.SETBUF jsr CmdBuffer.CLR
ldx CmdHistory.IDX
ldy #$ff
.1 iny
lda CmdHistory,x
inx
sta CmdBuffer,y
cpy CmdBuffer
bne .1
bra CmdBuffer.PRINT
*--------------------------------------
CmdBuffer.PRINT ldx #0
.1 inx
lda CmdBuffer,x
ora #$80
phx
jsr COUT
plx
cpx CmdBuffer
bne .1
rts
*--------------------------------------
CmdBuffer.CLR jsr CmdBuffer.DEL
bne CmdBuffer.CLR
.9 rts
*--------------------------------------
CmdBuffer.DEL lda CmdBuffer
beq .9
lda #8
jsr COUT
dec CmdBuffer
.9 rts
*--------------------------------------
PRBYTE pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr COUT
pla
and #$0F
ora #$B0
cmp #$BA
bcc COUT
adc #6
bra COUT
*--------------------------------------
CROUT lda #13
*--------------------------------------
COUT phx
phy
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>SYSCALL SYS.DevOutA
ply
plx
rts
*--------------------------------------
CS.END
*--------------------------------------
CMDS >PSTRING "CD"
CMDS1 >PSTRING "SET"
CMDS2 >PSTRING "DATE"
CMDS3 >PSTRING "TIME"
CMDS4 >PSTRING "ECHO"
CMDS5 >PSTRING "TYPE"
CMDS6 >PSTRING "EXIT"
.DA #0
*--------------------------------------
LIBSTR >PSTRING "libstr.o"
MSG.GREETINGS >CSTRING "\nA2osX-Shell on Dev=(%h:%h),PS=%h\n\n"
MSG.UNKNOWN >CSTRING "Command Not Found\n"
MSG.SYNERR >CSTRING "Syntax Error Or Invalid Pathname\n"
*--------------------------------------
DS.START
*--------------------------------------
hLIBSTR .BS 1
bEXIT .BS 1
hCMDLINE .BS 1
hCMD .BS 1
hARGS .BS 1
hNEWPATH .BS 1
CmdBuffer .BS CmdBuffer.MAX+1
CmdBuffer.POS .BS 1
CmdHistory .BS 256
CmdHistory.IDX .BS 1
CmdHistory.END .BS 1
*--------------------------------------
DS.END
*--------------------------------------
MAN
SAVE SBIN/SHELL.S
ASM