PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF */-------------------------------------- * #ExecProcessNewEnvYA * #ExecProcessYA (Blocking Parent PID) * #CreateProcessNewEnvYA * #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 >STYA K.CreateProcess.CmdLine jsr PS.CreateChild bcs .9 sta K.CreateProcess.CPSID jsr PS.Init bcc .8 pha save error code lda K.CreateProcess.CPSID jsr PS.FreeA pla get back error code sec rts .8 lda K.CreateProcess.CPSID .9 rts *-------------------------------------- K.CreateProcess.Flags .BS 1 K.CreateProcess.CmdLine .BS 2 K.CreateProcess.CPSID .BS 1 */-------------------------------------- * #GetPSByIDA * ##In : * A = PID * ##Out : * Y,A = PTR to TSKSLOT *\-------------------------------------- K.GetPSByIDA pha >LDYAI TskMgr.Table >STYA ZPQuickPtr1 pla beq .8 sta .20+1 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.PID lda (ZPQuickPtr1),y .20 cmp #$ff Self Modified beq .8 .3 cpx TSKMGR.SIZE bne .1 .9 lda #TSKMGR.ERRNSP sec rts .8 >LDYA ZPQuickPtr1 clc rts */-------------------------------------- * #Sleep * Make current process suspend until next RUN * ##In : * (none) * ##Out : * (none) *\-------------------------------------- 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.PID 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.PID lda (pPs),y ldy #S.PS.PPID sta (ZPQuickPtr3),y ldy #S.PS.CPID 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 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 Already in 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.Select0 lda #0 PS.SelectA jsr K.GetPSByIDA bcs * >STYA pPs PS.Select ldy #S.PS.hCS lda (pPs),y beq .1 PS=0 (kernel) has no CS/DS jsr K.GetMemPtrA >STYA pCode ldy #S.PS.hDS lda (pPs),y beq .1 jsr K.GetMemPtrA >STYA pData .1 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