mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-02-01 22:43:27 +00:00
56 lines
1.7 KiB
Plaintext
56 lines
1.7 KiB
Plaintext
/ u5 -- unix
|
|
|
|
mget:
|
|
mov *u.fofp,mq / file offset in mq
|
|
clr ac / later to be high sig
|
|
mov $-8,lsh / divide ac/mq by 256.
|
|
mov mq,r2
|
|
bit $10000,i.flgs / lg/sm is this a large or small file
|
|
bne 4f / branch for large file
|
|
bit $!17,r2
|
|
bne 3f / branch if r2 greater than or equal to 16
|
|
bic $!16,r2 / clear all bits but bits 1,2,3
|
|
mov i.dskp(r2),r1 / r1 has physical block number
|
|
bne 2f / if physical block num is zero then need a new block
|
|
/ for file
|
|
jsr r0,alloc / allocate a new block
|
|
mov r1,i.dskp(r2) / physical block number stored in i-node
|
|
jsr r0,setimod / set inode modified byte (imod)
|
|
jsr r0,clear / zero out disk/drum block just allocated
|
|
2:
|
|
rts r0
|
|
3: / adding on block which changes small file to a large file
|
|
jsr r0,alloc / allocate a new block for this file; block number
|
|
/in r1
|
|
jsr r0,wslot / set up I/O buffer for write, r5 points to first
|
|
/ data word in buffer
|
|
mov $8.,r3 / next 6 instructions transfer old physical block
|
|
/ pointers
|
|
mov $i.dskp,r2 / into new indirect block for the new large file
|
|
1:
|
|
mov (r2),(r5)+
|
|
clr (r2)+
|
|
dec r3
|
|
bgt 1b
|
|
mov $256.-8.,r3 / clear rest of data buffer
|
|
1:
|
|
clr (r5)+
|
|
dec r3
|
|
bgt 1b
|
|
jsr r0,dskwr / write new indirect block on disk
|
|
mov r1,i.dskp / put pointer to indirect block in i-node
|
|
bis $10000,i.flgs / set large file bit in i.flgs word of i-node
|
|
jsr r0,setimod / set i-node modified flag
|
|
br mget
|
|
4: / large file
|
|
mov $-8,lsh / divide byte number by 256.
|
|
bic $!776,r2 / zero all bits but 1,2,3,4,5,6,7,8; gives offset
|
|
/ in indirect block
|
|
mov r2,-(sp) / save on stack
|
|
mov mq,r2 / calculate offset in i-node for pointer to proper
|
|
/ indirect block
|
|
bic $!16,r2
|
|
mov i.dskp(r2),r1
|
|
bne 2f / if no indirect block exists
|
|
jsr r0,alloc / allocate a new block
|