diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 94940c0b..d6ad568c 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index acf81f59..480811a0 100644 Binary files a/.Floppies/A2OSX.SRC.po and b/.Floppies/A2OSX.SRC.po differ diff --git a/BIN/PS.S.txt b/BIN/PS.S.txt index bd41e503..d0f506fb 100644 --- a/BIN/PS.S.txt +++ b/BIN/PS.S.txt @@ -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 diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index d9d30060..59faa0dd 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -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 *-------------------------------------- diff --git a/SYS/KERNEL.S.CORE.txt b/SYS/KERNEL.S.CORE.txt index 334fd64c..50e92386 100644 --- a/SYS/KERNEL.S.CORE.txt +++ b/SYS/KERNEL.S.CORE.txt @@ -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 *-------------------------------------- diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt index 28b88d87..8ae58dc1 100644 --- a/SYS/KERNEL.S.IRQ.txt +++ b/SYS/KERNEL.S.IRQ.txt @@ -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