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}