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