
 sttl High-Level Interrupt Handling
 pag
*
* Interrupt handling code - Highest level
*

* Process firq

ufirq seti mask ints
 tst scrtrm reset ints
 jmp unfirq panic!

* Process a SWI type interrupt

uswi ldx #swivec get vector
 bra process process the int

* Process an NMI int

uextrn ldb #FALTI set fault
 bra uflt

* Process user reset

ureset ldb #TIMEI set time out
 bra uflt

* Process user external

unmi clra set dp=0
 tfr a,dp
 sts usp save stack
 lds #sysstk set system stack
 ldx #usrmap point to mem map
 ldb usp get hi part of sp
 lsrb
 lsrb
 lsrb
 lsrb
 lda b,x get segment
 sta datbox set in page 0
 ldd usp get stack pointer
 anda #$0f set to page 0
 tfr d,x point to sp location
 lda 0,x get cc
 clr datbox set back to orig page
 ldx #nmivec set vector
 ldb #FALTI set fault
 bita #$50 ints masked?
 beq prcs2
 ldb #TIMEI set timeout
 bra prcs2

* Process fault

uflt ldx #nmivec set for nmi vector
 bra process

* swi2 processor

uswi2 ldx #sw2vec set vector
 bra process

* Process an IRQ type interrupt

uirq ldx #irqvec get vector

* Process the interrupt

process clra set dp to 0
 tfr a,dp
 sts usp save user stack pointer
 lds #sysstk set system stack
prcs2 clr kernal
 tst scrtrm reset ints
 jsr [0,x] execute int handler
 bra uswi32

* Handle swi3 - system call interrupt

uswi3 clc clear the carry bit
 tfr cc,dp save cc
 seti mask ints
 std userd save d register
 stx userx save x register
 sts usp save user stack pointer
 lds #sysstk set system stack
 clra set dp to 0
 exg dp,a
 sta usercc save user cc
 clr kernal
 tst scrtrm reset ints
 clri
 jsr [sw3vec] execute handler
uswi32 seti mask ints
 lda chpflg change tasks?
 beq uswi35
 jsr [chtask] change tasks
uswi35 tst scrtrm
 clri
 seti
 dec kernal
 lds usp reset to user stack
 tst urelod new task?
 bne remap
usrrti lda umapno get current task
 beq ufail blowup if 0 map number
 ora #%01000000 set protect mode
 sta tskreg set map and rti
hfail jsr panic hardware rti failure
 fcc 'Hardware RTI failure ',0
ufail jsr panic blowup on 0 map number
 fcc 'Zero map ',0

* Load map registers for new task

remap ldu #datbox point to dat ram
 lda umapno get task number
 beq ufail
 inca bias by 1
 ldb #segadr set segment size (16)
 mul calculate map location
 leau d,u point to it
 clr urelod clear flag
 ldy usrmap+14 load maps
 ldx usrmap+12
 ldd usrmap+10
 pshu d,x,y
 ldy usrmap+8
 ldx usrmap+6
 ldd usrmap+4
 pshu d,x,y
 ldx usrmap+2
 ldd usrmap
 pshu d,x finixh load
 lda umapno get task number
 ora #%01000000 set protect mode
 sta tskreg switch and rti
 bra hfail failure?

* System external

nmi tst scrtrm reset ints
 rti return

* System interrupts (unhandled)

swi jmp unswi
swi2 jmp unswi2
swi3 jmp unswi3
firq jmp unfirq
extrn jmp unnmi

* System irq

irq inc kernal
 tst scrtrm reset ints
 jsr [irqvec] process interrupt
 dec kernal
 rti return

* System reset

reset jmp rinit do sys init

