Kernel 0.9.1 : KERNEL, Preemtive mode, task switching (wip)

This commit is contained in:
Rémy GIBERT 2018-04-12 16:45:31 +01:00
parent c67f94ce08
commit 644992f281
8 changed files with 67 additions and 27 deletions

Binary file not shown.

Binary file not shown.

View File

@ -83,6 +83,10 @@ CS.RUN >LDYA pData
>PUSHEA.G PS.FLAGS
ldy #S.PS.STATS
lda (ZPPtr),y
>PUSHA CPU%
ldy #S.PS.PID
lda (ZPPtr),y
>PUSHA PID
@ -95,7 +99,7 @@ CS.RUN >LDYA pData
.8
* lda #0 tell Kernel that all done ok, but
sec we do not want to stay in memory
rts
rts
*--------------------------------------
CS.DOEVENT sec
rts
@ -104,9 +108,9 @@ CS.QUIT clc
rts
*--------------------------------------
CS.END
MSG0 .AZ "ID Flags PID Command Line\r\n"
MSG1 .AZ "%03d %s %03d %s\r\n"
MSG.FLAGS .AS "-IHSED--"
MSG0 .AZ "ID CPU\% Flags PID Command Line\r\n"
MSG1 .AZ "%03d %03d\% %s %03d %s\r\n"
MSG.FLAGS .AS "IRHSED--"
*--------------------------------------
.DUMMY
.OR 0

View File

@ -361,7 +361,8 @@ S.DSTAT .EQ 25
* PS STRUCT
*--------------------------------------
S.PS.F .EQ 0
S.PS.F.INIT .EQ %01000000
S.PS.F.INIT .EQ %10000000
S.PS.F.RUN .EQ %01000000
S.PS.F.HOLD .EQ %00100000
S.PS.F.SLEEP .EQ %00010000
S.PS.F.EVENT .EQ %00001000
@ -389,6 +390,8 @@ S.PS.P .EQ 19
S.PS.PC .EQ 20 WORD
S.PS.S .EQ 22
S.PS.STATS .EQ 23
S.PS.ZP .EQ 24
S.PS.ZP.CODE .EQ 24

View File

@ -14,7 +14,7 @@ CORE.Run lda CORE.PSCount
lda PS.Table.hMem-1,x
jsr K.GetMemPtr.A
>STYA pPS
>STYA pPs
lda (pPs) get S.PS.F
bit #S.PS.F.HOLD Waiting for Another Task to Terminate?
@ -47,6 +47,7 @@ CORE.Run lda CORE.PSCount
beq .4
and #$FF^S.PS.F.INIT unmark as INIT
ora #S.PS.F.RUN mark as RUN
sta (pPS)
ldx #TSKMGR.INIT
@ -54,6 +55,7 @@ CORE.Run lda CORE.PSCount
.4 ldx #TSKMGR.RUN
jsr pCodeJmp Call INIT/RUN function
dec IRQ.InKernel
bcc .7 INIT/RUN/RESUME said CS=QUIT?
.5 tax save RC
@ -76,7 +78,7 @@ CORE.Run lda CORE.PSCount
.6 ldx #TSKMGR.QUIT Quit this process
jsr pCodeJmp Call QUIT function
dec IRQ.InKernel
ldy #S.PS.PID
lda (pPs),y
jsr CORE.PSFree.A
@ -249,6 +251,7 @@ CORE.Dispatch lda CORE.PSCount
ldx #TSKMGR.DOEVENT
jsr pCodeJmp Call DOEVENT function
dec IRQ.InKernel
bcs .3 not for this PS, try next event in list
jsr CORE.DestroyEvent this PS handled the EVT, destroy it...
@ -275,7 +278,16 @@ CORE.Dispatch lda CORE.PSCount
.8 clc
rts
*--------------------------------------
pCodeJmp jmp (pCode)
pCodeJmp lda pCode+1
pha
lda pCode
pha
php
sei
inc IRQ.InKernel
rti
jmp (pCode)
*--------------------------------------
CORE.Quit clc
rts
@ -440,6 +452,8 @@ CORE.PSLeave ldy #S.PS.ZP+ZPBIN.SIZE-1
rts
*--------------------------------------
CORE.Sleep php
dec IRQ.InKernel
phy
ldy #S.PS.A
sta (pPs),y
@ -457,10 +471,13 @@ CORE.Sleep php
sta (pPs),y
pla get PC LO
clc
adc #1 Advance one byte because of return by RTI
iny #S.PS.PC
sta (pPs),y
pla get PC HI
adc #0
iny #S.PS.PC+1
sta (pPs),y
@ -483,8 +500,7 @@ CORE.Sleep php
.8 lda (pPs)
ora #S.PS.F.SLEEP
sta (pPs)
clc exit to kernel with CC
rts
*--------------------------------------
@ -523,8 +539,9 @@ CORE.Resume ldy #S.PS.S
lda (pPs),y
ply
plp
rts
sei
inc IRQ.InKernel
rti
*--------------------------------------
TSKMGR.EVENTCNT .BS 1
*--------------------------------------
@ -547,7 +564,7 @@ CORE.Tick10t .BS 1
CORE.Counter .BS 1
CORE.PSCount .DA #0
CORE.LastPSID .DA #0
CORE.S.PS0 .BS S.PS.PC+2
CORE.S.PS0 .BS S.PS.hARGS+1
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.CORE

View File

@ -49,16 +49,26 @@ AUTO 4,1
GP.SysCall dec IRQ.InKernel
bit K.SYSCALL.BANK,x
bpl .8 in $E000, no BNK change
bmi .1
sta .7+1 save A (Func Arg)
jsr .8 in $E000, no BNK change
inc IRQ.InKernel
rts
.1 sta .7+1 save A (Func Arg)
lda K.SYSCALL.BANK,x Get Target BNK
cmp $D000 #RRAMWRAMBNK1 or #RRAMWRAMBNK2
beq .7 same as actual BNK...go restore A and JMP
bne .2
stx .6+1 save X (Func ID)
jsr .7 same as actual BNK...go restore A and JMP
inc IRQ.InKernel
rts
.2 stx .6+1 save X (Func ID)
tax set Target BNK in x
lda $D000 get source BNK

View File

@ -583,6 +583,8 @@ IrqMgrInit >LDYAI MSG.IRQ
lda K.MLI.PARAMS+1
sta IRQ.INTNUM
lda #$ff
sta IRQ.InKernel
plp
jsr IrqMgrInit.TClock

View File

@ -14,12 +14,14 @@ AUTO 4,1
MSLOT .EQ $7f8
*--------------------------------------
K.IrqHAuxLC cld
sec
sta K.IrqHAuxLC.6+1
pla
pha
and #$10 BRK?
bne K.IrqHAuxLC.7
bne K.IrqHAuxLC.6
stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1
@ -66,7 +68,7 @@ K.IrqHAuxLC.3 pla
pla
sta $fe
bvc K.IrqHAuxLC.4 no task switching
php
php make room for 2 additional bytes
php keep track of C
@ -91,13 +93,11 @@ K.IrqHAuxLC.3 pla
K.IrqHAuxLC.4 ldy #$ff Self Modified
K.IrqHAuxLC.5 ldx #$ff Self Modified
K.IrqHAuxLC.6 lda #$ff Self Modified
bcs K.IrqHAuxLC.8 not handled, pass to ProDOS
rti
bcc K.IrqHAuxLC.8
K.IrqHAuxLC.7 lda K.IrqHAuxLC.6+1
K.IrqHAuxLC.8 dec IRQ.SkipA2osX Make regular ProDOS IRQ manager skip A2osX
jmp (K.IRQ.OldFFFE)
dec IRQ.SkipA2osX Make regular ProDOS IRQ manager skip A2osX
jmp (K.IRQ.OldFFFE) Not handled, pass to ProDOS
K.IrqHAuxLC.8 rti
*--------------------------------------
* Called by :
* - Kernel K.IrqHAuxLC
@ -130,9 +130,9 @@ K.IrqH.Switch inc IRQ.Tick
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
lda IRQ.InKernel keep V flag set
bmi .8
bmi .9
lda #$A0+'S
eor SYS.BASL0+37
@ -140,6 +140,10 @@ K.IrqH.Switch inc IRQ.Tick
.8 clc exit with V flag set
rts
.9 clv
clc
rts
*--------------------------------------
K.IrqH.DEV >LDYAI Dev.Table
>STYA $fe