mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2024-11-29 11:51:14 +00:00
Added support for double density images with 128 byte boot sectors
This commit is contained in:
parent
dd73ec7db4
commit
c99f6d38ff
39
atrcopy.py
39
atrcopy.py
@ -37,7 +37,7 @@ class AtrHeader(object):
|
|||||||
file_format = "ATR"
|
file_format = "ATR"
|
||||||
|
|
||||||
def __init__(self, bytes=None):
|
def __init__(self, bytes=None):
|
||||||
self.size_in_bytes = 0
|
self.image_size = 0
|
||||||
self.sector_size = 0
|
self.sector_size = 0
|
||||||
self.crc = 0
|
self.crc = 0
|
||||||
self.unused = 0
|
self.unused = 0
|
||||||
@ -53,7 +53,7 @@ class AtrHeader(object):
|
|||||||
values = bytes.view(dtype=self.format)[0]
|
values = bytes.view(dtype=self.format)[0]
|
||||||
if values[0] != 0x296:
|
if values[0] != 0x296:
|
||||||
raise InvalidAtrHeader
|
raise InvalidAtrHeader
|
||||||
self.size_in_bytes = (int(values[3]) * 256 * 256 + int(values[1])) * 16
|
self.image_size = (int(values[3]) * 256 * 256 + int(values[1])) * 16
|
||||||
self.sector_size = int(values[2])
|
self.sector_size = int(values[2])
|
||||||
self.crc = int(values[4])
|
self.crc = int(values[4])
|
||||||
self.unused = int(values[5])
|
self.unused = int(values[5])
|
||||||
@ -63,19 +63,26 @@ class AtrHeader(object):
|
|||||||
raise InvalidAtrHeader
|
raise InvalidAtrHeader
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s Disk Image (size=%d (%dx%db), crc=%d flags=%d unused=%d)" % (self.file_format, self.size_in_bytes, self.max_sectors, self.sector_size, self.crc, self.flags, self.unused)
|
return "%s Disk Image (size=%d (%dx%db), crc=%d flags=%d unused=%d)" % (self.file_format, self.image_size, self.max_sectors, self.sector_size, self.crc, self.flags, self.unused)
|
||||||
|
|
||||||
def check_size(self, size):
|
def check_size(self, size):
|
||||||
if self.size_in_bytes == 0:
|
if size == 92160 or size == 92176:
|
||||||
if size == 92160:
|
self.image_size = 92160
|
||||||
self.size_in_bytes = size
|
self.sector_size = 128
|
||||||
self.sector_size = 128
|
self.initial_sector_size = 0
|
||||||
elif size == 184320:
|
self.num_initial_sectors = 0
|
||||||
self.size_in_bytes = size
|
elif size == 184320 or size == 184336:
|
||||||
self.sector_size = 256
|
self.image_size = 184320
|
||||||
self.initial_sector_size = self.sector_size
|
self.sector_size = 256
|
||||||
self.num_initial_sectors = 0
|
self.initial_sector_size = 0
|
||||||
self.max_sectors = self.size_in_bytes / self.sector_size
|
self.num_initial_sectors = 0
|
||||||
|
elif size == 183936 or size == 183952:
|
||||||
|
self.image_size = 183936
|
||||||
|
self.sector_size = 256
|
||||||
|
self.initial_sector_size = 128
|
||||||
|
self.num_initial_sectors = 3
|
||||||
|
initial_bytes = self.initial_sector_size * self.num_initial_sectors
|
||||||
|
self.max_sectors = ((self.image_size - initial_bytes) / self.sector_size) + self.num_initial_sectors
|
||||||
|
|
||||||
def sector_is_valid(self, sector):
|
def sector_is_valid(self, sector):
|
||||||
return sector > 0 and sector <= self.max_sectors
|
return sector > 0 and sector <= self.max_sectors
|
||||||
@ -96,7 +103,7 @@ class XfdHeader(AtrHeader):
|
|||||||
file_format = "XFD"
|
file_format = "XFD"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s Disk Image (size=%d (%dx%db)" % (self.file_format, self.size_in_bytes, self.max_sectors, self.sector_size)
|
return "%s Disk Image (size=%d (%dx%db)" % (self.file_format, self.image_size, self.max_sectors, self.sector_size)
|
||||||
|
|
||||||
class AtrDirent(object):
|
class AtrDirent(object):
|
||||||
# ATR Dirent structure described at http://atari.kensclassics.org/dos.htm
|
# ATR Dirent structure described at http://atari.kensclassics.org/dos.htm
|
||||||
@ -618,9 +625,9 @@ class AtrDiskImage(object):
|
|||||||
return segments
|
return segments
|
||||||
|
|
||||||
def parse_segments(self):
|
def parse_segments(self):
|
||||||
if self.header.size_in_bytes > 0:
|
if self.header.image_size > 0:
|
||||||
self.segments.append(self.get_obj_segment(0, 0, 0, self.header.atr_header_offset, self.bytes[0:self.header.atr_header_offset], name="%s Header" % self.header.file_format))
|
self.segments.append(self.get_obj_segment(0, 0, 0, self.header.atr_header_offset, self.bytes[0:self.header.atr_header_offset], name="%s Header" % self.header.file_format))
|
||||||
self.segments.append(self.get_raw_sectors_segment(1, self.header.max_sectors, self.header.size_in_bytes, self.bytes[self.header.atr_header_offset:], name="Raw disk sectors"))
|
self.segments.append(self.get_raw_sectors_segment(1, self.header.max_sectors, self.header.image_size, self.bytes[self.header.atr_header_offset:], name="Raw disk sectors"))
|
||||||
self.segments.extend(self.get_boot_segments())
|
self.segments.extend(self.get_boot_segments())
|
||||||
self.segments.extend(self.get_vtoc_segments())
|
self.segments.extend(self.get_vtoc_segments())
|
||||||
self.segments.extend(self.get_directory_segments())
|
self.segments.extend(self.get_directory_segments())
|
||||||
|
Loading…
Reference in New Issue
Block a user