PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF
*--------------------------------------
* K.ExecProcessNewEnvYA
* K.ExecProcessYA	(Blocking Parent PID)
* K.CreateProcessNewEnvYA 
* K.CreateProcessYA (Non Blocking)
*  in :
*   Y,A = PTR To Cmd Line
*  out :
*   A = Child PSID
*--------------------------------------
K.ExecProcessNewEnvYA
				ldx #S.PS.F.ENV+S.PS.F.HOLD
				.HS 2C					bit abs
K.ExecProcessYA	ldx #S.PS.F.HOLD
				.HS 2C					bit abs
K.CreateProcessNewEnvYA 
				ldx #S.PS.F.ENV
				.HS 2C					bit abs
K.CreateProcessYA
				ldx #0
				stx K.CreateProcess.Flags

				jsr K.ExpandPStrYA
				bcs .99

				stx K.CreateProcess.hCmdLine
				>STYA K.CreateProcess.CmdLine
				
				jsr PS.CreateChild
				bcs .98

				sta K.CreateProcess.CPSID
				
				jsr PS.Init
				bcs .97
				
				lda K.CreateProcess.CPSID
				clc
				rts
				
.97				pha						save error code
				lda K.CreateProcess.CPSID
				jsr PS.FreeA
				pla						get back error code
				
.98				pha
				lda K.CreateProcess.hCmdLine
				jsr K.FreeMemA
				pla
				
.99				sec
				rts
*--------------------------------------
K.CreateProcess.Flags	.BS 1
K.CreateProcess.hCmdLine .BS 1
K.CreateProcess.CmdLine	.BS 2
K.CreateProcess.CPSID	.BS 1
*--------------------------------------
* K.GetPSByIDA
*  In : 
*	A = PID
*  Out : 
*   Y,A = PTR to TSKSLOT
*--------------------------------------
K.GetPSByIDA	sta K.GetPSByIDA.PS
				
				>LDYAI TskMgr.Table
				>STYA ZPQuickPtr1
				
				lda K.GetPSByIDA.PS
				beq .8
				
				ldx #0
				
.1				inx
				lda ZPQuickPtr1
				clc
				adc #S.PS
				sta ZPQuickPtr1
				bcc .2
				inc ZPQuickPtr1+1

.2				lda	(ZPQuickPtr1)
				bpl .3
				
				ldy #S.PS.ID
				lda	(ZPQuickPtr1),y
				cmp K.GetPSByIDA.PS
				beq .8
				
.3				cpx TSKMGR.SIZE
				bne .1
				
.9				lda #TSKMGR.ERRNSP
				sec
				rts	

.8				>LDYA ZPQuickPtr1
				clc
				rts
*--------------------------------------
K.GetPSByIDA.PS	.BS 1
*--------------------------------------
K.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
*--------------------------------------
* PS.CreateChild
*  in :
*  out :
*   A = PSID
* we cannot use ZPQuickPtrs1 & 2
* because of calling K.NewPStrYA & S.DupEnvA
*--------------------------------------
PS.CreateChild	>LDYAI TskMgr.Table+S.PS
				>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
				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 K.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
				bne .5

				lda #S.PS.F.ENV
				bit K.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 K.GetMemPtrA
				jsr K.NewPStrYA
				bcs .9
				
				txa
				ldy #S.PS.hPREFIX
				sta (ZPQuickPtr3),y
				
				ldy #S.PS.hENV			...and hENV from parent PS
				lda (pPs),y
				jsr PS.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 K.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
*--------------------------------------
PS.Init			>LDYA K.CreateProcess.CmdLine
				jsr K.PStr2StrArrayYA
				bcs .9
				
				phy						save PTR to StrArray...
				pha
				
				txa
				ldy #S.PS.hCMDLINE
				sta (ZPQuickPtr3),y

				pla						Restore PTR...
				ply
				>SYSCALL SYS.LoadExeYA	Y,A=filename full path
				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.EXE.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 K.GetMem				
				bcs .9
				
				txa
				ldy #S.PS.hDS
				sta (ZPQuickPtr3),y		save DS hMem in TSKSLOT
				
.2				

				clc
.9				rts
*--------------------------------------
* PS.FreeA
*   In : A = PID to free
*--------------------------------------
PS.FreeA		jsr K.GetPSByIDA
				bcs *
				>STYA ZPQuickPtr1
				
				ldy #S.PS.hCMDLINE
				lda (ZPQuickPtr1),y
				beq .2
				
				jsr K.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 K.FreeMemA
				
.3				ldy #S.PS.hPREFIX
				lda (ZPQuickPtr1),y
				beq .4
				
				jsr K.FreeMemA
				
.4				ldy #S.PS.hDS
				lda (ZPQuickPtr1),y
				beq .5
				
				jsr K.FreeMemA
				
.5				ldy #S.PS.hCS
				lda (ZPQuickPtr1),y
				beq .8
				
				jsr K.FreeMemA
				
.8				lda #0
				sta (ZPQuickPtr1)		Mark TSKSLOT as free
				clc
				rts
*--------------------------------------
* PS.SelectA
*   In : A=PSID
*--------------------------------------
PS.SelectA		tay
				bne PS.SelectN
PS.Select0
				>LDYAI TskMgr.Table		Make PS #0 as current process
				>STYA pPs
				bra PS.SelectDev

PS.SelectN		jsr K.GetPSByIDA
				bcs *
				>STYA pPs

PS.Select		ldy #S.PS.hCS
				lda (pPs),y
				jsr K.GetMemPtrA
				>STYA pCode

				ldy #S.PS.hDS
				lda (pPs),y
				beq PS.SelectDev

				jsr K.GetMemPtrA
				>STYA pData

PS.SelectDev	ldy #S.PS.hOUTDEV
				lda	(pPs),y
				beq .8
				
				jsr K.GetDevByIDA
				>STYA pDev

.8				clc
				rts
*--------------------------------------
* PS.DupEnvA
*  In:
*   A = ENV hMem To Duplicate
*  Out:
*   A = hMem to new ENV
*--------------------------------------
PS.DupEnvA		jsr K.GetMemPtrA
				>STYA ZPQuickPtr1
				>PUSHWI K.ENV.SIZE
				>PUSHBI 0
				jsr K.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
