worker/master split
[clump.git] / asm.pm
diff --git a/asm.pm b/asm.pm
index d07004e5cc6cf65e78b1c42c7dfc617826b170bb..492bfccc1e2764dce4e1a4c0f20a3f615a17e854 100644 (file)
--- a/asm.pm
+++ b/asm.pm
@@ -102,6 +102,7 @@ sub loadi {
 }
 
 sub flag_zero { 0 }
+sub flag_temp { 7 }
 
 sub flag_news { 8 + $_[0] }
 
@@ -172,3 +173,57 @@ sub addC {
        my ($addrA, $addrB, $addrC, $flag_carry) = @_;
        alu3 aluc_add, alus_add, $addrA, $addrB, $addrC, $flag_carry, $flag_carry;
 }
+
+# news_gen face partea de mijloc
+# news_[mf][mf] face primul alu3, apeleaza news_gen, apoi face ultimul alu3
+sub news_generic {
+       my ($nX, $nY, $dest) = @_;
+       my %dest = %$dest;
+       while ($nX || $nY) {
+               my $direction;
+               if ($nX && $nY) {
+                       $nX--;
+                       $nY--;
+                       $direction = 7;
+               } elsif ($nX) {
+                       $nX--;
+                       $direction = 0;
+               } else {
+                       $nY--;
+                       $direction = 6;
+               }
+               if ($nX || $nY) { # not the last go
+                       alu3 alu_select_f, alu_select_a, 0, 0, 0, flag_news($direction), flag_zero
+               } elsif (exists $dest{address}) {
+                       alu3 alu_select_f, alu_select_f, 0, 0, $dest{address}, flag_news($direction), flag_zero
+               } elsif (exists $dest{flag}) {
+                       alu3 alu_select_f, alu_select_a, 0, 0, 0, flag_news($direction), $dest{flag}
+               } else {
+                       die "No destination address nor flag given to [news_generic]\n"
+               }
+       }
+}
+
+sub news_mm {
+       my ($addrIN, $addrOUT, $nX, $nY) = @_;
+       alu3 alu_select_a, alu_select_a, $addrIN, 0, $addrIN, flag_zero, flag_zero;
+       news_generic $nX, $nY, {address => $addrOUT};
+}
+
+sub news_mf {
+       my ($addrIN, $flagOUT, $nX, $nY) = @_;
+       alu3 alu_select_a, alu_select_a, $addrIN, 0, $addrIN, flag_zero, flag_zero;
+       news_generic $nX, $nY, {flag => $flagOUT};
+}
+
+sub news_fm {
+       my ($flagIN, $addrOUT, $nX, $nY) = @_;
+       alu3 alu_select_f, alu_select_a, 0, 0, 0, $flagIN, flag_zero;
+       news_generic $nX, $nY, {address => $addrOUT};
+}
+
+sub news_ff {
+       my ($flagIN, $flagOUT, $nX, $nY) = @_;
+       alu3 alu_select_f, alu_select_a, 0, 0, 0, $flagIN, flag_zero;
+       news_generic $nX, $nY, {flag => $flagOUT};
+}
This page took 0.00956 seconds and 4 git commands to generate.