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 CS.END
MSG0 .AZ "ID CPU\% Flags UID PID Command Line\r\n" MSG0 .AZ "ID CPU\% Flags UID PID Command Line\r\n"
MSG1 .AZ "%03d %03d\% %s %03d %03d %s\r\n" MSG1 .AZ "%03d %03d\% %s %03d %03d %s\r\n"
MSG.FLAGS .AS "IRHSED-P" MSG.FLAGS .AS "IRDQHSE2"
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY
.OR 0 .OR 0

View File

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

View File

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

View File

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