sysbreak: / set the program break mov u.break,r1 / move users break point to r1 cmp r1,$core / is it the same or lower than core? blos 1f / yes, 1f cmp r1,sp / is it the same or higher than the stack? bhis 1f / yes, 1f bit $1,r1 / is it an odd address beq 2f / no, its even clrb (r1)+ / yes, make it even 2: / clear area between the break point and the stack cmp r1,sp / is it higher or same than the stack bhis 1f / yes, quit clr (r1)+ / clear word br 2b / go back 1: jsr r0,arg; u.break / put the "address" in u.break (set new / break point) br sysret4 / br sysret maknod: / r1 contains the mode bis $100000,r1 / allocate flag set mov r1,-(sp) / put mode on stack mov ii,r1 / move current i-number to r1 jsr r0,access; 1 / get its i-node into core mov r1,-(sp) / put i-number on stack mov $40.,r1 / r1 = 40 1: / scan for a free i-node (next 4 instructions) inc r1 / r1 = r1 + 1 jsr r0,imap / get byte address and bit position in inode map in / r2 & m bitb mq,(r2) / is the i-node active bne 1b / yes, try the next one bisb mq,(r2) / no, make it active (put a 1 in the bit map) jsr r0,iget / get i-node into core tst i.flgs / is i-node already allocated blt 1b / yes, look for another one mov r1,u.dirbuf / no, put i-number in u.dirbuf mov (sp)+,r1 / get current i-number back jsr r0,iget / get i-node in core jsr r0,mkdir / make a directory entry in current directory mov u.dirbuf,r1 / r1 = new inode number jsr r0,iget / get it into core jsr r0,copyz; inode; inode+32. / 0 it out mov (sp)+,i.flgs / fill flags movb u.uid,i.uid / user id movb $1,i.nlks / 1 link mov s.time,i.ctim / time created mov s.time+2,i.ctim+2 / time modified jsr r0,setimod / set modified flag rts r0 / return sysseek: / moves read write pointer in an fsp entry jsr r0,seektell / get proper value in u.count add u.base,u.count / add u.base to it mov u.count,*u.fofp / put result into r/w pointer