From c57c35eeec8045dab00cfce5427a4a9bc0c0c9d7 Mon Sep 17 00:00:00 2001 From: Rob McMullen Date: Thu, 25 Oct 2018 22:38:39 -0700 Subject: [PATCH] Added create_emulator_boot_segment to disk images and files * prepare a segment that can be written to disk and booted by an emulator --- atrcopy/ataridos.py | 4 ++-- atrcopy/cartridge.py | 9 ++++++++- atrcopy/diskimages.py | 7 ++++++- atrcopy/dos33.py | 7 +++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/atrcopy/ataridos.py b/atrcopy/ataridos.py index feaeeed..836fe4a 100644 --- a/atrcopy/ataridos.py +++ b/atrcopy/ataridos.py @@ -1,7 +1,7 @@ import numpy as np from . import errors -from .diskimages import DiskImageBase, BaseHeader +from .diskimages import DiskImageBase, BaseHeader, Bootable from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits from .utils import * from .executables import get_xex @@ -267,7 +267,7 @@ class RunAddressSegment(ObjSegment): -class AtariDosFile: +class AtariDosFile(Bootable): """Parse a binary chunk into segments according to the Atari DOS object file format. diff --git a/atrcopy/cartridge.py b/atrcopy/cartridge.py index 8d875ec..cacc8cd 100644 --- a/atrcopy/cartridge.py +++ b/atrcopy/cartridge.py @@ -303,4 +303,11 @@ class RomImage(DiskImageBase): def parse_segments(self): r = self.rawdata s = ObjSegment(r, 0, 0, self.header.main_origin, name="Main Bank") - return [s] + self.segments = [s] + + def create_emulator_boot_segment(self): + print(self.segments) + s = self.segments[0] + if s.origin == 0: + return None + return s diff --git a/atrcopy/diskimages.py b/atrcopy/diskimages.py index 73091a1..b40d00e 100644 --- a/atrcopy/diskimages.py +++ b/atrcopy/diskimages.py @@ -92,7 +92,12 @@ class BaseHeader: return self.sector_class(self.sector_size, data) -class DiskImageBase: +class Bootable: + def create_emulator_boot_segment(self): + return ObjSegment(self.rawdata, 0, 0, 0) + + +class DiskImageBase(Bootable): default_executable_extension = None def __init__(self, rawdata, filename="", create=False): diff --git a/atrcopy/dos33.py b/atrcopy/dos33.py index 8f1471c..dcdf21b 100644 --- a/atrcopy/dos33.py +++ b/atrcopy/dos33.py @@ -1,7 +1,7 @@ import numpy as np from . import errors -from .diskimages import BaseHeader, DiskImageBase +from .diskimages import BaseHeader, DiskImageBase, Bootable from .utils import Directory, VTOC, WriteableSector, BaseSectorList, Dirent from .segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver, get_style_bits, SegmentData from .executables import get_bsave @@ -594,7 +594,7 @@ class Dos33DiskImage(DiskImageBase): return segment -class Dos33BinFile: +class Dos33BinFile(Bootable): """Parse a binary chunk into segments according to the DOS 3.3 binary dump format """ @@ -637,6 +637,9 @@ class Dos33BinFile: else: raise errors.InvalidBinaryFile(f"Invalid BSAVE header") + def create_emulator_boot_segment(self): + return self.segments[0] + class ProdosHeader(Dos33Header): file_format = "ProDOS"