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}