From c194808e6472c067f3f58d142ea5d54414cbc0b3 Mon Sep 17 00:00:00 2001 From: Chris Pressey Date: Mon, 5 Mar 2018 13:23:09 +0000 Subject: [PATCH] Label the various cases for compiling a `copy` instruction. --- src/sixtypical/compiler.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/sixtypical/compiler.py b/src/sixtypical/compiler.py index 3dac877..e9a0e8a 100644 --- a/src/sixtypical/compiler.py +++ b/src/sixtypical/compiler.py @@ -382,10 +382,12 @@ class Compiler(object): if isinstance(src, (LocationRef, ConstantRef)) and isinstance(dest, IndirectRef): if src.type == TYPE_BYTE and isinstance(dest.ref.type, PointerType): if isinstance(src, ConstantRef): + ### copy 123, [ptr] + y dest_label = self.get_label(dest.ref.name) self.emitter.emit(LDA(Immediate(Byte(src.value)))) self.emitter.emit(STA(IndirectY(dest_label))) elif isinstance(src, LocationRef): + ### copy b, [ptr] + y src_label = self.get_label(src.name) dest_label = self.get_label(dest.ref.name) self.emitter.emit(LDA(Absolute(src_label))) @@ -396,6 +398,7 @@ class Compiler(object): raise NotImplementedError((src, dest)) elif isinstance(src, IndirectRef) and isinstance(dest, LocationRef): if dest.type == TYPE_BYTE and isinstance(src.ref.type, PointerType): + ### copy [ptr] + y, b src_label = self.get_label(src.ref.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(IndirectY(src_label))) @@ -404,6 +407,7 @@ class Compiler(object): raise NotImplementedError((src, dest)) elif isinstance(src, AddressRef) and isinstance(dest, LocationRef) and \ isinstance(src.ref.type, BufferType) and isinstance(dest.type, PointerType): + ### copy ^buf, ptr src_label = self.get_label(src.ref.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Immediate(HighAddressByte(src_label)))) @@ -412,6 +416,7 @@ class Compiler(object): self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1)))) elif isinstance(src, LocationRef) and isinstance(dest, IndexedRef): if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD): + ### copy w, wtab + y src_label = self.get_label(src.name) dest_label = self.get_label(dest.ref.name) self.emitter.emit(LDA(Absolute(src_label))) @@ -419,6 +424,7 @@ class Compiler(object): self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256)))) elif isinstance(src.type, VectorType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType): + ### copy vec, vtab + y # FIXME this is the exact same as above - can this be simplified? src_label = self.get_label(src.name) dest_label = self.get_label(dest.ref.name) @@ -427,6 +433,7 @@ class Compiler(object): self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(Offset(dest_label, 256)))) elif isinstance(src.type, RoutineType) and isinstance(dest.ref.type, TableType) and isinstance(dest.ref.type.of_type, VectorType): + ### copy routine, vtab + y src_label = self.get_label(src.name) dest_label = self.get_label(dest.ref.name) self.emitter.emit(LDA(Immediate(HighAddressByte(src_label)))) @@ -437,6 +444,7 @@ class Compiler(object): raise NotImplementedError elif isinstance(src, ConstantRef) and isinstance(dest, IndexedRef): if src.type == TYPE_WORD and TableType.is_a_table_type(dest.ref.type, TYPE_WORD): + ### copy 9999, wtab + y dest_label = self.get_label(dest.ref.name) self.emitter.emit(LDA(Immediate(Byte(src.low_byte())))) self.emitter.emit(STA(self.addressing_mode_for_index(dest.index)(dest_label))) @@ -446,6 +454,7 @@ class Compiler(object): raise NotImplementedError elif isinstance(src, IndexedRef) and isinstance(dest, LocationRef): if TableType.is_a_table_type(src.ref.type, TYPE_WORD) and dest.type == TYPE_WORD: + ### copy wtab + y, w src_label = self.get_label(src.ref.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(src_label))) @@ -453,6 +462,7 @@ class Compiler(object): self.emitter.emit(LDA(self.addressing_mode_for_index(src.index)(Offset(src_label, 256)))) self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) elif isinstance(dest.type, VectorType) and isinstance(src.ref.type, TableType) and isinstance(src.ref.type.of_type, VectorType): + ### copy vtab + y, vec # FIXME this is the exact same as above - can this be simplified? src_label = self.get_label(src.ref.name) dest_label = self.get_label(dest.name) @@ -469,18 +479,21 @@ class Compiler(object): if isinstance(src, ConstantRef): raise NotImplementedError else: + ### copy b1, b2 src_label = self.get_label(src.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Absolute(src_label))) self.emitter.emit(STA(Absolute(dest_label))) elif src.type == TYPE_WORD and dest.type == TYPE_WORD: if isinstance(src, ConstantRef): + ### copy 9999, w dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Immediate(Byte(src.low_byte())))) self.emitter.emit(STA(Absolute(dest_label))) self.emitter.emit(LDA(Immediate(Byte(src.high_byte())))) self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) else: + ### copy w1, w2 src_label = self.get_label(src.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Absolute(src_label))) @@ -488,6 +501,7 @@ class Compiler(object): self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) elif isinstance(src.type, VectorType) and isinstance(dest.type, VectorType): + ### copy v1, v2 src_label = self.get_label(src.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Absolute(src_label))) @@ -495,6 +509,7 @@ class Compiler(object): self.emitter.emit(LDA(Absolute(Offset(src_label, 1)))) self.emitter.emit(STA(Absolute(Offset(dest_label, 1)))) elif isinstance(src.type, RoutineType) and isinstance(dest.type, VectorType): + ### copy routine, vec src_label = self.get_label(src.name) dest_label = self.get_label(dest.name) self.emitter.emit(LDA(Immediate(HighAddressByte(src_label))))