PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF */-------------------------------------- * #ExpandPStrYA * ##In: * Y,A = PTR to String to Expand (PSTR) * ##Out: * X = hMem to Expanded String (PSTR) * Y,A = PTR to Expanded String *\-------------------------------------- K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string... .11 >STYA ZPPtr2 stz KrnBuf256 init Expanded String len=0 stz K.ExpandPStr.bFound No var found yet stz K.ExpandPStr.bNoExp Reset no expand flag ldy #0 .10 stz K.ExpandPStr.Start .1 tya cmp (ZPPtr2) End of PSTR? beq .6 iny lda (ZPPtr2),y cmp #''' bne .21 lda K.ExpandPStr.bNoExp eor #$ff sta K.ExpandPStr.bNoExp toggle flag bra .1 .21 bit K.ExpandPStr.bNoExp bmi .22 ldx K.ExpandPStr.Start bne .3 already in a var? cmp #'$' no, found one ? beq .2 .22 inc KrnBuf256 no, copy char ldx KrnBuf256 sta KrnBuf256,x bra .1 .2 sec ror K.ExpandPStr.bFound Toggle flag sty K.ExpandPStr.Start save var start stz K.ExpandPStr.End bra .1 skip this char .3 cmp #'{' we are in var, "{" after "$"? beq .2 cmp #'}' end of var? beq .5 jsr K.ExpandPStr.VC we are in var, is char valid? bcs .5 no, end here sty K.ExpandPStr.End yes, save end bra .1 .5 lda K.ExpandPStr.End get end beq .1 empty {} or $/ phy save current index jsr K.ExpandPStr.AV ply restore index in string... bra .10 reset start flag and continue .6 sty K.ExpandPStr.End end of PSTR lda K.ExpandPStr.Start are we in a var? beq .8 no...exit... jsr K.ExpandPStr.AV yes, expand and add to STR .8 lda K.ExpandPStr.hPStr working from our temp string ? beq .81 no... jsr K.FreeMemA yes, discard.... .81 >LDYAI KrnBuf256 jsr K.NewPStrYA bcs .9 stx K.ExpandPStr.hPStr save this as temp string, in case of recurse bit K.ExpandPStr.bFound Did we expand something ? bpl .82 jmp .11 Yes, start over with hPStr .82 * or exit with Y,A & X from K.NewPStrYA .9 rts *-------------------------------------- K.ExpandPStr.AV lda K.ExpandPStr.End sec sbc K.ExpandPStr.Start compute len of VAR End-Start+1 ldx KrnBuf256 inx sta KrnBuf256,x stx ZPPtr1 Make Ptr1 -> Var NAME lda /KrnBuf256 sta ZPPtr1+1 ldy K.ExpandPStr.Start .1 iny inx lda (ZPPtr2),y sta KrnBuf256,x cpy K.ExpandPStr.End bne .1 jsr ENV.CheckSysVarPtr1 bcc .2 Ptr3=VALUE jsr ENV.FindVarPtr1 bcs .9 jsr ENV.NextEnvPtr3 Skip NAME .2 lda (ZPPtr3) beq .9 in case CheckSysVarPtr1 returned a NUL string ldy #0 ldx KrnBuf256 .3 iny lda (ZPPtr3),y inx sta KrnBuf256,x tya cmp (ZPPtr3) last char? bne .3 stx KrnBuf256 .9 rts *-------------------------------------- K.ExpandPStr.VC cmp #'0' bcc .9 cmp #'9'+1 bcc .8 cmp #'A' bcc .9 cmp #'Z'+1 bcc .8 cmp #'_' bne .9 .8 clc rts .9 sec rts *-------------------------------------- K.ExpandPStr.Start .BS 1 K.ExpandPStr.End .BS 1 K.ExpandPStr.bFound .BS 1 K.ExpandPStr.bNoExp .BS 1 K.ExpandPStr.hPStr .BS 1 */-------------------------------------- * #PutEnvYA * ##In: * Y,A = PTR to String NAME=VALUE (PSTR) * ##Out: *\-------------------------------------- K.PutEnvYA >STYA ZPPtr1 NAME=VALUE lda (ZPPtr1) beq .9 sta KrnBuf256 tay .1 lda (ZPPtr1),y copy PSTR to KrnBuf256 sta KrnBuf256,y dey bne .1 ldy #0 .2 iny cpy KrnBuf256 last char ? beq .9 no "=" found lda KrnBuf256,y cmp #'=' bne .2 cpy #1 String like "=value" ? beq .9 cpy KrnBuf256 last char ? beq .9 we have "VAR=" lda KrnBuf256 get actual string len sty KrnBuf256 set length of VAR string dec KrnBuf256 ...without "=" clc Substract VAR len+1 from whole len to get sbc KrnBuf256 VALUE len sta KrnBuf256,y save it at "=" POS stz ZPPtr1 #KrnBuf256 sty ZPPtr2 lda /KrnBuf256 sta ZPPtr1+1 sta ZPPtr2+1 bra K.SetEnvPtr1Ptr2 .9 sec rts */-------------------------------------- * #SetEnv * ##In: * PUSHW = PTR To Value (PSTR) * PUSHW = PTR To Name (PSTR) * ##Out: *\-------------------------------------- K.SetEnv jsr PullPtr1Ptr2 Ptr1=NAME,Ptr2=VALUE K.SetEnvPtr1Ptr2 jsr S.UnsetEnvPtr1 jsr ENV.InitEnvPtr3 ZPPtr3 -> Env lda ZPPtr3 Compute ENV UPPER LIMIT in Ptr4 clc adc #K.ENV.SIZE sta ZPPtr4 lda ZPPtr3+1 adc /K.ENV.SIZE sta ZPPtr4+1 ldy ZPPtr3+1 lda ZPPtr3 Compute New Env Upper limit in A,Y sec adc (ZPPtr1) add NAME len +1 bcc .1 iny .1 sec adc (ZPPtr2) add VALUE len +1 bcc .2 iny .2 cmp ZPPtr4 GE than hMem Upper limit ? tya sbc ZPPtr4+1 bcs .99 .3 lda (ZPPtr3) Scan until ending 0... beq .4 inc ZPPtr3 bne .3 inc ZPPtr3+1 bne .3 .4 lda (ZPPtr1) sta (ZPPtr3) tay .5 lda (ZPPtr1),y sta (ZPPtr3),y dey bne .5 jsr ENV.NextEnvPtr3 lda (ZPPtr2) sta (ZPPtr3) tay .6 lda (ZPPtr2),y sta (ZPPtr3),y dey bne .6 jsr ENV.NextEnvPtr3 .8 lda #0 sta (ZPPtr3) clc rts .99 lda #SYSMGR.ERRENVF sec rts */-------------------------------------- * #GetEnvYA * ##In: * Y,A = PTR to NAME (PSTR) * ##Out: * CC : Y,A = PTR to VALUE (PSTR) * CS : not found *\-------------------------------------- K.GetEnvYA >STYA ZPPtr1 jsr ENV.CheckSysVarPtr1 bcc .8 jsr ENV.FindVarPtr1 bcs .9 jsr ENV.NextEnvPtr3 Skip NAME >LDYA ZPPtr3 clc just in case ADC in NextEnvPtr1 disturb CC .8 rts .9 >LDYAI EmptyPSTR rts */-------------------------------------- * #UnsetEnvYA * ##In: * Y,A = PTR To Name (PSTR) * ##Out: *\-------------------------------------- K.UnsetEnvYA >STYA ZPPtr1 Store VAR Name S.UnsetEnvPtr1 jsr ENV.FindVarPtr1 bcs .8 not found, quit jsr ENV.DiscardVarPtr3 Ptr3 -> ENVNAME .8 clc rts *-------------------------------------- * PRIVATE *-------------------------------------- * ENV.CheckSysVarPtr1 * In: * ZPPtr1 -> NAME * Out: * CC: Found * YA -> VALUE * CS: Not Found *-------------------------------------- ENV.CheckSysVarPtr1 lda (ZPPtr1) cmp #1 is name 1 char? bne .9 ldy #1 lda (ZPPtr1),y cmp #'0'-1 $0...$9 ?? bcc .1 cmp #'9'+1 bcs .1 and #$0F jsr K.GetArgA >STYA ZPPtr3 rts .1 ldx #ENV.SysVarsJmp-ENV.SysVars-1 .2 cmp ENV.SysVars,x beq .3 dex bpl .2 .9 sec 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.GetArgA Trash Ptr1 stz KrnOut256 ldx #0 .1 lda (ZPPtr1) beq ENV.SysVarsExit ldy #0 .2 iny inx lda (ZPPtr1),y sta KrnOut256,x tya cmp (ZPPtr1) bne .2 adc ZPPtr1 CS from beq .2 sta ZPPtr1 bcc .3 inc ZPPtr1+1 .3 lda #' ' inx beq ENV.SysVarsExit make sure not overlapping buf 256 sta KrnOut256,x bra .1 ENV.SysVarsArgC jsr K.GetArgC Trash Ptr1 bra ENV.SysVarsA 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 ENV.SysVarsA sta HEXBUF stz HEXBUF+1 stz HEXBUF+2 stz HEXBUF+3 jsr HEX2DEC ldy #0 .1 lda ASCBUF,y cmp #'0' bne .2 iny cpy #10 bne .1 sta KrnOut256+1 ldx #1 bra ENV.SysVarsExit .2 ldx #0 .3 lda ASCBUF,y inx sta KrnOut256,x iny cpy #10 bne .3 ENV.SysVarsExit stx KrnOut256 >LDYAI KrnOut256 >STYA ZPPtr3 clc rts *-------------------------------------- * ENV.FindVarPtr1 * In: * ZPPtr1 -> NAME * Out: * CC: Found * ZPPtr1 -> NAME * ZPPtr3 -> ENV.NAME * CS: Not Found * ZPPtr1 -> NAME * ZPPtr3 -> PTR to Ending 0 *-------------------------------------- ENV.FindVarPtr1 jsr ENV.InitEnvPtr3 Store ENV bcs .99 lda (ZPPtr3) beq .9 end of ENV .1 cmp (ZPPtr1) Same len as NAME? bne .3 tay .2 lda (ZPPtr1),y cmp (ZPPtr3),y bne .3 dey bne .2 clc rts .3 jsr ENV.NextEnvPtr3 Skip NAME jsr ENV.NextEnvPtr3 Skip VALUE lda (ZPPtr3) bne .1 .9 sec .99 rts *-------------------------------------- * ENV.DiscardVarPtr3 * In: * ZPPtr3 -> ENV.NAME to Discard *-------------------------------------- ENV.DiscardVarPtr3 lda ZPPtr3 Discard current NAME & VALUE definition sec ZPPtr3 -> NAME adc (ZPPtr3) add NAME+1 to ZPPtr3 sta ZPPtr4 store it in ZPPtr4 lda #0 adc ZPPtr3+1 sta ZPPtr4+1 lda ZPPtr4 add VALUE+1 to ZPPtr4 sec adc (ZPPtr4) sta ZPPtr4 bcc .1 inc ZPPtr4+1 .1 ldy #0 .2 lda (ZPPtr4),y Move back tail... sta (ZPPtr3),y beq .8 ...until we move ending 0 iny bne .2 inc ZPPtr3+1 inc ZPPtr4+1 bra .2 .8 rts *-------------------------------------- ENV.InitEnvPtr3 ldy #S.PS.hENV lda (pPs),y jsr K.GetMemPtrA >STYA ZPPtr3 Store ENV rts *-------------------------------------- ENV.NextEnvPtr3 lda ZPPtr3 sec adc (ZPPtr3) sta ZPPtr3 bcc .8 inc ZPPtr3+1 .8 rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.ENV LOAD SYS/KERNEL.S ASM