7 | 7 |
from sixtypical.emitter import Label, Byte
|
8 | 8 |
from sixtypical.gen6502 import (
|
9 | 9 |
Immediate, Absolute,
|
10 | |
LDA, LDX, LDY, STA, STX, STY, CLC, SEC, ADC, RTS, JSR
|
|
10 |
LDA, LDX, LDY, STA, STX, STY, CLC, SEC, ADC, RTS, JSR,
|
|
11 |
INC, INX, INY, DEC, DEX, DEY,
|
11 | 12 |
)
|
12 | 13 |
|
13 | 14 |
|
|
23 | 24 |
|
24 | 25 |
def compile_program(self, program):
|
25 | 26 |
assert isinstance(program, Program)
|
|
27 |
|
|
28 |
for defn in program.defns:
|
|
29 |
label = Label(defn.name)
|
|
30 |
self.labels[defn.name] = label
|
|
31 |
|
26 | 32 |
for routine in program.routines:
|
27 | 33 |
self.routines[routine.name] = routine
|
28 | 34 |
label = Label(routine.name)
|
|
34 | 40 |
for routine in program.routines:
|
35 | 41 |
if routine.name != 'main':
|
36 | 42 |
self.compile_routine(routine)
|
|
43 |
|
|
44 |
for defn in program.defns:
|
|
45 |
label = self.labels[defn.name]
|
|
46 |
self.emitter.resolve_bss_label(label)
|
37 | 47 |
|
38 | 48 |
def compile_routine(self, routine):
|
39 | 49 |
assert isinstance(routine, Routine)
|
|
91 | 101 |
if isinstance(src, ConstantRef):
|
92 | 102 |
self.emitter.emit(ADC(Immediate(Byte(src.value))))
|
93 | 103 |
else:
|
94 | |
self.emitter.emit(ADC(Absolute(src.label)))
|
|
104 |
self.emitter.emit(ADC(Absolute(self.labels[src.name])))
|
95 | 105 |
else:
|
96 | 106 |
raise UnsupportedOpcodeError(instr)
|
97 | 107 |
elif opcode == 'sub':
|
98 | |
raise NotImplementedError
|
|
108 |
if dest == REG_A:
|
|
109 |
if isinstance(src, ConstantRef):
|
|
110 |
self.emitter.emit(SBC(Immediate(Byte(src.value))))
|
|
111 |
else:
|
|
112 |
self.emitter.emit(SBC(Absolute(self.labels[src.name])))
|
|
113 |
else:
|
|
114 |
raise UnsupportedOpcodeError(instr)
|
99 | 115 |
elif opcode == 'inc':
|
100 | |
raise NotImplementedError
|
|
116 |
if dest == REG_X:
|
|
117 |
self.emitter.emit(INX())
|
|
118 |
elif dest == REG_Y:
|
|
119 |
self.emitter.emit(INY())
|
|
120 |
else:
|
|
121 |
self.emitter.emit(INC(Absolute(self.labels[dest.name])))
|
101 | 122 |
elif opcode == 'dec':
|
102 | |
raise NotImplementedError
|
|
123 |
if dest == REG_X:
|
|
124 |
self.emitter.emit(DEX())
|
|
125 |
elif dest == REG_Y:
|
|
126 |
self.emitter.emit(DEY())
|
|
127 |
else:
|
|
128 |
self.emitter.emit(DEC(Absolute(self.labels[dest.name])))
|
103 | 129 |
elif opcode == 'cmp':
|
104 | 130 |
raise NotImplementedError
|
105 | 131 |
elif opcode == 'and':
|