A2osX/SYS/KERNEL.S.STDLIB.txt

602 lines
10 KiB
Plaintext
Raw Permalink 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.

NEW
AUTO 3,1
*/--------------------------------------
* # StrToF
* Convert String to 40 bits Float
* ## C
* `float strtof (const char* str, char** endptr );`
* ## ASM
* `>PUSHW str`
* `>PUSHWI EndPtr`
* `>SYSCALL StrToF`
* ## RETURN VALUE
* On stack (float)
*\--------------------------------------
K.StrToF >PULLW ZPPtr1
>PULLYA
jsr K.AToF
lda TXTPTR
sta (ZPPtr1)
ldy #1
lda TXTPTR+1
sta (ZPPtr1),y
rts
*/--------------------------------------
* # AToF
* Convert String to 40 bits Float
* ## C
* `float atof ( const char* str );`
* ## ASM
* `>LDYA str`
* `>SYSCALL atof`
* ## RETURN VALUE
* On stack (float)
*\--------------------------------------
K.AToF >STYA TXTPTR Ptr to source string
lda pStack
sec
sbc #5
sta pStack
jsr CHARGOT
ldx #FPU.FIN
jmp GP.GetFac
*/--------------------------------------
* # StrToL/StrToUL
* Convert String to 32 bits (unsigned) int
* ## C
* `long strtol (const char* str, char** endptr, int base);`
* `unsigned long strtoul (const char* str, char** endptr, int base);`
* ## ASM
* `>PUSHW str`
* `>PUSHW EndPtr`
* `>PUSHB Base`
* `>SYSCALL StrToL`
* ## RETURN VALUE
* On stack (long)
*\--------------------------------------
K.StrToL sec Signed
.HS 90 BCC
K.StrToUL clc Unsigned
>PULLA Base
>PULLW ZPPtr1 EndPtr
>PULLW ZPPtr2 str
jsr K.AToL.I
bcs K.StrToUL.rts
* clc
adc ZPPtr2
sta (ZPPtr1)
lda #0
adc ZPPtr2+1
ldy #1
sta (ZPPtr1),y
K.StrToUL.rts rts
*/--------------------------------------
* # atol
* Convert String to 32 bits long
* ## C
* `long atol ( const char * str );`
* ## ASM
* `>LDYA str`
* `>SYSCALL atol`
* ## RETURN VALUE
* On stack (long)
*\--------------------------------------
K.AToL >STYA ZPPtr2 C-String in Ptr2, Dst buffer in Ptr1
* lda #10 base 10
sec signed
K.AToL.I jsr MATH.Dec2ACC32
bcs .9
ldx #3
.3 lda ACC32,x
>PUSHA
dex
bpl .3
tya Y = A = Count processed
* clc
.9
rts
*/--------------------------------------
* # atoi
* Convert String to 16 bits int
* ## C
* `int atoi ( const char * str );`
* ## ASM
* `>LDYAI str`
* `>SYSCALL atoi`
* ## RETURN VALUE
* Y,A = int
*\--------------------------------------
K.atoi >STYA ZPPtr2
* lda #10 base 10
sec signed
jsr MATH.Dec2ACC32
bcs .9
>LDYA ACC32
.9 rts
*/--------------------------------------
* # RealPath
* Return the canonicalized absolute pathname
* ## C / CSH
* `char *realpath(const char *path, char *resolvedpath);`
* ## ASM
* `>PUSHW path`
* `>PUSHW resolvedpath`
* `>SYSCALL realpath`
* ## RETURN VALUE
* CC : success
* Y,A = Ptr to Full Path (C-String Buffer, MLI.MAXPATH+1)
* X = hMem of Full Path
* CS : A = Error Code
*\--------------------------------------
K.realpath.DST .BS 2
K.realpath.RET4 >RET 4
K.realpath ldy #3
lda (pStack),y
>PUSHA
lda (pStack),y
>PUSHA
>PUSHWZ
jsr K.expand
bcs K.realpath.RET4
>STYA ZPPtr1
stx .99+1 save expanded buffer hMem
>PULLW K.realpath.DST resolved path
inc pStack discard path
inc pStack
ldx #$ff
lda (ZPPtr1)
cmp #'/' full path starting with '/'?
beq .3 yes, do not append to current prefix
.1 ldy #S.PS.hCWD
lda (pPS),y
jsr K.GetMemPtr
>STYA .20+1
ldy #$ff
.2 iny
inx
.20 lda $ffff,y
sta K.Buf256,x
bne .2
dex
.3 ldy #$ff
.4 iny
inx
lda (ZPPtr1),y
sta K.Buf256,x
bne .4
dex
beq .81 we have '/'....nothing to do...
*--------------------------------------
* X=LEN, K.Buf256 = /dir1/./../file(/)\0
*--------------------------------------
ldx #0 will skip leading /
.5 ldy #0 reset dot counter=0
.6 inx
lda K.Buf256,x
beq .8
.7 cmp #'/'
beq .8
cmp #'.'
bne .5
iny
bra .6
.8 tya
beq .80 Y was 0....nothing to do...
dey one dot ?
bne .9 no..
dex
dex
jsr K.RealPath.RemoveAtX we found "/.", remove,useless....
bra .80
.9 dey "/.." ?
bne .99 "/..." ??!!...syntax error
dex
dex
dex
txa we found "/.."
beq .99 at the beginning of string...cannot remove /dir/..
jsr K.RealPath.RemoveAtX remove "/.."
.10 dex
lda K.Buf256,x go to "/dir"
cmp #'/'
bne .10
jsr K.RealPath.RemoveAtX ...remove "/dir"
.80 lda K.Buf256,x was / or \0 ?
bne .5
*--------------------------------------
.81 jsr .99
.82 ldy K.realpath.DST
lda K.realpath.DST+1
bne .85
>LDYAI MLI.MAXPATH+1
jsr K.getmem
bcs .90
.85 >STYA ZPPtr1
ldy #$ff
.83 iny
lda K.Buf256,y
sta (ZPPtr1),y
bne .83
>LDYA ZPPtr1
clc
rts
.99 lda #$ff SELF MODIFIED
jsr K.FreeMem
lda #E.BADPATH
sec
.90 rts
*--------------------------------------
K.RealPath.RemoveAtX
txa X = "/something"
tay
.1 iny
lda K.Buf256,y
beq .2 found /something\0
cmp #'/'
bne .1 found /something/
.2 phx save X for exit
.3 iny K.Buf256,y=/ or 0
inx
lda K.Buf256-1,y
sta K.Buf256-1,x
bne .3
txa
bne .8
lda #'/' Make sure we have a least '/' in the buffer
sta K.Buf256
stz K.Buf256+1
.8 plx restore X
rts
*/--------------------------------------
* # Expand
* ## C
* `char *expand(const char *str, char *expanded);`
* ## ASM
* `>PUSHW str`
* `>PUSHW expanded`
* `>SYSCALL expand`
* ## RETURN VALUE
* if expanded == null
* Y,A = PTR to Expanded String
* X = hMem to Expanded String
* if expanded != null
* Y,A = strlen
*\--------------------------------------
K.Expand ldy #2
lda (pStack),y
pha
iny
lda (pStack),y
ply
jsr K.strdup
bcc .1
jmp .9
.1 phx Save temp string...
>STYA TXTPTR
stz ENV.BufPtr init Expanded String len=0
stz ENV.bExp No var found yet
stz ENV.bNoExp Reset no expand flag
.10 lda (TXTPTR) End of CSTR?
beq .80
jsr SHARED.TXTPTRn
.11 cmp #'''
bne .21
lda ENV.bNoExp
eor #$ff
sta ENV.bNoExp toggle flag
bra .10
.21 bit ENV.bNoExp
bpl .23
.22 jsr ENV.AddAToBuf
bra .10
.23 cmp #'$' no, found one ?
bne .22 no, store...
lda (TXTPTR)
bne .24
lda #'$' End of string, output $
bra .22
.24
* sec
ror ENV.bExp Toggle Expanded flag
stz ENV.VarEndChar
cmp #'{' "${VAR]"?
bne .31
dec ENV.VarEndChar "}" expected
jsr SHARED.TXTPTRn skip "{"
bra .40
.31 jsr ENV.SysVar 0-9 *#?@$!
bcs .40
.35 jsr SHARED.TXTPTRn skip $x
bra .10
.40 jsr ENV.ExpandStrVar
bcc .70
.50 ldy ENV.BufPtr
lda /K.Buf256
>STYA FORPNT
ldx #_GetEnv
jsr K.GetEnv.I
bcs .70
ldx ENV.BufPtr
.51 lda K.Buf256,x
beq .52
inx
bra .51
.52 stx ENV.BufPtr
.70 lda (TXTPTR)
beq .72
jsr SHARED.IsIDValid
bcs .72
jsr SHARED.TXTPTRn
bra .70
.72 lda ENV.VarEndChar
bne .35 skip "}" and loop
bra .10
.80 ldx ENV.BufPtr
stz K.Buf256,x
pla discard temp string
jsr K.FreeMem
bit ENV.bExp Did we expand something ?
bpl .81
jsr STRING.DupBuf256
bcs .9
jmp .1
.81 ldy #1
lda (pStack),y
beq .83
sta ZPPtr1+1
lda (pStack)
sta ZPPtr1
ldy #$ff
.82 iny
lda K.Buf256,y
sta (ZPPtr1),y
bne .82
* Y = len, A = 0
bra .9
.83 jsr STRING.DupBuf256
.9 >RET 4
*--------------------------------------
ENV.SysVar jsr ZP.IsDigit $0 ... $9 ?
bcs .1
and #$0f
jsr K.ArgV
bcs .8 Arg# is undefined, do not append anything
jsr ENV.AddYAToBuf
.8 clc
rts
.1 ldx #ENV.SysVars.Cnt-1
.2 cmp ENV.SysVars,x
beq .3
dex
bpl .2
sec
rts
.3 txa
beq ENV.SysVarsAllArgs
ldy ENV.SysVars.PS-1,x
lda (pPS),y
*--------------------------------------
ENV.SysVarsNum jsr MATH.A2STR10NP
ldy #0
.1 lda FOUTBuf,y
beq ENV.SysVarsNum.8
iny
jsr ENV.AddAToBuf
bra .1
ENV.SysVarsNum.8
clc
rts
*--------------------------------------
ENV.SysVarsAllArgs
lda #1
jsr K.ArgV
bcs ENV.SysVarsNum.8
>STYA ZPPtr3
.1 lda (ZPPtr3)
beq ENV.SysVarsNum.8
.2 jsr ENV.AddP3ToBuf
jsr ENV.NextEnvP3
lda (ZPPtr3)
beq ENV.SysVarsNum.8
lda #C.SPACE
jsr ENV.AddAToBuf
bra .2
*--------------------------------------
ENV.SysVars .AS "*#?@$!"
ENV.SysVars.Cnt .EQ *-ENV.SysVars
ENV.SysVars.PS .DA #S.PS.ARGC,#S.PS.RC,#S.PS.PPID,#S.PS.PID,#S.PS.CPID
*--------------------------------------
ENV.ExpandStrVar
>LDYAI ENV.StrVars
>STYA ZPPtr3
ldx #0
.1 lda (ZPPtr3)
beq .9
ldy #$ff
.2 iny
lda (TXTPTR),y
beq .3
jsr SHARED.IsIDValid
bcs .3
cmp (ZPPtr3),y
beq .2
bra .4
.3 lda (ZPPtr3),y
bne .4
jmp (ENV.StrVarsJmp,x)
.4 inx
inx
jsr ENV.NextEnvP3
bra .1
.9 sec
rts
*--------------------------------------
ENV.StrVars .AZ "PWD"
.DA #0
*--------------------------------------
ENV.StrVarsJmp .DA ENV.StrVarsPWD
*--------------------------------------
ENV.StrVarsPWD ldy #S.PS.hCWD
lda (pPS),y
jsr K.GetMemPtr
*--------------------------------------
ENV.AddYAToBuf >STYA ZPPtr3
*--------------------------------------
ENV.AddP3ToBuf ldx ENV.BufPtr
ldy #$ff
dex
.1 iny
inx
lda (ZPPtr3),y
sta K.Buf256,x
bne .1
stx ENV.BufPtr
rts
*--------------------------------------
ENV.AddAToBuf ldx ENV.BufPtr
sta K.Buf256,x
inc ENV.BufPtr
rts
*--------------------------------------
ENV.NextEnvP3 jsr ENV.GetP3LenY
tya
sec
adc ZPPtr3
sta ZPPtr3
bcc .8
inc ZPPtr3+1
.8 rts
*--------------------------------------
ENV.GetP3LenY ldy #$ff
.1 iny
lda (ZPPtr3),y
bne .1
rts
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.stdlib
LOAD usr/src/sys/kernel.s
ASM