Fixed file number in Atari DOS files

This commit is contained in:
Rob McMullen 2017-02-21 19:49:03 -08:00
parent 767e76671b
commit c0340a1807
3 changed files with 11 additions and 6 deletions

View File

@ -19,9 +19,9 @@ class AtariDosWriteableSector(WriteableSector):
self._next_sector_num = value self._next_sector_num = value
index = self.sector_size - 3 index = self.sector_size - 3
hi, lo = divmod(value, 256) hi, lo = divmod(value, 256)
self.data[index] = self.used self.data[index + 0] = (self.file_num << 2) | (hi & 0x03)
self.data[index + 1] = lo self.data[index + 1] = lo
self.data[index + 2] = hi self.data[index + 2] = self.used
log.debug("sector metadata for %d: %s" % (self._sector_num, self.data[index:index + 3])) log.debug("sector metadata for %d: %s" % (self._sector_num, self.data[index:index + 3]))
# file number will be added later when known. # file number will be added later when known.
@ -177,7 +177,7 @@ class AtariDosDirent(object):
def process_raw_sector(self, image, raw): def process_raw_sector(self, image, raw):
file_num = raw[-3] >> 2 file_num = raw[-3] >> 2
if file_num != self.file_num: if file_num != self.file_num:
raise FileNumberMismatchError164() raise FileNumberMismatchError164("Expecting file %d, found %d" % (self.file_num, file_num))
self.sectors_seen.add(self.current_sector) self.sectors_seen.add(self.current_sector)
next_sector = ((raw[-3] & 0x3) << 8) + raw[-2] next_sector = ((raw[-3] & 0x3) << 8) + raw[-2]
if next_sector in self.sectors_seen: if next_sector in self.sectors_seen:

View File

@ -387,7 +387,7 @@ class DiskImageBase(object):
sector_list = self.sector_list_class(self.bytes_per_sector, self.payload_bytes_per_sector, data, self.writeable_sector_class) sector_list = self.sector_list_class(self.bytes_per_sector, self.payload_bytes_per_sector, data, self.writeable_sector_class)
vtoc_segments = self.get_vtoc_segments() vtoc_segments = self.get_vtoc_segments()
vtoc = self.vtoc_class(self.bytes_per_sector, vtoc_segments) vtoc = self.vtoc_class(self.bytes_per_sector, vtoc_segments)
sector_list.calc_sector_map(vtoc) sector_list.calc_sector_map(dirent, vtoc)
directory.save_dirent(dirent, sector_list) directory.save_dirent(dirent, sector_list)
self.write_sector_list(sector_list) self.write_sector_list(sector_list)
self.write_sector_list(vtoc) self.write_sector_list(vtoc)
@ -406,6 +406,7 @@ class WriteableSector(object):
self._sector_num = -1 self._sector_num = -1
self._next_sector = 0 self._next_sector = 0
self.sector_size = sector_size self.sector_size = sector_size
self.file_num = 0
self.data = np.zeros([sector_size], dtype=np.uint8) self.data = np.zeros([sector_size], dtype=np.uint8)
self.used = 0 self.used = 0
self.ptr = self.used self.ptr = self.used
@ -612,7 +613,7 @@ class SectorList(BaseSectorList):
self.sectors.append(sector) self.sectors.append(sector)
index += count index += count
def calc_sector_map(self, vtoc): def calc_sector_map(self, dirent, vtoc):
""" Map out the sectors and link the sectors together """ Map out the sectors and link the sectors together
raises NotEnoughSpaceOnDisk if the whole file won't fit. It will not raises NotEnoughSpaceOnDisk if the whole file won't fit. It will not
@ -627,6 +628,7 @@ class SectorList(BaseSectorList):
last_sector = None last_sector = None
for sector, sector_num in zip(self.sectors, order): for sector, sector_num in zip(self.sectors, order):
sector.sector_num = sector_num sector.sector_num = sector_num
sector.file_num = dirent.file_num
self.file_length += sector.used self.file_length += sector.used
if last_sector is not None: if last_sector is not None:
last_sector.next_sector_num = sector_num last_sector.next_sector_num = sector_num

View File

@ -14,10 +14,13 @@ class TestAtariDosSDImage(object):
def test_small(self): def test_small(self):
assert len(self.image.files) == 5 assert len(self.image.files) == 5
data = [0xff, 0xff, 0x00, 0x60, 0x01, 0x60, 1, 2] data = np.asarray([0xff, 0xff, 0x00, 0x60, 0x01, 0x60, 1, 2], dtype=np.uint8)
self.image.write_file("TEST.XEX", None, data) self.image.write_file("TEST.XEX", None, data)
assert len(self.image.files) == 6 assert len(self.image.files) == 6
data2 = self.image.find_file("TEST.XEX")
assert data.tostring() == data2
if __name__ == "__main__": if __name__ == "__main__":
t = TestAtariDosFile() t = TestAtariDosFile()