code wiki / _hdl_build / nx_charlab_wasm_vet.nx
nx_charlab_wasm_vet.nx source
↩ module page · 94 lines · 4455 B
1// nx_charlab_wasm_vet.nx -- VET THE SHIPPED CHARLAB BYTES on nx_wasm_vm vs the native twin. Charlab is
2// ALL-INTEGER (skeleton/IK/regions/render), so the ENTIRE composed surface vets byte-for-byte: 240 scripted
3// ticks (mouse sweep + breathing toggle + a mid-script RESET) -> both region worlds AND the full rendered
4// frame IDENTICAL. license_tier: ORIGINAL expect_exit: 0
5import "nx_syscalls.nx"
6import "nx_wasm_charlab.nx"
7import "nx_wasm_vm.nx"
8const K_MAGIC_803200: i64 = 803200
9const K_MAGIC_810112: i64 = 810112
10const K_MAGIC_6848: i64 = 6848
11const K_MAGIC_614400: i64 = 614400
12
13func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
14func pn(v: i64) -> i64 {
15 let b: *u8 = sys_mmap(32) as *u8
16 var x: i64 = v
17 var neg: i64 = 0
18 if x < 0 { neg = 1; x = 0 - x }
19 var i: i64 = 31
20 if x == 0 { b[i] = 48 as u8; i = i - 1 }
21 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 }
22 if neg == 1 { b[i] = 45 as u8; i = i - 1 }
23 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i)
24 return 0
25}
26
27func main() -> i64 {
28 var fails: i64 = 0
29 let lenp: *i64 = sys_mmap(16) as *i64
30 let wb: *u8 = sys_read_file("web_assets/nx_charlab.wasm" as *u8, lenp)
31 if (wb as i64) == 0 { hw("VET RED: cannot read web_assets/nx_charlab.wasm\n" as *u8); return 1 }
32 let mod: *WasmMod = wm_new(wb, lenp[0])
33 if wm_parse(mod) != 0 { hw("VET RED: wasm parse failed\n" as *u8); return 1 }
34 hw("V1 parse OK bytes=" as *u8); pn(lenp[0])
35 var missing: i64 = 0
36 if wm_find_export(mod, "start" as *u8) < 0 { missing = missing + 1 }
37 if wm_find_export(mod, "tick" as *u8) < 0 { missing = missing + 1 }
38 if wm_find_export(mod, "render" as *u8) < 0 { missing = missing + 1 }
39 if missing == 0 { hw(" exports OK\n" as *u8) } else { hw("\nV1 FAIL missing exports\n" as *u8); return 1 }
40
41 let nb: i64 = sys_mmap(mem_bytes()) as i64
42 start_at(nb)
43 wm_run(mod, "start" as *u8, 0, 0, 0, 0, 0, 0)
44 var t: i64 = 0
45 while t < 240 {
46 var mx: i64 = 60 + (t * 3) % 200
47 var my: i64 = 40 + (t * 2) % 140
48 var bt: i64 = 0
49 if t == 60 { bt = 1 } // breathing toggle
50 if t == 140 { bt = 2 } // mid-script RESET
51 tick_at(nb, mx, my, bt)
52 wm_run(mod, "tick" as *u8, mx, my, bt, 0, 0, 3)
53 t = t + 1
54 }
55 // V2 both region worlds identical (⚠pointers LET-BOUND: the inline ((p+X) as *i64)[k] form MISCOMPILES
56 // -- the documented nx landmine; it made ALL slots read as diffs here while the frame was identical)
57 let rl: *i64 = (nb + K_MAGIC_803200) as *i64
58 let rr: *i64 = (nb + K_MAGIC_810112) as *i64
59 var diff: i64 = 0
60 var k: i64 = 0
61 while k < K_MAGIC_6848 / 8 {
62 if wm_ld64(mod.mem, K_MAGIC_803200 + k * 8) != rl[k] { diff = diff + 1 }
63 if wm_ld64(mod.mem, K_MAGIC_810112 + k * 8) != rr[k] { diff = diff + 1 }
64 k = k + 1
65 }
66 if diff == 0 { hw("V2 PASS 240-tick session (sweep+toggle+RESET) -> BOTH region worlds IDENTICAL vm vs native\n" as *u8) }
67 else { hw("V2 FAIL region diff-slots=" as *u8); pn(diff); hw("\n" as *u8); fails = fails + 1 }
68 // V3 skeleton bones identical (4 bones x 32 slots) -- let-bound pointer, same landmine
69 let skp: *i64 = (nb + K_MAGIC_614400) as *i64
70 diff = 0
71 k = 0
72 while k < (256 + 4 * 256) / 8 {
73 if wm_ld64(mod.mem, K_MAGIC_614400 + k * 8) != skp[k] { diff = diff + 1 }
74 k = k + 1
75 }
76 if diff == 0 { hw("V3 PASS skeleton (header+4 bones incl IK-solved angles) IDENTICAL\n" as *u8) }
77 else { hw("V3 FAIL skeleton diff-slots=" as *u8); pn(diff); hw("\n" as *u8); fails = fails + 1 }
78 // V4 full frame
79 render_at(nb)
80 wm_run(mod, "render" as *u8, 0, 0, 0, 0, 0, 0)
81 diff = 0
82 var pi: i64 = 0
83 let nfb: *i64 = (nb + fb_off()) as *i64
84 while pi < ww() * hh() {
85 if wm_ld64(mod.mem, fb_off() + pi * 8) != nfb[pi] { diff = diff + 1 }
86 pi = pi + 1
87 }
88 if diff == 0 { hw("V4 PASS full rendered FRAME byte-identical (" as *u8); pn(ww() * hh()); hw(" px)\n" as *u8) }
89 else { hw("V4 FAIL frame diff px=" as *u8); pn(diff); hw("\n" as *u8); fails = fails + 1 }
90
91 if fails == 0 { hw("VET GREEN: the SHIPPED charlab wasm executes IDENTICALLY to native -- skeleton, IK, flesh, and pixels\n" as *u8); return 0 }
92 hw("VET RED fails=" as *u8); pn(fails); hw("\n" as *u8)
93 return fails
94}