about summary refs log tree commit diff stats
path: root/linux/mu-init.subx
diff options
context:
space:
mode:
Diffstat (limited to 'linux/mu-init.subx')
-rw-r--r--linux/mu-init.subx62
1 files changed, 62 insertions, 0 deletions
diff --git a/linux/mu-init.subx b/linux/mu-init.subx
new file mode 100644
index 00000000..feab920f
--- /dev/null
+++ b/linux/mu-init.subx
@@ -0,0 +1,62 @@
+# Initialize the minimal runtime for Mu programs.
+#
+# See translate_mu for how this file is used.
+#
+# Mu programs start at a function called 'main' with this signature:
+#   fn main args: (addr array addr array byte) -> _/ebx: int
+# If your program doesn't need commandline arguments you can drop it:
+#   fn main -> _/ebx: int
+#
+# Notice that the output must be in ebx, so that the exit() syscall can pick
+# it up.
+
+== code
+
+Entry:
+    # we don't use ebp in Entry; just initialize it
+    bd/copy-to-ebp 0/imm32
+    # - save argc and argv
+    # var argc-and-argv/esi
+    89/<- %esi 4/r32/esp
+$Entry:initialize-heap:
+    # - initialize the heap
+    (new-segment *Heap-size Heap)
+$Entry:initialize-args:
+    # - convert argv from null-terminated 'kernel' strings to length-prefixed Mu strings
+    # var argc/edx: int
+    8b/-> *esi 2/r32/edx
+    # argc is in words; convert it to bytes
+    c1/shift 4/subop/left %edx 2/imm8
+    # var tmp/ebx: handle
+    68/push 0/imm32
+    68/push 0/imm32
+    89/<- %ebx 4/r32/esp
+    # var args/edi: (addr array (addr array byte))
+    (allocate-array Heap %edx %ebx)
+    (lookup *ebx *(ebx+4))  # => eax
+    89/<- %edi 0/r32/eax
+    # var curr/ecx: (addr kernel-string) = argv
+    8d/copy-address *(esi+4) 1/r32/ecx
+    # var max/edx: (addr kernel-string) = argv+4+argc
+    8d/copy-address *(ecx+edx) 2/r32/edx
+    # var dest/esi: (addr (addr array byte)) = args+4
+    8d/copy-address *(edi+4) 6/r32/esi
+    {
+      # if (curr >= max) break
+      39/compare %ecx 2/r32/edx
+      73/jump-if-addr>= break/disp8
+      # *dest = kernel-string-to-string(*curr)
+      (kernel-string-to-string Heap *ecx %ebx)
+      (lookup *ebx *(ebx+4))  # => eax
+      89/<- *esi 0/r32/eax
+      # curr += 4
+      81 0/subop/add %ecx 4/imm32
+      # dest += 4
+      81 0/subop/add %esi 4/imm32
+      #
+      eb/jump loop/disp8
+    }
+    # - run Mu program
+    (main %edi)  # => ebx
+    # - exit
+    (syscall_exit)
or: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
import typetraits

type
  AnyMatrix*[R, C: static[int]; T] = concept m, var mvar, type M
    M.ValueType is T
    M.Rows == R
    M.Cols == C

    m[int, int] is T
    mvar[int, int] = T

    type TransposedType = stripGenericParams(M)[C, R, T]

  AnySquareMatrix*[N: static[int], T] = AnyMatrix[N, N, T]

  AnyTransform3D* = AnyMatrix[4, 4, float]

proc transposed*(m: AnyMatrix): m.TransposedType =
  for r in 0 .. <m.R:
    for c in 0 .. <m.C:
      result[r, c] = m[c, r]

proc determinant*(m: AnySquareMatrix): int =
  return 0

proc setPerspectiveProjection*(m: AnyTransform3D) =
  discard