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
