diff --git a/atrcopy/__init__.py b/atrcopy/__init__.py index b95ea17..cfcfd22 100644 --- a/atrcopy/__init__.py +++ b/atrcopy/__init__.py @@ -228,8 +228,13 @@ def assemble_segments(source_files, data_files, obj_files, run_addr=""): print(f"skipping {name}: {e}") else: for s in parser.segments: - if s.origin > 0: - print("adding %s from %s" % (s, name)) + if hasattr(s, 'run_address'): + if not run_addr: + run_addr = s.run_address() + else: + print(f"already have run address {run_addr}; skipping {s.run_address()}") + elif s.origin > 0: + print(f"adding {s} from {name}") segments.add_segment(s.data, s.origin) if options.verbose: for s in segments: @@ -237,8 +242,12 @@ def assemble_segments(source_files, data_files, obj_files, run_addr=""): if run_addr: try: run_addr = text_to_int(run_addr) - except ValueError: - run_addr = None + except (AttributeError, ValueError): + # not text, try as integer + try: + run_addr = int(run_addr) + except ValueError: + run_addr = None return segments, run_addr diff --git a/atrcopy/ataridos.py b/atrcopy/ataridos.py index 99caa2f..06613b2 100644 --- a/atrcopy/ataridos.py +++ b/atrcopy/ataridos.py @@ -4,6 +4,7 @@ from . import errors from .diskimages import DiskImageBase, BaseHeader from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits from .utils import * +from .executables import get_xex import logging log = logging.getLogger(__name__) @@ -256,6 +257,16 @@ class XexSegment(ObjSegment): savers = [SegmentSaver, XexSegmentSaver] +class RunAddressSegment(ObjSegment): + # FIXME: defining run_address as a property doesn't work for some reason. + # @property + # def run_address(self): + # return self.rawdata[0:2].view(dtype="= s.origin and run_addr < s.origin + len(s): - found = True - break - if not found: - raise errors.InvalidBinaryFile("Run address points outside data segments") - else: - run_addr = segments[0].origin - words[0] = run_addr - r = SegmentData(words.view(dtype=np.uint8)) - s = DefaultSegment(r, 0x2e0) - segments_copy[0:0] = [s] - total += 6 - bytes = np.zeros([total], dtype=np.uint8) - rawdata = SegmentData(bytes) - main_segment = DefaultSegment(rawdata) - main_segment.data[0:2] = 0xff # FFFF header - main_segment.style[0:2] = data_style - i = 2 - for s in segments_copy: - # create new sub-segment inside new main segment that duplicates the - # original segment's data/style - new_s = DefaultSegment(rawdata[i:i+4+len(s)], s.origin) - words = new_s.data[0:4].view(dtype='= s.origin and run_addr < s.origin + len(s): - found = True - break - if not found: - raise errors.InvalidBinaryFile("Run address points outside data segments") - origin -= 3 - hi, lo = divmod(run_addr, 256) - raw = SegmentData([0x4c, lo, hi]) - all_segments = [DefaultSegment(raw, origin=origin)] - all_segments.extend(segments) - else: - all_segments = segments - size = last - origin - image = np.zeros([size + 4], dtype=np.uint8) - words = image[0:4].view(dtype="= s.origin and run_addr < s.origin + len(s): + found = True + break + if not found: + raise errors.InvalidBinaryFile("Run address points outside data segments") + else: + run_addr = segments[0].origin + words[0] = run_addr + r = SegmentData(words.view(dtype=np.uint8)) + s = DefaultSegment(r, 0x2e0) + segments_copy[0:0] = [s] + total += 6 + bytes = np.zeros([total], dtype=np.uint8) + rawdata = SegmentData(bytes) + main_segment = DefaultSegment(rawdata) + main_segment.data[0:2] = 0xff # FFFF header + main_segment.style[0:2] = data_style + i = 2 + for s in segments_copy: + # create new sub-segment inside new main segment that duplicates the + # original segment's data/style + new_s = DefaultSegment(rawdata[i:i+4+len(s)], s.origin) + words = new_s.data[0:4].view(dtype='= s.origin and run_addr < s.origin + len(s): + found = True + break + if not found: + raise errors.InvalidBinaryFile("Run address points outside data segments") + origin -= 3 + hi, lo = divmod(run_addr, 256) + raw = SegmentData([0x4c, lo, hi]) + all_segments = [DefaultSegment(raw, origin=origin)] + all_segments.extend(segments) + else: + all_segments = segments + size = last - origin + image = np.zeros([size + 4], dtype=np.uint8) + words = image[0:4].view(dtype="