mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-02-05 08:05:21 +00:00
58 lines
2.4 KiB
Plaintext
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:
|