about summary refs log tree commit diff stats
path: root/prototypes
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-07-16 21:30:19 -0700
committerKartik Agaram <vc@akkartik.com>2020-07-16 21:30:19 -0700
commit93c94c6feef50033689756e0c40e20ab538ff360 (patch)
tree362e34c1e96132f728d5936bbf24d4c8654a06d1 /prototypes
parent0e38e7e8689001cb5af92b4ea3fff44fe45bf1e8 (diff)
downloadmu-93c94c6feef50033689756e0c40e20ab538ff360.tar.gz
6652 - function to divide whole numbers
Diffstat (limited to 'prototypes')
-rw-r--r--prototypes/tile/5.mu125
1 files changed, 112 insertions, 13 deletions
diff --git a/prototypes/tile/5.mu b/prototypes/tile/5.mu
index 4ef01caa..a3eac3bf 100644
--- a/prototypes/tile/5.mu
+++ b/prototypes/tile/5.mu
@@ -1,3 +1,30 @@
+# ./a.elf test => run tests
+fn main args-on-stack: (addr array (addr array byte)) -> exit-status/ebx: int {
+  var args/eax: (addr array (addr array byte)) <- copy args-on-stack
+  var tmp/ecx: int <- length args
+  $main-body: {
+    # if (len(args) > 1 && args[1] == "test") run-tests()
+    compare tmp, 1
+    {
+      break-if-<=
+      # if (args[1] == "test") run-tests()
+      var tmp2/ecx: (addr addr array byte) <- index args, 1
+      var tmp3/eax: boolean <- string-equal? *tmp2, "test"
+      compare tmp3, 0
+      {
+        break-if-=
+        run-tests
+        exit-status <- copy 0  # TODO: get at Num-test-failures somehow
+      }
+      break $main-body
+    }
+    # otherwise operate interactively
+    exit-status <- interactive
+  }
+}
+
+# == interactive loop
+
 type cell {
   val: int  # single chars only for now
   parent: (handle cell)
@@ -6,7 +33,7 @@ type cell {
   prev-sibling: (handle cell)
 }
 
-fn main -> exit-status/ebx: int {
+fn interactive -> exit-status/ebx: int {
   var root-handle: (handle cell)
   var root/esi: (addr handle cell) <- address root-handle
   allocate root
@@ -99,18 +126,6 @@ fn tree-depth node-on-stack: (addr cell) -> result/eax: int {
   result <- increment
 }
 
-# slow, iterative divide instruction
-fn try-divide _nr: int, _dr: int -> result/eax: int {
-  result <- copy _nr
-  result <- shift-right 2
-#?   var nr/ecx: int <- copy _nr
-#?   var tmp/ecx: int <- copy 2
-#?   # find nearest power of 2
-#?   {
-#?     k
-#?   }
-}
-
 fn draw-box row1: int, col1: int, row2: int, col2: int {
   draw-horizontal-line row1, col1, col2
   draw-vertical-line row1, row2, col1
@@ -141,3 +156,87 @@ fn draw-vertical-line row1: int, row2: int, col: int {
     loop
   }
 }
+
+# slow, iterative divide instruction
+# preconditions: _nr >= 0, _dr > 0
+fn try-divide _nr: int, _dr: int -> result/eax: int {
+  # x = next power-of-2 multiple of _dr after _nr
+  var x/ecx: int <- copy 1
+  {
+#?     print-int32-hex-to-screen x
+#?     print-string-to-screen "\n"
+    var tmp/edx: int <- copy _dr
+    tmp <- multiply x
+    compare tmp, _nr
+    break-if->
+    x <- shift-left 1
+    loop
+  }
+#?   print-string-to-screen "--\n"
+  # min, max = x/2, x
+  var max/ecx: int <- copy x
+  var min/edx: int <- copy max
+  min <- shift-right 1
+  # narrow down result between min and max
+  var i/eax: int <- copy min
+  {
+#?     print-int32-hex-to-screen i
+#?     print-string-to-screen "\n"
+    var foo/ebx: int <- copy _dr
+    foo <- multiply i
+    compare foo, _nr
+    break-if->
+    i <- increment
+    loop
+  }
+  result <- copy i
+  result <- decrement
+#?   print-string-to-screen "=> "
+#?   print-int32-hex-to-screen result
+#?   print-string-to-screen "\n"
+}
+
+fn test-try-divide-1 {
+  var result/eax: int <- try-divide 0, 2
+  check-ints-equal result, 0, "F - try-divide-1\n"
+}
+
+fn test-try-divide-2 {
+  var result/eax: int <- try-divide 1, 2
+  check-ints-equal result, 0, "F - try-divide-2\n"
+}
+
+fn test-try-divide-3 {
+  var result/eax: int <- try-divide 2, 2
+  check-ints-equal result, 1, "F - try-divide-3\n"
+}
+
+fn test-try-divide-4 {
+  var result/eax: int <- try-divide 4, 2
+  check-ints-equal result, 2, "F - try-divide-4\n"
+}
+
+fn test-try-divide-5 {
+  var result/eax: int <- try-divide 6, 2
+  check-ints-equal result, 3, "F - try-divide-5\n"
+}
+
+fn test-try-divide-6 {
+  var result/eax: int <- try-divide 9, 3
+  check-ints-equal result, 3, "F - try-divide-6\n"
+}
+
+fn test-try-divide-7 {
+  var result/eax: int <- try-divide 0xc, 4
+  check-ints-equal result, 3, "F - try-divide-7\n"
+}
+
+fn test-try-divide-8 {
+  var result/eax: int <- try-divide 0x1b, 3  # 27/3
+  check-ints-equal result, 9, "F - try-divide-8\n"
+}
+
+fn test-try-divide-9 {
+  var result/eax: int <- try-divide 0x1c, 3  # 28/3
+  check-ints-equal result, 9, "F - try-divide-9\n"
+}