1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-01-13 15:27:49 +00:00
2008-05-02 17:50:21 +00:00

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