diff --git a/atrcopy/__init__.py b/atrcopy/__init__.py index 295c735..c1aa079 100644 --- a/atrcopy/__init__.py +++ b/atrcopy/__init__.py @@ -251,7 +251,11 @@ def assemble(image, source_files, data_files, obj_files, run_addr=""): def boot_image(image_name, source_files, data_files, obj_files, run_addr=""): - image_cls = parsers_for_filename(image_name)[0] + try: + image_cls = parsers_for_filename(image_name)[0] + except InvalidDiskImage, e: + print("%s: %s" % (image_name, e)) + return None segments, run_addr = assemble_segments(source_files, data_files, obj_files, run_addr) if segments: image = image_cls.create_boot_image(segments, run_addr) diff --git a/atrcopy/kboot.py b/atrcopy/kboot.py index 681e6c8..b7a876f 100644 --- a/atrcopy/kboot.py +++ b/atrcopy/kboot.py @@ -3,7 +3,8 @@ from __future__ import division import numpy as np from .errors import * -from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment +from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment, get_xex +from .segments import SegmentData class KBootDirent(AtariDosDirent): @@ -68,6 +69,14 @@ class KBootImage(AtariDosDiskImage): def get_directory_segments(self): return [] + @classmethod + def create_boot_image(cls, segments, run_addr=None): + data_segment, _ = get_xex(segments) + data_bytes = add_xexboot_header(data_segment.data) + raw = SegmentData(data_bytes) + atr = cls(raw, create=True) + return atr + xexboot_header = b'\x00\x03\x00\x07\r\x07L\r\x07\x1c[\x00\x00\xa0\x00\x8c\t\x03\x8c\x04\x03\x8cD\x02\x8c\xe2\x02\x8c\xe3\x02\xc8\x84\t\x8c\x01\x03\xce\x06\x03\xa91\x8d\x00\x03\xa9R\x8d\x02\x03\xa9\x80\x8d\x08\x03\xa9\x01\x8d\x05\x03\xa9\xe3\x8d0\x02\x8d\x02\xd4\xa9\x07\x8d1\x02\x8d\x03\xd4\xa9\x00\xaa\x8d\x0b\x03\xa9\x04\x8d\n\x03 \xbc\x07\xca \xa5\x07\x85C \xa5\x07\x85D%C\xc9\xff\xf0\xf0 \xa5\x07\x85E \xa5\x07\x85F \xa5\x07\x91C\xe6C\xd0\x02\xe6D\xa5E\xc5C\xa5F\xe5D\xb0\xeb\xad\xe2\x02\r\xe3\x02\xf0\xc9\x86\x19 \xa2\x07\xa6\x19\xa0\x00\x8c\xe2\x02\x8c\xe3\x02\xf0\xb8l\xe2\x02\xad\t\x07\xd0\x0b\xad\n\x07\xd0\x03l\xe0\x02\xce\n\x07\xce\t\x07\xe0\x80\x90"\xa9@\x8d\x03\x03 Y\xe4\x10\x06\xce\x01\x07\xd0\xf1\x00\xee\n\x03\xd0\x03\xee\x0b\x03\xad\n\x03\x8d\x19\xd0\xa0\x00\xa2\x00\xbd\x00\x01\xe8`pppppF\xf8\x07p\x07ppp\x06p\x06p\x06A\xe3\x07\x00\x00\x00\x00\x00,/!$).\'\x0e\x0e\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&2/-' diff --git a/atrcopy/parsers.py b/atrcopy/parsers.py index a56c7b6..cc4823c 100644 --- a/atrcopy/parsers.py +++ b/atrcopy/parsers.py @@ -197,7 +197,17 @@ def parsers_for_filename(name): found = None for parser in parsers: log.debug("parser: %s = %s" % (mime, parser)) - matches.append(StandardDeliveryImage) + n = name.lower() + if n.endswith(".atr"): + matches.append(KBootImage) + elif n.endswith(".dsk"): + matches.append(StandardDeliveryImage) + else: + try: + _, name = name.rsplit(".", 1) + except ValueError: + pass + raise InvalidDiskImage("no disk image formats that match '%s'" % name) return matches