A2osX/SYS/KERNEL.S.IRQ.txt
2019-07-22 18:28:44 +02:00

236 lines
4.7 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
AUTO 3,1
*--------------------------------------
* called directly by IRQ Vector $FFFE in AuxLC
* Must keep:
* A,X,Y
* SETREADAUX
* if we are here, Aux ZP/Stack already On
* Exit with RTI
* if A2osX Drivers cannot clear IRQ,
* must call regular System Handler
*--------------------------------------
MSLOT .EQ $7f8
*--------------------------------------
K.IrqHAuxLC.BRK jmp K.IrqHAuxLC.6
*--------------------------------------
K.IrqHAuxLC cld
sec
sta K.IrqHAuxLC.6+1
pla
pha
and #$10 BRK?
* bne K.IrqHAuxLC.BRK
bne *
stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1
* lda $fe Save 2 bytes in ZP
* pha
* lda $ff
* pha
lda RDPAGE2
pha
sta CLRPAGE2
lda RDREADAUX
pha
sta CLRREADAUX Make sure we can access FD.Table
lda RDWRITEAUX
pha
sta CLRWRITEAUX Driver may R/W in screen holes
lda MSLOT Save MSLOT
pha
lda RDCXROM
pha
sta CLRCXROM Enable access to slot C800 space
K.IrqHAuxLC.JSR jsr K.IrqH.DEV SELF MODIFIED
ldx #CLRCXROM
pla Get CXROM State
bpl .3
inx
.3 sta $C000,x
pla Get back MSLOT
sta MSLOT
sta K.IrqHAuxLC.2+2
and #$F0
eor #$C0 ....mmm...not looking link Cn....
bne K.IrqHAuxLC.3
sta $CFFF Release $C800
K.IrqHAuxLC.2 lda $ff00 SELF MODIFIED
K.IrqHAuxLC.3 pla Must keep Carry
bpl .1
sta SETWRITEAUX
.1 pla
bpl .2
sta SETREADAUX
.2 pla
bpl .3
sta SETPAGE2
.3
* pla
* sta $ff
* pla
* sta $fe
bvc K.IrqHAuxLC.4 if V, skip task switching
bit IRQ.InLib
bmi K.IrqHAuxLC.4 we are in LIB, no 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
bne .4
dec $105,x adjust RTI PC HI
.4 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 #A2osX.SLEEP make a RTI like "jsr A2osX.SLEEP"
sta $102,x
lda /A2osX.SLEEP with RTS=PC IRQ-1
sta $103,x
lda #$A0+'S
eor SYS.BASL0+39
sta SYS.BASL0+39
K.IrqHAuxLC.4 ldy #$ff Self Modified
K.IrqHAuxLC.5 ldx #$ff Self Modified
K.IrqHAuxLC.6 lda #$ff Self Modified
bcc K.IrqHAuxLC.8
dec IRQ.SkipA2osX Make regular ProDOS IRQ manager skip A2osX
K.IrqHAuxLC.JMP jmp $FFFF SELF MODIFIED Not handled, pass to ProDOS
K.IrqHAuxLC.8 rti
*--------------------------------------
* Called by :
* - Kernel K.IrqHAuxLC
* - ProDOS IRQ Manager (GP)
*--------------------------------------
K.IrqH.TCLOCK ldy IRQ.VBL.n0
lda $c080,y
and #$20
beq K.IrqH.DEV
lda $c088,y
lda $c080,y
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.VBL
K.IrqH.VBL.MSM jsr $FFFF SELF MODIFIED,SERVEMOUSE
bcs K.IrqH.DEV Not From Mouse
ldx IRQ.VBL.0n
lda MOUSESTSx,x
and #MOUSESTSx.INTVBL IRQ was caused by VBL ?
beq K.IrqH.DEV
ldx K.IrqH.VBL.MRM+2 $Cn
ldy IRQ.VBL.n0
K.IrqH.VBL.MRM jsr $FFFF SELF MODIFIED,READMOUSE
*--------------------------------------
K.IrqH.Switch inc IRQ.Tick
dec CORE.CPUStatCnt
bne .2
lda #100
sta CORE.CPUStatCnt
ldx #K.PS.MAX-1
.1 lda PS.Table.Hits,x
stz PS.Table.Hits,x
sta PS.Table.Stats,x
dex
bpl .1
.2 lda IRQ.InKernel keep V flag set
bpl .3
inc PS.Table.Hits
.9 clv
clc
rts
.3 ldx CORE.PSIndex
inc PS.Table.Hits,x
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
ldy #S.PS.S
lda (pPs),y
eor #PS.DOEVENT Dont switch while DOEVENT
bne .9
.8 clc exit with V flag set
rts
*--------------------------------------
K.IrqH.DEV ldx #0
.1 lda IRQ.Vectors+1,x
beq .9
sta .10+2
lda IRQ.Vectors,x
sta .10+1
phx
.10 jsr $ffff SELF MODIFIED
plx
bcc .8 CC, IRQ cleared by device
.2 inx
inx
.3 cpx #K.IRQDEV.MAX*2
bne .1
.9 sec
.8 clv clear V (no task switching)
rts
*--------------------------------------
IRQ.Vectors .BS K.IRQDEV.MAX*2
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.IRQ
LOAD USR/SRC/SYS/KERNEL.S
ASM