mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-01-11 23:53:34 +00:00
57 lines
2.3 KiB
Plaintext
57 lines
2.3 KiB
Plaintext
mov r2,i.size / yes, increase the f11e size to file offset +
|
|
/ no. of data bytes
|
|
jsr r0,setimod / set imod=1 (i.e., core inode has been
|
|
/ modified), stuff tlme of modification into
|
|
/ core image of i-node
|
|
1:
|
|
jsr r0,mget / get the block no. in which to write the next data
|
|
/ byte
|
|
bit *u.fofp,$777 / test the lower 9 bits of the file offset
|
|
bne 2f / if its non-zero, branch; if zero, file offset = 0,
|
|
/ 512, 1024,...(i.e., start of new block)
|
|
cmp u.count,$512. / if zero, is there enough data to fill an
|
|
/ entire block? (i.e., no. of
|
|
bhis 3f / bytes to be written greater than 512.? Yes, branch.
|
|
/ Don't have to read block
|
|
2: / in as no past info. is to be saved (the entire block will be
|
|
/ overwritten).
|
|
jsr r0,dskrd / no, must retain old info.. Hence, read block 'r1'
|
|
/ into an I/O buffer
|
|
3:
|
|
jsr r0,wslot / set write and inhibit bits in I/O queue, proc.
|
|
/ status=0, r5 points to 1st word of data
|
|
jsr r0,sioreg / r3 = no. of bytes of data, r1 = address of data,
|
|
/ r2 points to location in buffer in which to
|
|
/ start writing data
|
|
2:
|
|
movb (r1 )+,(r2)+ / transfer a byte of data to the I/O buffer
|
|
dec r3 / decrement no. of bytes to be written
|
|
bne 2b / have all bytes been transferred? No, branch
|
|
jsr r0,dskwr / yes, write the block and the i-node
|
|
tst u.count / any more data to write?
|
|
bne 1b / yes, branch
|
|
jmp ret / no, return to the caller via 'ret'
|
|
|
|
cpass: / get next character from user area of core and put it in r1
|
|
tst u.count / have all the characters been transferred (i.e.,
|
|
/ u.count, # of chars. left
|
|
beq 1f / to be transferred = 0?) yes, branch
|
|
dec u.count / no, decrement u.count
|
|
movb *u.base,r1 / take the character pointed to by u.base and
|
|
/ put it in r1
|
|
inc u.nread / increment no. of bytes transferred
|
|
inc u.base / increment the buffer address to point to the
|
|
rts r0 / next byte
|
|
1:
|
|
mov (sp)+,r0 / put return address of calling routine into r0
|
|
mov (sp)+,r1 / i-number in r1
|
|
rts r0 / non-local return
|
|
|
|
sioreg:
|
|
mov *u.fofp,r2 / file offset (in bytes) is moved to r2
|
|
mov r2,r3 / and also to r3
|
|
bis $177000,r3 / set bits 9,...,15. of file offset in r3
|
|
bic $!777,r2 / calculate file offset mod 512.
|
|
add r5,r2 / r2 now points to 1st byte in system buffer where
|
|
/ data is to be placed
|