mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-03 05:55:42 +00:00
Kernel 0.9.1 : KERNEL, Preemtive mode, task switching (wip)
This commit is contained in:
parent
c67f94ce08
commit
644992f281
Binary file not shown.
Binary file not shown.
12
BIN/PS.S.txt
12
BIN/PS.S.txt
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user