code wiki / (root) / nx_ocr_assemble_gate.nx

nx_ocr_assemble_gate.nx source

↩ module page · 43 lines · 2057 B

1// nx_ocr_assemble_gate.nx -- proves R5 (glyphs -> text). Glyphs fed in SCRAMBLED order (C, A, D, B): 'A','B','C' on 2// the top line (with a wide gap before C) and 'D' on a lower line. Expects the assembler to sort into reading order, 3// insert a space on the wide gap, and break the line -> "AB C\nD". Exit 0 iff all pass. license_tier: ORIGINAL 4import "nx_gate.nx" 5import "nx_ocr_assemble.nx" 6 7func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 8 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 9 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) } 10 return 0 11} 12 13func main() -> i64 { 14 let st: *i64 = sys_mmap(16) as *i64 15 st[0] = 0; st[1] = 0 16 17 let g: *i64 = sys_mmap(4 * GLYPH_FIELDS * 8) as *i64 18 // g0 = 'C' (67) top line, far right [minx,miny,maxx,maxy,char] 19 g[0]=20; g[1]=0; g[2]=22; g[3]=4; g[4]=67 20 // g1 = 'A' (65) top line, left 21 g[5]=0; g[6]=0; g[7]=2; g[8]=4; g[9]=65 22 // g2 = 'D' (68) second line 23 g[10]=0; g[11]=10; g[12]=2; g[13]=14; g[14]=68 24 // g3 = 'B' (66) top line, next to A 25 g[15]=4; g[16]=0; g[17]=6; g[18]=4; g[19]=66 26 27 let out: *u8 = sys_mmap(256) 28 let len: i64 = asm_assemble(g, 4, 5, out) 29 30 chk("assembled length = 6" as *u8, len, 6, st) 31 chk("out[0] = 'A'" as *u8, out[0] as i64, 65, st) 32 chk("out[1] = 'B'" as *u8, out[1] as i64, 66, st) 33 chk("out[2] = ' ' (wide gap -> space)" as *u8, out[2] as i64, 32, st) 34 chk("out[3] = 'C'" as *u8, out[3] as i64, 67, st) 35 chk("out[4] = newline (line break)" as *u8, out[4] as i64, 10, st) 36 chk("out[5] = 'D'" as *u8, out[5] as i64, 68, st) 37 38 gw("assembled text: [" as *u8); sys_write(1, out, len); gw("]\n" as *u8) 39 gw("nx_ocr_assemble_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8) 40 if st[1] == 0 { gw("R5 nx_ocr_assemble: GREEN (glyphs -> lines/words -> text)\n" as *u8); return 0 } 41 gw("R5 nx_ocr_assemble: RED\n" as *u8) 42 return 1 43}