
*
* Context switching code
*

* Process an interrupt as special

proces lda #ramap&$00ff load resident ram page
 sta datbox+sysseg
 inc >kernal bump the interrupt level
 bne jvectr if non zero - system is mapped in
 clra set dp to 0
 tfr a,dp

* Map in entire system address space

 lda usrtop get user block page
 sta datbox+usrseg map it in
 ldu sysmap+sysseg+1
 stu datbox+sysseg+1
 ldu sysmap+sysseg+3
 stu datbox+sysseg+3
 ldu sysmap+sysseg+5
 stu datbox+sysseg+5
 ldu sysmap+sysseg+7
 stu datbox+sysseg+7
 ldu sysmap+sysseg+9
 stu datbox+sysseg+9

* Setup the system stack and invoke the interrupt routine

 sts usp save users stack
 lds #sysstk set up system stack
jvectr jsr [0,x] invoke the interrupt routine
 seti mask ints
 tst kernal check int level
 lbeq userti
 dec kernal dec the interrupt level
 rti return from int

* Handle a swi3

swi3do lda #ramap&$00ff load resident ram
 sta datbox+sysseg
 lda >usrtop get yser top page
 sta datbox+usrseg

* Save registers in user block

 sty userd save d reg
 stx userx save x reg
 stu userpc save pc
 stb userpb save post byte
 clra set dp reg
 exg dp,a
 sta usercc save condition codes

* Map in rest of system space

 ldu #datbox+11 point to dat box
 ldy sysmap+9
 ldx sysmap+7
 ldd sysmap+5
 pshu d,x,y stuff in dat
 ldx sysmap+3
 ldd sysmap+1
 pshu d,x stuff in dat

* Setup system stack and invoke sycall handler

 sts usp save user stack
 lds #sysstk set system stack
 inc kernal bump interrupt level
 clri enable ints
 jsr [sw3vec] invoke syscall routine
 seti mask ints
 lda chpflg get change flag
 beq unswi if zero - just remap
 jsr [chtask] call task changer

* Map user back into system

unswi seti mask ints
 dec kernal dec int level
 ldu #datbox+10 point to dat cells
 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
 ldy usrmap+14
 ldx usrmap+12
 ldd usrmap+10
 sta datbox+10
 jmp swi3un go finish up

 pag
