mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 08:05:30 +00:00
133 lines
2.7 KiB
Plaintext
133 lines
2.7 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
* called directly by IRQ Vector $FFFE in AuxLC
|
||
* Must keep:
|
||
* A,X,Y
|
||
* IO.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
|
||
*--------------------------------------
|
||
*IRQ.BRK jmp IRQ.6
|
||
*--------------------------------------
|
||
IRQ.Handler cld
|
||
|
||
sta IRQ.6+1
|
||
pla
|
||
pha
|
||
and #$10 BRK?
|
||
* bne IRQ.BRK
|
||
bne *
|
||
|
||
stx IRQ.5+1
|
||
sty IRQ.4+1
|
||
|
||
lda IO.RD80STORE
|
||
and IO.RDPAGE2
|
||
pha
|
||
sta IO.CLRPAGE2
|
||
|
||
lda IO.RDREADAUX
|
||
pha
|
||
sta IO.CLRREADAUX Make sure we can access FD.Table
|
||
|
||
lda IO.RDWRITEAUX
|
||
pha
|
||
sta IO.CLRWRITEAUX Driver may R/W in screen holes
|
||
|
||
lda MSLOT Save MSLOT
|
||
sta IRQ.2+2
|
||
|
||
* lda IO.RDCXROM C100-C7ff state
|
||
* pha
|
||
* sta IO.CLRCXROM Enable access to slot C100-C7ff space
|
||
|
||
IRQ.JSR jsr CORE.IRQ.DEV SELF MODIFIED
|
||
|
||
* ldx #IO.CLRCXROM
|
||
|
||
* pla Get CXROM State
|
||
* bpl .3
|
||
|
||
* inx X = SETCXROM
|
||
|
||
*.3 sta $C000,x
|
||
|
||
lda IRQ.2+2 Get back MSLOT
|
||
sta MSLOT
|
||
|
||
and #$F0
|
||
eor #$C0 ....mmm...not looking like Cn....
|
||
bne IRQ.3
|
||
|
||
sta IO.CLRC8ROM Release $C800
|
||
|
||
IRQ.2 lda $ff00 SELF MODIFIED
|
||
|
||
IRQ.3 pla Must keep Carry
|
||
bpl .1
|
||
|
||
sta IO.SETWRITEAUX
|
||
clv coming for AUX.....cancel switch
|
||
|
||
.1 pla
|
||
bpl .2
|
||
|
||
sta IO.SETREADAUX
|
||
clv coming for AUX.....cancel switch
|
||
|
||
.2 pla
|
||
bpl .3
|
||
|
||
sta IO.SETPAGE2
|
||
|
||
.3 bvc IRQ.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
|
||
|
||
.8 clc
|
||
|
||
IRQ.4 ldy #$ff Self Modified
|
||
IRQ.5 ldx #$ff Self Modified
|
||
IRQ.6 lda #$ff Self Modified
|
||
bcc IRQ.8
|
||
|
||
dec IRQ.Skip Make regular ProDOS IRQ manager skip A2osX
|
||
IRQ.JMP jmp $FFFF SELF MODIFIED Not handled, pass to ProDOS
|
||
|
||
IRQ.8 rti
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/sys/kernel.s.irq
|
||
LOAD usr/src/sys/kernel.s
|
||
ASM
|