about summary refs log tree commit diff stats
path: root/mu-init.subx
diff options
context:
space:
mode:
Diffstat (limited to 'mu-init.subx')
-rw-r--r--mu-init.subx45
1 files changed, 38 insertions, 7 deletions
diff --git a/mu-init.subx b/mu-init.subx
index fb15efbf..2377822e 100644
--- a/mu-init.subx
+++ b/mu-init.subx
@@ -3,7 +3,7 @@
 # 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 kernel-string) -> exit-status/ebx: int
+#   fn main args: (addr array (addr array byte)) -> exit-status/ebx: int
 # If your program doesn't need commandline arguments you can drop it:
 #   fn main -> exit-status/ebx: int
 #
@@ -15,11 +15,42 @@
 Entry:
     # we don't use ebp in Entry; just initialize it
     bd/copy-to-ebp 0/imm32
-    # var args/eax: (addr array kernel-string)
-    89/<- %eax 4/r32/esp
-    # initialize the heap
+    # - 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)
-    # run Mu program
-    (main %eax)
-    # exit
+$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 args/edi: (addr array (addr array byte))
+    (allocate-array Heap %edx)  # => 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)  # => 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)