Added -b command line flag to add raw data to executables

This commit is contained in:
Rob McMullen 2017-02-26 12:31:34 -08:00
parent 07cdb05ba2
commit 718101d4a4
3 changed files with 57 additions and 16 deletions

View File

@ -11,11 +11,11 @@ from errors import *
from ataridos import AtrHeader, AtariDosDiskImage, BootDiskImage, AtariDosFile, get_xex, add_atr_header from ataridos import AtrHeader, AtariDosDiskImage, BootDiskImage, AtariDosFile, get_xex, add_atr_header
from dos33 import Dos33DiskImage from dos33 import Dos33DiskImage
from kboot import KBootImage, add_xexboot_header 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 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, SegmentList
from spartados import SpartaDosDiskImage from spartados import SpartaDosDiskImage
from cartridge import A8CartHeader, AtariCartImage from cartridge import A8CartHeader, AtariCartImage
from parsers import SegmentParser, DefaultSegmentParser, guess_parser_for_mime, guess_parser_for_system, iter_parsers, iter_known_segment_parsers, mime_parse_order from parsers import SegmentParser, DefaultSegmentParser, guess_parser_for_mime, guess_parser_for_system, iter_parsers, iter_known_segment_parsers, mime_parse_order
from utils import to_numpy from utils import to_numpy, text_to_int
def process(image, dirent, options): def process(image, dirent, options):
@ -140,24 +140,32 @@ def list_files(image, files):
if not files or dirent.filename in files: if not files or dirent.filename in files:
print dirent print dirent
def assemble(image, files): def assemble(image, source_files, data_files):
try: if source_files:
import pyatasm try:
except ImportError: import pyatasm
raise AtrError("Please install pyatasm to compile code.") except ImportError:
raise AtrError("Please install pyatasm to compile code.")
changed = False changed = False
segments = [] segments = SegmentList()
print files print source_files, data_files
for name in files: for name in source_files:
try: try:
asm = pyatasm.Assemble(name) asm = pyatasm.Assemble(name)
except SyntaxError, e: except SyntaxError, e:
raise AtrError("Assembly error: %s" % e.msg) raise AtrError("Assembly error: %s" % e.msg)
for first, last, object_code in asm.segments: for first, last, object_code in asm.segments:
print "%04x - %04x, size=%04x" % (first, last, len(object_code)) s = segments.add_segment(object_code, first)
rawdata = SegmentData(object_code) print s.name
s = DefaultSegment(rawdata, first, name) for name in data_files:
segments.append(s) if "@" not in name:
raise AtrError("Data files must include a load address specified with the @ char")
name, addr = name.rsplit("@", 1)
first = text_to_int(addr)
with open(name, 'rb') as fh:
data = fh.read()
s = segments.add_segment(data, first)
print s.name
if options.verbose: if options.verbose:
for s in segments: for s in segments:
print "%s - %04x)" % (str(s)[:-1], s.start_addr + len(s)) print "%s - %04x)" % (str(s)[:-1], s.start_addr + len(s))
@ -189,6 +197,7 @@ def run():
parser.add_argument("-r", "--remove", action="store_true", default=False, help="remove named files from image") parser.add_argument("-r", "--remove", action="store_true", default=False, help="remove named files from image")
parser.add_argument("-t", "--filetype", action="store", default="", help="file type metadata for writing to disk images that require it") parser.add_argument("-t", "--filetype", action="store", default="", help="file type metadata for writing to disk images that require it")
parser.add_argument("-s", "--asm", nargs="+", action="append", help="source file(s) to assemble using pyatasm (requires -o to specify filename stored on disk image)") parser.add_argument("-s", "--asm", nargs="+", action="append", help="source file(s) to assemble using pyatasm (requires -o to specify filename stored on disk image)")
parser.add_argument("-b", "--bytes", nargs="+", action="append", help="data file(s) to add to assembly, specify as file@addr (requires -o to specify filename stored on disk image)")
parser.add_argument("-o", "--output", action="store", default="", help="output file name for those commands that need it") parser.add_argument("-o", "--output", action="store", default="", help="output file name for those commands that need it")
options, extra_args = parser.parse_known_args() options, extra_args = parser.parse_known_args()
print options, extra_args print options, extra_args
@ -220,7 +229,9 @@ def run():
extract_files(parser.image, file_list) extract_files(parser.image, file_list)
elif options.remove: elif options.remove:
remove_files(parser.image, file_list) remove_files(parser.image, file_list)
elif options.asm: elif options.asm or options.bytes:
assemble(parser.image, options.asm[0]) asm = options.asm[0] if options.asm else []
datafiles = options.bytes[0] if options.bytes else []
assemble(parser.image, asm, datafiles)
else: else:
list_files(parser.image, file_list) list_files(parser.image, file_list)

View File

@ -876,3 +876,14 @@ def interleave_segments(segments, num_bytes):
raw = SegmentData(data_base, style_base, segments[0].rawdata.extra, order=new_index) raw = SegmentData(data_base, style_base, segments[0].rawdata.extra, order=new_index)
segment = DefaultSegment(raw, 0) segment = DefaultSegment(raw, 0)
return segment return segment
class SegmentList(list):
def add_segment(self, data, start_addr=0, name=None):
last = start_addr + len(data)
if name is None:
name = "%04x - %04x, size=%04x" % (start_addr, last, len(data))
rawdata = SegmentData(data)
s = DefaultSegment(rawdata, start_addr, name)
self.append(s)
return s

View File

@ -24,6 +24,25 @@ def to_numpy_list(value):
return np.asarray(value, dtype=np.uint32) return np.asarray(value, dtype=np.uint32)
def text_to_int(text, default_base="hex"):
""" Convert text to int, raising exeception on invalid input
"""
if text.startswith("0x"):
value = int(text[2:], 16)
elif text.startswith("$"):
value = int(text[1:], 16)
elif text.startswith("#"):
value = int(text[1:], 10)
elif text.startswith("%"):
value = int(text[1:], 2)
else:
if default_base == "dec":
value = int(text)
else:
value = int(text, 16)
return value
class WriteableSector(object): class WriteableSector(object):
def __init__(self, sector_size, data=None, num=-1): def __init__(self, sector_size, data=None, num=-1):
self._sector_num = num self._sector_num = num