1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-02-05 08:05:21 +00:00
Files
DoctorWkt.unix-jun72/pages/e08-02
tim.newsham 39ee4e1894 - there was a missing branch in bread when copying data to userland.
I think I got this right, but it would be good if someone checked it
  over.
2008-05-03 01:34:09 +00:00

58 lines
2.4 KiB
Plaintext

cmp r1,(r0)+ / block # greater than or equal to maximum
/ block number allowed
bhis error10 / yes, error
inc *u.fofp / no, *u.fofp has next block number
jsr r0,preread / read in the block whose number is in r1
bis $40000,(r5) / set bit 14 of the 1st word of the I/O
/ buffer
1:
bit $22000,(r5) / are 10th and 13th bits set (read bits)
beq 1f / no
cmp cdev,$1 / disk or drum?
ble 2f / yes
tstb uquant / is the time quantum = 0?
bne 2f / no, 2f
mov r5,-(sp) / yes, save r5 (buffer address)
jsr r0,sleep; 31. / put process to sleep in channel 31 (tape)
mov (sp)+,r5 / restore r5
br 1b / go back
2: / drum or disk
jsr r0,idle; s.wait+2 / wait
br 1b
1: / 10th and 13th bits not set
bic $40000,(r5) / clear bit 14
jsr r0,tstdeve / test device for error (tape)
add $8,r5 / r5 points to data in I/O buffer
jsr r0,dioreg / do bookkeeping on u.count etc.
1: / r5 points to beginning of data in I/O buffer, r2 points to beginning
/ of users data
movb (r5)+,(r2)+ / move data from the I/O buffer
dec r3 / to the user's area in core starting at u.base
bne 1b
tst u.count / done
beq 1f / yes, return
tst -(r0) / no, point r0 to the argument again
br bread / read some more
1:
mov (sp)+,r0 / jump to routine that called readi
jmp ret
bwrite: / write on block structured device
jsr r0,tstdeve / test the device for an error
mov *u.fofp,r1 / put the block number in r1
cmp r1,(r0)+ / does block number exceed maximum allowable #
bhis error10 / yes, error
inc *u.fofp / no, increment block number
jsr r0,wslot / get an I/O buffer to write into
jsr r0,dioreg / do the necessary bookkeeping
1: / r2 points to the users data; r5 points to the I/O buffers data area
movb (r2)+,(r5)+ / ; r3, has the byte count
dec r3 / area to the I/O buffer
bne 1b
jsr r0,dskwr / write it out on the device
tst u.count / done
beq 1f / yes, 1f
tst -(r0) / no, point r0 to the argument of the call
br bwrite / go back and write next block
1: