nx_toner_store.nx source
↩ module page · 40 lines · 1460 B
1// nx_toner_store.nx -- tiny persistent store for the real-toner ledger (survives across runs, on /mnt/c).
2// 16-byte little-endian file: [0..7]=yield_pages, [8..15]=consumed_ppm. Sovereign sys calls only; it writes
3// a small DATA file (not firmware) -> never-brick (#26). license_tier: ORIGINAL
4// genealogy_id: project-printer-management-ipp-sclass-2026-06-20
5
6import "nx_syscalls.nx"
7
8func nx_tstore_rd_le64(b: *u8, off: i64) -> i64 {
9 var v: i64 = 0
10 var i: i64 = 0
11 while i < 8 { v = v | ((b[off + i] as i64) << (i * 8)); i = i + 1 }
12 return v
13}
14func nx_tstore_wr_le64(b: *u8, off: i64, v: i64) -> i64 {
15 var i: i64 = 0
16 while i < 8 { b[off + i] = ((v >> (i * 8)) & 0xff) as u8; i = i + 1 }
17 return 0
18}
19
20// load -> 1 and fills out_*, or 0 if missing/short.
21func nx_tstore_load(path: *u8, out_yield: *i64, out_consumed: *i64) -> i64 {
22 let lenp: *i64 = sys_mmap(8) as *i64
23 let d: *u8 = sys_read_file(path, lenp)
24 if d == (0 as *u8) { return 0 }
25 if lenp[0] < 16 { return 0 }
26 out_yield[0] = nx_tstore_rd_le64(d, 0)
27 out_consumed[0] = nx_tstore_rd_le64(d, 8)
28 return 1
29}
30// save -> 0 ok / -1 fail
31func nx_tstore_save(path: *u8, yield_pages: i64, consumed: i64) -> i64 {
32 let b: *u8 = sys_mmap(16)
33 nx_tstore_wr_le64(b, 0, yield_pages)
34 nx_tstore_wr_le64(b, 8, consumed)
35 let fd: i64 = sys_openat_wr(path, 0x1a4)
36 if fd < 0 { return 0 - 1 }
37 sys_write(fd, b, 16)
38 sys_close(fd)
39 return 0
40}