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 >DEBUG 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