A2osX/SYS/KERNEL.S.TSK.txt

175 lines
3.4 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.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* TSK.TskMgrRun
*--------------------------------------
TSK.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0
>STYA pPs
lda TSKMGR.SIZE
dec skip PS 0
sta TSKMGR.COUNT
beq .8 no process....
.1 lda (pPs) get S.PS.F
bit #S.PS.F.INUSE In use ?
beq .7
bit #S.PS.F.HOLD Waiting for Another Task to Terminate?
beq .2
ldy #S.PS.CID
lda (pPs),y
jsr K.GetPSByIDA
bcc .7 yes, running....
lda (pPs) get S.PS.F
and #$FF^S.PS.F.HOLD unmark as HOLD
sta (pPs)
.2 jsr PS.Select
lda (pPS)
bit #S.PS.F.INIT
beq .20
and #$FF^S.PS.F.INIT unmark as INIT
sta (pPS)
ldx #TSKMGR.INIT
bra .31
.20 bit #S.PS.F.SLEEP Is this PS sleeping?
beq .3 no, call TSKMGR.RUN
and #$FF^S.PS.F.SLEEP unmark as SLEEP
sta (pPS)
ldy #S.PS.PC
lda (pPs),y
sec Advance PC by one as it was saved by a JSR
adc pCode
sta .21+1
iny
lda (pPs),y
adc pCode+1
sta .21+2
.21 jsr $FFFF
bra .4
.3 ldx #TSKMGR.RUN
.31 jsr pCodeJmp Call INIT/RUN function
.4 bcc .7 INIT/RUN said CS=QUIT?
ldx #TSKMGR.QUIT yes, quit this process
jsr pCodeJmp Call QUIT function
ldy #S.PS.ID
lda (pPs),y
jsr PS.FreeA
bcs *
.7 lda pPs
clc
adc #S.PS
sta pPs
bcc .71
inc pPs+1
.71 dec TSKMGR.COUNT
bne .1
.8 clc
rts
*--------------------------------------
* TSK.DispatchEvents
* IN:
* OUT:
* CS: Not Dispatched
* CC: Event Cleared
*--------------------------------------
TSK.DispatchEvents
>LDYAI TskMgr.Table+S.PS
>STYA pPs
lda TSKMGR.SIZE Number of actual processes...
sta TSKMGR.COUNT ...to give event list
.1 dec TSKMGR.COUNT skip PS 0
beq .9
lda (pPs) get S.PS.F
bpl .4
* bit #S.PS.F.INUSE In use ?
* beq .4
bit #S.PS.F.INIT+S.PS.F.HOLD Init or Waiting for Another Task to Terminate?
bne .4
bit #S.PS.F.EVENT Accept Events ?
beq .4
jsr PS.Select
stz pEvent Select first event in list
lda EVTMGR.COUNT
sta TSKMGR.EVENTCNT
.2 lda (pEvent) Empty event, select next
beq .3
lda (pCode)
cmp #H.BIN.HEADER.BIN65
bne *
ldx #TSKMGR.DOEVENT
jsr pCodeJmp Call DOEVENT function
bcs .3 not for this PS, try next event in list
jsr EVT.DestroyEvent this PS handled the EVT, destroy it...
lda EVTMGR.COUNT
beq .8 no more event, exit
.3 dec TSKMGR.EVENTCNT
beq .4 all EVT submitted to this PS, try other PS
lda pEvent try next EVT to this PS
clc
adc #S.EVT
sta pEvent
bra .2
.4 lda pPs go to next PS in PS list
clc
adc #S.PS
sta pPs
bcc .1
inc pPs+1
bne .1 always
.8 clc
rts
.9 sec
rts
*--------------------------------------
TSK.TskMgrQuit clc
rts
*--------------------------------------
TSKMGR.COUNT .BS 1
TSKMGR.EVENTCNT .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.TSK
LOAD SYS/KERNEL.S
ASM