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