mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-22 16:31:07 +00:00
226 lines
4.7 KiB
Plaintext
226 lines
4.7 KiB
Plaintext
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
|
||
|
||
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 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 like 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
|
||
clv coming for AUX.....cancel switch
|
||
|
||
.1 pla
|
||
bpl .2
|
||
|
||
sta SETREADAUX
|
||
clv coming for AUX.....cancel switch
|
||
|
||
.2 pla
|
||
bpl .3
|
||
|
||
sta SETPAGE2
|
||
|
||
.3 bvc K.IrqHAuxLC.4 if not V, skip task switching
|
||
|
||
tsx Check Stack if before "dec IRQ.InKernel"
|
||
cpx #$fc $1ff-PChi-PClo-P = $1fc
|
||
bcs .8 in CORE.Run or CORE.Dispatch
|
||
|
||
lda $103,x
|
||
cmp /A2osX.SYSCALL
|
||
bcs .8 we are in kernel GP or LC
|
||
|
||
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
|
||
|
||
.5 lda #$60+'S'
|
||
eor SYS.BASL0+39
|
||
sta SYS.BASL0+39
|
||
|
||
.8 clc
|
||
|
||
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.IIGS lda IO.IIGS.INTFLAG
|
||
and #$08
|
||
beq K.IrqH.DEV
|
||
|
||
stz IO.IIGS.CLRVBLINT
|
||
|
||
bra K.IrqH.Switch
|
||
*--------------------------------------
|
||
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
|
||
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 #S.PS.S.RUN
|
||
bne .9
|
||
lda IRQ.InLib
|
||
bmi .9 we are in LIB, no switching
|
||
|
||
.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
|