A2osX/SYS/KERNEL.S.PS.txt
2017-10-27 16:56:46 +02:00

415 lines
7.3 KiB
Plaintext
Raw 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.

PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # ExecPSNewEnv.YA
* # ExecPS.YA (Blocking Parent PID)
* # CreatePSNewEnv.YA
* # CreatePS.YA (Non Blocking)
* ## In:
* Y,A = PTR To Cmd Line
* ## Out:
* A = Child PSID
*\--------------------------------------
K.ExecPSNewEnv.YA
ldx #S.PS.F.DUPENV+S.PS.F.HOLD
.HS 2C bit abs
K.ExecPS.YA
ldx #S.PS.F.HOLD
.HS 2C bit abs
K.CreatePSNewEnv.YA
ldx #S.PS.F.DUPENV
.HS 2C bit abs
K.CreatePS.YA
ldx #0
stx PS.Flags
>STYA PS.CL
jsr PS.CreateChild Child S.PS at ZPPtr3
bcs .9
sta .8+1
>LDYA PS.CL
jsr PS.CmdLine2Args Y,A = Args[0]
bcs .9
jsr PS.Init
bcc .8
pha save error code
lda .8+1
jsr CORE.PSFree.A
pla get back error code
sec
rts
.8 lda #$ff self modified
.9 rts
*--------------------------------------
PS.Flags .BS 1
PS.CL .BS 2
*--------------------------------------
* PS.CreateChild
* in :
* out :
* A = PSID
* we cannot use ZPPtrs1 & 2
* because of calling K.NewStr.YA & S.DupEnv.A
*--------------------------------------
PS.CreateChild ldx #0
.1 cpx CORE.PSCount
beq .2
lda PS.Table.PID,x
beq .31 Found an empty slot
inx
bra .1
.2 cpx #K.PS.MAX
bne .3
lda #K.E.OOH
sec
rts
.99 plx
rts
.3 inc CORE.PSCount
.31 phx save PS inex
.4 inc CORE.LastPSID Get a PSID not alredy running
beq .4 not = 0
lda CORE.LastPSID
jsr CORE.GetPSByID.A
bcc .4
plx
lda CORE.LastPSID
sta PS.Table.PID,x
phx
>LDYAI S.PS
jsr K.GetMem0.YA Blank Everything in this S.PS
bcs .99
>STYA ZPPtr3
txa
plx
sta PS.Table.hMem,x
jsr PS.SetMemOwner Set Ownership
ldy #S.PS.PID
lda CORE.LastPSID
sta (ZPPtr3),y
lda #S.PS.F.DUPENV
bit PS.Flags need to create ENV & Prefix ?
beq .6 no...
sta (ZPPtr3) Mark this PS with DUPENV flag
ldy #S.PS.hPREFIX copy hPREFIX...
lda (pPs),y
jsr K.GetMemPtr.A
jsr K.NewStr.YA
bcs .9
jsr PS.SetMemOwner Set Ownership
txa
ldy #S.PS.hPREFIX
sta (ZPPtr3),y
ldy #S.PS.hENV ...and hENV from parent PS
lda (pPs),y
jsr PS.DupEnv.A
bcs .9
ldy #S.PS.hENV
sta (ZPPtr3),y
bra .8
.6 ldy #S.PS.hPREFIX reuse same hPREFIX...
lda (pPs),y
sta (ZPPtr3),y
ldy #S.PS.hENV ...and hENV from parent PS
lda (pPs),y
sta (ZPPtr3),y
.8 ldy #S.PS.hStdIn
.81 lda (pPs),y
sta (ZPPtr3),y
iny
cpy #S.PS.hStdErr+1
bne .81
ldy #S.PS.PID
lda (pPs),y
ldy #S.PS.PPID
sta (ZPPtr3),y
lda #S.PS.F.HOLD
bit PS.Flags
beq .82
ora (pPs)
sta (pPs) HOLD parent PS if ExecPS
.82 lda #S.PS.F.INIT
ora (ZPPtr3)
sta (ZPPtr3) Make this PS Init....
ldy #S.PS.CPID
lda CORE.LastPSID
sta (pPs),y
clc Exit with A=PSID
.9 rts
*--------------------------------------
PS.CmdLine2Args >STYA ZPPtr1
ldy #0
.1 lda (ZPPtr1),y compute strlen in Y,X
beq .2
cmp #'"' skip " in computation....
beq .1
iny
bne .1 max 255
.2 tya +2 for ending 0 for last string, and endig 0 for array
clc
adc #2
tay
lda #0
bcc .3
inc
.3 jsr K.GetMem.YA
bcs .9
phy save PTR.LO
pha save PTR.HI
>STYA ZPPtr2
txa
ldy #S.PS.hARGS
sta (ZPPtr3),y
jsr PS.SetMemOwner Set Ownership
stz PS.bInQuote
ldy #$ff
ldx #0 Arg Count
.4 iny
lda (ZPPtr1),y
beq .7
cmp #'"' found a quote ?
bne .5
lda PS.bInQuote
eor #$ff
sta PS.bInQuote
bra .4
.5 cmp #' '
bne .6
bit PS.bInQuote
bmi .6
inx Found one arg !!!
lda #0 set this token End
.6 sta (ZPPtr2)
inc ZPPtr2
bne .4
inc ZPPtr2+1
bra .4
.7 sta (ZPPtr2) set Arg Ending 0
inc ZPPtr2
bne .8
inc ZPPtr2+1
.8 sta (ZPPtr2) set Array Ending 0
txa
ldy #S.PS.ARGC
sta (ZPPtr3),y
pla get back PTR.HI
ply get back PTR.LO
clc
.9 rts
PS.bInQuote .BS 1
*--------------------------------------
PS.Init jsr BIN.Load.YA Y,A=filename full path
bcs .9
>STYA ZPPtr4 save PTR to Code Segment
phy
ldy #S.PS.ZP+1
sta (ZPPtr3),y save pCode HI...
dey
pla
sta (ZPPtr3),y save pCode LO...
txa
ldy #S.PS.hCS
sta (ZPPtr3),y save CS hMem in S.PS
jsr K.GetMemByID.A
jsr PS.SetMemOwner Set Ownership
ldy #H.BIN.EXE.DS.SIZE+1
lda (ZPPtr4),y Load DS.SIZE HI
tax
dey
ora (ZPPtr4),y
beq .2 DS.SIZE=0...
lda (ZPPtr4),y
tay
txa Y,A = DS.SIZE
jsr K.GetMem0.YA
bcs .9
phy
ldy #S.PS.ZP+3
sta (ZPPtr3),y save pData HI...
dey
pla
sta (ZPPtr3),y save pData LO...
txa
ldy #S.PS.hDS
sta (ZPPtr3),y save DS hMem in S.PS
jsr PS.SetMemOwner Set Ownership
.2 ldy #H.BIN.EXE.SS.SIZE
lda (ZPPtr4),y Load SS.SIZE
ldy #S.PS.ZP+4
sta (ZPPtr3),y save pStack LO...
tay
bne .3 SS.SIZE.LO=0, set as default $100
lda #1 SS.SIZE.HI
.HS 2C bit abs
.3 lda #0
>PUSHYA
>PUSHBI S.MEM.F.ALIGN
jsr K.GetMem
bcs .9
ldy #S.PS.ZP+5
sta (ZPPtr3),y save pStack HI...(LO alredy set to Stack TOP)
txa
ldy #S.PS.hSS
sta (ZPPtr3),y save SS hMem in S.PS
jsr PS.SetMemOwner Set Ownership
clc
.9 rts
*--------------------------------------
* PS.DupEnv.A
* In:
* A = ENV hMem To Duplicate
* Out:
* A = hMem to new ENV
*--------------------------------------
PS.DupEnv.A jsr K.GetMemPtr.A
>STYA ZPPtr1
>LDYAI K.ENV.SIZE
jsr K.GetMem.YA
bcs .9
>STYA ZPPtr2
jsr PS.SetMemOwner Set Ownership
ldy #0
.1 lda (ZPPtr1),y
sta (ZPPtr2),y
beq .8
.2 iny
bne .3
inc ZPPtr1+1
inc ZPPtr2+1
.3 lda (ZPPtr1),y
sta (ZPPtr2),y
bne .2
iny
bne .1
inc ZPPtr1+1
inc ZPPtr2+1
bra .1
.8 txa hMem
clc
.9 rts
*--------------------------------------
PS.SetMemOwner lda CORE.LastPSID
ldy #S.MEM.OWNERPID
sta (ZPMEMMGR),y
rts
*--------------------------------------
K.GetPSStatus.A jsr CORE.GetPSByID.A
bcs .9
>STYA ZPPtr1
lda (ZPPtr1)
.9 rts
*--------------------------------------
K.GetPSList.YA >STYA ZPPtr1
ldx #0
ldy #0
.1 lda PS.Table.PID,x
beq .2
lda PS.Table.hMem,x
iny
sta (ZPPtr1),y
.2 inx
cpx CORE.PSCount
bne .1
.9 tya
sta (ZPPtr1)
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.PS
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM