Label the various cases for compiling a `copy` instruction.
Chris Pressey
4 years ago
381 | 381 | if isinstance(src, (LocationRef, ConstantRef)) and isinstance(dest, IndirectRef): |
382 | 382 | if src.type == TYPE_BYTE and isinstance(dest.ref.type, PointerType): |
383 | 383 | if isinstance(src, ConstantRef): |
384 | ### copy 123, [ptr] + y | |
384 | 385 | dest_label = self.get_label(dest.ref.name) |
385 | 386 | self.emitter.emit(LDA(Immediate(Byte(src.value)))) |
386 | 387 | self.emitter.emit(STA(IndirectY(dest_label))) |
387 | 388 | elif isinstance(src, LocationRef): |
389 | ### copy b, [ptr] + y | |
388 | 390 | src_label = self.get_label(src.name) |
389 | 391 | dest_label = self.get_label(dest.ref.name) |
390 | 392 | self.emitter.emit(LDA(Absolute(src_label))) |
395 | 397 | raise NotImplementedError((src, dest)) |
396 | 398 | elif isinstance(src, IndirectRef) and isinstance(dest, LocationRef): |
397 | 399 | if dest.type == TYPE_BYTE and isinstance(src.ref.type, PointerType): |
400 | ### copy [ptr] + y, b | |
398 | 401 | src_label = self.get_label(src.ref.name) |
399 | 402 | dest_label = self.get_label(dest.name) |
400 | 403 | self.emitter.emit(LDA(IndirectY(src_label))) |
403 | 406 | raise NotImplementedError((src, dest)) |
404 | 407 | elif isinstance(src, AddressRef) and isinstance(dest, LocationRef) and \ |
405 | 408 | isinstance(src.ref.type, BufferType) and isinstance(dest.type, PointerType): |
409 | ### copy ^buf, ptr | |
406 | 410 | src_label = self.get_label(src.ref.name) |
407 | 411 | dest_label = self.get_label(dest.name) |
408 | 412 | self.emitter.emit(LDA(Immediate(HighAddressByte(src_label)))) |
411 | 415 | self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1)))) |
412 | 416 | elif isinstance(src, LocationRef) and isinstance(dest, IndexedRef): |
413 | 417 | if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD): |
418 | ### copy w, wtab + y | |
414 | 419 | src_label = self.get_label(src.name) |
415 | 420 | dest_label = self.get_label(dest.ref.name) |
416 | 421 | self.emitter.emit(LDA(Absolute(src_label))) |
418 | 423 | self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) |
419 | 424 | self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256)))) |
420 | 425 | elif isinstance(src.type, VectorType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType): |
426 | ### copy vec, vtab + y | |
421 | 427 | # FIXME this is the exact same as above - can this be simplified? |
422 | 428 | src_label = self.get_label(src.name) |
423 | 429 | dest_label = self.get_label(dest.ref.name) |
426 | 432 | self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) |
427 | 433 | self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256)))) |
428 | 434 | elif isinstance(src.type, RoutineType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType): |
435 | ### copy routine, vtab + y | |
429 | 436 | src_label = self.get_label(src.name) |
430 | 437 | dest_label = self.get_label(dest.ref.name) |
431 | 438 | self.emitter.emit(LDA(Immediate(HighAddressByte(src_label)))) |
436 | 443 | raise NotImplementedError |
437 | 444 | elif isinstance(src, ConstantRef) and isinstance(dest, IndexedRef): |
438 | 445 | if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD): |
446 | ### copy 9999, wtab + y | |
439 | 447 | dest_label = self.get_label(dest.ref.name) |
440 | 448 | self.emitter.emit(LDA(Immediate(Byte(src.low_byte())))) |
441 | 449 | self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label))) |
445 | 453 | raise NotImplementedError |
446 | 454 | elif isinstance(src, IndexedRef) and isinstance(dest, LocationRef): |
447 | 455 | if TableType.is_a_table_type(src.ref.type, TYPE_WORD) and dest.type == TYPE_WORD: |
456 | ### copy wtab + y, w | |
448 | 457 | src_label = self.get_label(src.ref.name) |
449 | 458 | dest_label = self.get_label(dest.name) |
450 | 459 | self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(src_label))) |
452 | 461 | self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(Offset(src_label, 256)))) |
453 | 462 | self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) |
454 | 463 | elif isinstance(dest.type, VectorType) and isinstance(src.ref.type, TableType) and isinstance(src.ref.type.of_type, VectorType): |
464 | ### copy vtab + y, vec | |
455 | 465 | # FIXME this is the exact same as above - can this be simplified? |
456 | 466 | src_label = self.get_label(src.ref.name) |
457 | 467 | dest_label = self.get_label(dest.name) |
468 | 478 | if isinstance(src, ConstantRef): |
469 | 479 | raise NotImplementedError |
470 | 480 | else: |
481 | ### copy b1, b2 | |
471 | 482 | src_label = self.get_label(src.name) |
472 | 483 | dest_label = self.get_label(dest.name) |
473 | 484 | self.emitter.emit(LDA(Absolute(src_label))) |
474 | 485 | self.emitter.emit(STA(Absolute(dest_label))) |
475 | 486 | elif src.type == TYPE_WORD and dest.type == TYPE_WORD: |
476 | 487 | if isinstance(src, ConstantRef): |
488 | ### copy 9999, w | |
477 | 489 | dest_label = self.get_label(dest.name) |
478 | 490 | self.emitter.emit(LDA(Immediate(Byte(src.low_byte())))) |
479 | 491 | self.emitter.emit(STA(Absolute(dest_label))) |
480 | 492 | self.emitter.emit(LDA(Immediate(Byte(src.high_byte())))) |
481 | 493 | self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) |
482 | 494 | else: |
495 | ### copy w1, w2 | |
483 | 496 | src_label = self.get_label(src.name) |
484 | 497 | dest_label = self.get_label(dest.name) |
485 | 498 | self.emitter.emit(LDA(Absolute(src_label))) |
487 | 500 | self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) |
488 | 501 | self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) |
489 | 502 | elif isinstance(src.type, VectorType) and isinstance(dest.type, VectorType): |
503 | ### copy v1, v2 | |
490 | 504 | src_label = self.get_label(src.name) |
491 | 505 | dest_label = self.get_label(dest.name) |
492 | 506 | self.emitter.emit(LDA(Absolute(src_label))) |
494 | 508 | self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) |
495 | 509 | self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) |
496 | 510 | elif isinstance(src.type, RoutineType) and isinstance(dest.type, VectorType): |
511 | ### copy routine, vec | |
497 | 512 | src_label = self.get_label(src.name) |
498 | 513 | dest_label = self.get_label(dest.name) |
499 | 514 | self.emitter.emit(LDA(Immediate(HighAddressByte(src_label)))) |