A2osX/SYS/KERNEL.S.IRQ.txt

236 lines
4.7 KiB
Plaintext
Raw Normal View History

2017-12-22 21:24:30 +00:00
NEW
2019-05-25 19:24:07 +00:00
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?
2018-07-25 15:26:14 +00:00
* bne K.IrqHAuxLC.BRK
bne *
stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1
2019-07-16 15:42:36 +00:00
* lda $fe Save 2 bytes in ZP
* pha
* lda $ff
* pha
2018-12-17 07:02:03 +00:00
lda RDPAGE2
pha
sta CLRPAGE2
lda RDREADAUX
pha
2018-07-11 15:13:29 +00:00
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
2018-12-17 07:02:03 +00:00
bpl .3
sta SETPAGE2
2019-07-16 15:42:36 +00:00
.3
* pla
* sta $ff
* pla
* sta $fe
bvc K.IrqHAuxLC.4 if V, skip task switching
2019-03-27 21:14:40 +00:00
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
2018-12-17 07:02:03 +00:00
bne .4
dec $105,x adjust RTI PC HI
2018-12-17 07:02:03 +00:00
.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
2018-12-17 07:02:03 +00:00
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 :
2017-10-27 14:56:46 +00:00
* - Kernel K.IrqHAuxLC
* - ProDOS IRQ Manager (GP)
*--------------------------------------
2017-10-27 14:56:46 +00:00
K.IrqH.TCLOCK ldy IRQ.VBL.n0
lda $c080,y
and #$20
2017-10-27 14:56:46 +00:00
beq K.IrqH.DEV
lda $c088,y
2018-12-01 19:39:44 +00:00
lda $c080,y
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.VBL
K.IrqH.VBL.MSM jsr $FFFF SELF MODIFIED,SERVEMOUSE
2017-11-23 16:51:52 +00:00
bcs K.IrqH.DEV Not From Mouse
2017-10-27 14:56:46 +00:00
ldx IRQ.VBL.0n
lda MOUSESTSx,x
and #MOUSESTSx.INTVBL IRQ was caused by VBL ?
2017-10-27 14:56:46 +00:00
beq K.IrqH.DEV
ldx K.IrqH.VBL.MRM+2 $Cn
2017-10-27 14:56:46 +00:00
ldy IRQ.VBL.n0
K.IrqH.VBL.MRM jsr $FFFF SELF MODIFIED,READMOUSE
*--------------------------------------
K.IrqH.Switch inc IRQ.Tick
2018-10-17 15:31:29 +00:00
dec CORE.CPUStatCnt
bne .2
lda #100
2018-10-17 15:31:29 +00:00
sta CORE.CPUStatCnt
2018-10-15 15:39:21 +00:00
ldx #K.PS.MAX-1
2019-01-24 13:53:29 +00:00
.1 lda PS.Table.Hits,x
stz PS.Table.Hits,x
sta PS.Table.Stats,x
dex
2018-10-15 15:39:21 +00:00
bpl .1
.2 lda IRQ.InKernel keep V flag set
bpl .3
2019-01-24 13:53:29 +00:00
inc PS.Table.Hits
.9 clv
clc
rts
.3 ldx CORE.PSIndex
2018-10-17 15:31:29 +00:00
inc PS.Table.Hits,x
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
2019-07-22 16:28:44 +00:00
ldy #S.PS.S
lda (pPs),y
eor #PS.DOEVENT Dont switch while DOEVENT
bne .9
.8 clc exit with V flag set
rts
*--------------------------------------
2018-07-05 15:39:36 +00:00
K.IrqH.DEV ldx #0
2018-10-11 15:23:06 +00:00
.1 lda IRQ.Vectors+1,x
beq .9
2018-07-05 15:39:36 +00:00
2019-07-16 15:42:36 +00:00
sta .10+2
2018-10-11 15:23:06 +00:00
lda IRQ.Vectors,x
2018-07-10 15:33:13 +00:00
sta .10+1
2018-07-05 15:39:36 +00:00
2018-07-10 15:33:13 +00:00
phx
2018-07-05 15:39:36 +00:00
.10 jsr $ffff SELF MODIFIED
plx
bcc .8 CC, IRQ cleared by device
2018-07-05 15:39:36 +00:00
.2 inx
2018-10-11 15:23:06 +00:00
inx
2018-10-11 15:23:06 +00:00
.3 cpx #K.IRQDEV.MAX*2
bne .1
2018-10-11 15:23:06 +00:00
.9 sec
.8 clv clear V (no task switching)
rts
*--------------------------------------
2019-08-01 14:59:15 +00:00
IRQ.Vectors .BS K.IRQDEV.MAX*2
*--------------------------------------
MAN
2018-11-17 17:17:13 +00:00
SAVE USR/SRC/SYS/KERNEL.S.IRQ
LOAD USR/SRC/SYS/KERNEL.S
ASM