A2osX/SYS/KERNEL.S.PS.txt
2017-08-25 08:37:21 +02:00

439 lines
8.1 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # ExecProcessNewEnv.YA
* # ExecProcess.YA (Blocking Parent PID)
* # CreateProcessNewEnv.YA
* # CreateProcess.YA (Non Blocking)
* ## In:
* Y,A = PTR To Cmd Line
* ## Out:
* A = Child PSID
*\--------------------------------------
K.ExecProcessNewEnv.YA
ldx #S.PS.F.ENV+S.PS.F.HOLD
.HS 2C bit abs
K.ExecProcess.YA
ldx #S.PS.F.HOLD
.HS 2C bit abs
K.CreateProcessNewEnv.YA
ldx #S.PS.F.ENV
.HS 2C bit abs
K.CreateProcess.YA
ldx #0
stx K.CreateProcess.Flags
>STYA K.CreateProcess.CmdLine
jsr PS.CreateChild
bcs .9
sta .8+1
jsr PS.Init
bcc .8
pha save error code
lda .8+1
jsr PS.Free.A
pla get back error code
sec
rts
.8 lda #$ff self modified
.9 rts
*--------------------------------------
K.CreateProcess.Flags .BS 1
K.CreateProcess.CmdLine .BS 2
*/--------------------------------------
* # GetPSByID.A
* ## In :
* A = PID
* ## Out :
* Y,A = PTR to TSKSLOT
*\--------------------------------------
K.GetPSByID.A pha
>LDYAI TskMgr.Table
>STYA ZPPtr1
pla
beq .8
sta .20+1
ldx #0
.1 inx
lda ZPPtr1
clc
adc #S.PS
sta ZPPtr1
bcc .2
inc ZPPtr1+1
.2 lda (ZPPtr1)
bpl .3
ldy #S.PS.PID
lda (ZPPtr1),y
.20 cmp #$ff Self Modified
beq .8
.3 cpx TskMgr.Count
bne .1
.9 lda #TSKMGR.ERRNSP
sec
rts
.8 >LDYA ZPPtr1
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 ZPPtrs1 & 2
* because of calling K.NewPStrYA & S.DupEnvA
*--------------------------------------
PS.CreateChild >LDYAI TskMgr.Table+S.PS
>STYA ZPPtr3
ldx #0
.1 inx
cpx TskMgr.Count
beq .2
lda (ZPPtr3) Found an empty slot
bpl .3
lda ZPPtr3
clc
adc #S.PS
sta ZPPtr3
bcc .1
inc ZPPtr3+1
bra .1
.2 cpx #K.PS.MAX
bne .3
lda #TSKMGR.ERROOH
sec
rts
.3 inc TskMgr.Count
.4 inc TSKMGR.LASTID Get a PSID not alredy running
beq .4 not = 0
lda TSKMGR.LASTID
jsr K.GetPSByID.A
bcc .4
ldy #S.PS.PID
lda TSKMGR.LASTID
sta (ZPPtr3),y
lda #0
ldy #S.PS.hCS
.5 sta (ZPPtr3),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 (ZPPtr3) Mark this PS with ENV flag
ldy #S.PS.hPREFIX copy hPREFIX...
lda (pPs),y
jsr K.GetMemPtr.A
jsr K.NewPStr.YA
bcs .9
txa
ldy #S.PS.hPREFIX
sta (ZPPtr3),y
ldy #S.PS.hENV ...and hENV from parent PS
lda (pPs),y
jsr PS.DupEnv.A
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 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 (ZPPtr3)
sta (ZPPtr3) Make this PS Init....
ldy #S.PS.CPID
lda TSKMGR.LASTID
sta (pPs),y
clc Exit with A=PSID
.9 rts
*--------------------------------------
PS.Init >LDYA K.CreateProcess.CmdLine
jsr PS.Str2StrArray.YA
bcs .9
phy save PTR to StrArray...
pha
txa
ldy #S.PS.hCMDLINE
sta (ZPPtr3),y
pla Restore PTR...
ply
>SYSCALL LoadBin.YA Y,A=filename full path
bcs .9
>STYA ZPPtr4 save PTR to Code Segment
txa
ldy #S.PS.hCS
sta (ZPPtr3),y save CS hMem in TSKSLOT
ldy #H.BIN.EXE.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
jsr K.GetMem0.YA
bcs .9
txa
ldy #S.PS.hDS
sta (ZPPtr3),y save DS hMem in TSKSLOT
.2
clc
.9 rts
*--------------------------------------
* PS.Free.A
* In : A = PID to free
*--------------------------------------
PS.Free.A jsr K.GetPSByID.A PS in ZPPtr1
ldy #S.PS.hCMDLINE
jsr PS.Free.A.PsY
lda (ZPPtr1) get S.PS.F
and #S.PS.F.ENV do we have to discard duplicated env & prefix ?
beq .1
ldy #S.PS.hENV
jsr PS.Free.A.PsY
ldy #S.PS.hPREFIX
jsr PS.Free.A.PsY
.1 ldy #S.PS.hDS
jsr PS.Free.A.PsY
ldy #S.PS.hCS
jsr PS.Free.A.PsY
lda #0
sta (ZPPtr1) Mark TSKSLOT as free
clc
PS.Free.A.RTS rts
*--------------------------------------
PS.Free.A.PsY lda (ZPPtr1),y
beq PS.Free.A.RTS
jmp K.FreeMem.A
*--------------------------------------
PS.Select ldy #S.PS.hCS
lda (pPs),y
jsr K.GetMemPtr.A
>STYA pCode
ldy #S.PS.hDS
lda (pPs),y
beq .8
jsr K.GetMemPtr.A
>STYA pData
.8 clc
rts
*--------------------------------------
* PS.DupEnv.A
* In:
* A = ENV hMem To Duplicate
* Out:
* A = hMem to new ENV
*--------------------------------------
PS.DupEnv.A jsr K.GetMemPtr.A
>STYA ZPPtr1
>LDYAI K.ENV.SIZE
jsr K.GetMem.YA
bcs .9
>STYA ZPPtr2
ldy #0
.1 lda (ZPPtr1),y
sta (ZPPtr2),y
beq .8
iny
bne .1
inc ZPPtr1+1
inc ZPPtr2+1
bra .1
.8 txa
clc
.9 rts
*/--------------------------------------
* # Str2StrArray.YA
* Convert a CSTR (e.g. : command Line) to a Array of CSTRs (Args[])
* ## In:
* Y,A = PTR to String
* ## Out:
* CC : success
* Y,A = PTR to StrArray
* X = hMem
* CS : error
* A = SYS error code
*\--------------------------------------
PS.Str2StrArray.YA
>STYA ZPPtr1
lda (ZPPtr1) Get mem size STRLEN+1
inc
tay
lda #0
jsr K.GetMem.YA
bcs .9
phx save hMem
phy save PTR.LO
pha save PTR.HI
>STYA ZPPtr2
lda (ZPPtr1)
tax count in src string
beq .8
ldy #0 reset index in dst token
.3 inc ZPPtr1 get...
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1) ...next char
cmp #' ' found a space ?
bne .6
tya in a token ?
beq .7 no, skip & go to next char
sta (ZPPtr2) yes, set this token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .5
inc ZPPtr2+1
.5 ldy #0 reset index in dst token
bra .7
.6 iny add char to token
sta (ZPPtr2),y
.7 dex end of src string?
bne .3 no...next char...
tya yes, are we in a token ?
beq .8
sta (ZPPtr2) yes, set last token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .8
inc ZPPtr2+1
.8 lda #0
sta (ZPPtr2) set Array Ending 0
pla get back PTR.HI
ply get back PTR.LO
plx get back hMem
clc
.9 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.PS
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM