mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2025-02-18 03:30:39 +00:00
Added file extensions recognition to create_executable_file_image
* you can write a XEX to an Apple DOS 3.3 image, for instance
This commit is contained in:
parent
54b7d56085
commit
e4ce309bd3
@ -253,7 +253,7 @@ def assemble_segments(source_files, data_files, obj_files, run_addr=""):
|
|||||||
|
|
||||||
def assemble(image, source_files, data_files, obj_files, run_addr=""):
|
def assemble(image, source_files, data_files, obj_files, run_addr=""):
|
||||||
segments, run_addr = assemble_segments(source_files, data_files, obj_files, run_addr)
|
segments, run_addr = assemble_segments(source_files, data_files, obj_files, run_addr)
|
||||||
file_data, filetype = image.create_executable_file_image(segments, run_addr)
|
file_data, filetype = image.create_executable_file_image(options.output, segments, run_addr)
|
||||||
print("total file size: $%x (%d) bytes" % (len(file_data), len(file_data)))
|
print("total file size: $%x (%d) bytes" % (len(file_data), len(file_data)))
|
||||||
changed = save_file(image, options.output, filetype, file_data)
|
changed = save_file(image, options.output, filetype, file_data)
|
||||||
if changed:
|
if changed:
|
||||||
|
@ -454,6 +454,8 @@ class XfdHeader(AtrHeader):
|
|||||||
|
|
||||||
|
|
||||||
class AtariDosDiskImage(DiskImageBase):
|
class AtariDosDiskImage(DiskImageBase):
|
||||||
|
default_executable_extension = "XEX"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.first_vtoc = 360
|
self.first_vtoc = 360
|
||||||
self.num_vtoc = 1
|
self.num_vtoc = 1
|
||||||
@ -677,10 +679,6 @@ class AtariDosDiskImage(DiskImageBase):
|
|||||||
log.debug("%s not a binary file; skipping segment generation" % str(segment))
|
log.debug("%s not a binary file; skipping segment generation" % str(segment))
|
||||||
return segments_out
|
return segments_out
|
||||||
|
|
||||||
def create_executable_file_image(self, segments, run_addr=None):
|
|
||||||
base_segment, user_segments = get_xex(segments, run_addr)
|
|
||||||
return base_segment.data, "XEX"
|
|
||||||
|
|
||||||
|
|
||||||
class BootDiskImage(AtariDosDiskImage):
|
class BootDiskImage(AtariDosDiskImage):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -3,6 +3,7 @@ import numpy as np
|
|||||||
from . import errors
|
from . import errors
|
||||||
from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment
|
from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment
|
||||||
from .utils import *
|
from .utils import *
|
||||||
|
from .executables import create_executable_file_data
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -92,6 +93,8 @@ class BaseHeader:
|
|||||||
|
|
||||||
|
|
||||||
class DiskImageBase:
|
class DiskImageBase:
|
||||||
|
default_executable_extension = None
|
||||||
|
|
||||||
def __init__(self, rawdata, filename="", create=False):
|
def __init__(self, rawdata, filename="", create=False):
|
||||||
self.rawdata = rawdata
|
self.rawdata = rawdata
|
||||||
self.bytes = self.rawdata.get_data()
|
self.bytes = self.rawdata.get_data()
|
||||||
@ -300,8 +303,12 @@ class DiskImageBase:
|
|||||||
segments.append(segment)
|
segments.append(segment)
|
||||||
return segments
|
return segments
|
||||||
|
|
||||||
def create_executable_file_image(self, segments, run_addr=None):
|
def create_executable_file_image(self, output_name, segments, run_addr=None):
|
||||||
raise errors.NotImplementedError
|
try:
|
||||||
|
data, filetype = create_executable_file_data(output_name, segments, run_addr)
|
||||||
|
except errors.UnsupportedContainer:
|
||||||
|
data, filetype = create_executable_file_data(self.default_executable_extension, segments, run_addr)
|
||||||
|
return data, filetype
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_boot_image(self, segments, run_addr=None):
|
def create_boot_image(self, segments, run_addr=None):
|
||||||
|
@ -382,6 +382,8 @@ class Dos33Header(BaseHeader):
|
|||||||
|
|
||||||
|
|
||||||
class Dos33DiskImage(DiskImageBase):
|
class Dos33DiskImage(DiskImageBase):
|
||||||
|
default_executable_extension = "BSAVE"
|
||||||
|
|
||||||
def __init__(self, rawdata, filename=""):
|
def __init__(self, rawdata, filename=""):
|
||||||
DiskImageBase.__init__(self, rawdata, filename)
|
DiskImageBase.__init__(self, rawdata, filename)
|
||||||
self.default_filetype = "B"
|
self.default_filetype = "B"
|
||||||
@ -591,10 +593,6 @@ class Dos33DiskImage(DiskImageBase):
|
|||||||
segment = EmptySegment(self.rawdata, name=dirent.filename)
|
segment = EmptySegment(self.rawdata, name=dirent.filename)
|
||||||
return segment
|
return segment
|
||||||
|
|
||||||
def create_executable_file_image(self, segments, run_addr=None):
|
|
||||||
data = get_bsave(segments, run_addr)
|
|
||||||
return data, 'B'
|
|
||||||
|
|
||||||
|
|
||||||
class Dos33BinFile:
|
class Dos33BinFile:
|
||||||
"""Parse a binary chunk into segments according to the DOS 3.3 binary
|
"""Parse a binary chunk into segments according to the DOS 3.3 binary
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from . import errors
|
from . import errors
|
||||||
from .diskimages import DiskImageBase, BaseHeader
|
|
||||||
from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits
|
from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits
|
||||||
from .utils import *
|
from .utils import *
|
||||||
|
|
||||||
@ -62,6 +61,7 @@ def get_xex(segments, run_addr=None):
|
|||||||
sub_segments.append(new_s)
|
sub_segments.append(new_s)
|
||||||
return main_segment, sub_segments
|
return main_segment, sub_segments
|
||||||
|
|
||||||
|
|
||||||
def get_bsave(segments, run_addr=None):
|
def get_bsave(segments, run_addr=None):
|
||||||
# Apple 2 executables get executed at the first address loaded. If the
|
# Apple 2 executables get executed at the first address loaded. If the
|
||||||
# run_addr is not the first byte of the combined data, have to create a
|
# run_addr is not the first byte of the combined data, have to create a
|
||||||
@ -99,3 +99,14 @@ def get_bsave(segments, run_addr=None):
|
|||||||
print("setting data for $%04x - $%04x at index $%04x" % (s.origin, s.origin + len(s), index))
|
print("setting data for $%04x - $%04x at index $%04x" % (s.origin, s.origin + len(s), index))
|
||||||
image[index:index + len(s)] = s.data
|
image[index:index + len(s)] = s.data
|
||||||
return image
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def create_executable_file_data(filename, segments, run_addr=None):
|
||||||
|
name = filename.lower()
|
||||||
|
if name.endswith("xex"):
|
||||||
|
base_segment, user_segments = get_xex(segments, run_addr)
|
||||||
|
return base_segment.data, "XEX"
|
||||||
|
elif name.endswith("bin") or name.endswith("bsave"):
|
||||||
|
data = get_bsave(segments, run_addr)
|
||||||
|
return data, "B"
|
||||||
|
raise errors.UnsupportedContainer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user