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

View File

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

View File

@ -49,16 +49,26 @@ AUTO 4,1
GP.SysCall dec IRQ.InKernel GP.SysCall dec IRQ.InKernel
bit K.SYSCALL.BANK,x 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 lda K.SYSCALL.BANK,x Get Target BNK
cmp $D000 #RRAMWRAMBNK1 or #RRAMWRAMBNK2 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 tax set Target BNK in x
lda $D000 get source BNK lda $D000 get source BNK

View File

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

View File

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