#!/usr/bin/env python """Usage: sixtypical [OPTIONS] FILES Analyzes and/or executes and/or compiles a Sixtypical program. """ from os.path import realpath, dirname, join import sys sys.path.insert(0, join(dirname(realpath(sys.argv[0])), '..', 'src')) # ----------------------------------------------------------------- # import codecs from optparse import OptionParser import sys import traceback from sixtypical.parser import Parser from sixtypical.evaluator import eval_program from sixtypical.analyzer import analyze_program from sixtypical.emitter import Emitter, Byte, Word from sixtypical.compiler import compile_program if __name__ == '__main__': optparser = OptionParser(__doc__.strip()) optparser.add_option("--analyze", action="store_true", dest="analyze", default=False, help="") optparser.add_option("--basic-header", action="store_true", dest="basic_header", default=False, help="") optparser.add_option("--compile", action="store_true", dest="compile", default=False, help="") optparser.add_option("--debug", action="store_true", dest="debug", default=False, help="") optparser.add_option("--traceback", action="store_true", dest="traceback", default=False, help="") optparser.add_option("--execute", action="store_true", dest="execute", default=False, help="") (options, args) = optparser.parse_args(sys.argv[1:]) for filename in args: text = open(filename).read() p = Parser(text) program = p.program() if options.analyze: try: analyze_program(program) except Exception as e: if options.traceback: raise else: traceback.print_exception(e.__class__, e, None) sys.exit(1) if options.compile: start_addr = 0xc000 header = [] if options.basic_header: start_addr = 0x0801 header = [0x10, 0x08, 0xc9, 0x07, 0x9e, 0x32, 0x30, 0x36, 0x31, 0x00, 0x00, 0x00] emitter = Emitter(start_addr) # we are outputting a .PRG, so output the load address first emitter.emit(Word(start_addr)) for byte in header: emitter.emit(Byte(byte)) compile_program(program, emitter) if options.debug: print repr(emitter.accum) else: emitter.serialize(sys.stdout) if options.execute: context = eval_program(program) print str(context)