1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-07-05 15:29:07 +00:00
SixtyPical/bin/sixtypical

88 lines
2.9 KiB
Python
Executable File

#!/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 Compiler
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))
compiler = Compiler(emitter)
compiler.compile_program(program)
if options.debug:
print repr(emitter.accum)
else:
emitter.serialize(sys.stdout)
if options.execute:
context = eval_program(program)
print str(context)