Kernel 0.92

This commit is contained in:
Rémy GIBERT 2019-01-24 13:53:29 +00:00
parent fdbf6c3a9d
commit d2580cdf5f
8 changed files with 166 additions and 128 deletions

Binary file not shown.

View File

@ -81,11 +81,13 @@ CS.RUN lda #1
>LDA.G PS.Index >LDA.G PS.Index
.1 tax .1 tax
beq .2 PS0
lda PS.Table.PID,x lda PS.Table.PID,x
beq .7 beq .7
jsr CS.RUN.DUMP .2 jsr CS.RUN.DUMP
>SLEEP >SLEEP
@ -157,6 +159,8 @@ CS.RUN.DecodeFlags
CS.RUN.PrintArgs CS.RUN.PrintArgs
ldy #S.PS.hARGV ldy #S.PS.hARGV
lda (ZPPSPtr),y lda (ZPPSPtr),y
beq .8 NO ARGV in PS0
>SYSCALL GetMemPtr >SYSCALL GetMemPtr
>STYA ZPArgV >STYA ZPArgV

View File

@ -26,9 +26,14 @@ ZPLIB .EQ $40 32 bytes
*-------------------------------------- *--------------------------------------
* PS Context : 48 bytes MAX * PS Context : 48 bytes MAX
*-------------------------------------- *--------------------------------------
CORE.EvtIndex .EQ $D0
CORE.EvtCount .EQ $D1
CORE.PSIndex .EQ $D2
CORE.PSCount .EQ $D3
pEvent .EQ $D4 pEvent .EQ $D4
pPs .EQ $D6 pPs .EQ $D6
*--------------------------------------
pCode .EQ $D8 pCode .EQ $D8
pData .EQ $DA pData .EQ $DA
pStack .EQ $DC pStack .EQ $DC

View File

@ -4,7 +4,7 @@ AUTO 4,1
*-------------------------------------- *--------------------------------------
CORE.Run stz CORE.PSIndex CORE.Run stz CORE.PSIndex
ldx #0 bra .8 Skip PS0
.1 lda PS.Table.hPS,x .1 lda PS.Table.hPS,x
beq .8 beq .8
@ -30,48 +30,28 @@ CORE.Run stz CORE.PSIndex
.3 jsr CORE.PSExec INIT/RUN/QUIT/RESUME .3 jsr CORE.PSExec INIT/RUN/QUIT/RESUME
dec IRQ.InKernel dec IRQ.InKernel
bcc .61 Error ? bcc .4 INIT/RUN Exit ?
.5 tax Yes, From INIT or RUN,save RC jsr CORE.UpdateParentPS
ldy #S.PS.PPID Notify Parent Process for exit code...
lda (pPs),y
beq .6 no parent process
jsr CORE.GetPSByID X unmodified lda (pPs)
bcs .6 parent is dead.....skipping...
>STYA ZPPtr1
lda (ZPPtr1) Parent PS is HOLD?
bit #S.PS.F.HOLD
beq .6 no...
eor #S.PS.F.HOLD yes, release hold...
sta (ZPPtr1)
txa ...probably waiting for this PS to terminate....
ldy #S.PS.RC give it RC
sta (ZPPtr1),y
.6 lda (pPs)
and #$3F $ff^S.PS.F.INIT+S.PS.F.RUN and #$3F $ff^S.PS.F.INIT+S.PS.F.RUN
ora #S.PS.F.QUIT ora #S.PS.F.QUIT
sta (pPs) sta (pPs)
bra .3 try executing QUIT now... bra .3 try executing QUIT now...
.61 lda (pPs) .4 lda (pPs)
bit #S.PS.F.SLEEP bit #S.PS.F.SLEEP
bne .7 bne .7
bit #S.PS.F.INIT bit #S.PS.F.INIT
beq .62 beq .5
eor #S.PS.F.INIT+S.PS.F.RUN go from INIT to RUN eor #S.PS.F.INIT+S.PS.F.RUN go from INIT to RUN
sta (pPs) sta (pPs)
bra .7 bra .7
.62 bit #S.PS.F.QUIT .5 bit #S.PS.F.QUIT
beq .7 beq .7
ldy #S.PS.PID ldy #S.PS.PID
@ -93,8 +73,13 @@ CORE.Events jsr CORE.GetEvents
jsr CORE.Dispatch jsr CORE.Dispatch
bcc .4 CC=All Events Dispatched bcc .4 CC=All Events Dispatched
jsr CORE.PSSelect0 lda PS.Table.PID Select PS0
jsr K.GetMemPtr
>STYA pPs
>LDYAI K.STACKTOP
>STYA pStack
lda #Evt.Table lda #Evt.Table
sta pEvent sta pEvent
@ -130,6 +115,69 @@ CORE.Events jsr CORE.GetEvents
jsr CORE.ScrSel jsr CORE.ScrSel
.8 jmp CORE.Run .8 jmp CORE.Run
*-------------------------------------- *--------------------------------------
CORE.UpdateParentPS
tax save RC From INIT or RUN
ldy #S.PS.PPID Notify Parent Process for exit code...
lda (pPs),y
beq .8 no parent process
jsr CORE.GetPSByID X unmodified
bcs .8 parent is dead.....skipping...
>STYA ZPPtr1
lda (ZPPtr1) Parent PS is HOLD?
bit #S.PS.F.HOLD
beq .8 no...
ldy #S.PS.CPID
lda (ZPPtr1),y
dey #S.PS.PID
cmp (pPs),y
bne .8 Hold, but not waiting this PS
txa waiting for this PS to terminate....
ldy #S.PS.RC give it RC
sta (ZPPtr1),y
lda (ZPPtr1)
eor #S.PS.F.HOLD release Parent PS HOLD...
sta (ZPPtr1)
lda (pPs)
bit #S.PS.F.DUPENV
bne .8
ldy #S.PS.hENV no dup, check if updating Parent PS
jsr .1
ldy #S.PS.hPREFIX
*--------------------------------------
.1 lda (pPs),y hMEM...
cmp (ZPPtr1),y
beq .8 same, no update
tax save new hMEM
lda #0
sta (pPs),y reset
lda (ZPPtr1),y get parent hMEM
phy
jsr K.freemem discard....
ply
txa put new hMEM in parent
sta (ZPPtr1),y
cpy #S.PS.hENV
bne .8
dey #S.PS.ENVPAGECNT
lda (pPs),y
sta (ZPPtr1),y update page count
.8 rts
*--------------------------------------
* CORE.GetEvents : * CORE.GetEvents :
* IN : * IN :
* OUT : * OUT :
@ -222,7 +270,7 @@ CORE.GetEvents lda #Evt.Table
*-------------------------------------- *--------------------------------------
CORE.Dispatch stz CORE.PSIndex CORE.Dispatch stz CORE.PSIndex
ldx #0 bra .5 skip PS0
.1 lda PS.Table.hPS,x .1 lda PS.Table.hPS,x
beq .5 beq .5
@ -288,70 +336,13 @@ CORE.Dispatch stz CORE.PSIndex
.8 clc .8 clc
rts rts
*-------------------------------------- *--------------------------------------
* CORE.PSFree
* In : A = PID to free
*--------------------------------------
CORE.PSFree sta .10+1 Save PS ID
jsr CORE.GetPSByID S.PS in ZPPtr1
bcs .9
>STYA ZPPtr1
ldy #S.PS.hSS
jsr .8
ldy #S.PS.hDS
jsr .8
ldy #S.PS.hCS
jsr .8
ldy #S.PS.hARGV
jsr .8
lda (ZPPtr1) get S.PS.F
and #S.PS.F.DUPENV do we have to discard duplicated env & prefix ?
beq .1
ldy #S.PS.hENV
jsr .8
.1 ldy #S.PS.hPREFIX
jsr .8
.10 lda #$ff Self Modified
ldx #0
.2 cmp PS.Table.PID,x
beq .3
inx
cpx CORE.PSCount
bne .2
beq *
.3 stz PS.Table.PID,x
lda PS.TABLE.hPS,x
stz PS.TABLE.hPS,x
.4 jmp K.FreeMem
.8 lda (ZPPtr1),y
bne .4
.9 rts
*--------------------------------------
* X unmodified * X unmodified
*-------------------------------------- *--------------------------------------
CORE.GetPSByID tay CORE.GetPSByID jsr CORE.GetPS
beq .8
jsr CORE.GetPS
bcs CORE.GetPSByID.RTS bcs CORE.GetPSByID.RTS
lda PS.TABLE.hPS,y lda PS.TABLE.hPS,y
jmp K.GetMemPtr jmp K.GetMemPtr
.8 lda CORE.hPS0
jsr K.GetMemPtr
CORE.GetPSByID.8 CORE.GetPSByID.8
clc clc
CORE.GetPSByID.RTS CORE.GetPSByID.RTS
@ -359,11 +350,15 @@ CORE.GetPSByID.RTS
*-------------------------------------- *--------------------------------------
* X,A unmodified * X,A unmodified
*-------------------------------------- *--------------------------------------
CORE.GetPS ldy #0 CORE.GetPS tay
beq CORE.GetPSByID.8 PS0 requested
ldy #0
bra .2 Skip PS0
.1 cmp PS.Table.PID,y .1 cmp PS.Table.PID,y
beq CORE.GetPSByID.8 beq CORE.GetPSByID.8
iny .2 iny
cpy CORE.PSCount cpy CORE.PSCount
bne .1 bne .1
@ -423,14 +418,6 @@ CORE.DestroyEvent
dec CORE.EvtCount dec CORE.EvtCount
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
CORE.PSSelect0 lda CORE.hPS0
jsr K.GetMemPtr
>STYA pPs
>LDYAI K.STACKTOP
>STYA pStack
rts
*--------------------------------------
CORE.PSSelect ldy #S.PS.ZP+ZPBIN.SIZE-1 CORE.PSSelect ldy #S.PS.ZP+ZPBIN.SIZE-1
ldx #ZPBIN.SIZE-1 ldx #ZPBIN.SIZE-1
@ -524,11 +511,56 @@ CORE.PSResume sei
inc IRQ.InKernel inc IRQ.InKernel
rti rti
*-------------------------------------- *--------------------------------------
DevMgr.Stat .DA DevMgr.FreeMem * CORE.PSFree
DevMgr.Free .DA DevMgr.FreeMem * In : A = PID to free
.DA DevMgr.HiMem *--------------------------------------
DevMgr.DevCnt .DA #0 CORE.PSFree sta .10+1 Save PS ID
DevMgr.NodCnt .DA #0
jsr CORE.GetPSByID S.PS in ZPPtr1
bcs .9
>STYA ZPPtr1
ldy #S.PS.hSS
jsr .8
ldy #S.PS.hDS
jsr .8
ldy #S.PS.hCS
jsr .8
ldy #S.PS.hARGV
jsr .8
lda (ZPPtr1) get S.PS.F
and #S.PS.F.DUPENV do we have to discard duplicated env ?
beq .1
ldy #S.PS.hENV
jsr .8
.1 ldy #S.PS.hPREFIX
jsr .8
.10 lda #$ff Self Modified
ldx #0
.2 cmp PS.Table.PID,x
beq .3
inx
cpx CORE.PSCount
bne .2
beq *
.3 stz PS.Table.PID,x
lda PS.TABLE.hPS,x
stz PS.TABLE.hPS,x
.4 jmp K.FreeMem
.8 lda (ZPPtr1),y
bne .4
.9 rts
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE USR/SRC/SYS/KERNEL.S.CORE SAVE USR/SRC/SYS/KERNEL.S.CORE

View File

@ -350,15 +350,13 @@ CORE.TickPer10t .BS 1
CORE.TickSec .BS 1 CORE.TickSec .BS 1
CORE.Tick10t .BS 1 CORE.Tick10t .BS 1
CORE.CPUStatCnt .DA #100 CORE.CPUStatCnt .DA #100
CORE.InKernelHits .BS 1
CORE.InKernelStats .BS 1
*--------------------------------------
CORE.EvtIndex .BS 1
CORE.EvtCount .BS 1
CORE.PSIndex .BS 1
CORE.PSCount .DA #0
CORE.LastPSID .DA #0 CORE.LastPSID .DA #0
CORE.hPS0 .BS 1 *--------------------------------------
DevMgr.Stat .DA DevMgr.FreeMem
DevMgr.Free .DA DevMgr.FreeMem
.DA DevMgr.HiMem
DevMgr.DevCnt .DA #0
DevMgr.NodCnt .DA #0
*-------------------------------------- *--------------------------------------
IRQ.Mode .BS 1 IRQ.Mode .BS 1
IRQ.SkipA2osX .BS 1 IRQ.SkipA2osX .BS 1

View File

@ -115,8 +115,11 @@ Kernel.Init3 sta SETALTZP
>LDYAI S.PS Select Process 0 (Kernel) >LDYAI S.PS Select Process 0 (Kernel)
jsr K.GetMem0 jsr K.GetMem0
>STYA pPs >STYA pPs
stx CORE.hPS0 stx PS.Table.hPS
lda #1
sta CORE.PSCount
>LDYAI K.STACKTOP >LDYAI K.STACKTOP
>STYA pStack >STYA pStack
@ -976,6 +979,8 @@ DevMgrInit.AddBDev
EvtMgrInit >LDYAI MSG.EVT EvtMgrInit >LDYAI MSG.EVT
>SYSCALL puts >SYSCALL puts
stz CORE.EvtCount
lda #$A5 lda #$A5
sta A2osX.TIMER16 sta A2osX.TIMER16
lda #$9B lda #$9B

View File

@ -167,22 +167,18 @@ K.IrqH.Switch inc IRQ.Tick
lda #100 lda #100
sta CORE.CPUStatCnt sta CORE.CPUStatCnt
lda CORE.InKernelHits
stz CORE.InKernelHits
stz CORE.InKernelStats
ldx #K.PS.MAX-1 ldx #K.PS.MAX-1
.1 lda PS.Table.Hits-1,x .1 lda PS.Table.Hits,x
stz PS.Table.Hits-1,x stz PS.Table.Hits,x
sta PS.Table.Stats-1,x sta PS.Table.Stats,x
dex dex
bpl .1 bpl .1
.2 lda IRQ.InKernel keep V flag set .2 lda IRQ.InKernel keep V flag set
bpl .3 bpl .3
inc CORE.InKernelHits inc PS.Table.Hits
.9 clv .9 clv
clc clc

View File

@ -91,15 +91,13 @@ PS.Exec jsr PS.CreateChild A=PID,Child S.PS at PS.NewPSPtr,PS.Load.hMem
* out : * out :
* A = PSID * A = PSID
*-------------------------------------- *--------------------------------------
PS.CreateChild ldx CORE.PSCount PS.CreateChild ldx #0
beq .3 bra .2 Skip PS0
ldx #0
.1 lda PS.Table.PID,x .1 lda PS.Table.PID,x
beq .4 Found an empty slot beq .4 Found an empty slot
inx .2 inx
cpx CORE.PSCount cpx CORE.PSCount
bne .1 bne .1