mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-05 23:30:15 +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
|
||||
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
|
||||
|
@ -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
|
||||
*--------------------------------------
|
||||
|
@ -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
|
||||
*--------------------------------------
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user