A2osX/SYS/KERNEL.S.ENV.txt

715 lines
13 KiB
Plaintext
Raw Normal View History

2017-12-22 21:24:30 +00:00
NEW
2018-11-17 17:17:13 +00:00
PREFIX
2017-12-22 21:24:30 +00:00
AUTO 4,1
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # ExpandStr
2018-06-14 15:31:36 +00:00
* **In:**
* Y,A = PTR to String to Expand (C-String)
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
* X = hMem to Expanded String (C-String)
* Y,A = PTR to Expanded String
*\--------------------------------------
2018-06-18 06:22:50 +00:00
K.ExpandStr stz .88+1 Reset Intermediate string...
.1 >STYA ZPPtr2
stz ENV.BufLen init Expanded String len=0
stz .82+1 No var found yet
stz ENV.bNoExp Reset no expand flag
2015-03-14 21:48:35 +00:00
ldy #0
2017-10-27 14:56:46 +00:00
.10 stz ENV.VarLen
stz .23+1 reset In var flag
.11 lda (ZPPtr2),y End of CSTR?
beq .8
2015-03-14 21:48:35 +00:00
iny
cmp #'''
bne .21
2017-10-27 14:56:46 +00:00
lda ENV.bNoExp
eor #$ff
sta ENV.bNoExp toggle flag
bra .11
2017-10-27 14:56:46 +00:00
.21 bit ENV.bNoExp
bpl .23
.22 jsr ENV.AddAToBuf
bra .11
.23 ldx #$ff SELF MODIFIED already in a var?
bne .3 yes...
cmp #'$' no, found one ?
bne .22 no, store...
sta .82+1 Toggle Expanded flag
sta .23+1 Set In Var flag
bra .11 skip this char
.3 cmp #'{' we are in var, "{" after "$"?
bne .31
ldx ENV.VarLen No char in var yet ?
beq .11 normal, "${" syntax is ok,skip
bne .5 not allowed char in varname, end of var
.31 cmp #'}' end of var?
beq .50
jsr MEM.IsIDValid _,.,a-z,A-Z,0-9 ?
bcc .32 yes, add to varname
2017-10-27 14:56:46 +00:00
ldx ENV.VarLen
bne .5 varname has already chars...end of var
inx must be a $? or ?x.....go expand
2017-10-27 14:56:46 +00:00
stx ENV.VarLen
sta ENV.VarName
bra .51 go Expand....
2017-10-27 14:56:46 +00:00
.32 ldx ENV.VarLen
cpx #16
beq .11 varname longer than 15....ignore
2017-10-27 14:56:46 +00:00
sta ENV.VarName,x
inx
2017-10-27 14:56:46 +00:00
stx ENV.VarLen
bra .11
.5 dey last char was invalid...move back
2017-10-27 14:56:46 +00:00
.50 ldx ENV.VarLen
beq .52 var name is empty...start over
2017-10-27 14:56:46 +00:00
.51 stz ENV.VarName,x
phy save current index
2017-10-27 14:56:46 +00:00
jsr ENV.GetValue
ply restore index in string...
.52 jmp .10 reset start flag and continue
.8 ldx ENV.VarLen end of STR,are we in a var?
beq .80 no...exit...
2017-10-27 14:56:46 +00:00
stz ENV.VarName,x
jsr ENV.GetValue yes, expand and add to STR
.80 lda .88+1 working from our temp string ?
beq .81 no...
2018-06-22 14:59:24 +00:00
jsr K.FreeMem yes, discard....
2017-10-27 14:56:46 +00:00
.81 ldx ENV.BufLen
stz K.Buf256,x
>LDYAI K.Buf256
2018-06-22 14:59:24 +00:00
jsr K.NewStr
bcs .9
stx .88+1 save this as temp string, in case of recurse
.82 ldx #$ff SELF MODIFIED Did we expand something ?
beq .88
jmp .1 Yes, start over with hPStr
.88 ldx #$ff SELF MODIFIED
* or exit with Y,A from K.NewStrYA
.9 rts
*/--------------------------------------
2018-06-28 15:26:34 +00:00
* # FileSearch
* Search a file in the provided PATH list
* And return, if found, the full path to it.
* ## C
* `int filesearch ( char * filename, char * searchpath, char * fullpath, stat * filestat);`
* ## ASM
* **In:**
* `>PUSHWI filestat`
* `>PUSHWI fullpath`
* `>PUSHWI searchpath`
* `>LDYAI filename`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-06-28 15:26:34 +00:00
* CC : success
* DstBuf = FilePath
* DstStat = S.STAT
* CS : not found
*\--------------------------------------
K.FileSearch pha
>PULLW K.FileSearch.SearchPath
>PULLW .2+1 DstBuf
>PULLW .4+1 DstStat
pla Y,A = filename
jsr K.FileSearch.YA
bcs .9
ldx #$ff
.1 inx
lda K.Buf256,x
.2 sta $ffff,x Self Modified
bne .1
ldx #S.STAT-1
.3 lda K.S.STAT,x
.4 sta $ffff,x Self Modified
dex
bpl .3
.9 rts
2018-07-16 05:52:52 +00:00
K.FileSearch.YA >STYA .4+1
>LDYA K.FileSearch.SearchPath
jsr K.ExpandStr Y,A = Search Path, Expand it
2018-06-28 15:26:34 +00:00
bcs .99
stx .98+1
>STYA .2+1 expanded search list ;
stz .1+1
.1 ldy #$0 Self Modified Index in Search list string
ldx #$0
.2 lda $ffff,y Self Modified, Search list string
beq .3 end of string, try it....
iny
2018-11-17 17:17:13 +00:00
cmp #':'
2018-06-28 15:26:34 +00:00
beq .3
sta K.Buf256,x
inx
bra .2
.3 txa
beq .98 String is empty....nothing to try
sty .1+1 save current index
ldy #$0
.4 lda $ffff,y Self Modified, Append Filename...
sta K.Buf256,x
beq .5
iny
inx
bra .4
.5 >PUSHWI K.S.STAT
2018-07-20 11:51:08 +00:00
>LDYAI K.Buf256
2018-11-19 07:43:00 +00:00
>SYSCALL STAT BANK1
2018-06-28 15:26:34 +00:00
bcs .1 Failed...retry next path...
lda K.S.STAT+S.STAT.P.TYPE
cmp #S.FI.T.DIR Dir ?
beq .1
jsr .98 Discard Expanded hSrch list
clc
.99 rts
.98 lda #$ff SELF MODIFIED : Discard Expanded hSrch list
jsr K.FreeMem
lda #MLI.E.FNOTFND
sec
rts
*--------------------------------------
K.FileSearch.SearchPath .BS 2
*/--------------------------------------
2018-06-21 15:12:10 +00:00
* # PutEnv
2018-09-06 15:36:44 +00:00
* Change or add an environment variable, string is 'NAME=VALUE'
* ## C
* `int putenv(char *string);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 15:36:44 +00:00
* `>LDYA string`
* `>SYSCALL putenv`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
*\--------------------------------------
2018-06-21 15:12:10 +00:00
K.PutEnv >STYA ZPPtr1 NAME=VALUE
2016-08-17 06:25:58 +00:00
ldy #0
2016-06-07 06:10:18 +00:00
.1 lda (ZPPtr1),y copy STR to K.Buf256
2016-08-17 06:25:58 +00:00
beq .9
cmp #'='
beq .2
sta K.Buf256,y
iny
bne .1
2016-08-17 06:25:58 +00:00
.2 lda #0
sta K.Buf256,y
tya
sec
adc ZPPtr1
sta ZPPtr2
lda ZPPtr1+1
adc #0
2017-01-12 17:43:45 +00:00
sta ZPPtr2+1
>LDYAI K.Buf256
>STYA ZPPtr1
2017-10-27 14:56:46 +00:00
bra K.SetEnv.I
2016-08-17 06:25:58 +00:00
.9 sec
rts
*/--------------------------------------
* # SetEnv
2018-09-06 15:36:44 +00:00
* Change or add an environment variable
* ## C
* `int setenv(const char *name, const char *value);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 15:36:44 +00:00
* `>PUSHW value`
* `>LDYA name`
* `>SYSCALL setenv`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
*\--------------------------------------
2018-10-11 15:23:06 +00:00
K.SetEnv jsr MEM.SPtr1PPtr2
2018-09-06 15:36:44 +00:00
2017-10-27 14:56:46 +00:00
K.SetEnv.I jsr K.UnsetEnv.I
2016-08-17 06:25:58 +00:00
2017-10-27 14:56:46 +00:00
jsr ENV.InitEnvP3 ZPPtr3 -> Env
ldy #0
ldx #0
2016-08-17 06:25:58 +00:00
.10 lda (ZPPtr3) End of ENV
beq .15
2016-08-17 06:25:58 +00:00
.11 iny Compute ENV size in X,Y
bne .12
inx
2016-08-17 06:25:58 +00:00
.12 inc ZPPtr3
bne .13
inc ZPPtr3+1
2016-08-17 06:25:58 +00:00
.13 lda (ZPPtr3) End of string
bne .11
2015-03-14 21:48:35 +00:00
iny
bne .14
inx
2016-08-17 06:25:58 +00:00
.14 inc ZPPtr3
bne .10
2017-01-12 17:43:45 +00:00
inc ZPPtr3+1
bra .10
.15 sty ZPPtr4
stx ZPPtr4+1
ldy #0
2016-08-17 06:25:58 +00:00
.16 lda (ZPPtr1),y
beq .17
iny
bne .16
2016-08-17 06:25:58 +00:00
2018-10-29 08:41:10 +00:00
.17 jsr ENV.NextEnvP4Y
2018-10-29 08:41:10 +00:00
ldy #$ff
.19 iny
lda (ZPPtr2),y
bne .19
2016-08-17 06:25:58 +00:00
2018-10-29 08:41:10 +00:00
tya
sec
adc ZPPtr4
tax
bcc .21
inc ZPPtr4+1
.21 cpx #K.ENV.SIZE
lda ZPPtr4+1
sbc /K.ENV.SIZE
bcs .99
2016-08-17 06:25:58 +00:00
ldy #$ff
2016-08-17 06:25:58 +00:00
.22 iny
lda (ZPPtr1),y
sta (ZPPtr3),y
bne .22
2016-08-17 06:25:58 +00:00
2018-10-29 08:41:10 +00:00
jsr ENV.NextEnvP3Y
2016-08-17 06:25:58 +00:00
2018-10-29 08:41:10 +00:00
ldy #$ff
.24 iny
lda (ZPPtr2),y
sta (ZPPtr3),y
bne .24
iny
sta (ZPPtr3),y don't forget array ending 0
2015-03-14 21:48:35 +00:00
clc
rts
2016-08-17 06:25:58 +00:00
2018-10-21 20:54:07 +00:00
.99 lda #E.ENVF
* sec
2015-03-14 21:48:35 +00:00
rts
*/--------------------------------------
2018-06-21 15:12:10 +00:00
* # GetEnv
2018-09-06 15:36:44 +00:00
* searches the environment list to find the environment variable name,
* and returns a pointer to the corresponding value string.
* ## C
* `char *getenv(const char *name);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 15:36:44 +00:00
* `>LDYA name`
2018-10-11 15:23:06 +00:00
* `>SYSCALL getenv`
* ## RETURN VALUE
2018-09-06 15:36:44 +00:00
* CC : Y,A = PTR to VALUE (C-String)
2016-08-17 06:25:58 +00:00
* CS : not found
*\--------------------------------------
2018-06-21 15:12:10 +00:00
K.GetEnv >STYA ZPPtr1
2017-10-27 14:56:46 +00:00
jsr ENV.FindVarP1
2016-08-17 06:25:58 +00:00
bcs .9
2017-10-27 14:56:46 +00:00
jsr ENV.NextEnvP3 Skip NAME
clc just in case ADC in NextEnvPtr1 disturb CC
.9 >LDYA ZPPtr3
rts
*/--------------------------------------
2018-06-21 15:12:10 +00:00
* # UnsetEnv
2018-09-06 15:36:44 +00:00
* Remove an environment variable
* ## C
* `int unsetenv(const char *name);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 15:36:44 +00:00
* `>LDYA name`
* `>SYSCALL unsetenv`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
*\--------------------------------------
2018-06-21 15:12:10 +00:00
K.UnsetEnv >STYA ZPPtr1 Store VAR Name
2017-10-27 14:56:46 +00:00
K.UnsetEnv.I jsr ENV.FindVarP1
bcs K.UnsetEnv.I.8 not found, quit
2017-10-27 14:56:46 +00:00
jsr ENV.DelVarP3 Ptr3 -> ENVNAME
K.UnsetEnv.I.8 clc
K.UnsetEnv.I.9 rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
* PRIVATE
*--------------------------------------
ENV.GetValue jsr ENV.ExpandSysVar
bcc K.UnsetEnv.I.9
>LDYAI ENV.VarName
2018-06-22 14:59:24 +00:00
jsr K.GetEnv
bcs K.UnsetEnv.I.9
*--------------------------------------
ENV.AddYAToBuf >STYA ZPPtr3
*--------------------------------------
ENV.AddP3ToBuf ldx ENV.BufLen
ldy #$ff
dex
.1 iny
inx
lda (ZPPtr3),y
sta K.Buf256,x
bne .1
stx ENV.BufLen
rts
*--------------------------------------
* ENV.ExpandSysVar
2015-03-14 21:48:35 +00:00
* In:
2017-10-27 14:56:46 +00:00
* ENV.VarLen,ENV.VarName
2016-08-17 06:25:58 +00:00
* Out:
* CC: Found
* Append VALUE to K.Buf256
2016-08-17 06:25:58 +00:00
* CS: Not Found
*--------------------------------------
ENV.ExpandSysVar
2017-10-27 14:56:46 +00:00
ldx ENV.VarLen
cpx #1 is name 1 char?
2018-11-28 14:58:42 +00:00
bne .4
2017-10-27 14:56:46 +00:00
lda ENV.VarName
jsr MEM.IsDigit $0...$9 ??
bcs .1
2016-08-17 06:25:58 +00:00
and #$0F
2018-10-16 15:48:03 +00:00
jsr K.ArgV
bcs K.UnsetEnv.I.8 Arg# is undefined, do not append anything
jmp ENV.AddYAToBuf
2018-11-28 14:58:42 +00:00
.1 ldx #ENV.SysVars.Cnt-1
.2 cmp ENV.SysVars,x
beq .3
dex
bpl .2
2016-08-17 06:25:58 +00:00
.9 sec
2018-11-28 14:58:42 +00:00
rts
2016-08-17 06:25:58 +00:00
.3 txa
asl
tax
jmp (ENV.SysVarsJmp,x)
2018-11-28 14:58:42 +00:00
.4 >LDYAI ENV.StrVars
>STYA ZPPtr3
ldx #0
.5 lda (ZPPtr3)
beq .9
cmp ENV.VarLen
bne .7
tay
.6 lda (ZPPtr3),y
dey
cmp ENV.VarName,y
bne .7
tya
bne .6
jmp (ENV.StrVarsJmp,x)
.7 inx
inx
lda (ZPPtr3)
sec
adc ZPPtr3
sta ZPPtr3
bcc .5
inc ZPPtr3+1
bra .5
*--------------------------------------
ENV.SysVars .AS "*#?@$!"
2018-11-28 14:58:42 +00:00
ENV.SysVars.Cnt .EQ *-ENV.SysVars
*--------------------------------------
ENV.SysVarsJmp .DA ENV.SysVarsArgs
.DA ENV.SysVarsArgC
.DA ENV.SysVarsRC
.DA ENV.SysVarsPPID
.DA ENV.SysVarsPID
.DA ENV.SysVarsCPID
*--------------------------------------
2018-11-28 14:58:42 +00:00
ENV.StrVars >PSTR "PWD"
>PSTR "UID"
.DA #0
*--------------------------------------
ENV.StrVarsJmp .DA ENV.StrVarsPWD
.DA ENV.StrVarsUID
*--------------------------------------
ENV.StrVarsPWD ldy #S.PS.hPREFIX
lda (pPS),y
jsr K.GetMemPtr
jmp ENV.AddYAToBuf
*--------------------------------------
ENV.StrVarsUID ldy #S.PS.UID
.HS 2C
*--------------------------------------
ENV.SysVarsArgC ldy #S.PS.ARGC
.HS 2C
ENV.SysVarsRC ldy #S.PS.RC
.HS 2C
ENV.SysVarsPPID ldy #S.PS.PPID
.HS 2C
ENV.SysVarsPID ldy #S.PS.PID
.HS 2C
ENV.SysVarsCPID ldy #S.PS.CPID
lda (pPS),y
stz .2+1
stz .3+1
ldx #8
sed
.1 asl
pha
.2 lda #$ff Self Modified
adc .2+1
sta .2+1
.3 lda #$ff Self Modified
adc .3+1
sta .3+1
2016-08-17 06:25:58 +00:00
pla
dex
bne .1
cld
lda .3+1
beq .4
jsr ENV.AddAToBuf30
.4 lda .2+1
pha
lsr
lsr
lsr
lsr
beq .5
jsr ENV.AddAToBuf30
.5 pla
and #$0f
.8 jsr ENV.AddAToBuf30
clc
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2018-11-28 14:58:42 +00:00
ENV.SysVarsArgs lda #1
jsr K.ArgV
bcs .8
>STYA ZPPtr3
.1 lda (ZPPtr3)
beq .8
.2 jsr ENV.AddP3ToBuf
jsr ENV.NextEnvP3
lda (ZPPtr3)
beq .8
lda #' '
jsr ENV.AddAToBuf
bra .2
.8 clc
rts
*--------------------------------------
2017-10-27 14:56:46 +00:00
* ENV.FindVarP1
2016-08-17 06:25:58 +00:00
* In:
2017-01-12 17:43:45 +00:00
* ZPPtr1 -> NAME
2015-03-14 21:48:35 +00:00
* Out:
* CC: Found
2017-01-12 17:43:45 +00:00
* ZPPtr1 -> NAME
* ZPPtr3 -> ENV.NAME
2015-03-14 21:48:35 +00:00
* CS: Not Found
2017-01-12 17:43:45 +00:00
* ZPPtr1 -> NAME
* ZPPtr3 -> PTR to Ending 0
2015-03-14 21:48:35 +00:00
*--------------------------------------
2017-10-27 14:56:46 +00:00
ENV.FindVarP1 jsr ENV.InitEnvP3 Store ENV
.1 lda (ZPPtr3)
2016-08-17 06:25:58 +00:00
beq .9 end of ENV
2018-10-26 14:46:11 +00:00
ldy #$ff
2016-08-17 06:25:58 +00:00
2018-10-26 14:46:11 +00:00
.2 iny
lda (ZPPtr1),y
2017-01-12 17:43:45 +00:00
cmp (ZPPtr3),y
2016-08-17 06:25:58 +00:00
bne .3
ora #0
2015-03-14 21:48:35 +00:00
bne .2
2018-10-26 14:46:11 +00:00
.8 clc
2016-08-17 06:25:58 +00:00
rts
2017-10-27 14:56:46 +00:00
.3 jsr ENV.NextEnvP3 Skip NAME
jsr ENV.NextEnvP3 Skip VALUE
bra .1
2016-08-17 06:25:58 +00:00
.9 sec
rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
2017-10-27 14:56:46 +00:00
* ENV.DelVarP3
2016-08-17 06:25:58 +00:00
* In:
2017-01-12 17:43:45 +00:00
* ZPPtr3 -> ENV.NAME to Discard
2016-08-17 06:25:58 +00:00
*--------------------------------------
2017-10-27 14:56:46 +00:00
ENV.DelVarP3 >LDYA ZPPtr3 save actual Ptr
>STYA ZPPtr4
2017-10-27 14:56:46 +00:00
jsr ENV.NextEnvP3 Skip current NAME....
jsr ENV.NextEnvP3 Skip current VALUE....
2018-10-29 08:41:10 +00:00
.1 ldy #$ff
2018-10-29 08:41:10 +00:00
.2 iny
lda (ZPPtr3),y Move back CSTRs...
sta (ZPPtr4),y
2018-10-29 08:41:10 +00:00
bne .2
tya
beq .8 we moved back ending \0
jsr ENV.NextEnvP3Y
jsr ENV.NextEnvP4Y
bra .1
2016-08-17 06:25:58 +00:00
.8 rts
*--------------------------------------
2017-10-27 14:56:46 +00:00
ENV.InitEnvP3 ldy #S.PS.hENV
2016-08-17 06:25:58 +00:00
lda (pPs),y
2018-06-21 15:12:10 +00:00
jsr K.GetMemPtr
>STYA ZPPtr3 Store ENV
2016-08-17 06:25:58 +00:00
rts
*--------------------------------------
2018-10-26 14:46:11 +00:00
ENV.NextEnvP3 ldy #$ff
2018-10-26 14:46:11 +00:00
.1 iny
lda (ZPPtr3),y
bne .1
2018-10-29 08:41:10 +00:00
ENV.NextEnvP3Y tya
2015-03-14 21:48:35 +00:00
sec
adc ZPPtr3
2017-01-12 17:43:45 +00:00
sta ZPPtr3
2016-08-17 06:25:58 +00:00
bcc .8
2017-01-12 17:43:45 +00:00
inc ZPPtr3+1
.8 rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2018-10-29 08:41:10 +00:00
ENV.NextEnvP4Y tya
sec
adc ZPPtr4
sta ZPPtr4
bcc .8
inc ZPPtr4+1
.8 rts
*--------------------------------------
ENV.AddAToBuf30 ora #$30
ENV.AddAToBuf ldx ENV.BufLen
sta K.Buf256,x
inc ENV.BufLen
rts
*--------------------------------------
ENV.BufLen .BS 1
ENV.bNoExp .BS 1
ENV.VarLen .BS 1
ENV.VarName .BS 16
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
2018-11-17 17:17:13 +00:00
SAVE USR/SRC/SYS/KERNEL.S.ENV
LOAD USR/SRC/SYS/KERNEL.S
2015-03-14 21:48:35 +00:00
ASM