
 sttl High Level Interrupt Handling
 pag
*
* Interrupt handling code - all in high rom
*

 org rompag

* Return from interrupt level 0
*
* If 'chpflg' is set, call guy to change tasks.  This is the
* only place a task change occurs.
*

userti lda chpflg check for task change
 beq unmap
 jsr [chtask] go change tasks

* Rewrite the entire user map

unmap seti mask ints
 dec kernal dec the interrupt level
 lds usp reset user stack pointer
 ldu #datbox+10 point to dat
 ldy usrmap+8
 ldx usrmap+6
 ldd usrmap+4
 pshu d,x,y
 ldx usrmap+2
 ldd usrmap+0
 pshu d,x
 ldu #datbox+16 point to high dat
 ldy usrmap+14
 ldx usrmap+12
 ldd usrmap+10
 pshu d,x,y stuff into dat
rti rti return to user

* swi2 processor

swi2 pshs cc,a,x,u save some regs
 seti mask ints
 lda #ramap&$00ff get resident ram page
 sta datbox+sysseg set into dat
 lda >usrtop get user top page
 sta datbox+usrseg
 ldx uswiv get user swi vector

* Fix up the user memory map

 lda usrmap+sysseg restore the system segment
 sta datbox+sysseg
 lda usrmap+usrseg get user segment
 sta datbox+usrseg
 leax 0,x check vector for non zero
 beq swi2ex
 stx 4,s reset pc on stack
swi2ex puls cc,a,x,pc return to user

* Handle swi3 - system call interrupt

swi3 clc clear the carry bit
 tfr cc,dp save cc
 tfr d,y save d
 ldu 10,s get pc
 ldb 0,u+ get post byte
 stu 10,s save new pc

* Map in rest of rom and process swi3

 seti mask ints
 lda #romap&$00ff get rom page
 sta datbox+romseg map in rom
 lda #romap>>8 map in rest of rom
 sta datbox+iodseg
 jmp swi3do go process swi3

* Finish up a swi3 (exit code)

swi3un pshu x,y map back top 16K
 lds #usercc point to cc
 puls a,x,y,u get back the regs
 lds usp get users stack pointer
 stb datbox+11 give back user block
 sta 0,s reset cc
 stx 1,s set d
 sty 4,s set x
 stu 10,s set the pc
 rti return from int

* Process firq

firq leas -1,s make room on stack
 pshs cc,d,dp,x,y push all regs like irq
 lda 9,s get old cc
 stu 8,s store proper u reg
 ora #$80 set entire bit in cc
 sta 0,s
 ldd #romap map in rom
 std datbox+iodseg
 ldx #frqvec point to firq vector
 jmp process go process int

* Process a SWI type interrupt

swi ldx #swivec get vector
 ldd #romap map in rom
 std datbox+iodseg
 jmp process process the int

* Process an NMI int

nmi ldx #nmivec get vector
 ldd #romap map in rom
 std datbox+iodseg
 jmp process go process int

* Process an IRQ type interrupt

irq ldx #irqvec get vector
 ldd #romap map in rom
 std datbox+iodseg
 jmp process go process int

* Process reset

reset ldd #romap map in rom
 std datbox+iodseg
 jmp rinit go init system
