Wire up the compiler and wring out obvious bugs.
Chris Pressey
7 years ago
19 | 19 |
from sixtypical.parser import Parser
|
20 | 20 |
from sixtypical.evaluator import eval_program
|
21 | 21 |
from sixtypical.analyzer import analyze_program
|
|
22 |
from sixtypical.emitter import Emitter
|
|
23 |
from sixtypical.compiler import compile_program
|
22 | 24 |
|
23 | 25 |
|
24 | 26 |
if __name__ == '__main__':
|
|
55 | 57 |
sys.exit(1)
|
56 | 58 |
print 'ok'
|
57 | 59 |
|
|
60 |
if options.compile:
|
|
61 |
emitter = Emitter(41952)
|
|
62 |
compile_program(program, emitter)
|
|
63 |
emitter.serialize(sys.stdout)
|
|
64 |
|
58 | 65 |
if options.execute:
|
59 | 66 |
context = eval_program(program)
|
60 | 67 |
print str(context)
|
7 | 7 |
from sixtypical.gen6502 import Generator
|
8 | 8 |
|
9 | 9 |
|
10 | |
def compile_program(program):
|
|
10 |
def compile_program(program, emitter):
|
11 | 11 |
assert isinstance(program, Program)
|
12 | |
generator = Generator(49152)
|
|
12 |
generator = Generator(emitter)
|
13 | 13 |
routines = {r.name: r for r in program.routines}
|
14 | 14 |
for routine in program.routines:
|
15 | 15 |
compile_routine(routine, generator, routines)
|
|
41 | 41 |
if isinstance(src, ConstantRef):
|
42 | 42 |
# LDA #...
|
43 | 43 |
pass
|
44 | |
elif:
|
|
44 |
else:
|
45 | 45 |
# LDA abs
|
46 | 46 |
pass
|
47 | 47 |
elif dest == REG_X:
|
|
48 |
pass
|
48 | 49 |
elif dest == REG_Y:
|
|
50 |
pass
|
49 | 51 |
else:
|
50 | 52 |
raise KeyError
|
51 | 53 |
elif opcode == 'st':
|
52 | 54 |
if src == REG_A:
|
53 | 55 |
# assert isinstance(dest, MemoryRef)
|
54 | 56 |
# generate STA
|
|
57 |
pass
|
55 | 58 |
else:
|
56 | 59 |
raise KeyError
|
57 | 60 |
elif opcode == 'add':
|
56 | 56 |
|
57 | 57 |
def make_label(self, name=None):
|
58 | 58 |
if name is None:
|
59 | |
name = 'label' + self.name_counter
|
|
59 |
name = 'label' + str(self.name_counter)
|
60 | 60 |
self.name_counter += 1
|
61 | 61 |
return Label(name, addr=self.addr)
|
62 | 62 |
|
3 | 3 |
|
4 | 4 |
|
5 | 5 |
class Generator(object):
|
6 | |
def __init__(self, addr):
|
7 | |
self.emitter = Emitter(addr)
|
|
6 |
def __init__(self, emitter):
|
|
7 |
self.emitter = emitter
|
8 | 8 |
|
9 | 9 |
### ld ###
|
10 | 10 |
|