mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-01-13 15:27:49 +00:00
57 lines
2.2 KiB
Plaintext
57 lines
2.2 KiB
Plaintext
|
|
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
|