19 | 19 |
|
20 | 20 |
from sixtypical.parser import Parser, ParsingContext
|
21 | 21 |
from sixtypical.analyzer import Analyzer
|
22 | |
from sixtypical.emitter import Emitter, Byte, Word
|
|
22 |
from sixtypical.outputter import Outputter
|
23 | 23 |
from sixtypical.compiler import Compiler
|
24 | 24 |
|
25 | 25 |
|
|
78 | 78 |
if options.analyze_only:
|
79 | 79 |
return
|
80 | 80 |
|
81 | |
fh = open(options.output, 'wb')
|
82 | |
|
83 | |
if options.output_format == 'raw':
|
84 | |
start_addr = 0x0000
|
85 | |
prelude = []
|
86 | |
elif options.output_format == 'prg':
|
87 | |
start_addr = 0xc000
|
88 | |
prelude = []
|
89 | |
elif options.output_format == 'c64-basic-prg':
|
90 | |
start_addr = 0x0801
|
91 | |
prelude = [0x10, 0x08, 0xc9, 0x07, 0x9e, 0x32,
|
92 | |
0x30, 0x36, 0x31, 0x00, 0x00, 0x00]
|
93 | |
elif options.output_format == 'vic20-basic-prg':
|
94 | |
start_addr = 0x1001
|
95 | |
prelude = [0x0b, 0x10, 0xc9, 0x07, 0x9e, 0x34,
|
96 | |
0x31, 0x30, 0x39, 0x00, 0x00, 0x00]
|
97 | |
elif options.output_format == 'atari2600-cart':
|
98 | |
start_addr = 0xf000
|
99 | |
prelude = [0x78, 0xd8, 0xa2, 0xff, 0x9a, 0xa9,
|
100 | |
0x00, 0x95, 0x00, 0xca, 0xd0, 0xfb]
|
101 | |
else:
|
102 | |
raise NotImplementedError("Unknown output format: {}".format(options.output_format))
|
|
81 |
outputter = Outputter(options.output_format)
|
103 | 82 |
|
104 | 83 |
if options.origin is not None:
|
105 | 84 |
if options.origin.startswith('0x'):
|
106 | |
start_addr = int(options.origin, 16)
|
|
85 |
outputter.set_start_addr(int(options.origin, 16))
|
107 | 86 |
else:
|
108 | |
start_addr = int(options.origin, 10)
|
|
87 |
outputter.set_start_addr(int(options.origin, 10))
|
109 | 88 |
|
110 | |
# If we are outputting a .PRG, we output the load address first.
|
111 | |
# We don't use the Emitter for this b/c not part of addr space.
|
112 | |
if options.output_format in ('prg', 'c64-basic-prg', 'vic20-basic-prg'):
|
113 | |
fh.write(bytearray(Word(start_addr).serialize(0)))
|
|
89 |
with open(options.output, 'wb') as fh:
|
|
90 |
# this is *awful* binding
|
|
91 |
emitter = outputter.write_prelude(fh)
|
|
92 |
compiler = Compiler(emitter)
|
|
93 |
compiler.compile_program(program, compilation_roster=compilation_roster)
|
|
94 |
outputter.write_postlude(emitter)
|
114 | 95 |
|
115 | |
emitter = Emitter(start_addr)
|
116 | |
for byte in prelude:
|
117 | |
emitter.emit(Byte(byte))
|
118 | |
compiler = Compiler(emitter)
|
119 | |
compiler.compile_program(program, compilation_roster=compilation_roster)
|
120 | |
|
121 | |
# If we are outputting a cartridge with boot and BRK address
|
122 | |
# at the end, pad to ROM size minus 4 bytes, and emit addresses.
|
123 | |
if options.output_format == 'atari2600-cart':
|
124 | |
emitter.pad_to_size(4096 - 4)
|
125 | |
emitter.emit(Word(start_addr))
|
126 | |
emitter.emit(Word(start_addr))
|
127 | |
|
128 | |
if options.debug:
|
129 | |
pprint(emitter.accum)
|
130 | |
else:
|
131 | |
emitter.serialize_to(fh)
|
|
96 |
if options.debug:
|
|
97 |
pprint(emitter.accum)
|
|
98 |
else:
|
|
99 |
emitter.serialize_to(fh)
|
132 | 100 |
|
133 | 101 |
|
134 | 102 |
if __name__ == '__main__':
|