PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 */-------------------------------------- * # ExpandStr.YA * ## In: * Y,A = PTR to String to Expand (C-String) * ## Out: * X = hMem to Expanded String (C-String) * Y,A = PTR to Expanded String *\-------------------------------------- K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... .1 >STYA ZPPtr2 stz ENV.BufLen init Expanded String len=0 stz ENV.bFound No var found yet stz ENV.bNoExp Reset no expand flag ldy #0 .10 stz ENV.VarLen stz ENV.bInVar .11 lda (ZPPtr2),y End of CSTR? beq .8 iny cmp #''' bne .21 lda ENV.bNoExp eor #$ff sta ENV.bNoExp toggle flag bra .11 .21 bit ENV.bNoExp bpl .23 .22 ldx ENV.BufLen sta K.Buf256,x inx stx ENV.BufLen bra .11 .23 ldx ENV.bInVar already in a var? bne .3 yes... cmp #'$' no, found one ? bne .22 no, store... sta ENV.bFound Toggle flag sta ENV.bInVar 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 ENV.IsVarChar bcc .32 yes, add to varname ldx ENV.VarLen bne .5 varname has already chars...end of var inx must be a $? or ?x.....go expand stx ENV.VarLen sta ENV.VarName bra .51 go Expand.... .32 ldx ENV.VarLen cpx #16 beq .11 varname longer than 15....ignore sta ENV.VarName,x inx stx ENV.VarLen bra .11 .5 dey last char was invalid...move back .50 ldx ENV.VarLen beq .52 var name is empty...start over .51 stz ENV.VarName,x phy save current index 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... stz ENV.VarName,x jsr ENV.GetValue yes, expand and add to STR .80 lda ENV.hStr working from our temp string ? beq .81 no... jsr K.FreeMem.A yes, discard.... .81 ldx ENV.BufLen stz K.Buf256,x >LDYAI K.Buf256 jsr K.NewStr.YA bcs .9 stx ENV.hStr save this as temp string, in case of recurse ldx ENV.bFound Did we expand something ? beq .82 jmp .1 Yes, start over with hPStr .82 ldx ENV.hStr * or exit with Y,A from K.NewStrYA .9 rts *-------------------------------------- ENV.IsVarChar cmp #'_' beq .8 cmp #'0' bcc .9 cmp #'9'+1 bcc .8 cmp #'A' bcc .9 cmp #'Z'+1 * bcc .8 rts .8 clc rts .9 sec rts *-------------------------------------- ENV.GetValue jsr ENV.ExpandSysVar bcc .9 >LDYAI ENV.VarName jsr K.GetEnv.YA bcs .9 >STYA ZPPtr3 jsr ENV.AddP3ToBuf .9 rts *-------------------------------------- ENV.BufLen .BS 1 ENV.bNoExp .BS 1 ENV.bInVar .BS 1 ENV.bFound .BS 1 ENV.hStr .BS 1 ENV.VarLen .BS 1 ENV.VarName .BS 16 */-------------------------------------- * # PutEnv.YA * ## In: * Y,A = PTR to String NAME=VALUE (C-String) * ## Out: *\-------------------------------------- K.PutEnv.YA >STYA ZPPtr1 NAME=VALUE ldy #0 .1 lda (ZPPtr1),y copy STR to K.Buf256 beq .9 cmp #'=' beq .2 sta K.Buf256,y iny bne .1 .2 lda #0 sta K.Buf256,y tya sec adc ZPPtr1 sta ZPPtr2 lda ZPPtr1+1 adc #0 sta ZPPtr2+1 >LDYAI K.Buf256 >STYA ZPPtr1 bra K.SetEnv.I .9 sec rts */-------------------------------------- * # SetEnv * ## In: * PUSHW = PTR To Value (PSTR) * PUSHW = PTR To Name (PSTR) * ## Out: *\-------------------------------------- K.SetEnv jsr PullP1P2 Ptr1=NAME,Ptr2=VALUE K.SetEnv.I jsr K.UnsetEnv.I jsr ENV.InitEnvP3 ZPPtr3 -> Env ldy #0 ldx #0 .10 lda (ZPPtr3) End of ENV beq .15 .11 iny Compute ENV size in X,Y bne .12 inx .12 inc ZPPtr3 bne .13 inc ZPPtr3+1 .13 lda (ZPPtr3) End of string bne .11 iny bne .14 inx .14 inc ZPPtr3 bne .10 inc ZPPtr3+1 bra .10 .15 sty ZPPtr4 stx ZPPtr4+1 ldy #0 .16 lda (ZPPtr1),y beq .17 iny bne .16 .17 tya sec adc ZPPtr4 sta ZPPtr4 bcc .18 inc ZPPtr4+1 .18 ldy #0 .19 lda (ZPPtr2),y beq .20 iny bne .19 .20 tya sec adc ZPPtr4 tax bcc .21 inc ZPPtr4+1 .21 cpx #K.ENV.SIZE lda ZPPtr4+1 sbc /K.ENV.SIZE bcs .99 ldy #$ff .22 iny lda (ZPPtr1),y sta (ZPPtr3),y bne .22 tya sec adc ZPPtr3 sta ZPPtr3 bcc .23 inc ZPPtr3+1 .23 ldy #$ff .24 iny lda (ZPPtr2),y sta (ZPPtr3),y bne .24 iny sta (ZPPtr3),y don't forget array ending 0 clc rts .99 lda #K.E.ENVF * sec rts */-------------------------------------- * # GetEnv.YA * ## In: * Y,A = PTR to NAME (PSTR) * ## Out: * CC : Y,A = PTR to VALUE (PSTR) * CS : not found *\-------------------------------------- K.GetEnv.YA >STYA ZPPtr1 jsr ENV.FindVarP1 bcs .9 jsr ENV.NextEnvP3 Skip NAME clc just in case ADC in NextEnvPtr1 disturb CC .9 >LDYA ZPPtr3 rts */-------------------------------------- * # UnsetEnv.YA * ## In: * Y,A = PTR To Name (PSTR) * ## Out: *\-------------------------------------- K.UnsetEnv.YA >STYA ZPPtr1 Store VAR Name K.UnsetEnv.I jsr ENV.FindVarP1 bcs .8 not found, quit jsr ENV.DelVarP3 Ptr3 -> ENVNAME .8 clc rts *-------------------------------------- * PRIVATE *-------------------------------------- * ENV.ExpandSysVar * In: * ENV.VarLen,ENV.VarName * Out: * CC: Found * Append VALUE to K.Buf256 * CS: Not Found *-------------------------------------- ENV.ExpandSysVar ldx ENV.VarLen cpx #1 is name 1 char? bne .9 lda ENV.VarName cmp #'0'-1 $0...$9 ?? bcc .1 cmp #'9'+1 bcs .1 and #$0F jsr K.GetArg.A bcs .8 Arg# is undefined, do not append anything >STYA ZPPtr3 jmp ENV.AddP3ToBuf .8 clc rts .1 ldx #ENV.SysVarsJmp-ENV.SysVars-1 .2 cmp ENV.SysVars,x beq .3 dex bpl .2 .9 sec .99 rts .3 txa asl tax jmp (ENV.SysVarsJmp,x) ENV.SysVars .AS "*#?@$!" ENV.SysVarsJmp .DA ENV.SysVarsArgs .DA ENV.SysVarsArgC .DA ENV.SysVarsRC .DA ENV.SysVarsPPID .DA ENV.SysVarsPID .DA ENV.SysVarsCPID *-------------------------------------- ENV.SysVarsArgs lda #1 jsr K.GetArg.A bcs .8 >STYA ZPPtr3 .1 lda (ZPPtr3) beq .8 jsr ENV.AddP3ToBuf .2 jsr ENV.NextEnvP3 lda (ZPPtr3) beq .8 inx beq .8 make sure not overlapping buf 256 lda #' ' sta K.Buf256,x stx ENV.BufLen jsr ENV.AddP3ToBuf bra .2 .8 clc rts *-------------------------------------- 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.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 pla dex bne .1 cld ldx ENV.BufLen lda .3+1 beq .4 sta K.Buf256,x inx .4 lda .2+1 lsr lsr lsr lsr beq .5 ora #$30 sta K.Buf256,x inx .5 lda .2+1 and #$0f ora #$30 sta K.Buf256,x inx stx ENV.BufLen clc rts *-------------------------------------- * ENV.FindVarP1 * In: * ZPPtr1 -> NAME * Out: * CC: Found * ZPPtr1 -> NAME * ZPPtr3 -> ENV.NAME * CS: Not Found * ZPPtr1 -> NAME * ZPPtr3 -> PTR to Ending 0 *-------------------------------------- ENV.FindVarP1 jsr ENV.InitEnvP3 Store ENV .1 lda (ZPPtr3) beq .9 end of ENV ldy #0 .2 lda (ZPPtr1),y cmp (ZPPtr3),y bne .3 ora #0 beq .8 iny bne .2 .8 clc rts .3 jsr ENV.NextEnvP3 Skip NAME jsr ENV.NextEnvP3 Skip VALUE bra .1 .9 sec rts *-------------------------------------- * ENV.DelVarP3 * In: * ZPPtr3 -> ENV.NAME to Discard *-------------------------------------- ENV.DelVarP3 >LDYA ZPPtr3 save actual Ptr >STYA ZPPtr4 jsr ENV.NextEnvP3 Skip current NAME.... jsr ENV.NextEnvP3 Skip current VALUE.... ldy #0 .1 lda (ZPPtr3),y Move back CSTRs... .2 sta (ZPPtr4),y beq .3 0 ended.... iny bne .1 inc ZPPtr3+1 inc ZPPtr4+1 bra .1 .3 iny bne .4 inc ZPPtr3+1 inc ZPPtr4+1 .4 lda (ZPPtr3),y bne .2 Until array ending 0 sta (ZPPtr4),y .8 rts *-------------------------------------- ENV.InitEnvP3 ldy #S.PS.hENV lda (pPs),y jsr K.GetMemPtr.A >STYA ZPPtr3 Store ENV rts *-------------------------------------- ENV.NextEnvP3 ldy #0 .1 lda (ZPPtr3),y beq .2 iny bne .1 .2 tya sec adc ZPPtr3 sta ZPPtr3 bcc .8 inc ZPPtr3+1 .8 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.ENV LOAD /A2OSX.SRC/SYS/KERNEL.S ASM