def _fsWriteHomeBlock(self, f): """Write the home block. A lot of the reserved fields of the block are not yet supported.""" blk = bytearray(rt11util.rtBlockSize) blk[0722:0724] = rt11util.rtBytes(self.fsPackClustSize) blk[0724:0726] = rt11util.rtBytes(self.fsFirstDirSeg) blk[0726:0730] = rt11util.rtBytes(self.fsSysVersion) blk[0730:0744] = self.fsVolumeId blk[0744:0760] = self.fsOwnerName blk[0760:0774] = self.fsSystemId rt11util.writeBlocks(f, blk, 1, 1)
def _fsWriteDataBlocks(self, f): """Write the data blocks.""" for entry in self.fsFileList: rt11util.writeBlocks(f, entry.deData, entry.deStart, entry.deLength)
def _fsWriteDirSegs(self, f): """Write the directory segments.""" # How many of the dir segments will we use? Need to # hold files in file list plus end of segment marker per dir seg dsNeeded = math.ceil((len(self.fsFileList) + self.fsNumDirSegs) / self.fsDirEntPerSeg) # Sanity check: Will the entries fit? rt11util.assertError(dsNeeded <= self.fsNumDirSegs, "Not enough directory segments to hold file list.") # Start constructing dir segs in memory. Represent as lists of 16-bit # word values for now. dirSegs = [None] * self.fsNumDirSegs for dsNum in range(self.fsNumDirSegs): dirSegs[dsNum] = [0] * rt11util.rtBlockSize # Fill in header info that we already know for dsNum in range(len(dirSegs)): dirSegs[dsNum][:rtDirSegHdrSize] = [self.fsNumDirSegs, 0, 0, self.fsExtraWords * 2, 0] # Fill in file information dsNum = 1 deNum = 0 highDs = 0 blkNum = self.fsDataStart for de in self.fsFileList: # Fill in more directory entry header information if deNum == 0: dirSegs[dsNum - 1][1] = dsNum + 1 dirSegs[dsNum - 1][4] = blkNum # Fill in one directory entry deOffset = rtDirSegHdrSize + (deNum * self.fsDirEntSize) dirSegs[dsNum - 1][deOffset : deOffset + rtDirEntSize] = [ de.deStatus, de.deName[0], de.deName[1], de.deName[2], de.deLength, de.deJobChan, de.deDate, ] rt11util.assertError(blkNum == de.deStart, "Block number calculation error.") blkNum = blkNum + de.deLength if self.fsDirEntSize > rtDirEntSize: # Fill in extra bytes dirsegs[dsNum - 1][deOffset + rtDirEntSize : deOffset + self.fsDirEntSize] = de.deExtra deNum = deNum + 1 if deNum == (self.fsDirEntPerSeg - 1): # Add end of segment marker deOffset = rtDirSegHdrSize + (deNum * self.fsDirEntSize) dirSegs[dsNum - 1][deOffset] = deEEOS deNum = 0 dsNum = dsNum + 1 if deNum != 0: # If deNum == 0, we should have just written an end of segment # marker. If not, add one now. deOffset = rtDirSegHdrSize + (deNum * self.fsDirEntSize) dirSegs[dsNum - 1][deOffset] = deEEOS # Next dir seg pointer = 0 dirSegs[dsNum - 1][1] = 0 # Now plug in high dir seg number highDs = dsNum for dsNum in range(len(dirSegs)): dirSegs[dsNum][2] = highDs # Write the constructed dir segs to disk blks = bytearray(0) for ds in dirSegs: blks += rt11util.wordsToBytes(ds) rt11util.writeBlocks(f, blks, self.fsFirstDirSeg, self.fsNumDirSegs * 2)
def _fsWriteBootBlocks(self, f): for n in range(rtNumBootBlocks): b = n if n > 0: b = b + 1 rt11util.writeBlocks(f, str(self.fsBootBlocks[n]), b, 1)