diff --git a/atrcopy/__init__.py b/atrcopy/__init__.py index 321ee6b..495ff5d 100644 --- a/atrcopy/__init__.py +++ b/atrcopy/__init__.py @@ -8,9 +8,9 @@ except ImportError: raise RuntimeError("atrcopy %s requires numpy" % __version__) from errors import * -from ataridos import AtariDosDiskImage, AtariDosFile, get_xex +from ataridos import AtrHeader, AtariDosDiskImage, AtariDosFile, get_xex, add_atr_header from dos33 import Dos33DiskImage -from diskimages import AtrHeader, BootDiskImage, add_atr_header +from diskimages import BootDiskImage from kboot import KBootImage, add_xexboot_header from segments import SegmentData, SegmentSaver, DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, user_bit_mask, match_bit_mask, comment_bit_mask, data_style, selected_bit_mask, diff_bit_mask, not_user_bit_mask, interleave_segments from spartados import SpartaDosDiskImage diff --git a/atrcopy/ataridos.py b/atrcopy/ataridos.py index 0d21cf8..696079e 100644 --- a/atrcopy/ataridos.py +++ b/atrcopy/ataridos.py @@ -1,9 +1,9 @@ import numpy as np from errors import * -from diskimages import DiskImageBase, Directory, VTOC, WriteableSector, BaseSectorList +from diskimages import DiskImageBase, BaseHeader from segments import EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentSaver -from utils import to_numpy +from utils import * import logging log = logging.getLogger(__name__) @@ -37,7 +37,7 @@ class AtariDosVTOC(VTOC): log.debug("vtoc after: %s" % self.sector_map[0:720]) packed = np.packbits(self.sector_map[0:720]) self.vtoc1[0x0a:0x64] = packed - s = WriteableSector(self.bytes_per_sector, self.vtoc1) + s = WriteableSector(self.sector_size, self.vtoc1) s.sector_num = 360 self.sectors.append(s) @@ -165,10 +165,10 @@ class AtariDosDirent(object): return True def get_sector_list(self, image): - sector_list = BaseSectorList(image.bytes_per_sector) + sector_list = BaseSectorList(image.header.sector_size) self.start_read(image) while True: - sector = WriteableSector(image.bytes_per_sector, None, self.current_sector) + sector = WriteableSector(image.header.sector_size, None, self.current_sector) sector_list.append(sector) _, last, _, _ = self.read_sector(image) if last: @@ -213,6 +213,7 @@ class AtariDosDirent(object): self.file_num = index self.dos_2 = True self.in_use = True + log.debug("set_values: %s" % self) class MydosDirent(AtariDosDirent): @@ -290,6 +291,118 @@ class AtariDosFile(object): pos += 4 + count +class AtrHeader(BaseHeader): + sector_class = AtariDosWriteableSector + + # ATR Format described in http://www.atarimax.com/jindroush.atari.org/afmtatr.html + format = np.dtype([ + ('wMagic', ' (0xc000 - (nsec * self.header.sector_size)): raise InvalidDiskImage("Bad boot load address") - -def add_atr_header(bytes): - header = AtrHeader(create=True) - header.check_size(len(bytes)) - hlen = len(header) - data = np.empty([hlen + len(bytes)], dtype=np.uint8) - data[0:hlen] = header.to_array() - data[hlen:] = bytes - return data diff --git a/atrcopy/dos33.py b/atrcopy/dos33.py index 9fb0b7e..3c1fa5e 100644 --- a/atrcopy/dos33.py +++ b/atrcopy/dos33.py @@ -68,7 +68,7 @@ class Dos33VTOC(VTOC): # FIXME self.vtoc[0x38:] = vtoc.flatten() - s = WriteableSector(self.bytes_per_sector, self.vtoc) + s = WriteableSector(self.sector_size, self.vtoc) s.sector_num = 17 * 16 self.sectors.append(s) @@ -79,7 +79,7 @@ class Dos33Directory(Directory): return Dos33Dirent def get_dirent_sector(self): - s = self.sector_class(self.bytes_per_sector) + s = self.sector_class(self.sector_size) data = np.zeros([0x0b], dtype=np.uint8) s.add_data(data) return s @@ -232,16 +232,16 @@ class Dos33Dirent(object): self.sector_map = sector_list def get_sector_list(self, image): - sector_list = BaseSectorList(image.header.bytes_per_sector) + sector_list = BaseSectorList(image.header.sector_size) self.start_read(image) sector_num = image.header.sector_from_track(self.track, self.sector) while sector_num > 0: - sector = WriteableSector(image.header.bytes_per_sector, None, sector_num) + sector = WriteableSector(image.header.sector_size, None, sector_num) sector_list.append(sector) values, style = image.get_sectors(sector_num) sector = image.header.sector_from_track(values[1], values[2]) for sector_num in sector_list: - sector = WriteableSector(image.header.bytes_per_sector, None, sector_num) + sector = WriteableSector(image.header.sector_size, None, sector_num) sector_list.append(sector) return sector_list @@ -320,11 +320,11 @@ class Dos33DiskImage(DiskImageBase): self.header = Dos33Header() @property - def bytes_per_sector(self): + def sector_size(self): return 256 @property - def payload_bytes_per_sector(self): + def payload_sector_size(self): return 256 @property @@ -376,14 +376,14 @@ class Dos33DiskImage(DiskImageBase): ('unused5', 'S2'), ('num_tracks', 'u1'), ('sectors_per_track', 'u1'), - ('bytes_per_sector', 'u2'), + ('sector_size', 'u2'), ]) def get_vtoc(self): data, style = self.get_sectors(self.header.first_vtoc) values = data[0:self.vtoc_type.itemsize].view(dtype=self.vtoc_type)[0] self.header.first_directory = self.header.sector_from_track(values['cat_track'], values['cat_sector']) - self.header.sector_size = int(values['bytes_per_sector']) + self.header.sector_size = int(values['sector_size']) self.header.max_sectors = int(values['num_tracks']) * int(values['sectors_per_track']) self.header.ts_pairs = int(values['max_pairs']) self.header.dos_release = values['dos_release'] diff --git a/atrcopy/utils.py b/atrcopy/utils.py index f733819..32971a9 100644 --- a/atrcopy/utils.py +++ b/atrcopy/utils.py @@ -2,6 +2,9 @@ import types import numpy as np +import logging +log = logging.getLogger(__name__) + def to_numpy(value): if type(value) is np.ndarray: @@ -69,8 +72,8 @@ class WriteableSector(object): class BaseSectorList(object): - def __init__(self, bytes_per_sector): - self.bytes_per_sector = bytes_per_sector + def __init__(self, sector_size): + self.sector_size = sector_size self.sectors = [] def __len__(self): @@ -97,7 +100,7 @@ class BaseSectorList(object): class Directory(BaseSectorList): def __init__(self, header, num_dirents=-1, sector_class=WriteableSector): - BaseSectorList.__init__(self, header.bytes_per_sector) + BaseSectorList.__init__(self, header.sector_size) self.sector_class = sector_class self.num_dirents = num_dirents # number of dirents may be unlimited, so use a dict instead of a list @@ -193,7 +196,7 @@ class Directory(BaseSectorList): self.finish_encoding(image) def get_dirent_sector(self): - return self.sector_class(self.bytes_per_sector) + return self.sector_class(self.sector_size) def encode_empty(self): raise NotImplementedError @@ -222,7 +225,7 @@ class Directory(BaseSectorList): class VTOC(BaseSectorList): def __init__(self, header, segments=None): - BaseSectorList.__init__(self, header.bytes_per_sector) + BaseSectorList.__init__(self, header.sector_size) # sector map: 1 is free, 0 is allocated self.sector_map = np.zeros([1280], dtype=np.uint8) @@ -259,7 +262,7 @@ class VTOC(BaseSectorList): class SectorBuilder(BaseSectorList): def __init__(self, header, usable, data, sector_class): - BaseSectorList.__init__(self, header.bytes_per_sector) + BaseSectorList.__init__(self, header.sector_size) self.data = to_numpy(data) self.usable_bytes = usable self.split_into_sectors(header) diff --git a/test/test_add_file.py b/test/test_add_file.py index 2b13111..1f059f8 100644 --- a/test/test_add_file.py +++ b/test/test_add_file.py @@ -121,7 +121,7 @@ class BaseFilesystemModifyTest(object): # class TestAtariDosSDImage(BaseFilesystemModifyTest): # diskimage_type = AtariDosDiskImage # sample_file = "../test_data/dos_sd_test1.atr" -# num_files_in_sample +# num_files_in_sample = 5 class TestDos33Image(BaseFilesystemModifyTest): diskimage_type = Dos33DiskImage