From 8282a299b15c81aa14dc0efc7fe3a477d5fc320b Mon Sep 17 00:00:00 2001 From: luccie-cmd Date: Wed, 6 Aug 2025 18:51:48 +0200 Subject: [PATCH] Rename preinit to init and add more instructions --- assets/mods/core.wasm | Bin 6017 -> 229 bytes modding/log.zig | 19 ------------------- src/mods/Parser.zig | 10 +++++----- src/mods/vm.zig | 34 +++++++++++++++++++++++++--------- src/sideros.zig | 8 ++++---- 5 files changed, 34 insertions(+), 37 deletions(-) delete mode 100644 modding/log.zig diff --git a/assets/mods/core.wasm b/assets/mods/core.wasm index bc550f73541a40cd100aabef490e21c6cd3f964c..da6e6d11e3532d39f106dcd660f169836994bfc4 100755 GIT binary patch delta 22 dcmZqFf66#Pl}C_?EjKkczo?Rlfn}n}763~k28jRw literal 6017 zcmbtYYiu0V6+Sa_c4oaBuU|==gapMU+RO1y!g|pr{~PQ59A6DFIS{w3Sey-p81kyZ-;89t}ok_phf`N~h7Ox)WV$JqcJyzyidH z9$4u~WL5D)6}7CErXMP)T-hpy69uPQ!hq>Kd`xc>9Th76eVFS&sHvwNN4HvnSgCkXLV=VbBdeMGUDy7t}KKd z3Fy^HqE4|I6J2S<=kgpz-Kn3ws@aNYMS|4srsB$VO1|sT?tSUY)0e?ww@CBwX4P;5 ztWGPJcFUUlIFoM7sO^qd`wdxK`LXgF%;YlKqD3VA0hPc9@TrHPvqgY@07$zP@HT*? z(#uIcDtm|@M{9-Gs!-zph!Xb#GY_Lo@FqxgR#6&!S3;)vRg^8<0Zxiv08UflEmTHQ zeF?4agGsI9=Rk?G#H6AQ13w`yBu^FVzXLoQKv7QD6y6}7ay!~9e7ERR;v(rwQQv`% z7*kLF3y?YnU*8vU%{CzYN)(@A<0dp;jgLv&2(9P9WjEPJt?LZ%EfF{}z&AwT#sPjN(z$hje;I-Ki}?zGFU$kn0&rNs#Q@g{ z7zH>Y;1M*xUcfy7HwgF&L|+u3fODgOf5MHM1Z;r6Hw*YaIJXG67p~qa;By$~mjpZk z(QN{Dp!t^ttU;^W1w09zI{?T?WBkj}RN0rj0Ma&)3cs%K``}@>!-T>Q0;}wSq4628 z#e4^Fg2zzmESufn5RH>8!P3GmbW*$nZPUCCoMrr5l&!oGWri!#4PTA2oh_6d{59}9 zxf}XjyaDBMejS_@tOKv)<4|^U8_HE!9IO~W59u0y6kZ+2+c8IL`6=|cjvqjIJbwV4 z6Zo5uW_b%ZJ$yazdcFvF13!iyPh_0xbP^v#xsi9EJegOZ?1l3$VgmNDF$W_TMWJEH z$o^P|GQ9uR;q!o-A;Ev0QH-+j9@7ARDit+XyC& z0SF%zg=NNfU@(HqDX|VLgY^L3C)u#k^rgC$RNRy)^*UIGp^>-_g`wy_0KJ!uJ5V)7 z@g_`09*vTIH`o~CM@o%{peVb6_fjIjWlikwDT? zrvRnp(78s;Jct5wbRUWn+4u#jBf>^h$hceY1bXsd3uUf=nWUj!1%(H|Q!|%JGZV$B zZ0v*Kcc6f-_rQ8&n2o=K`!aNuUQJ^69gqt58472Bh@TM=pAM|@ax~UBB_=qFGQlkv zo6eU&$6yOKle`C-ExZQO6c4~an*Ra*GTsADE58hBh7X}t8~+QOcD@yy4t@!moqPds z7yk|X<>tUd!|7WgR=<9M5k+^90_7 zR#|=;`aQe~{PnyWoDEzCK9PS7os;-vwB5+F;GE3wg44_2KzR!1!P&&akoIv7oKrEJ zf1|z{Ug-rC!)&;aM)5_49m8aEX4^^q6BK1?wU#%4)GMHMCJbxK_5!8O1Du1+WfFId zCDbXs8mY`Yl)!%1!2kNODs3K38{J#R+k)um5fnG!(>p|A1wPsYiQXac zz4BY=Mt*u{wtFS&M?tT`Y|)PZR<8nB<)HXkLygXiQxeZ~CoCUX1&!c41K<7l;-6$w zGx((Adt#>4e{GGkF+cG3n%;yJj&o_Xm@Xlniacrq3uqASq(5B=xcl&)od-Evub1b2i&;XZa;TfeIh<>c`_Kf z#HyHXV3%Tg(wdb;Y?!FH;tj#^l4sWf%OwY&St(DHT$&D@Dbtl9PgsKm$C<9gcm_|F z7@J;&iq)z^7=b(CM00OBRIH7otW?V=H!WJciz1FJ(8w@E?sTc%5*50wnP@XIIwkH6 zPSNh-e$2mbH@tOi1PKN+Wm9O43xS9!nNBHm%)ly)+r?tlHL=X(n67D4O_pxyl9?Vj zi`*F#dfc-tjM6RJ?gU}9u>xjuFR0MB4_LHw)}m?rH=WSJdRa6p-N&j+)+^^$U8~V= z6fgyUu2R5)S|qbrN44sV<<&|KjMdS|Fff8amaPzN>ex8^Kp=#(jWygO8-9`OQ=wP> z7}3YDm&Qo0Zt$2$X>hR+`FsKW2^c7hTg{LUgIX9AWQiAeyCa^gF_|*eBg2KFMXnVT z{c;o_QpIn_$d#-`Z5h+ihGlUKFNRIz+>sEo4)9mR7P zPr6;HIrg}1mGRV^uuC-I*u~O9UpTm?3K6Ff+oi_nri&CzhLs{+Xcq~AZ55+9Zg4^2 zga}NU#YXW>iPuR~<6&vix6Q}|X3C^eSTX7DxjQd)t#s>Q{1+(YB3p2E;JWHG#0?E0{Hcy@cbe8F+?-| z;K0BTg@X(H7zLAq^-E!BkRpFjhxo)1R11y>D~dDE&o@wh+hjftc2Sq>B!{`R@^xP# zz0pFRDt>KvXrSJT5Kh^FTz*RqnbR{`TjQ-+3yZP~{Rfc&;4;T=2rti#s27LdIiTw& zt|UHDh~!B!o<_7pC!wT+3(<3BlMollY|?T(PBh8Jyj7Z?UFn;qk!Sa-5X5N!93XmS@%jaGHOqf? z$@fO*-ayw#*@q1B={{Vz| zvt&V;&O)gu%6pkssX!n_CuK?cwxc@ZI#sjm_hZLyuJ7>8WotUOWu&h>uq~h8IyzG7 zmjy2ON859#9|yfCgDfvi1(7@N?MOM@jdZ<4r3gbF5U?Mk90 zrTK5^qlpf@I8|M1IbYXil35|Nmc!aiF43Z<^f;XXu)nUC`Q>So5&1O{=FW3oL2) zT4If^rGTbyU*JE5)-3`0!(!z*N^nvwkw4;~lEMqCv6GEXh1v=Q45>6#s8x}rBa>az zg1omJmXPx(N!*DOAu>%xJ7?QAqWx__^d>>Z5xqxzy)RuvLb|#BXYjs^CAVk5I@ab1r&=@}zpo2tPvDug8WOzC return Error.invalid_section, }; } - if (self.exports.preinit != null and self.exports.preinit.? != 0){ - self.exports.preinit.? -= self.importCount; + if (self.exports.init != null and self.exports.init.? != 0){ + self.exports.init.? -= self.importCount; } } @@ -385,7 +385,7 @@ fn parseImportsec(self: *Parser) !void { } else if (std.mem.eql(u8, i.name, "logErr")) { self.exports.logErr = index; } else { - std.log.warn("imported function {s} not supported\n", .{i.name}); + std.debug.panic("imported function {s} not supported\n", .{i.name}); } index += 1; }, @@ -546,8 +546,8 @@ fn parseExportsec(self: *Parser) !void { for (exports) |e| { switch (e.exportdesc) { .func => { - if (std.mem.eql(u8, e.name, "preinit")) { - self.exports.preinit = e.exportdesc.func; + if (std.mem.eql(u8, e.name, "init")) { + self.exports.init = e.exportdesc.func; } else { std.log.warn("exported function {s} not supported\n", .{e.name}); } diff --git a/src/mods/vm.zig b/src/mods/vm.zig index ee621b2..9757e27 100644 --- a/src/mods/vm.zig +++ b/src/mods/vm.zig @@ -33,14 +33,14 @@ pub const Function = struct { func_type: Functype, typ: union(enum) { } }; pub const ExportFunction = enum { - preinit, + init, logErr, logWarn, logInfo, logDebug, }; pub const Exports = struct { - preinit: ?u32 = null, + init: ?u32 = null, logErr: ?u32 = null, logWarn: ?u32 = null, logInfo: ?u32 = null, @@ -372,13 +372,21 @@ pub const Runtime = struct { const b = self.stack.pop().?.i32; try self.stack.append(Value{ .i32 = @intCast(@as(u1, @bitCast(b > a))) }); }, - .i32_le_s => @panic("UNIMPLEMENTED"), + .i32_le_s => { + const a = self.stack.pop().?.i32; + const b = self.stack.pop().?.i32; + try self.stack.append(Value{ .i32 = @intCast(@as(u1, @bitCast(b <= a))) }); + }, .i32_le_u => { const a = self.stack.pop().?.i32; const b = self.stack.pop().?.i32; try self.stack.append(Value{ .i32 = @intCast(@as(u1, @bitCast(b <= a))) }); }, - .i32_ge_s => @panic("UNIMPLEMENTED"), + .i32_ge_s => { + const a = self.stack.pop().?.i32; + const b = self.stack.pop().?.i32; + try self.stack.append(Value{ .i32 = @intCast(@as(u1, @bitCast(b >= a))) }); + }, .i32_ge_u => { const a = self.stack.pop().?.i32; const b = self.stack.pop().?.i32; @@ -471,8 +479,16 @@ pub const Runtime = struct { const b = self.stack.pop().?.i32; try self.stack.append(Value{ .i32 = (b << @as(u5, @intCast(a))) }); }, - .i32_shr_s => @panic("UNIMPLEMENTED"), - .i32_shr_u => @panic("UNIMPLEMENTED"), + .i32_shr_s => { + const a = self.stack.pop().?.i32; + const b = self.stack.pop().?.i32; + try self.stack.append(Value{ .i32 = (b >> @as(u5, @intCast(a))) }); + }, + .i32_shr_u => { + const a = self.stack.pop().?.i32; + const b = self.stack.pop().?.i32; + try self.stack.append(Value{ .i32 = (b >> @as(u5, @intCast(a))) }); + }, .i32_rotl => @panic("UNIMPLEMENTED"), .i32_rotr => @panic("UNIMPLEMENTED"), @@ -581,11 +597,11 @@ pub const Runtime = struct { // TODO: Do name resolution at parseTime pub fn callExternal(self: *Runtime, allocator: Allocator, name: ExportFunction, parameters: []Value) !void { switch (name) { - .preinit => { - if (self.module.exports.preinit) |func| { + .init => { + if (self.module.exports.init) |func| { try self.call(allocator, func, parameters); } else { - std.debug.panic("Function preinit unavailable\n", .{}); + std.debug.panic("Function init unavailable\n", .{}); } }, else => { diff --git a/src/sideros.zig b/src/sideros.zig index 7a7ea57..532e4e1 100644 --- a/src/sideros.zig +++ b/src/sideros.zig @@ -18,8 +18,8 @@ fn init_mods() void { var global_runtime = mods.GlobalRuntime.init(allocator); defer global_runtime.deinit(); - // const file = std.fs.cwd().openFile("assets/mods/core.wasm", .{}) catch @panic("Couldn't open assets/mods/core.wasm"); - const file = std.fs.cwd().openFile("./test.wasm", .{}) catch @panic("Couldn't open test.wasm"); + const file = std.fs.cwd().openFile("assets/mods/core.wasm", .{}) catch @panic("Couldn't open assets/mods/core.wasm"); + // const file = std.fs.cwd().openFile("./test.wasm", .{}) catch @panic("Couldn't open test.wasm"); const all = file.readToEndAlloc(allocator, 1_000_000) catch @panic("Unable to read the file"); // 1 MB defer allocator.free(all); var parser = mods.Parser.init(allocator, all) catch @panic("Failed to init parser"); @@ -38,9 +38,9 @@ fn init_mods() void { defer runtime.deinit(allocator); var parameters = [_]mods.VM.Value{.{ .i32 = 17 }}; - runtime.callExternal(allocator, .preinit, ¶meters) catch @panic("Failed to call to preinit"); + runtime.callExternal(allocator, .init, ¶meters) catch @panic("Failed to call to init"); const result = runtime.stack.pop().?; - std.debug.print("Result of preinit: {any}\n", .{result}); + std.debug.print("Result of init: {any}\n", .{result}); } export fn sideros_init(init: api.GameInit) callconv(.c) void {