summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--]assets/core.wasmbin2912 -> 6017 bytes
-rw-r--r--src/main.zig2
-rw-r--r--src/mods/vm.zig19
3 files changed, 20 insertions, 1 deletions
diff --git a/assets/core.wasm b/assets/core.wasm
index fddfb91..bc550f7 100644..100755
--- a/assets/core.wasm
+++ b/assets/core.wasm
Binary files differ
diff --git a/src/main.zig b/src/main.zig
index 9c3e59d..cb3c1db 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -25,7 +25,7 @@ pub fn main() !void {
//defer runtime.deinit(allocator);
//var parameters = [_]usize{};
- //try runtime.callExternal(allocator, "calculate_fibonacci", &parameters);
+ //try runtime.callExternal(allocator, "preinit", &parameters);
const w = try window.Window.create(800, 600, "sideros");
defer w.destroy();
diff --git a/src/mods/vm.zig b/src/mods/vm.zig
index f8c7db5..2558ced 100644
--- a/src/mods/vm.zig
+++ b/src/mods/vm.zig
@@ -79,6 +79,23 @@ pub const Runtime = struct {
frame.program_counter += 1;
std.debug.print("b: {x}\n", .{byte});
switch (byte) {
+ 0x02 => {
+ var depth: usize = 1;
+ var pc = frame.program_counter;
+ while (depth > 0) {
+ const opcode = frame.code[pc];
+ const operand = frame.code[pc+1];
+ if (opcode == 0x02 and operand == 0x40) {
+ depth += 1;
+ } else if (opcode == 0x0B) {
+ depth -= 1;
+ }
+
+ pc += 1; // Move forward
+ }
+ try self.labels.append(pc);
+ frame.program_counter += 1;
+ },
0x03 => {
try self.labels.append(frame.program_counter);
frame.program_counter += 1;
@@ -479,6 +496,8 @@ pub const Runtime = struct {
pub fn callExternal(self: *Runtime, allocator: Allocator, name: []const u8, parameters: []usize) !void {
if (self.module.exports.get(name)) |function| {
try self.call(allocator, function, parameters);
+ } else {
+ std.debug.panic("Function `{s}` not avaliable", .{name});
}
}