Kernel version 0.9 : KERNEL.S.ENV.txt, MAJOR bur fix in $?,$$...system vars

This commit is contained in:
Rémy GIBERT 2017-04-01 23:01:28 +02:00
parent 14275e29d2
commit bf22885600
8 changed files with 162 additions and 158 deletions

Binary file not shown.

Binary file not shown.

View File

@ -62,7 +62,7 @@ D.STACK.TOP .EQ $03F0 ...Down to $0300
*-------------------------------------- *--------------------------------------
KrnBuf256 .EQ $0C00 Main KrnBuf256 .EQ $0C00 Main
*-------------------------------------- *--------------------------------------
KrnOut256 .EQ $0D00 Used to return Values to User Space * .EQ $0D00
*-------------------------------------- *--------------------------------------
K.MLI.PARAMS .EQ $0E00 Main, 18 bytes min for GetFileInfo K.MLI.PARAMS .EQ $0E00 Main, 18 bytes min for GetFileInfo
K.MLI.PATH .EQ K.MLI.PARAMS+18 K.MLI.PATH .EQ K.MLI.PARAMS+18

View File

@ -100,8 +100,9 @@ OApple+1,OApple+2,OApple+3 to switch between screens : Kernel Log, text, DHGR.
| Name | Status | Comment | | Name | Status | Comment |
| ---- | ------ | ------- | | ---- | ------ | ------- |
| $PWD | Working | 'Working Directory' | | $PWD | Working | 'Working Directory' |
| $* | Working | All Args | | $0 | Working | Command Full Path |
| $1-$9 | Working | Arg[n] | | $1-$9 | Working | Arg[n] |
| $* | Working | All Args |
| $# | Working | Arg Count | | $# | Working | Arg Count |
| $? | Working | Return Code | | $? | Working | Return Code |
| $@ | Working | Parent PID | | $@ | Working | Parent PID |

View File

@ -12,13 +12,6 @@ Cmd.ExecYA.1 >SYSCALL ExpandPStrYA
>STYA ZPPtr1 >STYA ZPPtr1
phx phx
lda #'('
>SYSCALL PutCA
>LDYA ZPPtr1
>SYSCALL PPRintFYA
lda #')'
>SYSCALL PutCA
ldy #1 ldy #1
ldx #0 ARGS len ldx #0 ARGS len

View File

@ -13,19 +13,21 @@ AUTO 6
*\-------------------------------------- *\--------------------------------------
K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string... K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string...
.11 >STYA ZPPtr2 .1 >STYA ZPPtr2
stz KrnBuf256 init Expanded String len=0 stz KrnBuf256 init Expanded String len=0
stz K.ExpandPStr.bFound No var found yet stz K.ExpandPStr.bFound No var found yet
stz K.ExpandPStr.bNoExp Reset no expand flag stz K.ExpandPStr.bNoExp Reset no expand flag
ldy #0 ldy #0
.10 stz K.ExpandPStr.Start .10 stz K.ExpandPStr.Name
stz K.ExpandPStr.bInVar
.1 tya .11 tya
cmp (ZPPtr2) End of PSTR? cmp (ZPPtr2) End of PSTR?
beq .6 beq .8
iny iny
lda (ZPPtr2),y lda (ZPPtr2),y
@ -36,55 +38,75 @@ K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string...
lda K.ExpandPStr.bNoExp lda K.ExpandPStr.bNoExp
eor #$ff eor #$ff
sta K.ExpandPStr.bNoExp toggle flag sta K.ExpandPStr.bNoExp toggle flag
bra .1 bra .11
.21 bit K.ExpandPStr.bNoExp .21 bit K.ExpandPStr.bNoExp
bmi .22 bpl .23
ldx K.ExpandPStr.Start .22 ldx KrnBuf256
bne .3 already in a var? inx
beq .8
sta KrnBuf256,x
stx KrnBuf256
bra .11
.23 ldx K.ExpandPStr.bInVar already in a var?
bne .3 yes....
cmp #'$' no, found one ? cmp #'$' no, found one ?
beq .2 bne .22 no, store....
.22 inc KrnBuf256 no, copy char sta K.ExpandPStr.bFound Toggle flag
ldx KrnBuf256 sta K.ExpandPStr.bInVar
sta KrnBuf256,x
bra .1
.2 sec bra .11 skip this char
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 "$"? .3 cmp #'{' we are in var, "{" after "$"?
beq .2 bne .31
ldx K.ExpandPStr.Name No char in var yet ?
cmp #'}' end of var? beq .11 normal, "${" syntax is ok,skip
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 bne .5 not allowed char in varname, end of var
beq .1 empty {} or $/
phy save current index .31 cmp #'}' end of var?
jsr K.ExpandPStr.AV beq .50
jsr K.ExpandPStrValidChar
bcc .32 yes, add to varname
ldx K.ExpandPStr.Name
bne .5 varname has already chars...end of var
inx must be a $? or ?x.....go expand
stx K.ExpandPStr.Name
sta K.ExpandPStr.Name+1
bra .51
.32 ldx K.ExpandPStr.Name
inx
cpx #16
beq .11 varname longer than 15....ignore
sta K.ExpandPStr.Name,x
stx K.ExpandPStr.Name
bra .11
.5 dey last char was invalid...move back
.50 ldx K.ExpandPStr.Name
bne .51
jmp .1 var name is empty...start over
.51 phy save current index
jsr K.ExpandPStrGetValue
ply restore index in string... ply restore index in string...
bra .10 reset start flag and continue jmp .10 reset start flag and continue
.6 sty K.ExpandPStr.End end of PSTR .8 ldx K.ExpandPStr.Name end of PSTR,are we in a var?
lda K.ExpandPStr.Start are we in a var? beq .80 no...exit...
beq .8 no...exit...
jsr K.ExpandPStr.AV yes, expand and add to STR jsr K.ExpandPStrGetValue yes, expand and add to STR
.8 lda K.ExpandPStr.hPStr working from our temp string ? .80 lda K.ExpandPStr.hPStr working from our temp string ?
beq .81 no... beq .81 no...
jsr K.FreeMemA yes, discard.... jsr K.FreeMemA yes, discard....
@ -93,63 +115,31 @@ K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string...
jsr K.NewPStrYA jsr K.NewPStrYA
bcs .9 bcs .9
stx K.ExpandPStr.hPStr save this as temp string, in case of recurse stx K.ExpandPStr.hPStr save this as temp string, in case of recurse
bit K.ExpandPStr.bFound Did we expand something ? ldx K.ExpandPStr.bFound Did we expand something ?
bpl .82 beq .82
jmp .11 Yes, start over with hPStr jmp .1 Yes, start over with hPStr
.82 .82 ldx K.ExpandPStr.hPStr
* or exit with Y,A & X from K.NewPStrYA * or exit with Y,A from K.NewPStrYA
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
K.ExpandPStr.AV lda K.ExpandPStr.End K.ExpandPStrGetValue
sec jsr ENV.ExpandSysVar
sbc K.ExpandPStr.Start compute len of VAR End-Start+1 bcc .9
ldx KrnBuf256 >LDYAI K.ExpandPStr.Name
inx jsr K.GetEnvYA
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 bcs .9
jsr ENV.NextEnvPtr3 Skip NAME
.2 lda (ZPPtr3) >STYA ZPPtr3
beq .9 in case CheckSysVarPtr1 returned a NUL string
ldy #0 jsr ENV.AppendPtr3ToBuf
ldx KrnBuf256
.3 iny
lda (ZPPtr3),y
inx
sta KrnBuf256,x
tya
cmp (ZPPtr3) last char?
bne .3
stx KrnBuf256
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
K.ExpandPStr.VC cmp #'0' K.ExpandPStrValidChar
cmp #'0'
bcc .9 bcc .9
cmp #'9'+1 cmp #'9'+1
bcc .8 bcc .8
@ -167,10 +157,9 @@ K.ExpandPStr.VC cmp #'0'
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
K.ExpandPStr.Start .BS 1
K.ExpandPStr.End .BS 1
K.ExpandPStr.bFound .BS 1
K.ExpandPStr.bNoExp .BS 1 K.ExpandPStr.bNoExp .BS 1
K.ExpandPStr.bInVar .BS 1
K.ExpandPStr.bFound .BS 1
K.ExpandPStr.hPStr .BS 1 K.ExpandPStr.hPStr .BS 1
K.ExpandPStr.Name .BS 16 K.ExpandPStr.Name .BS 16
*/-------------------------------------- */--------------------------------------
@ -315,11 +304,9 @@ K.SetEnvPtr1Ptr2
* CS : not found * CS : not found
*\-------------------------------------- *\--------------------------------------
K.GetEnvYA >STYA ZPPtr1 K.GetEnvYA >STYA ZPPtr1
jsr ENV.CheckSysVarPtr1
bcc .8
jsr ENV.FindVarPtr1 jsr ENV.FindVarPtr1
bcs .9 bcs .9
jsr ENV.NextEnvPtr3 Skip NAME jsr ENV.NextEnvPtr3 Skip NAME
>LDYA ZPPtr3 >LDYA ZPPtr3
clc just in case ADC in NextEnvPtr1 disturb CC clc just in case ADC in NextEnvPtr1 disturb CC
@ -344,28 +331,33 @@ S.UnsetEnvPtr1 jsr ENV.FindVarPtr1
*-------------------------------------- *--------------------------------------
* PRIVATE * PRIVATE
*-------------------------------------- *--------------------------------------
* ENV.CheckSysVarPtr1 * ENV.ExpandSysVar
* In: * In:
* ZPPtr1 -> NAME * K.ExpandPStr.Name
* Out: * Out:
* CC: Found * CC: Found
* ZPPtr3=YA -> VALUE * Append VALUE to KrnBuf256
* CS: Not Found * CS: Not Found
*-------------------------------------- *--------------------------------------
ENV.CheckSysVarPtr1 ENV.ExpandSysVar
lda (ZPPtr1) ldx K.ExpandPStr.Name
cmp #1 is name 1 char? cpx #1 is name 1 char?
bne .9 bne .9
ldy #1 ldy #1
lda (ZPPtr1),y lda K.ExpandPStr.Name+1
cmp #'0'-1 $0...$9 ?? cmp #'0'-1 $0...$9 ??
bcc .1 bcc .1
cmp #'9'+1 cmp #'9'+1
bcs .1 bcs .1
and #$0F and #$0F
jsr K.GetArgA jsr K.GetArgA
bcs .8
>STYA ZPPtr3 >STYA ZPPtr3
jmp ENV.AppendPtr3ToBuf
.8 clc
rts rts
.1 ldx #ENV.SysVarsJmp-ENV.SysVars-1 .1 ldx #ENV.SysVarsJmp-ENV.SysVars-1
@ -391,22 +383,25 @@ ENV.SysVarsJmp .DA ENV.SysVarsArgs
.DA ENV.SysVarsPID .DA ENV.SysVarsPID
.DA ENV.SysVarsCPID .DA ENV.SysVarsCPID
*-------------------------------------- *--------------------------------------
ENV.SysVarsArgs lda #1 ENV.SysVarsArgs
jsr K.GetArgA Trash Ptr1
stz KrnOut256 lda #1
jsr K.GetArgA Trash Ptr1
ldx #0 bcs ENV.SysVarsExit2
ldx KrnBuf256
.1 lda (ZPPtr1) .1 lda (ZPPtr1)
beq ENV.SysVarsExit bcs ENV.SysVarsExit
ldy #0 ldy #0
.2 iny .2 iny
inx inx
beq ENV.SysVarsExit make sure not overlapping buf 256
lda (ZPPtr1),y lda (ZPPtr1),y
sta KrnOut256,x sta KrnBuf256,x
tya tya
cmp (ZPPtr1) cmp (ZPPtr1)
bne .2 bne .2
@ -418,7 +413,7 @@ ENV.SysVarsArgs lda #1
.3 lda #' ' .3 lda #' '
inx inx
beq ENV.SysVarsExit make sure not overlapping buf 256 beq ENV.SysVarsExit make sure not overlapping buf 256
sta KrnOut256,x sta KrnBuf256,x
bra .1 bra .1
ENV.SysVarsArgC jsr K.GetArgC Trash Ptr1 ENV.SysVarsArgC jsr K.GetArgC Trash Ptr1
@ -432,7 +427,7 @@ ENV.SysVarsPID ldy #S.PS.PID
.HS 2C .HS 2C
ENV.SysVarsCPID ldy #S.PS.CPID ENV.SysVarsCPID ldy #S.PS.CPID
lda (pPS),y lda (pPS),y
ENV.SysVarsA sta HEXBUF ENV.SysVarsA sta HEXBUF
stz HEXBUF+1 stz HEXBUF+1
stz HEXBUF+2 stz HEXBUF+2
@ -440,32 +435,30 @@ ENV.SysVarsA sta HEXBUF
jsr HEX2DEC jsr HEX2DEC
ldy #6 Start at 0000000xxx ldy #6 Start at 0000000xxx
ldx #4 len is 4 for now
.1 dex .1 iny
lda ASCBUF+1,y lda ASCBUF,y
cmp #'0' cmp #'0'
bne .2 bne .2
iny
cpy #8 Print always ast char cpy #9 Print always last char
bne .1 bne .1
.2 txa .2 ldx KrnBuf256
sta ASCBUF,y
.3 inx
beq ENV.SysVarsExit2
tya sta KrnBuf256,x
clc iny
adc #ASCBUF cpy #10
tay beq ENV.SysVarsExit
lda /ASCBUF
adc #0
bra ENV.SysVarsExit2 lda ASCBUF,y
bra .3
ENV.SysVarsExit stx KrnOut256
>LDYAI KrnOut256 ENV.SysVarsExit stx KrnBuf256
ENV.SysVarsExit2 ENV.SysVarsExit2
>STYA ZPPtr3
clc clc
rts rts
*-------------------------------------- *--------------------------------------
@ -554,6 +547,23 @@ ENV.NextEnvPtr3 lda ZPPtr3
inc ZPPtr3+1 inc ZPPtr3+1
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
ENV.AppendPtr3ToBuf
ldy #0
ldx KrnBuf256
.1 iny
lda (ZPPtr3),y
inx
beq .9
sta KrnBuf256,x
tya
cmp (ZPPtr3) last char?
bne .1
stx KrnBuf256
.9 rts
*--------------------------------------
MAN MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.ENV SAVE /A2OSX.SRC/SYS/KERNEL.S.ENV
LOAD /A2OSX.SRC/SYS/KERNEL.S LOAD /A2OSX.SRC/SYS/KERNEL.S

View File

@ -14,7 +14,7 @@ Kernel.Init2 sei
>STYA ZPPtr1 >STYA ZPPtr1
>LDYAI A2osX.SYSCALL >LDYAI A2osX.SYSCALL
>STYA ZPPtr2 >STYA ZPPtr2
>LDYAI A2osX.GP.SIZE^$FFFF >LDYAI A2osX.GP.S^$FFFF
>STYA ZPPtr3 >STYA ZPPtr3
jsr Kernel.Move jsr Kernel.Move
@ -32,7 +32,7 @@ Kernel.Init2 sei
>STYA ZPPtr1 >STYA ZPPtr1
>LDYAI $D000 >LDYAI $D000
>STYA ZPPtr2 >STYA ZPPtr2
>LDYAI A2osX.D2.SIZE^$FFFF >LDYAI A2osX.D2.S^$FFFF
>STYA ZPPtr3 >STYA ZPPtr3
jsr Kernel.Move jsr Kernel.Move
@ -50,7 +50,7 @@ Kernel.Init2 sei
>STYA ZPPtr1 >STYA ZPPtr1
>LDYAI $D000 >LDYAI $D000
>STYA ZPPtr2 >STYA ZPPtr2
>LDYAI A2osX.D1.SIZE^$FFFF >LDYAI A2osX.D1.S^$FFFF
>STYA ZPPtr3 >STYA ZPPtr3
jsr Kernel.Move jsr Kernel.Move
@ -68,7 +68,7 @@ Kernel.Init2 sei
>STYA ZPPtr1 >STYA ZPPtr1
>LDYAI $E000 >LDYAI $E000
>STYA ZPPtr2 >STYA ZPPtr2
>LDYAI A2osX.E0.SIZE^$FFFF >LDYAI A2osX.E0.S^$FFFF
>STYA ZPPtr3 >STYA ZPPtr3
jsr Kernel.Move jsr Kernel.Move

View File

@ -15,13 +15,13 @@ AUTO 6
.INB /A2OSX.BUILD/INC/MLI.ERR.I .INB /A2OSX.BUILD/INC/MLI.ERR.I
*-------------------------------------- *--------------------------------------
TmpPtr1 .EQ $0 for X.PRINTF.S TmpPtr1 .EQ $0 for X.PRINTF.S
ZPPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope ZPPtr1 .EQ ZPKERNEL
ZPPtr2 .EQ ZPKERNEL+2 (could be trashed by any JSR) ZPPtr2 .EQ ZPKERNEL+2
ZPPtr3 .EQ ZPKERNEL+4 ZPPtr3 .EQ ZPKERNEL+4
ZPPtr4 .EQ ZPKERNEL+6 ZPPtr4 .EQ ZPKERNEL+6
sei sei
ldx #$FF init 6502 stack to highest ldx #$FF
txs txs
sta SETALTZP sta SETALTZP
@ -41,16 +41,14 @@ ZPPtr4 .EQ ZPKERNEL+6
* Global Page * Global Page
A2osX.GP .EQ * A2osX.GP .PH $BD00
.PH $BD00
.INB /A2OSX.SRC/SYS/KERNEL.S.GP .INB /A2OSX.SRC/SYS/KERNEL.S.GP
.EP .EP
A2osX.GP.SIZE .EQ *-A2osX.GP A2osX.GP.E .EQ *
* LC AUX $D000 BANK1 API Calls $00-$3E * LC AUX $D000 BANK1 API Calls $00-$3E
A2osX.D1 .EQ * A2osX.D1 .PH $D000
.PH $D000
.DA #RRAMWRAMBNK1 .DA #RRAMWRAMBNK1
.INB /A2OSX.SRC/SYS/KERNEL.S.FIO .INB /A2OSX.SRC/SYS/KERNEL.S.FIO
.INB /A2OSX.SRC/SYS/KERNEL.S.DRV .INB /A2OSX.SRC/SYS/KERNEL.S.DRV
@ -62,12 +60,11 @@ A2osX.D1 .EQ *
.INB /A2OSX.SRC/SYS/KERNEL.S.PFT .INB /A2OSX.SRC/SYS/KERNEL.S.PFT
.INB /A2OSX.SRC/SYS/KERNEL.S.BIN .INB /A2OSX.SRC/SYS/KERNEL.S.BIN
.EP .EP
A2osX.D1.SIZE .EQ *-A2osX.D1 A2osX.D1.E .EQ *
* LC AUX $D000 BANK2 API Calls $40-$8E * LC AUX $D000 BANK2 API Calls $40-$8E
A2osX.D2 .EQ * A2osX.D2 .PH $D000
.PH $D000
.DA #RRAMWRAMBNK2 .DA #RRAMWRAMBNK2
.INB /A2OSX.SRC/SYS/KERNEL.S.CIO .INB /A2OSX.SRC/SYS/KERNEL.S.CIO
.INB /A2OSX.SRC/SYS/KERNEL.S.STR .INB /A2OSX.SRC/SYS/KERNEL.S.STR
@ -80,12 +77,11 @@ A2osX.D2 .EQ *
.INB /A2OSX.SRC/SYS/KERNEL.S.EVT .INB /A2OSX.SRC/SYS/KERNEL.S.EVT
.INB /A2OSX.SRC/SYS/KERNEL.S.TSK .INB /A2OSX.SRC/SYS/KERNEL.S.TSK
.EP .EP
A2osX.D2.SIZE .EQ *-A2osX.D2 A2osX.D2.E .EQ *
* LC AUX $E000 API Calls $80-$FE * LC AUX $E000 API Calls $80-$FE
A2osX.E0 .EQ * A2osX.E0 .PH $E000
.PH $E000
.INB /A2OSX.SRC/SYS/KERNEL.S.JMP .INB /A2OSX.SRC/SYS/KERNEL.S.JMP
.INB /A2OSX.SRC/SYS/KERNEL.S.DAT .INB /A2OSX.SRC/SYS/KERNEL.S.DAT
.INB /A2OSX.SRC/SYS/KERNEL.S.IRQ .INB /A2OSX.SRC/SYS/KERNEL.S.IRQ
@ -95,18 +91,22 @@ A2osX.E0 .EQ *
* Make sure KERNEL.S.D01 is the last one * Make sure KERNEL.S.D01 is the last one
.INB /A2OSX.SRC/SYS/KERNEL.S.D01 .INB /A2OSX.SRC/SYS/KERNEL.S.D01
.EP .EP
A2osX.E0.SIZE .EQ *-A2osX.E0 A2osX.E0.E .EQ *
* CONTROL SECTION : * CONTROL SECTION :
.LIST ON .LIST ON
.DO A2osX.GP.SIZE>$1E0 A2osX.GP.S .EQ A2osX.GP.E-A2osX.GP
* !!!!!!!!! ERROR:GP too big !!!!!!!!!! A2osX.D1.S .EQ A2osX.D1.E-A2osX.D1
A2osX.D2.S .EQ A2osX.D2.E-A2osX.D2
A2osX.E0.S .EQ A2osX.E0.E-A2osX.E0
.DO A2osX.GP.S>$1E0
* ERROR:GP too big
.FIN .FIN
.DO A2osX.D1.SIZE>$1000 .DO A2osX.D1.S>$1000
* !!!!!!!!! ERROR:BNK1 too big !!!!!!!! * ERROR:BNK1 too big
.FIN .FIN
.DO A2osX.D2.SIZE>$1000 .DO A2osX.D2.S>$1000
* !!!!!!!!! ERROR:BNK2 too big !!!!!!!! * ERROR:BNK2 too big
.FIN .FIN
.LIST OFF .LIST OFF
MAN MAN