1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-01-11 23:53:34 +00:00
2008-05-02 17:50:21 +00:00

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