mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-20 03:31:42 +00:00
411 lines
7.6 KiB
Plaintext
411 lines
7.6 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.SRC
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
* S.SelectProcessA
|
||
* In : A=PSID
|
||
*--------------------------------------
|
||
S.SelectProcessA
|
||
tay
|
||
bne S.SelectProcessN
|
||
S.SelectProcess0
|
||
>LDYAI TskMgr.Table Make PS #0 as current process
|
||
>STYA pPs
|
||
bra S.SelectProcessDev
|
||
S.SelectProcessN
|
||
jsr S.GetPSByIDA
|
||
bcs *
|
||
>STYA pPs
|
||
|
||
S.SelectProcess ldy #S.PS.hCS
|
||
lda (pPs),y
|
||
jsr S.GetMemPtrA
|
||
>STYA pCode
|
||
|
||
ldy #S.PS.hDS
|
||
lda (pPs),y
|
||
beq S.SelectProcessDev
|
||
|
||
jsr S.GetMemPtrA
|
||
>STYA pData
|
||
|
||
S.SelectProcessDev
|
||
ldy #S.PS.hOUTDEV
|
||
lda (pPs),y
|
||
beq .8
|
||
|
||
jsr S.GetDevByIDA
|
||
>STYA pDev
|
||
|
||
.8 clc
|
||
rts
|
||
*--------------------------------------
|
||
* S.GetPSByIDA
|
||
* In :
|
||
* A = PID
|
||
* Out :
|
||
* Y,A = PTR to TSKSLOT
|
||
*--------------------------------------
|
||
S.GetPSByIDA sta S.GetPSByIDA.PS
|
||
|
||
>LDYAI TskMgr.Table
|
||
>STYA ZPQuickPtr1
|
||
|
||
lda S.GetPSByIDA.PS
|
||
beq .8
|
||
|
||
ldx #0
|
||
|
||
.1 inx
|
||
lda ZPQuickPtr1
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta ZPQuickPtr1
|
||
bcc .2
|
||
inc ZPQuickPtr1+1
|
||
|
||
.2 lda (ZPQuickPtr1)
|
||
bpl .3
|
||
|
||
ldy #S.PS.ID
|
||
lda (ZPQuickPtr1),y
|
||
cmp S.GetPSByIDA.PS
|
||
beq .8
|
||
|
||
.3 cpx TSKMGR.SIZE
|
||
bne .1
|
||
|
||
.9 lda #TSKMGR.ERRNSP
|
||
sec
|
||
rts
|
||
|
||
.8 >LDYA ZPQuickPtr1
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
S.GetPSByIDA.PS .BS 1
|
||
*--------------------------------------
|
||
S.Sleep pla get PC LO
|
||
sec
|
||
sbc pCode
|
||
ldy #S.PS.PC
|
||
sta (pPs),y
|
||
|
||
pla get PC HI
|
||
sbc pCode+1
|
||
iny
|
||
sta (pPs),y
|
||
lda (pPs)
|
||
ora #S.PS.F.SLEEP
|
||
sta (pPs)
|
||
clc No error,
|
||
rts back to Kernel
|
||
*--------------------------------------
|
||
* S.ExecProcessNewEnvYA
|
||
* S.ExecProcessYA (Blocking Parent PID)
|
||
* S.CreateProcessNewEnvYA
|
||
* S.CreateProcessYA (Non Blocking)
|
||
* in :
|
||
* Y,A = PTR To Cmd Line
|
||
* out :
|
||
* A = Child PSID
|
||
*--------------------------------------
|
||
S.ExecProcessNewEnvYA
|
||
ldx #S.PS.F.ENV+S.PS.F.HOLD
|
||
.HS 2C bit abs
|
||
S.ExecProcessYA ldx #S.PS.F.HOLD
|
||
.HS 2C bit abs
|
||
S.CreateProcessNewEnvYA
|
||
ldx #S.PS.F.ENV
|
||
.HS 2C bit abs
|
||
S.CreateProcessYA
|
||
ldx #0
|
||
stx S.CreateProcess.Flags
|
||
|
||
jsr S.ExpandPStrYA
|
||
bcs .99
|
||
|
||
stx S.CreateProcess.hCmdLine
|
||
>STYA S.CreateProcess.CmdLine
|
||
|
||
jsr S.CreateProcess.Child
|
||
bcs .98
|
||
|
||
sta S.CreateProcess.CPSID
|
||
|
||
jsr S.CreateProcess.Init
|
||
bcs .97
|
||
|
||
lda S.CreateProcess.CPSID
|
||
clc
|
||
rts
|
||
|
||
.97 pha save error code
|
||
lda S.CreateProcess.CPSID
|
||
jsr S.FreeProcessA
|
||
pla get back error code
|
||
|
||
.98 pha
|
||
lda S.CreateProcess.hCmdLine
|
||
jsr S.FreeMemA
|
||
pla
|
||
|
||
.99 sec
|
||
rts
|
||
*--------------------------------------
|
||
S.CreateProcess.Flags .BS 1
|
||
S.CreateProcess.hCmdLine .BS 1
|
||
S.CreateProcess.CmdLine .BS 2
|
||
S.CreateProcess.CPSID .BS 1
|
||
*--------------------------------------
|
||
* S.CreateProcess.Child
|
||
* in :
|
||
* out :
|
||
* A = PSID
|
||
* we cannot use ZPQuickPtrs1 & 2
|
||
* because of calling S.NewPStrYA & S.DupEnvA
|
||
*--------------------------------------
|
||
S.CreateProcess.Child
|
||
>LDYAI TskMgr.Table+S.PS.SIZE
|
||
>STYA ZPQuickPtr3
|
||
|
||
ldx #0
|
||
|
||
.1 inx
|
||
cpx TSKMGR.SIZE
|
||
beq .2
|
||
|
||
lda (ZPQuickPtr3) Found an empty slot
|
||
bpl .3
|
||
lda ZPQuickPtr3
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta ZPQuickPtr3
|
||
bcc .1
|
||
inc ZPQuickPtr3+1
|
||
|
||
bra .1
|
||
|
||
.2 cpx #K.PS.MAX
|
||
bne .3
|
||
|
||
lda #TSKMGR.ERROOH
|
||
sec
|
||
rts
|
||
|
||
.3 inc TSKMGR.SIZE
|
||
|
||
.4 inc TSKMGR.LASTID Get a PSID not alredy running
|
||
beq .4 not = 0
|
||
lda TSKMGR.LASTID
|
||
jsr S.GetPSByIDA
|
||
bcc .4
|
||
|
||
ldy #S.PS.ID
|
||
lda TSKMGR.LASTID
|
||
sta (ZPQuickPtr3),y
|
||
|
||
lda #0
|
||
ldy #S.PS.hCS
|
||
|
||
.5 sta (ZPQuickPtr3),y Blank Everything in this S.PS
|
||
iny
|
||
cpy #S.PS.SIZE
|
||
bne .5
|
||
|
||
lda #S.PS.F.ENV
|
||
bit S.CreateProcess.Flags need to create ENV & Prefix ?
|
||
beq .6 no...
|
||
|
||
sta (ZPQuickPtr3) Mark this PS with ENV flag
|
||
|
||
ldy #S.PS.hPREFIX copy hPREFIX...
|
||
lda (pPs),y
|
||
jsr S.GetMemPtrA
|
||
jsr S.NewPStrYA
|
||
bcs .9
|
||
|
||
txa
|
||
ldy #S.PS.hPREFIX
|
||
sta (ZPQuickPtr3),y
|
||
|
||
ldy #S.PS.hENV ...and hENV from parent PS
|
||
lda (pPs),y
|
||
jsr S.DupEnvA
|
||
bcs .9
|
||
|
||
ldy #S.PS.hENV
|
||
sta (ZPQuickPtr3),y
|
||
bra .8
|
||
|
||
.6 ldy #S.PS.hPREFIX reuse same hPREFIX...
|
||
lda (pPs),y
|
||
sta (ZPQuickPtr3),y
|
||
|
||
ldy #S.PS.hENV ...and hENV from parent PS
|
||
lda (pPs),y
|
||
sta (ZPQuickPtr3),y
|
||
|
||
.8 ldy #S.PS.hINDEV
|
||
|
||
.81 lda (pPs),y
|
||
sta (ZPQuickPtr3),y
|
||
iny
|
||
cpy #S.PS.hERRDEV+1
|
||
bne .81
|
||
|
||
ldy #S.PS.ID
|
||
lda (pPs),y
|
||
|
||
ldy #S.PS.PID
|
||
sta (ZPQuickPtr3),y
|
||
|
||
ldy #S.PS.CID
|
||
lda TSKMGR.LASTID
|
||
sta (pPs),y
|
||
|
||
lda #S.PS.F.HOLD
|
||
bit S.CreateProcess.Flags
|
||
beq .82
|
||
|
||
ora (pPs)
|
||
sta (pPs) HOLD parent PS if ExecProcess
|
||
|
||
.82 lda #S.PS.F.INUSE+S.PS.F.INIT
|
||
ora (ZPQuickPtr3)
|
||
sta (ZPQuickPtr3) Make this PS Init....
|
||
|
||
lda TSKMGR.LASTID
|
||
clc Exit with A=PSID
|
||
.9 rts
|
||
*--------------------------------------
|
||
S.CreateProcess.Init
|
||
>LDYA S.CreateProcess.CmdLine
|
||
jsr S.PStr2StrArrayYA
|
||
bcs .9
|
||
|
||
phy save PTR to StrArray...
|
||
pha
|
||
|
||
txa
|
||
ldy #S.PS.hCMDLINE
|
||
sta (ZPQuickPtr3),y
|
||
|
||
pla Restore PTR...
|
||
ply
|
||
|
||
jsr S.LoadBinYA A = BinPath hMem
|
||
bcs .9
|
||
|
||
>STYA ZPQuickPtr4 save PTR to Code Segment
|
||
txa
|
||
ldy #S.PS.hCS
|
||
sta (ZPQuickPtr3),y save CS hMem in TSKSLOT
|
||
|
||
ldy #H.BIN.BIN.DS.SIZE+1
|
||
lda (ZPQuickPtr4),y Load DS.SIZE HI
|
||
tax
|
||
dey
|
||
ora (ZPQuickPtr4),y
|
||
|
||
beq .2 DS.SIZE=0...
|
||
|
||
lda (ZPQuickPtr4),y
|
||
>PUSHAX Push DS.SIZE
|
||
>PUSHBI S.MEM.F.INIT0 Clear DS
|
||
jsr S.GetMem
|
||
bcs .9
|
||
|
||
txa
|
||
ldy #S.PS.hDS
|
||
sta (ZPQuickPtr3),y save DS hMem in TSKSLOT
|
||
|
||
.2
|
||
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
* S.FreeProcessA
|
||
* In : A = PID to free
|
||
*--------------------------------------
|
||
S.FreeProcessA jsr S.GetPSByIDA
|
||
bcs *
|
||
>STYA ZPQuickPtr1
|
||
|
||
ldy #S.PS.hCMDLINE
|
||
lda (ZPQuickPtr1),y
|
||
beq .2
|
||
|
||
jsr S.FreeMemA
|
||
|
||
lda (ZPQuickPtr1) get S.PS.F
|
||
and #S.PS.F.ENV do we have to discard duplicated env & prefix ?
|
||
beq .4
|
||
|
||
.2 ldy #S.PS.hENV
|
||
lda (ZPQuickPtr1),y
|
||
beq .3
|
||
|
||
jsr S.FreeMemA
|
||
|
||
.3 ldy #S.PS.hPREFIX
|
||
lda (ZPQuickPtr1),y
|
||
beq .4
|
||
|
||
jsr S.FreeMemA
|
||
|
||
.4 ldy #S.PS.hDS
|
||
lda (ZPQuickPtr1),y
|
||
beq .5
|
||
|
||
jsr S.FreeMemA
|
||
|
||
.5 ldy #S.PS.hCS
|
||
lda (ZPQuickPtr1),y
|
||
beq .8
|
||
|
||
jsr S.FreeMemA
|
||
|
||
.8 lda #0
|
||
sta (ZPQuickPtr1) Mark TSKSLOT as free
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
* S.DupEnvA
|
||
* In:
|
||
* A = ENV hMem To Duplicate
|
||
* Out:
|
||
* A = hMem to new ENV
|
||
*--------------------------------------
|
||
S.DupEnvA jsr S.GetMemPtrA
|
||
>STYA ZPQuickPtr1
|
||
>PUSHWI K.ENV.SIZE
|
||
>PUSHBI 0
|
||
jsr S.GetMem
|
||
bcs .9
|
||
>STYA ZPQuickPtr2
|
||
|
||
ldy #0
|
||
|
||
.1 lda (ZPQuickPtr1),y
|
||
sta (ZPQuickPtr2),y
|
||
beq .8
|
||
|
||
iny
|
||
bne .1
|
||
inc ZPQuickPtr1+1
|
||
inc ZPQuickPtr2+1
|
||
bra .1
|
||
|
||
.8 txa
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE SYS/KERNEL.S.PS
|
||
LOAD SYS/KERNEL.S
|
||
ASM
|