diff --git a/src/sys/s6.s b/src/sys/s6.s index 5ba1097..891dc9b 100644 --- a/src/sys/s6.s +++ b/src/sys/s6.s @@ -99,6 +99,8 @@ namei: 0 jmp 1b " yes: keep going jmp namei i " Didn't find it, return zero in AC (without skip) t = t+2 + + " NOTE: iget/iput share "temp" vars!!! " Given an i-number in AC, fetch that i-node " from disk and store it in the inode buffer iget: 0 @@ -113,49 +115,50 @@ iget: 0 cll; mul; 12 " Multiply the i-num within the block by 12 lacq " to get the offset into the block tad dskbufp " Add on the base of the disk buffer - dac 9f+t + dac 9f+t " save pointer into dskbuf in "t0" dac .+2 jms copy; ..; inode; 12 " Copy 12 words from buffer to inode jmp iget i " and return iput: 0 - lac 9f+t+1 - jms dskrd - law inode-1 - dac 8 + lac 9f+t+1 " get block number saved by iget + jms dskrd " read the block + law inode-1 " pointer to "in core" inode + dac 8 " in index 8 -1 - tad 9f+t - dac 9 - -12 - dac 9f+t+2 + tad 9f+t " get saved pointer into buffer + dac 9 " in index 9 + -12 " 12 word loop count + dac 9f+t+2 " in t2 1: - lac 8 i + lac 8 i " fetch source word "** 01-s1.pdf page 36 - sad 9 i - skp - jmp 2f - isz 9f+t+2 - jmp 1b - jmp iput i -2: - -1 + sad 9 i " differs from disk? + skp " no: + jmp 2f " yes: + isz 9f+t+2 " no difference: done? + jmp 1b " no: keep going + jmp iput i " yes: return w/o writing to disk +2: " here with in-core inode changed + -1 " back up both pointers tad 8 dac 8 -1 tad 9 dac 9 1: - lac 8 i - dac 9 i - isz 9f+t+2 - jmp 1b - lac 9f+t+1 - jms dskwr - jmp iput i + lac 8 i " fetch word + dac 9 i " copy to dskbuf + isz 9f+t+2 " done? + jmp 1b " no: keep going + lac 9f+t+1 " get block number + jms dskwr " write back to disk + jmp iput i " return t = t+3 + " NOTE! dget/dput share "temp" vars " allocate directory entry " AC/ entry number dget: 0 @@ -164,30 +167,31 @@ dget: 0 dac 9f+t " save in t0 jms pget " get free disk block dac 9f+t+1 " save in t1 - jms dskrd - lac 9f+t - and o77 - tad dskbufp - dac 9f+t+2 - dac .+2 - jms copy; ..; dnode; 8 - lac 9f+t - tad d8 - jms betwen; d0; i.size - skp - jmp dget i - jms dacisize - dzm d.i - jmp dget i + jms dskrd " read block + lac 9f+t " get word number + and o77 " get word within block + tad dskbufp " make pointer into dskbuf + dac 9f+t+2 " save in t2 + dac .+2 " save as copy source + jms copy; ..; dnode; 8 " copy entry into dnode + lac 9f+t " get word number + tad d8 " of end of new node + jms betwen; d0; i.size " already allocated? + skp " no + jmp dget i " yes: return + jms dacisize " store new file size + dzm d.i " mark new entry as free + jmp dget i " return + " write directory entry (back) to disk dput: 0 - lac 9f+t+1 - jms dskrd - lac 9f+t+2 - dac .+3 - jms copy; dnode; ..; 8 - lac 9f+t+1 - jms dskwr + lac 9f+t+1 " get disk block number back + jms dskrd " read into dskbuf + lac 9f+t+2 " get pointer into dskbuf + dac .+3 " save as copy dest + jms copy; dnode; ..; 8 " copy into dskbuf + lac 9f+t+1 " get disk block number + jms dskwr " write back to disk jmp dput i t = t+3 @@ -262,6 +266,10 @@ pget: 0 jmp pget i " return it t = t+3 + " write to file referenced by loaded inode + " AC/ file offset + " jms iwrite; addr; count + iwrite: 0 dac 9f+t " save arg in t0 lac iwrite " load return address @@ -273,14 +281,14 @@ iwrite: 0 dac iwrite " save as iwrite instruction jmp 1f - " iread from file referenced by loaded inode + " read from file referenced by loaded inode " AC/ file offset " jms iread; addr; count iread: 0 dac 9f+t " save offset in t0 lac cnop " get nop dac iwrite " save as iwrite instruction -1: +1: " common code for iread/iwrite -1 tad iread i " get word before return addr dac 10 " store in index 10 & 11 @@ -289,20 +297,14 @@ iread: 0 lac iread i " load addr dac 9f+t+1 " save in t1 isz iread " increment return addr - lac o70000 + lac o70000 " get max file size xct iwrite " skip if write lac i.size " read: get file size cma - tad 9f+t " add offset - cma - jms betwen; d0; 9f+t+1 - lac 9f+t+1 - dac 9f+t+2 - cma - tad d1 - sna - jmp iread i - dac 9f+t+1 + tad 9f+t " subtract offset + sna " offset == size? + jmp iread i " yes, return + dac 9f+t+1 " save size-offset in t1 1: lac 9f+t jms pget @@ -312,7 +314,7 @@ iread: 0 and o77 tad dskbufp tad dm1 - xct iwrite + xct iwrite " skip if write jmp .+3 dac 10 cskp: