
wswap:
       mov     *$30,u.emt / determines handling of emts
       mov     *$10,u.ilgins / determines handling of illegal instructions
       mov     u.break,r2 / put process program break address in r2
       inc     r2 / add 1 to it 
       bic     $1,r2 / make it even
       mov     r2,u.break / set break to an even location
       mov     u.usp,r3 / put users stack pter at moment of swap in r3
       cmp     r2,$core / is u.break less than $core
       blos    2f / yes
       cmp     r2,r3 / no, is (u.break) greater than stack pointer
       bhis    2f / yes
1:
       mov     (r3)+,(r2)+ / no, pack stack next to users program
       cmp     r3,$ecore / has stack reached end of core
       bne     1b / no, keep packing
       br      1f / yes
2: 
       mov     $ecore,r2 / put end of core in r2 
1:
       sub     $user,r2 / get number of bytes to write out (user up
                        / to end of stack gets written out)
       neg     r2 / make it negative
       asr     r2 / change bytes to words (divide by 2)
       mov     r2,swp+4 / word count
       movb    u.uno,r1 / move user process number to r1
       asl     r1 / x2 for index
       mov     r2,p.break-2(r1) / put negative of word count into the
       	                        / p.break table
       mov     p.dska-2(r1),r1 / move disk address of swap area for
                               / process to r1
       mov     r1,swp+2 / put processes dska address in swp +2 (block
                        / number)
       bis     $1000,swp / set it up to write (set bit 9)
       jsr     r0,ppoke / write process out on swap area of disk
1:
       tstb    swp+1 / is lt done writing?
       bne     1b / no, wait
       rts     r0 / yes, return to swap

rswap:
       asl     r1 / process number x2 for index
       mov     p.break-2(r1), swp+4 / word count
       mov     p.dska-2(r1),swp+2 / disk address
       bis     $2000,swp / read
       jsr     r0,ppoke / read it in 
1:
       tstb    swp+1 / done
       bne     1b / no, wait for bit 15 to clear (inhibit bit)
       mov     u.emt,*$30 / yes move these
       mov     u.ilgins,*$10 / back
       rts     r0 / return

unpack: / move stack back to its normal place
       mov     u.break,r2 / r2 points to end of user program
