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 dos33 import Dos33DiskImage
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 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 utils import to_numpy
from utils import to_numpy, text_to_int
def process(image, dirent, options):
@ -140,24 +140,32 @@ def list_files(image, files):
if not files or dirent.filename in files:
print dirent
def assemble(image, files):
try:
import pyatasm
except ImportError:
raise AtrError("Please install pyatasm to compile code.")
def assemble(image, source_files, data_files):
if source_files:
try:
import pyatasm
except ImportError:
raise AtrError("Please install pyatasm to compile code.")
changed = False
segments = []
print files
for name in files:
segments = SegmentList()
print source_files, data_files
for name in source_files:
try:
asm = pyatasm.Assemble(name)
except SyntaxError, e:
raise AtrError("Assembly error: %s" % e.msg)
for first, last, object_code in asm.segments:
print "%04x - %04x, size=%04x" % (first, last, len(object_code))
rawdata = SegmentData(object_code)
s = DefaultSegment(rawdata, first, name)
segments.append(s)
s = segments.add_segment(object_code, first)
print s.name
for name in data_files:
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:
for s in segments:
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("-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("-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")
options, extra_args = parser.parse_known_args()
print options, extra_args
@ -220,7 +229,9 @@ def run():
extract_files(parser.image, file_list)
elif options.remove:
remove_files(parser.image, file_list)
elif options.asm:
assemble(parser.image, options.asm[0])
elif options.asm or options.bytes:
asm = options.asm[0] if options.asm else []
datafiles = options.bytes[0] if options.bytes else []
assemble(parser.image, asm, datafiles)
else:
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)
segment = DefaultSegment(raw, 0)
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)
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):
def __init__(self, sector_size, data=None, num=-1):
self._sector_num = num