diff --git a/bin/sixtypical b/bin/sixtypical index 42e0c65..264c8fe 100755 --- a/bin/sixtypical +++ b/bin/sixtypical @@ -11,7 +11,9 @@ import codecs import json from pprint import pprint +from subprocess import check_call import sys +from tempfile import NamedTemporaryFile import traceback from sixtypical.parser import Parser, SymbolTable, merge_programs @@ -64,7 +66,7 @@ compilation_roster = fa.serialize() dump(compilation_roster) - if options.analyze_only or options.output is None: + if options.analyze_only or (options.output is None and not options.run): return start_addr = None @@ -74,16 +76,36 @@ else: start_addr = int(options.origin, 10) - with open(options.output, 'wb') as fh: - outputter = outputter_class_for(options.output_format)(fh, start_addr=start_addr) - outputter.write_prelude() - compiler = Compiler(symtab, outputter.emitter) - compiler.compile_program(program, compilation_roster=compilation_roster) - outputter.write_postlude() - if options.debug: - pprint(outputter.emitter) - else: - outputter.emitter.serialize_to(fh) + if options.run: + fh = NamedTemporaryFile(delete=False) + output_filename = fh.name + else: + fh = open(options.output, 'wb') + output_filename = options.output + + outputter = outputter_class_for(options.output_format)(fh, start_addr=start_addr) + outputter.write_prelude() + compiler = Compiler(symtab, outputter.emitter) + compiler.compile_program(program, compilation_roster=compilation_roster) + outputter.write_postlude() + if options.debug: + pprint(outputter.emitter) + else: + outputter.emitter.serialize_to(fh) + + fh.close() + + if options.run: + emu = { + 'c64-basic-prg': "x64 -config vicerc", + 'vic20-basic-prg': "xvic -config vicerc", + 'atari2600-cart': "stella" + }.get(options.output_format) + if not emu: + raise ValueError("No emulator configured for selected --output-format '{}'".format(options.output_format)) + + command = "{} {}".format(emu, output_filename) + check_call(command, shell=True) if __name__ == '__main__': @@ -143,6 +165,12 @@ help="Display debugging information when analyzing and compiling." ) argparser.add_argument( + "--run", + action="store_true", + help="Engage 'load-and-go' operation: write the output to a temporary filename, " + "infer an emulator from the given --output-format, and boot the emulator." + ) + argparser.add_argument( "--traceback", action="store_true", help="When an error occurs, display a full Python traceback."