A2osX/SYS/KERNEL.S.PS.txt

458 lines
8.4 KiB
Plaintext
Raw Normal View History

2016-08-17 06:25:58 +00:00
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
2016-08-17 06:25:58 +00:00
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
2016-08-17 06:25:58 +00:00
2016-09-29 15:30:15 +00:00
jsr PS.CreateChild
bcs .9
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
sta .8+1
>DEBUG
2016-09-29 15:30:15 +00:00
jsr PS.Init
bcc .8
pha save error code
2017-01-12 17:43:45 +00:00
lda .8+1
jsr PS.Free.A
pla get back error code
sec
2016-08-17 06:25:58 +00:00
rts
2017-01-12 17:43:45 +00:00
.8 lda #$ff self modified
.9 rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
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
2016-08-17 06:25:58 +00:00
>LDYAI TskMgr.Table
2017-01-12 17:43:45 +00:00
>STYA ZPPtr1
2016-08-17 06:25:58 +00:00
pla
2016-08-17 06:25:58 +00:00
beq .8
sta .20+1
2016-08-17 06:25:58 +00:00
ldx #0
.1 inx
2017-01-12 17:43:45 +00:00
lda ZPPtr1
2016-08-17 06:25:58 +00:00
clc
adc #S.PS
2017-01-12 17:43:45 +00:00
sta ZPPtr1
2016-08-17 06:25:58 +00:00
bcc .2
2017-01-12 17:43:45 +00:00
inc ZPPtr1+1
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
.2 lda (ZPPtr1)
2016-08-17 06:25:58 +00:00
bpl .3
ldy #S.PS.PID
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
.20 cmp #$ff Self Modified
2016-08-17 06:25:58 +00:00
beq .8
2017-01-12 17:43:45 +00:00
.3 cpx TskMgr.Count
2016-08-17 06:25:58 +00:00
bne .1
.9 lda #TSKMGR.ERRNSP
sec
rts
2017-01-12 17:43:45 +00:00
.8 >LDYA ZPPtr1
2016-08-17 06:25:58 +00:00
clc
rts
*/--------------------------------------
* # Sleep
* Make current process suspend until next RUN
* ## In :
* (none)
* ## Out :
* (none)
*\--------------------------------------
2016-09-21 15:20:37 +00:00
K.Sleep pla get PC LO
2016-08-17 06:25:58 +00:00
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
*--------------------------------------
2016-09-29 15:30:15 +00:00
* PS.CreateChild
2016-08-17 06:25:58 +00:00
* in :
* out :
* A = PSID
2017-01-12 17:43:45 +00:00
* we cannot use ZPPtrs1 & 2
2016-09-21 15:20:37 +00:00
* because of calling K.NewPStrYA & S.DupEnvA
2016-08-17 06:25:58 +00:00
*--------------------------------------
PS.CreateChild >LDYAI TskMgr.Table+S.PS
2017-01-12 17:43:45 +00:00
>STYA ZPPtr3
2016-08-17 06:25:58 +00:00
ldx #0
.1 inx
2017-01-12 17:43:45 +00:00
cpx TskMgr.Count
2016-08-17 06:25:58 +00:00
beq .2
2017-01-12 17:43:45 +00:00
lda (ZPPtr3) Found an empty slot
2016-08-17 06:25:58 +00:00
bpl .3
2017-01-12 17:43:45 +00:00
lda ZPPtr3
2016-08-17 06:25:58 +00:00
clc
adc #S.PS
2017-01-12 17:43:45 +00:00
sta ZPPtr3
2016-08-17 06:25:58 +00:00
bcc .1
2017-01-12 17:43:45 +00:00
inc ZPPtr3+1
2016-08-17 06:25:58 +00:00
bra .1
.2 cpx #K.PS.MAX
bne .3
2016-08-17 06:25:58 +00:00
lda #TSKMGR.ERROOH
sec
rts
2017-01-12 17:43:45 +00:00
.3 inc TskMgr.Count
2016-08-17 06:25:58 +00:00
.4 inc TSKMGR.LASTID Get a PSID not alredy running
beq .4 not = 0
lda TSKMGR.LASTID
jsr K.GetPSByID.A
2016-08-17 06:25:58 +00:00
bcc .4
ldy #S.PS.PID
2016-08-17 06:25:58 +00:00
lda TSKMGR.LASTID
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
lda #0
ldy #S.PS.hCS
2017-01-12 17:43:45 +00:00
.5 sta (ZPPtr3),y Blank Everything in this S.PS
2016-08-17 06:25:58 +00:00
iny
cpy #S.PS
2016-08-17 06:25:58 +00:00
bne .5
lda #S.PS.F.ENV
2016-09-21 15:20:37 +00:00
bit K.CreateProcess.Flags need to create ENV & Prefix ?
beq .6 no...
2017-01-12 17:43:45 +00:00
sta (ZPPtr3) Mark this PS with ENV flag
2016-08-17 06:25:58 +00:00
ldy #S.PS.hPREFIX copy hPREFIX...
lda (pPs),y
jsr K.GetMemPtr.A
jsr K.NewPStr.YA
bcs .9
2016-08-17 06:25:58 +00:00
txa
ldy #S.PS.hPREFIX
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
ldy #S.PS.hENV ...and hENV from parent PS
lda (pPs),y
jsr PS.DupEnv.A
bcs .9
2016-08-17 06:25:58 +00:00
ldy #S.PS.hENV
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
bra .8
.6 ldy #S.PS.hPREFIX reuse same hPREFIX...
lda (pPs),y
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
ldy #S.PS.hENV ...and hENV from parent PS
lda (pPs),y
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
.8 ldy #S.PS.hStdIn
2016-08-17 06:25:58 +00:00
.81 lda (pPs),y
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
iny
2017-01-12 17:43:45 +00:00
cpy #S.PS.hStdErr+1
2016-08-17 06:25:58 +00:00
bne .81
ldy #S.PS.PID
2016-08-17 06:25:58 +00:00
lda (pPs),y
ldy #S.PS.PPID
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
lda #S.PS.F.HOLD
2016-09-21 15:20:37 +00:00
bit K.CreateProcess.Flags
beq .82
2016-08-17 06:25:58 +00:00
ora (pPs)
sta (pPs) HOLD parent PS if ExecProcess
.82 lda #S.PS.F.INUSE+S.PS.F.INIT
2017-01-12 17:43:45 +00:00
ora (ZPPtr3)
sta (ZPPtr3) Make this PS Init....
ldy #S.PS.CPID
lda TSKMGR.LASTID
2017-01-12 17:43:45 +00:00
sta (pPs),y
clc Exit with A=PSID
.9 rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
2016-09-29 15:30:15 +00:00
PS.Init >LDYA K.CreateProcess.CmdLine
jsr PS.CmdLine2Args.YA
2016-08-17 06:25:58 +00:00
bcs .9
phy save PTR to Args[0]...
2016-08-17 06:25:58 +00:00
pha
txa
ldy #S.PS.hCMDLINE
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y
2016-08-17 06:25:58 +00:00
pla Restore PTR...
ply
jsr BIN.Load.YA Y,A=filename full path
2016-08-17 06:25:58 +00:00
bcs .9
2017-01-12 17:43:45 +00:00
>STYA ZPPtr4 save PTR to Code Segment
2016-08-17 06:25:58 +00:00
txa
ldy #S.PS.hCS
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y save CS hMem in TSKSLOT
2016-08-17 06:25:58 +00:00
ldy #H.BIN.EXE.DS.SIZE+1
2017-01-12 17:43:45 +00:00
lda (ZPPtr4),y Load DS.SIZE HI
2016-08-17 06:25:58 +00:00
tax
dey
2017-01-12 17:43:45 +00:00
ora (ZPPtr4),y
2016-08-17 06:25:58 +00:00
beq .2 DS.SIZE=0...
lda (ZPPtr4),y
tay
txa Y,A = DS.SIZE
jsr K.GetMem0.YA
2016-08-17 06:25:58 +00:00
bcs .9
txa
ldy #S.PS.hDS
2017-01-12 17:43:45 +00:00
sta (ZPPtr3),y save DS hMem in TSKSLOT
2016-08-17 06:25:58 +00:00
.2 ldy #H.BIN.EXE.SS.SIZE+1
lda (ZPPtr4),y Load DS.SIZE HI
tax
dey
ora (ZPPtr4),y
beq * DS.SIZE=0!!!!
lda (ZPPtr4),y
tay
txa Y,A = DS.SIZE
jsr K.GetMem0.YA
bcs .9
txa
ldy #S.PS.hSS
sta (ZPPtr3),y save DS hMem in TSKSLOT
2016-08-17 06:25:58 +00:00
clc
.9 rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
* PS.Free.A
2016-08-17 06:25:58 +00:00
* In : A = PID to free
*--------------------------------------
PS.Free.A jsr K.GetPSByID.A PS in ZPPtr1
2016-08-17 06:25:58 +00:00
ldy #S.PS.hCMDLINE
jsr PS.Free.A.PsY
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
lda (ZPPtr1) get S.PS.F
2016-08-17 06:25:58 +00:00
and #S.PS.F.ENV do we have to discard duplicated env & prefix ?
2017-01-12 17:43:45 +00:00
beq .1
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
ldy #S.PS.hENV
jsr PS.Free.A.PsY
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
ldy #S.PS.hPREFIX
jsr PS.Free.A.PsY
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
.1 ldy #S.PS.hDS
jsr PS.Free.A.PsY
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
ldy #S.PS.hCS
jsr PS.Free.A.PsY
2016-08-17 06:25:58 +00:00
2017-01-12 17:43:45 +00:00
lda #0
sta (ZPPtr1) Mark TSKSLOT as free
2016-08-17 06:25:58 +00:00
clc
PS.Free.A.RTS rts
2017-01-12 17:43:45 +00:00
*--------------------------------------
PS.Free.A.PsY lda (ZPPtr1),y
beq PS.Free.A.RTS
jmp K.FreeMem.A
2016-08-17 06:25:58 +00:00
*--------------------------------------
2016-09-29 15:30:15 +00:00
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
2016-08-17 06:25:58 +00:00
* In:
* A = ENV hMem To Duplicate
* Out:
* A = hMem to new ENV
*--------------------------------------
PS.DupEnv.A jsr K.GetMemPtr.A
2017-01-12 17:43:45 +00:00
>STYA ZPPtr1
>LDYAI K.ENV.SIZE
jsr K.GetMem.YA
2016-08-17 06:25:58 +00:00
bcs .9
2017-01-12 17:43:45 +00:00
>STYA ZPPtr2
2016-08-17 06:25:58 +00:00
ldy #0
2017-01-12 17:43:45 +00:00
.1 lda (ZPPtr1),y
sta (ZPPtr2),y
2016-08-17 06:25:58 +00:00
beq .8
iny
bne .1
2017-01-12 17:43:45 +00:00
inc ZPPtr1+1
inc ZPPtr2+1
2016-08-17 06:25:58 +00:00
bra .1
.8 txa
clc
.9 rts
*/--------------------------------------
* # CmdLine2Args.YA
* Convert a CSTR (e.g. : command Line) to Args[]
* ## In:
* Y,A = PTR to String
* ## Out:
* CC : success
* Y,A = PTR to StrArray
* X = hMem
* CS : error
* A = SYS error code
*\--------------------------------------
PS.CmdLine2Args.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
2016-08-17 06:25:58 +00:00
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.PS
LOAD /A2OSX.SRC/SYS/KERNEL.S
2016-08-17 06:25:58 +00:00
ASM