66 | 66 |
return static_label
|
67 | 67 |
return self.labels[name]
|
68 | 68 |
|
|
69 |
def absolute_or_zero_page(self, label):
|
|
70 |
if label.addr and label.addr < 256:
|
|
71 |
return ZeroPage(label)
|
|
72 |
else:
|
|
73 |
return Absolute(label)
|
|
74 |
|
69 | 75 |
# visitor methods
|
70 | 76 |
|
71 | 77 |
def compile_program(self, program):
|
|
176 | 182 |
elif isinstance(src, IndirectRef) and isinstance(src.ref.type, PointerType):
|
177 | 183 |
self.emitter.emit(LDA(IndirectY(self.get_label(src.ref.name))))
|
178 | 184 |
else:
|
179 | |
self.emitter.emit(LDA(Absolute(self.get_label(src.name))))
|
|
185 |
self.emitter.emit(LDA(self.absolute_or_zero_page(self.get_label(src.name))))
|
180 | 186 |
elif dest == REG_X:
|
181 | 187 |
if src == REG_A:
|
182 | 188 |
self.emitter.emit(TAX())
|
|
185 | 191 |
elif isinstance(src, IndexedRef) and src.index == REG_Y:
|
186 | 192 |
self.emitter.emit(LDX(AbsoluteY(self.get_label(src.ref.name))))
|
187 | 193 |
else:
|
188 | |
self.emitter.emit(LDX(Absolute(self.get_label(src.name))))
|
|
194 |
self.emitter.emit(LDX(self.absolute_or_zero_page(self.get_label(src.name))))
|
189 | 195 |
elif dest == REG_Y:
|
190 | 196 |
if src == REG_A:
|
191 | 197 |
self.emitter.emit(TAY())
|
|
194 | 200 |
elif isinstance(src, IndexedRef) and src.index == REG_X:
|
195 | 201 |
self.emitter.emit(LDY(AbsoluteX(self.get_label(src.ref.name))))
|
196 | 202 |
else:
|
197 | |
self.emitter.emit(LDY(Absolute(self.get_label(src.name))))
|
|
203 |
self.emitter.emit(LDY(self.absolute_or_zero_page(self.get_label(src.name))))
|
198 | 204 |
else:
|
199 | 205 |
raise UnsupportedOpcodeError(instr)
|
200 | 206 |
elif opcode == 'st':
|
|
214 | 220 |
REG_X: AbsoluteX,
|
215 | 221 |
REG_Y: AbsoluteY,
|
216 | 222 |
}[dest.index]
|
217 | |
label = self.get_label(dest.ref.name)
|
|
223 |
operand = mode_cls(self.get_label(dest.ref.name))
|
218 | 224 |
elif isinstance(dest, IndirectRef) and isinstance(dest.ref.type, PointerType):
|
219 | |
mode_cls = IndirectY
|
220 | |
label = self.get_label(dest.ref.name)
|
221 | |
else:
|
222 | |
mode_cls = Absolute
|
223 | |
label = self.get_label(dest.name)
|
224 | |
|
225 | |
if op_cls is None or mode_cls is None:
|
|
225 |
operand = IndirectY(self.get_label(dest.ref.name))
|
|
226 |
else:
|
|
227 |
operand = self.absolute_or_zero_page(self.get_label(dest.name))
|
|
228 |
|
|
229 |
if op_cls is None:
|
226 | 230 |
raise UnsupportedOpcodeError(instr)
|
227 | |
self.emitter.emit(op_cls(mode_cls(label)))
|
|
231 |
self.emitter.emit(op_cls(operand))
|
228 | 232 |
elif opcode == 'add':
|
229 | 233 |
if dest == REG_A:
|
230 | 234 |
if isinstance(src, ConstantRef):
|