Kernel 0.9.1 : KERNEL, Preemtive mode, Working.

This commit is contained in:
Rémy GIBERT 2018-04-26 17:38:02 +02:00
parent 4ad03e1391
commit 5f215b75ad
14 changed files with 239 additions and 183 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -32,6 +32,7 @@ CS.START cld
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG0 .DA MSG0
L.MSGK .DA MSGK
L.MSG1 .DA MSG1
.DA 0
*--------------------------------------
@ -44,11 +45,17 @@ CS.RUN >LDYA pData
>LDYA L.MSG0
>SYSCALL PrintF.YA
>PUSHB.G PS.KCPU
>LDYA L.MSGK
>SYSCALL PrintF.YA
>LDA.G PS.Count
beq .8
.1 >INC.G PS.Index
>INC.G PS.Index
.1 >INC.G PS.Index
tay
lda (pData),y PID
@ -72,8 +79,10 @@ CS.RUN >LDYA pData
>PUSHEA.G PS.FLAGS
ldy #S.PS.STATS
lda (ZPPtr),y
>INC.G PS.Index
tay
lda (pData),y
>PUSHA CPU%
ldy #S.PS.PID
@ -117,14 +126,16 @@ CS.QUIT clc
*--------------------------------------
CS.END
MSG0 .AZ "ID CPU\% Flags UID PID Command Line\r\n"
MSGK .AZ "000 %03d\% -------- *KERNEL*\r\n"
MSG1 .AZ "%03d %03d\% %s %03d %03d %s\r\n"
MSG.FLAGS .AS "IRDQHSE2"
MSG.FLAGS .AS "IRQDHSed"
*--------------------------------------
.DUMMY
.OR 0
DS.START
PS.COUNT .BS 1
PS.DATA .BS K.PS.MAX
PS.KCPU .BS 1
PS.DATA .BS K.PS.MAX*2
PS.Index .BS 1
PS.FLAGS .BS 9
DS.END

View File

@ -363,8 +363,8 @@ S.DSTAT .EQ 25
S.PS.F .EQ 0
S.PS.F.INIT .EQ %10000000
S.PS.F.RUN .EQ %01000000
S.PS.F.DOEVENT .EQ %00100000
S.PS.F.QUIT .EQ %00010000
S.PS.F.QUIT .EQ %00100000
S.PS.F.DOEVENT .EQ %00010000
S.PS.F.HOLD .EQ %00001000
S.PS.F.SLEEP .EQ %00000100
S.PS.F.EVENT .EQ %00000010
@ -423,7 +423,7 @@ S.EVT.F.T1SEC .EQ %01000000
S.EVT.F.hMEM2 .EQ %00100000 Indicates That S.EVT.B2 is a hMem
S.EVT.F.hMEM1 .EQ %00010000 Indicates That S.EVT.B1 is a hMem
S.EVT.hDEV .EQ 1
*S.EVT.hDEV .EQ 1
S.EVT.B1 .EQ 2
S.EVT.B2 .EQ 3
S.EVT.W1 .EQ 4

View File

@ -21,7 +21,7 @@ CS.START cld
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #16 SS
.DA #64 SS
.DA #0 ZP
.DA 0
*--------------------------------------
@ -50,9 +50,9 @@ CS.INIT ldy #S.PS.ARGC
ldy #S.PS.hStdIn
sta (pPs),y
ldy #S.PS.hStdOut
iny #S.PS.hStdOut
sta (pPs),y
ldy #S.PS.hStdErr
iny #S.PS.hStdErr
sta (pPs),y
>STA.G hNode
@ -67,7 +67,7 @@ CS.INIT ldy #S.PS.ARGC
txa
>STA.G hBinName
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
@ -82,12 +82,13 @@ CS.INIT ldy #S.PS.ARGC
.9 rts
*--------------------------------------
CS.RUN >SLEEP
>SYSCALL GetChar
bcs CS.RUN
.11 >SLEEP
>SYSCALL GetChar
bcc .11
jsr Init.Timeout
@ -102,8 +103,7 @@ CS.RUN >SLEEP
cpy #MSG.TELNETOPT.LEN
bne .1
CS.RUN.LOOP
CS.RUN.LOOP
.1 >SLEEP
>SYSCALL GetChar
bcs .4
@ -125,6 +125,7 @@ CS.RUN.LOOP
lda (pData),y
>SYSCALL GetMemPtr.A
>SYSCALL ExecPS.YA
.9 rts
.8 clc

View File

@ -24,7 +24,8 @@ CS.START cld
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segment to Allocate
.DA 16 SS
.DA #64 SS
.DA #6 ZP
.DA 0
*--------------------------------------
* Relocation Table

View File

@ -24,7 +24,7 @@ CS.START cld
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #16 SS
.DA #64 SS
.DA #2 ZP SS
.DA 0
*--------------------------------------

View File

@ -33,7 +33,7 @@ CS.START cld
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #64 SS
.DA #0 ZP (256)
.DA #16 ZP
.DA 0
*--------------------------------------
* Relocation Table

View File

@ -3,17 +3,14 @@ PREFIX /A2OSX.BUILD
AUTO 4,1
*--------------------------------------
CORE.Run lda CORE.PSCount
sta CORE.Counter
* bne .1 SHOULD NEVER HAPPEN!!!
sta CORE.PSIndex
* jmp CORE.Events
beq CORE.Events SHOULD NEVER HAPPEN!!!
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
bne .11
jmp .8
.1 ldx CORE.PSIndex
lda PS.Table.hMem-1,x
beq .8
.11 lda PS.Table.hMem-1,x
jsr K.GetMemPtr.A
>STYA pPs
@ -30,37 +27,22 @@ CORE.Run lda CORE.PSCount
eor #S.PS.F.HOLD unmark as HOLD
sta (pPs)
.2 jsr CORE.PSSelect Restore at least ZP & Ptrs
.2 jsr CORE.PSSelect Restore ZP & Ptrs
lda (pPs) get S.PS.F again
bit #S.PS.F.SLEEP Is this PS sleeping?
beq .3 no, call INIT/RUN
eor #S.PS.F.SLEEP unmark as SLEEP
sta (pPS)
jsr CORE.Resume Restore PC....and JMP to
bra .41
.3 bit #S.PS.F.INIT
beq .4
eor #S.PS.F.INIT+S.PS.F.RUN unmark as INIT,mark as RUN
sta (pPS)
ldx #TSKMGR.INIT
.HS 2C BIT abs
.4 ldx #TSKMGR.RUN
jsr CORE.pCodeJmp Call INIT/RUN function
jsr CORE.PSExec INIT/RUN/QUIT/RESUME
dec IRQ.InKernel
.41 bcc .7 INIT/RUN/RESUME said CS=QUIT?
bcc .61 Error ?
.5 tax Yes, From INIT or RUN,save RC
.5 tax save RC
ldy #S.PS.PPID Notify Parent Process for exit code...
lda (pPs),y
beq .6 no parent process
jsr CORE.GetPSByID.A X unmodified
bcs .6 parent is dead.....skipping...
>STYA ZPPtr1
lda (ZPPtr1) Parent PS is HOLD?
@ -75,12 +57,24 @@ CORE.Run lda CORE.PSCount
sta (ZPPtr1),y
.6 lda (pPs)
eor #S.PS.F.RUN+S.PS.F.QUIT
and #$3F $ff^S.PS.F.INIT+S.PS.F.RUN
ora #S.PS.F.QUIT
sta (pPs)
bra .7
ldx #TSKMGR.QUIT Quit this process
jsr CORE.pCodeJmp Call QUIT function
dec IRQ.InKernel
.61 lda (pPs)
bit #S.PS.F.SLEEP
bne .7
bit #S.PS.F.INIT
beq .62
eor #S.PS.F.INIT+S.PS.F.RUN go from INIT to RUN
sta (pPs)
bra .7
.62 bit #S.PS.F.QUIT
beq .7
ldy #S.PS.PID
lda (pPs),y
@ -89,9 +83,8 @@ CORE.Run lda CORE.PSCount
.7 jsr CORE.PSLeave Save ZP & Ptrs
.8 dec CORE.Counter
beq CORE.Events
jmp .1
.8 dec CORE.PSIndex
bne .1
*--------------------------------------
CORE.Events jsr CORE.GetEvents
@ -110,7 +103,7 @@ CORE.Events jsr CORE.GetEvents
bmi .2 Ignore & Discard any timer event
jsr CORE.DumpEvent
* jsr CORE.DumpEvent
.2 jsr CORE.DestroyEvent
@ -227,19 +220,18 @@ CORE.Dispatch lda CORE.EvtCount
lda CORE.PSCount
beq .9
sta CORE.Counter
sta CORE.PSIndex
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
beq .5
.1 ldx CORE.PSIndex
lda PS.Table.hMem-1,x
beq .5
jsr K.GetMemPtr.A
>STYA pPS
lda (pPs) get S.PS.F
bit #S.PS.F.INIT+S.PS.F.HOLD Init or Waiting for Another Task to Terminate?
bit #S.PS.F.INIT+S.PS.F.HOLD+S.PS.F.QUIT Init or Waiting for Another Task to Terminate?
bne .5
bit #S.PS.F.EVENT Accept Events ?
@ -251,7 +243,7 @@ CORE.Dispatch lda CORE.EvtCount
sta pEvent Select first event in list
lda CORE.EvtCount
sta TSKMGR.EVENTCNT
sta CORE.EvtIndex
.2 lda (pEvent) Empty event, select next
beq .3
@ -259,11 +251,10 @@ CORE.Dispatch lda CORE.EvtCount
lda (pPs)
ora #S.PS.F.DOEVENT
sta (pPs)
ldx #TSKMGR.DOEVENT
jsr CORE.pCodeJmp Call DOEVENT function
jsr CORE.PSDoEvent
dec IRQ.InKernel
lda (pPs)
eor #S.PS.F.DOEVENT
sta (pPs)
@ -271,10 +262,11 @@ CORE.Dispatch lda CORE.EvtCount
bcs .3 not for this PS, try next event in list
jsr CORE.DestroyEvent this PS handled the EVT, destroy it...
lda CORE.EvtCount
beq .8 no more event, exit
.3 dec TSKMGR.EVENTCNT
lda CORE.EvtCount
beq .4 no more event, exit
.3 dec CORE.EvtIndex
beq .4 all EVT submitted to this PS, try other PS
lda pEvent try next EVT to this PS
@ -285,7 +277,7 @@ CORE.Dispatch lda CORE.EvtCount
.4 jsr CORE.PSLeave
.5 dec CORE.Counter
.5 dec CORE.PSIndex
bne .1
.9 sec
@ -294,9 +286,6 @@ CORE.Dispatch lda CORE.EvtCount
.8 clc
rts
*--------------------------------------
CORE.Quit clc
rts
*--------------------------------------
* PS.Free.A
* In : A = PID to free
*--------------------------------------
@ -338,7 +327,8 @@ CORE.PSFree.A sta .1+1 Save PS ID
bra *
.3 stz PS.Table.PID-1,x
lda PS.TABLE.hMem-1,x
lda PS.TABLE.hMem-1,x
stz PS.TABLE.hMem-1,x
.4 jmp K.FreeMem.A
.8 lda (ZPPtr1),y
@ -351,6 +341,7 @@ CORE.GetPSByID.A
jsr CORE.GetPSStatus.A
bcs .9
lda PS.TABLE.hMem-1,y
beq *
jmp K.GetMemPtr.A
.9 rts
*--------------------------------------
@ -370,16 +361,16 @@ CORE.GetPSStatus.A
.8 clc
rts
*--------------------------------------
CORE.DumpEvent ldy #S.EVT-1
*CORE.DumpEvent ldy #S.EVT-1
.1 >PUSHB (pEvent),y
dey
bpl .1
*.1 >PUSHB (pEvent),y
* dey
* bpl .1
>LDYAI .2
jmp K.PrintF.YA
* >LDYAI .2
* jmp K.PrintF.YA
.2 .AZ "!Evt:F=%b,Dev=$%h,LO=$%h,HI=$%h,W1=$%H,W2=$%H\n"
*.2 .AZ "!Evt:F=%b,Dev=$%h,LO=$%h,HI=$%h,W1=$%H,W2=$%H\n"
*--------------------------------------
CORE.ScrSel and #$0F
cmp A2osX.ASCREEN Same as active screen...nothing to do
@ -436,7 +427,7 @@ CORE.PSSelect0 >LDYAI CORE.S.PS0 Select PS0
*--------------------------------------
CORE.PSSelect ldy #S.PS.ZP+ZPBIN.SIZE-1
ldx #ZPBIN.SIZE-1
.1 lda (pPs),y
sta pCode,x
dey
@ -444,7 +435,7 @@ CORE.PSSelect ldy #S.PS.ZP+ZPBIN.SIZE-1
bpl .1
rts
*--------------------------------------
*--------------------------------------
CORE.PSLeave ldy #S.PS.ZP+ZPBIN.SIZE-1
ldx #ZPBIN.SIZE-1
@ -456,20 +447,85 @@ CORE.PSLeave ldy #S.PS.ZP+ZPBIN.SIZE-1
rts
*--------------------------------------
CORE.Sleep php
CORE.PSExec lda (pPS)
bit #S.PS.F.SLEEP
bne CORE.PSResume
bit #S.PS.F.RUN
bne .2
bit #S.PS.F.INIT
bne .1
ldx #TSKMGR.QUIT
.HS 2C BIT ABS
.1 ldx #TSKMGR.INIT
.HS 2C BIT ABS
.2 ldx #TSKMGR.RUN
.HS 2C BIT ABS
CORE.PSDoEvent ldx #TSKMGR.DOEVENT
lda pCode+1
pha
lda pCode
pha
php
sei
inc IRQ.InKernel
rti
*--------------------------------------
CORE.PSResume sei
eor #S.PS.F.SLEEP unmark as SLEEP
sta (pPS)
>PULLA Get !BC
tax
beq .2
.1 >PULLA
pha
inx
bne .1
.2 ldy #S.PS.PC+1
lda (pPs),y
pha
dey #S.PS.PC
lda (pPs),y
pha
dey #S.PS.P
lda (pPs),y
pha
dey #S.PS.Y
lda (pPs),y
pha
dey #S.PS.X
lda (pPs),y
tax
dey #S.PS.A
lda (pPs),y
ply
inc IRQ.InKernel
rti
*--------------------------------------
CORE.PSSleep php
sei
cld
phy
ldy #S.PS.A
sta (pPs),y
lda #S.PS.F.SLEEP
ora (pPs)
sta (pPs)
txa
iny #S.PS.X
sta (pPs),y
@ -498,92 +554,50 @@ CORE.Sleep php
tsx
inx skip P
inx skip PC HI,LO
inx
inx
inx
txa
tay Save !Byte count for later
beq .8
tay Save !Byte count for later
.2 pla
>PUSHA
inx
bne .2
tya
.8 tya push CPU Stack BC to restore on top of Soft Stack
>PUSHA
.8 >PUSHA push CPU Stack BC to restore on top of Soft Stack
clc exit to kernel with CC
rts
*--------------------------------------
CORE.Resume sei
lda (pPs)
ora #S.PS.F.SLEEP
sta (pPs)
>PULLA Get !BC
tay
beq .2
.1 >PULLA
lda #0 cld,clc,cli
pha
iny
bne .1
.2 ldy #S.PS.PC+1
lda (pPs),y
pha
dey #S.PS.PC
lda (pPs),y
pha
dey #S.PS.P
lda (pPs),y
pha
dey #S.PS.Y
lda (pPs),y
pha
dey #S.PS.X
lda (pPs),y
tax
dey #S.PS.A
lda (pPs),y
ply
inc IRQ.InKernel
rti
*--------------------------------------
CORE.pCodeJmp lda pCode+1
pha
lda pCode
pha
php
sei
inc IRQ.InKernel
rti
*--------------------------------------
TSKMGR.EVENTCNT .BS 1
rti exit to kernel with CC
*--------------------------------------
DevMgr.Stat .DA DevMgr.FreeMem
DevMgr.Free .DA DevMgr.FreeMem
.DA DevMgr.HiMem
DevMgr.Count .DA #2 NUL,SYS
*--------------------------------------
CORE.EvtCount .BS 1
CORE.VBLState .BS 1
CORE.IRQMode .BS 1
CORE.TickPerSec .BS 1
CORE.TickPer10t .BS 1
CORE.TickSec .BS 1
CORE.Tick10t .BS 1
CORE.CPUStat .BS 1
CORE.InKernelStat .BS 1
*--------------------------------------
CORE.Counter .BS 1
CORE.EvtIndex .BS 1
CORE.EvtCount .BS 1
CORE.PSIndex .BS 1
CORE.PSCount .DA #0
CORE.LastPSID .DA #0
CORE.S.PS0 .BS S.PS.hStdErr+1

View File

@ -42,7 +42,7 @@ AUTO 4,1
*--------------------------------------
* SLEEP
*--------------------------------------
jmp CORE.Sleep
jmp CORE.PSSleep
*--------------------------------------
* *** MUST BE REINTRANT ***
*--------------------------------------

View File

@ -1074,10 +1074,10 @@ MSG.Init2.OK .AZ "A2osX[Stage2]:Complete.\n"
*--------------------------------------
MSG.Init3 .AZ "A2osX[Stage3]:Init\r\n"
MSG.DEV .AZ "-Device Manager...\r\n"
MSG.IRQ .AZ "-Interrupt Manager...\r\n"
MSG.IRQ.VBL .AZ " (Mouse VBL IRQ Activated)\r\n"
MSG.IRQ.CLOCK .AZ " (Clock Card IRQ Activated)\r\n"
MSG.IRQ.POLL .AZ " (Polling Mode)\r\n"
MSG.IRQ .AZ "-Interrupt Manager..."
MSG.IRQ.VBL .AZ "Mouse VBL IRQ Activated.\r\n"
MSG.IRQ.CLOCK .AZ "Clock Card IRQ Activated.\r\n"
MSG.IRQ.POLL .AZ "Polling Mode.\r\n"
MSG.EVT .AZ "-Event Manager...\r\n"
MSG.FLT .AZ "-Path Filter...\r\n"
MSG.TSK .AZ "-Task Manager...\r\n"

View File

@ -21,8 +21,7 @@ K.IrqHAuxLC cld
pla
pha
and #$10 BRK?
bne *
* bne K.IrqHAuxLC.6
bne K.IrqHAuxLC.6
stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1
@ -68,11 +67,17 @@ K.IrqHAuxLC.3 pla
sta $ff
pla
sta $fe
bvc K.IrqHAuxLC.4 no task switching
bvc K.IrqHAuxLC.4 if V, skip task switching
tsx
txa
eor #$FC Only LO,HI & P on stack
beq K.IrqHAuxLC.4 we are in kernel CORE.Run
php
php make room for 2 additional bytes
tsx
lda $104,x get RTI PC LO
@ -84,10 +89,14 @@ K.IrqHAuxLC.3 pla
lda $103,x get IRQ pushed P
sta $101,x down 2 bytes
lda #CORE.Sleep make a RTI like "jsr CORE.Sleep"
lda #CORE.PSSleep make a RTI like "jsr CORE.Sleep"
sta $102,x
lda /CORE.Sleep with RTS=PC IRQ-1
lda /CORE.PSSleep with RTS=PC IRQ-1
sta $103,x
lda #$A0+'S
eor SYS.BASL0+37
sta SYS.BASL0+37
K.IrqHAuxLC.4 ldy #$ff Self Modified
K.IrqHAuxLC.5 ldx #$ff Self Modified
@ -127,32 +136,41 @@ K.IrqH.VBL jsr IRQ.VBL.MSM SERVEMOUSE
*--------------------------------------
K.IrqH.Switch inc IRQ.Tick
dec CORE.CPUStat
bne .2
lda #100
sta CORE.CPUStat
stz CORE.InKernelStat
ldx CORE.PSCount
.1 stz PS.Table.Stat-1,x
dex
bne .1
.2 lda IRQ.InKernel keep V flag set
bpl .3
inc CORE.InKernelStat
.9 clv
clc
rts
.3 ldx CORE.PSIndex
inc PS.Table.Stat-1,x
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
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
* ldy #S.PS.STATS
* lda (pPs),y
* inc
* sta (pPs),y
bvc *
.8 clc exit with V flag set
rts
.9 clv
clc
rts
*--------------------------------------
K.IrqH.DEV >LDYAI Dev.Table
>STYA $fe

View File

@ -303,6 +303,7 @@ PS.Init jsr BIN.Load.YA Y,A=filename full path
.2 ldy #H.BIN.EXE.SS.SIZE
lda (ZPPtr4),y Load SS.SIZE
ldy #S.PS.ZP.STACK
sta (ZPPtr3),y save pStack LO...
@ -393,7 +394,11 @@ K.GetPSStatus.A jsr CORE.GetPSByID.A
K.GetPSList.YA >STYA ZPPtr1
ldx #0
ldy #0
ldy #1
lda CORE.InKernelStat
sta (ZPPtr1),y
iny
.1 lda PS.Table.PID,x
beq .2
@ -401,12 +406,18 @@ K.GetPSList.YA >STYA ZPPtr1
lda PS.Table.hMem,x
iny
sta (ZPPtr1),y
lda PS.Table.Stat,x
iny
sta (ZPPtr1),y
.2 inx
cpx CORE.PSCount
bne .1
.9 tya
lsr
dec
sta (ZPPtr1)
rts
*--------------------------------------