From 8319182a45ac6f875b32f368f5af1081f4822636 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Tue, 9 Jun 2026 22:53:24 -0700 Subject: [PATCH] catnom: Categories edition of nom + port nom games to AC Native MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Web: lib/nom.mjs grows a 'cat' edition (slang/code/AC-pieces/vibes/keys/ online rounds, spoken-meaning glossary per munch) + disks/catnom.mjs wrapper. Native port (parity per docker-build §2q doctrine — bundle web pieces verbatim, fill API gaps in the runtime): - js-bindings: num.randInt, gizmo.Hourglass + seconds(), top-level speak(), global setTimeout/clearTimeout flushed per sim tick, web-style event.name, positional font arg on write() - font: FONT_UNIFONT 8x16 draw/measure; glyph subset regenerated with ASCII + Cyrillic (1403 → 1754 glyphs) from the in-repo unifont BDF - bundle: nom.mjs + synth.mjs baked into /lib, catnom.mjs into /pieces; dev-push.sh falls back to web disks/ for §2q pieces - prompt: tab-completion description for catnom All 7 nom editions verified end-to-end under the vendored QuickJS. --- fedac/native/docker-build.sh | 4 +- fedac/native/pieces/prompt.mjs | 1 + fedac/native/scripts/bdf-unicode-to-c.py | 2 + fedac/native/scripts/dev-push.sh | 7 +- fedac/native/src/font-unicode.h | 353 +++++++++++++++++- fedac/native/src/font.c | 56 +++ fedac/native/src/font.h | 17 +- fedac/native/src/js-bindings.c | 217 +++++++++-- .../aesthetic.computer/disks/catnom.mjs | 20 + system/public/aesthetic.computer/lib/nom.mjs | 83 +++- 10 files changed, 712 insertions(+), 48 deletions(-) create mode 100644 system/public/aesthetic.computer/disks/catnom.mjs diff --git a/fedac/native/docker-build.sh b/fedac/native/docker-build.sh index 55401f338c..73e48b5919 100644 --- a/fedac/native/docker-build.sh +++ b/fedac/native/docker-build.sh @@ -691,7 +691,7 @@ fi # These are pure JS with no DOM/browser deps — work in QuickJS as-is. # The module loader resolves "../lib/X.mjs" → "/lib/X.mjs" in the initramfs. mkdir -p "$IROOT/lib" -for libmjs in melody-parser.mjs notepat-convert.mjs note-colors.mjs num.mjs percussion.mjs; do +for libmjs in melody-parser.mjs notepat-convert.mjs note-colors.mjs num.mjs percussion.mjs synth.mjs nom.mjs; do SRC_LIB="$SRC/system/public/aesthetic.computer/lib/$libmjs" if [ -f "$SRC_LIB" ]; then cp "$SRC_LIB" "$IROOT/lib/$libmjs" @@ -704,7 +704,7 @@ done # runtime. If you add a piece that uses browser-only APIs, the runtime # will throw — don't "port" the piece, expose the missing API in # js-bindings.c instead (so web and native stay in parity). -for webpiece in clock.mjs arena.mjs speaker.mjs; do +for webpiece in clock.mjs arena.mjs speaker.mjs catnom.mjs; do SRC_PIECE="$SRC/system/public/aesthetic.computer/disks/$webpiece" if [ -f "$SRC_PIECE" ]; then cp "$SRC_PIECE" "$IROOT/pieces/$webpiece" diff --git a/fedac/native/pieces/prompt.mjs b/fedac/native/pieces/prompt.mjs index 6bd7231c00..a0c4d52350 100644 --- a/fedac/native/pieces/prompt.mjs +++ b/fedac/native/pieces/prompt.mjs @@ -31,6 +31,7 @@ const CODE_NAMES = ["$roz"]; // Piece descriptions (for tab completion display) const PIECE_DESC = { "notepat": "synthesizer instrument", + "catnom": "category muncher game", "os": "system update (OTA)", "wifi": "network picker", "claude": "AI assistant", diff --git a/fedac/native/scripts/bdf-unicode-to-c.py b/fedac/native/scripts/bdf-unicode-to-c.py index 776a1ce25c..9bb7d79978 100755 --- a/fedac/native/scripts/bdf-unicode-to-c.py +++ b/fedac/native/scripts/bdf-unicode-to-c.py @@ -16,9 +16,11 @@ import sys def ranges(): return [ + (0x0020, 0x007E), # ASCII (full unifont parity for FONT_UNIFONT — nom word cells) (0x00A0, 0x00FF), # Latin-1 Supplement (accented chars, typographic) (0x0100, 0x017F), # Latin Extended-A (0x0391, 0x03CE), # Greek (alpha..omega) + (0x0400, 0x04FF), # Cyrillic (rusnom boards + labels) (0x2010, 0x2027), # General Punctuation (em-dash, ellipsis, quotes) (0x2030, 0x2044), # Per mille, primes, fractions (0x2190, 0x21FF), # Arrows diff --git a/fedac/native/scripts/dev-push.sh b/fedac/native/scripts/dev-push.sh index 6f91187aff..c3d84203e9 100755 --- a/fedac/native/scripts/dev-push.sh +++ b/fedac/native/scripts/dev-push.sh @@ -40,12 +40,15 @@ for arg in "$@"; do esac done +# Native pieces live in pieces/; web pieces that run natively verbatim +# (docker-build.sh §2q — the nom games etc.) come straight from disks/. PIECE_FILE="$NATIVE/pieces/$PIECE.mjs" -[ -f "$PIECE_FILE" ] || { echo "dev-push: no $PIECE_FILE" >&2; exit 1; } +[ -f "$PIECE_FILE" ] || PIECE_FILE="$SRC/system/public/aesthetic.computer/disks/$PIECE.mjs" +[ -f "$PIECE_FILE" ] || { echo "dev-push: no $PIECE in pieces/ or web disks/" >&2; exit 1; } # Same list as docker-build.sh §2p — modules pieces import as ../lib/X.mjs. LIB_FILES=() -for libmjs in melody-parser.mjs notepat-convert.mjs note-colors.mjs num.mjs percussion.mjs; do +for libmjs in melody-parser.mjs notepat-convert.mjs note-colors.mjs num.mjs percussion.mjs synth.mjs nom.mjs; do [ -f "$WEB_LIB/$libmjs" ] && LIB_FILES+=("$WEB_LIB/$libmjs") done diff --git a/fedac/native/src/font-unicode.h b/fedac/native/src/font-unicode.h index fe41b555e0..d895860fc1 100644 --- a/fedac/native/src/font-unicode.h +++ b/fedac/native/src/font-unicode.h @@ -17,9 +17,104 @@ typedef struct { } UnicodeGlyph; static const int unicode_ascent = 14; -static const int unicode_glyph_count = 1403; +static const int unicode_glyph_count = 1754; static const UnicodeGlyph unicode_glyphs[] = { + {0x0020, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0021, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0022, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2200, 0x2200, 0x2200, 0x2200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0023, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1200, 0x1200, 0x1200, 0x7E00, 0x2400, 0x2400, 0x7E00, 0x4800, 0x4800, 0x4800, 0x0000, 0x0000}}, + {0x0024, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x3E00, 0x4900, 0x4800, 0x3800, 0x0E00, 0x0900, 0x4900, 0x3E00, 0x0800, 0x0000, 0x0000}}, + {0x0025, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3100, 0x4A00, 0x4A00, 0x3400, 0x0800, 0x0800, 0x1600, 0x2900, 0x2900, 0x4600, 0x0000, 0x0000}}, + {0x0026, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x2200, 0x2200, 0x1400, 0x1800, 0x2900, 0x4500, 0x4200, 0x4600, 0x3900, 0x0000, 0x0000}}, + {0x0027, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0028, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0400, 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0400, 0x0000}}, + {0x0029, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x0000}}, + {0x002A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x4900, 0x2A00, 0x1C00, 0x2A00, 0x4900, 0x0800, 0x0000, 0x0000, 0x0000}}, + {0x002B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000}}, + {0x002C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x0800, 0x0800, 0x1000}}, + {0x002D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x002E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x0000, 0x0000}}, + {0x002F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0200, 0x0400, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0030, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x2400, 0x4200, 0x4600, 0x4A00, 0x5200, 0x6200, 0x4200, 0x2400, 0x1800, 0x0000, 0x0000}}, + {0x0031, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1800, 0x2800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x0032, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x0200, 0x0C00, 0x1000, 0x2000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x0033, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x0200, 0x1C00, 0x0200, 0x0200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0034, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0C00, 0x1400, 0x2400, 0x4400, 0x4400, 0x7E00, 0x0400, 0x0400, 0x0400, 0x0000, 0x0000}}, + {0x0035, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0200, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0036, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x2000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0037, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0200, 0x0200, 0x0400, 0x0400, 0x0400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0038, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0039, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x3E00, 0x0200, 0x0200, 0x0200, 0x0400, 0x3800, 0x0000, 0x0000}}, + {0x003A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000}}, + {0x003B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, 0x1800, 0x0800, 0x0800, 0x1000, 0x0000}}, + {0x003C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0000, 0x0000}}, + {0x003D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x003E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x0000, 0x0000}}, + {0x003F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x0200, 0x0400, 0x0800, 0x0800, 0x0000, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0040, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x2200, 0x4A00, 0x5600, 0x5200, 0x5200, 0x5200, 0x4E00, 0x2000, 0x1E00, 0x0000, 0x0000}}, + {0x0041, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0042, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x0043, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0044, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x4400, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4400, 0x7800, 0x0000, 0x0000}}, + {0x0045, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x0046, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0047, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4E00, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x0048, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0049, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x004A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000}}, + {0x004B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4400, 0x4800, 0x5000, 0x6000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x004C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x004D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x6600, 0x6600, 0x5A00, 0x5A00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x004E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x6200, 0x6200, 0x5200, 0x5200, 0x4A00, 0x4A00, 0x4600, 0x4600, 0x4200, 0x0000, 0x0000}}, + {0x004F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0050, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0051, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x5A00, 0x6600, 0x3C00, 0x0300, 0x0000}}, + {0x0052, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x4800, 0x4400, 0x4400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0053, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x3000, 0x0C00, 0x0200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0054, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0055, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0056, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x4100, 0x2200, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0057, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x5A00, 0x5A00, 0x6600, 0x6600, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0058, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0059, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x005A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0200, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x005B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0E00, 0x0000}}, + {0x005C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0400, 0x0200, 0x0200, 0x0000, 0x0000}}, + {0x005D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x7000, 0x0000}}, + {0x005E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x1800, 0x2400, 0x4200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x005F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0000}}, + {0x0060, 8, 16, 0, -2, 8, {0x0000, 0x2000, 0x1000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0061, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3E00, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x0062, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x6200, 0x5C00, 0x0000, 0x0000}}, + {0x0063, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0064, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0200, 0x0200, 0x0200, 0x3A00, 0x4600, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x0065, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0066, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0C00, 0x1000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0067, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x3A00, 0x4400, 0x4400, 0x4400, 0x3800, 0x2000, 0x3C00, 0x4200, 0x4200, 0x3C00}}, + {0x0068, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0069, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x006A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0C00, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4800, 0x3000}}, + {0x006B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4400, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x006C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x006D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7600, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x006E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x006F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0070, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x6200, 0x5C00, 0x4000, 0x4000}}, + {0x0071, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A00, 0x4600, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200}}, + {0x0072, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5C00, 0x6200, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0073, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4000, 0x3000, 0x0C00, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0074, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0C00, 0x0000, 0x0000}}, + {0x0075, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x0076, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x2400, 0x2400, 0x2400, 0x1800, 0x1800, 0x0000, 0x0000}}, + {0x0077, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x3600, 0x0000, 0x0000}}, + {0x0078, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x1800, 0x1800, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0079, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x2600, 0x1A00, 0x0200, 0x0200, 0x3C00}}, + {0x007A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x007B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0C00, 0x1000, 0x1000, 0x0800, 0x0800, 0x1000, 0x2000, 0x1000, 0x0800, 0x0800, 0x1000, 0x1000, 0x0C00}}, + {0x007C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800}}, + {0x007D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x3000, 0x0800, 0x0800, 0x1000, 0x1000, 0x0800, 0x0400, 0x0800, 0x1000, 0x1000, 0x0800, 0x0800, 0x3000}}, + {0x007E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x3100, 0x4900, 0x4600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, {0x00A0, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, {0x00A1, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, {0x00A2, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x3E00, 0x4900, 0x4800, 0x4800, 0x4900, 0x3E00, 0x0800, 0x0800, 0x0000, 0x0000}}, @@ -306,6 +401,262 @@ static const UnicodeGlyph unicode_glyphs[] = { {0x03CC, 8, 16, 0, -2, 8, {0x0000, 0x0400, 0x0800, 0x1000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, {0x03CD, 8, 16, 0, -2, 8, {0x0000, 0x0400, 0x0800, 0x1000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, {0x03CE, 8, 16, 0, -2, 8, {0x0000, 0x0400, 0x0800, 0x1000, 0x0000, 0x0000, 0x2200, 0x4100, 0x4100, 0x4900, 0x4900, 0x4900, 0x4900, 0x3600, 0x0000, 0x0000}}, + {0x0400, 8, 16, 0, -2, 8, {0x0000, 0x3000, 0x0C00, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x0401, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x0402, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x1000, 0x1000, 0x1000, 0x1E00, 0x1100, 0x1100, 0x1100, 0x1100, 0x1600, 0x0000, 0x0000}}, + {0x0403, 8, 16, 0, -2, 8, {0x0C00, 0x3000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0404, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x2200, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x2200, 0x1C00, 0x0000, 0x0000}}, + {0x0405, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x3000, 0x0C00, 0x0200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0406, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x0407, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x0408, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0E00, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000}}, + {0x0409, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x4800, 0x4800, 0x4800, 0x4E00, 0x4900, 0x4900, 0x4900, 0x4900, 0x8E00, 0x0000, 0x0000}}, + {0x040A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x4800, 0x4800, 0x4800, 0x7E00, 0x4900, 0x4900, 0x4900, 0x4900, 0x4E00, 0x0000, 0x0000}}, + {0x040B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x1000, 0x1000, 0x1000, 0x1E00, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x0000, 0x0000}}, + {0x040C, 8, 16, 0, -2, 8, {0x0C00, 0x3000, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x5000, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x040D, 8, 16, 0, -2, 8, {0x0000, 0x3000, 0x0C00, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4200, 0x0000, 0x0000}}, + {0x040E, 8, 16, 0, -2, 8, {0x4200, 0x4200, 0x3C00, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x1000, 0x3000, 0x0000, 0x0000}}, + {0x040F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x7F00, 0x0800, 0x0800}}, + {0x0410, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0411, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x0412, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x0413, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0414, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0E00, 0x1200, 0x1200, 0x1200, 0x2200, 0x2200, 0x2200, 0x4200, 0x4200, 0xFF00, 0x8100, 0x8100}}, + {0x0415, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x0416, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x0417, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0418, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4200, 0x0000, 0x0000}}, + {0x0419, 8, 16, 0, -2, 8, {0x0000, 0x2400, 0x1800, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4200, 0x0000, 0x0000}}, + {0x041A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x5000, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x041B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1200, 0x1200, 0x1200, 0x1200, 0x1200, 0x1200, 0x2200, 0x2200, 0x4200, 0x0000, 0x0000}}, + {0x041C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x6600, 0x6600, 0x5A00, 0x5A00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x041D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x041E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x041F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0420, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0421, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0422, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0423, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x1000, 0x3000, 0x0000, 0x0000}}, + {0x0424, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0800, 0x3E00, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0425, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0426, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x7F00, 0x0100, 0x0100}}, + {0x0427, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0200, 0x0000, 0x0000}}, + {0x0428, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x7F00, 0x0000, 0x0000}}, + {0x0429, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFF00, 0x0100, 0x0100}}, + {0x042A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1E00, 0x1100, 0x1100, 0x1100, 0x1100, 0x1E00, 0x0000, 0x0000}}, + {0x042B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7200, 0x4A00, 0x4A00, 0x4A00, 0x4A00, 0x7200, 0x0000, 0x0000}}, + {0x042C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x042D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x0200, 0x0200, 0x3E00, 0x0200, 0x0200, 0x0200, 0x4400, 0x3800, 0x0000, 0x0000}}, + {0x042E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x5200, 0x7200, 0x5200, 0x5200, 0x5200, 0x5200, 0x4C00, 0x0000, 0x0000}}, + {0x042F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x4200, 0x4200, 0x4200, 0x3E00, 0x1200, 0x2200, 0x2200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0430, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3E00, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x0431, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0200, 0x1C00, 0x2000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0432, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4200, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x0433, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0434, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1200, 0x2200, 0x2200, 0x4200, 0x4200, 0x4200, 0x7F00, 0x4100, 0x0000}}, + {0x0435, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0436, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x0437, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0438, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x0000, 0x0000}}, + {0x0439, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x1800, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x0000, 0x0000}}, + {0x043A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x043B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1200, 0x1200, 0x1200, 0x1200, 0x2200, 0x2200, 0x4200, 0x0000, 0x0000}}, + {0x043C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x6600, 0x6600, 0x5A00, 0x5A00, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x043D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x043E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x043F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0440, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x6200, 0x5C00, 0x4000, 0x4000}}, + {0x0441, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0442, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0443, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x1000, 0x1000, 0x2000, 0x6000}}, + {0x0444, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x3E00, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x3E00, 0x0800, 0x0800}}, + {0x0445, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x1800, 0x1800, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x0446, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x7F00, 0x0100, 0x0100}}, + {0x0447, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0000, 0x0000}}, + {0x0448, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x7F00, 0x0000, 0x0000}}, + {0x0449, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFF00, 0x0100, 0x0100}}, + {0x044A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1E00, 0x1100, 0x1100, 0x1100, 0x1E00, 0x0000, 0x0000}}, + {0x044B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7200, 0x4A00, 0x4A00, 0x4A00, 0x7200, 0x0000, 0x0000}}, + {0x044C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x7C00, 0x0000, 0x0000}}, + {0x044D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x0200, 0x3E00, 0x0200, 0x0200, 0x4400, 0x3800, 0x0000, 0x0000}}, + {0x044E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x7200, 0x5200, 0x5200, 0x5200, 0x4C00, 0x0000, 0x0000}}, + {0x044F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x4200, 0x4200, 0x4200, 0x3E00, 0x1200, 0x2200, 0x4200, 0x0000, 0x0000}}, + {0x0450, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0451, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0452, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x4000, 0xF000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0200, 0x0C00}}, + {0x0453, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0C00, 0x3000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0454, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x2200, 0x4000, 0x7C00, 0x4000, 0x4000, 0x2200, 0x1C00, 0x0000, 0x0000}}, + {0x0455, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4000, 0x3000, 0x0C00, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0456, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x0457, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x0458, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0C00, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4800, 0x3000}}, + {0x0459, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x4800, 0x4800, 0x4E00, 0x4900, 0x4900, 0x4900, 0x8E00, 0x0000, 0x0000}}, + {0x045A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x4800, 0x4800, 0x7E00, 0x4900, 0x4900, 0x4900, 0x4E00, 0x0000, 0x0000}}, + {0x045B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x4000, 0xF000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x045C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0C00, 0x3000, 0x0000, 0x0000, 0x4600, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0000, 0x0000}}, + {0x045D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x0000, 0x0000}}, + {0x045E, 8, 16, 0, -2, 8, {0x0000, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x1000, 0x1000, 0x2000, 0x6000}}, + {0x045F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x3E00, 0x0800, 0x0800}}, + {0x0460, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x5A00, 0x2400, 0x0000, 0x0000}}, + {0x0461, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x5A00, 0x2400, 0x0000, 0x0000}}, + {0x0462, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1E00, 0x1100, 0x1100, 0x1100, 0x1100, 0x1E00, 0x0000, 0x0000}}, + {0x0463, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7800, 0x2000, 0x2000, 0x3C00, 0x2200, 0x2200, 0x2200, 0x3C00, 0x0000, 0x0000}}, + {0x0464, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4900, 0x5000, 0x5000, 0x7E00, 0x5000, 0x5000, 0x5000, 0x4900, 0x4600, 0x0000, 0x0000}}, + {0x0465, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4900, 0x5000, 0x7E00, 0x5000, 0x5000, 0x4900, 0x4600, 0x0000, 0x0000}}, + {0x0466, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x1400, 0x1400, 0x2200, 0x3600, 0x2A00, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x0467, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1400, 0x1400, 0x2200, 0x3600, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x0468, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x4800, 0x5400, 0x5400, 0x5200, 0x7600, 0x6A00, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x0469, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x5400, 0x5400, 0x5200, 0x7600, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x046A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x2200, 0x2200, 0x1400, 0x0800, 0x1C00, 0x2A00, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x046B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x2200, 0x1400, 0x0800, 0x3E00, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x046C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x5F00, 0x5100, 0x5100, 0x4A00, 0x7400, 0x4E00, 0x5500, 0x5500, 0x5500, 0x5500, 0x0000, 0x0000}}, + {0x046D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5F00, 0x5100, 0x4A00, 0x7400, 0x4E00, 0x5500, 0x5500, 0x5500, 0x0000, 0x0000}}, + {0x046E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x1800, 0x3C00, 0x4200, 0x0200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x0200, 0x0200, 0x3C00, 0x4000, 0x4000}}, + {0x046F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x2400, 0x1800, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x0200, 0x3C00, 0x4000, 0x4000}}, + {0x0470, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x0471, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x3E00, 0x0800, 0x0800}}, + {0x0472, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0473, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x0474, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4300, 0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0475, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0476, 8, 16, 0, -2, 8, {0x6600, 0x1100, 0x0000, 0x0000, 0x4300, 0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0477, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x6600, 0x1100, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0478, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x5000, 0x5900, 0x5900, 0x5900, 0x5500, 0x5600, 0x5400, 0x5400, 0x2400, 0x0800, 0x0800}}, + {0x0479, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x5900, 0x5900, 0x5500, 0x5600, 0x5400, 0x5400, 0x2400, 0x0800, 0x0800}}, + {0x047A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0800, 0x3E00, 0x4900, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4100, 0x4900, 0x3E00, 0x0800, 0x0000}}, + {0x047B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x3E00, 0x4900, 0x4100, 0x4100, 0x4100, 0x4100, 0x4900, 0x3E00, 0x0800, 0x0000}}, + {0x047C, 8, 16, 0, -2, 8, {0x3C00, 0x4300, 0x1800, 0x0400, 0x0800, 0x0000, 0x3600, 0x4100, 0x4100, 0x4900, 0x4900, 0x4900, 0x4900, 0x3600, 0x0000, 0x0000}}, + {0x047D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x3C00, 0x4300, 0x1800, 0x0400, 0x0800, 0x0000, 0x3600, 0x4100, 0x4900, 0x4900, 0x3600, 0x0000, 0x0000}}, + {0x047E, 8, 16, 0, -2, 8, {0x0000, 0x7F00, 0x0800, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x5A00, 0x2400, 0x0000, 0x0000}}, + {0x047F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0000, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x5A00, 0x2400, 0x0000, 0x0000}}, + {0x0480, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3C00, 0x0400, 0x0400, 0x0400}}, + {0x0481, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4000, 0x3C00, 0x0400, 0x0400, 0x0400}}, + {0x0482, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1200, 0x0C00, 0x4400, 0x2A00, 0x1100, 0x1800, 0x2400, 0x0000, 0x0000, 0x0000}}, + {0x0483, 8, 16, 0, -2, 8, {0x0000, 0x0800, 0x7800, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0484, 8, 16, 0, -2, 8, {0x0200, 0x0500, 0x0900, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0485, 8, 16, 0, -2, 8, {0x0000, 0x3800, 0x4000, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0486, 8, 16, 0, -2, 8, {0x0000, 0x3800, 0x0400, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0487, 8, 16, 0, -2, 8, {0x0000, 0x3000, 0x4C00, 0x8300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, + {0x0488, 16, 16, 0, -2, 16, {0x0000, 0x0000, 0x0100, 0x0280, 0x1010, 0x2828, 0x0000, 0x0000, 0x4008, 0xA014, 0x0000, 0x0000, 0x0000, 0x1010, 0x2928, 0x0280}}, + {0x0489, 16, 16, 0, -2, 16, {0x0000, 0x0000, 0x0080, 0x1084, 0x0988, 0x0C30, 0x0000, 0x0000, 0x0008, 0x700E, 0x1000, 0x0000, 0x0000, 0x0CD8, 0x0888, 0x1084}}, + {0x048A, 8, 16, 0, -2, 8, {0x0000, 0x2400, 0x1800, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4300, 0x0200, 0x0400}}, + {0x048B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x1800, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6300, 0x0200, 0x0400}}, + {0x048C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0x2000, 0x2000, 0x2000, 0x3C00, 0x2200, 0x2200, 0x2600, 0x3C00, 0x0000, 0x0000}}, + {0x048D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0x2000, 0x3C00, 0x2200, 0x2200, 0x3C00, 0x0000, 0x0000}}, + {0x048E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x4200, 0x4A00, 0x4400, 0x7A00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x048F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4A00, 0x6400, 0x5A00, 0x4000, 0x4000}}, + {0x0490, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0200, 0x0200, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0491, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0200, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000}}, + {0x0492, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x1000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0493, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x1000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000}}, + {0x0494, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0C00, 0x0000}}, + {0x0495, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x0C00, 0x0000}}, + {0x0496, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x2A00, 0x4900, 0x4900, 0x0100, 0x0100}}, + {0x0497, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x4900, 0x4900, 0x0100, 0x0100}}, + {0x0498, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0800, 0x3000}}, + {0x0499, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x4200, 0x3C00, 0x0800, 0x3000}}, + {0x049A, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x5000, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0200, 0x0200}}, + {0x049B, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x4200, 0x0200, 0x0200}}, + {0x049C, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4300, 0x4400, 0x5400, 0x5400, 0x7800, 0x5400, 0x5400, 0x5400, 0x4200, 0x4100, 0x0000, 0x0000}}, + {0x049D, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4300, 0x5400, 0x5400, 0x7800, 0x5400, 0x5400, 0x4200, 0x4100, 0x0000, 0x0000}}, + {0x049E, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x2300, 0x7400, 0x2400, 0x2800, 0x2800, 0x3000, 0x2800, 0x2400, 0x2200, 0x2100, 0x0000, 0x0000}}, + {0x049F, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2300, 0x7400, 0x2800, 0x3000, 0x2800, 0x2400, 0x2200, 0x2100, 0x0000, 0x0000}}, + {0x04A0, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0xE300, 0x2400, 0x2400, 0x2800, 0x2800, 0x3000, 0x2800, 0x2400, 0x2200, 0x2100, 0x0000, 0x0000}}, + {0x04A1, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE300, 0x2400, 0x2800, 0x3000, 0x2800, 0x2400, 0x2200, 0x2100, 0x0000, 0x0000}}, + {0x04A2, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4300, 0x0100, 0x0100}}, + {0x04A3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4300, 0x0100, 0x0100}}, + {0x04A4, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4700, 0x4400, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000}}, + {0x04A5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4700, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000}}, + {0x04A6, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4E00, 0x4900, 0x4900, 0x4900, 0x4900, 0x0100, 0x0600}}, + {0x04A7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x4800, 0x4800, 0x4800, 0x4E00, 0x4900, 0x4900, 0x4900, 0x0100, 0x0600}}, + {0x04A8, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x2000, 0x4C00, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x2C00, 0x1800, 0x0600, 0x0000}}, + {0x04A9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x4C00, 0x5200, 0x5200, 0x5200, 0x5200, 0x2C00, 0x1800, 0x0600, 0x0000}}, + {0x04AA, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4000, 0x4000, 0x4200, 0x4200, 0x3C00, 0x0800, 0x3000}}, + {0x04AB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4000, 0x4000, 0x4200, 0x4200, 0x3C00, 0x0800, 0x3000}}, + {0x04AC, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0C00, 0x0400, 0x0400}}, + {0x04AD, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0C00, 0x0400, 0x0400}}, + {0x04AE, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x04AF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2200, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800}}, + {0x04B0, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x0800, 0x0800, 0x3E00, 0x0800, 0x0800, 0x0000, 0x0000}}, + {0x04B1, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2200, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x3E00, 0x0800, 0x0800, 0x0800}}, + {0x04B2, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x2400, 0x2400, 0x4200, 0x4300, 0x0100, 0x0100}}, + {0x04B3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x1800, 0x1800, 0x2400, 0x4200, 0x4300, 0x0100, 0x0100}}, + {0x04B4, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0xFA00, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x3F00, 0x0100, 0x0100}}, + {0x04B5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA00, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x2200, 0x3F00, 0x0100, 0x0100}}, + {0x04B6, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0300, 0x0100, 0x0100}}, + {0x04B7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0300, 0x0100, 0x0100}}, + {0x04B8, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x5200, 0x5600, 0x3A00, 0x1200, 0x1200, 0x0200, 0x0000, 0x0000}}, + {0x04B9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x5200, 0x5600, 0x3A00, 0x1200, 0x0200, 0x0000, 0x0000}}, + {0x04BA, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x04BB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x5C00, 0x6200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x04BC, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x5200, 0x3E00, 0x1000, 0x1000, 0x1200, 0x1200, 0x0C00, 0x0000, 0x0000}}, + {0x04BD, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x3E00, 0x1000, 0x1000, 0x1200, 0x0C00, 0x0000, 0x0000}}, + {0x04BE, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x5200, 0x3E00, 0x1000, 0x1000, 0x1200, 0x1200, 0x0C00, 0x0800, 0x0800}}, + {0x04BF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4C00, 0x5200, 0x5200, 0x3E00, 0x1000, 0x1000, 0x1200, 0x0C00, 0x0800, 0x0800}}, + {0x04C0, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x3E00, 0x0000, 0x0000}}, + {0x04C1, 8, 16, 0, -2, 8, {0x4100, 0x4100, 0x3E00, 0x0000, 0x4900, 0x4900, 0x2A00, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x04C2, 8, 16, 0, -2, 8, {0x0000, 0x2200, 0x2200, 0x1C00, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x04C3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x4800, 0x5000, 0x6000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0200, 0x0C00}}, + {0x04C4, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4600, 0x4800, 0x5000, 0x6000, 0x7C00, 0x4200, 0x4200, 0x4200, 0x0200, 0x0C00}}, + {0x04C5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1200, 0x1200, 0x1200, 0x1200, 0x1200, 0x1200, 0x2200, 0x2200, 0x4300, 0x0200, 0x0400}}, + {0x04C6, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1200, 0x1200, 0x1200, 0x1200, 0x2200, 0x2200, 0x4300, 0x0200, 0x0400}}, + {0x04C7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x0200, 0x0C00}}, + {0x04C8, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0200, 0x0C00}}, + {0x04C9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4300, 0x0200, 0x0400}}, + {0x04CA, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4300, 0x0200, 0x0400}}, + {0x04CB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0600, 0x0400, 0x0400}}, + {0x04CC, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0600, 0x0400, 0x0400}}, + {0x04CD, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x6600, 0x6600, 0x5A00, 0x5A00, 0x4200, 0x4200, 0x4200, 0x4300, 0x0200, 0x0400}}, + {0x04CE, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x6600, 0x6600, 0x5A00, 0x5A00, 0x4200, 0x4200, 0x4300, 0x0200, 0x0400}}, + {0x04CF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1C00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1C00, 0x0000, 0x0000}}, + {0x04D0, 8, 16, 0, -2, 8, {0x4200, 0x4200, 0x3C00, 0x0000, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x04D1, 8, 16, 0, -2, 8, {0x0000, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3E00, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x04D2, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x04D3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3E00, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0000, 0x0000}}, + {0x04D4, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x2800, 0x4800, 0x4800, 0x7F00, 0x4800, 0x4800, 0x4800, 0x4800, 0x4F00, 0x0000, 0x0000}}, + {0x04D5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x4900, 0x0900, 0x3F00, 0x4800, 0x4800, 0x4900, 0x3E00, 0x0000, 0x0000}}, + {0x04D6, 8, 16, 0, -2, 8, {0x4200, 0x4200, 0x3C00, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x4000, 0x7E00, 0x0000, 0x0000}}, + {0x04D7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x4200, 0x4200, 0x3C00, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4000, 0x4000, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04D8, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x2400, 0x4200, 0x0200, 0x0200, 0x7E00, 0x4200, 0x4200, 0x2400, 0x1800, 0x0000, 0x0000}}, + {0x04D9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x7E00, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04DA, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x1800, 0x2400, 0x4200, 0x0200, 0x0200, 0x7E00, 0x4200, 0x4200, 0x2400, 0x1800, 0x0000, 0x0000}}, + {0x04DB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x7E00, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04DC, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x04DD, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x4900, 0x4900, 0x2A00, 0x1C00, 0x1C00, 0x2A00, 0x4900, 0x4900, 0x0000, 0x0000}}, + {0x04DE, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04DF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x0200, 0x3C00, 0x0400, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04E0, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0400, 0x0800, 0x1000, 0x1C00, 0x0200, 0x0200, 0x0200, 0x4600, 0x3C00, 0x0000, 0x0000}}, + {0x04E1, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3E00, 0x0400, 0x0800, 0x1000, 0x1C00, 0x0200, 0x0200, 0x0200, 0x4200, 0x3C00}}, + {0x04E2, 8, 16, 0, -2, 8, {0x0000, 0x3C00, 0x0000, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4200, 0x0000, 0x0000}}, + {0x04E3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x3C00, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x0000, 0x0000}}, + {0x04E4, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x4200, 0x0000, 0x0000}}, + {0x04E5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x4600, 0x4600, 0x4A00, 0x4A00, 0x5200, 0x5200, 0x6200, 0x6200, 0x0000, 0x0000}}, + {0x04E6, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04E7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04E8, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04E9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04EA, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04EB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x3C00, 0x4200, 0x4200, 0x7E00, 0x4200, 0x4200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04EC, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x0000, 0x3C00, 0x4200, 0x0200, 0x0200, 0x3E00, 0x0200, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04ED, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x0000, 0x3C00, 0x4200, 0x0200, 0x1E00, 0x0200, 0x0200, 0x4200, 0x3C00, 0x0000, 0x0000}}, + {0x04EE, 8, 16, 0, -2, 8, {0x0000, 0x3E00, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x1000, 0x3000, 0x0000, 0x0000}}, + {0x04EF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x3C00, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x1000, 0x1000, 0x2000, 0x6000}}, + {0x04F0, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x1000, 0x3000, 0x0000, 0x0000}}, + {0x04F1, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x1000, 0x1000, 0x2000, 0x6000}}, + {0x04F2, 8, 16, 0, -2, 8, {0x3300, 0x4400, 0x0000, 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x1400, 0x1400, 0x0800, 0x0800, 0x1000, 0x3000, 0x0000, 0x0000}}, + {0x04F3, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x3300, 0x4400, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x1000, 0x1000, 0x2000, 0x6000}}, + {0x04F4, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0200, 0x0000, 0x0000}}, + {0x04F5, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0x3A00, 0x0200, 0x0200, 0x0000, 0x0000}}, + {0x04F6, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x2000}}, + {0x04F7, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x2000}}, + {0x04F8, 8, 16, 0, -2, 8, {0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x4200, 0x7200, 0x4A00, 0x4A00, 0x4A00, 0x4A00, 0x7200, 0x0000, 0x0000}}, + {0x04F9, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x2400, 0x2400, 0x0000, 0x0000, 0x4200, 0x4200, 0x4200, 0x7200, 0x4A00, 0x4A00, 0x4A00, 0x7200, 0x0000, 0x0000}}, + {0x04FA, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x1000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1800, 0x0800, 0x1800}}, + {0x04FB, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1800, 0x0800, 0x1800}}, + {0x04FC, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x1800, 0x2400, 0x2400, 0x4200, 0x4200, 0x0200, 0x0400}}, + {0x04FD, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x1800, 0x1800, 0x2400, 0x4200, 0x4200, 0x0200, 0x0400}}, + {0x04FE, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x2400, 0x1800, 0x7E00, 0x2400, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, + {0x04FF, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x4200, 0x2400, 0x1800, 0x7E00, 0x2400, 0x4200, 0x4200, 0x0000, 0x0000}}, {0x2010, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, {0x2011, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, {0x2012, 8, 16, 0, -2, 8, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}, diff --git a/fedac/native/src/font.c b/fedac/native/src/font.c index bcec61abe7..20be39f502 100644 --- a/fedac/native/src/font.c +++ b/fedac/native/src/font.c @@ -371,3 +371,59 @@ int font_measure_6x10(const char *text, int scale) { } return len * FONT_6X10_W * scale; } + +// GNU unifont (8x16 cell, fixed 8px advance for the subset we carry). The +// glyph table now includes ASCII, so this renders entire strings — full +// parity with the web's "unifont" face (nom word cells, edition subtitles). +// Unlike draw_unicode_glyph (baseline-matched into 6x10 text), this places +// the 16px glyph cell's top-left at (x, y), like the web write() does. +int font_draw_unifont(ACGraph *g, const char *text, int x, int y, int scale) { + if (!text) return x; + if (scale < 1) scale = 1; + + int start_x = x; + const char *p = text; + while (*p) { + if (*p == '\n') { + x = start_x; + y += FONT_UNIFONT_H * scale; + p++; + continue; + } + int cp = utf8_next(&p); + if (cp <= 0) { if (cp == 0) break; continue; } + const UnicodeGlyph *u = unicode_lookup((uint32_t)cp); + if (!u) u = unicode_lookup((uint32_t)'?'); + if (!u) { x += FONT_UNIFONT_W * scale; continue; } + // BDF cell top = baseline − ascent; for unifont (ascent 14, yoff −2) + // a full glyph spans rows 0..15 of the cell, so the cell top is y. + for (int row = 0; row < u->height && row < 16; row++) { + uint16_t bits = u->rows[row]; + for (int col = 0; col < u->width; col++) { + if (bits & (0x8000 >> col)) { + int px = x + (col + u->xoff) * scale; + int py = y + (unicode_ascent - u->yoff - u->height + row) * scale; + for (int sy = 0; sy < scale; sy++) + for (int sx = 0; sx < scale; sx++) + graph_plot(g, px + sx, py + sy); + } + } + } + x += u->dwidth * scale; + } + return x; +} + +int font_measure_unifont(const char *text, int scale) { + if (!text) return 0; + if (scale < 1) scale = 1; + int w = 0; + const char *p = text; + while (*p && *p != '\n') { + int cp = utf8_next(&p); + if (cp <= 0) { if (cp == 0) break; continue; } + const UnicodeGlyph *u = unicode_lookup((uint32_t)cp); + w += u ? u->dwidth : FONT_UNIFONT_W; + } + return w * scale; +} diff --git a/fedac/native/src/font.h b/fedac/native/src/font.h index c7f76b6bd0..4fed4ae7d2 100644 --- a/fedac/native/src/font.h +++ b/fedac/native/src/font.h @@ -11,10 +11,15 @@ #define FONT_6X10_CHAR_W 6 #define FONT_6X10_CHAR_H 10 +// GNU unifont metrics (8x16 cell, fixed 8px advance in our subset) +#define FONT_UNIFONT_W 8 +#define FONT_UNIFONT_H 16 + // Font IDs -#define FONT_8X8 0 -#define FONT_MATRIX 1 -#define FONT_6X10 2 +#define FONT_8X8 0 +#define FONT_MATRIX 1 +#define FONT_6X10 2 +#define FONT_UNIFONT 3 // Initialize the built-in font void font_init(void); @@ -39,4 +44,10 @@ int font_draw_6x10(ACGraph *g, const char *text, int x, int y, int scale); // Measure text width using 6x10 font int font_measure_6x10(const char *text, int scale); +// Draw text using GNU unifont (8x16; ASCII + Latin-1/Ext-A + Cyrillic + Greek) +int font_draw_unifont(ACGraph *g, const char *text, int x, int y, int scale); + +// Measure text width using unifont +int font_measure_unifont(const char *text, int scale); + #endif diff --git a/fedac/native/src/js-bindings.c b/fedac/native/src/js-bindings.c index 759f9cb81f..c41553ea78 100644 --- a/fedac/native/src/js-bindings.c +++ b/fedac/native/src/js-bindings.c @@ -627,44 +627,57 @@ static JSValue js_write(JSContext *ctx, JSValueConst this_val, int argc, JSValue } } - // Check for font option: "matrix", "font_1"/"6x10", default is font_1 (6x10) + // Check for font option: "matrix"/"MatrixChunky8", "unifont", + // "font_1"/"6x10" (default). Web pieces also pass the font as the 6th + // positional arg — write(text, pos, bg, bounds, wordWrap, font) — so + // honor that form too (nom's word cells select "unifont" this way). int font_id = FONT_6X10; - if (argc >= 2 && JS_IsObject(argv[1])) { - JSValue font_v = JS_GetPropertyStr(ctx, argv[1], "font"); - if (JS_IsString(font_v)) { - const char *fname = JS_ToCString(ctx, font_v); - if (fname) { - if (strcmp(fname, "matrix") == 0) font_id = FONT_MATRIX; - else if (strcmp(fname, "font_1") == 0 || strcmp(fname, "6x10") == 0) - font_id = FONT_6X10; - JS_FreeCString(ctx, fname); - } - } - JS_FreeValue(ctx, font_v); - - // Re-check center with correct font metrics for non-8x8 fonts - if (font_id != FONT_8X8) { - JSValue center2 = JS_GetPropertyStr(ctx, argv[1], "center"); - if (JS_IsString(center2)) { - const char *cv = JS_ToCString(ctx, center2); - if (cv) { - int tw = (font_id == FONT_MATRIX) - ? font_measure_matrix(text, scale) + const char *fname = NULL; + if (argc >= 6 && JS_IsString(argv[5])) + fname = JS_ToCString(ctx, argv[5]); + JSValue font_v = JS_UNDEFINED; + if (!fname && argc >= 2 && JS_IsObject(argv[1])) { + font_v = JS_GetPropertyStr(ctx, argv[1], "font"); + if (JS_IsString(font_v)) fname = JS_ToCString(ctx, font_v); + } + if (fname) { + if (strcmp(fname, "matrix") == 0 || strcmp(fname, "MatrixChunky8") == 0) + font_id = FONT_MATRIX; + else if (strcmp(fname, "unifont") == 0) font_id = FONT_UNIFONT; + else if (strcmp(fname, "font_1") == 0 || strcmp(fname, "6x10") == 0) + font_id = FONT_6X10; + JS_FreeCString(ctx, fname); + } + JS_FreeValue(ctx, font_v); + + // Re-check center with correct font metrics for non-8x8 fonts + if (font_id != FONT_8X8 && argc >= 2 && JS_IsObject(argv[1])) { + JSValue center2 = JS_GetPropertyStr(ctx, argv[1], "center"); + if (JS_IsString(center2)) { + const char *cv = JS_ToCString(ctx, center2); + if (cv) { + int tw = (font_id == FONT_MATRIX) + ? font_measure_matrix(text, scale) + : (font_id == FONT_UNIFONT) + ? font_measure_unifont(text, scale) : font_measure_6x10(text, scale); - int th = (font_id == FONT_MATRIX) - ? 8 * scale // MatrixChunky8 ascent + int th = (font_id == FONT_MATRIX) + ? 8 * scale // MatrixChunky8 ascent + : (font_id == FONT_UNIFONT) + ? FONT_UNIFONT_H * scale : FONT_6X10_CHAR_H * scale; - if (strchr(cv, 'x')) x = (current_rt->graph->fb->width - tw) / 2; - if (strchr(cv, 'y')) y = (current_rt->graph->fb->height - th) / 2; - JS_FreeCString(ctx, cv); - } + if (strchr(cv, 'x')) x = (current_rt->graph->fb->width - tw) / 2; + if (strchr(cv, 'y')) y = (current_rt->graph->fb->height - th) / 2; + JS_FreeCString(ctx, cv); } - JS_FreeValue(ctx, center2); } + JS_FreeValue(ctx, center2); } if (font_id == FONT_MATRIX) font_draw_matrix(current_rt->graph, text, x, y, scale); + else if (font_id == FONT_UNIFONT) + font_draw_unifont(current_rt->graph, text, x, y, scale); else if (font_id == FONT_6X10) font_draw_6x10(current_rt->graph, text, x, y, scale); else @@ -991,10 +1004,29 @@ static JSValue js_synth(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (JS_IsNumber(v)) JS_ToFloat64(ctx, &pan, v); JS_FreeValue(ctx, v); + // Optional GM-synthesis program (0-127). When present and >= 0 we try the + // bespoke algorithmic GM voice first; if that program is implemented + // (Piano family 0-7 in this slice) it wins and `type` is ignored. If not, + // audio_synth_gm returns 0 and we fall through to the `type`-based path so + // unimplemented programs still use notepat's family-recipe wave. + // docs/gm-synthesis/01-piano-mallet-organ-guitar.md + int gm_program = -1; + JSValue gmp_v = JS_GetPropertyStr(ctx, opts, "gmProgram"); + if (JS_IsNumber(gmp_v)) { + double gd; + if (JS_ToFloat64(ctx, &gd, gmp_v) == 0) gm_program = (int)gd; + } + JS_FreeValue(ctx, gmp_v); + // Create voice. Guns take a separate path so we can seed per-preset // DWG parameters (bore length, body modes, etc). uint64_t id; - if (is_gun) { + if (gm_program >= 0 && !is_gun && + (id = audio_synth_gm(audio, gm_program, freq, duration, volume, + attack, decay, pan)) != 0) { + ac_log("[synth] gm program=%d freq=%.1f vol=%.2f dur=%.1f id=%lu\n", + gm_program, freq, volume, duration, (unsigned long)id); + } else if (is_gun) { // Let `tone` (1.0 default) scale the combustion pressure so pads // can express accent via velocity. A JS caller passing tone=1.0 // = unity pressure from the preset. @@ -2012,7 +2044,27 @@ static JSValue make_event_object(JSContext *ctx, ACEvent *ev) { if (velocity < 1 && ev->type == AC_EVENT_KEYBOARD_DOWN) velocity = 1; JS_SetPropertyStr(ctx, obj, "velocity", JS_NewInt32(ctx, velocity)); JS_SetPropertyStr(ctx, obj, "pressure", JS_NewFloat64(ctx, (double)ev->pressure)); - JS_SetPropertyStr(ctx, obj, "name", JS_NewString(ctx, ev->key_name)); + + // Web parity: event.name is the full event string ("keyboard:down:space", + // "touch", "lift", …) — pieces test it with name.startsWith("keyboard:down") + // (the key alone lives in event.key / event.code above). + { + char full_name[96]; + switch (ev->type) { + case AC_EVENT_KEYBOARD_DOWN: + snprintf(full_name, sizeof(full_name), "keyboard:down:%s", ev->key_name); + break; + case AC_EVENT_KEYBOARD_UP: + snprintf(full_name, sizeof(full_name), "keyboard:up:%s", ev->key_name); + break; + case AC_EVENT_TOUCH: snprintf(full_name, sizeof(full_name), "touch"); break; + case AC_EVENT_DRAW: snprintf(full_name, sizeof(full_name), "draw"); break; + case AC_EVENT_LIFT: snprintf(full_name, sizeof(full_name), "lift"); break; + case AC_EVENT_REFRAMED: snprintf(full_name, sizeof(full_name), "reframed"); break; + default: snprintf(full_name, sizeof(full_name), "%s", ev->key_name); break; + } + JS_SetPropertyStr(ctx, obj, "name", JS_NewString(ctx, full_name)); + } // pointer sub-object JSValue pointer = JS_NewObject(ctx); @@ -2056,6 +2108,25 @@ static JSValue js_num_randint(JSContext *ctx, JSValueConst this_val, int argc, J return JS_NewInt32(ctx, a + rand() % (b - a + 1)); } +// num.randInt(n) — random integer 0..n INCLUSIVE (web-parity; nom and other +// web pieces rely on the inclusive upper bound). +static JSValue js_num_randint_single(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { + (void)this_val; + int n = 0; + if (argc >= 1) JS_ToInt32(ctx, &n, argv[0]); + if (n <= 0) return JS_NewInt32(ctx, 0); + return JS_NewInt32(ctx, rand() % (n + 1)); +} + +// seconds(n) — convert wall seconds to sim ticks. Native calls sim() once +// per ~60Hz display frame; pieces feed this straight into gizmo.Hourglass. +static JSValue js_seconds(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { + (void)this_val; + double s = 0; + if (argc >= 1) JS_ToFloat64(ctx, &s, argv[0]); + return JS_NewFloat64(ctx, s * 60.0); +} + // ============================================================ // Module loader for ES module imports // ============================================================ @@ -2249,6 +2320,55 @@ static const char *js_init_code = "};\n" // num.timestamp — returns a timestamp string "globalThis.__timestamp = function() { return Date.now().toString(36); };\n" + // setTimeout/clearTimeout — queued here, flushed once per sim tick from + // js_call_sim via __flushTimeouts (QuickJS has no event loop of its own). + // Browser-close-enough for the short audio/UI schedules pieces use. + "globalThis.__timeoutQueue = [];\n" + "globalThis.__timeoutId = 1;\n" + "globalThis.setTimeout = globalThis.setTimeout || function(fn, delayMs) {\n" + " if (typeof fn !== 'function') return 0;\n" + " var id = globalThis.__timeoutId++;\n" + " globalThis.__timeoutQueue.push({ id: id, fn: fn, at: Date.now() + (Number(delayMs) || 0) });\n" + " return id;\n" + "};\n" + "globalThis.clearTimeout = globalThis.clearTimeout || function(id) {\n" + " var q = globalThis.__timeoutQueue;\n" + " for (var i = 0; i < q.length; i++) if (q[i].id === id) { q.splice(i, 1); return; }\n" + "};\n" + "globalThis.__flushTimeouts = function() {\n" + " var q = globalThis.__timeoutQueue;\n" + " if (q.length === 0) return;\n" + " var now = Date.now();\n" + " for (var i = 0; i < q.length; ) {\n" + " if (now >= q[i].at) { var e = q.splice(i, 1)[0]; try { e.fn(); } catch (err) { console.error('setTimeout cb error:', err); } }\n" + " else i++;\n" + " }\n" + "};\n" + // gizmo.Hourglass — repeatable sim-tick timer (mirror of web lib/gizmo.mjs). + // Pieces step it once per sim(); with autoFlip it fires `flipped` every + // `max` ticks (nom's troggle clock and friends). + "globalThis.__Hourglass = class Hourglass {\n" + " constructor(max = 1, opts = {}, startingTicks = 0) {\n" + " this.max = max; this.ticks = startingTicks; this.complete = false;\n" + " this.flips = 0n; this.autoFlip = opts.autoFlip || false;\n" + " this._completed = opts.completed; this._flipped = opts.flipped; this._every = opts.every;\n" + " }\n" + " step() {\n" + " if (this.complete === true) return;\n" + " this.ticks += 1;\n" + " if (this._every) this._every();\n" + " this.progress = this.ticks / this.max;\n" + " if (this.ticks >= this.max) {\n" + " this.complete = true; this.progress = 1;\n" + " if (this._completed) this._completed(this.flips);\n" + " if (this.autoFlip) this.flip();\n" + " }\n" + " }\n" + " flip() {\n" + " this.flips += 1n; this.ticks = 0; this.complete = false;\n" + " if (this._flipped) this._flipped(this.flips, ...arguments);\n" + " }\n" + "};\n" // nopaint_generateColoredLabel stub (native doesn't have HUD color highlighting) "globalThis.__nopaint_generateColoredLabel = function() {};\n" // Typeface constructor stub @@ -7680,6 +7800,20 @@ static JSValue build_api(JSContext *ctx, ACRuntime *rt, const char *phase) { JS_SetPropertyStr(ctx, api, "clock", clock); } + // gizmo.Hourglass (sim-tick timer) + seconds(n) → sim ticks. Native runs + // sim once per ~60Hz frame, so seconds(n) = n * 60 (web is n * 120 with a + // 120Hz sim loop — same wall-clock result either way). + { + JSValue gizmo = JS_NewObject(ctx); + JS_SetPropertyStr(ctx, gizmo, "Hourglass", JS_GetPropertyStr(ctx, global, "__Hourglass")); + JS_SetPropertyStr(ctx, api, "gizmo", gizmo); + JS_SetPropertyStr(ctx, api, "seconds", JS_NewCFunction(ctx, js_seconds, "seconds", 1)); + } + + // speak(text, voice?, mode?, opts?) — top-level TTS (web parity; voice / + // provider hints are ignored, the native espeak voice reads the text). + JS_SetPropertyStr(ctx, api, "speak", JS_NewCFunction(ctx, js_speak, "speak", 4)); + // typeface (no-op function) JS_SetPropertyStr(ctx, api, "typeface", JS_NewCFunction(ctx, js_noop, "typeface", 1)); @@ -7698,6 +7832,7 @@ static JSValue build_api(JSContext *ctx, ACRuntime *rt, const char *phase) { JS_SetPropertyStr(ctx, num, "clamp", JS_NewCFunction(ctx, js_num_clamp, "clamp", 3)); JS_SetPropertyStr(ctx, num, "rand", JS_NewCFunction(ctx, js_num_rand, "rand", 0)); JS_SetPropertyStr(ctx, num, "randIntRange", JS_NewCFunction(ctx, js_num_randint, "randIntRange", 2)); + JS_SetPropertyStr(ctx, num, "randInt", JS_NewCFunction(ctx, js_num_randint_single, "randInt", 1)); // max/min — just reference Math.max/min JSValue math = JS_GetPropertyStr(ctx, global, "Math"); @@ -8135,6 +8270,26 @@ void js_call_sim(ACRuntime *rt) { if (rt->input) { rt->input->delta_x = 0; rt->input->delta_y = 0; } } + // Pump the global setTimeout queue (prelude __flushTimeouts) once per + // sim tick — fires any callbacks whose deadline has passed. + { + JSValue global = JS_GetGlobalObject(rt->ctx); + JSValue flush = JS_GetPropertyStr(rt->ctx, global, "__flushTimeouts"); + if (JS_IsFunction(rt->ctx, flush)) { + JSValue r = JS_Call(rt->ctx, flush, JS_UNDEFINED, 0, NULL); + if (JS_IsException(r)) { + JSValue exc = JS_GetException(rt->ctx); + const char *str = JS_ToCString(rt->ctx, exc); + fprintf(stderr, "[js] setTimeout cb error: %s\n", str ? str : "?"); + if (str) JS_FreeCString(rt->ctx, str); + JS_FreeValue(rt->ctx, exc); + } + JS_FreeValue(rt->ctx, r); + } + JS_FreeValue(rt->ctx, flush); + JS_FreeValue(rt->ctx, global); + } + if (!JS_IsFunction(rt->ctx, rt->sim_fn)) return; rt->sim_count++; JSValue api = build_api(rt->ctx, rt, "sim"); diff --git a/system/public/aesthetic.computer/disks/catnom.mjs b/system/public/aesthetic.computer/disks/catnom.mjs new file mode 100644 index 0000000000..98c1bb63f9 --- /dev/null +++ b/system/public/aesthetic.computer/disks/catnom.mjs @@ -0,0 +1,20 @@ +// Catnom, 2026.06.09 +// The Categories edition of nom (shared lib/nom.mjs) — same game, but every +// board is one category from the classic parlor game, AC-flavored: slang, +// code words, aesthetic computer pieces, vibes, keys, internet words. Each +// munch speaks the word's meaning. Reuses lib/nom.mjs wholesale and just +// forces category mode at boot. + +import { boot as nomBoot, sim, paint, act, makeMeta } from "../lib/nom.mjs"; + +function boot(api) { + nomBoot({ ...api, params: ["cat"] }); +} + +// Fixed identity (computed from params, not engine state) so the title is right +// even though meta() runs before boot(). +function meta() { + return makeMeta(["cat"]); +} + +export { boot, sim, paint, act, meta }; diff --git a/system/public/aesthetic.computer/lib/nom.mjs b/system/public/aesthetic.computer/lib/nom.mjs index 867432a154..6885554465 100644 --- a/system/public/aesthetic.computer/lib/nom.mjs +++ b/system/public/aesthetic.computer/lib/nom.mjs @@ -1,7 +1,8 @@ -// nom — shared engine for the muncher games (numbnom / engnom / mexinom / dannom / rusnom / notenom), 2026.06.07 +// nom — shared engine for the muncher games (numbnom / engnom / mexinom / dannom / rusnom / notenom / catnom), 2026.06.07 // Move the muncher around a 5×5 grid and eat every square that satisfies the // rule at the top — but dodge the Troggles. `numbnom` = numbers, `engnom` = words, -// `notenom` = musical notes (note mode voices each square + plays the scale). +// `notenom` = musical notes (note mode voices each square + plays the scale), +// `catnom` = Categories-game rounds (AC pieces, code words, slang, vibes). import { Synth } from "./synth.mjs"; // shared virtual synth + perc kit @@ -17,6 +18,7 @@ import { Synth } from "./synth.mjs"; // shared virtual synth + perc kit munchers:numbers → numbers munchers:words → words munchers:notes → musical notes (notenom) + munchers:cat → categories (catnom) #endregion */ /* #region 🏁 TODO @@ -31,7 +33,7 @@ const START_LIVES = 3; // 🌐 Game state let mode = "number"; // "number" | "word" | "note" -let lang = "en"; // word language: "en" engnom | "es" mexinom | "da" dannom | "ru" rusnom +let lang = "en"; // word language: "en" engnom | "es" mexinom | "da" dannom | "ru" rusnom | "cat" catnom let noteScale = []; // current board's scale (note mode), played on board start let state = "title"; // title | play | clear | over | win let grid = []; // [{ value, correct, eaten, flash }] @@ -157,6 +159,7 @@ function resolveMode(params) { if (p === "spanish" || p === "es" || p === "mexi" || p === "mexinom") return { mode: "word", lang: "es" }; if (p === "danish" || p === "da" || p === "dansk" || p === "dannom") return { mode: "word", lang: "da" }; if (p === "russian" || p === "ru" || p === "russkiy" || p === "rusnom") return { mode: "word", lang: "ru" }; + if (p === "cat" || p === "cats" || p === "categories" || p === "catnom") return { mode: "word", lang: "cat" }; if (p === "words" || p === "word" || p === "english" || p === "en") return { mode: "word", lang: "en" }; if (p === "notes" || p === "note" || p === "music" || p === "notenom") return { mode: "note", lang: "en" }; return { mode: "number", lang: "en" }; // default (incl. bare / numbers) @@ -398,6 +401,31 @@ const TRANSLATE_RU = { "дом": "house", "лес": "forest", "сад": "garden", }; +// 😼 Catnom glossary — spoken on each munch (slang → plain meaning, code → +// one-line gloss), so eating a word teaches it. Words without an entry are +// just echoed back. +const TRANSLATE_CAT = { + // slang + rizz: "charisma", sus: "suspicious", cap: "a lie", goat: "greatest of all time", + mid: "just okay", drip: "a stylish look", slay: "did amazing", bet: "okay, deal", + yeet: "throw it hard", vibe: "a feeling", fam: "your people", bussin: "really good", + // code + bug: "a mistake in code", loop: "code that repeats", git: "saves code history", + byte: "eight bits", bool: "true or false", null: "nothing at all", + array: "a list of things", stack: "last in, first out", repo: "where code lives", + pixel: "one screen dot", code: "instructions", crash: "when code dies", + // aesthetic computer pieces + prompt: "where you type", paint: "draw pictures", chat: "talk to everyone", + notepat: "play notes", camera: "take pictures", wand: "draw in 3 d", + tone: "make a tone", smear: "smudge the paint", bleep: "tap to beep", + wipe: "clear the screen", melody: "play a tune", + // internet + wifi: "wireless internet", meme: "a shared joke", app: "a small program", + link: "tap to go there", post: "share it online", ping: "a quick hello", + spam: "junk messages", lag: "a slow connection", dm: "a direct message", + emoji: "a tiny picture", blog: "an online journal", +}; + function shuffle(arr, rnd) { for (let i = arr.length - 1; i > 0; i -= 1) { const j = rnd(i + 1); @@ -533,6 +561,42 @@ const RU_WORD_ROUNDS = [ }, ]; +// 😼 Catnom — the Categories parlor game, nom-style: every board is one +// category and you eat what belongs. Half the rounds are AC / code flavored, +// half are everyday gen-z language — all still simple word-learning at heart. +const CAT_WORD_ROUNDS = [ + { + label: "SLANG", say: "slang words", + correct: ["rizz", "sus", "cap", "goat", "mid", "drip", "slay", "bet", "yeet", "vibe", "fam", "bussin"], + wrong: ["desk", "lamp", "fork", "sock", "rug", "mop", "jar", "pail", "hose", "rake", "crate"], + }, + { + label: "CODE", say: "coding words", + correct: ["bug", "loop", "git", "byte", "bool", "null", "array", "stack", "repo", "pixel", "code", "crash"], + wrong: ["soup", "sand", "lake", "goose", "pony", "barn", "kite", "plum", "wool", "fog", "hay"], + }, + { + label: "PIECES", say: "aesthetic computer pieces", + correct: ["prompt", "paint", "chat", "notepat", "wand", "tone", "camera", "smear", "bleep", "wipe", "melody"], + wrong: ["sofa", "ladder", "pickle", "anchor", "mitten", "faucet", "wallet", "helmet", "sponge", "teapot"], + }, + { + label: "VIBES", say: "chill vibes", + correct: ["chill", "cozy", "calm", "lofi", "zen", "mellow", "soft", "comfy", "peace", "dream"], + wrong: ["loud", "rush", "panic", "gloom", "harsh", "fuss", "riot", "blare", "jolt", "grind"], + }, + { + label: "KEYS", say: "keyboard keys", + correct: ["esc", "tab", "shift", "enter", "space", "ctrl", "alt", "caps", "home", "end", "del"], + wrong: ["door", "knob", "bell", "gate", "couch", "vent", "sill", "twig", "pond", "moss"], + }, + { + label: "ONLINE", say: "internet words", + correct: ["wifi", "meme", "app", "link", "post", "blog", "ping", "spam", "lag", "dm", "emoji"], + wrong: ["cave", "quilt", "anvil", "plow", "broom", "candle", "stump", "wagon", "shovel", "brick"], + }, +]; + function newRound({ randInt }) { // AC's randInt(n) is inclusive (0..n); wrap it to a 0..n-1 index helper. const rnd = (n) => randInt(Math.max(1, n) - 1); @@ -577,7 +641,7 @@ function newRound({ randInt }) { // Re-verify against the live rule (covers the fallback paths). cells.forEach((c) => (c.correct = test(c.letter, c.oct))); } else if (mode === "word") { - const rounds = lang === "es" ? ES_WORD_ROUNDS : lang === "da" ? DA_WORD_ROUNDS : lang === "ru" ? RU_WORD_ROUNDS : WORD_ROUNDS; + const rounds = lang === "es" ? ES_WORD_ROUNDS : lang === "da" ? DA_WORD_ROUNDS : lang === "ru" ? RU_WORD_ROUNDS : lang === "cat" ? CAT_WORD_ROUNDS : WORD_ROUNDS; const round = rounds[rnd(rounds.length)]; ruleLabel = round.label; ruleSpeech = round.say; @@ -1029,9 +1093,9 @@ function stepToward(t) { else if (rowDist > 0) move(0, drF <= drB ? 1 : -1); } -// 🇲🇽 / 🇩🇰 / 🇷🇺 Speak the English translation of a non-English answer. +// 🇲🇽 / 🇩🇰 / 🇷🇺 / 😼 Speak the meaning of a non-plain-English answer. function sayTranslation(v) { - const table = lang === "da" ? TRANSLATE_DA : lang === "ru" ? TRANSLATE_RU : TRANSLATE; + const table = lang === "da" ? TRANSLATE_DA : lang === "ru" ? TRANSLATE_RU : lang === "cat" ? TRANSLATE_CAT : TRANSLATE; say(table[v] || String(v)); } @@ -1912,7 +1976,7 @@ function paintTroggle({ ink, box, line }, cx, cy, cell, hue) { function gameName() { if (mode === "note") return "NOTENOM"; if (mode !== "word") return "NUMBNOM"; - return lang === "es" ? "MEXINOM" : lang === "da" ? "DANNOM" : lang === "ru" ? "RUSNOM" : "ENGNOM"; + return lang === "es" ? "MEXINOM" : lang === "da" ? "DANNOM" : lang === "ru" ? "RUSNOM" : lang === "cat" ? "CATNOM" : "ENGNOM"; } // Native edition subtitle, in each language's own script/diacritics. Rendered in // unifont (carries accents + Cyrillic) so the symbols are correct. @@ -1922,6 +1986,7 @@ function editionText() { return lang === "es" ? "edición mexicana" : lang === "da" ? "dansk udgave" : lang === "ru" ? "русское издание" + : lang === "cat" ? "category edition" : "english edition"; } @@ -1974,10 +2039,10 @@ function makeMeta(params) { ? "Notenom" : m !== "word" ? "Numbnom" - : l === "es" ? "Mexinom" : l === "da" ? "Dannom" : l === "ru" ? "Rusnom" : "Engnom"; + : l === "es" ? "Mexinom" : l === "da" ? "Dannom" : l === "ru" ? "Rusnom" : l === "cat" ? "Catnom" : "Engnom"; return { title, - desc: "Eat the squares that match the rule — numbnom (numbers), engnom (words), mexinom (español), dannom (dansk), rusnom (русский), notenom (notes).", + desc: "Eat the squares that match the rule — numbnom (numbers), engnom (words), mexinom (español), dannom (dansk), rusnom (русский), notenom (notes), catnom (categories).", }; } function meta() { -- 2.51.2