Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 def _fsWriteDataBlocks(self, f):
     """Write the data blocks."""
     for entry in self.fsFileList:
         rt11util.writeBlocks(f, entry.deData, entry.deStart, entry.deLength)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
 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)