NEW PREFIX /A2OSX.BUILD AUTO 4,1 */-------------------------------------- * # ExecPSNewEnv. * # ExecPS (Blocking Parent PID) * # CreatePSNewEnv * # CreatePS (Non Blocking) * **In:** * Y,A = PTR To Cmd Line * **Out:** * A = Child PSID *\-------------------------------------- K.ExecPSNewEnv ldx #S.PS.F.DUPENV+S.PS.F.HOLD .HS 2C bit abs K.ExecPS ldx #S.PS.F.HOLD .HS 2C bit abs K.CreatePSNewEnv ldx #S.PS.F.DUPENV .HS 2C bit abs K.CreatePS ldx #0 stx PS.Flags >STYA PS.CL jsr PS.CreateChild Child S.PS at ZPPtr3 bcs .9 sta .8+1 >LDYA PS.CL jsr PS.CmdLine2Args Y,A = Args[0] bcs .9 jsr PS.Load bcc .8 pha save error code lda .8+1 jsr CORE.PSFree.A pla get back error code sec rts .8 lda #$ff self modified .9 rts *-------------------------------------- PS.Flags .BS 1 PS.CL .BS 2 *-------------------------------------- * PS.CreateChild * in : * out : * A = PSID * we cannot use ZPPtrs1 & 2 * because of calling K.NewStr.YA & S.DupEnv.A *-------------------------------------- PS.CreateChild ldx #0 .1 cpx CORE.PSCount beq .2 lda PS.Table.PID,x beq .31 Found an empty slot inx bra .1 .2 cpx #K.PS.MAX bne .3 lda #K.E.OOH sec rts .99 plx rts .3 inc CORE.PSCount .31 phx save PS inex .4 inc CORE.LastPSID Get a PSID not alredy running beq .4 not = 0 lda CORE.LastPSID jsr CORE.GetPSByID bcc .4 plx lda CORE.LastPSID sta PS.Table.PID,x phx >LDYAI S.PS jsr K.GetMem0 Blank Everything in this S.PS bcs .99 >STYA ZPPtr3 txa plx sta PS.Table.hMem,x jsr PS.SetMemOwner Set Ownership ldy #S.PS.PID lda CORE.LastPSID sta (ZPPtr3),y lda #S.PS.F.DUPENV bit PS.Flags need to create ENV & Prefix ? beq .6 no... sta (ZPPtr3) Mark this PS with DUPENV flag ldy #S.PS.hPREFIX copy hPREFIX... lda (pPs),y jsr K.GetMemPtr jsr K.NewStr bcs .9 jsr PS.SetMemOwner Set Ownership txa ldy #S.PS.hPREFIX sta (ZPPtr3),y ldy #S.PS.hENV ...and hENV from parent PS lda (pPs),y jsr PS.DupEnv bcs .9 ldy #S.PS.hENV sta (ZPPtr3),y bra .8 .6 ldy #S.PS.hPREFIX reuse same hPREFIX... lda (pPs),y sta (ZPPtr3),y ldy #S.PS.hENV ...and hENV from parent PS lda (pPs),y sta (ZPPtr3),y .8 ldy #S.PS.hStdIn .81 lda (pPs),y sta (ZPPtr3),y iny cpy #S.PS.hStdErr+1 bne .81 ldy #S.PS.PID lda (pPs),y ldy #S.PS.PPID sta (ZPPtr3),y lda #S.PS.F.HOLD bit PS.Flags beq .82 ora (pPs) sta (pPs) HOLD parent PS if ExecPS .82 lda #S.PS.F.INIT ora (ZPPtr3) sta (ZPPtr3) Make this PS Init.... ldy #S.PS.CPID lda CORE.LastPSID sta (pPs),y clc Exit with A=PSID .9 rts *-------------------------------------- PS.CmdLine2Args >STYA ZPPtr1 ldy #0 .1 lda (ZPPtr1),y compute strlen in Y,X beq .2 iny bne .1 max 255 .2 tya +2 for ending 0 for last string, and endig 0 for array clc adc #2 tay lda #0 bcc .3 inc .3 jsr K.GetMem bcs .9 phy save PTR.LO pha save PTR.HI >STYA ZPPtr2 txa ldy #S.PS.hARGS sta (ZPPtr3),y jsr PS.SetMemOwner Set Ownership stz PS.bInQuote ldy #$ff ldx #0 Arg Count .4 iny lda (ZPPtr1),y beq .7 cmp #'"' found a quote ? bne .5 lda PS.bInQuote eor #$ff sta PS.bInQuote bra .4 .5 cmp #' ' bne .6 bit PS.bInQuote bmi .6 inx Found one arg !!! lda #0 set this token End .6 sta (ZPPtr2) inc ZPPtr2 bne .4 inc ZPPtr2+1 bra .4 .7 sta (ZPPtr2) set Arg Ending 0 inc ZPPtr2 bne .8 inc ZPPtr2+1 .8 sta (ZPPtr2) set Array Ending 0 txa ldy #S.PS.ARGC sta (ZPPtr3),y pla get back PTR.HI ply get back PTR.LO clc .9 rts PS.bInQuote .BS 1 *-------------------------------------- PS.Load jsr BIN.Load Y,A=filename full path bcs .9 >STYA ZPPtr4 save PTR to Code Segment phy ldy #S.PS.ZP.CODE+1 sta (ZPPtr3),y save pCode HI... dey pla sta (ZPPtr3),y save pCode LO... txa ldy #S.PS.hCS sta (ZPPtr3),y save CS hMem in S.PS jsr K.GetMemByID jsr PS.SetMemOwner Set Ownership ldy #H.BIN.DS.SIZE+1 lda (ZPPtr4),y Load DS.SIZE HI tax dey ora (ZPPtr4),y beq .2 DS.SIZE=0... lda (ZPPtr4),y tay txa Y,A = DS.SIZE ldx #S.MEM.F.INIT0+S.MEM.F.DATA jsr MEM.GetMem.YAX bcs .9 phy ldy #S.PS.ZP.DATA+1 sta (ZPPtr3),y save pData HI... dey pla sta (ZPPtr3),y save pData LO... txa ldy #S.PS.hDS sta (ZPPtr3),y save DS hMem in S.PS jsr PS.SetMemOwner Set Ownership .2 ldy #H.BIN.SS.SIZE lda (ZPPtr4),y Load SS.SIZE ldy #S.PS.ZP.STACK sta (ZPPtr3),y save pStack LO... tay bne .3 SS.SIZE.LO=0, set as default $100 lda #1 SS.SIZE.HI .HS 2C bit abs .3 lda #0 ldx #S.MEM.F.ALIGN+S.MEM.F.STACK jsr MEM.GetMem.YAX bcs .9 ldy #S.PS.ZP.STACK+1 sta (ZPPtr3),y save pStack HI...(LO alredy set to Stack TOP) txa ldy #S.PS.hSS sta (ZPPtr3),y save SS hMem in S.PS jsr PS.SetMemOwner Set Ownership ldy #H.BIN.ZP.SIZE lda (ZPPtr4),y clc adc #8 Add room for 4 saved PTR ldy #S.PS.ZP.SIZE sta (ZPPtr3),y clc .9 rts *-------------------------------------- * PS.DupEnv * In: * A = ENV hMem To Duplicate * Out: * A = hMem to new ENV *-------------------------------------- PS.DupEnv jsr K.GetMemPtr >STYA ZPPtr1 >LDYAI K.ENV.SIZE jsr K.GetMem bcs .9 >STYA ZPPtr2 jsr PS.SetMemOwner Set Ownership ldy #0 .1 lda (ZPPtr1),y sta (ZPPtr2),y beq .8 .2 iny bne .3 inc ZPPtr1+1 inc ZPPtr2+1 .3 lda (ZPPtr1),y sta (ZPPtr2),y bne .2 iny bne .1 inc ZPPtr1+1 inc ZPPtr2+1 bra .1 .8 txa hMem clc .9 rts *-------------------------------------- PS.SetMemOwner lda CORE.LastPSID ldy #S.MEM.OWNERPID sta (ZPMEMMGR),y rts */-------------------------------------- * # GetMemStat * **In:** * Y,A = Ptr to 24 bytes buffer * **Out:** * Buffer filled with memory stats *\-------------------------------------- K.GetMemStat >STYA ZPMemMgrTmp1 ldy #22 ldx #6 .1 lda DevMgr.Stat,x sta (ZPMemMgrTmp1),y dey dex bpl .1 sta SETREADAUX ldy #14 jsr .2 sta CLRREADAUX ldy #6 .2 ldx #6 .3 lda Mem.Table,x sta (ZPMemMgrTmp1),y dey dex bpl .3 rts */-------------------------------------- * # GetPSStatus * **In:** * A = PID * **Out:** * A = Status Byte *\-------------------------------------- K.GetPSStatus jsr CORE.GetPSByID bcs .9 >STYA ZPPtr1 lda (ZPPtr1) .9 rts */-------------------------------------- * # GetPSStat * **In:** * Y,A = Ptr to 24 bytes buffer * **Out:** * Buffer filled with PS stats *\-------------------------------------- K.GetPSStat >STYA ZPPtr1 ldx #0 ldy #1 lda CORE.InKernelStat sta (ZPPtr1),y iny .1 lda PS.Table.PID,x beq .2 lda PS.Table.hMem,x sta (ZPPtr1),y iny lda PS.Table.Stat,x sta (ZPPtr1),y iny .2 inx cpx CORE.PSCount bne .1 .9 tya lsr dec sta (ZPPtr1) rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.PS LOAD /A2OSX.SRC/SYS/KERNEL.S ASM