Kernel 0.9.1 : KERNEL, Preemtive mode, task switching debugging

This commit is contained in:
Rémy GIBERT 2018-04-20 16:06:41 +01:00
parent 99072bbe8d
commit 6a25ed8ddb
6 changed files with 80 additions and 46 deletions

Binary file not shown.

Binary file not shown.

View File

@ -118,7 +118,7 @@ CS.QUIT clc
CS.END
MSG0 .AZ "ID CPU\% Flags UID PID Command Line\r\n"
MSG1 .AZ "%03d %03d\% %s %03d %03d %s\r\n"
MSG.FLAGS .AS "IRHSED-P"
MSG.FLAGS .AS "IRDQHSE2"
*--------------------------------------
.DUMMY
.OR 0

View File

@ -363,11 +363,12 @@ S.DSTAT .EQ 25
S.PS.F .EQ 0
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
S.PS.F.DUPENV .EQ %00000100
S.PS.F.PREEMPTED .EQ %00000001
S.PS.F.DOEVENT .EQ %00100000
S.PS.F.QUIT .EQ %00010000
S.PS.F.HOLD .EQ %00001000
S.PS.F.SLEEP .EQ %00000100
S.PS.F.EVENT .EQ %00000010
S.PS.F.DUPENV .EQ %00000001
S.PS.PPID .EQ 1
S.PS.PID .EQ 2
S.PS.CPID .EQ 3
@ -400,7 +401,7 @@ S.PS.ZP.DATA .EQ 26
S.PS.ZP.STACK .EQ 28
S.PS.ZP.LOCAL .EQ 30
*
S.PS .EQ S.PS.ZP+ZPBIN.SIZE
S.PS .EQ 64
*--------------------------------------
* LIB Function Indexes
*--------------------------------------

View File

@ -10,9 +10,10 @@ CORE.Run lda CORE.PSCount
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
beq .8
bne .11
jmp .8
lda PS.Table.hMem-1,x
.11 lda PS.Table.hMem-1,x
jsr K.GetMemPtr.A
>STYA pPs
@ -26,7 +27,7 @@ CORE.Run lda CORE.PSCount
bcc .8 yes, still running....
lda (pPs) get S.PS.F again
and #$FF^S.PS.F.HOLD unmark as HOLD
eor #S.PS.F.HOLD unmark as HOLD
sta (pPs)
.2 jsr CORE.PSSelect Restore at least ZP & Ptrs
@ -35,7 +36,7 @@ CORE.Run lda CORE.PSCount
bit #S.PS.F.SLEEP Is this PS sleeping?
beq .3 no, call INIT/RUN
and #$FF^S.PS.F.SLEEP unmark as SLEEP
eor #S.PS.F.SLEEP unmark as SLEEP
sta (pPS)
jsr CORE.Resume Restore PC....and JMP to
@ -46,8 +47,7 @@ CORE.Run lda CORE.PSCount
.3 bit #S.PS.F.INIT
beq .4
and #$FF^S.PS.F.INIT unmark as INIT
ora #S.PS.F.RUN mark as RUN
eor #S.PS.F.INIT+S.PS.F.RUN unmark as INIT,mark as RUN
sta (pPS)
ldx #TSKMGR.INIT
@ -76,9 +76,14 @@ CORE.Run lda CORE.PSCount
ldy #S.PS.RC give it RC
sta (ZPPtr1),y
.6 ldx #TSKMGR.QUIT Quit this process
.6 lda (pPs)
eor #S.PS.F.RUN+S.PS.F.QUIT
sta (pPs)
ldx #TSKMGR.QUIT Quit this process
jsr CORE.pCodeJmp Call QUIT function
dec IRQ.InKernel
ldy #S.PS.PID
lda (pPs),y
jsr CORE.PSFree.A
@ -218,10 +223,14 @@ CORE.GetEvents lda #Evt.Table
* CS: Not Dispatched
* CC: Event Cleared
*--------------------------------------
CORE.Dispatch lda CORE.PSCount
sta CORE.Counter
CORE.Dispatch lda CORE.EvtCount
beq .9
lda CORE.PSCount
beq .9
sta CORE.Counter
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
@ -249,9 +258,18 @@ CORE.Dispatch lda CORE.PSCount
.2 lda (pEvent) Empty event, select next
beq .3
lda (pPs)
ora #S.PS.F.DOEVENT
sta (pPs)
ldx #TSKMGR.DOEVENT
jsr CORE.pCodeJmp Call DOEVENT function
dec IRQ.InKernel
lda (pPs)
eor #S.PS.F.DOEVENT
sta (pPs)
bcs .3 not for this PS, try next event in list
jsr CORE.DestroyEvent this PS handled the EVT, destroy it...
@ -447,12 +465,15 @@ CORE.Switch php
CORE.Sleep php
clc
sei
cld
phy
ldy #S.PS.A
sta (pPs),y
lda #S.PS.F.SLEEP
adc #0 C=S.PS.F.PREEMPTED
ora (pPs)
sta (pPs)
@ -469,13 +490,16 @@ 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
plx get PC HI
inc Advance one byte because of return by RTI
bne .1
inx
.1 iny #S.PS.PC
sta (pPs),y
pla get PC HI
adc #0
txa
iny #S.PS.PC+1
sta (pPs),y
@ -489,25 +513,27 @@ CORE.Sleep php
beq .8
.1 pla
.2 pla
>PUSHA
inx
bne .1
bne .2
.8 tya push CPU Stack BC to restorre on top of Soft Stack
.8 tya push CPU Stack BC to restore on top of Soft Stack
>PUSHA
clc exit to kernel with CC
rts
*--------------------------------------
CORE.Resume >PULLA Get !BC
tax
CORE.Resume sei
>PULLA Get !BC
tay
beq .2
.1 >PULLA
pha
inx
iny
bne .1
.2 ldy #S.PS.PC+1
@ -537,8 +563,14 @@ CORE.Resume >PULLA Get !BC
inc IRQ.InKernel
rti
*--------------------------------------
CORE.pCodeJmp inc IRQ.InKernel
jmp (pCode)
CORE.pCodeJmp lda pCode+1
pha
lda pCode
pha
php
sei
inc IRQ.InKernel
rti
*--------------------------------------
TSKMGR.EVENTCNT .BS 1
*--------------------------------------

View File

@ -68,29 +68,25 @@ 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
tsx
sec
lda $105,x get RTI PC LO
sbc #1 back one byte, to make it a "RTS" return adddress
sta $105,x
bcs .1
dec $106,x adjust RTI PC HI
tsx
lda $104,x get RTI PC LO
bne .1
dec $105,x adjust RTI PC HI
.1 lda $104,x get IRQ pushed P
sta $102,x down 2 bytes
.1 dec $104,x back one byte, to make it a "RTS" return adddress
lda $103,x get IRQ pushed P
sta $101,x down 2 bytes
lda #CORE.Switch make a RTI like "jsr CORE.Sleep"
sta $103,x
sta $102,x
lda /CORE.Switch with RTS=PC IRQ-1
sta $104,x
plp
sta $103,x
K.IrqHAuxLC.4 ldy #$ff Self Modified
K.IrqHAuxLC.5 ldx #$ff Self Modified
@ -136,6 +132,10 @@ K.IrqH.Switch inc IRQ.Tick
lda IRQ.InKernel keep V flag set
bmi .9
lda (pPs)
and #S.PS.F.DOEVENT
bne .9
lda #$A0+'S
eor SYS.BASL0+37
sta SYS.BASL0+37
@ -144,6 +144,7 @@ K.IrqH.Switch inc IRQ.Tick
lda (pPs),y
inc
sta (pPs),y
bvc *
.8 clc exit with V flag set
rts