41 | 41 |
else:
|
42 | 42 |
raise NotImplementedError(index)
|
43 | 43 |
|
|
44 |
def compute_length_of_defn(self, defn):
|
|
45 |
length = None
|
|
46 |
type_ = defn.location.type
|
|
47 |
if type_ == TYPE_BYTE:
|
|
48 |
length = 1
|
|
49 |
elif type_ == TYPE_WORD or isinstance(type_, (PointerType, VectorType)):
|
|
50 |
length = 2
|
|
51 |
elif isinstance(type_, TableType):
|
|
52 |
length = type_.size * (1 if type_.of_type == TYPE_BYTE else 2)
|
|
53 |
elif isinstance(type_, BufferType):
|
|
54 |
length = type_.size
|
|
55 |
if length is None:
|
|
56 |
raise NotImplementedError("Need size for type {}".format(type_))
|
|
57 |
return length
|
|
58 |
|
|
59 |
def get_label(self, name):
|
|
60 |
return self.labels[name]
|
|
61 |
|
44 | 62 |
# visitor methods
|
45 | 63 |
|
46 | 64 |
def compile_program(self, program):
|
47 | 65 |
assert isinstance(program, Program)
|
48 | 66 |
|
49 | 67 |
for defn in program.defns:
|
50 | |
# compute length of memory pointed to. this is awful.
|
51 | |
length = None
|
52 | |
type_ = defn.location.type
|
53 | |
if type_ == TYPE_BYTE:
|
54 | |
length = 1
|
55 | |
elif type_ == TYPE_WORD or isinstance(type_, (PointerType, VectorType)):
|
56 | |
length = 2
|
57 | |
elif isinstance(type_, TableType):
|
58 | |
length = type_.size * (1 if type_.of_type == TYPE_BYTE else 2)
|
59 | |
elif isinstance(type_, BufferType):
|
60 | |
length = type_.size
|
61 | |
if length is None:
|
62 | |
raise NotImplementedError("Need size for type {}".format(type_))
|
|
68 |
length = self.compute_length_of_defn(defn)
|
63 | 69 |
self.labels[defn.name] = Label(defn.name, addr=defn.addr, length=length)
|
64 | 70 |
|
65 | 71 |
for routine in program.routines:
|
|
76 | 82 |
|
77 | 83 |
for location, label in self.trampolines.iteritems():
|
78 | 84 |
self.emitter.resolve_label(label)
|
79 | |
self.emitter.emit(JMP(Indirect(self.labels[location.name])))
|
|
85 |
self.emitter.emit(JMP(Indirect(self.get_label(location.name))))
|
80 | 86 |
self.emitter.emit(RTS())
|
81 | 87 |
|
82 | 88 |
# initialized data
|
83 | 89 |
for defn in program.defns:
|
84 | 90 |
if defn.initial is not None:
|
85 | |
label = self.labels[defn.name]
|
|
91 |
label = self.get_label(defn.name)
|
86 | 92 |
initial_data = None
|
87 | 93 |
type_ = defn.location.type
|
88 | 94 |
if type_ == TYPE_BYTE:
|
|
100 | 106 |
# uninitialized, "BSS" data
|
101 | 107 |
for defn in program.defns:
|
102 | 108 |
if defn.initial is None and defn.addr is None:
|
103 | |
label = self.labels[defn.name]
|
|
109 |
label = self.get_label(defn.name)
|
104 | 110 |
self.emitter.resolve_bss_label(label)
|
105 | 111 |
|
106 | 112 |
|
107 | 113 |
def compile_routine(self, routine):
|
108 | 114 |
assert isinstance(routine, Routine)
|
109 | 115 |
if routine.block:
|
110 | |
self.emitter.resolve_label(self.labels[routine.name])
|
|
116 |
self.emitter.resolve_label(self.get_label(routine.name))
|
111 | 117 |
self.compile_block(routine.block)
|
112 | 118 |
self.emitter.emit(RTS())
|
113 | 119 |
|
|
131 | 137 |
elif isinstance(src, ConstantRef):
|
132 | 138 |
self.emitter.emit(LDA(Immediate(Byte(src.value))))
|
133 | 139 |
elif isinstance(src, IndexedRef) and src.index == REG_X:
|
134 | |
self.emitter.emit(LDA(AbsoluteX(self.labels[src.name])))
|
|
140 |
self.emitter.emit(LDA(AbsoluteX(self.get_label(src.name))))
|
135 | 141 |
elif isinstance(src, IndexedRef) and src.index == REG_Y:
|
136 | |
self.emitter.emit(LDA(AbsoluteY(self.labels[src.name])))
|
|
142 |
self.emitter.emit(LDA(AbsoluteY(self.get_label(src.name))))
|
137 | 143 |
elif isinstance(src, IndirectRef) and isinstance(src.ref.type, PointerType):
|
138 | |
self.emitter.emit(LDA(IndirectY(self.labels[src.ref.name])))
|
139 | |
else:
|
140 | |
self.emitter.emit(LDA(Absolute(self.labels[src.name])))
|
|
144 |
self.emitter.emit(LDA(IndirectY(self.get_label(src.ref.name))))
|
|
145 |
else:
|
|
146 |
self.emitter.emit(LDA(Absolute(self.get_label(src.name))))
|
141 | 147 |
elif dest == REG_X:
|
142 | 148 |
if src == REG_A:
|
143 | 149 |
self.emitter.emit(TAX())
|
144 | 150 |
elif isinstance(src, ConstantRef):
|
145 | 151 |
self.emitter.emit(LDX(Immediate(Byte(src.value))))
|
146 | 152 |
elif isinstance(src, IndexedRef) and src.index == REG_Y:
|
147 | |
self.emitter.emit(LDX(AbsoluteY(self.labels[src.name])))
|
148 | |
else:
|
149 | |
self.emitter.emit(LDX(Absolute(self.labels[src.name])))
|
|
153 |
self.emitter.emit(LDX(AbsoluteY(self.get_label(src.name))))
|
|
154 |
else:
|
|
155 |
self.emitter.emit(LDX(Absolute(self.get_label(src.name))))
|
150 | 156 |
elif dest == REG_Y:
|
151 | 157 |
if src == REG_A:
|
152 | 158 |
self.emitter.emit(TAY())
|
153 | 159 |
elif isinstance(src, ConstantRef):
|
154 | 160 |
self.emitter.emit(LDY(Immediate(Byte(src.value))))
|
155 | 161 |
elif isinstance(src, IndexedRef) and src.index == REG_X:
|
156 | |
self.emitter.emit(LDY(AbsoluteX(self.labels[src.name])))
|
157 | |
else:
|
158 | |
self.emitter.emit(LDY(Absolute(self.labels[src.name])))
|
|
162 |
self.emitter.emit(LDY(AbsoluteX(self.get_label(src.name))))
|
|
163 |
else:
|
|
164 |
self.emitter.emit(LDY(Absolute(self.get_label(src.name))))
|
159 | 165 |
else:
|
160 | 166 |
raise UnsupportedOpcodeError(instr)
|
161 | 167 |
elif opcode == 'st':
|
|
175 | 181 |
REG_X: AbsoluteX,
|
176 | 182 |
REG_Y: AbsoluteY,
|
177 | 183 |
}[dest.index]
|
178 | |
label = self.labels[dest.ref.name]
|
|
184 |
label = self.get_label(dest.ref.name)
|
179 | 185 |
elif isinstance(dest, IndirectRef) and isinstance(dest.ref.type, PointerType):
|
180 | 186 |
mode_cls = IndirectY
|
181 | |
label = self.labels[dest.ref.name]
|
|
187 |
label = self.get_label(dest.ref.name)
|
182 | 188 |
else:
|
183 | 189 |
mode_cls = Absolute
|
184 | |
label = self.labels[dest.name]
|
|
190 |
label = self.get_label(dest.name)
|
185 | 191 |
|
186 | 192 |
if op_cls is None or mode_cls is None:
|
187 | 193 |
raise UnsupportedOpcodeError(instr)
|
|
191 | 197 |
if isinstance(src, ConstantRef):
|
192 | 198 |
self.emitter.emit(ADC(Immediate(Byte(src.value))))
|
193 | 199 |
else:
|
194 | |
self.emitter.emit(ADC(Absolute(self.labels[src.name])))
|
|
200 |
self.emitter.emit(ADC(Absolute(self.get_label(src.name))))
|
195 | 201 |
elif isinstance(dest, LocationRef) and src.type == TYPE_WORD and dest.type == TYPE_WORD:
|
196 | 202 |
if isinstance(src, ConstantRef):
|
197 | |
dest_label = self.labels[dest.name]
|
|
203 |
dest_label = self.get_label(dest.name)
|
198 | 204 |
self.emitter.emit(LDA(Absolute(dest_label)))
|
199 | 205 |
self.emitter.emit(ADC(Immediate(Byte(src.low_byte()))))
|
200 | 206 |
self.emitter.emit(STA(Absolute(dest_label)))
|
|
202 | 208 |
self.emitter.emit(ADC(Immediate(Byte(src.high_byte()))))
|
203 | 209 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
204 | 210 |
elif isinstance(src, LocationRef):
|
205 | |
src_label = self.labels[src.name]
|
206 | |
dest_label = self.labels[dest.name]
|
|
211 |
src_label = self.get_label(src.name)
|
|
212 |
dest_label = self.get_label(dest.name)
|
207 | 213 |
self.emitter.emit(LDA(Absolute(dest_label)))
|
208 | 214 |
self.emitter.emit(ADC(Absolute(src_label)))
|
209 | 215 |
self.emitter.emit(STA(Absolute(dest_label)))
|
|
214 | 220 |
raise UnsupportedOpcodeError(instr)
|
215 | 221 |
elif isinstance(dest, LocationRef) and src.type == TYPE_WORD and isinstance(dest.type, PointerType):
|
216 | 222 |
if isinstance(src, ConstantRef):
|
217 | |
dest_label = self.labels[dest.name]
|
|
223 |
dest_label = self.get_label(dest.name)
|
218 | 224 |
self.emitter.emit(LDA(ZeroPage(dest_label)))
|
219 | 225 |
self.emitter.emit(ADC(Immediate(Byte(src.low_byte()))))
|
220 | 226 |
self.emitter.emit(STA(ZeroPage(dest_label)))
|
|
222 | 228 |
self.emitter.emit(ADC(Immediate(Byte(src.high_byte()))))
|
223 | 229 |
self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1))))
|
224 | 230 |
elif isinstance(src, LocationRef):
|
225 | |
src_label = self.labels[src.name]
|
226 | |
dest_label = self.labels[dest.name]
|
|
231 |
src_label = self.get_label(src.name)
|
|
232 |
dest_label = self.get_label(dest.name)
|
227 | 233 |
self.emitter.emit(LDA(ZeroPage(dest_label)))
|
228 | 234 |
self.emitter.emit(ADC(Absolute(src_label)))
|
229 | 235 |
self.emitter.emit(STA(ZeroPage(dest_label)))
|
|
239 | 245 |
if isinstance(src, ConstantRef):
|
240 | 246 |
self.emitter.emit(SBC(Immediate(Byte(src.value))))
|
241 | 247 |
else:
|
242 | |
self.emitter.emit(SBC(Absolute(self.labels[src.name])))
|
|
248 |
self.emitter.emit(SBC(Absolute(self.get_label(src.name))))
|
243 | 249 |
elif isinstance(dest, LocationRef) and src.type == TYPE_WORD and dest.type == TYPE_WORD:
|
244 | 250 |
if isinstance(src, ConstantRef):
|
245 | |
dest_label = self.labels[dest.name]
|
|
251 |
dest_label = self.get_label(dest.name)
|
246 | 252 |
self.emitter.emit(LDA(Absolute(dest_label)))
|
247 | 253 |
self.emitter.emit(SBC(Immediate(Byte(src.low_byte()))))
|
248 | 254 |
self.emitter.emit(STA(Absolute(dest_label)))
|
|
250 | 256 |
self.emitter.emit(SBC(Immediate(Byte(src.high_byte()))))
|
251 | 257 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
252 | 258 |
elif isinstance(src, LocationRef):
|
253 | |
src_label = self.labels[src.name]
|
254 | |
dest_label = self.labels[dest.name]
|
|
259 |
src_label = self.get_label(src.name)
|
|
260 |
dest_label = self.get_label(dest.name)
|
255 | 261 |
self.emitter.emit(LDA(Absolute(dest_label)))
|
256 | 262 |
self.emitter.emit(SBC(Absolute(src_label)))
|
257 | 263 |
self.emitter.emit(STA(Absolute(dest_label)))
|
|
268 | 274 |
elif dest == REG_Y:
|
269 | 275 |
self.emitter.emit(INY())
|
270 | 276 |
else:
|
271 | |
self.emitter.emit(INC(Absolute(self.labels[dest.name])))
|
|
277 |
self.emitter.emit(INC(Absolute(self.get_label(dest.name))))
|
272 | 278 |
elif opcode == 'dec':
|
273 | 279 |
if dest == REG_X:
|
274 | 280 |
self.emitter.emit(DEX())
|
275 | 281 |
elif dest == REG_Y:
|
276 | 282 |
self.emitter.emit(DEY())
|
277 | 283 |
else:
|
278 | |
self.emitter.emit(DEC(Absolute(self.labels[dest.name])))
|
|
284 |
self.emitter.emit(DEC(Absolute(self.get_label(dest.name))))
|
279 | 285 |
elif opcode == 'cmp':
|
280 | 286 |
cls = {
|
281 | 287 |
'a': CMP,
|
|
287 | 293 |
if isinstance(src, ConstantRef):
|
288 | 294 |
self.emitter.emit(cls(Immediate(Byte(src.value))))
|
289 | 295 |
else:
|
290 | |
self.emitter.emit(cls(Absolute(self.labels[src.name])))
|
|
296 |
self.emitter.emit(cls(Absolute(self.get_label(src.name))))
|
291 | 297 |
elif opcode in ('and', 'or', 'xor',):
|
292 | 298 |
cls = {
|
293 | 299 |
'and': AND,
|
|
298 | 304 |
if isinstance(src, ConstantRef):
|
299 | 305 |
self.emitter.emit(cls(Immediate(Byte(src.value))))
|
300 | 306 |
else:
|
301 | |
self.emitter.emit(cls(Absolute(self.labels[src.name])))
|
|
307 |
self.emitter.emit(cls(Absolute(self.get_label(src.name))))
|
302 | 308 |
else:
|
303 | 309 |
raise UnsupportedOpcodeError(instr)
|
304 | 310 |
elif opcode in ('shl', 'shr'):
|
|
312 | 318 |
raise UnsupportedOpcodeError(instr)
|
313 | 319 |
elif opcode == 'call':
|
314 | 320 |
location = instr.location
|
315 | |
label = self.labels[instr.location.name]
|
|
321 |
label = self.get_label(instr.location.name)
|
316 | 322 |
if isinstance(location.type, RoutineType):
|
317 | 323 |
self.emitter.emit(JSR(Absolute(label)))
|
318 | 324 |
elif isinstance(location.type, VectorType):
|
|
324 | 330 |
raise NotImplementedError
|
325 | 331 |
elif opcode == 'goto':
|
326 | 332 |
location = instr.location
|
327 | |
label = self.labels[instr.location.name]
|
|
333 |
label = self.get_label(instr.location.name)
|
328 | 334 |
if isinstance(location.type, RoutineType):
|
329 | 335 |
self.emitter.emit(JMP(Absolute(label)))
|
330 | 336 |
elif isinstance(location.type, VectorType):
|
|
382 | 388 |
if isinstance(src, (LocationRef, ConstantRef)) and isinstance(dest, IndirectRef):
|
383 | 389 |
if src.type == TYPE_BYTE and isinstance(dest.ref.type, PointerType):
|
384 | 390 |
if isinstance(src, ConstantRef):
|
385 | |
dest_label = self.labels[dest.ref.name]
|
|
391 |
dest_label = self.get_label(dest.ref.name)
|
386 | 392 |
self.emitter.emit(LDA(Immediate(Byte(src.value))))
|
387 | 393 |
self.emitter.emit(STA(IndirectY(dest_label)))
|
388 | 394 |
elif isinstance(src, LocationRef):
|
389 | |
src_label = self.labels[src.name]
|
390 | |
dest_label = self.labels[dest.ref.name]
|
|
395 |
src_label = self.get_label(src.name)
|
|
396 |
dest_label = self.get_label(dest.ref.name)
|
391 | 397 |
self.emitter.emit(LDA(Absolute(src_label)))
|
392 | 398 |
self.emitter.emit(STA(IndirectY(dest_label)))
|
393 | 399 |
else:
|
|
396 | 402 |
raise NotImplementedError((src, dest))
|
397 | 403 |
elif isinstance(src, IndirectRef) and isinstance(dest, LocationRef):
|
398 | 404 |
if dest.type == TYPE_BYTE and isinstance(src.ref.type, PointerType):
|
399 | |
src_label = self.labels[src.ref.name]
|
400 | |
dest_label = self.labels[dest.name]
|
|
405 |
src_label = self.get_label(src.ref.name)
|
|
406 |
dest_label = self.get_label(dest.name)
|
401 | 407 |
self.emitter.emit(LDA(IndirectY(src_label)))
|
402 | 408 |
self.emitter.emit(STA(Absolute(dest_label)))
|
403 | 409 |
else:
|
404 | 410 |
raise NotImplementedError((src, dest))
|
405 | 411 |
elif isinstance(src, AddressRef) and isinstance(dest, LocationRef) and \
|
406 | 412 |
isinstance(src.ref.type, BufferType) and isinstance(dest.type, PointerType):
|
407 | |
src_label = self.labels[src.ref.name]
|
408 | |
dest_label = self.labels[dest.name]
|
|
413 |
src_label = self.get_label(src.ref.name)
|
|
414 |
dest_label = self.get_label(dest.name)
|
409 | 415 |
self.emitter.emit(LDA(Immediate(HighAddressByte(src_label))))
|
410 | 416 |
self.emitter.emit(STA(ZeroPage(dest_label)))
|
411 | 417 |
self.emitter.emit(LDA(Immediate(LowAddressByte(src_label))))
|
412 | 418 |
self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1))))
|
413 | 419 |
elif isinstance(src, LocationRef) and isinstance(dest, IndexedRef):
|
414 | 420 |
if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD):
|
415 | |
src_label = self.labels[src.name]
|
416 | |
dest_label = self.labels[dest.ref.name]
|
|
421 |
src_label = self.get_label(src.name)
|
|
422 |
dest_label = self.get_label(dest.ref.name)
|
417 | 423 |
self.emitter.emit(LDA(Absolute(src_label)))
|
418 | 424 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label)))
|
419 | 425 |
self.emitter.emit(LDA(Absolute(Offset(src_label, 1))))
|
420 | 426 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256))))
|
421 | 427 |
elif isinstance(src.type, VectorType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType):
|
422 | 428 |
# FIXME this is the exact same as above - can this be simplified?
|
423 | |
src_label = self.labels[src.name]
|
424 | |
dest_label = self.labels[dest.ref.name]
|
|
429 |
src_label = self.get_label(src.name)
|
|
430 |
dest_label = self.get_label(dest.ref.name)
|
425 | 431 |
self.emitter.emit(LDA(Absolute(src_label)))
|
426 | 432 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label)))
|
427 | 433 |
self.emitter.emit(LDA(Absolute(Offset(src_label, 1))))
|
428 | 434 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256))))
|
429 | 435 |
elif isinstance(src.type, RoutineType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType):
|
430 | |
src_label = self.labels[src.name]
|
431 | |
dest_label = self.labels[dest.ref.name]
|
|
436 |
src_label = self.get_label(src.name)
|
|
437 |
dest_label = self.get_label(dest.ref.name)
|
432 | 438 |
self.emitter.emit(LDA(Immediate(HighAddressByte(src_label))))
|
433 | 439 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label)))
|
434 | 440 |
self.emitter.emit(LDA(Immediate(LowAddressByte(src_label))))
|
|
437 | 443 |
raise NotImplementedError
|
438 | 444 |
elif isinstance(src, ConstantRef) and isinstance(dest, IndexedRef):
|
439 | 445 |
if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD):
|
440 | |
dest_label = self.labels[dest.ref.name]
|
|
446 |
dest_label = self.get_label(dest.ref.name)
|
441 | 447 |
self.emitter.emit(LDA(Immediate(Byte(src.low_byte()))))
|
442 | 448 |
self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label)))
|
443 | 449 |
self.emitter.emit(LDA(Immediate(Byte(src.high_byte()))))
|
|
446 | 452 |
raise NotImplementedError
|
447 | 453 |
elif isinstance(src, IndexedRef) and isinstance(dest, LocationRef):
|
448 | 454 |
if TableType.is_a_table_type(src.ref.type, TYPE_WORD) and dest.type == TYPE_WORD:
|
449 | |
src_label = self.labels[src.ref.name]
|
450 | |
dest_label = self.labels[dest.name]
|
|
455 |
src_label = self.get_label(src.ref.name)
|
|
456 |
dest_label = self.get_label(dest.name)
|
451 | 457 |
self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(src_label)))
|
452 | 458 |
self.emitter.emit(STA(Absolute(dest_label)))
|
453 | 459 |
self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(Offset(src_label, 256))))
|
454 | 460 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
455 | 461 |
elif isinstance(dest.type, VectorType) and isinstance(src.ref.type, TableType) and isinstance(src.ref.type.of_type, VectorType):
|
456 | 462 |
# FIXME this is the exact same as above - can this be simplified?
|
457 | |
src_label = self.labels[src.ref.name]
|
458 | |
dest_label = self.labels[dest.name]
|
|
463 |
src_label = self.get_label(src.ref.name)
|
|
464 |
dest_label = self.get_label(dest.name)
|
459 | 465 |
self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(src_label)))
|
460 | 466 |
self.emitter.emit(STA(Absolute(dest_label)))
|
461 | 467 |
self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(Offset(src_label, 256))))
|
|
469 | 475 |
if isinstance(src, ConstantRef):
|
470 | 476 |
raise NotImplementedError
|
471 | 477 |
else:
|
472 | |
src_label = self.labels[src.name]
|
473 | |
dest_label = self.labels[dest.name]
|
|
478 |
src_label = self.get_label(src.name)
|
|
479 |
dest_label = self.get_label(dest.name)
|
474 | 480 |
self.emitter.emit(LDA(Absolute(src_label)))
|
475 | 481 |
self.emitter.emit(STA(Absolute(dest_label)))
|
476 | 482 |
elif src.type == TYPE_WORD and dest.type == TYPE_WORD:
|
477 | 483 |
if isinstance(src, ConstantRef):
|
478 | |
dest_label = self.labels[dest.name]
|
|
484 |
dest_label = self.get_label(dest.name)
|
479 | 485 |
self.emitter.emit(LDA(Immediate(Byte(src.low_byte()))))
|
480 | 486 |
self.emitter.emit(STA(Absolute(dest_label)))
|
481 | 487 |
self.emitter.emit(LDA(Immediate(Byte(src.high_byte()))))
|
482 | 488 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
483 | 489 |
else:
|
484 | |
src_label = self.labels[src.name]
|
485 | |
dest_label = self.labels[dest.name]
|
|
490 |
src_label = self.get_label(src.name)
|
|
491 |
dest_label = self.get_label(dest.name)
|
486 | 492 |
self.emitter.emit(LDA(Absolute(src_label)))
|
487 | 493 |
self.emitter.emit(STA(Absolute(dest_label)))
|
488 | 494 |
self.emitter.emit(LDA(Absolute(Offset(src_label, 1))))
|
489 | 495 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
490 | 496 |
elif isinstance(src.type, VectorType) and isinstance(dest.type, VectorType):
|
491 | |
src_label = self.labels[src.name]
|
492 | |
dest_label = self.labels[dest.name]
|
|
497 |
src_label = self.get_label(src.name)
|
|
498 |
dest_label = self.get_label(dest.name)
|
493 | 499 |
self.emitter.emit(LDA(Absolute(src_label)))
|
494 | 500 |
self.emitter.emit(STA(Absolute(dest_label)))
|
495 | 501 |
self.emitter.emit(LDA(Absolute(Offset(src_label, 1))))
|
496 | 502 |
self.emitter.emit(STA(Absolute(Offset(dest_label, 1))))
|
497 | 503 |
elif isinstance(src.type, RoutineType) and isinstance(dest.type, VectorType):
|
498 | |
src_label = self.labels[src.name]
|
499 | |
dest_label = self.labels[dest.name]
|
|
504 |
src_label = self.get_label(src.name)
|
|
505 |
dest_label = self.get_label(dest.name)
|
500 | 506 |
self.emitter.emit(LDA(Immediate(HighAddressByte(src_label))))
|
501 | 507 |
self.emitter.emit(STA(Absolute(dest_label)))
|
502 | 508 |
self.emitter.emit(LDA(Immediate(LowAddressByte(src_label))))
|