A2osX/SBIN/SHELL.S.CMD.txt
Rémy GIBERT 571fb59701 Kernel version 0.8 : SHELL, many new features, Error messages...etc...see README.md
Important KERNEL.S.ENV.txt rewrite to implement env in SHELL
2016-10-29 21:58:21 +02:00

524 lines
9.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* Y,A -> Command line (formatted & not empty)
*--------------------------------------
Cmd.ExecYA stz Cmd.Exec.Mode
Cmd.ExecYA.1 >SYSCALL ExpandPStrYA
>STYA ZPPtr1
phx
ldy #1
ldx #0 ARGS len
lda (ZPPtr1),y
.10 cmp #'a'
bcc .11
cmp #'z'+1
bcs .11
eor #$20 to Uppercase
.11 sta CMD,y Store Cmd in Buffer
sty CMD update CMD len
tya
cmp (ZPPtr1)
beq .13 end of string
iny
lda (ZPPtr1),y
cmp #' '
bne .10
.12 tya
cmp (ZPPtr1)
beq .13 end of string
iny
lda (ZPPtr1),y
inx
sta ARGS,x
bra .12
.13 stx ARGS update ARGS len
pla
>SYSCALL FreeMemA
>LDYA L.CMDS
>STYA ZPPtr2
ldx #0
.1 lda (ZPPtr2)
beq Cmd.Exec.EXT Ending 0, must be an external Cmd....
cmp CMD
bne .4
tay
.2 lda CMD,y
.3 cmp (ZPPtr2),y
bne .4
dey
bne .2
jmp (J.INTCMDS,x) Found an internal Cmd...
.4 inx
inx
lda ZPPtr2
sec
adc (ZPPtr2)
sta ZPPtr2
bcc .1
inc ZPPtr2+1
bra .1
*--------------------------------------
Cmd.Exec.EXT ldy #1
lda CMD,y
cmp #'/' Command line is already full path, no search
beq .3
>LDYA L.ENV.PATH push ENVNAME=PATH for search
>SYSCALL GetEnvYA get value for ENV=PATH
bcs .1 No PATH, try in CD
>PUSHYA push search list
>PUSHW L.CMD
>SYSCALL FileSearch
bcc .2
.1 ldy #S.PS.hPREFIX not found, try in CD
lda (pPs),y
>SYSCALL GetMemPtrA
>PUSHYA push search list
>PUSHW L.CMD
>SYSCALL FileSearch
bcs .99
.2 phx save X=hMem, Y,A = Filename
>PUSHYA
>PUSHW L.CMD replace CMD in TmpBuffer with full path
>SYSCALL PStrCpy
pla
>SYSCALL FreeMemA Discard this string...
.3 stz UsrBuf256 reset UsrBuf256 for final CMDLINE
>PUSHW L.STAT
>PUSHW L.CMD
>SYSCALL STAT
bcs .99
lda STAT+S.STAT.PRODOS.TYPE
cmp #$04 TXT File ?
beq Cmd.Exec.EXT.TXT
cmp #$06 BIN File ?
beq Cmd.Exec.EXT.BIN
cmp #$ff SYS File ?
bne .9
bra *
.9 lda #SYSMGR.ERRSYN
sec
.99 rts
*--------------------------------------
* TXT : Launch "/PATH/SHELL /PATH/CMD ARGS"
*--------------------------------------
Cmd.Exec.EXT.TXT
lda #0 Get arg[0] = /PATH/SHELL
>SYSCALL GetArgA
>PUSHYA
>PUSHWI UsrBuf256
>SYSCALL PStrCpy
inc UsrBuf256 Add a space....
ldy UsrBuf256
lda #' '
sta UsrBuf256,y
*--------------------------------------
* BIN : Launch "/PATH/CMD ARGS"
*--------------------------------------
Cmd.Exec.EXT.BIN
>PUSHW L.CMD
>PUSHWI UsrBuf256
>SYSCALL PStrCat
lda ARGS
beq .1
inc UsrBuf256 Add a space....
ldy UsrBuf256
lda #' '
sta UsrBuf256,y
>PUSHW L.ARGS
>PUSHWI UsrBuf256
>SYSCALL PStrCat
.1 >LDYAI UsrBuf256
bit Cmd.Exec.Mode
bmi .2 startproc
>SYSCALL ExecProcessNewEnvYA
rts
.2 >SYSCALL CreateProcessYA
rts
*--------------------------------------
* Internal Commands
*--------------------------------------
Cmd.Exec.CD lda ARGS
bne Cmd.Exec.CD1
Cmd.Exec.PWD ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL GetMemPtrA
>PUSHYA
>LDYA L.MSG.PSTR
>SYSCALL PrintFYA
rts
Cmd.Exec.CD1 stz UsrBuf256
lda ARGS+1
cmp #'/' Full Path?
beq .1
ldy #S.PS.hPREFIX no, init target prefix with actual prefix
lda (pPs),y
>SYSCALL GetMemPtrA
>PUSHYA
>PUSHWI UsrBuf256
>SYSCALL PStrCpy
.1 >PUSHW L.ARGS Append ARG to buffer
>PUSHWI UsrBuf256
>SYSCALL PStrCat
lda #'/'
ldx UsrBuf256
cmp UsrBuf256,x Ending '/' ?
beq .2
sta UsrBuf256+1,x no, add one...
inc UsrBuf256
.2 ldx #0 path is something like : /dir1/../dir2/
.3 ldy #0 reset char counter
.4 cpx UsrBuf256
beq .8
inx
lda UsrBuf256,x
cmp #'/'
beq .5
iny char=char+1!!!
bra .4
.5 tya any char count?
beq .4 no, start counting...
cpy #2 do we have /xx/?
bne .3 no, skip this token
lda #'.'
cmp UsrBuf256-1,x /yy/x./ ?
bne .3
cmp UsrBuf256-2,x /yy/../ ?
bne .3
cpx #4 /../ ?
beq Cmd.Exec.ERRSYN illegal
txa
tay save end of /../
sec
sbc #3 remove ../
tax
.6 dex
lda UsrBuf256,x Found beginning of dir before /../
cmp #'/'
bne .6
.7 lda UsrBuf256,y strip dir/../
sta UsrBuf256,x
cpy UsrBuf256
beq .71
iny
inx
bra .7
.71 stx UsrBuf256
bra .2 Start over...
.8 cpx #1
beq .80 we have '/' go change prefix
>PUSHW L.STAT
>PUSHWI UsrBuf256
>SYSCALL STAT
bcs .9
lda STAT+S.STAT.PRODOS.TYPE
cmp #$0F Directory ?
bne Cmd.Exec.ERRSYN
.80 >LDYAI UsrBuf256
>SYSCALL NewPStrYA
bcs .9
phx
ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL FreeMemA
pla
ldy #S.PS.hPREFIX
sta (pPs),y
jsr SetPWD
clc
.9 rts
*--------------------------------------
Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN
sec
rts
*--------------------------------------
Cmd.Exec.STARTPROC
lda ARGS
beq Cmd.Exec.ERRSYN
sec
ror Cmd.Exec.Mode
>LDYA L.ARGS
jmp Cmd.ExecYA.1
*--------------------------------------
Cmd.Exec.SET lda ARGS
bne Cmd.Exec.SETVAR
ldy #S.PS.hENV
lda (pPs),y
>SYSCALL GetMemPtrA
>STYA ZPPTR1
* No arg, print all ENV
.1 lda (ZPPTR1)
beq .8 Ending 0 ?
lda ZPPTR1 get next for value
sec
adc (ZPPTR1) Add len+1 to PTR
sta ZPPTR2
lda ZPPTR1+1
adc #0
sta ZPPTR2+1
lda (ZPPTR2) just in case...
beq .8
>PUSHW ZPPTR2 Push value
>PUSHW ZPPTR1 Push name
>LDYA L.MSG.PRINTENV
>SYSCALL PrintFYA
bcs .9
lda ZPPTR2
sec
adc (ZPPTR2) Add len+1 to PTR
sta ZPPTR1
lda ZPPTR2+1
adc #0
sta ZPPTR1+1
bra .1
.8 clc
.9 rts
Cmd.Exec.SETVAR tax
lda ARGS,x
cmp #'=' ARGS ends with =, UnsetEnv
beq .2
.1 dex
beq .3 no =, GetEnv
lda ARGS,x
cmp #'=' ARGS contains =, PutEnv
bne .1
cpx #1 string is '=value' ?
beq .99 syntax error
>LDYA L.ARGS String is VAR=VALUE...
>SYSCALL PutEnvYA
rts
.2 dec ARGS String is "VAR=", Remove endig '='
>LDYA L.ARGS String is "VAR"...
>SYSCALL UnsetEnvYA
rts
* Print requested VAR
.3 >LDYA L.ARGS
>SYSCALL GetEnvYA
bcs .8
>PUSHYA push value
>PUSHW L.ARGS push name
>LDYA L.MSG.PRINTENV
>SYSCALL PrintFYA
.8 clc
.9 rts
.99 lda #SYSMGR.ERRSYN
sec
rts
*--------------------------------------
Cmd.Exec.DATE sec
.HS 90 bcc
Cmd.Exec.TIME clc
php
>LDYA L.TIME
>SYSCALL TimeYA
>PUSHWI UsrBuf256
plp
bcc .1
>PUSHW L.FMT.DATE
bra .2
.1 >PUSHW L.FMT.TIME
.2 >PUSHW L.TIME
>SYSCALL PStrFTime
>PUSHWI UsrBuf256
>LDYA L.MSG.PSTR
>SYSCALL PrintFYA
rts
*--------------------------------------
Cmd.Exec.ECHO lda ARGS
beq Cmd.Exec.ECHO.SYN
>PUSHW L.ARGS
>LDYA L.MSG.PSTR
>SYSCALL PrintFYA
clc
rts
Cmd.Exec.ECHO.SYN
lda #SYSMGR.ERRSYN
sec
Cmd.Exec.ECHO.RTS
rts
*--------------------------------------
Cmd.Exec.TYPE lda ARGS
beq Cmd.Exec.ECHO.SYN
>LDYA L.ARGS
>SYSCALL GetFullPathYA
bcs Cmd.Exec.ECHO.RTS
>STYA ZPPTR1
stx hFullPath
>PUSHWI 0 Aux type
>PUSHBI 4 S.FILEINFO.TYPE.TXT
>PUSHBI SYS.FOPEN.R
>PUSHW ZPPTR1
>SYSCALL LoadFile
bcs .98
stx hTextFile
eor #$ff
sta ZPPTR2+1
tya
eor #$ff
sta ZPPTR2 store file !len
txa
>SYSCALL GetMemPtrA
>STYA ZPPTR1
ldy #0
lda #13 if len=0, exit print CR
.1 inc ZPPTR2
bne .2
inc ZPPTR2+1
beq .8
.2 lda (ZPPTR1)
>SYSCALL COutA
bcs .97
lda (ZPPTR1) get last char in A
inc ZPPTR1
bne .1
inc ZPPTR1+1
bra .1
.8 cmp #13 is last char printed a CR ?
beq .81
lda #13
>SYSCALL COutA no, add one
bcs .97
.81 jsr .97 cleanup...
clc
rts
.97 pha
lda hTextFile
>SYSCALL FreeMemA
pla
.98 pha
lda hFullPath
>SYSCALL FreeMemA
pla
sec
rts
*--------------------------------------
Cmd.Exec.READ
clc
rts
*--------------------------------------
Cmd.Exec.PAUSE ldy #bPause
lda #$80
sta (pData),y
clc
rts
*--------------------------------------
Cmd.Exec.EXIT ldy #bEXIT
lda #$FF
sta (pData),y
clc
rts
*--------------------------------------
MAN
SAVE SBIN/SHELL.S.CMD
LOAD SBIN/SHELL.S
ASM