1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-02-02 15:01:52 +00:00
Files
DoctorWkt.unix-jun72/pages/e01-07

57 lines
2.2 KiB
Plaintext

tst r1 / positive i-number ?
bge error1 / yes, error 1 negative i-number means write
neg r1 / make it positive
jsr r0,writei / write data
1:
mov u.nread,*u.r0 / put no. of bytes transferred into (u.r0)
br sysret1
rw1:
jsr r0,arg; u.base / get buffer pointer
jsr r0,arg; u.count / get no. of characters
mov *u.r0,r1 / put file descriptor (index to u.fp table) in r1
jsr r0,getf / get i-number of the file in r1
rts r0
sysopen:
jsr r0,arg2 / get sys args into u.namep and on stack
jsr r0,namei / i-number of file in r1
br error2 / file not found
tst (sp) / is mode = 0 (2nd arg of call; 0 means, open for read)
beq 1f / yes, leave i-number positive
neg r1 / open for writing so make i-number negative
1:
jsr r0,iopen / open file whose i-number is in r1
tst (sp)+ / pop the stack and test the mode
beq op1 / is open for read op1
op0:
neg r1 / make i-number positive if open for writing
op1:
clr r2 / clear registers
clr r3
1: / scan the list of entries in fsp table
tstb u.fp(r2) / test the entry in the u.fp list
beq 1f / if byte in list is 0 branch
inc r2 / bump r2 so next byte can be checked
cmp r2,$10. / reached end of list?
blt 1b / no, go back
br error2 / yes, error (no files open)
1:
tst fsp(r3) / scan fsp entries
beq 1f / if 0 branch
add $8.,r3 / add 8 to r3 to bump it to next entry mfsp table
cmp r3,$[nfiles*8.] / done scanning
blt 1b / no, back
br error2 / yes, error
1: / r2 has index to u.fp list; r3, has index to fsp table
mov r1,fsp(r3) / put i-number of open file into next available
mov cdev,fsp+2(r3) / entry in fsp table, put # of device in
/ next word
clr fsp+4(r3)
clr fsp+6(r3) / clear the next two words
asr r3
asr r3 / divide by 8 to get number of the fsp entry-1
asr r3
inc r3 / add 1 to get fsp entry number