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/e05-01
2008-05-02 17:50:21 +00:00

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