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