code wiki / _hdl_build / nx_wasm_pong_gate.nx
nx_wasm_pong_gate.nx source
↩ module page · 74 lines · 3882 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_wasm_pong_gate.nx -- NATIVE gate for the browser-playable Pong core (nx_wasm_pong).
4// T1 RETURN + SCORE: a ball aligned with the paddle is RETURNED (bvx flips); a missed ball SCORES.
5// T2 RENDER REAL: a green player paddle + a red AI paddle + a white ball (PNG).
6// T3 WALL BOUNCE: the ball reflects off the top wall (bvy flips).
7// T4 NEVER-BRICK (#26): deterministic, bounded, no float, base-relative.
8// expect_exit: 0 license_tier: ORIGINAL
9import "nx_wasm_pong.nx"
10import "nx_png.nx"
11import "nx_syscalls.nx"
12
13func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
14" as *u8); return ok }
15
16func main() -> i64 {
17 gw("=== nx_wasm_pong_gate: browser-playable Pong core, verified NATIVE before wasm ===\n" as *u8)
18 var pass: i64 = 0; var total: i64 = 0
19 let base: i64 = sys_mmap(2*1024*1024) as i64
20 let st: *i64 = (base + O_ST) as *i64
21
22 // ---- T1: return + score ----
23 init_impl(base)
24 st[0] = LX + 3; st[2] = 0 - 3; st[1] = st[4] // ball at the paddle, aligned
25 tick_impl(base, 0)
26 let returned: i64 = st[2] // should flip to +3
27 init_impl(base)
28 st[0] = 1; st[2] = 0 - 3; st[4] = H - PADH // ball at top heading off the left, paddle low
29 let rs0: i64 = st[7]
30 tick_impl(base, 0)
31 let scored: i64 = st[7] - rs0
32 var t1ok: i64=1; if returned <= 0 {t1ok=0} if scored != 1 {t1ok=0}
33 total=total+1; if t1ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
34 gw("T1 return+score: aligned paddle returned the ball (bvx=" as *u8); gn(returned); gw("), a miss scored (+" as *u8); gn(scored); gw(")\n" as *u8)
35
36 // ---- render a mid-rally frame ----
37 init_impl(base)
38 var a: i64=0; while a < 12 { tick_impl(base, 0); a=a+1 }
39 render_impl(base)
40 let fb: *i64 = (base + O_FB) as *i64
41 write_png(fb, W, H, "knowledge/nx_wasm_pong_native.png" as *u8)
42 gw(" (live evidence: PNG knowledge/nx_wasm_pong_native.png -- paddles + ball + scores)\n" as *u8)
43
44 // ---- T2: render real ----
45 let lp: i64 = fb[st[4]*W + LX]
46 let rp: i64 = fb[st[5]*W + RX]
47 var t2ok: i64=1
48 if ((lp>>8)&255) <= (lp&255) {t2ok=0} // player paddle green
49 if (rp&255) <= ((rp>>8)&255) {t2ok=0} // AI paddle red
50 total=total+1; if t2ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
51 gw("T2 render real: player paddle green (g=" as *u8); gn((lp>>8)&255); gw("), AI paddle red (r=" as *u8); gn(rp&255); gw(")\n" as *u8)
52
53 // ---- T3: wall bounce ----
54 init_impl(base)
55 st[1] = 2; st[3] = 0 - 2
56 tick_impl(base, 0)
57 var t3ok: i64=1; if st[3] <= 0 {t3ok=0}
58 total=total+1; if t3ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
59 gw("T3 wall bounce: the ball reflected off the top wall (bvy=" as *u8); gn(st[3]); gw(")\n" as *u8)
60
61 // ---- T4: determinism ----
62 init_impl(base)
63 a=0; while a < 30 { tick_impl(base, 0); a=a+1 }
64 let bx1: i64 = st[0]; let by1: i64 = st[1]
65 init_impl(base)
66 a=0; while a < 30 { tick_impl(base, 0); a=a+1 }
67 var t4ok: i64=1; if st[0] != bx1 {t4ok=0} if st[1] != by1 {t4ok=0}
68 total=total+1; if t4ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
69 gw("T4 never-brick (#26): deterministic re-run (ball " as *u8); gn(st[0]); gw("," as *u8); gn(st[1]); gw("), base-relative, no float, no sys_mmap in the core\n" as *u8)
70
71 gw("\n=== nx_wasm_pong_gate " as *u8); gn(pass); gw("/" as *u8); gn(total)
72 if pass == total { gw(" GREEN (a real-time playable Pong core, verified native, ready to lower to sovereign wasm)\n" as *u8); sys_exit(0); return 0 }
73 gw(" RED\n" as *u8); sys_exit(1); return 1
74}