mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-25 20:33:13 +00:00
545 lines
11 KiB
Plaintext
545 lines
11 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.BUILD
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
.OP 65C02
|
||
*--------------------------------------
|
||
* S.TskMgrInit
|
||
*--------------------------------------
|
||
S.TskMgrInit stz TSKMGR.LASTID
|
||
|
||
>LDYAI TSKMGR.TABLE
|
||
>STYA TSKMGR.TSKPTR
|
||
|
||
ldx #K.PS.MAX
|
||
|
||
.1 lda #0
|
||
ldy #S.PS.SIZE-1
|
||
|
||
.2 sta (TSKMGR.TSKPTR),y
|
||
dey
|
||
bpl .2
|
||
|
||
lda TSKMGR.TSKPTR
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta TSKMGR.TSKPTR
|
||
bcc .3
|
||
inc TSKMGR.TSKPTR+1
|
||
.3 dex
|
||
bne .1
|
||
|
||
>LDYAI TSKMGR.TABLE Make PS #0 as current process
|
||
>STYA TSKMGR.TSKPTR
|
||
|
||
jsr S.CreateEnv
|
||
bcs .9
|
||
ldy #S.PS.hENV
|
||
sta TSKMGR.TABLE,y
|
||
|
||
>LDYAI TmpBuffer256
|
||
jsr S.MLIGetPrefix
|
||
bcs .9
|
||
>PUSHWI TmpBuffer256
|
||
jsr S.NewPStr
|
||
bcs .9
|
||
ldy #S.PS.hPREFIX
|
||
sta TSKMGR.TABLE,y
|
||
>PUSHWI TmpBuffer256 push ENV value
|
||
>PUSHWI ENV.A2osX push ENV name
|
||
ldy #S.PS.hENV
|
||
lda TSKMGR.TABLE,y
|
||
>PUSHA
|
||
jsr S.SetEnvVarP
|
||
rts
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
* S.TskMgrRun
|
||
*--------------------------------------
|
||
S.TskMgrRun >LDYAI TSKMGR.TABLE+S.PS.SIZE
|
||
>STYA TSKMGR.TSKPTR
|
||
|
||
lda #K.PS.MAX-1 Skip PS #0
|
||
sta TSKMGR.COUNT
|
||
|
||
.1 lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #S.PS.F.INUSE In use ?
|
||
beq .5
|
||
|
||
lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #S.PS.F.HOLD Waiting for Another Task to Terminate?
|
||
beq .3
|
||
|
||
ldy #S.PS.CID
|
||
lda (TSKMGR.TSKPTR),y
|
||
jsr S.IsPSRunningA
|
||
bcc .5 yes, running....
|
||
lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #$FF^S.PS.F.HOLD unmark as HOLD
|
||
sta (TSKMGR.TSKPTR)
|
||
|
||
.3 ldy #S.PS.hCS
|
||
lda (TSKMGR.TSKPTR),y
|
||
jsr S.GetMemPtrA Y,A = CS
|
||
pha
|
||
tya get CS LO
|
||
ldy #S.PS.PC
|
||
clc
|
||
adc (TSKMGR.TSKPTR),y
|
||
sta Kernel.JMP
|
||
iny
|
||
pla
|
||
adc (TSKMGR.TSKPTR),y
|
||
sta Kernel.JMP+1
|
||
|
||
lda #0 Don't forget to reset S.PC
|
||
sta (TSKMGR.TSKPTR),y
|
||
dey
|
||
sta (TSKMGR.TSKPTR),y
|
||
|
||
>LDYA TSKMGR.TSKPTR
|
||
ldx #TSKMGR.RUN
|
||
jsr Kernel.BINCALL Call RUN function
|
||
bcc .5 RUN said CS=QUIT?
|
||
|
||
ldy #S.PS.hCS
|
||
lda (TSKMGR.TSKPTR),y
|
||
jsr S.GetMemPtrA Y,A = CS
|
||
>STYA Kernel.JMP
|
||
|
||
>LDYA TSKMGR.TSKPTR
|
||
ldx #TSKMGR.QUIT yes, quit this process
|
||
|
||
jsr Kernel.BINCALL Call QUIT function
|
||
|
||
ldy #S.PS.ID
|
||
lda (TSKMGR.TSKPTR),y
|
||
jsr S.FreeProcessA
|
||
bcs .99
|
||
|
||
.5 lda TSKMGR.TSKPTR
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta TSKMGR.TSKPTR
|
||
bcc .6
|
||
inc TSKMGR.TSKPTR+1
|
||
|
||
.6 dec TSKMGR.COUNT
|
||
bne .1
|
||
clc
|
||
rts
|
||
.99 bra *
|
||
*--------------------------------------
|
||
* S.DispatchEvent
|
||
* IN:
|
||
* PULLW = Event
|
||
* OUT:
|
||
* CS: Not Dispatched
|
||
* CC: Event Cleared
|
||
*--------------------------------------
|
||
S.DispatchEvent >LDYAI TSKMGR.TABLE+S.PS.SIZE
|
||
>STYA TSKMGR.TSKPTR
|
||
|
||
lda #K.PS.MAX-1
|
||
sta TSKMGR.COUNT
|
||
|
||
.1 lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #S.PS.F.INUSE In use ?
|
||
beq .3
|
||
|
||
lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #S.PS.F.HOLD Waiting for Another Task to Terminate?
|
||
bne .3
|
||
|
||
lda (TSKMGR.TSKPTR) get S.PS.F
|
||
and #S.PS.F.EVENT Accept Events ?
|
||
beq .3
|
||
|
||
ldy #S.PS.hCS
|
||
lda (TSKMGR.TSKPTR),y
|
||
jsr S.GetMemPtrA
|
||
>STYA Kernel.JMP
|
||
|
||
>PUSHW EVTMGR.EVTPTR
|
||
>LDYA TSKMGR.TSKPTR
|
||
ldx #TSKMGR.DOEVENT
|
||
jsr Kernel.BINCALL Call DOEVENT function
|
||
bcc .8
|
||
|
||
.3 lda TSKMGR.TSKPTR
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta TSKMGR.TSKPTR
|
||
bcc .4
|
||
inc TSKMGR.TSKPTR+1
|
||
|
||
.4 dec TSKMGR.COUNT
|
||
bne .1
|
||
sec
|
||
.8 rts
|
||
*--------------------------------------
|
||
* S.TskMgrQuit
|
||
*--------------------------------------
|
||
S.TskMgrQuit clc
|
||
rts
|
||
*--------------------------------------
|
||
* PUBLIC
|
||
*--------------------------------------
|
||
* S.ExecProcessA (Blocking Parent PID)
|
||
* in :
|
||
* A = hMem To Full Cmd Line
|
||
* out :
|
||
* A = Child PSID
|
||
*--------------------------------------
|
||
S.ExecProcessA jsr S.CreateProcessA
|
||
bcs .9 terminated, do not set PID as HOLD
|
||
ldy #S.PS.CID
|
||
sta (TSKMGR.TSKPTR),y
|
||
pha Save Child PID
|
||
lda (TSKMGR.TSKPTR)
|
||
ora #S.PS.F.HOLD
|
||
sta (TSKMGR.TSKPTR)
|
||
pla Get Back PID
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
* S.CreateProcessA (Non Blocking)
|
||
* in :
|
||
* A = hMem To Full Cmd Line
|
||
* out :
|
||
* A = Child PSID
|
||
*--------------------------------------
|
||
S.CreateProcessA
|
||
pha save CMD line
|
||
>LDYAI MSG.NEWPS
|
||
jsr S.SysScrPPSTR
|
||
|
||
ldy #S.PS.ID
|
||
lda (TSKMGR.TSKPTR),y
|
||
|
||
jsr S.CreateChildProcessA
|
||
|
||
bcs .99
|
||
>STYA TSKMGR.pNewPS
|
||
|
||
pla Get Back CMD Line
|
||
jsr S.InitProcessA
|
||
bcs .97 Init Failed or exit?
|
||
ldy #S.PS.ID
|
||
lda (TSKMGR.pNewPS),y
|
||
clc
|
||
rts
|
||
|
||
.97 pha save error code
|
||
tay error code =0 ?
|
||
bne .98 no, init failed
|
||
>LDYA TSKMGR.pNewPS
|
||
ldx #TSKMGR.QUIT yes, simply call QUIT function
|
||
jsr Kernel.BINCALL Call QUIT function
|
||
|
||
.98 ldy #S.PS.ID
|
||
lda (TSKMGR.pNewPS),y
|
||
jsr S.FreeProcessA
|
||
bra .90
|
||
|
||
.99 plx Discard CMD Line
|
||
pha save error code
|
||
|
||
.90 pla get back error code
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* S.GetPSByIDA
|
||
* In :
|
||
* A = PID
|
||
* Out :
|
||
* Y,A = PTR to TSKSLOT
|
||
*--------------------------------------
|
||
S.GetPSByIDA tax
|
||
bne .10
|
||
>LDYAI TSKMGR.TABLE
|
||
clc
|
||
rts
|
||
|
||
.10 sta ZPQuickPtr1 Store requested PID
|
||
lda #K.PS.MAX
|
||
sta ZPQuickPtr1+1
|
||
|
||
>LDYAI TSKMGR.TABLE+S.PS.SIZE
|
||
>STYA ZPQuickPtr2
|
||
|
||
.1 lda (ZPQuickPtr2)
|
||
bpl .2
|
||
ldy #S.PS.ID
|
||
lda (ZPQuickPtr2),y
|
||
cmp ZPQuickPtr1
|
||
beq .8
|
||
.2 dec ZPQuickPtr1+1
|
||
beq .9
|
||
lda ZPQuickPtr2
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta ZPQuickPtr2
|
||
bcc .1
|
||
inc ZPQuickPtr2+1
|
||
bra .1
|
||
.8 >LDYA ZPQuickPtr2
|
||
clc
|
||
rts
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
* PRIVATE
|
||
*--------------------------------------
|
||
* S.CreateChildProcessA
|
||
* in :
|
||
* A = Parent PSID
|
||
* out :
|
||
* X = PSID
|
||
* Y,A = PTR to S.PS
|
||
* we cannot use ZPQuickPtrs
|
||
* because of calling S.PStrCpyA & S.DupEnvA
|
||
*--------------------------------------
|
||
S.CreateChildProcessA
|
||
jsr S.GetPSByIDA
|
||
bcs .9
|
||
|
||
>STYA R.AX
|
||
>LDYAI TSKMGR.TABLE+S.PS.SIZE
|
||
>STYA R.BX
|
||
|
||
ldx #K.PS.MAX
|
||
.1 lda (R.BX)
|
||
bpl .3
|
||
lda R.BL
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta R.BL
|
||
bcc .2
|
||
inc R.BH
|
||
.2 dex
|
||
bne .1
|
||
lda #TSKMGR.ERROOS
|
||
sec
|
||
rts
|
||
|
||
.9 lda #TSKMGR.ERRNSP
|
||
sec
|
||
rts
|
||
|
||
.3 lda #S.PS.F.INUSE
|
||
sta (R.BX)
|
||
ldy #S.PS.ID
|
||
lda (R.AX),y
|
||
ldy #S.PS.PID
|
||
sta (R.BX),y
|
||
|
||
inc TSKMGR.LASTID
|
||
bne .4
|
||
inc TSKMGR.LASTID Ensure PSID not 0
|
||
.4 lda TSKMGR.LASTID
|
||
|
||
ldy #S.PS.ID
|
||
sta (R.BX),y
|
||
lda #0
|
||
ldy #S.PS.hCS
|
||
.5 sta (R.BX),y Blank Everything in this S.PS
|
||
iny
|
||
cpy #S.PS.SIZE
|
||
bne .5
|
||
|
||
ldy #S.PS.hPREFIX copy hPREFIX...
|
||
lda (R.AX),y
|
||
jsr S.PStrCpyA
|
||
bcs .99
|
||
|
||
ldy #S.PS.hPREFIX
|
||
sta (R.BX),y
|
||
ldy #S.PS.hENV ...and hENV from parent PS
|
||
lda (R.AX),y
|
||
jsr S.DupEnvA
|
||
bcs .99
|
||
ldy #S.PS.hENV
|
||
sta (R.BX),y
|
||
|
||
ldy #S.PS.hINDEV
|
||
lda (R.AX),y
|
||
sta (R.BX),y
|
||
ldy #S.PS.hOUTDEV
|
||
lda (R.AX),y
|
||
sta (R.BX),y
|
||
ldy #S.PS.hERRDEV
|
||
lda (R.AX),y
|
||
sta (R.BX),y
|
||
|
||
ldy #S.PS.ID
|
||
lda (R.BX),y
|
||
tax Exit with X=PSID
|
||
>LDYA R.BX And Y,A=S.PS
|
||
clc
|
||
rts
|
||
.99 sec
|
||
rts
|
||
*--------------------------------------
|
||
* S.InitProcessA
|
||
* In :
|
||
* A = hMem To Full Cmd Line
|
||
*--------------------------------------
|
||
* LS(2)
|
||
* 0 : hMem to ENVPATH value
|
||
* 1 : hMem to FULLPATH value
|
||
*--------------------------------------
|
||
S.InitProcessA >ADDLOCAL 2
|
||
>PUSHA Push Cmd Line
|
||
>PUSHBI $20 Push SEP=' '
|
||
>PUSHBI 0 Push 0 for getting CMD And ARGS
|
||
jsr S.PStrGetTkn
|
||
bcs .99 OOM error
|
||
ldy #S.PS.hCMD
|
||
sta (TSKMGR.pNewPS),y
|
||
>PUSHA push CMD for S.FileSearch
|
||
txa
|
||
ldy #S.PS.hARGS
|
||
sta (TSKMGR.pNewPS),y set ARGS hMem (0 if none)
|
||
>PUSHWI ENV.PATH push ENVNAME=PATH
|
||
ldy #S.PS.hENV
|
||
lda (TSKMGR.pNewPS),y
|
||
>PUSHA
|
||
jsr S.GetEnvVarP get value for ENV=PATH
|
||
bcs .99
|
||
>STAL 0 save VALUE hMem for discard
|
||
>PUSHA A=PStr to ENV Value
|
||
jsr S.FileSearch find File in %PATH%
|
||
bcs .98
|
||
>STAL 1 save FULLPATH hMem for discard
|
||
pha
|
||
jsr S.SysScrPPSTRA
|
||
pla
|
||
jsr S.LoadBinA A = BinPath hMem
|
||
bcs .97
|
||
>STYA Kernel.JMP save PTR to Code Segment
|
||
txa
|
||
ldy #S.PS.hCS
|
||
sta (TSKMGR.pNewPS),y save CS hMem in TSKSLOT
|
||
>LDYA TSKMGR.pNewPS
|
||
ldx #TSKMGR.INIT
|
||
jsr Kernel.BINCALL Call INIT function
|
||
bcs .97
|
||
jsr .97
|
||
clc
|
||
rts
|
||
.97 pha save ERR
|
||
>LDAL 1
|
||
jsr S.FreeMemA
|
||
pla
|
||
.98 pha save ERR
|
||
>LDAL 0
|
||
jsr S.FreeMemA
|
||
pla
|
||
.99 >REMLOCAL 2
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* S.QuitProcessA
|
||
* In : A = PID to Quit (call TSKMGR.QUIT)
|
||
*--------------------------------------
|
||
S.QuitProcessA jsr S.GetPSByIDA
|
||
bcs .9
|
||
>STYA ZPQuickPtr1
|
||
ldy #S.PS.hCS
|
||
lda (ZPQuickPtr1),y
|
||
jsr S.GetMemPtrA
|
||
>STYA Kernel.JMP
|
||
>LDYA ZPQuickPtr1
|
||
ldx #TSKMGR.QUIT
|
||
jsr Kernel.BINCALL Call QUIT function
|
||
clc
|
||
rts
|
||
.9 bra *
|
||
*--------------------------------------
|
||
* S.FreeProcessA
|
||
* In : A = PID to free
|
||
*--------------------------------------
|
||
S.FreeProcessA jsr S.GetPSByIDA
|
||
bcs .9
|
||
>STYA ZPQuickPtr1
|
||
ldy #S.PS.hARGS
|
||
lda (ZPQuickPtr1),y
|
||
beq .1
|
||
jsr S.FreeMemA
|
||
.1 ldy #S.PS.hCMD
|
||
lda (ZPQuickPtr1),y
|
||
beq .2
|
||
jsr S.FreeMemA
|
||
.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
|
||
.9 bra *
|
||
*--------------------------------------
|
||
* S.IsPSRunningA
|
||
* In :
|
||
* A = PID
|
||
* Out :
|
||
* CC = Running
|
||
* CS = no PS
|
||
*--------------------------------------
|
||
S.IsPSRunningA pha save PID
|
||
ldx #K.PS.MAX
|
||
>LDYAI TSKMGR.TABLE+S.PS.SIZE
|
||
>STYA ZPQuickPtr1
|
||
|
||
.1 lda (ZPQuickPtr1)
|
||
bpl .2
|
||
ldy #S.PS.ID
|
||
pla
|
||
pha
|
||
cmp (ZPQuickPtr1),y
|
||
beq .8
|
||
|
||
lda ZPQuickPtr1
|
||
clc
|
||
adc #S.PS.SIZE
|
||
sta ZPQuickPtr1
|
||
bcc .2
|
||
|
||
inc ZPQuickPtr2+1
|
||
.2 dex
|
||
bne .1
|
||
|
||
pla
|
||
sec
|
||
rts
|
||
|
||
.8 pla
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
TSKMGR.COUNT .BS 1
|
||
TSKMGR.LASTID .BS 1
|
||
*--------------------------------------
|
||
MSG.NEWPS >PSTRING "\nTskMgr:"
|
||
MAN
|
||
SAVE SYS/KERNEL.S.TSK
|
||
LOAD SYS/KERNEL.S
|
||
ASM
|