mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-19 23:29:29 +00:00
Kernel 0.9.1 : KERNEL, Preemtive mode, task switching debugging
This commit is contained in:
parent
99072bbe8d
commit
6a25ed8ddb
Binary file not shown.
Binary file not shown.
@ -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
|
||||||
|
@ -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
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
@ -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
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user