From 5a1718bf1d36904ae781ed27bf27076b5977e62d Mon Sep 17 00:00:00 2001 From: Rob McMullen Date: Wed, 22 Feb 2017 12:12:52 -0800 Subject: [PATCH] Changed sector labels for DOS 33 to report track, sector rather than sector number --- atrcopy/diskimages.py | 6 +++++- atrcopy/dos33.py | 8 ++++++-- atrcopy/segments.py | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/atrcopy/diskimages.py b/atrcopy/diskimages.py index 99fc02d..cd06026 100644 --- a/atrcopy/diskimages.py +++ b/atrcopy/diskimages.py @@ -161,6 +161,10 @@ class DiskImageBase(object): def writeable_sector_class(self): return WriteableSector + @property + def raw_sector_class(self): + return RawSectorsSegment + @property def vtoc_class(self): return VTOC @@ -313,7 +317,7 @@ class DiskImageBase(object): i = self.header.header_offset if self.header.image_size > 0: self.segments.append(ObjSegment(r[0:i], 0, 0, 0, i, name="%s Header" % self.header.file_format)) - self.segments.append(RawSectorsSegment(r[i:], self.header.starting_sector_label, self.header.max_sectors, self.header.image_size, self.header.initial_sector_size, self.header.num_initial_sectors, self.header.sector_size, name="Raw disk sectors")) + self.segments.append(self.raw_sector_class(r[i:], self.header.starting_sector_label, self.header.max_sectors, self.header.image_size, self.header.initial_sector_size, self.header.num_initial_sectors, self.header.sector_size, name="Raw disk sectors")) self.segments.extend(self.get_boot_segments()) self.segments.extend(self.get_vtoc_segments()) self.segments.extend(self.get_directory_segments()) diff --git a/atrcopy/dos33.py b/atrcopy/dos33.py index 9a2d6e1..37a4ea4 100644 --- a/atrcopy/dos33.py +++ b/atrcopy/dos33.py @@ -2,7 +2,7 @@ import numpy as np from errors import * from diskimages import AtrHeader, DiskImageBase, Directory, VTOC, WriteableSector, BaseSectorList -from segments import DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, SegmentSaver +from segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver import logging log = logging.getLogger(__name__) @@ -299,6 +299,10 @@ class Dos33DiskImage(DiskImageBase): def directory_class(self): return Dos33Directory + @property + def raw_sector_class(self): + return RawTrackSectorSegment + def get_boot_sector_info(self): # based on logic from a2server data, style = self.get_sectors(0) @@ -389,7 +393,7 @@ class Dos33DiskImage(DiskImageBase): segments = [] addr = 0 start, count = self.get_contiguous_sectors(self.header.vtoc_sector, 1) - segment = RawSectorsSegment(r[start:start+count], self.header.vtoc_sector, 1, count, 0, 0, self.header.sector_size, name="VTOC") + segment = RawTrackSectorSegment(r[start:start+count], self.header.vtoc_sector, 1, count, 0, 0, self.header.sector_size, name="VTOC") segments.append(segment) return segments diff --git a/atrcopy/segments.py b/atrcopy/segments.py index 8e6e474..66b6261 100644 --- a/atrcopy/segments.py +++ b/atrcopy/segments.py @@ -828,6 +828,21 @@ class RawSectorsSegment(DefaultSegment): return "s%03d:%02x" % (sector + self.first_sector, byte) return "s%03d:%02X" % (sector + self.first_sector, byte) + +class RawTrackSectorSegment(RawSectorsSegment): + def label(self, index, lower_case=True): + boot_size = self.num_boot_sectors * self.boot_sector_size + if index >= boot_size: + sector, byte = divmod(index - boot_size, self.page_size) + sector += self.num_boot_sectors + else: + sector, byte = divmod(index, self.boot_sector_size) + sector += self.first_sector + t, s = divmod(sector, 16) + if lower_case: + return "t%02ds%02d:%02x" % (t, s, byte) + return "t%02ds%02d:%02X" % (t, s, byte) + def interleave_indexes(segments, num_bytes): num_segments = len(segments) size = len(segments[0])