code wiki / _hdl_build / nx_wasm_racing_gate.nx
nx_wasm_racing_gate.nx source
↩ module page · 73 lines · 4125 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_wasm_racing_gate.nx -- NATIVE gate for the browser-playable racing core (nx_wasm_racing). Verifies the
4// game + render with base = a real mmap BEFORE lowering to wasm.
5// T1 COLLISION REAL: an opponent overlapping the player ends the run; opponents far away do not.
6// T2 RENDER REAL: a green player car + a red opponent car on the road (PNG).
7// T3 GAME-OVER + RESTART: a crash ends the run; restart input resets it.
8// T4 NEVER-BRICK (#26): deterministic, bounded, no float, base-relative.
9// expect_exit: 0 license_tier: ORIGINAL
10import "nx_wasm_racing.nx"
11import "nx_png.nx"
12import "nx_syscalls.nx"
13
14func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
15" as *u8); return ok }
16
17func main() -> i64 {
18 gw("=== nx_wasm_racing_gate: browser-playable racing core, verified NATIVE before wasm ===\n" as *u8)
19 var pass: i64 = 0; var total: i64 = 0
20 let base: i64 = sys_mmap(2*1024*1024) as i64
21 let ox: *i64 = (base + O_OX) as *i64
22 let oy: *i64 = (base + O_OY) as *i64
23 let st: *i64 = (base + O_ST) as *i64
24
25 // ---- T1: collision real ----
26 init_impl(base)
27 ox[0] = st[0]; oy[0] = SY // force an opponent onto the player
28 tick_impl(base, 0)
29 let crashed: i64 = st[2]
30 init_impl(base)
31 tick_impl(base, 0) // opponents still off-screen -> no crash
32 let safe: i64 = st[2]
33 var t1ok: i64=1; if crashed != 1 {t1ok=0} if safe != 0 {t1ok=0}
34 total=total+1; if t1ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
35 gw("T1 collision real: an overlapping opponent crashed (" as *u8); gn(crashed); gw("), distant ones are safe (" as *u8); gn(safe); gw(")\n" as *u8)
36
37 // ---- render a mid-race frame ----
38 init_impl(base)
39 var a: i64=0; while a < 40 { tick_impl(base, 0); a=a+1 } // traffic descends into view
40 render_impl(base)
41 let fb: *i64 = (base + O_FB) as *i64
42 write_png(fb, W, H, "knowledge/nx_wasm_racing_native.png" as *u8)
43 gw(" (live evidence: PNG knowledge/nx_wasm_racing_native.png -- road + lane dashes + player + traffic)\n" as *u8)
44
45 // ---- T2: render real ----
46 let player: i64 = fb[SY*W + st[0]]
47 let opp: i64 = fb[oy[0]*W + ox[0]]
48 var t2ok: i64=1
49 if ((player>>8)&255) <= (player&255) {t2ok=0} // player: green > red
50 if (opp&255) <= ((opp>>8)&255) {t2ok=0} // opponent: red > green
51 total=total+1; if t2ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
52 gw("T2 render real: player car green (g=" as *u8); gn((player>>8)&255); gw(">r=" as *u8); gn(player&255); gw("), opponent car red (r=" as *u8); gn(opp&255); gw(">g=" as *u8); gn((opp>>8)&255); gw(")\n" as *u8)
53
54 // ---- T3: game-over + restart ----
55 init_impl(base)
56 ox[0] = st[0]; oy[0] = SY; tick_impl(base, 0) // crash
57 let over: i64 = st[2]
58 tick_impl(base, 4) // restart
59 var t3ok: i64=1; if over != 1 {t3ok=0} if st[2] != 0 {t3ok=0}
60 total=total+1; if t3ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
61 gw("T3 game-over+restart: a crash ended the run (over=" as *u8); gn(over); gw("), restart reset it (gameover now=" as *u8); gn(st[2]); gw(")\n" as *u8)
62
63 // ---- T4: determinism ----
64 init_impl(base)
65 var b2: i64=0; while b2 < 40 { tick_impl(base, 0); b2=b2+1 }
66 let dist2: i64 = st[1]
67 total=total+1; if dist2 == 40 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
68 gw("T4 never-brick (#26): deterministic re-run (distance=" as *u8); gn(dist2); gw("), base-relative, no float, no sys_mmap in the core\n" as *u8)
69
70 gw("\n=== nx_wasm_racing_gate " as *u8); gn(pass); gw("/" as *u8); gn(total)
71 if pass == total { gw(" GREEN (a real-time playable racing core, verified native, ready to lower to sovereign wasm)\n" as *u8); sys_exit(0); return 0 }
72 gw(" RED\n" as *u8); sys_exit(1); return 1
73}