A2osX/SYS/KERNEL.S.CORE.txt

570 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
*--------------------------------------
CORE.Run lda CORE.PSCount
sta CORE.Counter
bne .1 SHOULD NEVER HAPPEN!!!
jmp CORE.Events
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
beq .8
lda PS.Table.hMem-1,x
jsr K.GetMemPtr.A
>STYA pPs
lda (pPs) get S.PS.F
bit #S.PS.F.HOLD Waiting for Another Task to Terminate?
beq .2
ldy #S.PS.CPID
lda (pPs),y
jsr CORE.GetPSStatus.A
bcc .8 yes, still running....
lda (pPs) get S.PS.F again
and #$FF^S.PS.F.HOLD unmark as HOLD
sta (pPs)
.2 jsr CORE.PSSelect Restore at least ZP & Ptrs
lda (pPs) get S.PS.F again
bit #S.PS.F.SLEEP Is this PS sleeping?
beq .3 no, call INIT/RUN
and #$FF^S.PS.F.SLEEP unmark as SLEEP
sta (pPS)
jsr CORE.Resume Restore PC....and JMP to
dec IRQ.InKernel
bcc .7
bcs .5
.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
sta (pPS)
ldx #TSKMGR.INIT
.HS 2C BIT abs
.4 ldx #TSKMGR.RUN
jsr CORE.pCodeJmp Call INIT/RUN function
dec IRQ.InKernel
bcc .7 INIT/RUN/RESUME said CS=QUIT?
.5 tax save RC
ldy #S.PS.PPID Notify Parent Process for exit code...
lda (pPs),y
jsr CORE.GetPSByID.A X unmodified
bcs .6 parent is dead.....skipping...
>STYA ZPPtr1
lda (ZPPtr1) Parent PS is HOLD?
bit #S.PS.F.HOLD
beq .6 no...
eor #S.PS.F.HOLD yes, release hold...
sta (ZPPtr1)
txa ...probably waiting for this PS to terminate....
ldy #S.PS.RC give it RC
sta (ZPPtr1),y
.6 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
bra .8
.7 jsr CORE.PSLeave Save ZP & Ptrs
.8 dec CORE.Counter
beq CORE.Events
jmp .1
*--------------------------------------
CORE.Events jsr CORE.GetEvents
bcs .4 CS=no event
jsr CORE.Dispatch
bcc .4 CC=All Events Dispatched
jsr CORE.PSSelect0
lda #Evt.Table
sta pEvent
.1 lda (pEvent)
beq .3
bmi .2 Ignore & Discard any timer event
jsr CORE.DumpEvent
.2 jsr CORE.DestroyEvent
.3 lda pEvent
clc
adc #S.EVT
sta pEvent
lda CORE.EvtCount
bne .1
*--------------------------------------
.4 bit OPENAPPLE
bpl .8
lda KBD
bpl .8
cmp #"1"
bcc .8
cmp #"5"
bcs .8
sta KBDSTROBE
jsr CORE.ScrSel
.8 jmp CORE.Run
*--------------------------------------
* CORE.GetEvents :
* IN :
* OUT :
* CS = no event, A = ERROR
* CC * event in YA
* (pEvent)
*--------------------------------------
CORE.GetEvents lda #Evt.Table
sta pEvent point to start of event list
stz CORE.EvtCount reset Size
bit CORE.IRQMode do we have IRQ enabled for Ticks ?
bpl .1 no, regular poll
lda IRQ.Tick a Tick ?
beq .8 no, no event
dec IRQ.Tick
bra .2
.1 lda VBL get VLINE status
tax
eor CORE.VBLState
bpl .8 no change,no tick
txa
sta CORE.VBLState save new
bpl .8 Up2down transition,no tick
.2 lda #0
dec CORE.TickSec
bne .3 not yet One Sec
lda SYS.BASL0+38
eor #$C0
sta SYS.BASL0+38
ldx CORE.TickPerSec
stx CORE.TickSec
lda #S.EVT.F.T1SEC
bra .4 Force Resync T1 & T10...
.3 dec CORE.Tick10t
bne .6
.4 inc A2osX.TIMER16
bne .5
inc A2osX.TIMER16+1
.5 ldx CORE.TickPer10t
stx CORE.Tick10t
ora #S.EVT.F.T10TH
.6 tax Finally, do we have an event ?
beq .8 no....
sta (pEvent)
inc CORE.EvtCount Add one event to Queue
* lda pEvent
* clc
* adc #S.EVT
* sta pEvent if CS, EVT queue full!!! ($100)
* MORE EVENT PROCESSING HERE
.8 lda CORE.EvtCount if 0, exit with CS (from cmp), and A=0 "no event"
beq .9
clc
rts
.9 sec
rts
*--------------------------------------
* CORE.Dispatch
* IN:
* OUT:
* CS: Not Dispatched
* CC: Event Cleared
*--------------------------------------
CORE.Dispatch lda CORE.PSCount
sta CORE.Counter
beq .9
.1 ldx CORE.Counter
lda PS.Table.PID-1,x
beq .5
lda PS.Table.hMem-1,x
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?
bne .5
bit #S.PS.F.EVENT Accept Events ?
beq .5
jsr CORE.PSSelect
lda #Evt.Table
sta pEvent Select first event in list
lda CORE.EvtCount
sta TSKMGR.EVENTCNT
.2 lda (pEvent) Empty event, select next
beq .3
ldx #TSKMGR.DOEVENT
jsr CORE.pCodeJmp Call DOEVENT function
dec IRQ.InKernel
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
beq .4 all EVT submitted to this PS, try other PS
lda pEvent try next EVT to this PS
clc
adc #S.EVT
sta pEvent
bra .2
.4 jsr CORE.PSLeave
.5 dec CORE.Counter
bne .1
.9 sec
rts
.8 clc
rts
*--------------------------------------
CORE.Quit clc
rts
*--------------------------------------
* PS.Free.A
* In : A = PID to free
*--------------------------------------
CORE.PSFree.A sta .1+1 Save PS ID
jsr CORE.GetPSByID.A PS in ZPPtr1
bcs .9
>STYA ZPPtr1
ldy #S.PS.hSS
jsr .8
ldy #S.PS.hDS
jsr .8
ldy #S.PS.hCS
jsr .8
ldy #S.PS.hARGS
jsr .8
lda (ZPPtr1) get S.PS.F
and #S.PS.F.DUPENV do we have to discard duplicated env & prefix ?
beq .1
ldy #S.PS.hENV
jsr .8
ldy #S.PS.hPREFIX
jsr .8
.1 lda #$ff Self Modified
ldx CORE.PSCount
.2 cmp PS.Table.PID-1,x
beq .3
dex
bne .2
bra *
.3 stz PS.Table.PID-1,x
lda PS.TABLE.hMem-1,x
.4 jmp K.FreeMem.A
.8 lda (ZPPtr1),y
bne .4
.9 rts
*--------------------------------------
* X unmodofied
*--------------------------------------
CORE.GetPSByID.A
jsr CORE.GetPSStatus.A
bcs .9
lda PS.TABLE.hMem-1,y
jmp K.GetMemPtr.A
.9 rts
*--------------------------------------
CORE.GetPSStatus.A
ldy CORE.PSCount
beq .9
.1 cmp PS.Table.PID-1,y
beq .8
dey
bne .1
.9 lda #K.E.NSP
sec
rts
.8 clc
rts
*--------------------------------------
CORE.DumpEvent ldy #S.EVT-1
.1 >PUSHB (pEvent),y
dey
bpl .1
>LDYAI .2
jmp K.PrintF.YA
.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
beq .8
tax
lda A2osX.SCRNDEVS-1,x
beq .8 No device claimed this screen
jsr K.GetDevByID.A x unmodified.....
bcs .8 ???
stx A2osX.ASCREEN
>STYA .1+1
ldx #DEVMGR.CONTROL
.1 jmp $ffff SELF MODIFED
.8 rts
*--------------------------------------
CORE.DestroyEvent
lda (pEvent)
beq .9
bit #S.EVT.F.hMEM1
beq .1
pha
ldy #S.EVT.B1
lda (pEvent),y
jsr K.FreeMem.A
pla
.1 bit #S.EVT.F.hMEM2
beq .2
ldy #S.EVT.B2
lda (pEvent),y
jsr K.FreeMem.A
.2 lda #0
sta (pEvent)
dec CORE.EvtCount
.9 rts
*--------------------------------------
CORE.PSSelect0 >LDYAI CORE.S.PS0 Select PS0
>STYA pPs
>LDYAI K.STACKTOP
>STYA pStack
rts
*--------------------------------------
CORE.PSSelect ldy #S.PS.ZP+ZPBIN.SIZE-1
ldx #ZPBIN.SIZE-1
.1 lda (pPs),y
sta pCode,x
dey
dex
bpl .1
rts
*--------------------------------------
CORE.PSLeave ldy #S.PS.ZP+ZPBIN.SIZE-1
ldx #ZPBIN.SIZE-1
.1 lda pCode,x
sta (pPs),y
dey
dex
bpl .1
rts
*--------------------------------------
CORE.Switch php
sec
.HS 2C BIT ABS
*--------------------------------------
CORE.Sleep php
clc
phy
ldy #S.PS.A
sta (pPs),y
lda #S.PS.F.SLEEP
adc #0 C=S.PS.F.PREEMPTED
ora (pPs)
sta (pPs)
txa
iny #S.PS.X
sta (pPs),y
pla
iny #S.PS.Y
sta (pPs),y
pla
iny #S.PS.P
sta (pPs),y
pla get PC LO
clc
adc #1 Advance one byte because of return by RTI
iny #S.PS.PC
sta (pPs),y
pla get PC HI
adc #0
iny #S.PS.PC+1
sta (pPs),y
tsx
inx
inx
inx
txa
tay Save !Byte count for later
beq .8
.1 pla
>PUSHA
inx
bne .1
.8 tya push CPU Stack BC to restorre on top of Soft Stack
>PUSHA
clc exit to kernel with CC
rts
*--------------------------------------
CORE.Resume >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.pCodeJmp inc IRQ.InKernel
jmp (pCode)
*--------------------------------------
TSKMGR.EVENTCNT .BS 1
*--------------------------------------
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.Counter .BS 1
CORE.PSCount .DA #0
CORE.LastPSID .DA #0
CORE.S.PS0 .BS S.PS.STATS+1
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.CORE
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM