1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-02-01 22:43:27 +00:00
Files
DoctorWkt.unix-jun72/pages/e08-03
2008-05-02 17:50:21 +00:00

56 lines
1.8 KiB
Plaintext

mov (sp)+,r0 / return to routine that called writei
jmp ret
tstdeve: / check whether permanent error has occured on special file
/ I/O
mov cdev,r1 / only works on tape; r1 has device #
tstb deverr(r1) / test error bit of device
bne 1f / error
rts r0 / device okay
1:
clrb deverr(r1) / clear error
error10:
jmp error / see 'error' routine
dioreg:
mov u.count,r3 / move char count to r3
cmp r3,$512. / more than 512. char?
blos 1f / no, branch
mov $512.,r3 / yes, just take 512.
1:
mov u.base,r2 / put users base in r2
add r3,u.nread / add the number to be read to u.nread
sub r3,u.count / update count
add r3,u.base / update base
rts r0 / return
preread:
jsr r0,bufaloc / get a free I/O buffer (r1 has block number)
br 1f / branch if block already in a I/O buffer
bis $2000,(r5) / set read bit (bit 100 in I/O buffer)
jsr r0,poke / perform the read
1:
clr *$ps / ps = 0
rts r0
dskrd:
jsr r0,bufaloc / shuffle off to bufaloc; get a free I/O buffer
br 1f
bis $2000,(r5) / set bit 10 of word 1 of I/O queue entry
/ for buffer
jsr r0,poke / just assigned in bufaloc, bit 10=1 says read
1:
clr *$ps
bit $22000,(r5) / if either bits 10, or 13 are 1; jump to idle
beq 1f
jsr r0,idle; s.wait+2
br 1b
1:
add $8,r5 / r5 points to first word of data in block just read
/ in
rts r0
wslot:
jsr r0,bufaloc / get a free I/O buffer; pointer to first
br 1f / word in buffer in r5