NEW PREFIX AUTO 4,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 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 sta $ff pla sta $fe bvc K.IrqHAuxLC.4 if V, skip task 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 .3 dec $105,x adjust RTI PC HI .3 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+37 sta SYS.BASL0+37 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 $c080,y lda $c088,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 lda CORE.InKernelHits stz CORE.InKernelHits stz CORE.InKernelStats ldx #K.PS.MAX-1 .1 lda PS.Table.Hits-1,x stz PS.Table.Hits-1,x sta PS.Table.Stats-1,x dex bpl .1 .2 lda IRQ.InKernel keep V flag set bpl .3 inc CORE.InKernelHits .9 clv clc rts .3 ldx CORE.PSIndex inc PS.Table.Hits,x bit A2osX.F A2osX.F.PMODE .EQ %01000000 bvc .8 lda (pPs) and #S.PS.F.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 $ff lda IRQ.Vectors,x sta $fe ldy #S.FD.DEV.DRVPTR lda ($fe),y sta .10+1 iny lda ($fe),y sta .10+2 phx ldx #IOCTL.IRQ .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