From 1f57fb9e510b98218154b8cd1a6fd6d69a098400 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 14 Feb 2026 14:04:13 +0100 Subject: [PATCH 01/33] PoC working but just a hack --- wled00/FX.cpp | 103 +- wled00/FX.h | 8 +- wled00/FX_2Dfcn.cpp | 131 +- wled00/fcn_declare.h | 2 + wled00/json.cpp | 15 + wled00/src/font/console_font_4x6.h | 2852 ++--------------- wled00/src/font/console_font_5x12.h | 4387 ++------------------------- wled00/src/font/console_font_5x8.h | 3363 ++------------------ wled00/src/font/console_font_6x8.h | 3363 ++------------------ wled00/src/font/console_font_7x9.h | 3619 ++-------------------- wled00/util.cpp | 46 + 11 files changed, 1739 insertions(+), 16150 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 54f441da35..65d9726bcb 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6302,22 +6302,78 @@ static const char _data_FX_MODE_2DBLOBS[] PROGMEM = "Blobs@!,# blobs,Blur,Trail; //////////////////////////// // 2D Scrolling text // //////////////////////////// +#include "src/font/console_font_4x6.h" +#include "src/font/console_font_5x8.h" +#include "src/font/console_font_5x12.h" +#include "src/font/console_font_6x8.h" +#include "src/font/console_font_7x9.h" + void mode_2Dscrollingtext(void) { if (!strip.isMatrix || !SEGMENT.is2D()) FX_FALLBACK_STATIC; // not a 2D set-up const int cols = SEG_W; const int rows = SEG_H; - unsigned letterWidth, rotLW; - unsigned letterHeight, rotLH; - switch (map(SEGMENT.custom2, 0, 255, 1, 5)) { - default: - case 1: letterWidth = 4; letterHeight = 6; break; - case 2: letterWidth = 5; letterHeight = 8; break; - case 3: letterWidth = 6; letterHeight = 8; break; - case 4: letterWidth = 7; letterHeight = 9; break; - case 5: letterWidth = 5; letterHeight = 12; break; + uint8_t letterHeight; + uint8_t letterWidth; + uint8_t letterSpacing; + + const uint8_t* selectedFont = nullptr; + static File fontFile; // TODO: come up with a good plan, maybe even support multiple files? could do it like image FX. Multi instance can be added if needed (still possible with built in fonts) + bool useCustomFont = SEGMENT.check2; + uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); + // use custom font from file if check2 is enabled and file exists + if (useCustomFont) { + while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait + // Serial.print(F("Looking for font file: ")); + char fileName[16]; + strcpy_P(fileName, PSTR("/font")); + if (fontNum) sprintf(fileName +5, "%d", fontNum); // append font type to file name, e.g. /font1.wbf + strcat_P(fileName, PSTR(".wbf")); + //Serial.println(fileName); + if (WLED_FS.exists(fileName)) { // TODO: this is slow (~20ms(?)) maybe cache result? with this line: 9.5fps (3 segments), without: 9.5fps, so does not matter... open and close is the slow part. + // Serial.print(F(" file found ")); + //if(!fontFile) + fontFile = WLED_FS.open(fileName); + if (fontFile) { + if (fontFile.read() == 'W') { // check file header + // Serial.println(F(" Valid magic byte found")); + letterHeight = fontFile.read(); // font glyph height in pixels + letterWidth = fontFile.read()* 5 / 7; // max glyph width in pixels //!!! must load the width table and use actual glyph width, this is just a test hack + letterSpacing = fontFile.read(); // spacing between characters + /* + fontFile.seek(0); // reset file pointer to the beginning for later use in drawChar() + // print first 500 bytes of the file + for (int i = 0; i < 500; i++) { + Serial.print(fontFile.read(), DEC); + Serial.print(" "); + }*/ + } else { + fontFile.close(); + useCustomFont = false; // invalid file header, fallback to built-in font + } + } + } + else return; // font file not found, do not run the effect for now + //else + //Serial.println(F("Font file not found, using built-in font")); + } + if (!useCustomFont) { + return; // TODO: !!! remvoe debug + switch (fontNum) { + default: + case 0: selectedFont = console_font_4x6; break; + case 1: selectedFont = console_font_5x8; break; + case 2: selectedFont = console_font_6x8; break; + case 3: selectedFont = console_font_7x9; break; + case 4: selectedFont = console_font_5x12; break; + } + // extract dimensions from the header (see font files for details) + letterHeight = pgm_read_byte_near(&selectedFont[1]); + letterWidth = pgm_read_byte_near(&selectedFont[2]); } + + unsigned rotLW, rotLH; // letters are rotated const int8_t rotate = map(SEGMENT.custom3, 0, 31, -2, 2); if (rotate == 1 || rotate == -1) { @@ -6399,8 +6455,9 @@ void mode_2Dscrollingtext(void) { } } - const int numberOfLetters = strlen(text); - int width = (numberOfLetters * rotLW); + const int numberOfChars = utf8_strlen(text); +// Serial.printf("Text to display: '%s' (length: %d chars)\n", text, numberOfChars); + int width = (numberOfChars * rotLW); // TODO: for variable width fonts calculate the actual width of the text instead of assuming fixed width int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-rotLH)/2; if (width <= cols) { // scroll vertically (e.g. ^^ Way out ^^) if it fits @@ -6438,13 +6495,25 @@ void mode_2Dscrollingtext(void) { } } else col2 = col1; // force characters to use single color (from palette) - for (int i = 0; i < numberOfLetters; i++) { - int xoffset = int(cols) - int(SEGENV.aux0) + rotLW*i; + int idx = 0; + + for (int c = 0; c < numberOfChars; c++) { + int xoffset = int(cols) - int(SEGENV.aux0) + ((rotLW+2)*c); // TODO: +1 is fixed, need something better if (xoffset + rotLW < 0) continue; // don't draw characters off-screen - SEGMENT.drawCharacter(text[i], xoffset, yoffset, letterWidth, letterHeight, col1, col2, rotate); - } -} -static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[idx], &charLen); // decode the UTF-8 character + //Serial.printf("charlen: %d, unicode: %u, xoffset: %d\n", charLen, unicode, xoffset); + idx += charLen; // advance by the length of the current UTF-8 character + SEGMENT.drawCharacter(unicode, xoffset, yoffset, selectedFont, fontFile, col1, col2, rotate); + } + if (useCustomFont) fontFile.close(); // TODO: check if this is fast enough opening and closing plus parsing each frame. -> without closing, fps go from 9.5fps to 17fps, maybe better to cache the whole word and only update if changed? +// it can be 64 chars max, each char in normal use is below 32x32 or 128bytes, so 8k per segment absolut max, probably more like 4k and this is not for 8266 terretory. +// but that only works for text, not for clock. so would need to cache numbers 0-9 always. that is another 1k +// or: cache currently visible glyphs only, reload if new char appears. add complexity but could still be way faster than rendering each glyph from file each frame. +//single segment is still fast though, 60fps, with file exists check and open and close: drops to 23fps... cachig may be a good option, can put it in FX data as: charmap, bitmap combo to look it up quickly. +// although that may result in frame hickups whenever the file is being cached... psram would really solve it for good, could just drop the whole font in there. +} +static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Custom Font,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; //////////////////////////// diff --git a/wled00/FX.h b/wled00/FX.h index 9c5291665c..1b17c2e921 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -770,12 +770,12 @@ class Segment { void drawCircle(uint16_t cx, uint16_t cy, uint8_t radius, uint32_t c, bool soft = false) const; void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, uint32_t c, bool soft = false) const; void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c, bool soft = false) const; - void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) const; + void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) const; void wu_pixel(uint32_t x, uint32_t y, CRGB c) const; inline void drawCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { drawCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { fillCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, bool soft = false) const { drawLine(x0, y0, x1, y1, RGBW32(c.r,c.g,c.b,0), soft); } // automatic inline - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) const { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0), RGBW32(c2.r,c2.g,c2.b,0), rotate); } // automatic inline + inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) const { drawCharacter(unicode, x, y, fontData, fontFile, RGBW32(c.r,c.g,c.b,0), RGBW32(c2.r,c2.g,c2.b,0), rotate); } // automatic inline inline void fill_solid(CRGB c) const { fill(RGBW32(c.r,c.g,c.b,0)); } #else inline bool is2D() const { return false; } @@ -810,8 +810,8 @@ class Segment { inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, bool soft = false) {} - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t = 0, int8_t = 0) {} - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c, CRGB c2, int8_t rotate = 0) {} + inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) {} + inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) {} inline void wu_pixel(uint32_t x, uint32_t y, CRGB c) {} #endif friend class WS2812FX; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 34b619ea36..8e6ee674f2 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -559,14 +559,9 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3 } } -#include "src/font/console_font_4x6.h" -#include "src/font/console_font_5x8.h" -#include "src/font/console_font_5x12.h" -#include "src/font/console_font_6x8.h" -#include "src/font/console_font_7x9.h" - // draws a raster font character on canvas // only supports: 4x6=24, 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM +/* void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, int8_t rotate) const { if (!isActive()) return; // not active if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported @@ -602,6 +597,130 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, } } } +}*/ +#define FONT_MAGIC_BYTE 0x57 // 'W' for WLED +#define FONT_HEADER_SIZE 11 // size of font header in bytes +#define LAST_ASCII_CHAR 126 // last ASCII character supported by font (currently hardcoded, could be made dynamic in future) + +void Segment::drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2, int8_t rotate) const { + if (!isActive() || (fontData == nullptr && !fontFile)) return; + //if (pgm_read_byte_near(&fontData[0]) != FONT_MAGIC_BYTE) return; // Check for Magic 'W' TODO: do this in FX not here? + uint8_t w, h, space, first, last, flags; + uint32_t lastUnicode = 0; // will be calculated based on first unicode char and number of glyphs + + fontFile.seek(1); // skip magic byte (already checked) + h = fontFile.read(); + w = fontFile.read(); // max width, (currently not used but could be used to pre allocate a buffer) + space = fontFile.read(); // spacing between characters + flags = fontFile.read(); + first = fontFile.read(); + last = fontFile.read(); + uint32_t firstUnicode; + fontFile.read((uint8_t *)&firstUnicode,4); // first unicode char in this font + if (firstUnicode > 0 && last > LAST_ASCII_CHAR) { + lastUnicode = firstUnicode + (last - LAST_ASCII_CHAR - 1); // calculate last unicode char based on first unicode char and number of glyphs + } + /* + Serial.print("Font Metadata: w="); Serial.print(w, DEC); + Serial.print(" h="); Serial.print(h, DEC); + Serial.print(" flags="); Serial.print(flags, BIN); + Serial.print(" first="); Serial.print(first, DEC); + Serial.print(" last="); Serial.print(last, DEC); + Serial.print(" firstUnicode="); Serial.println(firstUnicode, DEC);*/ + uint8_t numGlyphs = last - first + 1; + + uint8_t widthTable[numGlyphs]; // max 256 characters, each with its own width (if flags & 0x01) + for (int i = 0; i < numGlyphs; i++) { + widthTable[i] = fontFile.read(); + // Serial.print("Width of char "); Serial.print(first + i, DEC); Serial.print(": "); Serial.println(widthTable[i], DEC); + } + + // print first 500 bytes of the file + // for (int i = 0; i < 500; i++) { +//Serial.print(fontFile.read(), DEC); + // Serial.print(" "); + // } + + // read font metadata from header + /* + h = pgm_read_byte_near(&fontData[1]); + w = pgm_read_byte_near(&fontData[2]); + flags = pgm_read_byte_near(&fontData[3]); + first = pgm_read_byte_near(&fontData[4]); + last = pgm_read_byte_near(&fontData[5]); +*/ + if (unicode < first) return; + if (unicode > LAST_ASCII_CHAR) { + if (unicode > lastUnicode || unicode < firstUnicode) { + unicode = '?'; // unicode is in extended range ad not supported by this font, draw a '?' + } + else { + unicode = unicode - firstUnicode + LAST_ASCII_CHAR + 1; // unicode is in extended range and supported by this font, calculate the corresponding font character index + } + } + + uint16_t chrIdx = unicode - first; + + CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; // TODO: move this to FX and pass the palette + //const uint8_t* bitmapData = fontData + 10; // data starts after 10-byte header TODO: add skip over width table if present (flags & 0x01) + + // calculate offset by counting bytes for each glyph + uint32_t bitmapDataOffset = FONT_HEADER_SIZE + numGlyphs; // start of bitmap data (after header and width table) + for (int i = 0; i < chrIdx; i++) { + uint32_t numbits = widthTable[i] * h; + uint32_t numbytes = (numbits + 7) / 8; // Calculate padding-inclusive byte size + bitmapDataOffset += numbytes; + } + + // bytes per glyph + w = widthTable[chrIdx]; // actual width of this character + uint16_t bitsPerChar = (uint32_t)w * h; // todo use 16bit math make sure large fonts do not overflow + uint16_t bytesPerChar = (bitsPerChar + 7) / 8; // Calculate padding-inclusive byte size + //Serial.printf("Drawing char %u (index %u): w=%u, h=%u, bits=%u, bytes=%u\n", unicode, chrIdx, widthTable[chrIdx], h, bitsPerChar, bytesPerChar); + + // Jump to the start of this specific character's data block + //const uint8_t* charData = bitmapData + (chrIdx * bytesPerChar); + uint8_t charData[bytesPerChar]; + fontFile.seek(bitmapDataOffset); // Move file pointer to the character's bitmap data (skip header and width table) + fontFile.read(charData, bytesPerChar); // Read the character's bitmap data into + // draw glyph from top left to bottom right, row by row (packed format is MSB-first) + uint16_t bitIndex = 0; + for (int i = 0; i < h; i++) { // glyph height + CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); // NOBLEND is faster + + for (int j = 0; j < w; j++) { // glyph width + uint16_t bytePos = bitIndex >> 3; // locate the byte and the specific bit + uint8_t bitPos = 7 - (bitIndex & 0x07); // MSB-first bit position within the byte + //uint8_t byteVal = pgm_read_byte_near(&charData[bytePos]); + uint8_t byteVal = charData[bytePos]; + bool bitSet = (byteVal >> bitPos) & 1; + bitIndex++; + + if (bitSet) { + int x0, y0; + // Rotation Logic + /* + switch (rotate) { + case -1: x0 = x + (h-1) - i; y0 = y + (w-1) - j; break; // -90 deg + case -2: + case 2: x0 = x + j; y0 = y + (h-1) - i; break; // 180 deg + case 1: x0 = x + i; y0 = y + j; break; // +90 deg + default: x0 = x + (w-1) - j; y0 = i + y; break; // no rotation + }*/ + switch (rotate) { + case -1: x0 = x + (h-1) - i; y0 = y + j; break; // -90 deg + case -2: + case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; // 180 deg + case 1: x0 = x + i; y0 = y + (w-1) - j; break; // +90 deg + default: x0 = x + j; y0 = y + i; break; // No rotation + } + + if (x0 >= 0 && x0 < (int)vWidth() && y0 >= 0 && y0 < (int)vHeight()) { + setPixelColorXYRaw(x0, y0, c.color32); + } + } + } + } } #define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8)) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 84b6da9e61..2257ff5f34 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -409,6 +409,8 @@ size_t printSetFormIndex(Print& settingsScript, const char* key, int index); size_t printSetClassElementHTML(Print& settingsScript, const char* key, const int index, const char* val); void prepareHostname(char* hostname); [[gnu::pure]] bool isAsterisksOnly(const char* str, byte maxLen); +uint32_t utf8_decode(const char *s, uint8_t *len); +size_t utf8_strlen(const char *s); bool requestJSONBufferLock(uint8_t moduleID=JSON_LOCK_UNKNOWN); void releaseJSONBufferLock(); uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen); diff --git a/wled00/json.cpp b/wled00/json.cpp index 15b7f75922..9873fbccf7 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -142,6 +142,21 @@ static bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0) if (elem["n"]) { // name field exists const char * name = elem["n"].as(); + // print chars as hex + for (size_t i = 0; name && name[i] != '\0'; i++) { + Serial.print(name[i], HEX); + Serial.print(' '); + } + Serial.println(); + // print utf-8 decoded code points + size_t i = 0; + while (i < strlen(name)) { + uint8_t charLen; + uint32_t codePoint = utf8_decode(&name[i], &charLen); + Serial.print("U+"); + Serial.println(codePoint, HEX); + i += charLen; + } seg.setName(name); // will resolve empty and null correctly } else if (start != seg.start || stop != seg.stop) { // clearing or setting segment without name field diff --git a/wled00/src/font/console_font_4x6.h b/wled00/src/font/console_font_4x6.h index f3cc1dc44f..08546fb571 100644 --- a/wled00/src/font/console_font_4x6.h +++ b/wled00/src/font/console_font_4x6.h @@ -1,2566 +1,300 @@ // font courtesy of https://github.com/idispatch/raster-fonts -static const unsigned char console_font_4x6[] PROGMEM = { // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion - // /* - // * code=0, hex=0x00, ascii="^@" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=1, hex=0x01, ascii="^A" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=2, hex=0x02, ascii="^B" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=3, hex=0x03, ascii="^C" - // */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=4, hex=0x04, ascii="^D" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=5, hex=0x05, ascii="^E" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=6, hex=0x06, ascii="^F" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=7, hex=0x07, ascii="^G" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=8, hex=0x08, ascii="^H" - // */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xD0, /* 1101 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - - // /* - // * code=9, hex=0x09, ascii="^I" - // */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=10, hex=0x0A, ascii="^J" - // */ - // 0xF0, /* 1111 */ - // 0x80, /* 1000 */ - // 0xA0, /* 1010 */ - // 0x80, /* 1000 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - - // /* - // * code=11, hex=0x0B, ascii="^K" - // */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x10, /* 0001 */ - // 0x60, /* 0110 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - - // /* - // * code=12, hex=0x0C, ascii="^L" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=13, hex=0x0D, ascii="^M" - // */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - - // /* - // * code=14, hex=0x0E, ascii="^N" - // */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=15, hex=0x0F, ascii="^O" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=16, hex=0x10, ascii="^P" - // */ - // 0x40, /* 0100 */ - // 0x60, /* 0110 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x40, /* 0100 */ - // 0x00, /* 0000 */ - - // /* - // * code=17, hex=0x11, ascii="^Q" - // */ - // 0x10, /* 0001 */ - // 0x30, /* 0011 */ - // 0x70, /* 0111 */ - // 0x30, /* 0011 */ - // 0x10, /* 0001 */ - // 0x00, /* 0000 */ - - // /* - // * code=18, hex=0x12, ascii="^R" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=19, hex=0x13, ascii="^S" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=20, hex=0x14, ascii="^T" - // */ - // 0x70, /* 0111 */ - // 0xD0, /* 1101 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=21, hex=0x15, ascii="^U" - // */ - // 0x30, /* 0011 */ - // 0x60, /* 0110 */ - // 0x50, /* 0101 */ - // 0x30, /* 0011 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - - // /* - // * code=22, hex=0x16, ascii="^V" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=23, hex=0x17, ascii="^W" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - - // /* - // * code=24, hex=0x18, ascii="^X" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=25, hex=0x19, ascii="^Y" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=26, hex=0x1A, ascii="^Z" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0xF0, /* 1111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=27, hex=0x1B, ascii="^[" - // */ - // 0x00, /* 0000 */ - // 0x40, /* 0100 */ - // 0xF0, /* 1111 */ - // 0x40, /* 0100 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=28, hex=0x1C, ascii="^\" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=29, hex=0x1D, ascii="^]" - // */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=30, hex=0x1E, ascii="^^" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=31, hex=0x1F, ascii="^_" - // */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - /* - * code=32, hex=0x20, ascii=" " - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=33, hex=0x21, ascii="!" - */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=34, hex=0x22, ascii=""" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=35, hex=0x23, ascii="#" - */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=36, hex=0x24, ascii="$" - */ - 0x20, /* 0010 */ - 0x30, /* 0011 */ - 0x60, /* 0110 */ - 0x30, /* 0011 */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - - /* - * code=37, hex=0x25, ascii="%" - */ - 0x40, /* 0100 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x10, /* 0001 */ - 0x00, /* 0000 */ - - /* - * code=38, hex=0x26, ascii="&" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x30, /* 0011 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=39, hex=0x27, ascii="'" - */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=40, hex=0x28, ascii="(" - */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=41, hex=0x29, ascii=")" - */ - 0x40, /* 0100 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=42, hex=0x2A, ascii="*" - */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=43, hex=0x2B, ascii="+" - */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=44, hex=0x2C, ascii="," - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - - /* - * code=45, hex=0x2D, ascii="-" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=46, hex=0x2E, ascii="." - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=47, hex=0x2F, ascii="/" - */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=48, hex=0x30, ascii="0" - */ - 0x30, /* 0011 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=49, hex=0x31, ascii="1" - */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=50, hex=0x32, ascii="2" - */ - 0x60, /* 0110 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=51, hex=0x33, ascii="3" - */ - 0x60, /* 0110 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x10, /* 0001 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=52, hex=0x34, ascii="4" - */ - 0x10, /* 0001 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x00, /* 0000 */ - - /* - * code=53, hex=0x35, ascii="5" - */ - 0x70, /* 0111 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x10, /* 0001 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=54, hex=0x36, ascii="6" - */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=55, hex=0x37, ascii="7" - */ - 0x70, /* 0111 */ - 0x10, /* 0001 */ - 0x30, /* 0011 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=56, hex=0x38, ascii="8" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=57, hex=0x39, ascii="9" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x30, /* 0011 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=58, hex=0x3A, ascii=":" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=59, hex=0x3B, ascii=";" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - - /* - * code=60, hex=0x3C, ascii="<" - */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x20, /* 0010 */ - 0x10, /* 0001 */ - 0x00, /* 0000 */ - - /* - * code=61, hex=0x3D, ascii="=" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=62, hex=0x3E, ascii=">" - */ - 0x40, /* 0100 */ - 0x20, /* 0010 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=63, hex=0x3F, ascii="?" - */ - 0x60, /* 0110 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=64, hex=0x40, ascii="@" - */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=65, hex=0x41, ascii="A" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=66, hex=0x42, ascii="B" - */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=67, hex=0x43, ascii="C" - */ - 0x30, /* 0011 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=68, hex=0x44, ascii="D" - */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=69, hex=0x45, ascii="E" - */ - 0x70, /* 0111 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=70, hex=0x46, ascii="F" - */ - 0x70, /* 0111 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=71, hex=0x47, ascii="G" - */ - 0x30, /* 0011 */ - 0x40, /* 0100 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=72, hex=0x48, ascii="H" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=73, hex=0x49, ascii="I" - */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=74, hex=0x4A, ascii="J" - */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=75, hex=0x4B, ascii="K" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=76, hex=0x4C, ascii="L" - */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=77, hex=0x4D, ascii="M" - */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=78, hex=0x4E, ascii="N" - */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=79, hex=0x4F, ascii="O" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=80, hex=0x50, ascii="P" - */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=81, hex=0x51, ascii="Q" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=82, hex=0x52, ascii="R" - */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=83, hex=0x53, ascii="S" - */ - 0x30, /* 0011 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x10, /* 0001 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=84, hex=0x54, ascii="T" - */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=85, hex=0x55, ascii="U" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=86, hex=0x56, ascii="V" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=87, hex=0x57, ascii="W" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=88, hex=0x58, ascii="X" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=89, hex=0x59, ascii="Y" - */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=90, hex=0x5A, ascii="Z" - */ - 0x70, /* 0111 */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=91, hex=0x5B, ascii="[" - */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=92, hex=0x5C, ascii="\" - */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x20, /* 0010 */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x00, /* 0000 */ - - /* - * code=93, hex=0x5D, ascii="]" - */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=94, hex=0x5E, ascii="^" - */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=95, hex=0x5F, ascii="_" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0xF0, /* 1111 */ - - /* - * code=96, hex=0x60, ascii="`" - */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - /* - * code=97, hex=0x61, ascii="a" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x30, /* 0011 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=98, hex=0x62, ascii="b" - */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=99, hex=0x63, ascii="c" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x30, /* 0011 */ - 0x40, /* 0100 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=100, hex=0x64, ascii="d" - */ - 0x10, /* 0001 */ - 0x10, /* 0001 */ - 0x30, /* 0011 */ - 0x50, /* 0101 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=101, hex=0x65, ascii="e" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x60, /* 0110 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=102, hex=0x66, ascii="f" - */ - 0x10, /* 0001 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=103, hex=0x67, ascii="g" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x10, /* 0001 */ - 0x70, /* 0111 */ - - /* - * code=104, hex=0x68, ascii="h" - */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=105, hex=0x69, ascii="i" - */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=106, hex=0x6A, ascii="j" - */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - - /* - * code=107, hex=0x6B, ascii="k" - */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=108, hex=0x6C, ascii="l" - */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=109, hex=0x6D, ascii="m" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x70, /* 0111 */ - 0x70, /* 0111 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=110, hex=0x6E, ascii="n" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=111, hex=0x6F, ascii="o" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=112, hex=0x70, ascii="p" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x50, /* 0101 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - - /* - * code=113, hex=0x71, ascii="q" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x30, /* 0011 */ - 0x50, /* 0101 */ - 0x30, /* 0011 */ - 0x10, /* 0001 */ - - /* - * code=114, hex=0x72, ascii="r" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x40, /* 0100 */ - 0x40, /* 0100 */ - 0x00, /* 0000 */ - - /* - * code=115, hex=0x73, ascii="s" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x30, /* 0011 */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=116, hex=0x74, ascii="t" - */ - 0x00, /* 0000 */ - 0x20, /* 0010 */ - 0x70, /* 0111 */ - 0x20, /* 0010 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=117, hex=0x75, ascii="u" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=118, hex=0x76, ascii="v" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=119, hex=0x77, ascii="w" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x50, /* 0101 */ - 0x70, /* 0111 */ - 0x70, /* 0111 */ - 0x00, /* 0000 */ - - /* - * code=120, hex=0x78, ascii="x" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x50, /* 0101 */ - 0x00, /* 0000 */ - - /* - * code=121, hex=0x79, ascii="y" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x50, /* 0101 */ - 0x50, /* 0101 */ - 0x20, /* 0010 */ - 0x40, /* 0100 */ - - /* - * code=122, hex=0x7A, ascii="z" - */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=123, hex=0x7B, ascii="{" - */ - 0x30, /* 0011 */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x30, /* 0011 */ - 0x00, /* 0000 */ - - /* - * code=124, hex=0x7C, ascii="|" - */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x20, /* 0010 */ - 0x00, /* 0000 */ - - /* - * code=125, hex=0x7D, ascii="}" - */ - 0x60, /* 0110 */ - 0x20, /* 0010 */ - 0x30, /* 0011 */ - 0x20, /* 0010 */ - 0x60, /* 0110 */ - 0x00, /* 0000 */ - - /* - * code=126, hex=0x7E, ascii="~" - */ - 0x50, /* 0101 */ - 0xA0, /* 1010 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - 0x00, /* 0000 */ - - // /* - // * code=127, hex=0x7F, ascii="^?" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (10 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 6 + * [2] Fixed/max glyph width: 4 + // spacing between cars (fixed to 1) + * [3] Flags: 0x00 (fixed width) + * [4] First Char: 32 + * [5] Last Char: 126 + * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 + * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of the stream, padding bits are added if necessary to fill the last byte + */ - // /* - // * code=128, hex=0x80, ascii="!^@" - // */ - // 0x30, /* 0011 */ - // 0x40, /* 0100 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - - // /* - // * code=129, hex=0x81, ascii="!^A" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=130, hex=0x82, ascii="!^B" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=131, hex=0x83, ascii="!^C" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=132, hex=0x84, ascii="!^D" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=133, hex=0x85, ascii="!^E" - // */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=134, hex=0x86, ascii="!^F" - // */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=135, hex=0x87, ascii="!^G" - // */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x60, /* 0110 */ - - // /* - // * code=136, hex=0x88, ascii="!^H" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=137, hex=0x89, ascii="!^I" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=138, hex=0x8A, ascii="!^J" - // */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=139, hex=0x8B, ascii="!^K" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=140, hex=0x8C, ascii="!^L" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=141, hex=0x8D, ascii="!^M" - // */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=142, hex=0x8E, ascii="!^N" - // */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=143, hex=0x8F, ascii="!^O" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=144, hex=0x90, ascii="!^P" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=145, hex=0x91, ascii="!^Q" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - - // /* - // * code=146, hex=0x92, ascii="!^R" - // */ - // 0x30, /* 0011 */ - // 0x60, /* 0110 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=147, hex=0x93, ascii="!^S" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=148, hex=0x94, ascii="!^T" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=149, hex=0x95, ascii="!^U" - // */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=150, hex=0x96, ascii="!^V" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=151, hex=0x97, ascii="!^W" - // */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=152, hex=0x98, ascii="!^X" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - - // /* - // * code=153, hex=0x99, ascii="!^Y" - // */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=154, hex=0x9A, ascii="!^Z" - // */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=155, hex=0x9B, ascii="!^[" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=156, hex=0x9C, ascii="!^\" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=157, hex=0x9D, ascii="!^]" - // */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=158, hex=0x9E, ascii="!^^" - // */ - // 0x00, /* 0000 */ - // 0x60, /* 0110 */ - // 0x60, /* 0110 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=159, hex=0x9F, ascii="!^_" - // */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - - // /* - // * code=160, hex=0xA0, ascii="! " - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=161, hex=0xA1, ascii="!!" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=162, hex=0xA2, ascii="!"" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=163, hex=0xA3, ascii="!#" - // */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=164, hex=0xA4, ascii="!$" - // */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=165, hex=0xA5, ascii="!%" - // */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=166, hex=0xA6, ascii="!&" - // */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=167, hex=0xA7, ascii="!'" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=168, hex=0xA8, ascii="!(" - // */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=169, hex=0xA9, ascii="!)" - // */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x40, /* 0100 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=170, hex=0xAA, ascii="!*" - // */ - // 0x00, /* 0000 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=171, hex=0xAB, ascii="!+" - // */ - // 0x40, /* 0100 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=172, hex=0xAC, ascii="!," - // */ - // 0x40, /* 0100 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x10, /* 0001 */ - // 0x00, /* 0000 */ - - // /* - // * code=173, hex=0xAD, ascii="!-" - // */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=174, hex=0xAE, ascii="!." - // */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=175, hex=0xAF, ascii="!/" - // */ - // 0x00, /* 0000 */ - // 0xA0, /* 1010 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=176, hex=0xB0, ascii="!0" - // */ - // 0x40, /* 0100 */ - // 0x10, /* 0001 */ - // 0x40, /* 0100 */ - // 0x10, /* 0001 */ - // 0x40, /* 0100 */ - // 0x10, /* 0001 */ - - // /* - // * code=177, hex=0xB1, ascii="!1" - // */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - - // /* - // * code=178, hex=0xB2, ascii="!2" - // */ - // 0xB0, /* 1011 */ - // 0xE0, /* 1110 */ - // 0xB0, /* 1011 */ - // 0xE0, /* 1110 */ - // 0xB0, /* 1011 */ - // 0xE0, /* 1110 */ - - // /* - // * code=179, hex=0xB3, ascii="!3" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=180, hex=0xB4, ascii="!4" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=181, hex=0xB5, ascii="!5" - // */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=182, hex=0xB6, ascii="!6" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=183, hex=0xB7, ascii="!7" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=184, hex=0xB8, ascii="!8" - // */ - // 0x00, /* 0000 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=185, hex=0xB9, ascii="!9" - // */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x10, /* 0001 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=186, hex=0xBA, ascii="!:" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=187, hex=0xBB, ascii="!;" - // */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x10, /* 0001 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=188, hex=0xBC, ascii="!<" - // */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x10, /* 0001 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=189, hex=0xBD, ascii="!=" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=190, hex=0xBE, ascii="!>" - // */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=191, hex=0xBF, ascii="!?" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xE0, /* 1110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=192, hex=0xC0, ascii="!@" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=193, hex=0xC1, ascii="!A" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=194, hex=0xC2, ascii="!B" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=195, hex=0xC3, ascii="!C" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=196, hex=0xC4, ascii="!D" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=197, hex=0xC5, ascii="!E" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0xF0, /* 1111 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=198, hex=0xC6, ascii="!F" - // */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=199, hex=0xC7, ascii="!G" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=200, hex=0xC8, ascii="!H" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=201, hex=0xC9, ascii="!I" - // */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=202, hex=0xCA, ascii="!J" - // */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=203, hex=0xCB, ascii="!K" - // */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=204, hex=0xCC, ascii="!L" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x40, /* 0100 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=205, hex=0xCD, ascii="!M" - // */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=206, hex=0xCE, ascii="!N" - // */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x00, /* 0000 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=207, hex=0xCF, ascii="!O" - // */ - // 0x20, /* 0010 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=208, hex=0xD0, ascii="!P" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=209, hex=0xD1, ascii="!Q" - // */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=210, hex=0xD2, ascii="!R" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=211, hex=0xD3, ascii="!S" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=212, hex=0xD4, ascii="!T" - // */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=213, hex=0xD5, ascii="!U" - // */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=214, hex=0xD6, ascii="!V" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=215, hex=0xD7, ascii="!W" - // */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0xD0, /* 1101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - - // /* - // * code=216, hex=0xD8, ascii="!X" - // */ - // 0x20, /* 0010 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=217, hex=0xD9, ascii="!Y" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0xE0, /* 1110 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=218, hex=0xDA, ascii="!Z" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=219, hex=0xDB, ascii="![" - // */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - - // /* - // * code=220, hex=0xDC, ascii="!\" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - - // /* - // * code=221, hex=0xDD, ascii="!]" - // */ - // 0xC0, /* 1100 */ - // 0xC0, /* 1100 */ - // 0xC0, /* 1100 */ - // 0xC0, /* 1100 */ - // 0xC0, /* 1100 */ - // 0xC0, /* 1100 */ - - // /* - // * code=222, hex=0xDE, ascii="!^" - // */ - // 0x30, /* 0011 */ - // 0x30, /* 0011 */ - // 0x30, /* 0011 */ - // 0x30, /* 0011 */ - // 0x30, /* 0011 */ - // 0x30, /* 0011 */ - - // /* - // * code=223, hex=0xDF, ascii="!_" - // */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0xF0, /* 1111 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=224, hex=0xE0, ascii="!`" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x60, /* 0110 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=225, hex=0xE1, ascii="!a" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x60, /* 0110 */ - // 0x50, /* 0101 */ - // 0x60, /* 0110 */ - // 0x40, /* 0100 */ - - // /* - // * code=226, hex=0xE2, ascii="!b" - // */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x40, /* 0100 */ - // 0x40, /* 0100 */ - // 0x40, /* 0100 */ - // 0x00, /* 0000 */ - - // /* - // * code=227, hex=0xE3, ascii="!c" - // */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=228, hex=0xE4, ascii="!d" - // */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=229, hex=0xE5, ascii="!e" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x30, /* 0011 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=230, hex=0xE6, ascii="!f" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - - // /* - // * code=231, hex=0xE7, ascii="!g" - // */ - // 0x00, /* 0000 */ - // 0x10, /* 0001 */ - // 0x60, /* 0110 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=232, hex=0xE8, ascii="!h" - // */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=233, hex=0xE9, ascii="!i" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=234, hex=0xEA, ascii="!j" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=235, hex=0xEB, ascii="!k" - // */ - // 0x30, /* 0011 */ - // 0x40, /* 0100 */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=236, hex=0xEC, ascii="!l" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=237, hex=0xED, ascii="!m" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=238, hex=0xEE, ascii="!n" - // */ - // 0x30, /* 0011 */ - // 0x40, /* 0100 */ - // 0x70, /* 0111 */ - // 0x40, /* 0100 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - - // /* - // * code=239, hex=0xEF, ascii="!o" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - - // /* - // * code=240, hex=0xF0, ascii="!p" - // */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=241, hex=0xF1, ascii="!q" - // */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=242, hex=0xF2, ascii="!r" - // */ - // 0x60, /* 0110 */ - // 0x10, /* 0001 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=243, hex=0xF3, ascii="!s" - // */ - // 0x30, /* 0011 */ - // 0x40, /* 0100 */ - // 0x30, /* 0011 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - - // /* - // * code=244, hex=0xF4, ascii="!t" - // */ - // 0x00, /* 0000 */ - // 0x10, /* 0001 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - - // /* - // * code=245, hex=0xF5, ascii="!u" - // */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - // 0x00, /* 0000 */ - - // /* - // * code=246, hex=0xF6, ascii="!v" - // */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x70, /* 0111 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=247, hex=0xF7, ascii="!w" - // */ - // 0x00, /* 0000 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x50, /* 0101 */ - // 0xA0, /* 1010 */ - // 0x00, /* 0000 */ - - // /* - // * code=248, hex=0xF8, ascii="!x" - // */ - // 0x20, /* 0010 */ - // 0x50, /* 0101 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=249, hex=0xF9, ascii="!y" - // */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x70, /* 0111 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=250, hex=0xFA, ascii="!z" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=251, hex=0xFB, ascii="!{" - // */ - // 0x30, /* 0011 */ - // 0x20, /* 0010 */ - // 0x20, /* 0010 */ - // 0x60, /* 0110 */ - // 0x20, /* 0010 */ - // 0x00, /* 0000 */ - - // /* - // * code=252, hex=0xFC, ascii="!|" - // */ - // 0x70, /* 0111 */ - // 0x50, /* 0101 */ - // 0x50, /* 0101 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=253, hex=0xFD, ascii="!}" - // */ - // 0x60, /* 0110 */ - // 0x20, /* 0010 */ - // 0x40, /* 0100 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=254, hex=0xFE, ascii="!~" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x60, /* 0110 */ - // 0x60, /* 0110 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - - // /* - // * code=255, hex=0xFF, ascii="!^Ÿ" - // */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ - // 0x00, /* 0000 */ +static const unsigned char console_font_4x6[] PROGMEM = { + 0x57, 0x06, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset (32bit) + + // 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x25, 0x75, 0x20, // /* code=1, hex=0x01, ascii="^A" */ + // 0x27, 0x57, 0x20, // /* code=2, hex=0x02, ascii="^B" */ + // 0x05, 0x77, 0x20, // /* code=3, hex=0x03, ascii="^C" */ + // 0x02, 0x77, 0x20, // /* code=4, hex=0x04, ascii="^D" */ + // 0x27, 0x72, 0x70, // /* code=5, hex=0x05, ascii="^E" */ + // 0x22, 0x72, 0x70, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x20, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xDF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x07, 0x57, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xF8, 0xA8, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x03, 0x16, 0x60, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x25, 0x27, 0x20, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x23, 0x22, 0x60, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x23, 0x51, 0x20, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x27, 0x57, 0x20, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x46, 0x76, 0x40, // /* code=16, hex=0x10, ascii="^P" */ + // 0x13, 0x73, 0x10, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x27, 0x27, 0x20, // /* code=18, hex=0x12, ascii="^R" */ + // 0x55, 0x50, 0x50, // /* code=19, hex=0x13, ascii="^S" */ + // 0x7D, 0xD5, 0x50, // /* code=20, hex=0x14, ascii="^T" */ + // 0x36, 0x53, 0x60, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x70, // /* code=22, hex=0x16, ascii="^V" */ + // 0x27, 0x27, 0x27, // /* code=23, hex=0x17, ascii="^W" */ + // 0x27, 0x22, 0x20, // /* code=24, hex=0x18, ascii="^X" */ + // 0x22, 0x27, 0x20, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x02, 0xF2, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x04, 0xF4, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x47, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x05, 0x75, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x02, 0x77, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x07, 0x72, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x22, 0x20, 0x20, /* code=33, hex=0x21, ascii="!" */ + 0x55, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x57, 0x57, 0x50, /* code=35, hex=0x23, ascii="#" */ + 0x23, 0x63, 0x62, /* code=36, hex=0x24, ascii="$" */ + 0x41, 0x24, 0x10, /* code=37, hex=0x25, ascii="%" */ + 0x25, 0x35, 0x70, /* code=38, hex=0x26, ascii="&" */ + 0x64, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x24, 0x44, 0x20, /* code=40, hex=0x28, ascii="(" */ + 0x42, 0x22, 0x40, /* code=41, hex=0x29, ascii=")" */ + 0x52, 0x72, 0x50, /* code=42, hex=0x2A, ascii="*" */ + 0x02, 0x72, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x64, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x70, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x20, /* code=46, hex=0x2E, ascii="." */ + 0x11, 0x24, 0x40, /* code=47, hex=0x2F, ascii="/" */ + 0x35, 0x55, 0x60, /* code=48, hex=0x30, ascii="0" */ + 0x26, 0x22, 0x70, /* code=49, hex=0x31, ascii="1" */ + 0x61, 0x24, 0x70, /* code=50, hex=0x32, ascii="2" */ + 0x61, 0x21, 0x60, /* code=51, hex=0x33, ascii="3" */ + 0x15, 0x71, 0x10, /* code=52, hex=0x34, ascii="4" */ + 0x74, 0x61, 0x60, /* code=53, hex=0x35, ascii="5" */ + 0x24, 0x65, 0x20, /* code=54, hex=0x36, ascii="6" */ + 0x71, 0x32, 0x20, /* code=55, hex=0x37, ascii="7" */ + 0x25, 0x25, 0x20, /* code=56, hex=0x38, ascii="8" */ + 0x25, 0x31, 0x20, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x20, 0x20, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x20, 0x64, /* code=59, hex=0x3B, ascii=";" */ + 0x12, 0x42, 0x10, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x70, 0x70, /* code=61, hex=0x3D, ascii="=" */ + 0x42, 0x12, 0x40, /* code=62, hex=0x3E, ascii=">" */ + 0x61, 0x20, 0x20, /* code=63, hex=0x3F, ascii="?" */ + 0x75, 0x54, 0x70, /* code=64, hex=0x40, ascii="@" */ + 0x25, 0x75, 0x50, /* code=65, hex=0x41, ascii="A" */ + 0x65, 0x65, 0x60, /* code=66, hex=0x42, ascii="B" */ + 0x34, 0x44, 0x30, /* code=67, hex=0x43, ascii="C" */ + 0x65, 0x55, 0x60, /* code=68, hex=0x44, ascii="D" */ + 0x74, 0x64, 0x70, /* code=69, hex=0x45, ascii="E" */ + 0x74, 0x64, 0x40, /* code=70, hex=0x46, ascii="F" */ + 0x34, 0x55, 0x30, /* code=71, hex=0x47, ascii="G" */ + 0x55, 0x75, 0x50, /* code=72, hex=0x48, ascii="H" */ + 0x72, 0x22, 0x70, /* code=73, hex=0x49, ascii="I" */ + 0x11, 0x15, 0x20, /* code=74, hex=0x4A, ascii="J" */ + 0x55, 0x65, 0x50, /* code=75, hex=0x4B, ascii="K" */ + 0x44, 0x44, 0x70, /* code=76, hex=0x4C, ascii="L" */ + 0x57, 0x75, 0x50, /* code=77, hex=0x4D, ascii="M" */ + 0x57, 0x55, 0x50, /* code=78, hex=0x4E, ascii="N" */ + 0x25, 0x55, 0x20, /* code=79, hex=0x4F, ascii="O" */ + 0x65, 0x64, 0x40, /* code=80, hex=0x50, ascii="P" */ + 0x25, 0x57, 0x30, /* code=81, hex=0x51, ascii="Q" */ + 0x65, 0x65, 0x50, /* code=82, hex=0x52, ascii="R" */ + 0x34, 0x71, 0x60, /* code=83, hex=0x53, ascii="S" */ + 0x72, 0x22, 0x20, /* code=84, hex=0x54, ascii="T" */ + 0x55, 0x55, 0x70, /* code=85, hex=0x55, ascii="U" */ + 0x55, 0x55, 0x20, /* code=86, hex=0x56, ascii="V" */ + 0x55, 0x77, 0x50, /* code=87, hex=0x57, ascii="W" */ + 0x55, 0x25, 0x50, /* code=88, hex=0x58, ascii="X" */ + 0x55, 0x22, 0x20, /* code=89, hex=0x59, ascii="Y" */ + 0x71, 0x24, 0x70, /* code=90, hex=0x5A, ascii="Z" */ + 0x64, 0x44, 0x60, /* code=91, hex=0x5B, ascii="[" */ + 0x44, 0x21, 0x10, /* code=92, hex=0x5C, ascii="\" */ + 0x62, 0x22, 0x60, /* code=93, hex=0x5D, ascii="]" */ + 0x25, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x0F, /* code=95, hex=0x5F, ascii="_" */ + 0x62, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x35, 0x70, /* code=97, hex=0x61, ascii="a" */ + 0x44, 0x65, 0x60, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x34, 0x30, /* code=99, hex=0x63, ascii="c" */ + 0x11, 0x35, 0x30, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x76, 0x30, /* code=101, hex=0x65, ascii="e" */ + 0x12, 0x72, 0x20, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x75, 0x17, /* code=103, hex=0x67, ascii="g" */ + 0x44, 0x65, 0x50, /* code=104, hex=0x68, ascii="h" */ + 0x20, 0x22, 0x20, /* code=105, hex=0x69, ascii="i" */ + 0x20, 0x22, 0x26, /* code=106, hex=0x6A, ascii="j" */ + 0x44, 0x56, 0x50, /* code=107, hex=0x6B, ascii="k" */ + 0x22, 0x22, 0x20, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x77, 0x50, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x65, 0x50, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x25, 0x20, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x65, 0x64, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x35, 0x31, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x64, 0x40, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x32, 0x60, /* code=115, hex=0x73, ascii="s" */ + 0x02, 0x72, 0x30, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x55, 0x70, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x55, 0x20, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x57, 0x70, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x52, 0x50, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x55, 0x24, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x62, 0x30, /* code=122, hex=0x7A, ascii="z" */ + 0x32, 0x62, 0x30, /* code=123, hex=0x7B, ascii="{" */ + 0x22, 0x22, 0x20, /* code=124, hex=0x7C, ascii="|" */ + 0x62, 0x32, 0x60, /* code=125, hex=0x7D, ascii="}" */ + 0x5A, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x02, 0x57, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x34, 0x47, 0x24, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x50, 0x55, 0x30, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x12, 0x76, 0x30, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x25, 0x35, 0x70, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x50, 0x35, 0x70, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x42, 0x35, 0x70, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x20, 0x35, 0x70, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x07, 0x47, 0x26, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x25, 0x76, 0x30, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x50, 0x76, 0x30, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x42, 0x76, 0x30, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x50, 0x22, 0x20, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x25, 0x02, 0x20, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x42, 0x02, 0x20, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x52, 0x57, 0x50, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x22, 0x57, 0x50, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x12, 0x76, 0x70, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x37, 0x60, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x36, 0x76, 0x70, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x25, 0x25, 0x20, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x50, 0x25, 0x20, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x42, 0x25, 0x20, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x25, 0x05, 0x70, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x42, 0x55, 0x70, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x50, 0x55, 0x24, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x52, 0x55, 0x20, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x55, 0x70, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x27, 0x47, 0x20, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x12, 0x72, 0x70, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x57, 0x27, 0x20, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x65, 0x50, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x32, 0x32, 0x60, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x12, 0x35, 0x70, // /* code=160, hex=0xA0, ascii="! " */ + // 0x12, 0x02, 0x20, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x12, 0x75, 0x70, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x12, 0x05, 0x70, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x70, 0x75, 0x50, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x70, 0x57, 0x50, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x35, 0x70, 0x70, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x25, 0x20, 0x70, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x20, 0x24, 0x30, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x07, 0x44, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x0E, 0x22, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x45, 0x25, 0x30, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x45, 0x27, 0x10, // /* code=172, hex=0xAC, ascii="!," */ + // 0x20, 0x22, 0x20, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x05, 0xA5, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x0A, 0x5A, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x41, 0x41, 0x41, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x5A, 0x5A, 0x5A, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xBE, 0xBE, 0xBE, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x22, 0x22, 0x22, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x22, 0xE2, 0x22, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x2E, 0x2E, 0x22, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x55, 0xD5, 0x55, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0xF5, 0x55, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x0E, 0x2E, 0x22, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x5D, 0x1D, 0x55, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x55, 0x55, 0x55, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x0F, 0x1D, 0x55, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x5D, 0x1F, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x55, 0xF0, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x2E, 0x2E, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0xE2, 0x22, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x22, 0x30, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x22, 0xF0, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0xF2, 0x22, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x22, 0x32, 0x22, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0xF0, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x22, 0xF2, 0x22, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x23, 0x23, 0x22, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x55, 0x55, 0x55, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x55, 0x47, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x07, 0x45, 0x55, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x5D, 0x0F, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x0F, 0x0D, 0x55, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x55, 0x45, 0x55, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x0F, 0x0F, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x5D, 0x0D, 0x55, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x2F, 0x0F, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x55, 0xF0, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x0F, 0x0F, 0x22, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0xF5, 0x55, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x55, 0x70, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x23, 0x23, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x03, 0x23, 0x22, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x75, 0x55, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x55, 0xD5, 0x55, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x2F, 0x0F, 0x22, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x22, 0xE0, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x32, 0x22, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x0F, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xCC, 0xCC, 0xCC, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x33, 0x33, 0x33, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xF0, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x76, 0x70, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x25, 0x65, 0x64, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x75, 0x44, 0x40, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x75, 0x55, 0x50, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x74, 0x24, 0x70, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x35, 0x20, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x55, 0x74, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x01, 0x62, 0x20, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x72, 0x52, 0x70, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x25, 0x75, 0x20, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x02, 0x55, 0x50, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x34, 0x25, 0x20, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x75, 0x70, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x27, 0x57, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x34, 0x74, 0x30, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x25, 0x55, 0x50, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x70, 0x70, 0x70, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x27, 0x20, 0x70, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x61, 0x60, 0x70, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x34, 0x30, 0x70, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x01, 0x22, 0x22, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x22, 0x22, 0x40, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x20, 0x70, 0x20, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x05, 0xA5, 0xA0, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x25, 0x20, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x02, 0x72, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x20, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x32, 0x26, 0x20, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x75, 0x50, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x62, 0x46, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x66, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_5x12.h b/wled00/src/font/console_font_5x12.h index 4ea5641061..320e0f379d 100644 --- a/wled00/src/font/console_font_5x12.h +++ b/wled00/src/font/console_font_5x12.h @@ -1,4102 +1,299 @@ // font courtesy of https://github.com/idispatch/raster-fonts -static const unsigned char console_font_5x12[] PROGMEM = { // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion - // /* - // * code=0, hex=0x00, ascii="^@" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=1, hex=0x01, ascii="^A" - // */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0xD8, /* 11011 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0xD8, /* 11011 */ - // 0xA8, /* 10101 */ - // 0x88, /* 10001 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=2, hex=0x02, ascii="^B" - // */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xA8, /* 10101 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xA8, /* 10101 */ - // 0xD8, /* 11011 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=3, hex=0x03, ascii="^C" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=4, hex=0x04, ascii="^D" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=5, hex=0x05, ascii="^E" - // */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=6, hex=0x06, ascii="^F" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=7, hex=0x07, ascii="^G" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=8, hex=0x08, ascii="^H" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x98, /* 10011 */ - // 0x98, /* 10011 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=9, hex=0x09, ascii="^I" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=10, hex=0x0A, ascii="^J" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x88, /* 10001 */ - // 0xA8, /* 10101 */ - // 0xA8, /* 10101 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=11, hex=0x0B, ascii="^K" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x18, /* 00011 */ - // 0x28, /* 00101 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=12, hex=0x0C, ascii="^L" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0xE0, /* 11100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=13, hex=0x0D, ascii="^M" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x30, /* 00110 */ - // 0x30, /* 00110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0xC0, /* 11000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=14, hex=0x0E, ascii="^N" - // */ - // 0x30, /* 00110 */ - // 0x50, /* 01010 */ - // 0x70, /* 01110 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0xC0, /* 11000 */ - // 0xC0, /* 11000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=15, hex=0x0F, ascii="^O" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=16, hex=0x10, ascii="^P" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x80, /* 10000 */ - // 0xC0, /* 11000 */ - // 0xE0, /* 11100 */ - // 0xF0, /* 11110 */ - // 0xE0, /* 11100 */ - // 0xC0, /* 11000 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=17, hex=0x11, ascii="^Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0x30, /* 00110 */ - // 0x70, /* 01110 */ - // 0xF0, /* 11110 */ - // 0x70, /* 01110 */ - // 0x30, /* 00110 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=18, hex=0x12, ascii="^R" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=19, hex=0x13, ascii="^S" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=20, hex=0x14, ascii="^T" - // */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xD0, /* 11010 */ - // 0xD0, /* 11010 */ - // 0xD0, /* 11010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=21, hex=0x15, ascii="^U" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x80, /* 10000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x10, /* 00010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=22, hex=0x16, ascii="^V" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=23, hex=0x17, ascii="^W" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - - // /* - // * code=24, hex=0x18, ascii="^X" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=25, hex=0x19, ascii="^Y" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=26, hex=0x1A, ascii="^Z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0xF0, /* 11110 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=27, hex=0x1B, ascii="^[" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0xF0, /* 11110 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=28, hex=0x1C, ascii="^\" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=29, hex=0x1D, ascii="^]" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=30, hex=0x1E, ascii="^^" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=31, hex=0x1F, ascii="^_" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - /* - * code=32, hex=0x20, ascii=" " - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=33, hex=0x21, ascii="!" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=34, hex=0x22, ascii=""" - */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=35, hex=0x23, ascii="#" - */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0xF8, /* 11111 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0xF8, /* 11111 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=36, hex=0x24, ascii="$" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x80, /* 10000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=37, hex=0x25, ascii="%" - */ - 0x00, /* 00000 */ - 0xD0, /* 11010 */ - 0xD0, /* 11010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0xB0, /* 10110 */ - 0xB0, /* 10110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=38, hex=0x26, ascii="&" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0xA0, /* 10100 */ - 0xA0, /* 10100 */ - 0xA0, /* 10100 */ - 0x40, /* 01000 */ - 0xA8, /* 10101 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x68, /* 01101 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=39, hex=0x27, ascii="'" - */ - 0x30, /* 00110 */ - 0x30, /* 00110 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=40, hex=0x28, ascii="(" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=41, hex=0x29, ascii=")" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=42, hex=0x2A, ascii="*" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0xA8, /* 10101 */ - 0x70, /* 01110 */ - 0x70, /* 01110 */ - 0xA8, /* 10101 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=43, hex=0x2B, ascii="+" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0xF8, /* 11111 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=44, hex=0x2C, ascii="," - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - - /* - * code=45, hex=0x2D, ascii="-" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=46, hex=0x2E, ascii="." - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=47, hex=0x2F, ascii="/" - */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=48, hex=0x30, ascii="0" - */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=49, hex=0x31, ascii="1" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x60, /* 01100 */ - 0xA0, /* 10100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=50, hex=0x32, ascii="2" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=51, hex=0x33, ascii="3" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=52, hex=0x34, ascii="4" - */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x30, /* 00110 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=53, hex=0x35, ascii="5" - */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=54, hex=0x36, ascii="6" - */ - 0x00, /* 00000 */ - 0x30, /* 00110 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=55, hex=0x37, ascii="7" - */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=56, hex=0x38, ascii="8" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=57, hex=0x39, ascii="9" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0xC0, /* 11000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=58, hex=0x3A, ascii=":" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=59, hex=0x3B, ascii=";" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - - /* - * code=60, hex=0x3C, ascii="<" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=61, hex=0x3D, ascii="=" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=62, hex=0x3E, ascii=">" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=63, hex=0x3F, ascii="?" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=64, hex=0x40, ascii="@" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xB0, /* 10110 */ - 0xB0, /* 10110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=65, hex=0x41, ascii="A" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=66, hex=0x42, ascii="B" - */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=67, hex=0x43, ascii="C" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=68, hex=0x44, ascii="D" - */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=69, hex=0x45, ascii="E" - */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=70, hex=0x46, ascii="F" - */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=71, hex=0x47, ascii="G" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xB0, /* 10110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=72, hex=0x48, ascii="H" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=73, hex=0x49, ascii="I" - */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=74, hex=0x4A, ascii="J" - */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0xA0, /* 10100 */ - 0xA0, /* 10100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=75, hex=0x4B, ascii="K" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xA0, /* 10100 */ - 0xA0, /* 10100 */ - 0xC0, /* 11000 */ - 0xA0, /* 10100 */ - 0xA0, /* 10100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=76, hex=0x4C, ascii="L" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=77, hex=0x4D, ascii="M" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=78, hex=0x4E, ascii="N" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xD0, /* 11010 */ - 0xD0, /* 11010 */ - 0xB0, /* 10110 */ - 0xB0, /* 10110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=79, hex=0x4F, ascii="O" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=80, hex=0x50, ascii="P" - */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=81, hex=0x51, ascii="Q" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - - /* - * code=82, hex=0x52, ascii="R" - */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0xC0, /* 11000 */ - 0xA0, /* 10100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=83, hex=0x53, ascii="S" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x80, /* 10000 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=84, hex=0x54, ascii="T" - */ - 0x00, /* 00000 */ - 0xF8, /* 11111 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=85, hex=0x55, ascii="U" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=86, hex=0x56, ascii="V" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=87, hex=0x57, ascii="W" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=88, hex=0x58, ascii="X" - */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=89, hex=0x59, ascii="Y" - */ - 0x00, /* 00000 */ - 0x88, /* 10001 */ - 0x88, /* 10001 */ - 0x88, /* 10001 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=90, hex=0x5A, ascii="Z" - */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=91, hex=0x5B, ascii="[" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=92, hex=0x5C, ascii="\" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=93, hex=0x5D, ascii="]" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=94, hex=0x5E, ascii="^" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=95, hex=0x5F, ascii="_" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF8, /* 11111 */ - - /* - * code=96, hex=0x60, ascii="`" - */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=97, hex=0x61, ascii="a" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=98, hex=0x62, ascii="b" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=99, hex=0x63, ascii="c" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=100, hex=0x64, ascii="d" - */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=101, hex=0x65, ascii="e" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=102, hex=0x66, ascii="f" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0xE0, /* 11100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=103, hex=0x67, ascii="g" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - - /* - * code=104, hex=0x68, ascii="h" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=105, hex=0x69, ascii="i" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=106, hex=0x6A, ascii="j" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0xA0, /* 10100 */ - 0x40, /* 01000 */ - - /* - * code=107, hex=0x6B, ascii="k" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x90, /* 10010 */ - 0xA0, /* 10100 */ - 0xC0, /* 11000 */ - 0xC0, /* 11000 */ - 0xA0, /* 10100 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=108, hex=0x6C, ascii="l" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=109, hex=0x6D, ascii="m" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=110, hex=0x6E, ascii="n" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xA0, /* 10100 */ - 0xD0, /* 11010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=111, hex=0x6F, ascii="o" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=112, hex=0x70, ascii="p" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - - /* - * code=113, hex=0x71, ascii="q" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - - /* - * code=114, hex=0x72, ascii="r" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xB0, /* 10110 */ - 0x50, /* 01010 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=115, hex=0x73, ascii="s" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=116, hex=0x74, ascii="t" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0xE0, /* 11100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=117, hex=0x75, ascii="u" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=118, hex=0x76, ascii="v" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=119, hex=0x77, ascii="w" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=120, hex=0x78, ascii="x" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=121, hex=0x79, ascii="y" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0xE0, /* 11100 */ - - /* - * code=122, hex=0x7A, ascii="z" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=123, hex=0x7B, ascii="{" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=124, hex=0x7C, ascii="|" - */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=125, hex=0x7D, ascii="}" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=126, hex=0x7E, ascii="~" - */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0xA0, /* 10100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - // /* - // * code=127, hex=0x7F, ascii="^?" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (10 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 12 + * [2] Fixed glyph width: 5 + * [3] Flags: 0x00 (fixed width) + * [4] First Char: 32 + * [5] Last Char: 126 + * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 + * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of the stream, padding bits are added if necessary to fill the last byte + */ - // /* - // * code=128, hex=0x80, ascii="!^@" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - - // /* - // * code=129, hex=0x81, ascii="!^A" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=130, hex=0x82, ascii="!^B" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=131, hex=0x83, ascii="!^C" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=132, hex=0x84, ascii="!^D" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=133, hex=0x85, ascii="!^E" - // */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=134, hex=0x86, ascii="!^F" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=135, hex=0x87, ascii="!^G" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0xC0, /* 11000 */ - - // /* - // * code=136, hex=0x88, ascii="!^H" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=137, hex=0x89, ascii="!^I" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=138, hex=0x8A, ascii="!^J" - // */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=139, hex=0x8B, ascii="!^K" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=140, hex=0x8C, ascii="!^L" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=141, hex=0x8D, ascii="!^M" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=142, hex=0x8E, ascii="!^N" - // */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=143, hex=0x8F, ascii="!^O" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=144, hex=0x90, ascii="!^P" - // */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=145, hex=0x91, ascii="!^Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x28, /* 00101 */ - // 0x28, /* 00101 */ - // 0x70, /* 01110 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=146, hex=0x92, ascii="!^R" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xE0, /* 11100 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0xF0, /* 11110 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=147, hex=0x93, ascii="!^S" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=148, hex=0x94, ascii="!^T" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=149, hex=0x95, ascii="!^U" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=150, hex=0x96, ascii="!^V" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=151, hex=0x97, ascii="!^W" - // */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=152, hex=0x98, ascii="!^X" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x10, /* 00010 */ - // 0xE0, /* 11100 */ - - // /* - // * code=153, hex=0x99, ascii="!^Y" - // */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=154, hex=0x9A, ascii="!^Z" - // */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=155, hex=0x9B, ascii="!^[" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0x80, /* 10000 */ - // 0x88, /* 10001 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=156, hex=0x9C, ascii="!^\" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0xE0, /* 11100 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0xD0, /* 11010 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=157, hex=0x9D, ascii="!^]" - // */ - // 0x00, /* 00000 */ - // 0x88, /* 10001 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=158, hex=0x9E, ascii="!^^" - // */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xE0, /* 11100 */ - // 0x90, /* 10010 */ - // 0xB8, /* 10111 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=159, hex=0x9F, ascii="!^_" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0x40, /* 01000 */ - - // /* - // * code=160, hex=0xA0, ascii="! " - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=161, hex=0xA1, ascii="!!" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=162, hex=0xA2, ascii="!"" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=163, hex=0xA3, ascii="!#" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=164, hex=0xA4, ascii="!$" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0xA0, /* 10100 */ - // 0xD0, /* 11010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=165, hex=0xA5, ascii="!%" - // */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0xD0, /* 11010 */ - // 0xF0, /* 11110 */ - // 0xB0, /* 10110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=166, hex=0xA6, ascii="!&" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=167, hex=0xA7, ascii="!'" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=168, hex=0xA8, ascii="!(" - // */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=169, hex=0xA9, ascii="!)" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=170, hex=0xAA, ascii="!*" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x10, /* 00010 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=171, hex=0xAB, ascii="!+" - // */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0xA0, /* 10100 */ - // 0x30, /* 00110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=172, hex=0xAC, ascii="!," - // */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x50, /* 01010 */ - // 0xB0, /* 10110 */ - // 0xB0, /* 10110 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=173, hex=0xAD, ascii="!-" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=174, hex=0xAE, ascii="!." - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=175, hex=0xAF, ascii="!/" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=176, hex=0xB0, ascii="!0" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - - // /* - // * code=177, hex=0xB1, ascii="!1" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0xA8, /* 10101 */ - - // /* - // * code=178, hex=0xB2, ascii="!2" - // */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - - // /* - // * code=179, hex=0xB3, ascii="!3" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=180, hex=0xB4, ascii="!4" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=181, hex=0xB5, ascii="!5" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=182, hex=0xB6, ascii="!6" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=183, hex=0xB7, ascii="!7" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=184, hex=0xB8, ascii="!8" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=185, hex=0xB9, ascii="!9" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x10, /* 00010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=186, hex=0xBA, ascii="!:" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=187, hex=0xBB, ascii="!;" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x10, /* 00010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=188, hex=0xBC, ascii="!<" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x10, /* 00010 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=189, hex=0xBD, ascii="!=" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=190, hex=0xBE, ascii="!>" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=191, hex=0xBF, ascii="!?" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=192, hex=0xC0, ascii="!@" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=193, hex=0xC1, ascii="!A" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=194, hex=0xC2, ascii="!B" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=195, hex=0xC3, ascii="!C" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=196, hex=0xC4, ascii="!D" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=197, hex=0xC5, ascii="!E" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=198, hex=0xC6, ascii="!F" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=199, hex=0xC7, ascii="!G" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=200, hex=0xC8, ascii="!H" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x40, /* 01000 */ - // 0x78, /* 01111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=201, hex=0xC9, ascii="!I" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x40, /* 01000 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=202, hex=0xCA, ascii="!J" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=203, hex=0xCB, ascii="!K" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=204, hex=0xCC, ascii="!L" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x40, /* 01000 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=205, hex=0xCD, ascii="!M" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=206, hex=0xCE, ascii="!N" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=207, hex=0xCF, ascii="!O" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=208, hex=0xD0, ascii="!P" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=209, hex=0xD1, ascii="!Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=210, hex=0xD2, ascii="!R" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=211, hex=0xD3, ascii="!S" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x78, /* 01111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=212, hex=0xD4, ascii="!T" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=213, hex=0xD5, ascii="!U" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=214, hex=0xD6, ascii="!V" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=215, hex=0xD7, ascii="!W" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=216, hex=0xD8, ascii="!X" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=217, hex=0xD9, ascii="!Y" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=218, hex=0xDA, ascii="!Z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=219, hex=0xDB, ascii="![" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=220, hex=0xDC, ascii="!\" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=221, hex=0xDD, ascii="!]" - // */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - - // /* - // * code=222, hex=0xDE, ascii="!^" - // */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - // 0x38, /* 00111 */ - - // /* - // * code=223, hex=0xDF, ascii="!_" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=224, hex=0xE0, ascii="!`" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x48, /* 01001 */ - // 0xB0, /* 10110 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0xB0, /* 10110 */ - // 0x48, /* 01001 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=225, hex=0xE1, ascii="!a" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xA0, /* 10100 */ - // 0xE0, /* 11100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xE0, /* 11100 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - - // /* - // * code=226, hex=0xE2, ascii="!b" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x48, /* 01001 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=227, hex=0xE3, ascii="!c" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=228, hex=0xE4, ascii="!d" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x48, /* 01001 */ - // 0x20, /* 00100 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x48, /* 01001 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=229, hex=0xE5, ascii="!e" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=230, hex=0xE6, ascii="!f" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xE0, /* 11100 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - - // /* - // * code=231, hex=0xE7, ascii="!g" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=232, hex=0xE8, ascii="!h" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=233, hex=0xE9, ascii="!i" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0x88, /* 10001 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=234, hex=0xEA, ascii="!j" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=235, hex=0xEB, ascii="!k" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=236, hex=0xEC, ascii="!l" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=237, hex=0xED, ascii="!m" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=238, hex=0xEE, ascii="!n" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0xE0, /* 11100 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=239, hex=0xEF, ascii="!o" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=240, hex=0xF0, ascii="!p" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=241, hex=0xF1, ascii="!q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=242, hex=0xF2, ascii="!r" - // */ - // 0x00, /* 00000 */ - // 0x80, /* 10000 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=243, hex=0xF3, ascii="!s" - // */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x80, /* 10000 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=244, hex=0xF4, ascii="!t" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0x28, /* 00101 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=245, hex=0xF5, ascii="!u" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=246, hex=0xF6, ascii="!v" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=247, hex=0xF7, ascii="!w" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=248, hex=0xF8, ascii="!x" - // */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=249, hex=0xF9, ascii="!y" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=250, hex=0xFA, ascii="!z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=251, hex=0xFB, ascii="!{" - // */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0xA0, /* 10100 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=252, hex=0xFC, ascii="!|" - // */ - // 0xA0, /* 10100 */ - // 0xD0, /* 11010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=253, hex=0xFD, ascii="!}" - // */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x10, /* 00010 */ - // 0x60, /* 01100 */ - // 0x80, /* 10000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=254, hex=0xFE, ascii="!~" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=255, hex=0xFF, ascii="!^Ÿ" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ +static const unsigned char console_font_5x12[] PROGMEM = { + 0x57, 0x0C, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x74, 0x63, 0xB8, 0xC7, 0x75, 0x8B, 0x80, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x77, 0xFF, 0x5F, 0xFE, 0xBB, 0xFB, 0x80, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x02, 0xB7, 0xFF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x23, 0x9C, 0xE2, 0x7F, 0xEE, 0x23, 0x80, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x23, 0x80, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0xFF, 0xCE, 0x7F, 0xFF, 0xFF, 0xF0, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x07, 0x29, 0x4E, 0x00, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xFF, 0xF8, 0xD6, 0xB1, 0xFF, 0xFF, 0xF0, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x0E, 0x32, 0xB2, 0x52, 0x93, 0x00, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x03, 0x25, 0x29, 0x31, 0x08, 0xE2, 0x00, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x08, 0x63, 0x10, 0x84, 0xE6, 0x00, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x32, 0x9C, 0xA5, 0x29, 0xCE, 0xC6, 0x00, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x0A, 0xBA, 0x2E, 0xA8, 0x00, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x21, 0x8E, 0x7B, 0x98, 0x80, 0x00, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x04, 0x67, 0x79, 0xC6, 0x10, 0x00, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x14, 0xA5, 0x29, 0x40, 0x52, 0x80, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x03, 0xB5, 0xAD, 0x69, 0x4A, 0x52, 0x80, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x03, 0x25, 0x06, 0x49, 0x82, 0x93, 0x00, 0x00, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x3E, 0x00, // /* code=23, hex=0x17, ascii="^W" */ + // 0x01, 0x1D, 0x52, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x08, 0x42, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x82, 0x78, 0x88, 0x00, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x44, 0x79, 0x04, 0x00, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0xA5, 0x7D, 0x4A, 0x00, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x42, 0x39, 0xDF, 0x00, 0x00, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x01, 0xF7, 0x38, 0x84, 0x00, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x01, 0x08, 0x42, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x52, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x02, 0x95, 0xF5, 0x2B, 0xEA, 0x50, 0x00, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x02, 0x19, 0x28, 0x20, 0x82, 0x93, 0x08, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x06, 0xB4, 0x42, 0x21, 0x08, 0xB5, 0x80, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x02, 0x29, 0x4A, 0x22, 0xB2, 0x93, 0x40, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x31, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x01, 0x10, 0x84, 0x21, 0x08, 0x41, 0x00, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x02, 0x08, 0x42, 0x10, 0x84, 0x22, 0x00, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x09, 0x57, 0x3A, 0xA4, 0x00, 0x00, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x42, 0x7C, 0x84, 0x00, 0x00, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0x80, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x84, 0x42, 0x21, 0x08, 0x84, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x03, 0xA5, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x01, 0x19, 0x42, 0x10, 0x84, 0x27, 0x80, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x03, 0x25, 0x21, 0x11, 0x10, 0x87, 0x80, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x03, 0x24, 0x21, 0x30, 0x42, 0x93, 0x00, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x8C, 0xA5, 0x4B, 0xC2, 0x10, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x07, 0xA1, 0x08, 0x70, 0x42, 0x93, 0x00, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x01, 0x91, 0x0E, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x07, 0x84, 0x21, 0x10, 0x88, 0x42, 0x00, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x03, 0x25, 0x29, 0x32, 0x52, 0x93, 0x00, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x03, 0x25, 0x29, 0x49, 0xC2, 0x26, 0x00, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x00, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x08, 0x80, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x04, 0x44, 0x42, 0x08, 0x20, 0x80, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x20, 0x82, 0x08, 0x44, 0x44, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x03, 0x25, 0x21, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x03, 0x25, 0x29, 0x5A, 0xD0, 0x83, 0x80, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x03, 0x25, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x07, 0x25, 0x29, 0x72, 0x52, 0x97, 0x00, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x00, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x07, 0x25, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x87, 0x80, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x84, 0x00, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x03, 0x25, 0x28, 0x42, 0xD2, 0x93, 0x00, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x04, 0xA5, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x03, 0x88, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x03, 0x88, 0x42, 0x10, 0x94, 0xA2, 0x00, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x04, 0xA5, 0x4A, 0x62, 0x94, 0x94, 0x80, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x04, 0x21, 0x08, 0x42, 0x10, 0x87, 0x80, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x04, 0xA5, 0xEF, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x04, 0xA5, 0xAD, 0x5A, 0xD2, 0x94, 0x80, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x07, 0x25, 0x29, 0x72, 0x10, 0x84, 0x00, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x08, 0x20, /* code=81, hex=0x51, ascii="Q" */ + 0x07, 0x25, 0x29, 0x73, 0x14, 0x94, 0x80, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x03, 0x25, 0x28, 0x30, 0x52, 0x93, 0x00, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x07, 0xC8, 0x42, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x04, 0xA5, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x04, 0xA5, 0x29, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x04, 0xA5, 0x29, 0x4A, 0x5E, 0x94, 0x80, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x04, 0xA5, 0x26, 0x31, 0x92, 0x94, 0x80, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x04, 0x63, 0x15, 0x28, 0x84, 0x21, 0x00, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x07, 0x84, 0x42, 0x21, 0x10, 0x87, 0x80, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x03, 0x10, 0x84, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x04, 0x20, 0x84, 0x10, 0x84, 0x10, 0x80, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x00, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, /* code=95, hex=0x5F, ascii="_" */ + 0x63, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x06, 0x09, 0xD2, 0x93, 0x80, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x80, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x84, 0x27, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x01, 0x10, 0x8E, 0x21, 0x08, 0x42, 0x00, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0xC0, /* code=103, hex=0x67, ascii="g" */ + 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x00, 0x08, 0x02, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x28, 0x80, /* code=106, hex=0x6A, ascii="j" */ + 0x04, 0x21, 0x09, 0x53, 0x18, 0xA4, 0x80, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x09, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x0E, 0x4A, 0x52, 0x97, 0x21, 0x00, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0x20, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x0B, 0x29, 0x08, 0x42, 0x00, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x06, 0x49, 0x04, 0x93, 0x00, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x10, 0x8E, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x09, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0xF4, 0x80, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x09, 0x49, 0x8C, 0x94, 0x80, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x0F, 0x08, 0x88, 0x87, 0x80, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x01, 0x10, 0x84, 0x41, 0x08, 0x41, 0x00, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x21, 0x08, 0x40, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x08, 0x42, 0x08, 0x84, 0x22, 0x00, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x02, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x01, 0x08, 0xA5, 0x46, 0x31, 0x8F, 0xC0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x08, 0x80, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x01, 0x90, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x03, 0x24, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x00, 0x14, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x06, 0x08, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x14, 0x46, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x89, 0x80, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x03, 0x24, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x00, 0x14, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x06, 0x08, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x00, 0x14, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x03, 0x24, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x03, 0x04, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x50, 0x19, 0x29, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x22, 0x88, 0xC9, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x32, 0x01, 0xE8, 0x43, 0xD0, 0x87, 0x80, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x07, 0x14, 0xAE, 0xA2, 0x80, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x1D, 0xCA, 0x53, 0xD4, 0xA5, 0x80, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x03, 0x24, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x00, 0x14, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x03, 0x04, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x03, 0x24, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x06, 0x08, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x50, 0x19, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x00, 0x47, 0x46, 0x11, 0x71, 0x00, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x14, 0x84, 0x71, 0x08, 0xD7, 0x80, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x04, 0x54, 0xAF, 0x93, 0xE4, 0x21, 0x00, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x07, 0x25, 0x2E, 0x4A, 0xF2, 0x94, 0x80, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x11, 0x08, 0x42, 0x38, 0x84, 0x21, 0x28, 0x80, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x01, 0x90, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x01, 0x90, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x01, 0x90, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x01, 0x90, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x02, 0xA8, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x55, 0x01, 0x2D, 0x7A, 0xD2, 0x94, 0x80, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x03, 0x04, 0xE9, 0x38, 0x1E, 0x00, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x03, 0x25, 0x29, 0x30, 0x1E, 0x00, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x02, 0x10, 0x04, 0x22, 0x10, 0x93, 0x00, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x03, 0xD0, 0x80, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x03, 0xC2, 0x10, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x02, 0x14, 0xA2, 0x21, 0xD2, 0xA1, 0x80, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x02, 0x14, 0xA2, 0x21, 0x56, 0xB0, 0x80, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0xA5, 0x52, 0x8A, 0x50, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x01, 0x4A, 0x29, 0x54, 0xA0, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x00, 0x2A, 0x00, 0x28, 0x00, 0xA8, 0x00, 0xA0, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x02, 0x81, 0x50, 0x28, 0x15, 0x02, 0x81, 0x50, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x21, 0x08, 0x42, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x21, 0x08, 0x4E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x52, 0x94, 0xA5, 0x69, 0x4A, 0x52, 0x94, 0xA0, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x79, 0x4A, 0x52, 0x94, 0xA0, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x0E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x52, 0x94, 0xAD, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x52, 0x94, 0xA5, 0x29, 0x4A, 0x52, 0x94, 0xA0, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x0F, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x52, 0x94, 0xAD, 0x0B, 0xC0, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x52, 0x94, 0xA5, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x21, 0x08, 0x4E, 0x13, 0x80, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x21, 0x08, 0x42, 0x1C, 0x00, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x21, 0x08, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x21, 0x08, 0x42, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x21, 0x08, 0x42, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x21, 0x08, 0x43, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x52, 0x94, 0xA5, 0x2D, 0x4A, 0x52, 0x94, 0xA0, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x52, 0x94, 0xA5, 0xA1, 0xE0, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x07, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x52, 0x94, 0xAD, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x0F, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x52, 0x94, 0xA5, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x52, 0x94, 0xAD, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x21, 0x08, 0x4F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x52, 0x94, 0xA5, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x0F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x94, 0xA0, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x52, 0x94, 0xA5, 0x3C, 0x00, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x21, 0x08, 0x43, 0x90, 0xE0, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x03, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x3D, 0x4A, 0x52, 0x94, 0xA0, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x52, 0x94, 0xA5, 0x6D, 0x4A, 0x52, 0x94, 0xA0, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x21, 0x08, 0x4F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x21, 0x08, 0x42, 0x70, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xC0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x70, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x00, 0x9B, 0x52, 0x96, 0x48, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x25, 0x2A, 0x72, 0x52, 0x97, 0x21, 0x00, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0x1E, 0x94, 0x21, 0x08, 0x42, 0x00, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x80, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x00, 0x01, 0xF4, 0x90, 0x44, 0x4F, 0xC0, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x0F, 0xD2, 0x94, 0x40, 0x00, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x09, 0x4A, 0x52, 0x97, 0x21, 0x00, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x00, 0x00, 0x2A, 0x84, 0x21, 0x00, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x00, 0x00, 0x07, 0x11, 0x4A, 0x23, 0x80, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x00, 0x45, 0x47, 0xF1, 0x51, 0x00, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x00, 0x45, 0x46, 0x2A, 0x56, 0xC0, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x0C, 0x84, 0x11, 0xD2, 0x93, 0x00, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x05, 0x56, 0xAA, 0x00, 0x00, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x08, 0x47, 0x56, 0xAE, 0x21, 0x00, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0x00, 0xE8, 0x43, 0x90, 0x83, 0x80, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x00, 0xC9, 0x4A, 0x52, 0x90, 0x00, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x01, 0xE0, 0x78, 0x1E, 0x00, 0x00, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x00, 0x42, 0x7C, 0x84, 0x07, 0xC0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x04, 0x10, 0x41, 0x11, 0x10, 0x07, 0x80, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x88, 0x88, 0x20, 0x82, 0x07, 0x80, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x04, 0x52, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, 0xA2, 0x00, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x08, 0x40, 0x7C, 0x04, 0x20, 0x00, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x05, 0x50, 0x0A, 0xA0, 0x00, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x64, 0xA4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x02, 0x38, 0x80, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x01, 0xC8, 0x42, 0x12, 0x94, 0x61, 0x00, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0xA6, 0xA5, 0x29, 0x48, 0x00, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x64, 0x84, 0xC8, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x00, 0xE7, 0x39, 0xCE, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_5x8.h b/wled00/src/font/console_font_5x8.h index c56f2ce0ff..f2194a1f4e 100644 --- a/wled00/src/font/console_font_5x8.h +++ b/wled00/src/font/console_font_5x8.h @@ -1,3078 +1,299 @@ // font courtesy of https://github.com/idispatch/raster-fonts -static const unsigned char console_font_5x8[] PROGMEM = { // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion - // /* - // * code=0, hex=0x00, ascii="^@" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=1, hex=0x01, ascii="^A" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0xF8, /* 11111 */ - // 0xD8, /* 11011 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=2, hex=0x02, ascii="^B" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=3, hex=0x03, ascii="^C" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=4, hex=0x04, ascii="^D" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=5, hex=0x05, ascii="^E" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=6, hex=0x06, ascii="^F" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0xA8, /* 10101 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=7, hex=0x07, ascii="^G" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=8, hex=0x08, ascii="^H" - // */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xD8, /* 11011 */ - // 0x88, /* 10001 */ - // 0xD8, /* 11011 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=9, hex=0x09, ascii="^I" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=10, hex=0x0A, ascii="^J" - // */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xD8, /* 11011 */ - // 0x88, /* 10001 */ - // 0xD8, /* 11011 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=11, hex=0x0B, ascii="^K" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x18, /* 00011 */ - // 0x68, /* 01101 */ - // 0xA0, /* 10100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - - // /* - // * code=12, hex=0x0C, ascii="^L" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=13, hex=0x0D, ascii="^M" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x40, /* 01000 */ - // 0xC0, /* 11000 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - - // /* - // * code=14, hex=0x0E, ascii="^N" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x48, /* 01001 */ - // 0x58, /* 01011 */ - // 0xD0, /* 11010 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - - // /* - // * code=15, hex=0x0F, ascii="^O" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=16, hex=0x10, ascii="^P" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x60, /* 01100 */ - // 0x70, /* 01110 */ - // 0x60, /* 01100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - - // /* - // * code=17, hex=0x11, ascii="^Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0x30, /* 00110 */ - // 0x70, /* 01110 */ - // 0x30, /* 00110 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - - // /* - // * code=18, hex=0x12, ascii="^R" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=19, hex=0x13, ascii="^S" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - - // /* - // * code=20, hex=0x14, ascii="^T" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0xD0, /* 11010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=21, hex=0x15, ascii="^U" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x18, /* 00011 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x48, /* 01001 */ - // 0x30, /* 00110 */ - // 0xC0, /* 11000 */ - - // /* - // * code=22, hex=0x16, ascii="^V" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - - // /* - // * code=23, hex=0x17, ascii="^W" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - - // /* - // * code=24, hex=0x18, ascii="^X" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=25, hex=0x19, ascii="^Y" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=26, hex=0x1A, ascii="^Z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0xF8, /* 11111 */ - // 0x10, /* 00010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=27, hex=0x1B, ascii="^[" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0xF8, /* 11111 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=28, hex=0x1C, ascii="^\" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x80, /* 10000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=29, hex=0x1D, ascii="^]" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=30, hex=0x1E, ascii="^^" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - - // /* - // * code=31, hex=0x1F, ascii="^_" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - /* - * code=32, hex=0x20, ascii=" " - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=33, hex=0x21, ascii="!" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=34, hex=0x22, ascii=""" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=35, hex=0x23, ascii="#" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0xF8, /* 11111 */ - 0x50, /* 01010 */ - 0xF8, /* 11111 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - - /* - * code=36, hex=0x24, ascii="$" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x30, /* 00110 */ - 0x40, /* 01000 */ - 0x30, /* 00110 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - - /* - * code=37, hex=0x25, ascii="%" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0xA8, /* 10101 */ - 0x50, /* 01010 */ - 0x30, /* 00110 */ - 0x68, /* 01101 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=38, hex=0x26, ascii="&" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x30, /* 00110 */ - 0x40, /* 01000 */ - 0x68, /* 01101 */ - 0x90, /* 10010 */ - 0x68, /* 01101 */ - 0x00, /* 00000 */ - - /* - * code=39, hex=0x27, ascii="'" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=40, hex=0x28, ascii="(" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=41, hex=0x29, ascii=")" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=42, hex=0x2A, ascii="*" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x20, /* 00100 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - - /* - * code=43, hex=0x2B, ascii="+" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=44, hex=0x2C, ascii="," - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - - /* - * code=45, hex=0x2D, ascii="-" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=46, hex=0x2E, ascii="." - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=47, hex=0x2F, ascii="/" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=48, hex=0x30, ascii="0" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=49, hex=0x31, ascii="1" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=50, hex=0x32, ascii="2" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - - /* - * code=51, hex=0x33, ascii="3" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=52, hex=0x34, ascii="4" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x30, /* 00110 */ - 0x50, /* 01010 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - - /* - * code=53, hex=0x35, ascii="5" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x10, /* 00010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=54, hex=0x36, ascii="6" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=55, hex=0x37, ascii="7" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=56, hex=0x38, ascii="8" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=57, hex=0x39, ascii="9" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=58, hex=0x3A, ascii=":" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=59, hex=0x3B, ascii=";" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - - /* - * code=60, hex=0x3C, ascii="<" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - - /* - * code=61, hex=0x3D, ascii="=" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=62, hex=0x3E, ascii=">" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=63, hex=0x3F, ascii="?" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=64, hex=0x40, ascii="@" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x88, /* 10001 */ - 0xB0, /* 10110 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=65, hex=0x41, ascii="A" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=66, hex=0x42, ascii="B" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=67, hex=0x43, ascii="C" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=68, hex=0x44, ascii="D" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=69, hex=0x45, ascii="E" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - - /* - * code=70, hex=0x46, ascii="F" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - - /* - * code=71, hex=0x47, ascii="G" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x80, /* 10000 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=72, hex=0x48, ascii="H" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=73, hex=0x49, ascii="I" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=74, hex=0x4A, ascii="J" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=75, hex=0x4B, ascii="K" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0xA0, /* 10100 */ - 0xC0, /* 11000 */ - 0xA0, /* 10100 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=76, hex=0x4C, ascii="L" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - - /* - * code=77, hex=0x4D, ascii="M" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=78, hex=0x4E, ascii="N" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0xD0, /* 11010 */ - 0xB0, /* 10110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=79, hex=0x4F, ascii="O" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=80, hex=0x50, ascii="P" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0x00, /* 00000 */ - - /* - * code=81, hex=0x51, ascii="Q" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - - /* - * code=82, hex=0x52, ascii="R" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=83, hex=0x53, ascii="S" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x80, /* 10000 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=84, hex=0x54, ascii="T" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF8, /* 11111 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=85, hex=0x55, ascii="U" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=86, hex=0x56, ascii="V" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=87, hex=0x57, ascii="W" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x88, /* 10001 */ - 0xA8, /* 10101 */ - 0xA8, /* 10101 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - - /* - * code=88, hex=0x58, ascii="X" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x50, /* 01010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=89, hex=0x59, ascii="Y" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x50, /* 01010 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=90, hex=0x5A, ascii="Z" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x80, /* 10000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - - /* - * code=91, hex=0x5B, ascii="[" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=92, hex=0x5C, ascii="\" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - - /* - * code=93, hex=0x5D, ascii="]" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=94, hex=0x5E, ascii="^" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=95, hex=0x5F, ascii="_" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF8, /* 11111 */ - - /* - * code=96, hex=0x60, ascii="`" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - /* - * code=97, hex=0x61, ascii="a" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x10, /* 00010 */ - 0x70, /* 01110 */ - 0x50, /* 01010 */ - 0x00, /* 00000 */ - - /* - * code=98, hex=0x62, ascii="b" - */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=99, hex=0x63, ascii="c" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x30, /* 00110 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x30, /* 00110 */ - 0x00, /* 00000 */ - - /* - * code=100, hex=0x64, ascii="d" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=101, hex=0x65, ascii="e" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0xF0, /* 11110 */ - 0x80, /* 10000 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=102, hex=0x66, ascii="f" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x30, /* 00110 */ - 0x40, /* 01000 */ - 0xE0, /* 11100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=103, hex=0x67, ascii="g" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - - /* - * code=104, hex=0x68, ascii="h" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=105, hex=0x69, ascii="i" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=106, hex=0x6A, ascii="j" - */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - - /* - * code=107, hex=0x6B, ascii="k" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x80, /* 10000 */ - 0xA0, /* 10100 */ - 0xC0, /* 11000 */ - 0xA0, /* 10100 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=108, hex=0x6C, ascii="l" - */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=109, hex=0x6D, ascii="m" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=110, hex=0x6E, ascii="n" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=111, hex=0x6F, ascii="o" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=112, hex=0x70, ascii="p" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xE0, /* 11100 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xE0, /* 11100 */ - 0x80, /* 10000 */ - - /* - * code=113, hex=0x71, ascii="q" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - - /* - * code=114, hex=0x72, ascii="r" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0x60, /* 01100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=115, hex=0x73, ascii="s" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x70, /* 01110 */ - 0xC0, /* 11000 */ - 0x30, /* 00110 */ - 0xE0, /* 11100 */ - 0x00, /* 00000 */ - - /* - * code=116, hex=0x74, ascii="t" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0xF0, /* 11110 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x30, /* 00110 */ - 0x00, /* 00000 */ - - /* - * code=117, hex=0x75, ascii="u" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x00, /* 00000 */ - - /* - * code=118, hex=0x76, ascii="v" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x00, /* 00000 */ - - /* - * code=119, hex=0x77, ascii="w" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0xF0, /* 11110 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=120, hex=0x78, ascii="x" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x60, /* 01100 */ - 0x60, /* 01100 */ - 0x90, /* 10010 */ - 0x00, /* 00000 */ - - /* - * code=121, hex=0x79, ascii="y" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x90, /* 10010 */ - 0x90, /* 10010 */ - 0x70, /* 01110 */ - 0x10, /* 00010 */ - 0x60, /* 01100 */ - - /* - * code=122, hex=0x7A, ascii="z" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0xF0, /* 11110 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0xF0, /* 11110 */ - 0x00, /* 00000 */ - - /* - * code=123, hex=0x7B, ascii="{" - */ - 0x00, /* 00000 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x00, /* 00000 */ - - /* - * code=124, hex=0x7C, ascii="|" - */ - 0x00, /* 00000 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x20, /* 00100 */ - 0x00, /* 00000 */ - - /* - * code=125, hex=0x7D, ascii="}" - */ - 0x00, /* 00000 */ - 0x40, /* 01000 */ - 0x20, /* 00100 */ - 0x10, /* 00010 */ - 0x10, /* 00010 */ - 0x20, /* 00100 */ - 0x40, /* 01000 */ - 0x00, /* 00000 */ - - /* - * code=126, hex=0x7E, ascii="~" - */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x50, /* 01010 */ - 0xA0, /* 10100 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - 0x00, /* 00000 */ - - // /* - // * code=127, hex=0x7F, ascii="^?" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (10 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed/max glyph width: 5 + * [3] Flags: 0x00 (fixed width) + * [4] First Char: 32 + * [5] Last Char: 126 + * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 + * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of the stream, padding bits are added if necessary to fill the last byte + */ - // /* - // * code=128, hex=0x80, ascii="!^@" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - - // /* - // * code=129, hex=0x81, ascii="!^A" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=130, hex=0x82, ascii="!^B" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=131, hex=0x83, ascii="!^C" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - - // /* - // * code=132, hex=0x84, ascii="!^D" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=133, hex=0x85, ascii="!^E" - // */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=134, hex=0x86, ascii="!^F" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=135, hex=0x87, ascii="!^G" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x30, /* 00110 */ - // 0x20, /* 00100 */ - - // /* - // * code=136, hex=0x88, ascii="!^H" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=137, hex=0x89, ascii="!^I" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=138, hex=0x8A, ascii="!^J" - // */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=139, hex=0x8B, ascii="!^K" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=140, hex=0x8C, ascii="!^L" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=141, hex=0x8D, ascii="!^M" - // */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=142, hex=0x8E, ascii="!^N" - // */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - - // /* - // * code=143, hex=0x8F, ascii="!^O" - // */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - - // /* - // * code=144, hex=0x90, ascii="!^P" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0xF0, /* 11110 */ - // 0x80, /* 10000 */ - // 0xE0, /* 11100 */ - // 0x80, /* 10000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - - // /* - // * code=145, hex=0x91, ascii="!^Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x78, /* 01111 */ - // 0xE0, /* 11100 */ - // 0xB8, /* 10111 */ - // 0x00, /* 00000 */ - - // /* - // * code=146, hex=0x92, ascii="!^R" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xA0, /* 10100 */ - // 0xF0, /* 11110 */ - // 0xA0, /* 10100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=147, hex=0x93, ascii="!^S" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=148, hex=0x94, ascii="!^T" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=149, hex=0x95, ascii="!^U" - // */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=150, hex=0x96, ascii="!^V" - // */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=151, hex=0x97, ascii="!^W" - // */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=152, hex=0x98, ascii="!^X" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x10, /* 00010 */ - // 0x60, /* 01100 */ - - // /* - // * code=153, hex=0x99, ascii="!^Y" - // */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=154, hex=0x9A, ascii="!^Z" - // */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=155, hex=0x9B, ascii="!^[" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x80, /* 10000 */ - // 0x80, /* 10000 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - - // /* - // * code=156, hex=0x9C, ascii="!^\" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x50, /* 01010 */ - // 0x40, /* 01000 */ - // 0xE0, /* 11100 */ - // 0x40, /* 01000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - - // /* - // * code=157, hex=0x9D, ascii="!^]" - // */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=158, hex=0x9E, ascii="!^^" - // */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0xA0, /* 10100 */ - // 0xB0, /* 10110 */ - // 0xF8, /* 11111 */ - // 0x90, /* 10010 */ - // 0x88, /* 10001 */ - // 0x00, /* 00000 */ - - // /* - // * code=159, hex=0x9F, ascii="!^_" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0xF0, /* 11110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x80, /* 10000 */ - - // /* - // * code=160, hex=0xA0, ascii="! " - // */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - // 0xC0, /* 11000 */ - // 0x20, /* 00100 */ - // 0x60, /* 01100 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=161, hex=0xA1, ascii="!!" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=162, hex=0xA2, ascii="!"" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=163, hex=0xA3, ascii="!#" - // */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=164, hex=0xA4, ascii="!$" - // */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - - // /* - // * code=165, hex=0xA5, ascii="!%" - // */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x90, /* 10010 */ - // 0xD0, /* 11010 */ - // 0xD0, /* 11010 */ - // 0xB0, /* 10110 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - - // /* - // * code=166, hex=0xA6, ascii="!&" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x30, /* 00110 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=167, hex=0xA7, ascii="!'" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=168, hex=0xA8, ascii="!(" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=169, hex=0xA9, ascii="!)" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x80, /* 10000 */ - // 0x00, /* 00000 */ - - // /* - // * code=170, hex=0xAA, ascii="!*" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x08, /* 00001 */ - // 0x00, /* 00000 */ - - // /* - // * code=171, hex=0xAB, ascii="!+" - // */ - // 0x00, /* 00000 */ - // 0x80, /* 10000 */ - // 0x90, /* 10010 */ - // 0xA0, /* 10100 */ - // 0x58, /* 01011 */ - // 0x88, /* 10001 */ - // 0x38, /* 00111 */ - // 0x00, /* 00000 */ - - // /* - // * code=172, hex=0xAC, ascii="!," - // */ - // 0x00, /* 00000 */ - // 0x88, /* 10001 */ - // 0x90, /* 10010 */ - // 0xA0, /* 10100 */ - // 0x48, /* 01001 */ - // 0x98, /* 10011 */ - // 0x38, /* 00111 */ - // 0x08, /* 00001 */ - - // /* - // * code=173, hex=0xAD, ascii="!-" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=174, hex=0xAE, ascii="!." - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - - // /* - // * code=175, hex=0xAF, ascii="!/" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xA0, /* 10100 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - - // /* - // * code=176, hex=0xB0, ascii="!0" - // */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - // 0xA8, /* 10101 */ - // 0x50, /* 01010 */ - - // /* - // * code=177, hex=0xB1, ascii="!1" - // */ - // 0xE8, /* 11101 */ - // 0x50, /* 01010 */ - // 0xB8, /* 10111 */ - // 0x50, /* 01010 */ - // 0xE8, /* 11101 */ - // 0x50, /* 01010 */ - // 0xB8, /* 10111 */ - // 0x50, /* 01010 */ - - // /* - // * code=178, hex=0xB2, ascii="!2" - // */ - // 0xD8, /* 11011 */ - // 0x70, /* 01110 */ - // 0xD8, /* 11011 */ - // 0x70, /* 01110 */ - // 0xD8, /* 11011 */ - // 0x70, /* 01110 */ - // 0xD8, /* 11011 */ - // 0x70, /* 01110 */ - - // /* - // * code=179, hex=0xB3, ascii="!3" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=180, hex=0xB4, ascii="!4" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=181, hex=0xB5, ascii="!5" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=182, hex=0xB6, ascii="!6" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=183, hex=0xB7, ascii="!7" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=184, hex=0xB8, ascii="!8" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=185, hex=0xB9, ascii="!9" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x10, /* 00010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=186, hex=0xBA, ascii="!:" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=187, hex=0xBB, ascii="!;" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x10, /* 00010 */ - // 0xD0, /* 11010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=188, hex=0xBC, ascii="!<" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD0, /* 11010 */ - // 0x10, /* 00010 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=189, hex=0xBD, ascii="!=" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=190, hex=0xBE, ascii="!>" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=191, hex=0xBF, ascii="!?" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xE0, /* 11100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=192, hex=0xC0, ascii="!@" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=193, hex=0xC1, ascii="!A" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=194, hex=0xC2, ascii="!B" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=195, hex=0xC3, ascii="!C" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=196, hex=0xC4, ascii="!D" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=197, hex=0xC5, ascii="!E" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=198, hex=0xC6, ascii="!F" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=199, hex=0xC7, ascii="!G" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=200, hex=0xC8, ascii="!H" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x40, /* 01000 */ - // 0x78, /* 01111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=201, hex=0xC9, ascii="!I" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x40, /* 01000 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=202, hex=0xCA, ascii="!J" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=203, hex=0xCB, ascii="!K" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=204, hex=0xCC, ascii="!L" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x58, /* 01011 */ - // 0x40, /* 01000 */ - // 0x58, /* 01011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=205, hex=0xCD, ascii="!M" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=206, hex=0xCE, ascii="!N" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - // 0xD8, /* 11011 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=207, hex=0xCF, ascii="!O" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=208, hex=0xD0, ascii="!P" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=209, hex=0xD1, ascii="!Q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=210, hex=0xD2, ascii="!R" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=211, hex=0xD3, ascii="!S" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x78, /* 01111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=212, hex=0xD4, ascii="!T" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=213, hex=0xD5, ascii="!U" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=214, hex=0xD6, ascii="!V" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=215, hex=0xD7, ascii="!W" - // */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0xF8, /* 11111 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - - // /* - // * code=216, hex=0xD8, ascii="!X" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=217, hex=0xD9, ascii="!Y" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xE0, /* 11100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=218, hex=0xDA, ascii="!Z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x38, /* 00111 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=219, hex=0xDB, ascii="![" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=220, hex=0xDC, ascii="!\" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - - // /* - // * code=221, hex=0xDD, ascii="!]" - // */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - // 0xE0, /* 11100 */ - - // /* - // * code=222, hex=0xDE, ascii="!^" - // */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - // 0x18, /* 00011 */ - - // /* - // * code=223, hex=0xDF, ascii="!_" - // */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=224, hex=0xE0, ascii="!`" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x68, /* 01101 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x68, /* 01101 */ - // 0x00, /* 00000 */ - - // /* - // * code=225, hex=0xE1, ascii="!a" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0xF0, /* 11110 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xE0, /* 11100 */ - // 0x80, /* 10000 */ - - // /* - // * code=226, hex=0xE2, ascii="!b" - // */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - - // /* - // * code=227, hex=0xE3, ascii="!c" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - - // /* - // * code=228, hex=0xE4, ascii="!d" - // */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x48, /* 01001 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - - // /* - // * code=229, hex=0xE5, ascii="!e" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x78, /* 01111 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=230, hex=0xE6, ascii="!f" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0xE8, /* 11101 */ - // 0x80, /* 10000 */ - - // /* - // * code=231, hex=0xE7, ascii="!g" - // */ - // 0x00, /* 00000 */ - // 0x98, /* 10011 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - - // /* - // * code=232, hex=0xE8, ascii="!h" - // */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0x70, /* 01110 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=233, hex=0xE9, ascii="!i" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0xF8, /* 11111 */ - // 0x88, /* 10001 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=234, hex=0xEA, ascii="!j" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x88, /* 10001 */ - // 0x88, /* 10001 */ - // 0x50, /* 01010 */ - // 0xD8, /* 11011 */ - // 0x00, /* 00000 */ - - // /* - // * code=235, hex=0xEB, ascii="!k" - // */ - // 0x60, /* 01100 */ - // 0x80, /* 10000 */ - // 0x40, /* 01000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=236, hex=0xEC, ascii="!l" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0xA8, /* 10101 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=237, hex=0xED, ascii="!m" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x08, /* 00001 */ - // 0x70, /* 01110 */ - // 0xA8, /* 10101 */ - // 0x48, /* 01001 */ - // 0xB0, /* 10110 */ - // 0x00, /* 00000 */ - - // /* - // * code=238, hex=0xEE, ascii="!n" - // */ - // 0x00, /* 00000 */ - // 0x30, /* 00110 */ - // 0x40, /* 01000 */ - // 0x70, /* 01110 */ - // 0x40, /* 01000 */ - // 0x40, /* 01000 */ - // 0x30, /* 00110 */ - // 0x00, /* 00000 */ - - // /* - // * code=239, hex=0xEF, ascii="!o" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x90, /* 10010 */ - // 0x00, /* 00000 */ - - // /* - // * code=240, hex=0xF0, ascii="!p" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - - // /* - // * code=241, hex=0xF1, ascii="!q" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0xF8, /* 11111 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0xF8, /* 11111 */ - // 0x00, /* 00000 */ - - // /* - // * code=242, hex=0xF2, ascii="!r" - // */ - // 0x00, /* 00000 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - - // /* - // * code=243, hex=0xF3, ascii="!s" - // */ - // 0x00, /* 00000 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x40, /* 01000 */ - // 0x20, /* 00100 */ - // 0x10, /* 00010 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - - // /* - // * code=244, hex=0xF4, ascii="!t" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x18, /* 00011 */ - // 0x28, /* 00101 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - - // /* - // * code=245, hex=0xF5, ascii="!u" - // */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0xC0, /* 11000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=246, hex=0xF6, ascii="!v" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0xF0, /* 11110 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - - // /* - // * code=247, hex=0xF7, ascii="!w" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - // 0x50, /* 01010 */ - // 0xA0, /* 10100 */ - // 0x00, /* 00000 */ - - // /* - // * code=248, hex=0xF8, ascii="!x" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x50, /* 01010 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=249, hex=0xF9, ascii="!y" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x60, /* 01100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=250, hex=0xFA, ascii="!z" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x20, /* 00100 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=251, hex=0xFB, ascii="!{" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x18, /* 00011 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0xA0, /* 10100 */ - // 0x40, /* 01000 */ - // 0x00, /* 00000 */ - - // /* - // * code=252, hex=0xFC, ascii="!|" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x50, /* 01010 */ - // 0x50, /* 01010 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=253, hex=0xFD, ascii="!}" - // */ - // 0x00, /* 00000 */ - // 0x60, /* 01100 */ - // 0x10, /* 00010 */ - // 0x20, /* 00100 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=254, hex=0xFE, ascii="!~" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x70, /* 01110 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - - // /* - // * code=255, hex=0xFF, ascii="!^Ÿ" - // */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ - // 0x00, /* 00000 */ +static const unsigned char console_font_5x8[] PROGMEM = { + 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x00, 0x1D, 0x5F, 0xED, 0xC0, // /* code=1, hex=0x01, ascii="^A" */ + // 0x00, 0x1D, 0x5F, 0xFD, 0xC0, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0x15, 0xFF, 0xB8, 0x80, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x08, 0xEF, 0xB8, 0x80, // /* code=4, hex=0x04, ascii="^D" */ + // 0x00, 0x1D, 0x5F, 0x90, 0x80, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x08, 0xEF, 0xD4, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x47, 0x10, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x0E, 0x36, 0xD1, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x00, 0x08, 0xA2, 0x38, 0x80, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x08, 0xA4, 0x62, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x0E, 0x95, 0xEA, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x10, 0xC7, 0x31, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x04, 0x67, 0x18, 0x40, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x00, 0x08, 0xE2, 0x38, 0x80, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x14, 0xA5, 0x01, 0x40, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x1F, 0xAD, 0x29, 0x4A, // /* code=20, hex=0x14, ascii="^T" */ + // 0x00, 0x06, 0xC9, 0x24, 0xD8, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x7F, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ + // 0x00, 0x08, 0xE2, 0x38, 0x8E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x08, 0xE2, 0x10, 0x80, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x08, 0x42, 0x38, 0x80, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x2F, 0x88, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x8F, 0xA0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x08, 0x7C, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0xAF, 0xA8, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x02, 0x3B, 0xE0, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x0F, 0xB8, 0x80, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x08, 0x42, 0x00, 0x80, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0x14, 0xA0, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0x15, 0xF5, 0x7D, 0x40, /* code=35, hex=0x23, ascii="#" */ + 0x00, 0x08, 0x64, 0x19, 0x84, /* code=36, hex=0x24, ascii="$" */ + 0x02, 0x2A, 0xA3, 0x36, 0x40, /* code=37, hex=0x25, ascii="%" */ + 0x00, 0x0C, 0x86, 0xC9, 0xA0, /* code=38, hex=0x26, ascii="&" */ + 0x01, 0x08, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x08, 0x84, 0x20, 0x80, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x10, 0x42, 0x11, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x14, 0x47, 0x11, 0x40, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x47, 0x10, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x88, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x01, 0xE0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x80, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x04, 0x42, 0x21, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x08, 0xC2, 0x10, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x19, 0x22, 0x23, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x38, 0x26, 0x0B, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x04, 0x65, 0x78, 0x40, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0x3D, 0x0E, 0x0B, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x19, 0x0E, 0x49, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0x3C, 0x22, 0x21, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x19, 0x26, 0x49, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x19, 0x27, 0x09, 0x80, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x02, 0x00, 0x80, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x02, 0x00, 0x88, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x04, 0x44, 0x10, 0x40, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0xE0, 0x38, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x10, 0x41, 0x11, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x18, 0x26, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x1D, 0x1B, 0x41, 0xC0, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x19, 0x2F, 0x4A, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0x39, 0x2E, 0x4B, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x1D, 0x08, 0x41, 0xC0, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0x39, 0x29, 0x4B, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0x3D, 0x0E, 0x43, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0x3D, 0x0E, 0x42, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x19, 0x28, 0x49, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0x25, 0x2F, 0x4A, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x1C, 0x42, 0x11, 0xC0, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x04, 0x29, 0x49, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0x25, 0x4C, 0x52, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0x21, 0x08, 0x43, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x00, 0x25, 0xE9, 0x4A, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0x25, 0xAB, 0x4A, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0x39, 0x2E, 0x42, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x19, 0x29, 0x49, 0x82, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0x39, 0x2E, 0x4A, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x1D, 0x06, 0x0B, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0x3E, 0x42, 0x10, 0x80, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0x25, 0x29, 0x49, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x00, 0x25, 0x29, 0x31, 0x80, /* code=86, hex=0x56, ascii="V" */ + 0x00, 0x23, 0x5A, 0xA9, 0x40, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0x25, 0x26, 0x2A, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0x14, 0xA5, 0x10, 0x80, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0x3C, 0x44, 0x43, 0xC0, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x18, 0x84, 0x21, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0x10, 0x82, 0x10, 0x40, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x18, 0x42, 0x11, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x08, 0xA0, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x1F, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x10, 0x40, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0xC1, 0x39, 0x40, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x21, 0xC9, 0x4B, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x64, 0x20, 0xC0, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x04, 0xE9, 0x49, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0xCF, 0x41, 0xC0, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x0C, 0x8E, 0x21, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0xE9, 0x38, 0x4C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0x21, 0xC9, 0x4A, 0x40, /* code=104, hex=0x68, ascii="h" */ + 0x01, 0x00, 0xC2, 0x11, 0xC0, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x80, 0x21, 0x08, 0x4C, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0x21, 0x4C, 0x52, 0x40, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x08, 0x42, 0x11, 0xC0, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x01, 0x2F, 0x4A, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x01, 0xC9, 0x4A, 0x40, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0xC9, 0x49, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x01, 0xC9, 0x4B, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0xE9, 0x49, 0xC2, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0xA6, 0x21, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0xEC, 0x1B, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x11, 0xE4, 0x20, 0xC0, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x01, 0x29, 0x49, 0xC0, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x01, 0x29, 0x31, 0x80, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x01, 0x29, 0x7A, 0x40, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x01, 0x26, 0x32, 0x40, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x01, 0x29, 0x38, 0x4C, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x01, 0xE2, 0x23, 0xC0, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x88, 0x84, 0x10, 0x40, /* code=123, hex=0x7B, ascii="{" */ + 0x01, 0x08, 0x42, 0x10, 0x80, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x08, 0x21, 0x11, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x00, 0xAA, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x45, 0x47, 0xE0, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x1D, 0x08, 0x41, 0xC4, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x02, 0x81, 0x29, 0x49, 0xC0, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x11, 0x00, 0xCF, 0x41, 0xC0, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x22, 0x81, 0x82, 0x51, 0x40, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x02, 0x81, 0x82, 0x32, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x41, 0x01, 0x82, 0x32, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x01, 0x82, 0x32, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x64, 0x20, 0xC4, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x22, 0x80, 0xCF, 0x41, 0xC0, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x02, 0x80, 0xCF, 0x41, 0xC0, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x41, 0x00, 0xCF, 0x41, 0xC0, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x02, 0x80, 0xC2, 0x11, 0xC0, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x22, 0x80, 0xC2, 0x11, 0xC0, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x41, 0x00, 0xC2, 0x11, 0xC0, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xA0, 0x19, 0x2F, 0x4A, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x20, 0x19, 0x2F, 0x4A, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x11, 0x3D, 0x0E, 0x43, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x01, 0xB7, 0xF2, 0xE0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x1D, 0x4F, 0x52, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x22, 0x80, 0xC9, 0x49, 0x80, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x41, 0x00, 0xC9, 0x49, 0x80, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x22, 0x81, 0x29, 0x49, 0xC0, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x41, 0x01, 0x29, 0x49, 0xC0, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x02, 0x81, 0x29, 0x38, 0x4C, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x25, 0x29, 0x49, 0x80, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x08, 0xE8, 0x41, 0xC4, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x94, 0x8E, 0x23, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x06, 0xD4, 0xA2, 0x38, 0x80, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x29, 0x6F, 0xCA, 0x20, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x01, 0x90, 0x8F, 0x21, 0x10, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x22, 0x01, 0x82, 0x32, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x11, 0x00, 0xC2, 0x11, 0xC0, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x11, 0x00, 0xC9, 0x49, 0x80, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x11, 0x01, 0x29, 0x49, 0xC0, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x55, 0x01, 0xC9, 0x4A, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x55, 0x25, 0xAD, 0x5A, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x01, 0x14, 0x60, 0x38, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x01, 0x14, 0x40, 0x38, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x01, 0x00, 0x44, 0x49, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x7E, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x7C, 0x20, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x04, 0x25, 0x45, 0xC4, 0xE0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x04, 0x65, 0x44, 0xCC, 0xE1, // /* code=172, hex=0xAC, ascii="!," */ + // 0x01, 0x00, 0x42, 0x38, 0x80, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0x05, 0x51, 0x40, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x00, 0x0A, 0x2A, 0x80, // /* code=175, hex=0xAF, ascii="!/" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=176, hex=0xB0, ascii="!0" */ + // 0xEA, 0xAE, 0xAE, 0xAA, 0xEA, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xDB, 0xB6, 0xED, 0xBB, 0x6E, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x21, 0x09, 0xC2, 0x10, 0x84, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x21, 0x38, 0x4E, 0x10, 0x84, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x52, 0x95, 0xA5, 0x29, 0x4A, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x01, 0xE5, 0x29, 0x4A, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x38, 0x4E, 0x10, 0x84, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x52, 0xB4, 0x2D, 0x29, 0x4A, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x52, 0x94, 0xA5, 0x29, 0x4A, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x3C, 0x2D, 0x29, 0x4A, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x52, 0xB4, 0x2F, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x52, 0x95, 0xE0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x21, 0x38, 0x4E, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x01, 0xC2, 0x10, 0x84, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x21, 0x08, 0x70, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x21, 0x09, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x01, 0xF2, 0x10, 0x84, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x21, 0x08, 0x72, 0x10, 0x84, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x01, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x21, 0x09, 0xF2, 0x10, 0x84, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x21, 0x0E, 0x43, 0x90, 0x84, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x52, 0x94, 0xB5, 0x29, 0x4A, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x52, 0x96, 0x87, 0x80, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x1E, 0x85, 0xA9, 0x4A, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x52, 0xB6, 0x0F, 0x80, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x3E, 0x0D, 0xA9, 0x4A, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x52, 0x96, 0x85, 0xA9, 0x4A, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x3E, 0x0F, 0x80, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x52, 0xB6, 0x0D, 0xA9, 0x4A, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x21, 0x3E, 0x0F, 0x80, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x52, 0x95, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x3E, 0x0F, 0x90, 0x84, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x01, 0xF5, 0x29, 0x4A, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x52, 0x94, 0xF0, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x21, 0x0E, 0x43, 0x80, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x0E, 0x43, 0x90, 0x84, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0xF5, 0x29, 0x4A, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x52, 0x95, 0xF5, 0x29, 0x4A, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x21, 0x3E, 0x4F, 0x90, 0x84, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x21, 0x09, 0xC0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x72, 0x10, 0x84, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x0F, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE7, 0x39, 0xCE, 0x73, 0x9C, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x18, 0xC6, 0x31, 0x8C, 0x63, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x00, 0xD9, 0x49, 0xA0, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x25, 0xE9, 0x4B, 0x90, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x03, 0x90, 0x84, 0x21, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x1C, 0xA5, 0x29, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x07, 0xD2, 0x44, 0x47, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x1F, 0x29, 0x49, 0x80, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x01, 0x29, 0x4B, 0xB0, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x04, 0xD4, 0x42, 0x10, 0x80, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x01, 0x08, 0xE8, 0xB8, 0x84, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x1D, 0x1F, 0xC5, 0xC0, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x1D, 0x18, 0xAB, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x64, 0x10, 0xC9, 0x49, 0x80, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0xEA, 0xD5, 0xC0, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x02, 0xEA, 0xA6, 0xC0, // /* code=237, hex=0xED, ascii="!m" */ + // 0x01, 0x90, 0xE4, 0x20, 0xC0, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x03, 0x25, 0x29, 0x4A, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x3C, 0x0F, 0x03, 0xC0, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x09, 0xF2, 0x03, 0xE0, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x02, 0x08, 0x22, 0x23, 0xC0, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x88, 0x82, 0x09, 0xC0, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x06, 0x52, 0x10, 0x84, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x21, 0x08, 0x4A, 0x60, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x18, 0x0F, 0x01, 0x80, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x15, 0x40, 0x2A, 0x80, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x08, 0xA2, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0xC6, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x40, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x06, 0x22, 0x51, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x03, 0x14, 0xA0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x03, 0x04, 0x47, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x00, 0xE7, 0x38, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_6x8.h b/wled00/src/font/console_font_6x8.h index 137c9cf109..3fbe0b4054 100644 --- a/wled00/src/font/console_font_6x8.h +++ b/wled00/src/font/console_font_6x8.h @@ -1,3078 +1,299 @@ // font courtesy of https://github.com/idispatch/raster-fonts -static const unsigned char console_font_6x8[] PROGMEM = { // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion - // /* - // * code=0, hex=0x00, ascii="^@" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=1, hex=0x01, ascii="^A" - // */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x6C, /* 011011 */ - // 0x44, /* 010001 */ - // 0x54, /* 010101 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=2, hex=0x02, ascii="^B" - // */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x54, /* 010101 */ - // 0x7C, /* 011111 */ - // 0x44, /* 010001 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=3, hex=0x03, ascii="^C" - // */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=4, hex=0x04, ascii="^D" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=5, hex=0x05, ascii="^E" - // */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=6, hex=0x06, ascii="^F" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=7, hex=0x07, ascii="^G" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=8, hex=0x08, ascii="^H" - // */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xCC, /* 110011 */ - // 0xCC, /* 110011 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - - // /* - // * code=9, hex=0x09, ascii="^I" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=10, hex=0x0A, ascii="^J" - // */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0x84, /* 100001 */ - // 0xB4, /* 101101 */ - // 0xB4, /* 101101 */ - // 0x84, /* 100001 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - - // /* - // * code=11, hex=0x0B, ascii="^K" - // */ - // 0x00, /* 000000 */ - // 0x1C, /* 000111 */ - // 0x0C, /* 000011 */ - // 0x34, /* 001101 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=12, hex=0x0C, ascii="^L" - // */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=13, hex=0x0D, ascii="^M" - // */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x14, /* 000101 */ - // 0x10, /* 000100 */ - // 0x30, /* 001100 */ - // 0x70, /* 011100 */ - // 0x60, /* 011000 */ - // 0x00, /* 000000 */ - - // /* - // * code=14, hex=0x0E, ascii="^N" - // */ - // 0x0C, /* 000011 */ - // 0x34, /* 001101 */ - // 0x2C, /* 001011 */ - // 0x34, /* 001101 */ - // 0x2C, /* 001011 */ - // 0x6C, /* 011011 */ - // 0x60, /* 011000 */ - // 0x00, /* 000000 */ - - // /* - // * code=15, hex=0x0F, ascii="^O" - // */ - // 0x00, /* 000000 */ - // 0x54, /* 010101 */ - // 0x38, /* 001110 */ - // 0x6C, /* 011011 */ - // 0x38, /* 001110 */ - // 0x54, /* 010101 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=16, hex=0x10, ascii="^P" - // */ - // 0x20, /* 001000 */ - // 0x30, /* 001100 */ - // 0x38, /* 001110 */ - // 0x3C, /* 001111 */ - // 0x38, /* 001110 */ - // 0x30, /* 001100 */ - // 0x20, /* 001000 */ - // 0x00, /* 000000 */ - - // /* - // * code=17, hex=0x11, ascii="^Q" - // */ - // 0x08, /* 000010 */ - // 0x18, /* 000110 */ - // 0x38, /* 001110 */ - // 0x78, /* 011110 */ - // 0x38, /* 001110 */ - // 0x18, /* 000110 */ - // 0x08, /* 000010 */ - // 0x00, /* 000000 */ - - // /* - // * code=18, hex=0x12, ascii="^R" - // */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=19, hex=0x13, ascii="^S" - // */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=20, hex=0x14, ascii="^T" - // */ - // 0x3C, /* 001111 */ - // 0x54, /* 010101 */ - // 0x54, /* 010101 */ - // 0x34, /* 001101 */ - // 0x14, /* 000101 */ - // 0x14, /* 000101 */ - // 0x14, /* 000101 */ - // 0x00, /* 000000 */ - - // /* - // * code=21, hex=0x15, ascii="^U" - // */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x30, /* 001100 */ - // 0x28, /* 001010 */ - // 0x18, /* 000110 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=22, hex=0x16, ascii="^V" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - - // /* - // * code=23, hex=0x17, ascii="^W" - // */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - - // /* - // * code=24, hex=0x18, ascii="^X" - // */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=25, hex=0x19, ascii="^Y" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=26, hex=0x1A, ascii="^Z" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x7C, /* 011111 */ - // 0x18, /* 000110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=27, hex=0x1B, ascii="^[" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x30, /* 001100 */ - // 0x7C, /* 011111 */ - // 0x30, /* 001100 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=28, hex=0x1C, ascii="^\" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - - // /* - // * code=29, hex=0x1D, ascii="^]" - // */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x7C, /* 011111 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=30, hex=0x1E, ascii="^^" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x38, /* 001110 */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=31, hex=0x1F, ascii="^_" - // */ - // 0x7C, /* 011111 */ - // 0x7C, /* 011111 */ - // 0x38, /* 001110 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - /* - * code=32, hex=0x20, ascii=" " - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=33, hex=0x21, ascii="!" - */ - 0x10, /* 000100 */ - 0x38, /* 001110 */ - 0x38, /* 001110 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=34, hex=0x22, ascii=""" - */ - 0x6C, /* 011011 */ - 0x6C, /* 011011 */ - 0x48, /* 010010 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=35, hex=0x23, ascii="#" - */ - 0x00, /* 000000 */ - 0x28, /* 001010 */ - 0x7C, /* 011111 */ - 0x28, /* 001010 */ - 0x28, /* 001010 */ - 0x7C, /* 011111 */ - 0x28, /* 001010 */ - 0x00, /* 000000 */ - - /* - * code=36, hex=0x24, ascii="$" - */ - 0x20, /* 001000 */ - 0x38, /* 001110 */ - 0x40, /* 010000 */ - 0x30, /* 001100 */ - 0x08, /* 000010 */ - 0x70, /* 011100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=37, hex=0x25, ascii="%" - */ - 0x64, /* 011001 */ - 0x64, /* 011001 */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x4C, /* 010011 */ - 0x4C, /* 010011 */ - 0x00, /* 000000 */ - - /* - * code=38, hex=0x26, ascii="&" - */ - 0x20, /* 001000 */ - 0x50, /* 010100 */ - 0x50, /* 010100 */ - 0x20, /* 001000 */ - 0x54, /* 010101 */ - 0x48, /* 010010 */ - 0x34, /* 001101 */ - 0x00, /* 000000 */ - - /* - * code=39, hex=0x27, ascii="'" - */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x20, /* 001000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=40, hex=0x28, ascii="(" - */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=41, hex=0x29, ascii=")" - */ - 0x20, /* 001000 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x00, /* 000000 */ - - /* - * code=42, hex=0x2A, ascii="*" - */ - 0x00, /* 000000 */ - 0x28, /* 001010 */ - 0x38, /* 001110 */ - 0x7C, /* 011111 */ - 0x38, /* 001110 */ - 0x28, /* 001010 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=43, hex=0x2B, ascii="+" - */ - 0x00, /* 000000 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x7C, /* 011111 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=44, hex=0x2C, ascii="," - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x20, /* 001000 */ - - /* - * code=45, hex=0x2D, ascii="-" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=46, hex=0x2E, ascii="." - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - - /* - * code=47, hex=0x2F, ascii="/" - */ - 0x00, /* 000000 */ - 0x04, /* 000001 */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x40, /* 010000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=48, hex=0x30, ascii="0" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x4C, /* 010011 */ - 0x54, /* 010101 */ - 0x64, /* 011001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=49, hex=0x31, ascii="1" - */ - 0x10, /* 000100 */ - 0x30, /* 001100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=50, hex=0x32, ascii="2" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x04, /* 000001 */ - 0x18, /* 000110 */ - 0x20, /* 001000 */ - 0x40, /* 010000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - - /* - * code=51, hex=0x33, ascii="3" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x04, /* 000001 */ - 0x38, /* 001110 */ - 0x04, /* 000001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=52, hex=0x34, ascii="4" - */ - 0x08, /* 000010 */ - 0x18, /* 000110 */ - 0x28, /* 001010 */ - 0x48, /* 010010 */ - 0x7C, /* 011111 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x00, /* 000000 */ - - /* - * code=53, hex=0x35, ascii="5" - */ - 0x7C, /* 011111 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x04, /* 000001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=54, hex=0x36, ascii="6" - */ - 0x18, /* 000110 */ - 0x20, /* 001000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=55, hex=0x37, ascii="7" - */ - 0x7C, /* 011111 */ - 0x04, /* 000001 */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x00, /* 000000 */ - - /* - * code=56, hex=0x38, ascii="8" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=57, hex=0x39, ascii="9" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x04, /* 000001 */ - 0x08, /* 000010 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - - /* - * code=58, hex=0x3A, ascii=":" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - - /* - * code=59, hex=0x3B, ascii=";" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x20, /* 001000 */ - - /* - * code=60, hex=0x3C, ascii="<" - */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x40, /* 010000 */ - 0x20, /* 001000 */ - 0x10, /* 000100 */ - 0x08, /* 000010 */ - 0x00, /* 000000 */ - - /* - * code=61, hex=0x3D, ascii="=" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=62, hex=0x3E, ascii=">" - */ - 0x20, /* 001000 */ - 0x10, /* 000100 */ - 0x08, /* 000010 */ - 0x04, /* 000001 */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x00, /* 000000 */ - - /* - * code=63, hex=0x3F, ascii="?" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x04, /* 000001 */ - 0x18, /* 000110 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=64, hex=0x40, ascii="@" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x5C, /* 010111 */ - 0x54, /* 010101 */ - 0x5C, /* 010111 */ - 0x40, /* 010000 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=65, hex=0x41, ascii="A" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x7C, /* 011111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=66, hex=0x42, ascii="B" - */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x00, /* 000000 */ - - /* - * code=67, hex=0x43, ascii="C" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=68, hex=0x44, ascii="D" - */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x00, /* 000000 */ - - /* - * code=69, hex=0x45, ascii="E" - */ - 0x7C, /* 011111 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - - /* - * code=70, hex=0x46, ascii="F" - */ - 0x7C, /* 011111 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x00, /* 000000 */ - - /* - * code=71, hex=0x47, ascii="G" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x40, /* 010000 */ - 0x5C, /* 010111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x00, /* 000000 */ - - /* - * code=72, hex=0x48, ascii="H" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x7C, /* 011111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=73, hex=0x49, ascii="I" - */ - 0x38, /* 001110 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=74, hex=0x4A, ascii="J" - */ - 0x04, /* 000001 */ - 0x04, /* 000001 */ - 0x04, /* 000001 */ - 0x04, /* 000001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=75, hex=0x4B, ascii="K" - */ - 0x44, /* 010001 */ - 0x48, /* 010010 */ - 0x50, /* 010100 */ - 0x60, /* 011000 */ - 0x50, /* 010100 */ - 0x48, /* 010010 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=76, hex=0x4C, ascii="L" - */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x7C, /* 011111 */ - 0x00, /* 000000 */ - - /* - * code=77, hex=0x4D, ascii="M" - */ - 0x44, /* 010001 */ - 0x6C, /* 011011 */ - 0x54, /* 010101 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=78, hex=0x4E, ascii="N" - */ - 0x44, /* 010001 */ - 0x64, /* 011001 */ - 0x54, /* 010101 */ - 0x4C, /* 010011 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=79, hex=0x4F, ascii="O" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=80, hex=0x50, ascii="P" - */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x00, /* 000000 */ - - /* - * code=81, hex=0x51, ascii="Q" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x54, /* 010101 */ - 0x48, /* 010010 */ - 0x34, /* 001101 */ - 0x00, /* 000000 */ - - /* - * code=82, hex=0x52, ascii="R" - */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x48, /* 010010 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=83, hex=0x53, ascii="S" - */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x40, /* 010000 */ - 0x38, /* 001110 */ - 0x04, /* 000001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=84, hex=0x54, ascii="T" - */ - 0x7C, /* 011111 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=85, hex=0x55, ascii="U" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=86, hex=0x56, ascii="V" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x28, /* 001010 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=87, hex=0x57, ascii="W" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x54, /* 010101 */ - 0x54, /* 010101 */ - 0x54, /* 010101 */ - 0x54, /* 010101 */ - 0x28, /* 001010 */ - 0x00, /* 000000 */ - - /* - * code=88, hex=0x58, ascii="X" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x28, /* 001010 */ - 0x10, /* 000100 */ - 0x28, /* 001010 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=89, hex=0x59, ascii="Y" - */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x28, /* 001010 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=90, hex=0x5A, ascii="Z" - */ - 0x78, /* 011110 */ - 0x08, /* 000010 */ - 0x10, /* 000100 */ - 0x20, /* 001000 */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x00, /* 000000 */ - - /* - * code=91, hex=0x5B, ascii="[" - */ - 0x38, /* 001110 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=92, hex=0x5C, ascii="\" - */ - 0x00, /* 000000 */ - 0x40, /* 010000 */ - 0x20, /* 001000 */ - 0x10, /* 000100 */ - 0x08, /* 000010 */ - 0x04, /* 000001 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=93, hex=0x5D, ascii="]" - */ - 0x38, /* 001110 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=94, hex=0x5E, ascii="^" - */ - 0x10, /* 000100 */ - 0x28, /* 001010 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=95, hex=0x5F, ascii="_" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0xFC, /* 111111 */ - - /* - * code=96, hex=0x60, ascii="`" - */ - 0x30, /* 001100 */ - 0x30, /* 001100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - /* - * code=97, hex=0x61, ascii="a" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x38, /* 001110 */ - 0x04, /* 000001 */ - 0x3C, /* 001111 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x00, /* 000000 */ - - /* - * code=98, hex=0x62, ascii="b" - */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x00, /* 000000 */ - - /* - * code=99, hex=0x63, ascii="c" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x40, /* 010000 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=100, hex=0x64, ascii="d" - */ - 0x04, /* 000001 */ - 0x04, /* 000001 */ - 0x3C, /* 001111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x00, /* 000000 */ - - /* - * code=101, hex=0x65, ascii="e" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x40, /* 010000 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=102, hex=0x66, ascii="f" - */ - 0x18, /* 000110 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x78, /* 011110 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x00, /* 000000 */ - - /* - * code=103, hex=0x67, ascii="g" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x3C, /* 001111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x04, /* 000001 */ - 0x38, /* 001110 */ - - /* - * code=104, hex=0x68, ascii="h" - */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x70, /* 011100 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x00, /* 000000 */ - - /* - * code=105, hex=0x69, ascii="i" - */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x18, /* 000110 */ - 0x00, /* 000000 */ - - /* - * code=106, hex=0x6A, ascii="j" - */ - 0x08, /* 000010 */ - 0x00, /* 000000 */ - 0x18, /* 000110 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x48, /* 010010 */ - 0x30, /* 001100 */ - - /* - * code=107, hex=0x6B, ascii="k" - */ - 0x40, /* 010000 */ - 0x40, /* 010000 */ - 0x48, /* 010010 */ - 0x50, /* 010100 */ - 0x60, /* 011000 */ - 0x50, /* 010100 */ - 0x48, /* 010010 */ - 0x00, /* 000000 */ - - /* - * code=108, hex=0x6C, ascii="l" - */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x18, /* 000110 */ - 0x00, /* 000000 */ - - /* - * code=109, hex=0x6D, ascii="m" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x68, /* 011010 */ - 0x54, /* 010101 */ - 0x54, /* 010101 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x00, /* 000000 */ - - /* - * code=110, hex=0x6E, ascii="n" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x70, /* 011100 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x00, /* 000000 */ - - /* - * code=111, hex=0x6F, ascii="o" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x38, /* 001110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=112, hex=0x70, ascii="p" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x78, /* 011110 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x78, /* 011110 */ - 0x40, /* 010000 */ - - /* - * code=113, hex=0x71, ascii="q" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x3C, /* 001111 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x3C, /* 001111 */ - 0x04, /* 000001 */ - - /* - * code=114, hex=0x72, ascii="r" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x58, /* 010110 */ - 0x24, /* 001001 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x70, /* 011100 */ - 0x00, /* 000000 */ - - /* - * code=115, hex=0x73, ascii="s" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x38, /* 001110 */ - 0x40, /* 010000 */ - 0x38, /* 001110 */ - 0x04, /* 000001 */ - 0x38, /* 001110 */ - 0x00, /* 000000 */ - - /* - * code=116, hex=0x74, ascii="t" - */ - 0x00, /* 000000 */ - 0x20, /* 001000 */ - 0x78, /* 011110 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x28, /* 001010 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=117, hex=0x75, ascii="u" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x58, /* 010110 */ - 0x28, /* 001010 */ - 0x00, /* 000000 */ - - /* - * code=118, hex=0x76, ascii="v" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x28, /* 001010 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=119, hex=0x77, ascii="w" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x44, /* 010001 */ - 0x44, /* 010001 */ - 0x54, /* 010101 */ - 0x7C, /* 011111 */ - 0x28, /* 001010 */ - 0x00, /* 000000 */ - - /* - * code=120, hex=0x78, ascii="x" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x30, /* 001100 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x00, /* 000000 */ - - /* - * code=121, hex=0x79, ascii="y" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x48, /* 010010 */ - 0x38, /* 001110 */ - 0x10, /* 000100 */ - 0x60, /* 011000 */ - - /* - * code=122, hex=0x7A, ascii="z" - */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x78, /* 011110 */ - 0x08, /* 000010 */ - 0x30, /* 001100 */ - 0x40, /* 010000 */ - 0x78, /* 011110 */ - 0x00, /* 000000 */ - - /* - * code=123, hex=0x7B, ascii="{" - */ - 0x18, /* 000110 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x60, /* 011000 */ - 0x20, /* 001000 */ - 0x20, /* 001000 */ - 0x18, /* 000110 */ - 0x00, /* 000000 */ - - /* - * code=124, hex=0x7C, ascii="|" - */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x10, /* 000100 */ - 0x00, /* 000000 */ - - /* - * code=125, hex=0x7D, ascii="}" - */ - 0x30, /* 001100 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x0C, /* 000011 */ - 0x08, /* 000010 */ - 0x08, /* 000010 */ - 0x30, /* 001100 */ - 0x00, /* 000000 */ - - /* - * code=126, hex=0x7E, ascii="~" - */ - 0x28, /* 001010 */ - 0x50, /* 010100 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - 0x00, /* 000000 */ - - // /* - // * code=127, hex=0x7F, ascii="^?" - // */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x6C, /* 011011 */ - // 0x44, /* 010001 */ - // 0x44, /* 010001 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (10 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed glyph width: 6 + * [3] Flags: 0x00 (fixed width) + * [4] First Char: 32 + * [5] Last Char: 126 + * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 + * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of the stream, padding bits are added if necessary to fill the last byte + */ - // /* - // * code=128, hex=0x80, ascii="!^@" - // */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x30, /* 001100 */ - - // /* - // * code=129, hex=0x81, ascii="!^A" - // */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x58, /* 010110 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=130, hex=0x82, ascii="!^B" - // */ - // 0x0C, /* 000011 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=131, hex=0x83, ascii="!^C" - // */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=132, hex=0x84, ascii="!^D" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=133, hex=0x85, ascii="!^E" - // */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=134, hex=0x86, ascii="!^F" - // */ - // 0x38, /* 001110 */ - // 0x28, /* 001010 */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=135, hex=0x87, ascii="!^G" - // */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x40, /* 010000 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x30, /* 001100 */ - - // /* - // * code=136, hex=0x88, ascii="!^H" - // */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=137, hex=0x89, ascii="!^I" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=138, hex=0x8A, ascii="!^J" - // */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=139, hex=0x8B, ascii="!^K" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - - // /* - // * code=140, hex=0x8C, ascii="!^L" - // */ - // 0x10, /* 000100 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - - // /* - // * code=141, hex=0x8D, ascii="!^M" - // */ - // 0x20, /* 001000 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - - // /* - // * code=142, hex=0x8E, ascii="!^N" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x28, /* 001010 */ - // 0x44, /* 010001 */ - // 0x7C, /* 011111 */ - // 0x44, /* 010001 */ - // 0x00, /* 000000 */ - - // /* - // * code=143, hex=0x8F, ascii="!^O" - // */ - // 0x38, /* 001110 */ - // 0x28, /* 001010 */ - // 0x38, /* 001110 */ - // 0x6C, /* 011011 */ - // 0x44, /* 010001 */ - // 0x7C, /* 011111 */ - // 0x44, /* 010001 */ - // 0x00, /* 000000 */ - - // /* - // * code=144, hex=0x90, ascii="!^P" - // */ - // 0x0C, /* 000011 */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x40, /* 010000 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - - // /* - // * code=145, hex=0x91, ascii="!^Q" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x14, /* 000101 */ - // 0x7C, /* 011111 */ - // 0x50, /* 010100 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=146, hex=0x92, ascii="!^R" - // */ - // 0x3C, /* 001111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x7C, /* 011111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x5C, /* 010111 */ - // 0x00, /* 000000 */ - - // /* - // * code=147, hex=0x93, ascii="!^S" - // */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=148, hex=0x94, ascii="!^T" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=149, hex=0x95, ascii="!^U" - // */ - // 0x60, /* 011000 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=150, hex=0x96, ascii="!^V" - // */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x58, /* 010110 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=151, hex=0x97, ascii="!^W" - // */ - // 0x60, /* 011000 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x58, /* 010110 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=152, hex=0x98, ascii="!^X" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x60, /* 011000 */ - - // /* - // * code=153, hex=0x99, ascii="!^Y" - // */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=154, hex=0x9A, ascii="!^Z" - // */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=155, hex=0x9B, ascii="!^[" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=156, hex=0x9C, ascii="!^\" - // */ - // 0x18, /* 000110 */ - // 0x24, /* 001001 */ - // 0x20, /* 001000 */ - // 0x78, /* 011110 */ - // 0x20, /* 001000 */ - // 0x24, /* 001001 */ - // 0x5C, /* 010111 */ - // 0x00, /* 000000 */ - - // /* - // * code=157, hex=0x9D, ascii="!^]" - // */ - // 0x44, /* 010001 */ - // 0x28, /* 001010 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x7C, /* 011111 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=158, hex=0x9E, ascii="!^^" - // */ - // 0x60, /* 011000 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x68, /* 011010 */ - // 0x5C, /* 010111 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - - // /* - // * code=159, hex=0x9F, ascii="!^_" - // */ - // 0x08, /* 000010 */ - // 0x14, /* 000101 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x50, /* 010100 */ - // 0x20, /* 001000 */ - - // /* - // * code=160, hex=0xA0, ascii="! " - // */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=161, hex=0xA1, ascii="!!" - // */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - - // /* - // * code=162, hex=0xA2, ascii="!"" - // */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=163, hex=0xA3, ascii="!#" - // */ - // 0x18, /* 000110 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x58, /* 010110 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=164, hex=0xA4, ascii="!$" - // */ - // 0x28, /* 001010 */ - // 0x50, /* 010100 */ - // 0x00, /* 000000 */ - // 0x70, /* 011100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - - // /* - // * code=165, hex=0xA5, ascii="!%" - // */ - // 0x28, /* 001010 */ - // 0x50, /* 010100 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x68, /* 011010 */ - // 0x58, /* 010110 */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - - // /* - // * code=166, hex=0xA6, ascii="!&" - // */ - // 0x38, /* 001110 */ - // 0x04, /* 000001 */ - // 0x3C, /* 001111 */ - // 0x44, /* 010001 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - // 0x3C, /* 001111 */ - // 0x00, /* 000000 */ - - // /* - // * code=167, hex=0xA7, ascii="!'" - // */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - - // /* - // * code=168, hex=0xA8, ascii="!(" - // */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x30, /* 001100 */ - // 0x40, /* 010000 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=169, hex=0xA9, ascii="!)" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=170, hex=0xAA, ascii="!*" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x04, /* 000001 */ - // 0x04, /* 000001 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=171, hex=0xAB, ascii="!+" - // */ - // 0x40, /* 010000 */ - // 0x48, /* 010010 */ - // 0x50, /* 010100 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x08, /* 000010 */ - // 0x1C, /* 000111 */ - // 0x00, /* 000000 */ - - // /* - // * code=172, hex=0xAC, ascii="!," - // */ - // 0x40, /* 010000 */ - // 0x48, /* 010010 */ - // 0x50, /* 010100 */ - // 0x2C, /* 001011 */ - // 0x54, /* 010101 */ - // 0x1C, /* 000111 */ - // 0x04, /* 000001 */ - // 0x00, /* 000000 */ - - // /* - // * code=173, hex=0xAD, ascii="!-" - // */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=174, hex=0xAE, ascii="!." - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x24, /* 001001 */ - // 0x48, /* 010010 */ - // 0x24, /* 001001 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=175, hex=0xAF, ascii="!/" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x24, /* 001001 */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=176, hex=0xB0, ascii="!0" - // */ - // 0x54, /* 010101 */ - // 0x00, /* 000000 */ - // 0xA8, /* 101010 */ - // 0x00, /* 000000 */ - // 0x54, /* 010101 */ - // 0x00, /* 000000 */ - // 0xA8, /* 101010 */ - // 0x00, /* 000000 */ - - // /* - // * code=177, hex=0xB1, ascii="!1" - // */ - // 0x54, /* 010101 */ - // 0xA8, /* 101010 */ - // 0x54, /* 010101 */ - // 0xA8, /* 101010 */ - // 0x54, /* 010101 */ - // 0xA8, /* 101010 */ - // 0x54, /* 010101 */ - // 0xA8, /* 101010 */ - - // /* - // * code=178, hex=0xB2, ascii="!2" - // */ - // 0xA8, /* 101010 */ - // 0xFC, /* 111111 */ - // 0x54, /* 010101 */ - // 0xFC, /* 111111 */ - // 0xA8, /* 101010 */ - // 0xFC, /* 111111 */ - // 0x54, /* 010101 */ - // 0xFC, /* 111111 */ - - // /* - // * code=179, hex=0xB3, ascii="!3" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=180, hex=0xB4, ascii="!4" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=181, hex=0xB5, ascii="!5" - // */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=182, hex=0xB6, ascii="!6" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0xD0, /* 110100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=183, hex=0xB7, ascii="!7" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xF0, /* 111100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=184, hex=0xB8, ascii="!8" - // */ - // 0x00, /* 000000 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=185, hex=0xB9, ascii="!9" - // */ - // 0x50, /* 010100 */ - // 0xD0, /* 110100 */ - // 0x10, /* 000100 */ - // 0xD0, /* 110100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=186, hex=0xBA, ascii="!:" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=187, hex=0xBB, ascii="!;" - // */ - // 0x00, /* 000000 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0xD0, /* 110100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=188, hex=0xBC, ascii="!<" - // */ - // 0x50, /* 010100 */ - // 0xD0, /* 110100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=189, hex=0xBD, ascii="!=" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0xF0, /* 111100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=190, hex=0xBE, ascii="!>" - // */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=191, hex=0xBF, ascii="!?" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xF0, /* 111100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=192, hex=0xC0, ascii="!@" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=193, hex=0xC1, ascii="!A" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=194, hex=0xC2, ascii="!B" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=195, hex=0xC3, ascii="!C" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=196, hex=0xC4, ascii="!D" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=197, hex=0xC5, ascii="!E" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0xFC, /* 111111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=198, hex=0xC6, ascii="!F" - // */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=199, hex=0xC7, ascii="!G" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x5C, /* 010111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=200, hex=0xC8, ascii="!H" - // */ - // 0x50, /* 010100 */ - // 0x5C, /* 010111 */ - // 0x40, /* 010000 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=201, hex=0xC9, ascii="!I" - // */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x40, /* 010000 */ - // 0x5C, /* 010111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=202, hex=0xCA, ascii="!J" - // */ - // 0x50, /* 010100 */ - // 0xDC, /* 110111 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=203, hex=0xCB, ascii="!K" - // */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0xDC, /* 110111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=204, hex=0xCC, ascii="!L" - // */ - // 0x50, /* 010100 */ - // 0x5C, /* 010111 */ - // 0x40, /* 010000 */ - // 0x5C, /* 010111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=205, hex=0xCD, ascii="!M" - // */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=206, hex=0xCE, ascii="!N" - // */ - // 0x50, /* 010100 */ - // 0xDC, /* 110111 */ - // 0x00, /* 000000 */ - // 0xDC, /* 110111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=207, hex=0xCF, ascii="!O" - // */ - // 0x10, /* 000100 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=208, hex=0xD0, ascii="!P" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=209, hex=0xD1, ascii="!Q" - // */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=210, hex=0xD2, ascii="!R" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=211, hex=0xD3, ascii="!S" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=212, hex=0xD4, ascii="!T" - // */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=213, hex=0xD5, ascii="!U" - // */ - // 0x00, /* 000000 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=214, hex=0xD6, ascii="!V" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=215, hex=0xD7, ascii="!W" - // */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0xDC, /* 110111 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - - // /* - // * code=216, hex=0xD8, ascii="!X" - // */ - // 0x10, /* 000100 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=217, hex=0xD9, ascii="!Y" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0xF0, /* 111100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=218, hex=0xDA, ascii="!Z" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=219, hex=0xDB, ascii="![" - // */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - - // /* - // * code=220, hex=0xDC, ascii="!\" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - - // /* - // * code=221, hex=0xDD, ascii="!]" - // */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - // 0xE0, /* 111000 */ - - // /* - // * code=222, hex=0xDE, ascii="!^" - // */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - // 0x1C, /* 000111 */ - - // /* - // * code=223, hex=0xDF, ascii="!_" - // */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0xFC, /* 111111 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=224, hex=0xE0, ascii="!`" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x34, /* 001101 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x34, /* 001101 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=225, hex=0xE1, ascii="!a" - // */ - // 0x00, /* 000000 */ - // 0x70, /* 011100 */ - // 0x48, /* 010010 */ - // 0x70, /* 011100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x70, /* 011100 */ - // 0x40, /* 010000 */ - - // /* - // * code=226, hex=0xE2, ascii="!b" - // */ - // 0x78, /* 011110 */ - // 0x48, /* 010010 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - // 0x00, /* 000000 */ - - // /* - // * code=227, hex=0xE3, ascii="!c" - // */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - - // /* - // * code=228, hex=0xE4, ascii="!d" - // */ - // 0x78, /* 011110 */ - // 0x48, /* 010010 */ - // 0x20, /* 001000 */ - // 0x10, /* 000100 */ - // 0x20, /* 001000 */ - // 0x48, /* 010010 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - - // /* - // * code=229, hex=0xE5, ascii="!e" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x3C, /* 001111 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=230, hex=0xE6, ascii="!f" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x70, /* 011100 */ - // 0x40, /* 010000 */ - // 0x40, /* 010000 */ - - // /* - // * code=231, hex=0xE7, ascii="!g" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x50, /* 010100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=232, hex=0xE8, ascii="!h" - // */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - - // /* - // * code=233, hex=0xE9, ascii="!i" - // */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x78, /* 011110 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=234, hex=0xEA, ascii="!j" - // */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x44, /* 010001 */ - // 0x44, /* 010001 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x6C, /* 011011 */ - // 0x00, /* 000000 */ - - // /* - // * code=235, hex=0xEB, ascii="!k" - // */ - // 0x30, /* 001100 */ - // 0x40, /* 010000 */ - // 0x20, /* 001000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - - // /* - // * code=236, hex=0xEC, ascii="!l" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x54, /* 010101 */ - // 0x54, /* 010101 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=237, hex=0xED, ascii="!m" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x54, /* 010101 */ - // 0x54, /* 010101 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - - // /* - // * code=238, hex=0xEE, ascii="!n" - // */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x40, /* 010000 */ - // 0x78, /* 011110 */ - // 0x40, /* 010000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=239, hex=0xEF, ascii="!o" - // */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=240, hex=0xF0, ascii="!p" - // */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=241, hex=0xF1, ascii="!q" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x38, /* 001110 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x38, /* 001110 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=242, hex=0xF2, ascii="!r" - // */ - // 0x40, /* 010000 */ - // 0x30, /* 001100 */ - // 0x08, /* 000010 */ - // 0x30, /* 001100 */ - // 0x40, /* 010000 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - - // /* - // * code=243, hex=0xF3, ascii="!s" - // */ - // 0x08, /* 000010 */ - // 0x30, /* 001100 */ - // 0x40, /* 010000 */ - // 0x30, /* 001100 */ - // 0x08, /* 000010 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - - // /* - // * code=244, hex=0xF4, ascii="!t" - // */ - // 0x00, /* 000000 */ - // 0x08, /* 000010 */ - // 0x14, /* 000101 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - - // /* - // * code=245, hex=0xF5, ascii="!u" - // */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x50, /* 010100 */ - // 0x20, /* 001000 */ - // 0x00, /* 000000 */ - - // /* - // * code=246, hex=0xF6, ascii="!v" - // */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x7C, /* 011111 */ - // 0x00, /* 000000 */ - // 0x10, /* 000100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=247, hex=0xF7, ascii="!w" - // */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x50, /* 010100 */ - // 0x00, /* 000000 */ - // 0x28, /* 001010 */ - // 0x50, /* 010100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=248, hex=0xF8, ascii="!x" - // */ - // 0x30, /* 001100 */ - // 0x48, /* 010010 */ - // 0x48, /* 010010 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=249, hex=0xF9, ascii="!y" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x30, /* 001100 */ - // 0x30, /* 001100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=250, hex=0xFA, ascii="!z" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x20, /* 001000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=251, hex=0xFB, ascii="!{" - // */ - // 0x00, /* 000000 */ - // 0x1C, /* 000111 */ - // 0x10, /* 000100 */ - // 0x10, /* 000100 */ - // 0x50, /* 010100 */ - // 0x50, /* 010100 */ - // 0x20, /* 001000 */ - // 0x00, /* 000000 */ - - // /* - // * code=252, hex=0xFC, ascii="!|" - // */ - // 0x50, /* 010100 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x28, /* 001010 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=253, hex=0xFD, ascii="!}" - // */ - // 0x60, /* 011000 */ - // 0x10, /* 000100 */ - // 0x20, /* 001000 */ - // 0x70, /* 011100 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=254, hex=0xFE, ascii="!~" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x78, /* 011110 */ - // 0x78, /* 011110 */ - // 0x78, /* 011110 */ - // 0x78, /* 011110 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - - // /* - // * code=255, hex=0xFF, ascii="!^ź" - // */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00, /* 000000 */ - // 0x00 /* 000000 */ +static const unsigned char console_font_6x8[] PROGMEM = { + 0x57, 0x08, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x39, 0x16, 0xD1, 0x55, 0x13, 0x80, // /* code=1, hex=0x01, ascii="^A" */ + // 0x39, 0xF5, 0x5F, 0x45, 0xF3, 0x80, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xA7, 0xDF, 0x7C, 0xE1, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x43, 0x9F, 0x7C, 0xE1, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x10, 0xE3, 0x84, 0x7D, 0xF1, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x43, 0x9F, 0x7C, 0x43, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0xF3, 0xCF, 0xFF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x07, 0x92, 0x49, 0xE0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xF8, 0x6D, 0xB6, 0x1F, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x70, 0xCD, 0x49, 0x23, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x39, 0x14, 0x4E, 0x10, 0xE1, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x10, 0x61, 0x44, 0x31, 0xC6, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x0C, 0xD2, 0xCD, 0x2D, 0xB6, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x01, 0x53, 0x9B, 0x39, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x20, 0xC3, 0x8F, 0x38, 0xC2, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x08, 0x63, 0x9E, 0x38, 0x60, 0x80, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x28, 0xA2, 0x8A, 0x28, 0x02, 0x80, // /* code=19, hex=0x13, ascii="^S" */ + // 0x3D, 0x55, 0x4D, 0x14, 0x51, 0x40, // /* code=20, hex=0x14, ascii="^T" */ + // 0x39, 0x13, 0x0A, 0x19, 0x13, 0x80, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x01, 0xE7, 0x80, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x0E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x10, 0xE7, 0xC4, 0x10, 0x41, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x10, 0x41, 0x04, 0x7C, 0xE1, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x41, 0x9F, 0x18, 0x40, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x43, 0x1F, 0x30, 0x40, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x10, 0x41, 0x07, 0xC0, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0xA2, 0x9F, 0x28, 0xA0, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x10, 0x43, 0x8E, 0x7D, 0xF0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x7D, 0xF3, 0x8E, 0x10, 0x40, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x10, 0xE3, 0x84, 0x10, 0x01, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x6D, 0xB4, 0x80, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xA7, 0xCA, 0x29, 0xF2, 0x80, /* code=35, hex=0x23, ascii="#" */ + 0x20, 0xE4, 0x0C, 0x09, 0xC1, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x65, 0x90, 0x84, 0x21, 0x34, 0xC0, /* code=37, hex=0x25, ascii="%" */ + 0x21, 0x45, 0x08, 0x55, 0x23, 0x40, /* code=38, hex=0x26, ascii="&" */ + 0x30, 0xC2, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x10, 0x82, 0x08, 0x20, 0x81, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x20, 0x41, 0x04, 0x10, 0x42, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0xA3, 0x9F, 0x38, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x41, 0x1F, 0x10, 0x40, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x08, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x39, 0x14, 0xD5, 0x65, 0x13, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x10, 0xC1, 0x04, 0x10, 0x43, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x39, 0x10, 0x46, 0x21, 0x07, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x39, 0x10, 0x4E, 0x05, 0x13, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x08, 0x62, 0x92, 0x7C, 0x20, 0x80, /* code=52, hex=0x34, ascii="4" */ + 0x7D, 0x04, 0x1E, 0x05, 0x13, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x18, 0x84, 0x1E, 0x45, 0x13, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x7C, 0x10, 0x84, 0x20, 0x82, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x39, 0x14, 0x4E, 0x45, 0x13, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x39, 0x14, 0x4F, 0x04, 0x23, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x08, /* code=59, hex=0x3B, ascii=";" */ + 0x08, 0x42, 0x10, 0x20, 0x40, 0x80, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x20, 0x40, 0x81, 0x08, 0x42, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x39, 0x10, 0x46, 0x10, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x39, 0x15, 0xD5, 0x5D, 0x03, 0x80, /* code=64, hex=0x40, ascii="@" */ + 0x39, 0x14, 0x51, 0x7D, 0x14, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x79, 0x14, 0x5E, 0x45, 0x17, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x39, 0x14, 0x10, 0x41, 0x13, 0x80, /* code=67, hex=0x43, ascii="C" */ + 0x79, 0x14, 0x51, 0x45, 0x17, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x7D, 0x04, 0x1E, 0x41, 0x07, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x7D, 0x04, 0x1E, 0x41, 0x04, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x39, 0x14, 0x17, 0x45, 0x13, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x45, 0x14, 0x5F, 0x45, 0x14, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x38, 0x41, 0x04, 0x10, 0x43, 0x80, /* code=73, hex=0x49, ascii="I" */ + 0x04, 0x10, 0x41, 0x45, 0x13, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x45, 0x25, 0x18, 0x51, 0x24, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x41, 0x04, 0x10, 0x41, 0x07, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x45, 0xB5, 0x51, 0x45, 0x14, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x45, 0x95, 0x53, 0x45, 0x14, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x39, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x79, 0x14, 0x5E, 0x41, 0x04, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x39, 0x14, 0x51, 0x55, 0x23, 0x40, /* code=81, hex=0x51, ascii="Q" */ + 0x79, 0x14, 0x5E, 0x49, 0x14, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x39, 0x14, 0x0E, 0x05, 0x13, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x7C, 0x41, 0x04, 0x10, 0x41, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x45, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x45, 0x14, 0x51, 0x44, 0xA1, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x45, 0x15, 0x55, 0x55, 0x52, 0x80, /* code=87, hex=0x57, ascii="W" */ + 0x45, 0x12, 0x84, 0x29, 0x14, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x45, 0x14, 0x4A, 0x10, 0x41, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x78, 0x21, 0x08, 0x41, 0x07, 0x80, /* code=90, hex=0x5A, ascii="Z" */ + 0x38, 0x82, 0x08, 0x20, 0x83, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x38, 0x20, 0x82, 0x08, 0x23, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x10, 0xA4, 0x40, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, /* code=95, hex=0x5F, ascii="_" */ + 0x30, 0xC1, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x03, 0x81, 0x3D, 0x13, 0xC0, /* code=97, hex=0x61, ascii="a" */ + 0x41, 0x07, 0x91, 0x45, 0x17, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x03, 0x91, 0x41, 0x13, 0x80, /* code=99, hex=0x63, ascii="c" */ + 0x04, 0x13, 0xD1, 0x45, 0x13, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x03, 0x91, 0x79, 0x03, 0x80, /* code=101, hex=0x65, ascii="e" */ + 0x18, 0x82, 0x1E, 0x20, 0x82, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x03, 0xD1, 0x44, 0xF0, 0x4E, /* code=103, hex=0x67, ascii="g" */ + 0x41, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=104, hex=0x68, ascii="h" */ + 0x10, 0x01, 0x04, 0x10, 0x41, 0x80, /* code=105, hex=0x69, ascii="i" */ + 0x08, 0x01, 0x82, 0x08, 0x24, 0x8C, /* code=106, hex=0x6A, ascii="j" */ + 0x41, 0x04, 0x94, 0x61, 0x44, 0x80, /* code=107, hex=0x6B, ascii="k" */ + 0x10, 0x41, 0x04, 0x10, 0x41, 0x80, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x06, 0x95, 0x55, 0x14, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x03, 0x91, 0x45, 0x13, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x07, 0x91, 0x45, 0x17, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x03, 0xD1, 0x45, 0x13, 0xC1, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x05, 0x89, 0x20, 0x87, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x03, 0x90, 0x38, 0x13, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x87, 0x88, 0x20, 0xA1, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x04, 0x92, 0x49, 0x62, 0x80, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x04, 0x51, 0x44, 0xA1, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x04, 0x51, 0x55, 0xF2, 0x80, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x04, 0x92, 0x31, 0x24, 0x80, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x04, 0x92, 0x48, 0xE1, 0x18, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x07, 0x82, 0x31, 0x07, 0x80, /* code=122, hex=0x7A, ascii="z" */ + 0x18, 0x82, 0x18, 0x20, 0x81, 0x80, /* code=123, hex=0x7B, ascii="{" */ + 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x30, 0x20, 0x83, 0x08, 0x23, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x10, 0xE6, 0xD1, 0x45, 0xF0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x39, 0x14, 0x10, 0x44, 0xE1, 0x0C, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x48, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x38, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x28, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x30, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x38, 0xA3, 0x81, 0x3D, 0x13, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0xE4, 0x50, 0x44, 0xE1, 0x0C, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x38, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x28, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x30, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x28, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0xA0, 0x04, 0x10, 0x41, 0x80, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x20, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x28, 0x01, 0x0A, 0x45, 0xF4, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0xA3, 0x9B, 0x45, 0xF4, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x0C, 0x07, 0xD0, 0x79, 0x07, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x07, 0x85, 0x7D, 0x43, 0xC0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x3D, 0x45, 0x1F, 0x51, 0x45, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x38, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x28, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x60, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x38, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x60, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x28, 0x04, 0x92, 0x48, 0xE1, 0x18, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x48, 0xC4, 0x92, 0x49, 0x23, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x28, 0x04, 0x92, 0x49, 0x23, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x43, 0x90, 0x40, 0xE1, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x18, 0x92, 0x1E, 0x20, 0x95, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x44, 0xA1, 0x1F, 0x11, 0xF1, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x61, 0x45, 0x1A, 0x5D, 0x24, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x08, 0x51, 0x0E, 0x10, 0x45, 0x08, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x18, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x18, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x18, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x18, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x29, 0x40, 0x1C, 0x49, 0x24, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x29, 0x40, 0x12, 0x69, 0x64, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x13, 0xD1, 0x3C, 0x03, 0xC0, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x31, 0x24, 0x92, 0x30, 0x07, 0x80, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x10, 0x01, 0x0C, 0x41, 0x13, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x07, 0xD0, 0x41, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x0F, 0xC1, 0x04, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x41, 0x25, 0x0E, 0x44, 0x21, 0xC0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x41, 0x25, 0x0B, 0x54, 0x70, 0x40, // /* code=172, hex=0xAC, ascii="!," */ + // 0x10, 0x01, 0x04, 0x38, 0xE1, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x02, 0x52, 0x24, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x04, 0x89, 0x48, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x0A, 0x80, 0x54, 0x0A, 0x80, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x56, 0xA5, 0x6A, 0x56, 0xA5, 0x6A, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAB, 0xF5, 0x7F, 0xAB, 0xF5, 0x7F, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x41, 0x3C, 0x10, 0x41, 0x04, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x13, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x51, 0x45, 0x34, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x3C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x03, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x53, 0x41, 0x34, 0x51, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x03, 0xC1, 0x34, 0x51, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x53, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x51, 0x45, 0x3C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x13, 0xC1, 0x3C, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x3C, 0x10, 0x41, 0x04, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x41, 0x07, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x41, 0x3F, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x3F, 0x10, 0x41, 0x04, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x41, 0x07, 0x10, 0x41, 0x04, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x41, 0x3F, 0x10, 0x41, 0x04, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x51, 0x45, 0x17, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x51, 0x74, 0x1F, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x01, 0xF4, 0x17, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x53, 0x70, 0x3F, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x03, 0xF0, 0x37, 0x51, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x51, 0x74, 0x17, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x53, 0x70, 0x37, 0x51, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x13, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x51, 0x45, 0x3F, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x03, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x3F, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x51, 0x45, 0x1F, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x71, 0x07, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x1F, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x51, 0x45, 0x37, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x13, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x07, 0x10, 0x41, 0x04, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x03, 0x52, 0x48, 0xD0, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x01, 0xC4, 0x9C, 0x49, 0x27, 0x10, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x79, 0x24, 0x10, 0x41, 0x04, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x01, 0xF2, 0x8A, 0x28, 0xA2, 0x80, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x79, 0x22, 0x04, 0x21, 0x27, 0x80, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x03, 0xD2, 0x48, 0xC0, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x04, 0x92, 0x49, 0xC4, 0x10, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x02, 0x94, 0x10, 0x41, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x38, 0x43, 0x91, 0x38, 0x43, 0x80, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x31, 0x24, 0x9E, 0x49, 0x23, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0xE4, 0x51, 0x28, 0xA6, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x31, 0x02, 0x04, 0x39, 0x23, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x02, 0x95, 0x54, 0xA0, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x43, 0x95, 0x54, 0xE1, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0xE4, 0x1E, 0x40, 0xE0, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0xC4, 0x92, 0x49, 0x20, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x43, 0x84, 0x00, 0xE0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x40, 0xC0, 0x8C, 0x40, 0x07, 0x80, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x08, 0xC4, 0x0C, 0x08, 0x07, 0x80, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x21, 0x44, 0x10, 0x41, 0x04, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x10, 0x41, 0x04, 0x11, 0x42, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x40, 0x1F, 0x00, 0x40, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0xA5, 0x00, 0x29, 0x40, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x31, 0x24, 0x8C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x71, 0x04, 0x51, 0x42, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x50, 0xA2, 0x8A, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x60, 0x42, 0x1C, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x07, 0x9E, 0x79, 0xE0, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ }; diff --git a/wled00/src/font/console_font_7x9.h b/wled00/src/font/console_font_7x9.h index 30d98b0995..58513addb7 100644 --- a/wled00/src/font/console_font_7x9.h +++ b/wled00/src/font/console_font_7x9.h @@ -1,3334 +1,299 @@ // font courtesy of https://github.com/idispatch/raster-fonts -static const unsigned char console_font_7x9[] PROGMEM = { // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion - // /* - // * code=0, hex=0x00, ascii="^@" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=1, hex=0x01, ascii="^A" - // */ - // 0x38, /* 0011100 */ - // 0x44, /* 0100010 */ - // 0xAA, /* 1010101 */ - // 0xAA, /* 1010101 */ - // 0x82, /* 1000001 */ - // 0xAA, /* 1010101 */ - // 0x94, /* 1001010 */ - // 0x78, /* 0111100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=2, hex=0x02, ascii="^B" - // */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0xD6, /* 1101011 */ - // 0xD6, /* 1101011 */ - // 0xFE, /* 1111111 */ - // 0xBA, /* 1011101 */ - // 0xC6, /* 1100011 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=3, hex=0x03, ascii="^C" - // */ - // 0x00, /* 0000000 */ - // 0x6C, /* 0110110 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0x7C, /* 0111110 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=4, hex=0x04, ascii="^D" - // */ - // 0x00, /* 0000000 */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0xFE, /* 1111111 */ - // 0x7C, /* 0111110 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=5, hex=0x05, ascii="^E" - // */ - // 0x38, /* 0011100 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0xD6, /* 1101011 */ - // 0xFE, /* 1111111 */ - // 0xD6, /* 1101011 */ - // 0x10, /* 0001000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=6, hex=0x06, ascii="^F" - // */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0x54, /* 0101010 */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=7, hex=0x07, ascii="^G" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=8, hex=0x08, ascii="^H" - // */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xE6, /* 1110011 */ - // 0xC2, /* 1100001 */ - // 0xC2, /* 1100001 */ - // 0xE6, /* 1110011 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - - // /* - // * code=9, hex=0x09, ascii="^I" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=10, hex=0x0A, ascii="^J" - // */ - // 0xFE, /* 1111111 */ - // 0xE6, /* 1110011 */ - // 0xC2, /* 1100001 */ - // 0x98, /* 1001100 */ - // 0x98, /* 1001100 */ - // 0xC2, /* 1100001 */ - // 0xE6, /* 1110011 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - - // /* - // * code=11, hex=0x0B, ascii="^K" - // */ - // 0x0E, /* 0000111 */ - // 0x06, /* 0000011 */ - // 0x0A, /* 0000101 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=12, hex=0x0C, ascii="^L" - // */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=13, hex=0x0D, ascii="^M" - // */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x2C, /* 0010110 */ - // 0x20, /* 0010000 */ - // 0x20, /* 0010000 */ - // 0x20, /* 0010000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=14, hex=0x0E, ascii="^N" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x24, /* 0010010 */ - // 0x3C, /* 0011110 */ - // 0x24, /* 0010010 */ - // 0x24, /* 0010010 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=15, hex=0x0F, ascii="^O" - // */ - // 0x92, /* 1001001 */ - // 0x54, /* 0101010 */ - // 0x38, /* 0011100 */ - // 0x28, /* 0010100 */ - // 0xEE, /* 1110111 */ - // 0x38, /* 0011100 */ - // 0x54, /* 0101010 */ - // 0x92, /* 1001001 */ - // 0x00, /* 0000000 */ - - // /* - // * code=16, hex=0x10, ascii="^P" - // */ - // 0x00, /* 0000000 */ - // 0x20, /* 0010000 */ - // 0x30, /* 0011000 */ - // 0x38, /* 0011100 */ - // 0x3C, /* 0011110 */ - // 0x38, /* 0011100 */ - // 0x30, /* 0011000 */ - // 0x20, /* 0010000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=17, hex=0x11, ascii="^Q" - // */ - // 0x00, /* 0000000 */ - // 0x04, /* 0000010 */ - // 0x0C, /* 0000110 */ - // 0x1C, /* 0001110 */ - // 0x3C, /* 0011110 */ - // 0x1C, /* 0001110 */ - // 0x0C, /* 0000110 */ - // 0x04, /* 0000010 */ - // 0x00, /* 0000000 */ - - // /* - // * code=18, hex=0x12, ascii="^R" - // */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x7C, /* 0111110 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=19, hex=0x13, ascii="^S" - // */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x00, /* 0000000 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=20, hex=0x14, ascii="^T" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x54, /* 0101010 */ - // 0x54, /* 0101010 */ - // 0x3C, /* 0011110 */ - // 0x14, /* 0001010 */ - // 0x14, /* 0001010 */ - // 0x14, /* 0001010 */ - // 0x00, /* 0000000 */ - - // /* - // * code=21, hex=0x15, ascii="^U" - // */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x60, /* 0110000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x66, /* 0110011 */ - - // /* - // * code=22, hex=0x16, ascii="^V" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=23, hex=0x17, ascii="^W" - // */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x7C, /* 0111110 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0x7C, /* 0111110 */ - - // /* - // * code=24, hex=0x18, ascii="^X" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x5A, /* 0101101 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=25, hex=0x19, ascii="^Y" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x5A, /* 0101101 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=26, hex=0x1A, ascii="^Z" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x7E, /* 0111111 */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=27, hex=0x1B, ascii="^[" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x30, /* 0011000 */ - // 0x7E, /* 0111111 */ - // 0x30, /* 0011000 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=28, hex=0x1C, ascii="^\" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=29, hex=0x1D, ascii="^]" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x24, /* 0010010 */ - // 0x66, /* 0110011 */ - // 0xFE, /* 1111111 */ - // 0x66, /* 0110011 */ - // 0x24, /* 0010010 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=30, hex=0x1E, ascii="^^" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x7C, /* 0111110 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=31, hex=0x1F, ascii="^_" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x7C, /* 0111110 */ - // 0x38, /* 0011100 */ - // 0x10, /* 0001000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - /* - * code=32, hex=0x20, ascii=" " - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=33, hex=0x21, ascii="!" - */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - - /* - * code=34, hex=0x22, ascii=""" - */ - 0x00, /* 0000000 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x44, /* 0100010 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=35, hex=0x23, ascii="#" - */ - 0x00, /* 0000000 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0xFE, /* 1111111 */ - 0x6C, /* 0110110 */ - 0xFE, /* 1111111 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x00, /* 0000000 */ - - /* - * code=36, hex=0x24, ascii="$" - */ - 0x08, /* 0000100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x60, /* 0110000 */ - 0x3C, /* 0011110 */ - 0x06, /* 0000011 */ - 0x7C, /* 0111110 */ - 0x18, /* 0001100 */ - 0x10, /* 0001000 */ - - /* - * code=37, hex=0x25, ascii="%" - */ - 0x70, /* 0111000 */ - 0x52, /* 0101001 */ - 0x76, /* 0111011 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x3E, /* 0011111 */ - 0x6A, /* 0110101 */ - 0x0E, /* 0000111 */ - 0x00, /* 0000000 */ - - /* - * code=38, hex=0x26, ascii="&" - */ - 0x38, /* 0011100 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0x6E, /* 0110111 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x3E, /* 0011111 */ - 0x00, /* 0000000 */ - - /* - * code=39, hex=0x27, ascii="'" - */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=40, hex=0x28, ascii="(" - */ - 0x00, /* 0000000 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x0C, /* 0000110 */ - 0x00, /* 0000000 */ - - /* - * code=41, hex=0x29, ascii=")" - */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - - /* - * code=42, hex=0x2A, ascii="*" - */ - 0x00, /* 0000000 */ - 0x44, /* 0100010 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0xFE, /* 1111111 */ - 0x38, /* 0011100 */ - 0x6C, /* 0110110 */ - 0x44, /* 0100010 */ - 0x00, /* 0000000 */ - - /* - * code=43, hex=0x2B, ascii="+" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x7E, /* 0111111 */ - 0x7E, /* 0111111 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - - /* - * code=44, hex=0x2C, ascii="," - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - - /* - * code=45, hex=0x2D, ascii="-" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x7C, /* 0111110 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=46, hex=0x2E, ascii="." - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - - /* - * code=47, hex=0x2F, ascii="/" - */ - 0x00, /* 0000000 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - 0x00, /* 0000000 */ - - /* - * code=48, hex=0x30, ascii="0" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x6E, /* 0110111 */ - 0x76, /* 0111011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=49, hex=0x31, ascii="1" - */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x78, /* 0111100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=50, hex=0x32, ascii="2" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x46, /* 0100011 */ - 0x1C, /* 0001110 */ - 0x30, /* 0011000 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=51, hex=0x33, ascii="3" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x06, /* 0000011 */ - 0x1C, /* 0001110 */ - 0x06, /* 0000011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=52, hex=0x34, ascii="4" - */ - 0x00, /* 0000000 */ - 0x0C, /* 0000110 */ - 0x1C, /* 0001110 */ - 0x3C, /* 0011110 */ - 0x6C, /* 0110110 */ - 0x7E, /* 0111111 */ - 0x0C, /* 0000110 */ - 0x1E, /* 0001111 */ - 0x00, /* 0000000 */ - - /* - * code=53, hex=0x35, ascii="5" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x7C, /* 0111110 */ - 0x06, /* 0000011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=54, hex=0x36, ascii="6" - */ - 0x00, /* 0000000 */ - 0x1C, /* 0001110 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=55, hex=0x37, ascii="7" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x06, /* 0000011 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - - /* - * code=56, hex=0x38, ascii="8" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=57, hex=0x39, ascii="9" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3E, /* 0011111 */ - 0x06, /* 0000011 */ - 0x0C, /* 0000110 */ - 0x38, /* 0011100 */ - 0x00, /* 0000000 */ - - /* - * code=58, hex=0x3A, ascii=":" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - - /* - * code=59, hex=0x3B, ascii=";" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - - /* - * code=60, hex=0x3C, ascii="<" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=61, hex=0x3D, ascii="=" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=62, hex=0x3E, ascii=">" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=63, hex=0x3F, ascii="?" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x06, /* 0000011 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - - /* - * code=64, hex=0x40, ascii="@" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x62, /* 0110001 */ - 0x6E, /* 0110111 */ - 0x6A, /* 0110101 */ - 0x6C, /* 0110110 */ - 0x62, /* 0110001 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=65, hex=0x41, ascii="A" - */ - 0x00, /* 0000000 */ - 0x10, /* 0001000 */ - 0x38, /* 0011100 */ - 0x28, /* 0010100 */ - 0x6C, /* 0110110 */ - 0x7C, /* 0111110 */ - 0xC6, /* 1100011 */ - 0xC6, /* 1100011 */ - 0x00, /* 0000000 */ - - /* - * code=66, hex=0x42, ascii="B" - */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x7C, /* 0111110 */ - 0x00, /* 0000000 */ - - /* - * code=67, hex=0x43, ascii="C" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=68, hex=0x44, ascii="D" - */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x7C, /* 0111110 */ - 0x00, /* 0000000 */ - - /* - * code=69, hex=0x45, ascii="E" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x78, /* 0111100 */ - 0x60, /* 0110000 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=70, hex=0x46, ascii="F" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x7C, /* 0111110 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x00, /* 0000000 */ - - /* - * code=71, hex=0x47, ascii="G" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x6E, /* 0110111 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3E, /* 0011111 */ - 0x00, /* 0000000 */ - - /* - * code=72, hex=0x48, ascii="H" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=73, hex=0x49, ascii="I" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=74, hex=0x4A, ascii="J" - */ - 0x00, /* 0000000 */ - 0x1E, /* 0001111 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0x00, /* 0000000 */ - - /* - * code=75, hex=0x4B, ascii="K" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x78, /* 0111100 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=76, hex=0x4C, ascii="L" - */ - 0x00, /* 0000000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=77, hex=0x4D, ascii="M" - */ - 0x00, /* 0000000 */ - 0xC6, /* 1100011 */ - 0xC6, /* 1100011 */ - 0xEE, /* 1110111 */ - 0xFE, /* 1111111 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0x00, /* 0000000 */ - - /* - * code=78, hex=0x4E, ascii="N" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x76, /* 0111011 */ - 0x76, /* 0111011 */ - 0x7E, /* 0111111 */ - 0x6E, /* 0110111 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=79, hex=0x4F, ascii="O" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=80, hex=0x50, ascii="P" - */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x7C, /* 0111110 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x00, /* 0000000 */ - - /* - * code=81, hex=0x51, ascii="Q" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x76, /* 0111011 */ - 0x6E, /* 0110111 */ - 0x3C, /* 0011110 */ - 0x06, /* 0000011 */ - - /* - * code=82, hex=0x52, ascii="R" - */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x6C, /* 0110110 */ - 0x78, /* 0111100 */ - 0x6C, /* 0110110 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=83, hex=0x53, ascii="S" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x3C, /* 0011110 */ - 0x06, /* 0000011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=84, hex=0x54, ascii="T" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x5A, /* 0101101 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=85, hex=0x55, ascii="U" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=86, hex=0x56, ascii="V" - */ - 0x00, /* 0000000 */ - 0xC6, /* 1100011 */ - 0xC6, /* 1100011 */ - 0x6C, /* 0110110 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0x38, /* 0011100 */ - 0x10, /* 0001000 */ - 0x00, /* 0000000 */ - - /* - * code=87, hex=0x57, ascii="W" - */ - 0x00, /* 0000000 */ - 0xC6, /* 1100011 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0x7C, /* 0111110 */ - 0x6C, /* 0110110 */ - 0x44, /* 0100010 */ - 0x00, /* 0000000 */ - - /* - * code=88, hex=0x58, ascii="X" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=89, hex=0x59, ascii="Y" - */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=90, hex=0x5A, ascii="Z" - */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x66, /* 0110011 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=91, hex=0x5B, ascii="[" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=92, hex=0x5C, ascii="\" - */ - 0x00, /* 0000000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x0C, /* 0000110 */ - 0x00, /* 0000000 */ - - /* - * code=93, hex=0x5D, ascii="]" - */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=94, hex=0x5E, ascii="^" - */ - 0x00, /* 0000000 */ - 0x10, /* 0001000 */ - 0x38, /* 0011100 */ - 0x6C, /* 0110110 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=95, hex=0x5F, ascii="_" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x7C, /* 0111110 */ - - /* - * code=96, hex=0x60, ascii="`" - */ - 0x00, /* 0000000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - /* - * code=97, hex=0x61, ascii="a" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x06, /* 0000011 */ - 0x3E, /* 0011111 */ - 0x66, /* 0110011 */ - 0x3A, /* 0011101 */ - 0x00, /* 0000000 */ - - /* - * code=98, hex=0x62, ascii="b" - */ - 0x00, /* 0000000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x5C, /* 0101110 */ - 0x00, /* 0000000 */ - - /* - * code=99, hex=0x63, ascii="c" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x60, /* 0110000 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=100, hex=0x64, ascii="d" - */ - 0x00, /* 0000000 */ - 0x06, /* 0000011 */ - 0x06, /* 0000011 */ - 0x3E, /* 0011111 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3A, /* 0011101 */ - 0x00, /* 0000000 */ - - /* - * code=101, hex=0x65, ascii="e" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x7E, /* 0111111 */ - 0x60, /* 0110000 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=102, hex=0x66, ascii="f" - */ - 0x00, /* 0000000 */ - 0x1C, /* 0001110 */ - 0x36, /* 0011011 */ - 0x30, /* 0011000 */ - 0x7C, /* 0111110 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x78, /* 0111100 */ - 0x00, /* 0000000 */ - - /* - * code=103, hex=0x67, ascii="g" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3A, /* 0011101 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3E, /* 0011111 */ - 0x06, /* 0000011 */ - 0x3C, /* 0011110 */ - - /* - * code=104, hex=0x68, ascii="h" - */ - 0x00, /* 0000000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x6C, /* 0110110 */ - 0x76, /* 0111011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=105, hex=0x69, ascii="i" - */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x38, /* 0011100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=106, hex=0x6A, ascii="j" - */ - 0x0C, /* 0000110 */ - 0x0C, /* 0000110 */ - 0x00, /* 0000000 */ - 0x0C, /* 0000110 */ - 0x3C, /* 0011110 */ - 0x0C, /* 0000110 */ - 0x4C, /* 0100110 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - - /* - * code=107, hex=0x6B, ascii="k" - */ - 0x00, /* 0000000 */ - 0x60, /* 0110000 */ - 0x60, /* 0110000 */ - 0x66, /* 0110011 */ - 0x6C, /* 0110110 */ - 0x78, /* 0111100 */ - 0x6C, /* 0110110 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=108, hex=0x6C, ascii="l" - */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=109, hex=0x6D, ascii="m" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x6C, /* 0110110 */ - 0xFE, /* 1111111 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0x00, /* 0000000 */ - - /* - * code=110, hex=0x6E, ascii="n" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x6C, /* 0110110 */ - 0x76, /* 0111011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x00, /* 0000000 */ - - /* - * code=111, hex=0x6F, ascii="o" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=112, hex=0x70, ascii="p" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x7C, /* 0111110 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x76, /* 0111011 */ - 0x6C, /* 0110110 */ - 0x60, /* 0110000 */ - - /* - * code=113, hex=0x71, ascii="q" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3A, /* 0011101 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x6E, /* 0110111 */ - 0x36, /* 0011011 */ - 0x06, /* 0000011 */ - - /* - * code=114, hex=0x72, ascii="r" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x26, /* 0010011 */ - 0x7E, /* 0111111 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x78, /* 0111100 */ - 0x00, /* 0000000 */ - - /* - * code=115, hex=0x73, ascii="s" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x3C, /* 0011110 */ - 0x60, /* 0110000 */ - 0x3C, /* 0011110 */ - 0x06, /* 0000011 */ - 0x3C, /* 0011110 */ - 0x00, /* 0000000 */ - - /* - * code=116, hex=0x74, ascii="t" - */ - 0x00, /* 0000000 */ - 0x10, /* 0001000 */ - 0x30, /* 0011000 */ - 0xFC, /* 1111110 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x36, /* 0011011 */ - 0x1C, /* 0001110 */ - 0x00, /* 0000000 */ - - /* - * code=117, hex=0x75, ascii="u" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x6E, /* 0110111 */ - 0x36, /* 0011011 */ - 0x00, /* 0000000 */ - - /* - * code=118, hex=0x76, ascii="v" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0xC6, /* 1100011 */ - 0xC6, /* 1100011 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0x10, /* 0001000 */ - 0x00, /* 0000000 */ - - /* - * code=119, hex=0x77, ascii="w" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0xD6, /* 1101011 */ - 0xD6, /* 1101011 */ - 0x7C, /* 0111110 */ - 0x6C, /* 0110110 */ - 0x44, /* 0100010 */ - 0x00, /* 0000000 */ - - /* - * code=120, hex=0x78, ascii="x" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0xC6, /* 1100011 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - 0x6C, /* 0110110 */ - 0xC6, /* 1100011 */ - 0x00, /* 0000000 */ - - /* - * code=121, hex=0x79, ascii="y" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x66, /* 0110011 */ - 0x66, /* 0110011 */ - 0x36, /* 0011011 */ - 0x1C, /* 0001110 */ - 0x6C, /* 0110110 */ - 0x38, /* 0011100 */ - - /* - * code=122, hex=0x7A, ascii="z" - */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x7E, /* 0111111 */ - 0x06, /* 0000011 */ - 0x18, /* 0001100 */ - 0x30, /* 0011000 */ - 0x7E, /* 0111111 */ - 0x00, /* 0000000 */ - - /* - * code=123, hex=0x7B, ascii="{" - */ - 0x00, /* 0000000 */ - 0x1C, /* 0001110 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x60, /* 0110000 */ - 0x30, /* 0011000 */ - 0x30, /* 0011000 */ - 0x1C, /* 0001110 */ - 0x00, /* 0000000 */ - - /* - * code=124, hex=0x7C, ascii="|" - */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x00, /* 0000000 */ - - /* - * code=125, hex=0x7D, ascii="}" - */ - 0x00, /* 0000000 */ - 0x70, /* 0111000 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x0C, /* 0000110 */ - 0x18, /* 0001100 */ - 0x18, /* 0001100 */ - 0x70, /* 0111000 */ - 0x00, /* 0000000 */ - - /* - * code=126, hex=0x7E, ascii="~" - */ - 0x00, /* 0000000 */ - 0x10, /* 0001000 */ - 0x3A, /* 0011101 */ - 0x6E, /* 0110111 */ - 0x04, /* 0000010 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - 0x00, /* 0000000 */ - - // /* - // * code=127, hex=0x7F, ascii="^?" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x08, /* 0000100 */ - // 0x1C, /* 0001110 */ - // 0x36, /* 0011011 */ - // 0x62, /* 0110001 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (10 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 9 + * [2] Fixed glyph width: 7 + * [3] Flags: 0x00 (fixed width) + * [4] First Char: 32 + * [5] Last Char: 126 + * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 + * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of the stream, padding bits are added if necessary to fill the last byte + */ - // /* - // * code=128, hex=0x80, ascii="!^@" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x78, /* 0111100 */ - - // /* - // * code=129, hex=0x81, ascii="!^A" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=130, hex=0x82, ascii="!^B" - // */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x3E, /* 0011111 */ - // 0x62, /* 0110001 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=131, hex=0x83, ascii="!^C" - // */ - // 0x1C, /* 0001110 */ - // 0x36, /* 0011011 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x3E, /* 0011111 */ - // 0x66, /* 0110011 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=132, hex=0x84, ascii="!^D" - // */ - // 0x36, /* 0011011 */ - // 0x36, /* 0011011 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x3E, /* 0011111 */ - // 0x66, /* 0110011 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=133, hex=0x85, ascii="!^E" - // */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x3E, /* 0011111 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=134, hex=0x86, ascii="!^F" - // */ - // 0x1C, /* 0001110 */ - // 0x14, /* 0001010 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x3E, /* 0011111 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=135, hex=0x87, ascii="!^G" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x1C, /* 0001110 */ - // 0x36, /* 0011011 */ - // 0x60, /* 0110000 */ - // 0x36, /* 0011011 */ - // 0x1C, /* 0001110 */ - // 0x78, /* 0111100 */ - - // /* - // * code=136, hex=0x88, ascii="!^H" - // */ - // 0x08, /* 0000100 */ - // 0x1C, /* 0001110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=137, hex=0x89, ascii="!^I" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=138, hex=0x8A, ascii="!^J" - // */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=139, hex=0x8B, ascii="!^K" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=140, hex=0x8C, ascii="!^L" - // */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=141, hex=0x8D, ascii="!^M" - // */ - // 0x30, /* 0011000 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=142, hex=0x8E, ascii="!^N" - // */ - // 0xC6, /* 1100011 */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x28, /* 0010100 */ - // 0x6C, /* 0110110 */ - // 0x7C, /* 0111110 */ - // 0xC6, /* 1100011 */ - // 0xC6, /* 1100011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=143, hex=0x8F, ascii="!^O" - // */ - // 0x38, /* 0011100 */ - // 0x28, /* 0010100 */ - // 0x38, /* 0011100 */ - // 0x28, /* 0010100 */ - // 0x6C, /* 0110110 */ - // 0x7C, /* 0111110 */ - // 0xC6, /* 1100011 */ - // 0xC6, /* 1100011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=144, hex=0x90, ascii="!^P" - // */ - // 0x1C, /* 0001110 */ - // 0x30, /* 0011000 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x7C, /* 0111110 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=145, hex=0x91, ascii="!^Q" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x1A, /* 0001101 */ - // 0x7E, /* 0111111 */ - // 0xD8, /* 1101100 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=146, hex=0x92, ascii="!^R" - // */ - // 0x00, /* 0000000 */ - // 0x1E, /* 0001111 */ - // 0x38, /* 0011100 */ - // 0x58, /* 0101100 */ - // 0x5E, /* 0101111 */ - // 0xF8, /* 1111100 */ - // 0xD8, /* 1101100 */ - // 0xDE, /* 1101111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=147, hex=0x93, ascii="!^S" - // */ - // 0x10, /* 0001000 */ - // 0x38, /* 0011100 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=148, hex=0x94, ascii="!^T" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=149, hex=0x95, ascii="!^U" - // */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=150, hex=0x96, ascii="!^V" - // */ - // 0x08, /* 0000100 */ - // 0x1C, /* 0001110 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=151, hex=0x97, ascii="!^W" - // */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=152, hex=0x98, ascii="!^X" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x36, /* 0011011 */ - // 0x1C, /* 0001110 */ - // 0x6C, /* 0110110 */ - // 0x38, /* 0011100 */ - - // /* - // * code=153, hex=0x99, ascii="!^Y" - // */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=154, hex=0x9A, ascii="!^Z" - // */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=155, hex=0x9B, ascii="!^[" - // */ - // 0x08, /* 0000100 */ - // 0x08, /* 0000100 */ - // 0x3C, /* 0011110 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x3C, /* 0011110 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=156, hex=0x9C, ascii="!^\" - // */ - // 0x1C, /* 0001110 */ - // 0x36, /* 0011011 */ - // 0x30, /* 0011000 */ - // 0x30, /* 0011000 */ - // 0x7C, /* 0111110 */ - // 0x30, /* 0011000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=157, hex=0x9D, ascii="!^]" - // */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x7E, /* 0111111 */ - // 0x18, /* 0001100 */ - // 0x7E, /* 0111111 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=158, hex=0x9E, ascii="!^^" - // */ - // 0xE0, /* 1110000 */ - // 0xD0, /* 1101000 */ - // 0xD0, /* 1101000 */ - // 0xF4, /* 1111010 */ - // 0xCC, /* 1100110 */ - // 0xDE, /* 1101111 */ - // 0xCC, /* 1100110 */ - // 0x06, /* 0000011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=159, hex=0x9F, ascii="!^_" - // */ - // 0x0E, /* 0000111 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x7E, /* 0111111 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x70, /* 0111000 */ - - // /* - // * code=160, hex=0xA0, ascii="! " - // */ - // 0x06, /* 0000011 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x06, /* 0000011 */ - // 0x3E, /* 0011111 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=161, hex=0xA1, ascii="!!" - // */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=162, hex=0xA2, ascii="!"" - // */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=163, hex=0xA3, ascii="!#" - // */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3A, /* 0011101 */ - // 0x00, /* 0000000 */ - - // /* - // * code=164, hex=0xA4, ascii="!$" - // */ - // 0x76, /* 0111011 */ - // 0xDC, /* 1101110 */ - // 0x00, /* 0000000 */ - // 0x6C, /* 0110110 */ - // 0x76, /* 0111011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=165, hex=0xA5, ascii="!%" - // */ - // 0x76, /* 0111011 */ - // 0xDC, /* 1101110 */ - // 0x00, /* 0000000 */ - // 0x66, /* 0110011 */ - // 0x76, /* 0111011 */ - // 0x7E, /* 0111111 */ - // 0x6E, /* 0110111 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=166, hex=0xA6, ascii="!&" - // */ - // 0x38, /* 0011100 */ - // 0x0C, /* 0000110 */ - // 0x3C, /* 0011110 */ - // 0x6C, /* 0110110 */ - // 0x34, /* 0011010 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=167, hex=0xA7, ascii="!'" - // */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=168, hex=0xA8, ascii="!(" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x30, /* 0011000 */ - // 0x60, /* 0110000 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=169, hex=0xA9, ascii="!)" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x3C, /* 0011110 */ - // 0x30, /* 0011000 */ - // 0x30, /* 0011000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=170, hex=0xAA, ascii="!*" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x7C, /* 0111110 */ - // 0x0C, /* 0000110 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=171, hex=0xAB, ascii="!+" - // */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x6E, /* 0110111 */ - // 0x1A, /* 0001101 */ - // 0x04, /* 0000010 */ - // 0x18, /* 0001100 */ - // 0x1E, /* 0001111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=172, hex=0xAC, ascii="!," - // */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x6C, /* 0110110 */ - // 0x7C, /* 0111110 */ - // 0x2C, /* 0010110 */ - // 0x7C, /* 0111110 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=173, hex=0xAD, ascii="!-" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=174, hex=0xAE, ascii="!." - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x32, /* 0011001 */ - // 0x66, /* 0110011 */ - // 0xCC, /* 1100110 */ - // 0x66, /* 0110011 */ - // 0x32, /* 0011001 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=175, hex=0xAF, ascii="!/" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xCC, /* 1100110 */ - // 0x66, /* 0110011 */ - // 0x32, /* 0011001 */ - // 0x66, /* 0110011 */ - // 0xCC, /* 1100110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=176, hex=0xB0, ascii="!0" - // */ - // 0x54, /* 0101010 */ - // 0x00, /* 0000000 */ - // 0xAA, /* 1010101 */ - // 0x00, /* 0000000 */ - // 0x54, /* 0101010 */ - // 0x00, /* 0000000 */ - // 0xAA, /* 1010101 */ - // 0x00, /* 0000000 */ - // 0x54, /* 0101010 */ - - // /* - // * code=177, hex=0xB1, ascii="!1" - // */ - // 0x92, /* 1001001 */ - // 0x48, /* 0100100 */ - // 0x24, /* 0010010 */ - // 0x92, /* 1001001 */ - // 0x48, /* 0100100 */ - // 0x24, /* 0010010 */ - // 0x92, /* 1001001 */ - // 0x48, /* 0100100 */ - // 0x24, /* 0010010 */ - - // /* - // * code=178, hex=0xB2, ascii="!2" - // */ - // 0xAA, /* 1010101 */ - // 0x54, /* 0101010 */ - // 0xAA, /* 1010101 */ - // 0x54, /* 0101010 */ - // 0xAA, /* 1010101 */ - // 0x54, /* 0101010 */ - // 0xAA, /* 1010101 */ - // 0x54, /* 0101010 */ - // 0xAA, /* 1010101 */ - - // /* - // * code=179, hex=0xB3, ascii="!3" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=180, hex=0xB4, ascii="!4" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=181, hex=0xB5, ascii="!5" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=182, hex=0xB6, ascii="!6" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xE8, /* 1110100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=183, hex=0xB7, ascii="!7" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xF8, /* 1111100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=184, hex=0xB8, ascii="!8" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=185, hex=0xB9, ascii="!9" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xE8, /* 1110100 */ - // 0x08, /* 0000100 */ - // 0xE8, /* 1110100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=186, hex=0xBA, ascii="!:" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=187, hex=0xBB, ascii="!;" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xF8, /* 1111100 */ - // 0x08, /* 0000100 */ - // 0xE8, /* 1110100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=188, hex=0xBC, ascii="!<" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xE8, /* 1110100 */ - // 0x08, /* 0000100 */ - // 0xF8, /* 1111100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=189, hex=0xBD, ascii="!=" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xF8, /* 1111100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=190, hex=0xBE, ascii="!>" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=191, hex=0xBF, ascii="!?" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xF0, /* 1111000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=192, hex=0xC0, ascii="!@" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=193, hex=0xC1, ascii="!A" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=194, hex=0xC2, ascii="!B" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=195, hex=0xC3, ascii="!C" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=196, hex=0xC4, ascii="!D" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=197, hex=0xC5, ascii="!E" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xFE, /* 1111111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=198, hex=0xC6, ascii="!F" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=199, hex=0xC7, ascii="!G" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x2E, /* 0010111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=200, hex=0xC8, ascii="!H" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x2E, /* 0010111 */ - // 0x20, /* 0010000 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=201, hex=0xC9, ascii="!I" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x3E, /* 0011111 */ - // 0x20, /* 0010000 */ - // 0x2E, /* 0010111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=202, hex=0xCA, ascii="!J" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xEE, /* 1110111 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=203, hex=0xCB, ascii="!K" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0xEE, /* 1110111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=204, hex=0xCC, ascii="!L" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x2E, /* 0010111 */ - // 0x20, /* 0010000 */ - // 0x2E, /* 0010111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=205, hex=0xCD, ascii="!M" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=206, hex=0xCE, ascii="!N" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xEE, /* 1110111 */ - // 0x00, /* 0000000 */ - // 0xEE, /* 1110111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=207, hex=0xCF, ascii="!O" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=208, hex=0xD0, ascii="!P" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xF8, /* 1111100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=209, hex=0xD1, ascii="!Q" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=210, hex=0xD2, ascii="!R" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xF8, /* 1111100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=211, hex=0xD3, ascii="!S" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x3E, /* 0011111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=212, hex=0xD4, ascii="!T" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=213, hex=0xD5, ascii="!U" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=214, hex=0xD6, ascii="!V" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x3E, /* 0011111 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=215, hex=0xD7, ascii="!W" - // */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0xE8, /* 1110100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - // 0x28, /* 0010100 */ - - // /* - // * code=216, hex=0xD8, ascii="!X" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xFE, /* 1111111 */ - // 0x10, /* 0001000 */ - // 0xFE, /* 1111111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=217, hex=0xD9, ascii="!Y" - // */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0xF0, /* 1111000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=218, hex=0xDA, ascii="!Z" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x1E, /* 0001111 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - // 0x10, /* 0001000 */ - - // /* - // * code=219, hex=0xDB, ascii="![" - // */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - - // /* - // * code=220, hex=0xDC, ascii="!\" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - - // /* - // * code=221, hex=0xDD, ascii="!]" - // */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - // 0xF0, /* 1111000 */ - - // /* - // * code=222, hex=0xDE, ascii="!^" - // */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - // 0x0E, /* 0000111 */ - - // /* - // * code=223, hex=0xDF, ascii="!_" - // */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=224, hex=0xE0, ascii="!`" - // */ - // 0x00, /* 0000000 */ - // 0x34, /* 0011010 */ - // 0x68, /* 0110100 */ - // 0x68, /* 0110100 */ - // 0x68, /* 0110100 */ - // 0x34, /* 0011010 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=225, hex=0xE1, ascii="!a" - // */ - // 0x7C, /* 0111110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x6C, /* 0110110 */ - // 0x66, /* 0110011 */ - // 0x62, /* 0110001 */ - // 0x66, /* 0110011 */ - // 0x6C, /* 0110110 */ - // 0x08, /* 0000100 */ - - // /* - // * code=226, hex=0xE2, ascii="!b" - // */ - // 0x00, /* 0000000 */ - // 0x7E, /* 0111111 */ - // 0x62, /* 0110001 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=227, hex=0xE3, ascii="!c" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x6C, /* 0110110 */ - // 0xFE, /* 1111111 */ - // 0xF6, /* 1111011 */ - // 0x66, /* 0110011 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=228, hex=0xE4, ascii="!d" - // */ - // 0x00, /* 0000000 */ - // 0xFE, /* 1111111 */ - // 0xC6, /* 1100011 */ - // 0x60, /* 0110000 */ - // 0x38, /* 0011100 */ - // 0x30, /* 0011000 */ - // 0x66, /* 0110011 */ - // 0xFE, /* 1111111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=229, hex=0xE5, ascii="!e" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x3E, /* 0011111 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x38, /* 0011100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=230, hex=0xE6, ascii="!f" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x36, /* 0011011 */ - // 0x36, /* 0011011 */ - // 0x36, /* 0011011 */ - // 0x3E, /* 0011111 */ - // 0x62, /* 0110001 */ - // 0x40, /* 0100000 */ - - // /* - // * code=231, hex=0xE7, ascii="!g" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7A, /* 0111101 */ - // 0x6A, /* 0110101 */ - // 0x0E, /* 0000111 */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=232, hex=0xE8, ascii="!h" - // */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=233, hex=0xE9, ascii="!i" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x7E, /* 0111111 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=234, hex=0xEA, ascii="!j" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x24, /* 0010010 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=235, hex=0xEB, ascii="!k" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x60, /* 0110000 */ - // 0x30, /* 0011000 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=236, hex=0xEC, ascii="!l" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x34, /* 0011010 */ - // 0x4A, /* 0100101 */ - // 0x4A, /* 0100101 */ - // 0x4A, /* 0100101 */ - // 0x34, /* 0011010 */ - // 0x00, /* 0000000 */ - - // /* - // * code=237, hex=0xED, ascii="!m" - // */ - // 0x04, /* 0000010 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x6E, /* 0110111 */ - // 0x76, /* 0111011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x10, /* 0001000 */ - // 0x20, /* 0010000 */ - - // /* - // * code=238, hex=0xEE, ascii="!n" - // */ - // 0x1E, /* 0001111 */ - // 0x30, /* 0011000 */ - // 0x60, /* 0110000 */ - // 0x60, /* 0110000 */ - // 0x7E, /* 0111111 */ - // 0x60, /* 0110000 */ - // 0x30, /* 0011000 */ - // 0x1E, /* 0001111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=239, hex=0xEF, ascii="!o" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x00, /* 0000000 */ - - // /* - // * code=240, hex=0xF0, ascii="!p" - // */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=241, hex=0xF1, ascii="!q" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x7E, /* 0111111 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - - // /* - // * code=242, hex=0xF2, ascii="!r" - // */ - // 0x00, /* 0000000 */ - // 0x30, /* 0011000 */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x30, /* 0011000 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=243, hex=0xF3, ascii="!s" - // */ - // 0x00, /* 0000000 */ - // 0x0C, /* 0000110 */ - // 0x18, /* 0001100 */ - // 0x30, /* 0011000 */ - // 0x18, /* 0001100 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=244, hex=0xF4, ascii="!t" - // */ - // 0x0C, /* 0000110 */ - // 0x1A, /* 0001101 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - - // /* - // * code=245, hex=0xF5, ascii="!u" - // */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x58, /* 0101100 */ - // 0x30, /* 0011000 */ - - // /* - // * code=246, hex=0xF6, ascii="!v" - // */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x7E, /* 0111111 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - - // /* - // * code=247, hex=0xF7, ascii="!w" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x1A, /* 0001101 */ - // 0x76, /* 0111011 */ - // 0x00, /* 0000000 */ - // 0x1A, /* 0001101 */ - // 0x76, /* 0111011 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=248, hex=0xF8, ascii="!x" - // */ - // 0x00, /* 0000000 */ - // 0x3C, /* 0011110 */ - // 0x66, /* 0110011 */ - // 0x66, /* 0110011 */ - // 0x3C, /* 0011110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=249, hex=0xF9, ascii="!y" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x3C, /* 0011110 */ - // 0x3C, /* 0011110 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=250, hex=0xFA, ascii="!z" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x18, /* 0001100 */ - // 0x18, /* 0001100 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=251, hex=0xFB, ascii="!{" - // */ - // 0x0E, /* 0000111 */ - // 0x0C, /* 0000110 */ - // 0x0C, /* 0000110 */ - // 0x0C, /* 0000110 */ - // 0x0C, /* 0000110 */ - // 0x6C, /* 0110110 */ - // 0x3C, /* 0011110 */ - // 0x0C, /* 0000110 */ - // 0x00, /* 0000000 */ - - // /* - // * code=252, hex=0xFC, ascii="!|" - // */ - // 0x00, /* 0000000 */ - // 0x78, /* 0111100 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x6C, /* 0110110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=253, hex=0xFD, ascii="!}" - // */ - // 0x00, /* 0000000 */ - // 0x38, /* 0011100 */ - // 0x4C, /* 0100110 */ - // 0x18, /* 0001100 */ - // 0x30, /* 0011000 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=254, hex=0xFE, ascii="!~" - // */ - // 0x00, /* 0000000 */ - // 0x7C, /* 0111110 */ - // 0x7C, /* 0111110 */ - // 0x7C, /* 0111110 */ - // 0x7C, /* 0111110 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - - // /* - // * code=255, hex=0xFF, ascii="!^Ÿ" - // */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ - // 0x00, /* 0000000 */ +static const unsigned char console_font_7x9[] PROGMEM = { + 0x57, 0x09, 0x07, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x38, 0x8A, 0xAD, 0x58, 0x35, 0x65, 0x3C, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x38, 0xFB, 0x5E, 0xBF, 0xF7, 0x71, 0xBE, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xDB, 0xFF, 0xFF, 0xEF, 0x8E, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x20, 0xE3, 0xEF, 0xEF, 0x8E, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x38, 0x70, 0x46, 0xBF, 0xFA, 0xC4, 0x3E, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x10, 0x71, 0xF7, 0xFF, 0xEA, 0x84, 0x1C, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0x9E, 0x1C, 0x3C, 0xFF, 0xFF, 0xFE, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xCF, 0x0C, 0xC9, 0x98, 0x79, 0xFF, 0xFE, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x0E, 0x0C, 0x28, 0xC3, 0xCC, 0xD9, 0x9E, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x3C, 0xCD, 0x99, 0xE1, 0x87, 0x86, 0x0C, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x70, 0xB1, 0x02, 0x04, 0x18, 0x30, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x78, 0x91, 0xE2, 0x44, 0x9B, 0x36, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x92, 0xA8, 0xE1, 0x4E, 0xE7, 0x15, 0x49, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x40, 0xC1, 0xC3, 0xC7, 0x0C, 0x10, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x08, 0x30, 0xE3, 0xC3, 0x83, 0x02, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x6C, 0xD9, 0xB3, 0x66, 0xC0, 0x1B, 0x36, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x79, 0x52, 0xA3, 0xC2, 0x85, 0x0A, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x3C, 0xCD, 0x81, 0xE6, 0x6C, 0xCF, 0x03, 0x66, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x7C, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x30, 0xF2, 0xD1, 0x83, 0x06, 0x0C, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x30, 0x60, 0xC1, 0x8B, 0x4F, 0x0C, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x60, 0x67, 0xE1, 0x86, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x61, 0x87, 0xE6, 0x06, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x06, 0x0C, 0x1F, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0x93, 0x3F, 0xEC, 0xC9, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x00, 0x83, 0x8F, 0xBF, 0x80, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x07, 0xF7, 0xC7, 0x04, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x30, 0x60, 0xC1, 0x80, 0x06, 0x0C, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0xD9, 0xB2, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x08, 0x30, 0xF3, 0x03, 0xC0, 0xDF, 0x0C, 0x10, /* code=36, hex=0x24, ascii="$" */ + 0x70, 0xA5, 0xD8, 0x61, 0x87, 0xDA, 0x87, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x38, 0xD9, 0xB1, 0xC6, 0xED, 0x9B, 0x1F, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x00, 0x30, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x18, 0x61, 0x83, 0x06, 0x06, 0x06, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x60, 0x60, 0x60, 0xC1, 0x86, 0x18, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x60, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x79, 0x9B, 0x77, 0x6C, 0xD9, 0x9E, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x31, 0xE0, 0xC1, 0x83, 0x06, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x79, 0x9A, 0x31, 0xC6, 0x19, 0xBF, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x79, 0x98, 0x31, 0xC0, 0xD9, 0x9E, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x18, 0x71, 0xE6, 0xCF, 0xC3, 0x0F, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0xFD, 0x9B, 0x07, 0xC0, 0xD9, 0x9E, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x38, 0xC3, 0x07, 0xCC, 0xD9, 0x9E, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0xFD, 0x98, 0x30, 0xC3, 0x06, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x79, 0x9B, 0x33, 0xCC, 0xD9, 0x9E, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x79, 0x9B, 0x33, 0xE0, 0xC3, 0x1C, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x60, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x00, 0x61, 0x86, 0x06, 0x06, 0x00, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x00, 0xC0, 0xC0, 0xC3, 0x0C, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x79, 0x98, 0x30, 0xC3, 0x00, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x79, 0x8B, 0x76, 0xAD, 0x98, 0x9E, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0xF9, 0x9B, 0x37, 0xCC, 0xD9, 0xBE, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6C, 0xD9, 0xBE, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0xFD, 0x9B, 0x07, 0x8C, 0x19, 0xBF, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0xFD, 0x9B, 0x07, 0xCC, 0x18, 0x30, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x79, 0x9B, 0x06, 0xEC, 0xD9, 0x9F, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0xCD, 0x9B, 0x37, 0xEC, 0xD9, 0xB3, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x78, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x3C, 0x30, 0x60, 0xCD, 0x9B, 0x1C, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0xCD, 0xB3, 0x67, 0x8D, 0x9B, 0x33, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xBF, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0xCD, 0xDB, 0xB7, 0xED, 0xD9, 0xB3, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6F, 0x98, 0x30, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x79, 0x9B, 0x36, 0x6E, 0xDB, 0x9E, 0x06, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0xF9, 0x9B, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x79, 0x9B, 0x03, 0xC0, 0xD9, 0x9E, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0xFD, 0x68, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0xCD, 0x99, 0xE1, 0x87, 0x99, 0xB3, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0xCD, 0x9B, 0x33, 0xC3, 0x06, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0xFD, 0x98, 0x61, 0x86, 0x19, 0xBF, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x78, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x78, 0x30, 0x60, 0xC1, 0x83, 0x1E, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x20, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x00, 0xC1, 0x83, 0xE6, 0x6C, 0xD9, 0xAE, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0x19, 0x9E, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x0C, 0x19, 0xF6, 0x6C, 0xD9, 0x9D, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x01, 0xE6, 0x6F, 0xD8, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x38, 0xD9, 0x87, 0xC6, 0x0C, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xCF, 0x83, 0x3C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0xC1, 0x83, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x18, 0x30, 0x00, 0xC3, 0x83, 0x06, 0x1E, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x0C, 0x18, 0x00, 0x63, 0xC1, 0x93, 0x36, 0x38, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0xC1, 0x83, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x00, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x03, 0xE6, 0x6C, 0xDD, 0xB6, 0x60, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xDB, 0x9B, 0x06, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x01, 0x37, 0xE6, 0x0C, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x01, 0xE6, 0x07, 0x81, 0x9E, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x03, 0x36, 0x6C, 0xDB, 0x9B, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x03, 0xF0, 0x63, 0x0C, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x38, 0xC1, 0x86, 0x06, 0x0C, 0x0E, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x18, 0x30, 0x60, 0xC0, 0x03, 0x06, 0x0C, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x00, 0xE0, 0x60, 0xC0, 0xC3, 0x06, 0x38, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x20, 0xEB, 0x70, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x20, 0xE3, 0x6C, 0x5F, 0x80, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x78, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x66, 0xCC, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x30, 0x01, 0xF6, 0x2F, 0xD8, 0x1F, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x1C, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x36, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x18, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x1C, 0x28, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x00, 0xE3, 0x6C, 0x0D, 0x8E, 0x78, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x08, 0x38, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x66, 0xCC, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0x70, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x30, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xC6, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0x50, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x1C, 0x61, 0xFB, 0x07, 0xCC, 0x18, 0x3F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x03, 0xE1, 0xAF, 0xF6, 0x3F, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x3C, 0xE2, 0xC5, 0xFF, 0x36, 0x6F, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x10, 0x70, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x08, 0x38, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x18, 0x18, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x66, 0xCC, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x66, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x66, 0x01, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x08, 0x10, 0xF3, 0x06, 0x07, 0x84, 0x08, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x1C, 0x6C, 0xC1, 0x87, 0xC6, 0x0F, 0x33, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x66, 0xCC, 0xF0, 0xC7, 0xE3, 0x1F, 0x8C, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0xE1, 0xA3, 0x47, 0xAC, 0xDB, 0xF3, 0x03, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x0E, 0x30, 0x60, 0xC7, 0xE3, 0x06, 0x0C, 0x70, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x06, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x0C, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x0C, 0x30, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x0C, 0x30, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x77, 0xB8, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x77, 0xB8, 0x03, 0x37, 0x6F, 0xDB, 0xB3, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x18, 0xF3, 0x63, 0x40, 0x1F, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x3C, 0xCD, 0x99, 0xE0, 0x0F, 0xC0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x00, 0x30, 0x00, 0xC3, 0x0C, 0x19, 0x9E, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x01, 0xE3, 0xC6, 0x0C, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x03, 0xE7, 0xC1, 0x83, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x60, 0xC1, 0x83, 0x71, 0xA0, 0x86, 0x0F, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x60, 0xC1, 0x83, 0x67, 0xC5, 0x9F, 0x06, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x30, 0x00, 0xC1, 0x87, 0x8F, 0x0C, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0xCB, 0x3C, 0xCC, 0xCC, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x03, 0x33, 0x33, 0x2C, 0xF3, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x02, 0xA8, 0x05, 0x40, 0x2A, 0x80, 0x54, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x92, 0x90, 0x94, 0x94, 0x84, 0xA4, 0xA4, 0x24, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x20, 0x40, 0x8F, 0x02, 0x04, 0x08, 0x10, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x07, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9D, 0x0A, 0x14, 0x28, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x28, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x07, 0xC0, 0x9D, 0x0A, 0x14, 0x28, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9F, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x0F, 0x02, 0x04, 0x08, 0x10, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x20, 0x40, 0x81, 0xE0, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE0, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x04, 0x08, 0x10, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x20, 0x40, 0x81, 0xE2, 0x04, 0x08, 0x10, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE2, 0x04, 0x08, 0x10, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x28, 0x50, 0xA1, 0x42, 0xE5, 0x0A, 0x14, 0x28, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x28, 0x50, 0xA1, 0x72, 0x07, 0xC0, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x01, 0xF2, 0x05, 0xCA, 0x14, 0x28, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1F, 0xC0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1D, 0xCA, 0x14, 0x28, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x28, 0x50, 0xA1, 0x72, 0x05, 0xCA, 0x14, 0x28, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1D, 0xCA, 0x14, 0x28, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x10, 0x20, 0x47, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC4, 0x08, 0x10, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x28, 0x50, 0xA1, 0x43, 0xE0, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC0, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x00, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x03, 0xE5, 0x0A, 0x14, 0x28, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x10, 0x20, 0x47, 0xF1, 0x1F, 0xC4, 0x08, 0x10, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x20, 0x40, 0x8F, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x01, 0xE2, 0x04, 0x08, 0x10, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x69, 0xA3, 0x46, 0x86, 0x80, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x7C, 0xCD, 0x9B, 0x66, 0x6C, 0x59, 0xB6, 0x08, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0xFD, 0x8B, 0x06, 0x0C, 0x18, 0x30, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x01, 0xB7, 0xFF, 0x6C, 0xDB, 0x36, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x01, 0xFF, 0x1B, 0x03, 0x86, 0x19, 0xFF, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x01, 0xF6, 0xCD, 0x9B, 0x1C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x01, 0xB3, 0x66, 0xCF, 0xB1, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x01, 0xEB, 0x50, 0xE1, 0x86, 0x0C, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x3C, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x1E, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x79, 0x9B, 0x37, 0xEC, 0xD9, 0x9E, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xC9, 0x33, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x79, 0x81, 0x81, 0x87, 0x99, 0x9E, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x01, 0xA4, 0xA9, 0x52, 0x9A, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x04, 0x79, 0x9B, 0x77, 0x6C, 0xCF, 0x08, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x1E, 0x61, 0x83, 0x07, 0xEC, 0x0C, 0x0F, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0xB3, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x30, 0x63, 0xF1, 0x83, 0x00, 0x3F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x00, 0x60, 0x60, 0x61, 0x86, 0x00, 0x1E, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x18, 0x61, 0x81, 0x81, 0x80, 0x1E, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x0C, 0x34, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x2C, 0x30, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x30, 0x60, 0x07, 0xE0, 0x06, 0x0C, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x6B, 0xB0, 0x03, 0x5D, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x79, 0x9B, 0x33, 0xC0, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x0E, 0x18, 0x30, 0x60, 0xCD, 0x8F, 0x06, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x00, 0xF1, 0xB3, 0x66, 0xCD, 0x80, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x00, 0x71, 0x30, 0xC3, 0x0F, 0x80, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0xF9, 0xF3, 0xE7, 0xC0, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/util.cpp b/wled00/util.cpp index f3c1b31825..ce62121e06 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -162,6 +162,52 @@ bool isAsterisksOnly(const char* str, byte maxLen) return (str[0] != 0); //false on empty string } +/* + UTF-8 to unicode onversion: + 1 byte: 0xxxxxxx: U+0000 - U+007F + 2 bytes: 110xxxxx 10xxxxxx: U+0080 - U+07FF + 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx: U+0800 - U+FFFF + 4 bytes: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx: U+10000 - U+10FFFFc +*/ +#define UTF8_LEN(c) ((c) < 0x80 ? 1 : ((c) < 0xE0 ? 2 : ((c) < 0xF0 ? 3 : 4))) // determine UTF-8 sequence length from first byte + +uint32_t utf8_decode(const char *s, uint8_t *len) +{ + uint8_t c = (uint8_t)s[0]; + if (c == '\0') { + *len = 0; // null terminator, no code point + return 0; + } + uint8_t n = UTF8_LEN(c); // number of bytes in this UTF-8 sequence + uint32_t cp = c; + *len = n; // return byte count to caller + if (n > 1) { + // check if there are enough continuation bytes + if (strlen(s) < n) { + *len = 1; // invalid sequence, return default char + return '?'; + } + cp &= (1U << (8 - n)) - 1; // mask off the UTF-8 prefix bits (110, 1110, 11110) + for (uint8_t i = 1; i < n; i++) + cp = (cp << 6) | (s[i] & 0x3F); // Each continuation byte has the form: 10xxxxxx, the lower 6 bits are appended to the code point. + // note: no error checking is done, if the input strint is invalid, it will return invalid code points. could check and return '?' but what to do with a malformed string? + } + + return cp; +} + +// Count the number of UTF-8 characters in a string +size_t utf8_strlen(const char *s) +{ + size_t len = 0; + while (*s != '\0') { + uint8_t charLen; + utf8_decode(s, &charLen); // decode the UTF-8 character to get its length + s += charLen; // advance by the length of the current UTF-8 character + len++; + } + return len; +} //threading/network callback details: https://github.com/wled-dev/WLED/pull/2336#discussion_r762276994 bool requestJSONBufferLock(uint8_t moduleID) From 0ae6fbb3119174482767ee08aab7923f37bf697d Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 14 Feb 2026 16:53:06 +0100 Subject: [PATCH 02/33] full refactoring, partially working --- wled00/FX.cpp | 232 +++++++++++-------- wled00/FX.h | 46 +++- wled00/FX_2Dfcn.cpp | 549 +++++++++++++++++++++++++++++++------------- 3 files changed, 563 insertions(+), 264 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 65d9726bcb..96d4200872 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6314,52 +6314,30 @@ void mode_2Dscrollingtext(void) { const int cols = SEG_W; const int rows = SEG_H; - uint8_t letterHeight; - uint8_t letterWidth; - uint8_t letterSpacing; + uint8_t letterHeight = 8; // Default + uint8_t letterWidth = 5; + uint8_t letterSpacing = 1; const uint8_t* selectedFont = nullptr; - static File fontFile; // TODO: come up with a good plan, maybe even support multiple files? could do it like image FX. Multi instance can be added if needed (still possible with built in fonts) + char fileName[32]; bool useCustomFont = SEGMENT.check2; uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); - // use custom font from file if check2 is enabled and file exists + + FontHelper fontHelper(&SEGMENT); + if (useCustomFont) { - while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait - // Serial.print(F("Looking for font file: ")); - char fileName[16]; strcpy_P(fileName, PSTR("/font")); - if (fontNum) sprintf(fileName +5, "%d", fontNum); // append font type to file name, e.g. /font1.wbf + if (fontNum) sprintf(fileName +5, "%d", fontNum); strcat_P(fileName, PSTR(".wbf")); - //Serial.println(fileName); - if (WLED_FS.exists(fileName)) { // TODO: this is slow (~20ms(?)) maybe cache result? with this line: 9.5fps (3 segments), without: 9.5fps, so does not matter... open and close is the slow part. - // Serial.print(F(" file found ")); - //if(!fontFile) - fontFile = WLED_FS.open(fileName); - if (fontFile) { - if (fontFile.read() == 'W') { // check file header - // Serial.println(F(" Valid magic byte found")); - letterHeight = fontFile.read(); // font glyph height in pixels - letterWidth = fontFile.read()* 5 / 7; // max glyph width in pixels //!!! must load the width table and use actual glyph width, this is just a test hack - letterSpacing = fontFile.read(); // spacing between characters - /* - fontFile.seek(0); // reset file pointer to the beginning for later use in drawChar() - // print first 500 bytes of the file - for (int i = 0; i < 500; i++) { - Serial.print(fontFile.read(), DEC); - Serial.print(" "); - }*/ - } else { - fontFile.close(); - useCustomFont = false; // invalid file header, fallback to built-in font - } - } + + if (WLED_FS.exists(fileName)) { + fontHelper.setFont(nullptr, fileName); + } else { + useCustomFont = false; } - else return; // font file not found, do not run the effect for now - //else - //Serial.println(F("Font file not found, using built-in font")); } + if (!useCustomFont) { - return; // TODO: !!! remvoe debug switch (fontNum) { default: case 0: selectedFont = console_font_4x6; break; @@ -6368,24 +6346,22 @@ void mode_2Dscrollingtext(void) { case 3: selectedFont = console_font_7x9; break; case 4: selectedFont = console_font_5x12; break; } - // extract dimensions from the header (see font files for details) + fontHelper.setFont(selectedFont, nullptr); letterHeight = pgm_read_byte_near(&selectedFont[1]); letterWidth = pgm_read_byte_near(&selectedFont[2]); } - - unsigned rotLW, rotLH; + // letters are rotated const int8_t rotate = map(SEGMENT.custom3, 0, 31, -2, 2); - if (rotate == 1 || rotate == -1) { - rotLH = letterWidth; - rotLW = letterHeight; - } else { - rotLW = letterWidth; - rotLH = letterHeight; - } - + + // Text preparation (Time/Date logic) char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'}; - size_t result_pos = 0; + size_t result_pos = 0; // ... (Prepare text) + // Re-use the existing text generation logic from previous implementation + // We need to copy it or re-implement it. + // I will re-implement the short version of the logic here or I should have copied it. + // Since I am replacing the whole function, I must include the text generation logic. + char sec[5]; int AmPmHour = hour(localTime); bool isitAM = true; @@ -6398,26 +6374,23 @@ void mode_2Dscrollingtext(void) { } size_t len = 0; - if (SEGMENT.name) len = strlen(SEGMENT.name); // note: SEGMENT.name is limited to WLED_MAX_SEGNAME_LEN - if (len == 0) { // fallback if empty segment name: display date and time + if (SEGMENT.name) len = strlen(SEGMENT.name); + if (len == 0) { sprintf_P(text, PSTR("%s %d, %d %d:%02d%s"), monthShortStr(month(localTime)), day(localTime), year(localTime), AmPmHour, minute(localTime), sec); } else { size_t i = 0; while (i < len) { if (SEGMENT.name[i] == '#') { - char token[7]; // copy up to 6 chars + null terminator - bool zero = false; // a 0 suffix means display leading zeros + char token[7]; + bool zero = false; size_t j = 0; while (j < 6 && i + j < len) { token[j] = std::toupper(SEGMENT.name[i + j]); - if(token[j] == '0') - zero = true; // 0 suffix found. Note: there is an edge case where a '0' could be part of a trailing text and not the token, handling it is not worth the effort + if(token[j] == '0') zero = true; j++; } token[j] = '\0'; - int advance = 5; // number of chars to advance in 'text' after processing the token - - // Process token + int advance = 5; char temp[32]; if (!strncmp_P(token,PSTR("#DATE"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d.%04d"):PSTR("%d.%d.%d"), day(localTime), month(localTime), year(localTime)); else if (!strncmp_P(token,PSTR("#DDMM"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d") :PSTR("%d.%d"), day(localTime), month(localTime)); @@ -6435,32 +6408,74 @@ void mode_2Dscrollingtext(void) { else if (!strncmp_P(token,PSTR("#MO"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), month(localTime)); advance = 3; } else if (!strncmp_P(token,PSTR("#DAY"),4)) { sprintf (temp, ("%s") , dayShortStr(weekday(localTime))); advance = 4; } else if (!strncmp_P(token,PSTR("#DD"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), day(localTime)); advance = 3; } - else { temp[0] = '#'; temp[1] = '\0'; zero = false; advance = 1; } // Unknown token, just copy the # - - if(zero) advance++; // skip the '0' suffix + else { temp[0] = '#'; temp[1] = '\0'; zero = false; advance = 1; } + + if(zero) advance++; size_t temp_len = strlen(temp); if (result_pos + temp_len < WLED_MAX_SEGNAME_LEN) { strcpy(text + result_pos, temp); result_pos += temp_len; } - i += advance; - } - else { - if (result_pos < WLED_MAX_SEGNAME_LEN) { - text[result_pos++] = SEGMENT.name[i++]; // no token, just copy char - } else - break; // buffer full + } else { + if (result_pos < WLED_MAX_SEGNAME_LEN) text[result_pos++] = SEGMENT.name[i++]; + else break; } } } + // PREPARE FONT CACHE + if (useCustomFont) { + if (strpbrk(text, "0123456789")) fontHelper.setCacheNumbers(true); // Optimize for clocks + while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait + } + fontHelper.prepare(text); + + if (useCustomFont && SEGMENT.data) { + FontHeader* header = (FontHeader*)SEGMENT.data; + letterHeight = header->height; + letterSpacing = header->spacing; + letterWidth = header->maxW; + } + + unsigned rotLW, rotLH; + if (rotate == 1 || rotate == -1) { + rotLH = letterWidth; + rotLW = letterHeight; + } else { + rotLW = letterWidth; + rotLH = letterHeight; + } + const int numberOfChars = utf8_strlen(text); -// Serial.printf("Text to display: '%s' (length: %d chars)\n", text, numberOfChars); - int width = (numberOfChars * rotLW); // TODO: for variable width fonts calculate the actual width of the text instead of assuming fixed width + + // Calculate total width using variable width + int totalTextWidth = 0; + int idx = 0; + for (int c = 0; c < numberOfChars; c++) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[idx], &charLen); + idx += charLen; + uint8_t w = fontHelper.getCharacterWidth(unicode); + totalTextWidth += (rotate == 1 || rotate == -1) ? letterHeight : w; // if rotated +/-90, width is height + if (c < numberOfChars - 1) totalTextWidth += letterSpacing; + } + // If rotated, the "width" of the text string is actually dependent on orientation? + // Previous code: `int width = (numberOfChars * rotLW);` + // If rotated +/-90, rotLW = letterHeight. + // So it assumed fixed height as width. + // If variable width font is rotated 90 deg, the "height" of the char becomes its width in the string. + // "letterHeight" is constant for the font. So `maxW` doesn't matter for 90deg rotation? + // Yes, if rotated 90deg, the character takes `letterHeight` pixels horizontally. + + if (rotate == 1 || rotate == -1) { + totalTextWidth = numberOfChars * (letterHeight + letterSpacing); // Fixed vertical size + } + int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-rotLH)/2; - if (width <= cols) { - // scroll vertically (e.g. ^^ Way out ^^) if it fits + + if (totalTextWidth <= cols) { + // scroll vertically int speed = map(SEGMENT.speed, 0, 255, 5000, 1000); int frac = strip.now % speed + 1; if (SEGMENT.intensity == 255) { @@ -6471,47 +6486,64 @@ void mode_2Dscrollingtext(void) { } if (SEGENV.step < strip.now) { - // calculate start offset - if (width > cols) { + if (totalTextWidth > cols) { if (SEGMENT.check3) { - if (SEGENV.aux0 == 0) SEGENV.aux0 = width + cols - 1; + if (SEGENV.aux0 == 0) SEGENV.aux0 = totalTextWidth + cols - 1; else --SEGENV.aux0; - } else ++SEGENV.aux0 %= width + cols; - } else SEGENV.aux0 = (cols + width)/2; - ++SEGENV.aux1 &= 0xFF; // color shift - SEGENV.step = strip.now + map(SEGMENT.speed, 0, 255, 250, 50); // shift letters every ~250ms to ~50ms + } else ++SEGENV.aux0 %= totalTextWidth + cols; + } else SEGENV.aux0 = (cols + totalTextWidth)/2; + ++SEGENV.aux1 &= 0xFF; + SEGENV.step = strip.now + map(SEGMENT.speed, 0, 255, 250, 50); } - SEGMENT.fade_out(255 - (SEGMENT.custom1>>4)); // trail + SEGMENT.fade_out(255 - (SEGMENT.custom1>>4)); uint32_t col1 = SEGMENT.color_from_palette(SEGENV.aux1, false, PALETTE_SOLID_WRAP, 0); uint32_t col2 = BLACK; - // if gradient is selected and palette is default (0) drawCharacter() uses gradient from SEGCOLOR(0) to SEGCOLOR(2) - // otherwise col2 == BLACK means use currently selected palette for gradient - // if gradient is not selected set both colors the same - if (SEGMENT.check1) { // use gradient - if (SEGMENT.palette == 0) { // use colors for gradient + if (SEGMENT.check1) { + if (SEGMENT.palette == 0) { col1 = SEGCOLOR(0); col2 = SEGCOLOR(2); } - } else col2 = col1; // force characters to use single color (from palette) - - int idx = 0; + } else col2 = col1; + // Drawing Loop + idx = 0; // Reset index for UTF8 + int currentXOffset = 0; + for (int c = 0; c < numberOfChars; c++) { - int xoffset = int(cols) - int(SEGENV.aux0) + ((rotLW+2)*c); // TODO: +1 is fixed, need something better - if (xoffset + rotLW < 0) continue; // don't draw characters off-screen uint8_t charLen; - uint32_t unicode = utf8_decode(&text[idx], &charLen); // decode the UTF-8 character - //Serial.printf("charlen: %d, unicode: %u, xoffset: %d\n", charLen, unicode, xoffset); - idx += charLen; // advance by the length of the current UTF-8 character - SEGMENT.drawCharacter(unicode, xoffset, yoffset, selectedFont, fontFile, col1, col2, rotate); - } - if (useCustomFont) fontFile.close(); // TODO: check if this is fast enough opening and closing plus parsing each frame. -> without closing, fps go from 9.5fps to 17fps, maybe better to cache the whole word and only update if changed? -// it can be 64 chars max, each char in normal use is below 32x32 or 128bytes, so 8k per segment absolut max, probably more like 4k and this is not for 8266 terretory. -// but that only works for text, not for clock. so would need to cache numbers 0-9 always. that is another 1k -// or: cache currently visible glyphs only, reload if new char appears. add complexity but could still be way faster than rendering each glyph from file each frame. -//single segment is still fast though, 60fps, with file exists check and open and close: drops to 23fps... cachig may be a good option, can put it in FX data as: charmap, bitmap combo to look it up quickly. -// although that may result in frame hickups whenever the file is being cached... psram would really solve it for good, could just drop the whole font in there. + uint32_t unicode = utf8_decode(&text[idx], &charLen); + idx += charLen; + + uint8_t glyphWidth = fontHelper.getCharacterWidth(unicode); + uint8_t spacing = letterSpacing; + + // Effective width for layout + int advance = 0; + + int drawX = 0; + + if (rotate == 1 || rotate == -1) { + // Vertical text? + // If rotated 90deg, the text is still horizontal but letters are sideways? + // Previous logic: `xoffset = int(cols) - int(SEGENV.aux0) + ((rotLW+2)*c);` + // `rotLW` was `letterHeight`. + // So it advanced by `letterHeight+2`. + // I will match this logic. + advance = letterHeight + spacing; + drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; + currentXOffset += advance; + } else { + advance = glyphWidth + spacing; + drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; + currentXOffset += advance; + } + + if (drawX + ((rotate == 1 || rotate == -1) ? letterHeight : glyphWidth) < 0) continue; + if (drawX >= cols) continue; + + fontHelper.drawCharacter(unicode, drawX, yoffset, col1, col2, rotate); + } } static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Custom Font,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; diff --git a/wled00/FX.h b/wled00/FX.h index 1b17c2e921..bbd1d4d96b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -273,6 +273,50 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) +// Font Helper Class +// Registry entry for the RAM cache +struct GlyphEntry { + uint8_t code; // 0-255 index, same as in font + uint8_t width; + uint8_t height; + uint8_t padding; // padding is added anyway, might as well indicate it for future use +}; + +// Header for the RAM cache +struct FontHeader { + uint32_t firstUnicode; // from font file + uint8_t glyphCount; + uint8_t height; + uint8_t spacing; + uint8_t maxW; + uint8_t first; // from font file + uint8_t last; // from font file + uint8_t cachedCodes[64]; // The "Checklist" to see if we need a rebuild, max string length of 64 + // GlyphEntry registry[glyphCount]; // Variable length + // uint8_t bitmapData[]; // Variable length +}; + +class FontHelper { + public: + FontHelper(Segment* seg) : _segment(seg), _flashFont(nullptr), _fileFont(nullptr) {} + + void setFont(const uint8_t* flashFont, const char* filename); + void setCacheNumbers(bool cache) { _cacheNumbers = cache; } // If set, always cache digits 0-9 + void prepare(const char* text); + uint8_t getCharacterWidth(uint32_t code); + void drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); + + private: + Segment* _segment; + const uint8_t* _flashFont; + const char* _fileFont; + bool _cacheNumbers = false; + + void rebuildCache(const char* text); + int32_t getGlyphIndex(uint32_t unicode, const FontHeader* header); +}; + + // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 //gap fill #define FX_MODE_2DCRAZYBEES 119 //gap fill @@ -424,6 +468,7 @@ class WS2812FX; // segment, 76 bytes class Segment { public: + friend class FontHelper; // Allow FontHelper to access protected members uint32_t colors[NUM_COLORS]; uint16_t start; // start index / start X coordinate 2D (left) uint16_t stop; // stop index / stop X coordinate 2D (right); segment is invalid if stop == 0 @@ -770,7 +815,6 @@ class Segment { void drawCircle(uint16_t cx, uint16_t cy, uint8_t radius, uint32_t c, bool soft = false) const; void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, uint32_t c, bool soft = false) const; void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c, bool soft = false) const; - void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) const; void wu_pixel(uint32_t x, uint32_t y, CRGB c) const; inline void drawCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { drawCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { fillCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 8e6ee674f2..f4e5d08007 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -559,169 +559,7 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3 } } -// draws a raster font character on canvas -// only supports: 4x6=24, 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM -/* -void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, int8_t rotate) const { - if (!isActive()) return; // not active - if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported - chr -= 32; // align with font table entries - const int font = w*h; - - // if col2 == BLACK then use currently selected palette for gradient otherwise create gradient from color and col2 - CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; // selected palette as gradient - - for (int i = 0; i= (int)vWidth() || y0 < 0 || y0 >= (int)vHeight()) continue; // drawing off-screen - if (((bits>>(j+(8-w))) & 0x01)) { // bit set - setPixelColorXYRaw(x0, y0, c.color32); - } - } - } -}*/ -#define FONT_MAGIC_BYTE 0x57 // 'W' for WLED -#define FONT_HEADER_SIZE 11 // size of font header in bytes -#define LAST_ASCII_CHAR 126 // last ASCII character supported by font (currently hardcoded, could be made dynamic in future) - -void Segment::drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2, int8_t rotate) const { - if (!isActive() || (fontData == nullptr && !fontFile)) return; - //if (pgm_read_byte_near(&fontData[0]) != FONT_MAGIC_BYTE) return; // Check for Magic 'W' TODO: do this in FX not here? - uint8_t w, h, space, first, last, flags; - uint32_t lastUnicode = 0; // will be calculated based on first unicode char and number of glyphs - - fontFile.seek(1); // skip magic byte (already checked) - h = fontFile.read(); - w = fontFile.read(); // max width, (currently not used but could be used to pre allocate a buffer) - space = fontFile.read(); // spacing between characters - flags = fontFile.read(); - first = fontFile.read(); - last = fontFile.read(); - uint32_t firstUnicode; - fontFile.read((uint8_t *)&firstUnicode,4); // first unicode char in this font - if (firstUnicode > 0 && last > LAST_ASCII_CHAR) { - lastUnicode = firstUnicode + (last - LAST_ASCII_CHAR - 1); // calculate last unicode char based on first unicode char and number of glyphs - } - /* - Serial.print("Font Metadata: w="); Serial.print(w, DEC); - Serial.print(" h="); Serial.print(h, DEC); - Serial.print(" flags="); Serial.print(flags, BIN); - Serial.print(" first="); Serial.print(first, DEC); - Serial.print(" last="); Serial.print(last, DEC); - Serial.print(" firstUnicode="); Serial.println(firstUnicode, DEC);*/ - uint8_t numGlyphs = last - first + 1; - - uint8_t widthTable[numGlyphs]; // max 256 characters, each with its own width (if flags & 0x01) - for (int i = 0; i < numGlyphs; i++) { - widthTable[i] = fontFile.read(); - // Serial.print("Width of char "); Serial.print(first + i, DEC); Serial.print(": "); Serial.println(widthTable[i], DEC); - } - - // print first 500 bytes of the file - // for (int i = 0; i < 500; i++) { -//Serial.print(fontFile.read(), DEC); - // Serial.print(" "); - // } - - // read font metadata from header - /* - h = pgm_read_byte_near(&fontData[1]); - w = pgm_read_byte_near(&fontData[2]); - flags = pgm_read_byte_near(&fontData[3]); - first = pgm_read_byte_near(&fontData[4]); - last = pgm_read_byte_near(&fontData[5]); -*/ - if (unicode < first) return; - if (unicode > LAST_ASCII_CHAR) { - if (unicode > lastUnicode || unicode < firstUnicode) { - unicode = '?'; // unicode is in extended range ad not supported by this font, draw a '?' - } - else { - unicode = unicode - firstUnicode + LAST_ASCII_CHAR + 1; // unicode is in extended range and supported by this font, calculate the corresponding font character index - } - } - - uint16_t chrIdx = unicode - first; - - CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; // TODO: move this to FX and pass the palette - //const uint8_t* bitmapData = fontData + 10; // data starts after 10-byte header TODO: add skip over width table if present (flags & 0x01) - - // calculate offset by counting bytes for each glyph - uint32_t bitmapDataOffset = FONT_HEADER_SIZE + numGlyphs; // start of bitmap data (after header and width table) - for (int i = 0; i < chrIdx; i++) { - uint32_t numbits = widthTable[i] * h; - uint32_t numbytes = (numbits + 7) / 8; // Calculate padding-inclusive byte size - bitmapDataOffset += numbytes; - } - - // bytes per glyph - w = widthTable[chrIdx]; // actual width of this character - uint16_t bitsPerChar = (uint32_t)w * h; // todo use 16bit math make sure large fonts do not overflow - uint16_t bytesPerChar = (bitsPerChar + 7) / 8; // Calculate padding-inclusive byte size - //Serial.printf("Drawing char %u (index %u): w=%u, h=%u, bits=%u, bytes=%u\n", unicode, chrIdx, widthTable[chrIdx], h, bitsPerChar, bytesPerChar); - - // Jump to the start of this specific character's data block - //const uint8_t* charData = bitmapData + (chrIdx * bytesPerChar); - uint8_t charData[bytesPerChar]; - fontFile.seek(bitmapDataOffset); // Move file pointer to the character's bitmap data (skip header and width table) - fontFile.read(charData, bytesPerChar); // Read the character's bitmap data into - // draw glyph from top left to bottom right, row by row (packed format is MSB-first) - uint16_t bitIndex = 0; - for (int i = 0; i < h; i++) { // glyph height - CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); // NOBLEND is faster - - for (int j = 0; j < w; j++) { // glyph width - uint16_t bytePos = bitIndex >> 3; // locate the byte and the specific bit - uint8_t bitPos = 7 - (bitIndex & 0x07); // MSB-first bit position within the byte - //uint8_t byteVal = pgm_read_byte_near(&charData[bytePos]); - uint8_t byteVal = charData[bytePos]; - bool bitSet = (byteVal >> bitPos) & 1; - bitIndex++; - - if (bitSet) { - int x0, y0; - // Rotation Logic - /* - switch (rotate) { - case -1: x0 = x + (h-1) - i; y0 = y + (w-1) - j; break; // -90 deg - case -2: - case 2: x0 = x + j; y0 = y + (h-1) - i; break; // 180 deg - case 1: x0 = x + i; y0 = y + j; break; // +90 deg - default: x0 = x + (w-1) - j; y0 = i + y; break; // no rotation - }*/ - switch (rotate) { - case -1: x0 = x + (h-1) - i; y0 = y + j; break; // -90 deg - case -2: - case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; // 180 deg - case 1: x0 = x + i; y0 = y + (w-1) - j; break; // +90 deg - default: x0 = x + j; y0 = y + i; break; // No rotation - } - - if (x0 >= 0 && x0 < (int)vWidth() && y0 >= 0 && y0 < (int)vHeight()) { - setPixelColorXYRaw(x0, y0, c.color32); - } - } - } - } -} +// Segment::wu_pixel implementation is next #define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8)) void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu_pixel procedure by reddit u/sutaburosu @@ -746,3 +584,388 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #undef WU_WEIGHT #endif // WLED_DISABLE_2D +#define LAST_ASCII_CHAR 126 +// FontHelper implementation +void FontHelper::setFont(const uint8_t* flashFont, const char* filename) { + _flashFont = flashFont; + _fileFont = filename; +} + +// Helper to get glyph index from unicode +int32_t FontHelper::getGlyphIndex(uint32_t unicode, const FontHeader* header) { + if (!header) return -1; + if (unicode < header->first) return -1; + + // ASCII Range + if (unicode <= LAST_ASCII_CHAR) { + if (unicode <= header->last) { + return unicode - header->first; + } + } + // Extended Range + else { + if (header->firstUnicode > 0 && unicode >= header->firstUnicode) { + uint32_t lastUni = header->firstUnicode + (header->last - LAST_ASCII_CHAR - 1); + if (unicode <= lastUni) { + // Corrected formula: (VirtualIndex) - First + return (unicode - header->firstUnicode + LAST_ASCII_CHAR + 1) - header->first; + } + } + } + + return -1; +} + +void FontHelper::prepare(const char* text) { + if (_flashFont) return; // PROGMEM fonts don't need preparation + if (!_fileFont) return; + if (!text) return; + + // Ensure data loaded for header + if (!_segment->data) { + rebuildCache(text); // Load header + if (!_segment->data) return; // Failed + } + + uint8_t neededCodes[64]; // Max unique chars + uint8_t neededCount = 0; + FontHeader* header = (FontHeader*)_segment->data; + + // 0. Pre-add numbers if requested (Matrix/Clock mode) + if (_cacheNumbers) { + const char* nums = "0123456789:. "; + for (const char* p = nums; *p; p++) { + int32_t idx = getGlyphIndex((uint32_t)*p, header); + if (idx >= 0 && idx < 256) { + neededCodes[neededCount++] = (uint8_t)idx; + } + } + } + + // 1. Decode text and find needed codes + size_t len = strlen(text); + size_t i = 0; + + while (i < len) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[i], &charLen); + i += charLen; + + int32_t index = getGlyphIndex(unicode, header); + + if (index < 0) { + // Fallback to '?' + index = getGlyphIndex('?', header); + } + + if (index >= 0 && index < 256) { + // Check if we already marked this code as needed + bool alreadyNeeded = false; + for (int k=0; kglyphCount; c++) { + if (header->cachedCodes[c] == neededCodes[k]) { + found = true; + break; + } + } + if (!found) { + allCached = false; + break; + } + } + + if (!allCached) { + rebuildCache(text); + } +} + +void FontHelper::rebuildCache(const char* text) { + if (!_fileFont) return; + + File file = WLED_FS.open(_fileFont, "r"); + // Fallback logic for missing fonts + if (!file) { + // List of fallback fonts to try + // User requested: font.wbf, font1.wbf ... font4.wbf + const char* fallbackFonts[] = { "/font.wbf", "/font0.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf", "/font5.wbf" }; + + for (int i = 0; i < 7; i++) { + // Don't try the same file again if it was the initial request + if (strncmp(_fileFont, fallbackFonts[i], 15) == 0) continue; + + file = WLED_FS.open(fallbackFonts[i], "r"); + if (file) { + break; + } + } + } + + if (!file) return; + + // Read header + if (file.read() != 'W') { file.close(); return; } // Magic + + FontHeader tempHeader; + tempHeader.height = file.read(); + uint8_t maxWidth = file.read(); + tempHeader.maxW = maxWidth; + tempHeader.spacing = file.read(); + uint8_t flags = file.read(); + tempHeader.first = file.read(); + tempHeader.last = file.read(); + file.read((uint8_t*)&tempHeader.firstUnicode, 4); + + // Identify unique codes needed + uint8_t neededCodes[64]; + uint8_t neededCount = 0; + + // 0. Pre-add numbers if requested (Matrix/Clock mode) + if (_cacheNumbers) { + const char* nums = "0123456789:. "; + for (const char* p = nums; *p; p++) { + int32_t idx = getGlyphIndex((uint32_t)*p, &tempHeader); + if (idx >= 0 && idx < 256) { + neededCodes[neededCount++] = (uint8_t)idx; + } + } + } + + size_t len = strlen(text); + size_t i = 0; + while (i < len) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[i], &charLen); + i += charLen; + + int32_t index = getGlyphIndex(unicode, &tempHeader); + + if (index < 0) { + index = getGlyphIndex('?', &tempHeader); + } + + if (index >= 0 && index < 256) { + // Add unique + bool known = false; + for (int k=0; k= numGlyphs) { + bitmapSizes[k] = 0; + continue; + } + + // Calculate file offset for this code + uint32_t offset = fileDataStart; + for (int j=0; jallocateData(totalRam)) { + file.close(); + return; + } + + // Write Header + uint8_t* ptr = _segment->data; + memcpy(ptr, &tempHeader, sizeof(FontHeader)); + ptr += sizeof(FontHeader); + + // Write Registry + GlyphEntry* registry = (GlyphEntry*)ptr; + ptr += neededCount * sizeof(GlyphEntry); + + uint8_t* bitmapDst = ptr; + + for (int k=0; k 0) { + file.seek(fileOffsets[k]); + file.read(bitmapDst, bitmapSizes[k]); + bitmapDst += bitmapSizes[k]; + } + } + + file.close(); +} + +uint8_t FontHelper::getCharacterWidth(uint32_t code) { + if (_flashFont) { + // Flash font fallback + // TODO: Support variable width flash fonts if flags indicate it + return pgm_read_byte_near(&_flashFont[2]); + } + + if (_segment->data) { + FontHeader* header = (FontHeader*)_segment->data; + int32_t index = getGlyphIndex(code, header); + + if (index >= 0) { + // Find in registry + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); + for (int k=0; kglyphCount; k++) { + if (registry[k].code == (uint8_t)index) { + return registry[k].width; + } + } + } + } + return 0; +} + +void FontHelper::drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { + uint8_t w = 0, h = 0; + uint8_t* val = nullptr; // pointer to bitmap data (RAM or Flash) + // For file fonts, we need to read from file into buffer. + // For flash fonts, we point directly to PROGMEM. + + // To unify, we need a way to get the bitmap for the specific glyph. + // Flash: assumed fixed width for now (but user wants future proof). + // Let's stick to current Flash logic but use getGlyphIndex if possible? + // Flash fonts don't have a FontHeader struct in RAM easily to pass to getGlyphIndex. + // We'd need to construct a temp one or overload getGlyphIndex. + + if (_flashFont) { + const uint8_t* font = _flashFont; + h = pgm_read_byte_near(&font[1]); + w = pgm_read_byte_near(&font[2]); + + // TODO: proper mapping for flash fonts? They usually just support ASCII 32-126 + if (code < 32 || code > 126) return; + uint8_t chr = code - 32; + + CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; + + for (int i = 0; i < h; i++) { + uint8_t row = pgm_read_byte_near(&font[(chr * h) + i + 3]); + + CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); + for (int j = 0; j < w; j++) { + if ((row >> (7-j)) & 1) { + int x0, y0; + switch (rotate) { + case -1: x0 = x + (h-1) - i; y0 = y + j; break; + case -2: + case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; + case 1: x0 = x + i; y0 = y + (w-1) - j; break; + default: x0 = x + j; y0 = y + i; break; + } + if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { + _segment->setPixelColorXYRaw(x0, y0, c.color32); + } + } + } + } + return; + } + + // File Font Logic + if (!_segment->data) return; + FontHeader* header = (FontHeader*)_segment->data; + + int32_t index = getGlyphIndex(code, header); + if (index < 0) return; + + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); + GlyphEntry* entry = nullptr; + uint32_t bitmapOffset = 0; + + for (int k=0; kglyphCount; k++) { + if (registry[k].code == (uint8_t)index) { + entry = ®istry[k]; + break; + } + uint16_t bits = registry[k].width * registry[k].height; + bitmapOffset += (bits + 7) / 8; + } + + if (!entry) return; + + uint8_t* bitmap = _segment->data + sizeof(FontHeader) + (header->glyphCount * sizeof(GlyphEntry)) + bitmapOffset; + w = entry->width; + h = entry->height; + CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; + + uint16_t bitIndex = 0; + for (int i = 0; i < h; i++) { + CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); + for (int j = 0; j < w; j++) { + uint16_t bytePos = bitIndex >> 3; + uint8_t bitPos = 7 - (bitIndex & 7); + uint8_t byteVal = bitmap[bytePos]; + bool bitSet = (byteVal >> bitPos) & 1; + bitIndex++; + + if (bitSet) { + int x0, y0; + switch (rotate) { + case -1: x0 = x + (h-1) - i; y0 = y + j; break; + case -2: + case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; + case 1: x0 = x + i; y0 = y + (w-1) - j; break; + default: x0 = x + j; y0 = y + i; break; + } + if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { + _segment->setPixelColorXYRaw(x0, y0, c.color32); + } + } + } + } +} \ No newline at end of file From e1ae3e2a5c18cb92ee512db78059afc653fa0017 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 14 Feb 2026 17:47:43 +0100 Subject: [PATCH 03/33] refactoring, fixed some bugs --- wled00/FX.cpp | 19 +++---- wled00/FX.h | 12 ++-- wled00/FX_2Dfcn.cpp | 130 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 119 insertions(+), 42 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 96d4200872..1ecee5850d 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6323,16 +6323,15 @@ void mode_2Dscrollingtext(void) { bool useCustomFont = SEGMENT.check2; uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); - FontHelper fontHelper(&SEGMENT); + FontManager fontManager(&SEGMENT); + bool init = (SEGENV.call == 0); if (useCustomFont) { strcpy_P(fileName, PSTR("/font")); if (fontNum) sprintf(fileName +5, "%d", fontNum); strcat_P(fileName, PSTR(".wbf")); - if (WLED_FS.exists(fileName)) { - fontHelper.setFont(nullptr, fileName); - } else { + if (!fontManager.loadFont(fileName, nullptr, init)) { useCustomFont = false; } } @@ -6346,7 +6345,7 @@ void mode_2Dscrollingtext(void) { case 3: selectedFont = console_font_7x9; break; case 4: selectedFont = console_font_5x12; break; } - fontHelper.setFont(selectedFont, nullptr); + fontManager.loadFont(nullptr, selectedFont, init); letterHeight = pgm_read_byte_near(&selectedFont[1]); letterWidth = pgm_read_byte_near(&selectedFont[2]); } @@ -6426,10 +6425,10 @@ void mode_2Dscrollingtext(void) { // PREPARE FONT CACHE if (useCustomFont) { - if (strpbrk(text, "0123456789")) fontHelper.setCacheNumbers(true); // Optimize for clocks + if (strpbrk(text, "0123456789")) fontManager.setCacheNumbers(true); // Optimize for clocks while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait } - fontHelper.prepare(text); + fontManager.prepare(text); if (useCustomFont && SEGMENT.data) { FontHeader* header = (FontHeader*)SEGMENT.data; @@ -6456,7 +6455,7 @@ void mode_2Dscrollingtext(void) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - uint8_t w = fontHelper.getCharacterWidth(unicode); + uint8_t w = fontManager.getCharacterWidth(unicode); totalTextWidth += (rotate == 1 || rotate == -1) ? letterHeight : w; // if rotated +/-90, width is height if (c < numberOfChars - 1) totalTextWidth += letterSpacing; } @@ -6515,7 +6514,7 @@ void mode_2Dscrollingtext(void) { uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - uint8_t glyphWidth = fontHelper.getCharacterWidth(unicode); + uint8_t glyphWidth = fontManager.getCharacterWidth(unicode); uint8_t spacing = letterSpacing; // Effective width for layout @@ -6542,7 +6541,7 @@ void mode_2Dscrollingtext(void) { if (drawX + ((rotate == 1 || rotate == -1) ? letterHeight : glyphWidth) < 0) continue; if (drawX >= cols) continue; - fontHelper.drawCharacter(unicode, drawX, yoffset, col1, col2, rotate); + fontManager.drawCharacter(unicode, drawX, yoffset, col1, col2, rotate); } } static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Custom Font,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; diff --git a/wled00/FX.h b/wled00/FX.h index bbd1d4d96b..515748c01f 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -291,15 +291,18 @@ struct FontHeader { uint8_t maxW; uint8_t first; // from font file uint8_t last; // from font file + char name[16]; // The requested font name (e.g. "font3.wbf") + char file[16]; // The actual file used (e.g. "font.wbf") uint8_t cachedCodes[64]; // The "Checklist" to see if we need a rebuild, max string length of 64 // GlyphEntry registry[glyphCount]; // Variable length - // uint8_t bitmapData[]; // Variable length + // uint8_t bitmapData[]; // Helper to handle font loading and drawing }; -class FontHelper { +class FontManager { public: - FontHelper(Segment* seg) : _segment(seg), _flashFont(nullptr), _fileFont(nullptr) {} + FontManager(Segment* seg) : _segment(seg), _flashFont(nullptr), _fileFont(nullptr) {} + bool loadFont(const char* filename, const uint8_t* flashFont = nullptr, bool init = false); void setFont(const uint8_t* flashFont, const char* filename); void setCacheNumbers(bool cache) { _cacheNumbers = cache; } // If set, always cache digits 0-9 void prepare(const char* text); @@ -310,6 +313,7 @@ class FontHelper { Segment* _segment; const uint8_t* _flashFont; const char* _fileFont; + const char* _fontName; // Requested font name bool _cacheNumbers = false; void rebuildCache(const char* text); @@ -468,7 +472,7 @@ class WS2812FX; // segment, 76 bytes class Segment { public: - friend class FontHelper; // Allow FontHelper to access protected members + friend class FontManager; // Allow FontManager to access protected members uint32_t colors[NUM_COLORS]; uint16_t start; // start index / start X coordinate 2D (left) uint16_t stop; // stop index / stop X coordinate 2D (right); segment is invalid if stop == 0 diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index f4e5d08007..4053744929 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -585,14 +585,58 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #endif // WLED_DISABLE_2D #define LAST_ASCII_CHAR 126 -// FontHelper implementation -void FontHelper::setFont(const uint8_t* flashFont, const char* filename) { - _flashFont = flashFont; - _fileFont = filename; +// FontManager implementation +bool FontManager::loadFont(const char* filename, const uint8_t* flashFont, bool init) { + _flashFont = flashFont; + _fontName = filename; + _fileFont = filename; + + if (flashFont) return true; + if (!filename) return false; + + // If initializing (first call), force clean slate + if (init) { + if (_segment->data) _segment->deallocateData(); + } + + // Check if cache already contains this font + if (!init && _segment->data) { + FontHeader* header = (FontHeader*)_segment->data; + // Check if requested name matches cached logic name + if (strncmp(header->name, filename, 15) == 0) { + if (header->file[0]) { + _fileFont = header->file; + } + return true; + } + } + + if (WLED_FS.exists(filename)) { + // Exists, set it (will be loaded by prepare->rebuildCache later) + return true; + } + + // Fallback logic + const char* fallbackFonts[] = { "/font.wbf", "/font0.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf" }; + + //strcpy_P(fileName, PSTR("/font")); + // if (fontNum) sprintf(fileName +5, "%d", fontNum); + // strcat_P(fileName, PSTR(".wbf")); TODO: use this not a static list! + + for (int i = 0; i < 6; i++) { + if (strcmp(filename, fallbackFonts[i]) == 0) continue; // Don't check self + if (WLED_FS.exists(fallbackFonts[i])) { + _fileFont = fallbackFonts[i]; // found! + return true; + } + } + + _fileFont = nullptr; + return false; } // Helper to get glyph index from unicode -int32_t FontHelper::getGlyphIndex(uint32_t unicode, const FontHeader* header) { +int32_t FontManager::getGlyphIndex(uint32_t unicode, const FontHeader* header) { if (!header) return -1; if (unicode < header->first) return -1; @@ -608,6 +652,9 @@ int32_t FontHelper::getGlyphIndex(uint32_t unicode, const FontHeader* header) { uint32_t lastUni = header->firstUnicode + (header->last - LAST_ASCII_CHAR - 1); if (unicode <= lastUni) { // Corrected formula: (VirtualIndex) - First + // Debug: + // int32_t idx = (unicode - header->firstUnicode + LAST_ASCII_CHAR + 1) - header->first; + // Serial.printf("getGlyphIndex: Ext U+%04X -> Idx %d\n", unicode, idx); return (unicode - header->firstUnicode + LAST_ASCII_CHAR + 1) - header->first; } } @@ -616,13 +663,15 @@ int32_t FontHelper::getGlyphIndex(uint32_t unicode, const FontHeader* header) { return -1; } -void FontHelper::prepare(const char* text) { +void FontManager::prepare(const char* text) { if (_flashFont) return; // PROGMEM fonts don't need preparation if (!_fileFont) return; if (!text) return; + // Ensure data loaded for header if (!_segment->data) { + Serial.println("FontManager: No data, rebuilding cache for header"); rebuildCache(text); // Load header if (!_segment->data) return; // Failed } @@ -650,21 +699,21 @@ void FontHelper::prepare(const char* text) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[i], &charLen); i += charLen; - + int32_t index = getGlyphIndex(unicode, header); - + if (index < 0) { // Fallback to '?' index = getGlyphIndex('?', header); } - + if (index >= 0 && index < 256) { // Check if we already marked this code as needed bool alreadyNeeded = false; for (int k=0; k Date: Sat, 14 Feb 2026 21:06:18 +0100 Subject: [PATCH 04/33] add new tiny font, remove debug output, --- wled00/FX.cpp | 7 +- wled00/json.cpp | 15 -- wled00/src/font/console_font_4x6.h | 400 +++++++++-------------------- wled00/util.cpp | 4 +- 4 files changed, 133 insertions(+), 293 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 1ecee5850d..7ae2c5e29a 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6339,7 +6339,7 @@ void mode_2Dscrollingtext(void) { if (!useCustomFont) { switch (fontNum) { default: - case 0: selectedFont = console_font_4x6; break; + case 0: selectedFont = tinypixie2_6px; break; case 1: selectedFont = console_font_5x8; break; case 2: selectedFont = console_font_6x8; break; case 3: selectedFont = console_font_7x9; break; @@ -6426,15 +6426,14 @@ void mode_2Dscrollingtext(void) { // PREPARE FONT CACHE if (useCustomFont) { if (strpbrk(text, "0123456789")) fontManager.setCacheNumbers(true); // Optimize for clocks - while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait + //while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait -> TODO: do this in fontmanager before re-caching and only on C3 } fontManager.prepare(text); if (useCustomFont && SEGMENT.data) { FontHeader* header = (FontHeader*)SEGMENT.data; letterHeight = header->height; - letterSpacing = header->spacing; - letterWidth = header->maxW; + letterWidth = header->width; } unsigned rotLW, rotLH; diff --git a/wled00/json.cpp b/wled00/json.cpp index 9873fbccf7..15b7f75922 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -142,21 +142,6 @@ static bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0) if (elem["n"]) { // name field exists const char * name = elem["n"].as(); - // print chars as hex - for (size_t i = 0; name && name[i] != '\0'; i++) { - Serial.print(name[i], HEX); - Serial.print(' '); - } - Serial.println(); - // print utf-8 decoded code points - size_t i = 0; - while (i < strlen(name)) { - uint8_t charLen; - uint32_t codePoint = utf8_decode(&name[i], &charLen); - Serial.print("U+"); - Serial.println(codePoint, HEX); - i += charLen; - } seg.setName(name); // will resolve empty and null correctly } else if (start != seg.start || stop != seg.stop) { // clearing or setting segment without name field diff --git a/wled00/src/font/console_font_4x6.h b/wled00/src/font/console_font_4x6.h index 08546fb571..86504a1cdb 100644 --- a/wled00/src/font/console_font_4x6.h +++ b/wled00/src/font/console_font_4x6.h @@ -1,20 +1,23 @@ -// font courtesy of https://github.com/idispatch/raster-fonts // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion /* - * WBF (WLED Bitmap Font) Packed Fixed-Width Format - * Header Layout (10 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height: 6 - * [2] Fixed/max glyph width: 4 - // spacing between cars (fixed to 1) - * [3] Flags: 0x00 (fixed width) - * [4] First Char: 32 - * [5] Last Char: 126 - * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 - * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * WBF (WLED Bitmap Font) Packed Format + * Header Layout (11 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 6 + * [2] Fixed/max glyph width: 4 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7-10] Unicode Offset (32-bit little-endian): 0x00000000 + * + * If variabls set ine width flag (0x01) i [4], header is followed by a + * width table of (Last Char - First Char + 1) bytes containing the + * width of each glyph. + * * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -35,266 +38,119 @@ * [Byte 1] [Byte 2] [Byte 3] * Final HEX for '!' = 0x22, 0x20, 0x20 * - * at the end of the stream, padding bits are added if necessary to fill the last byte + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ -static const unsigned char console_font_4x6[] PROGMEM = { - 0x57, 0x06, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset (32bit) +// Font: TinyPixie2_6px +// Height: 6, Max Width: 6, Spacing: 1 +// Characters: 32-126 (95 glyphs) +// Unicode Offset: 0x00000000 +// Variable Width: Yes + +static const unsigned char tinypixie2_6px[] PROGMEM = { + 0x57, 0x06, 0x06, 0x01, 0x01, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, S, Flags, First, Last, UnicodeOffset (32bit) + + // Width table + 0x03, 0x01, 0x03, 0x05, 0x03, 0x05, 0x06, 0x01, 0x02, 0x02, 0x05, 0x03, 0x01, 0x03, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, + 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x03, + 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x01, 0x01, 0x03, 0x01, 0x05, 0x03, 0x03, + 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x05, 0x03, 0x03, 0x02, 0x03, 0x01, 0x03, 0x04, - // 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x25, 0x75, 0x20, // /* code=1, hex=0x01, ascii="^A" */ - // 0x27, 0x57, 0x20, // /* code=2, hex=0x02, ascii="^B" */ - // 0x05, 0x77, 0x20, // /* code=3, hex=0x03, ascii="^C" */ - // 0x02, 0x77, 0x20, // /* code=4, hex=0x04, ascii="^D" */ - // 0x27, 0x72, 0x70, // /* code=5, hex=0x05, ascii="^E" */ - // 0x22, 0x72, 0x70, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x20, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0xFF, 0xDF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ - // 0x07, 0x57, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0xF8, 0xA8, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x03, 0x16, 0x60, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x25, 0x27, 0x20, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x23, 0x22, 0x60, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x23, 0x51, 0x20, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x27, 0x57, 0x20, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x46, 0x76, 0x40, // /* code=16, hex=0x10, ascii="^P" */ - // 0x13, 0x73, 0x10, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x27, 0x27, 0x20, // /* code=18, hex=0x12, ascii="^R" */ - // 0x55, 0x50, 0x50, // /* code=19, hex=0x13, ascii="^S" */ - // 0x7D, 0xD5, 0x50, // /* code=20, hex=0x14, ascii="^T" */ - // 0x36, 0x53, 0x60, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x70, // /* code=22, hex=0x16, ascii="^V" */ - // 0x27, 0x27, 0x27, // /* code=23, hex=0x17, ascii="^W" */ - // 0x27, 0x22, 0x20, // /* code=24, hex=0x18, ascii="^X" */ - // 0x22, 0x27, 0x20, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x02, 0xF2, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x04, 0xF4, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x47, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x05, 0x75, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x02, 0x77, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x07, 0x72, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x22, 0x20, 0x20, /* code=33, hex=0x21, ascii="!" */ - 0x55, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x57, 0x57, 0x50, /* code=35, hex=0x23, ascii="#" */ - 0x23, 0x63, 0x62, /* code=36, hex=0x24, ascii="$" */ - 0x41, 0x24, 0x10, /* code=37, hex=0x25, ascii="%" */ - 0x25, 0x35, 0x70, /* code=38, hex=0x26, ascii="&" */ - 0x64, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x24, 0x44, 0x20, /* code=40, hex=0x28, ascii="(" */ - 0x42, 0x22, 0x40, /* code=41, hex=0x29, ascii=")" */ - 0x52, 0x72, 0x50, /* code=42, hex=0x2A, ascii="*" */ - 0x02, 0x72, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x64, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x70, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x20, /* code=46, hex=0x2E, ascii="." */ - 0x11, 0x24, 0x40, /* code=47, hex=0x2F, ascii="/" */ - 0x35, 0x55, 0x60, /* code=48, hex=0x30, ascii="0" */ - 0x26, 0x22, 0x70, /* code=49, hex=0x31, ascii="1" */ - 0x61, 0x24, 0x70, /* code=50, hex=0x32, ascii="2" */ - 0x61, 0x21, 0x60, /* code=51, hex=0x33, ascii="3" */ - 0x15, 0x71, 0x10, /* code=52, hex=0x34, ascii="4" */ - 0x74, 0x61, 0x60, /* code=53, hex=0x35, ascii="5" */ - 0x24, 0x65, 0x20, /* code=54, hex=0x36, ascii="6" */ - 0x71, 0x32, 0x20, /* code=55, hex=0x37, ascii="7" */ - 0x25, 0x25, 0x20, /* code=56, hex=0x38, ascii="8" */ - 0x25, 0x31, 0x20, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x20, 0x20, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x20, 0x64, /* code=59, hex=0x3B, ascii=";" */ - 0x12, 0x42, 0x10, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x70, 0x70, /* code=61, hex=0x3D, ascii="=" */ - 0x42, 0x12, 0x40, /* code=62, hex=0x3E, ascii=">" */ - 0x61, 0x20, 0x20, /* code=63, hex=0x3F, ascii="?" */ - 0x75, 0x54, 0x70, /* code=64, hex=0x40, ascii="@" */ - 0x25, 0x75, 0x50, /* code=65, hex=0x41, ascii="A" */ - 0x65, 0x65, 0x60, /* code=66, hex=0x42, ascii="B" */ - 0x34, 0x44, 0x30, /* code=67, hex=0x43, ascii="C" */ - 0x65, 0x55, 0x60, /* code=68, hex=0x44, ascii="D" */ - 0x74, 0x64, 0x70, /* code=69, hex=0x45, ascii="E" */ - 0x74, 0x64, 0x40, /* code=70, hex=0x46, ascii="F" */ - 0x34, 0x55, 0x30, /* code=71, hex=0x47, ascii="G" */ - 0x55, 0x75, 0x50, /* code=72, hex=0x48, ascii="H" */ - 0x72, 0x22, 0x70, /* code=73, hex=0x49, ascii="I" */ - 0x11, 0x15, 0x20, /* code=74, hex=0x4A, ascii="J" */ - 0x55, 0x65, 0x50, /* code=75, hex=0x4B, ascii="K" */ - 0x44, 0x44, 0x70, /* code=76, hex=0x4C, ascii="L" */ - 0x57, 0x75, 0x50, /* code=77, hex=0x4D, ascii="M" */ - 0x57, 0x55, 0x50, /* code=78, hex=0x4E, ascii="N" */ - 0x25, 0x55, 0x20, /* code=79, hex=0x4F, ascii="O" */ - 0x65, 0x64, 0x40, /* code=80, hex=0x50, ascii="P" */ - 0x25, 0x57, 0x30, /* code=81, hex=0x51, ascii="Q" */ - 0x65, 0x65, 0x50, /* code=82, hex=0x52, ascii="R" */ - 0x34, 0x71, 0x60, /* code=83, hex=0x53, ascii="S" */ - 0x72, 0x22, 0x20, /* code=84, hex=0x54, ascii="T" */ - 0x55, 0x55, 0x70, /* code=85, hex=0x55, ascii="U" */ - 0x55, 0x55, 0x20, /* code=86, hex=0x56, ascii="V" */ - 0x55, 0x77, 0x50, /* code=87, hex=0x57, ascii="W" */ - 0x55, 0x25, 0x50, /* code=88, hex=0x58, ascii="X" */ - 0x55, 0x22, 0x20, /* code=89, hex=0x59, ascii="Y" */ - 0x71, 0x24, 0x70, /* code=90, hex=0x5A, ascii="Z" */ - 0x64, 0x44, 0x60, /* code=91, hex=0x5B, ascii="[" */ - 0x44, 0x21, 0x10, /* code=92, hex=0x5C, ascii="\" */ - 0x62, 0x22, 0x60, /* code=93, hex=0x5D, ascii="]" */ - 0x25, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x0F, /* code=95, hex=0x5F, ascii="_" */ - 0x62, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x35, 0x70, /* code=97, hex=0x61, ascii="a" */ - 0x44, 0x65, 0x60, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x34, 0x30, /* code=99, hex=0x63, ascii="c" */ - 0x11, 0x35, 0x30, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x76, 0x30, /* code=101, hex=0x65, ascii="e" */ - 0x12, 0x72, 0x20, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x75, 0x17, /* code=103, hex=0x67, ascii="g" */ - 0x44, 0x65, 0x50, /* code=104, hex=0x68, ascii="h" */ - 0x20, 0x22, 0x20, /* code=105, hex=0x69, ascii="i" */ - 0x20, 0x22, 0x26, /* code=106, hex=0x6A, ascii="j" */ - 0x44, 0x56, 0x50, /* code=107, hex=0x6B, ascii="k" */ - 0x22, 0x22, 0x20, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x77, 0x50, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x65, 0x50, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x25, 0x20, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x65, 0x64, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x35, 0x31, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x64, 0x40, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x32, 0x60, /* code=115, hex=0x73, ascii="s" */ - 0x02, 0x72, 0x30, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x55, 0x70, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x55, 0x20, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x57, 0x70, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x52, 0x50, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x55, 0x24, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x62, 0x30, /* code=122, hex=0x7A, ascii="z" */ - 0x32, 0x62, 0x30, /* code=123, hex=0x7B, ascii="{" */ - 0x22, 0x22, 0x20, /* code=124, hex=0x7C, ascii="|" */ - 0x62, 0x32, 0x60, /* code=125, hex=0x7D, ascii="}" */ - 0x5A, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x02, 0x57, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x34, 0x47, 0x24, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x50, 0x55, 0x30, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x12, 0x76, 0x30, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x25, 0x35, 0x70, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x50, 0x35, 0x70, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x42, 0x35, 0x70, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x20, 0x35, 0x70, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x07, 0x47, 0x26, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x25, 0x76, 0x30, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x50, 0x76, 0x30, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x42, 0x76, 0x30, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x50, 0x22, 0x20, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x25, 0x02, 0x20, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x42, 0x02, 0x20, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x52, 0x57, 0x50, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x22, 0x57, 0x50, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x12, 0x76, 0x70, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x37, 0x60, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x36, 0x76, 0x70, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x25, 0x25, 0x20, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x50, 0x25, 0x20, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x42, 0x25, 0x20, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x25, 0x05, 0x70, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x42, 0x55, 0x70, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x50, 0x55, 0x24, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x52, 0x55, 0x20, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x50, 0x55, 0x70, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x27, 0x47, 0x20, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x12, 0x72, 0x70, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x57, 0x27, 0x20, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x06, 0x65, 0x50, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x32, 0x32, 0x60, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x12, 0x35, 0x70, // /* code=160, hex=0xA0, ascii="! " */ - // 0x12, 0x02, 0x20, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x12, 0x75, 0x70, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x12, 0x05, 0x70, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x70, 0x75, 0x50, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x70, 0x57, 0x50, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x35, 0x70, 0x70, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x25, 0x20, 0x70, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x20, 0x24, 0x30, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x07, 0x44, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x0E, 0x22, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x45, 0x25, 0x30, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x45, 0x27, 0x10, // /* code=172, hex=0xAC, ascii="!," */ - // 0x20, 0x22, 0x20, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x05, 0xA5, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x0A, 0x5A, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x41, 0x41, 0x41, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x5A, 0x5A, 0x5A, // /* code=177, hex=0xB1, ascii="!1" */ - // 0xBE, 0xBE, 0xBE, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x22, 0x22, 0x22, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x22, 0xE2, 0x22, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x2E, 0x2E, 0x22, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x55, 0xD5, 0x55, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0xF5, 0x55, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x0E, 0x2E, 0x22, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x5D, 0x1D, 0x55, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x55, 0x55, 0x55, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x0F, 0x1D, 0x55, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x5D, 0x1F, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x55, 0xF0, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x2E, 0x2E, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0xE2, 0x22, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x22, 0x30, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x22, 0xF0, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0xF2, 0x22, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x22, 0x32, 0x22, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0xF0, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x22, 0xF2, 0x22, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x23, 0x23, 0x22, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x55, 0x55, 0x55, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x55, 0x47, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x07, 0x45, 0x55, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x5D, 0x0F, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x0F, 0x0D, 0x55, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x55, 0x45, 0x55, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x0F, 0x0F, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x5D, 0x0D, 0x55, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x2F, 0x0F, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x55, 0xF0, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x0F, 0x0F, 0x22, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0xF5, 0x55, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x55, 0x70, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x23, 0x23, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x03, 0x23, 0x22, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x75, 0x55, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x55, 0xD5, 0x55, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x2F, 0x0F, 0x22, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x22, 0xE0, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x32, 0x22, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x0F, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xCC, 0xCC, 0xCC, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x33, 0x33, 0x33, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xF0, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x76, 0x70, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x25, 0x65, 0x64, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x75, 0x44, 0x40, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x75, 0x55, 0x50, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x74, 0x24, 0x70, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x35, 0x20, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x55, 0x74, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x01, 0x62, 0x20, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x72, 0x52, 0x70, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x25, 0x75, 0x20, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x02, 0x55, 0x50, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x34, 0x25, 0x20, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x75, 0x70, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x27, 0x57, 0x20, // /* code=237, hex=0xED, ascii="!m" */ - // 0x34, 0x74, 0x30, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x25, 0x55, 0x50, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x70, 0x70, 0x70, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x27, 0x20, 0x70, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x61, 0x60, 0x70, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x34, 0x30, 0x70, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x01, 0x22, 0x22, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x22, 0x22, 0x40, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x20, 0x70, 0x20, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x05, 0xA5, 0xA0, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x25, 0x20, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x02, 0x72, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x20, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x32, 0x26, 0x20, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x75, 0x50, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x62, 0x46, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x66, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ -}; + 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" ", w=3 */ + 0xE8, /* code=33, hex=0x21, ascii="!", w=1 */ + 0xB4, 0x00, 0x00, /* code=34, hex=0x22, ascii=""", w=3 */ + 0x57, 0xD5, 0xF5, 0x00, /* code=35, hex=0x23, ascii="#", w=5 */ + 0x5F, 0x3E, 0x80, /* code=36, hex=0x24, ascii="$", w=3 */ + 0xCE, 0x88, 0xB9, 0x80, /* code=37, hex=0x25, ascii="%", w=5 */ + 0x62, 0x46, 0x66, 0x74, 0x00, /* code=38, hex=0x26, ascii="&", w=6 */ + 0xC0, /* code=39, hex=0x27, ascii="'", w=1 */ + 0x6A, 0x40, /* code=40, hex=0x28, ascii="(", w=2 */ + 0x95, 0x80, /* code=41, hex=0x29, ascii=")", w=2 */ + 0x27, 0xDC, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*", w=5 */ + 0x0B, 0xA0, 0x00, /* code=43, hex=0x2B, ascii="+", w=3 */ + 0x0C, /* code=44, hex=0x2C, ascii=",", w=1 */ + 0x03, 0x80, 0x00, /* code=45, hex=0x2D, ascii="-", w=3 */ + 0x08, /* code=46, hex=0x2E, ascii=".", w=1 */ + 0x25, 0x48, 0x00, /* code=47, hex=0x2F, ascii="/", w=3 */ + 0x56, 0xD4, 0x00, /* code=48, hex=0x30, ascii="0", w=3 */ + 0x59, 0x2E, 0x00, /* code=49, hex=0x31, ascii="1", w=3 */ + 0xC5, 0x4E, 0x00, /* code=50, hex=0x32, ascii="2", w=3 */ + 0xE5, 0x1C, 0x00, /* code=51, hex=0x33, ascii="3", w=3 */ + 0x97, 0x92, 0x00, /* code=52, hex=0x34, ascii="4", w=3 */ + 0xF3, 0x1C, 0x00, /* code=53, hex=0x35, ascii="5", w=3 */ + 0x73, 0xD6, 0x00, /* code=54, hex=0x36, ascii="6", w=3 */ + 0xE5, 0x28, 0x00, /* code=55, hex=0x37, ascii="7", w=3 */ + 0xF7, 0xDE, 0x00, /* code=56, hex=0x38, ascii="8", w=3 */ + 0xD7, 0x9C, 0x00, /* code=57, hex=0x39, ascii="9", w=3 */ + 0x28, /* code=58, hex=0x3A, ascii=":", w=1 */ + 0x2C, /* code=59, hex=0x3B, ascii=";", w=1 */ + 0x2A, 0x22, 0x00, /* code=60, hex=0x3C, ascii="<", w=3 */ + 0x1C, 0x70, 0x00, /* code=61, hex=0x3D, ascii="=", w=3 */ + 0x88, 0xA8, 0x00, /* code=62, hex=0x3E, ascii=">", w=3 */ + 0xC5, 0x04, 0x00, /* code=63, hex=0x3F, ascii="?", w=3 */ + 0x7A, 0x1B, 0x6F, 0x81, 0xE0, /* code=64, hex=0x40, ascii="@", w=6 */ + 0xD6, 0xFA, 0x00, /* code=65, hex=0x41, ascii="A", w=3 */ + 0xD7, 0x5C, 0x00, /* code=66, hex=0x42, ascii="B", w=3 */ + 0x56, 0x54, 0x00, /* code=67, hex=0x43, ascii="C", w=3 */ + 0xD6, 0xDC, 0x00, /* code=68, hex=0x44, ascii="D", w=3 */ + 0xEE, 0xC0, /* code=69, hex=0x45, ascii="E", w=2 */ + 0xEE, 0x80, /* code=70, hex=0x46, ascii="F", w=2 */ + 0x72, 0xD6, 0x00, /* code=71, hex=0x47, ascii="G", w=3 */ + 0xB7, 0xDA, 0x00, /* code=72, hex=0x48, ascii="H", w=3 */ + 0xE9, 0x2E, 0x00, /* code=73, hex=0x49, ascii="I", w=3 */ + 0xD5, 0x60, /* code=74, hex=0x4A, ascii="J", w=2 */ + 0xB7, 0x5A, 0x00, /* code=75, hex=0x4B, ascii="K", w=3 */ + 0xAA, 0xC0, /* code=76, hex=0x4C, ascii="L", w=2 */ + 0x8E, 0xEB, 0x18, 0x80, /* code=77, hex=0x4D, ascii="M", w=5 */ + 0x99, 0xDB, 0x90, /* code=78, hex=0x4E, ascii="N", w=4 */ + 0xF6, 0xDE, 0x00, /* code=79, hex=0x4F, ascii="O", w=3 */ + 0xD6, 0xE8, 0x00, /* code=80, hex=0x50, ascii="P", w=3 */ + 0x56, 0xD6, 0x40, /* code=81, hex=0x51, ascii="Q", w=3 */ + 0xD6, 0xEA, 0x00, /* code=82, hex=0x52, ascii="R", w=3 */ + 0xED, 0xC0, /* code=83, hex=0x53, ascii="S", w=2 */ + 0xE9, 0x24, 0x00, /* code=84, hex=0x54, ascii="T", w=3 */ + 0xB6, 0xDE, 0x00, /* code=85, hex=0x55, ascii="U", w=3 */ + 0xB6, 0xA4, 0x00, /* code=86, hex=0x56, ascii="V", w=3 */ + 0xAD, 0x6A, 0xA5, 0x00, /* code=87, hex=0x57, ascii="W", w=5 */ + 0xB5, 0x5A, 0x00, /* code=88, hex=0x58, ascii="X", w=3 */ + 0xB5, 0x9C, 0x00, /* code=89, hex=0x59, ascii="Y", w=3 */ + 0xE5, 0x4E, 0x00, /* code=90, hex=0x5A, ascii="Z", w=3 */ + 0xEA, 0xC0, /* code=91, hex=0x5B, ascii="[", w=2 */ + 0x91, 0x12, 0x00, /* code=92, hex=0x5C, ascii="\", w=3 */ + 0xD5, 0xC0, /* code=93, hex=0x5D, ascii="]", w=2 */ + 0x22, 0xA2, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^", w=5 */ + 0x00, 0x01, 0xC0, /* code=95, hex=0x5F, ascii="_", w=3 */ + 0xC0, /* code=96, hex=0x60, ascii="`", w=1 */ + 0x19, 0xDE, 0x00, /* code=97, hex=0x61, ascii="a", w=3 */ + 0x9A, 0xDC, 0x00, /* code=98, hex=0x62, ascii="b", w=3 */ + 0x0E, 0x46, 0x00, /* code=99, hex=0x63, ascii="c", w=3 */ + 0x2E, 0xD6, 0x00, /* code=100, hex=0x64, ascii="d", w=3 */ + 0x0E, 0xE6, 0x00, /* code=101, hex=0x65, ascii="e", w=3 */ + 0x6E, 0x80, /* code=102, hex=0x66, ascii="f", w=2 */ + 0x0E, 0xB3, 0x80, /* code=103, hex=0x67, ascii="g", w=3 */ + 0x9A, 0xDA, 0x00, /* code=104, hex=0x68, ascii="h", w=3 */ + 0xB8, /* code=105, hex=0x69, ascii="i", w=1 */ + 0xBC, /* code=106, hex=0x6A, ascii="j", w=1 */ + 0x97, 0x6A, 0x00, /* code=107, hex=0x6B, ascii="k", w=3 */ + 0xF8, /* code=108, hex=0x6C, ascii="l", w=1 */ + 0x07, 0xAB, 0x5A, 0x80, /* code=109, hex=0x6D, ascii="m", w=5 */ + 0x1A, 0xDA, 0x00, /* code=110, hex=0x6E, ascii="n", w=3 */ + 0x0A, 0xD4, 0x00, /* code=111, hex=0x6F, ascii="o", w=3 */ + 0x1A, 0xDD, 0x00, /* code=112, hex=0x70, ascii="p", w=3 */ + 0x0A, 0xD6, 0x40, /* code=113, hex=0x71, ascii="q", w=3 */ + 0x3A, 0x80, /* code=114, hex=0x72, ascii="r", w=2 */ + 0x39, 0xC0, /* code=115, hex=0x73, ascii="s", w=2 */ + 0xBA, 0xC0, /* code=116, hex=0x74, ascii="t", w=2 */ + 0x16, 0xD6, 0x00, /* code=117, hex=0x75, ascii="u", w=3 */ + 0x16, 0xD4, 0x00, /* code=118, hex=0x76, ascii="v", w=3 */ + 0x04, 0x6B, 0x55, 0x00, /* code=119, hex=0x77, ascii="w", w=5 */ + 0x15, 0x2A, 0x00, /* code=120, hex=0x78, ascii="x", w=3 */ + 0x15, 0x9C, 0x00, /* code=121, hex=0x79, ascii="y", w=3 */ + 0x36, 0xC0, /* code=122, hex=0x7A, ascii="z", w=2 */ + 0x6B, 0x26, 0x00, /* code=123, hex=0x7B, ascii="{", w=3 */ + 0xFC, /* code=124, hex=0x7C, ascii="|", w=1 */ + 0xC9, 0xAC, 0x00, /* code=125, hex=0x7D, ascii="}", w=3 */ + 0x00, 0x5A, 0x00, /* code=126, hex=0x7E, ascii="~", w=4 */ +}; \ No newline at end of file diff --git a/wled00/util.cpp b/wled00/util.cpp index ce62121e06..5f57c29f91 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -175,7 +175,6 @@ uint32_t utf8_decode(const char *s, uint8_t *len) { uint8_t c = (uint8_t)s[0]; if (c == '\0') { - *len = 0; // null terminator, no code point return 0; } uint8_t n = UTF8_LEN(c); // number of bytes in this UTF-8 sequence @@ -202,7 +201,8 @@ size_t utf8_strlen(const char *s) size_t len = 0; while (*s != '\0') { uint8_t charLen; - utf8_decode(s, &charLen); // decode the UTF-8 character to get its length + uint32_t unicode = utf8_decode(s, &charLen); // decode the UTF-8 character to get its length + if (!unicode) break; // stop at null terminator (just in case, should not happen but to avoid infinite loop on malformed strings) s += charLen; // advance by the length of the current UTF-8 character len++; } From cada48bc4ee5c333ccca3b3815d46ccc17641652 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 12:59:17 +0100 Subject: [PATCH 05/33] fixes, optimizations still not fully working --- wled00/FX.h | 42 +++-- wled00/FX_2Dfcn.cpp | 379 ++++++++++++++++++++++++++------------------ 2 files changed, 253 insertions(+), 168 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 515748c01f..a0e3b49ef3 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -284,18 +284,26 @@ struct GlyphEntry { // Header for the RAM cache struct FontHeader { - uint32_t firstUnicode; // from font file - uint8_t glyphCount; - uint8_t height; - uint8_t spacing; - uint8_t maxW; - uint8_t first; // from font file - uint8_t last; // from font file - char name[16]; // The requested font name (e.g. "font3.wbf") - char file[16]; // The actual file used (e.g. "font.wbf") - uint8_t cachedCodes[64]; // The "Checklist" to see if we need a rebuild, max string length of 64 - // GlyphEntry registry[glyphCount]; // Variable length - // uint8_t bitmapData[]; // Helper to handle font loading and drawing + // Font metadata + uint8_t height; + uint8_t width; // Max width for variable fonts + uint8_t flags; // Font flags + uint8_t glyphCount; // Number of cached glyphs + + // Font range + uint8_t first; + uint8_t last; + uint16_t reserved; // Alignment + uint32_t firstUnicode; + + // Font tracking (stored in segment data) + uint8_t availableFonts; // Bitflags: bit 0-4 for fonts 0-4 + uint8_t cachedFontNum; // Currently cached font number (0-4, 0xFF = none) + uint8_t fontsScanned; // 1 if filesystem scanned, 0 otherwise + uint8_t padding; // Alignment + + // GlyphEntry registry[glyphCount]; // Variable length follows + // uint8_t bitmapData[]; // Variable length bitmap data follows }; class FontManager { @@ -313,11 +321,17 @@ class FontManager { Segment* _segment; const uint8_t* _flashFont; const char* _fileFont; - const char* _fontName; // Requested font name + + void scanAvailableFonts(); // Scan filesystem for available fonts + + // Helper methods for unified flash/file font access + uint8_t getGlyphWidth(uint32_t code); + const uint8_t* getGlyphBitmap(uint32_t code, uint8_t& outWidth, uint8_t& outHeight); + int32_t getGlyphIndex(uint32_t unicode, uint8_t first,uint8_t last, uint32_t firstUnicode); + int32_t getGlyphIndex(uint32_t unicode, FontHeader* header); bool _cacheNumbers = false; void rebuildCache(const char* text); - int32_t getGlyphIndex(uint32_t unicode, const FontHeader* header); }; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 4053744929..fe5a05c903 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -585,84 +585,109 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #endif // WLED_DISABLE_2D #define LAST_ASCII_CHAR 126 + // FontManager implementation +void FontManager::scanAvailableFonts() { + FontHeader* header = (FontHeader*)_segment->data; + if (!header) return; + + header->availableFonts = 0; + const char* fontNames[] = {"/font.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf"}; + + for (int i = 0; i < 5; i++) { + if (WLED_FS.exists(fontNames[i])) { + header->availableFonts |= (1 << i); // Set bit i + } + } + header->fontsScanned = 1; +} + bool FontManager::loadFont(const char* filename, const uint8_t* flashFont, bool init) { _flashFont = flashFont; - _fontName = filename; _fileFont = filename; if (flashFont) return true; if (!filename) return false; - // If initializing (first call), force clean slate - if (init) { - if (_segment->data) _segment->deallocateData(); + // Extract font number from filename (font.wbf=0, font1.wbf=1, etc.) + uint8_t fontNum = 0; + if (strlen(filename) > 5 && filename[5] >= '1' && filename[5] <= '4') { + fontNum = filename[5] - '0'; } - - // Check if cache already contains this font - if (!init && _segment->data) { - FontHeader* header = (FontHeader*)_segment->data; - // Check if requested name matches cached logic name - if (strncmp(header->name, filename, 15) == 0) { - if (header->file[0]) { - _fileFont = header->file; - } - return true; + + // Ensure segment data exists for font tracking + if (!_segment->data) { + if (!_segment->allocateData(sizeof(FontHeader))) { + return false; // Failed to allocate } + FontHeader* header = (FontHeader*)_segment->data; + memset(header, 0, sizeof(FontHeader)); + header->cachedFontNum = 0xFF; // No font cached + header->fontsScanned = 0; + } + + FontHeader* header = (FontHeader*)_segment->data; + + // If initializing or font number changed, invalidate cache + if (init || fontNum != header->cachedFontNum) { + header->glyphCount = 0; // Invalidate glyph cache + header->cachedFontNum = fontNum; + + // Rescan filesystem if font changed (user may have added new fonts) + header->fontsScanned = 0; + } + + // Scan filesystem on first use or after font change + if (!header->fontsScanned) { + scanAvailableFonts(); } - if (WLED_FS.exists(filename)) { - // Exists, set it (will be loaded by prepare->rebuildCache later) - return true; + // Check if requested font is available + if (header->availableFonts & (1 << fontNum)) { + return true; // Font available, will be loaded by prepare->rebuildCache } - // Fallback logic - const char* fallbackFonts[] = { "/font.wbf", "/font0.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf" }; - - //strcpy_P(fileName, PSTR("/font")); - // if (fontNum) sprintf(fileName +5, "%d", fontNum); - // strcat_P(fileName, PSTR(".wbf")); TODO: use this not a static list! - - for (int i = 0; i < 6; i++) { - if (strcmp(filename, fallbackFonts[i]) == 0) continue; // Don't check self - if (WLED_FS.exists(fallbackFonts[i])) { - _fileFont = fallbackFonts[i]; // found! - return true; + // Requested font not available - try fallback to any available font + for (int i = 0; i < 5; i++) { + if (header->availableFonts & (1 << i)) { + // Found an available font + const char* fallbackNames[] = {"/font.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf"}; + _fileFont = fallbackNames[i]; + header->cachedFontNum = i; + return true; } } + // No fonts available at all _fileFont = nullptr; + header->glyphCount = 0; + return false; } -// Helper to get glyph index from unicode -int32_t FontManager::getGlyphIndex(uint32_t unicode, const FontHeader* header) { - if (!header) return -1; - if (unicode < header->first) return -1; - +// Helper to get glyph index from unicode +int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { // ASCII Range if (unicode <= LAST_ASCII_CHAR) { - if (unicode <= header->last) { - return unicode - header->first; - } + if (unicode >= first && unicode <= last) { + return unicode - first; + } } - // Extended Range - else { - if (header->firstUnicode > 0 && unicode >= header->firstUnicode) { - uint32_t lastUni = header->firstUnicode + (header->last - LAST_ASCII_CHAR - 1); - if (unicode <= lastUni) { - // Corrected formula: (VirtualIndex) - First - // Debug: - // int32_t idx = (unicode - header->firstUnicode + LAST_ASCII_CHAR + 1) - header->first; - // Serial.printf("getGlyphIndex: Ext U+%04X -> Idx %d\n", unicode, idx); - return (unicode - header->firstUnicode + LAST_ASCII_CHAR + 1) - header->first; - } + // Extended Range (uses Unicode offset) + else if (firstUnicode > 0 && unicode >= firstUnicode) { + uint32_t adjustedCode = unicode - firstUnicode + LAST_ASCII_CHAR + 1; + if (adjustedCode >= first && adjustedCode <= last) { + return adjustedCode - first; } } - return -1; } +int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* header) { + if (!header) return -1; + return getGlyphIndex(unicode, header->first, header->last, header->firstUnicode); +} + void FontManager::prepare(const char* text) { if (_flashFont) return; // PROGMEM fonts don't need preparation if (!_fileFont) return; @@ -675,10 +700,18 @@ void FontManager::prepare(const char* text) { rebuildCache(text); // Load header if (!_segment->data) return; // Failed } + + FontHeader* header = (FontHeader*)_segment->data; + + // Check if cache was invalidated (glyphCount == 0) + if (header->glyphCount == 0) { + rebuildCache(text); + if (!_segment->data) return; + header = (FontHeader*)_segment->data; + } uint8_t neededCodes[64]; // Max unique chars uint8_t neededCount = 0; - FontHeader* header = (FontHeader*)_segment->data; // 0. Pre-add numbers if requested (Matrix/Clock mode) if (_cacheNumbers) { @@ -698,6 +731,11 @@ void FontManager::prepare(const char* text) { while (i < len) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[i], &charLen); + if (charLen == 0) { + // Malformed UTF8 - skip this byte to avoid infinite loop + i++; + continue; + } i += charLen; int32_t index = getGlyphIndex(unicode, header); @@ -724,23 +762,24 @@ void FontManager::prepare(const char* text) { // 2. Check if all needed codes are in cache bool allCached = true; + GlyphEntry* registry = (GlyphEntry*)((uint8_t*)header + sizeof(FontHeader)); for (int k=0; kglyphCount; c++) { - if (header->cachedCodes[c] == neededCodes[k]) { + if (registry[c].code == neededCodes[k]) { found = true; break; } } if (!found) { - Serial.printf("FontManager: Missing char idx %d\n", neededCodes[k]); + DEBUGFX_PRINTF("FontManager: Missing char idx %d\n", neededCodes[k]); allCached = false; break; } } if (!allCached) { - Serial.println("FontManager: Rebuilding cache due to missing chars"); + DEBUGFX_PRINTLN("FontManager: Rebuilding cache due to missing chars"); rebuildCache(text); } } @@ -749,7 +788,16 @@ void FontManager::rebuildCache(const char* text) { if (_flashFont) return; if (!_fileFont) return; - Serial.printf("FontManager::rebuildCache('%s') Font: %s\n", text ? text : "NULL", _fileFont); + DEBUGFX_PRINTF("FontManager::rebuildCache('%s') Font: %s\n", text ? text : "NULL", _fileFont); + + // Preserve font tracking if segment data exists + uint8_t avail = 0, cached = 0xFF, scanned = 0; + if (_segment->data) { + FontHeader* h = (FontHeader*)_segment->data; + avail = h->availableFonts; + cached = h->cachedFontNum; + scanned = h->fontsScanned; + } // Copy filename to local buffer in case _fileFont points to SEGENV.data which might be moved/freed by allocateData char currentFontFile[32]; @@ -757,6 +805,7 @@ void FontManager::rebuildCache(const char* text) { else currentFontFile[0] = 0; currentFontFile[31] = 0; + while (!BusManager::canAllShow()) yield(); File file = WLED_FS.open(currentFontFile, "r"); // Fallback logic for missing fonts if (!file) { @@ -789,20 +838,18 @@ void FontManager::rebuildCache(const char* text) { if (file.read() != 'W') { file.close(); return; } // Magic FontHeader tempHeader; - memset(&tempHeader, 0, sizeof(FontHeader)); // Init + memset(&tempHeader, 0, sizeof(FontHeader)); - // Store names - if (_fontName) strncpy(tempHeader.name, _fontName, 15); - if (currentFontFile[0]) strncpy(tempHeader.file, currentFontFile, 15); - + uint8_t version; + file.read(&version, 1); tempHeader.height = file.read(); - uint8_t maxWidth = file.read(); - tempHeader.maxW = maxWidth; - tempHeader.spacing = file.read(); - uint8_t flags = file.read(); + tempHeader.width = file.read(); + tempHeader.flags = file.read(); tempHeader.first = file.read(); tempHeader.last = file.read(); - file.read((uint8_t*)&tempHeader.firstUnicode, 4); + uint32_t firstUnicode; + file.read((uint8_t*)&firstUnicode, 4); + tempHeader.firstUnicode = firstUnicode; // Identify unique codes needed uint8_t neededCodes[64]; @@ -812,7 +859,7 @@ void FontManager::rebuildCache(const char* text) { if (_cacheNumbers) { const char* nums = "0123456789:. "; for (const char* p = nums; *p; p++) { - int32_t idx = getGlyphIndex((uint32_t)*p, &tempHeader); + int32_t idx = getGlyphIndex((uint32_t)*p, tempHeader.first, tempHeader.last, firstUnicode); if (idx >= 0 && idx < 256) { neededCodes[neededCount++] = (uint8_t)idx; } @@ -824,14 +871,15 @@ void FontManager::rebuildCache(const char* text) { while (i < len) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[i], &charLen); + if (!charLen || charLen > 4) break; // safety check to prevent infinite loop i += charLen; - - int32_t index = getGlyphIndex(unicode, &tempHeader); + + int32_t index = getGlyphIndex(unicode, tempHeader.first, tempHeader.last, firstUnicode); if (index < 0) { - index = getGlyphIndex('?', &tempHeader); + index = getGlyphIndex('?', tempHeader.first, tempHeader.last, firstUnicode); } - + if (index >= 0 && index < 256) { // Add unique bool known = false; @@ -841,23 +889,23 @@ void FontManager::rebuildCache(const char* text) { } tempHeader.glyphCount = neededCount; - // Fill cachedCodes - for(int k=0; kallocateData(totalRam)) { file.close(); @@ -920,19 +973,31 @@ void FontManager::rebuildCache(const char* text) { file.close(); } -uint8_t FontManager::getCharacterWidth(uint32_t code) { +// Unified glyph width getter for both flash and file fonts +uint8_t FontManager::getGlyphWidth(uint32_t code) { if (_flashFont) { - // Flash font fallback - // TODO: Support variable width flash fonts if flags indicate it - return pgm_read_byte_near(&_flashFont[2]); + const uint8_t* font = _flashFont; + uint8_t flags = pgm_read_byte_near(&font[3]); + uint8_t first = pgm_read_byte_near(&font[4]); + uint8_t last = pgm_read_byte_near(&font[5]); + + if (code < first || code > last) return 0; + uint8_t glyphIndex = code - first; + + if (flags & 0x01) { // Variable width - read from width table + // Width table starts at offset 10 (after header) + return pgm_read_byte_near(&font[10 + glyphIndex]); + } else { // Fixed width + return pgm_read_byte_near(&font[2]); + } } + // File font - use registry if (_segment->data) { FontHeader* header = (FontHeader*)_segment->data; int32_t index = getGlyphIndex(code, header); if (index >= 0) { - // Find in registry GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); for (int k=0; kglyphCount; k++) { if (registry[k].code == (uint8_t)index) { @@ -944,102 +1009,108 @@ uint8_t FontManager::getCharacterWidth(uint32_t code) { return 0; } -void FontManager::drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { - uint8_t w = 0, h = 0; - uint8_t* val = nullptr; // pointer to bitmap data (RAM or Flash) - // For file fonts, we need to read from file into buffer. - // For flash fonts, we point directly to PROGMEM. - - // To unify, we need a way to get the bitmap for the specific glyph. - // Flash: assumed fixed width for now (but user wants future proof). - // Let's stick to current Flash logic but use getGlyphIndex if possible? - // Flash fonts don't have a FontHeader struct in RAM easily to pass to getGlyphIndex. - // We'd need to construct a temp one or overload getGlyphIndex. - +uint8_t FontManager::getCharacterWidth(uint32_t code) { + return getGlyphWidth(code); +} + +// Unified glyph bitmap getter for both flash and file fonts +const uint8_t* FontManager::getGlyphBitmap(uint32_t code, uint8_t& outWidth, uint8_t& outHeight) { if (_flashFont) { - const uint8_t* font = _flashFont; - h = pgm_read_byte_near(&font[1]); - w = pgm_read_byte_near(&font[2]); - - // TODO: proper mapping for flash fonts? They usually just support ASCII 32-126 - if (code < 32 || code > 126) return; - uint8_t chr = code - 32; - - CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; - - for (int i = 0; i < h; i++) { - uint8_t row = pgm_read_byte_near(&font[(chr * h) + i + 3]); - - CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); - for (int j = 0; j < w; j++) { - if ((row >> (7-j)) & 1) { - int x0, y0; - switch (rotate) { - case -1: x0 = x + (h-1) - i; y0 = y + j; break; - case -2: - case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; - case 1: x0 = x + i; y0 = y + (w-1) - j; break; - default: x0 = x + j; y0 = y + i; break; - } - if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { - _segment->setPixelColorXYRaw(x0, y0, c.color32); - } - } - } - } - return; + const uint8_t* font = _flashFont; + uint8_t h = pgm_read_byte_near(&font[1]); + uint8_t flags = pgm_read_byte_near(&font[4]); + uint8_t first = pgm_read_byte_near(&font[5]); + uint8_t last = pgm_read_byte_near(&font[6]); + + + if (code < first || code > last) return nullptr; + uint8_t glyphIndex = code - first; + + outHeight = h; + uint16_t offset = 10; // After 10-byte header (11 bytes total, but data at index 10) + + if (flags & 0x01) { // Variable width + uint8_t numGlyphs = last - first + 1; + offset += numGlyphs; // Skip width table + outWidth = pgm_read_byte_near(&font[11 + glyphIndex]); + + // Sum bytes of all previous glyphs to find this one's offset + for (uint8_t i = 0; i < glyphIndex; i++) { + uint8_t w = pgm_read_byte_near(&font[11 + i]); + uint16_t bits = w * h; + offset += (bits + 7) / 8; // Round up to bytes + } + } else { // Fixed width + outWidth = pgm_read_byte_near(&font[2]); + uint16_t bitsPerGlyph = outWidth * h; + uint16_t bytesPerGlyph = (bitsPerGlyph + 7) / 8; + offset += glyphIndex * bytesPerGlyph; + } + + return &font[offset]; // PROGMEM pointer } - // File Font Logic - if (!_segment->data) return; + // File font - bitmap in RAM cache + if (!_segment->data) return nullptr; + FontHeader* header = (FontHeader*)_segment->data; - int32_t index = getGlyphIndex(code, header); - if (index < 0) return; + if (index < 0) return nullptr; GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); - GlyphEntry* entry = nullptr; uint32_t bitmapOffset = 0; - for (int k=0; kglyphCount; k++) { + for (int k = 0; k < header->glyphCount; k++) { if (registry[k].code == (uint8_t)index) { - entry = ®istry[k]; - break; + outWidth = registry[k].width; + outHeight = registry[k].height; + uint8_t* bitmap = _segment->data + sizeof(FontHeader) + + (header->glyphCount * sizeof(GlyphEntry)) + bitmapOffset; + return bitmap; // RAM pointer } uint16_t bits = registry[k].width * registry[k].height; bitmapOffset += (bits + 7) / 8; } + return nullptr; +} + +void FontManager::drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { + // Get bitmap using unified helper (works for both flash and file fonts) + uint8_t w, h; + const uint8_t* bitmap = getGlyphBitmap(code, w, h); + if (!bitmap || w == 0) return; - if (!entry) return; - - uint8_t* bitmap = _segment->data + sizeof(FontHeader) + (header->glyphCount * sizeof(GlyphEntry)) + bitmapOffset; - w = entry->width; - h = entry->height; CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; + // Draw character bitmap - unified code for both flash and file fonts uint16_t bitIndex = 0; for (int i = 0; i < h; i++) { CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); for (int j = 0; j < w; j++) { - uint16_t bytePos = bitIndex >> 3; - uint8_t bitPos = 7 - (bitIndex & 7); - uint8_t byteVal = bitmap[bytePos]; - bool bitSet = (byteVal >> bitPos) & 1; - bitIndex++; + uint16_t bytePos = bitIndex >> 3; // bitIndex / 8 + uint8_t bitPos = 7 - (bitIndex & 7); // 7 - (bitIndex % 8) + + // Read from bitmap - pgm_read for flash, direct for RAM + uint8_t byteVal = _flashFont ? + pgm_read_byte_near(&bitmap[bytePos]) : + bitmap[bytePos]; + + if ((byteVal >> bitPos) & 1) { + // Apply rotation + int x0, y0; + switch (rotate) { + case -1: x0 = x + (h-1) - i; y0 = y + j; break; + case -2: + case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; + case 1: x0 = x + i; y0 = y + (w-1) - j; break; + default: x0 = x + j; y0 = y + i; break; + } - if (bitSet) { - int x0, y0; - switch (rotate) { - case -1: x0 = x + (h-1) - i; y0 = y + j; break; - case -2: - case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; - case 1: x0 = x + i; y0 = y + (w-1) - j; break; - default: x0 = x + j; y0 = y + i; break; - } - if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { - _segment->setPixelColorXYRaw(x0, y0, c.color32); - } - } + if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { + _segment->setPixelColorXYRaw(x0, y0, c.color32); + } + } + bitIndex++; } } } \ No newline at end of file From a09e29652053c8cd8650228d9aef7f574030aaea Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 17:26:23 +0100 Subject: [PATCH 06/33] add support for flash fonts back, unified functions. custom glyphs currently broken --- wled00/FX.cpp | 204 +++++------ wled00/FX.h | 244 +++++++++---- wled00/FX_2Dfcn.cpp | 813 +++++++++++++++++++++----------------------- 3 files changed, 653 insertions(+), 608 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 7ae2c5e29a..4ab62ecd8c 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6302,65 +6302,26 @@ static const char _data_FX_MODE_2DBLOBS[] PROGMEM = "Blobs@!,# blobs,Blur,Trail; //////////////////////////// // 2D Scrolling text // //////////////////////////// -#include "src/font/console_font_4x6.h" -#include "src/font/console_font_5x8.h" -#include "src/font/console_font_5x12.h" -#include "src/font/console_font_6x8.h" -#include "src/font/console_font_7x9.h" void mode_2Dscrollingtext(void) { if (!strip.isMatrix || !SEGMENT.is2D()) FX_FALLBACK_STATIC; // not a 2D set-up - + FontManager fontManager(&SEGMENT); const int cols = SEG_W; const int rows = SEG_H; - uint8_t letterHeight = 8; // Default - uint8_t letterWidth = 5; - uint8_t letterSpacing = 1; - + // Font selection const uint8_t* selectedFont = nullptr; char fileName[32]; bool useCustomFont = SEGMENT.check2; uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); - - FontManager fontManager(&SEGMENT); bool init = (SEGENV.call == 0); - if (useCustomFont) { - strcpy_P(fileName, PSTR("/font")); - if (fontNum) sprintf(fileName +5, "%d", fontNum); - strcat_P(fileName, PSTR(".wbf")); - - if (!fontManager.loadFont(fileName, nullptr, init)) { - useCustomFont = false; - } - } - - if (!useCustomFont) { - switch (fontNum) { - default: - case 0: selectedFont = tinypixie2_6px; break; - case 1: selectedFont = console_font_5x8; break; - case 2: selectedFont = console_font_6x8; break; - case 3: selectedFont = console_font_7x9; break; - case 4: selectedFont = console_font_5x12; break; - } - fontManager.loadFont(nullptr, selectedFont, init); - letterHeight = pgm_read_byte_near(&selectedFont[1]); - letterWidth = pgm_read_byte_near(&selectedFont[2]); - } - // letters are rotated const int8_t rotate = map(SEGMENT.custom3, 0, 31, -2, 2); - - // Text preparation (Time/Date logic) + + // generate time/date if there are any # tokens char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'}; - size_t result_pos = 0; // ... (Prepare text) - // Re-use the existing text generation logic from previous implementation - // We need to copy it or re-implement it. - // I will re-implement the short version of the logic here or I should have copied it. - // Since I am replacing the whole function, I must include the text generation logic. - + size_t result_pos = 0; char sec[5]; int AmPmHour = hour(localTime); bool isitAM = true; @@ -6373,23 +6334,26 @@ void mode_2Dscrollingtext(void) { } size_t len = 0; - if (SEGMENT.name) len = strlen(SEGMENT.name); - if (len == 0) { + if (SEGMENT.name) len = strlen(SEGMENT.name); // note: SEGMENT.name is limited to WLED_MAX_SEGNAME_LEN + if (len == 0) { // fallback if empty segment name: display date and time sprintf_P(text, PSTR("%s %d, %d %d:%02d%s"), monthShortStr(month(localTime)), day(localTime), year(localTime), AmPmHour, minute(localTime), sec); } else { size_t i = 0; while (i < len) { if (SEGMENT.name[i] == '#') { - char token[7]; - bool zero = false; + char token[7]; // copy up to 6 chars + null terminator + bool zero = false; // a 0 suffix means display leading zeros size_t j = 0; while (j < 6 && i + j < len) { token[j] = std::toupper(SEGMENT.name[i + j]); - if(token[j] == '0') zero = true; + if(token[j] == '0') + zero = true; // 0 suffix found. Note: there is an edge case where a '0' could be part of a trailing text and not the token, handling it is not worth the effort j++; } token[j] = '\0'; - int advance = 5; + int advance = 5; // number of chars to advance in 'text' after processing the token + + // Process token char temp[32]; if (!strncmp_P(token,PSTR("#DATE"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d.%04d"):PSTR("%d.%d.%d"), day(localTime), month(localTime), year(localTime)); else if (!strncmp_P(token,PSTR("#DDMM"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d") :PSTR("%d.%d"), day(localTime), month(localTime)); @@ -6402,40 +6366,41 @@ void mode_2Dscrollingtext(void) { else if (!strncmp_P(token,PSTR("#YY"),3)) { sprintf (temp, ("%02d") , year(localTime)%100); advance = 3; } else if (!strncmp_P(token,PSTR("#HH"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), AmPmHour); advance = 3; } else if (!strncmp_P(token,PSTR("#MM"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), minute(localTime)); advance = 3; } - else if (!strncmp_P(token,PSTR("#SS"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), second(localTime)); advance = 3; } + else if (!strncmp_P(token,PSTR("#SS"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), second(localTime)); advance = 3; fontManager.setCacheNumbers(true);} // cache all numbers else if (!strncmp_P(token,PSTR("#MON"),4)) { sprintf (temp, ("%s") , monthShortStr(month(localTime))); advance = 4; } else if (!strncmp_P(token,PSTR("#MO"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), month(localTime)); advance = 3; } else if (!strncmp_P(token,PSTR("#DAY"),4)) { sprintf (temp, ("%s") , dayShortStr(weekday(localTime))); advance = 4; } else if (!strncmp_P(token,PSTR("#DD"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), day(localTime)); advance = 3; } - else { temp[0] = '#'; temp[1] = '\0'; zero = false; advance = 1; } - - if(zero) advance++; + else { temp[0] = '#'; temp[1] = '\0'; zero = false; advance = 1; } // Unknown token, just copy the # + + if(zero) advance++; // skip the '0' suffix size_t temp_len = strlen(temp); if (result_pos + temp_len < WLED_MAX_SEGNAME_LEN) { strcpy(text + result_pos, temp); result_pos += temp_len; } + i += advance; - } else { - if (result_pos < WLED_MAX_SEGNAME_LEN) text[result_pos++] = SEGMENT.name[i++]; - else break; + } + else { + if (result_pos < WLED_MAX_SEGNAME_LEN) { + text[result_pos++] = SEGMENT.name[i++]; // no token, just copy char + } else + break; // buffer full } } } - // PREPARE FONT CACHE - if (useCustomFont) { - if (strpbrk(text, "0123456789")) fontManager.setCacheNumbers(true); // Optimize for clocks - //while (!BusManager::canAllShow()) yield(); // on C3, accessing file system while sending causes glitchs, so wait -> TODO: do this in fontmanager before re-caching and only on C3 - } + // Load the font + fontManager.loadFont(fontNum, useCustomFont); // TODO: simplify this code, prepare is not really needed as a separate function. fontManager.prepare(text); - - if (useCustomFont && SEGMENT.data) { - FontHeader* header = (FontHeader*)SEGMENT.data; - letterHeight = header->height; - letterWidth = header->width; - } + // Get font dimensions + uint8_t letterHeight = fontManager.getFontHeight(); + uint8_t letterWidth = 8; // Max width (not used for layout with variable width) + uint8_t letterSpacing = fontManager.getFontSpacing(); + + // Calculate rotated dimensions unsigned rotLW, rotLH; if (rotate == 1 || rotate == -1) { rotLH = letterWidth; @@ -6445,102 +6410,89 @@ void mode_2Dscrollingtext(void) { rotLH = letterHeight; } - const int numberOfChars = utf8_strlen(text); - - // Calculate total width using variable width + // Calculate total text width int totalTextWidth = 0; int idx = 0; + const int numberOfChars = utf8_strlen(text); + for (int c = 0; c < numberOfChars; c++) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - uint8_t w = fontManager.getCharacterWidth(unicode); - totalTextWidth += (rotate == 1 || rotate == -1) ? letterHeight : w; // if rotated +/-90, width is height + + if (rotate == 1 || rotate == -1) { + totalTextWidth += letterHeight; // Fixed dimension when rotated + } else { + uint8_t w = fontManager.getGlyphWidth(unicode); + totalTextWidth += w; + } if (c < numberOfChars - 1) totalTextWidth += letterSpacing; } - // If rotated, the "width" of the text string is actually dependent on orientation? - // Previous code: `int width = (numberOfChars * rotLW);` - // If rotated +/-90, rotLW = letterHeight. - // So it assumed fixed height as width. - // If variable width font is rotated 90 deg, the "height" of the char becomes its width in the string. - // "letterHeight" is constant for the font. So `maxW` doesn't matter for 90deg rotation? - // Yes, if rotated 90deg, the character takes `letterHeight` pixels horizontally. - - if (rotate == 1 || rotate == -1) { - totalTextWidth = numberOfChars * (letterHeight + letterSpacing); // Fixed vertical size - } - int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-rotLH)/2; - + // Y offset calculation + int yoffset = map(SEGMENT.intensity, 0, 255, -rows / 2, rows / 2) + (rows - rotLH) / 2; + if (totalTextWidth <= cols) { // scroll vertically int speed = map(SEGMENT.speed, 0, 255, 5000, 1000); int frac = strip.now % speed + 1; if (SEGMENT.intensity == 255) { - yoffset = (2 * frac * rows)/speed - rows; + yoffset = (2 * frac * rows) / speed - rows; } else if (SEGMENT.intensity == 0) { - yoffset = rows - (2 * frac * rows)/speed; + yoffset = rows - (2 * frac * rows) / speed; } } + // Animation step if (SEGENV.step < strip.now) { if (totalTextWidth > cols) { if (SEGMENT.check3) { - if (SEGENV.aux0 == 0) SEGENV.aux0 = totalTextWidth + cols - 1; - else --SEGENV.aux0; - } else ++SEGENV.aux0 %= totalTextWidth + cols; - } else SEGENV.aux0 = (cols + totalTextWidth)/2; - ++SEGENV.aux1 &= 0xFF; + if (SEGENV.aux0 == 0) SEGENV.aux0 = totalTextWidth + cols - 1; + else --SEGENV.aux0; + } else { + ++SEGENV.aux0 %= totalTextWidth + cols; + } + } else { + SEGENV.aux0 = (cols - totalTextWidth) / 2; // Center + } + ++SEGENV.aux1 &= 0xFF; SEGENV.step = strip.now + map(SEGMENT.speed, 0, 255, 250, 50); } - SEGMENT.fade_out(255 - (SEGMENT.custom1>>4)); + SEGMENT.fade_out(255 - (SEGMENT.custom1 >> 4)); uint32_t col1 = SEGMENT.color_from_palette(SEGENV.aux1, false, PALETTE_SOLID_WRAP, 0); uint32_t col2 = BLACK; - if (SEGMENT.check1) { - if (SEGMENT.palette == 0) { + + if (SEGMENT.check1) { + if (SEGMENT.palette == 0) { col1 = SEGCOLOR(0); col2 = SEGCOLOR(2); } - } else col2 = col1; + } else { + col2 = col1; + } - // Drawing Loop - idx = 0; // Reset index for UTF8 + // Draw characters + idx = 0; int currentXOffset = 0; - + for (int c = 0; c < numberOfChars; c++) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - - uint8_t glyphWidth = fontManager.getCharacterWidth(unicode); - uint8_t spacing = letterSpacing; - - // Effective width for layout - int advance = 0; - - int drawX = 0; - - if (rotate == 1 || rotate == -1) { - // Vertical text? - // If rotated 90deg, the text is still horizontal but letters are sideways? - // Previous logic: `xoffset = int(cols) - int(SEGENV.aux0) + ((rotLW+2)*c);` - // `rotLW` was `letterHeight`. - // So it advanced by `letterHeight+2`. - // I will match this logic. - advance = letterHeight + spacing; - drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; - currentXOffset += advance; - } else { - advance = glyphWidth + spacing; - drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; - currentXOffset += advance; + uint8_t glyphWidth = fontManager.getGlyphWidth(unicode); + int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; + int advance = (rotate == 1 || rotate == -1) ? letterHeight : glyphWidth; + + // Skip if off-screen + if (drawX + advance < 0) { + currentXOffset += advance + letterSpacing; + continue; } + if (drawX >= cols) break; - if (drawX + ((rotate == 1 || rotate == -1) ? letterHeight : glyphWidth) < 0) continue; - if (drawX >= cols) continue; - fontManager.drawCharacter(unicode, drawX, yoffset, col1, col2, rotate); + currentXOffset += advance + letterSpacing; } } static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Custom Font,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; diff --git a/wled00/FX.h b/wled00/FX.h index a0e3b49ef3..148bf1b17a 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -273,68 +273,6 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) -// Font Helper Class -// Registry entry for the RAM cache -struct GlyphEntry { - uint8_t code; // 0-255 index, same as in font - uint8_t width; - uint8_t height; - uint8_t padding; // padding is added anyway, might as well indicate it for future use -}; - -// Header for the RAM cache -struct FontHeader { - // Font metadata - uint8_t height; - uint8_t width; // Max width for variable fonts - uint8_t flags; // Font flags - uint8_t glyphCount; // Number of cached glyphs - - // Font range - uint8_t first; - uint8_t last; - uint16_t reserved; // Alignment - uint32_t firstUnicode; - - // Font tracking (stored in segment data) - uint8_t availableFonts; // Bitflags: bit 0-4 for fonts 0-4 - uint8_t cachedFontNum; // Currently cached font number (0-4, 0xFF = none) - uint8_t fontsScanned; // 1 if filesystem scanned, 0 otherwise - uint8_t padding; // Alignment - - // GlyphEntry registry[glyphCount]; // Variable length follows - // uint8_t bitmapData[]; // Variable length bitmap data follows -}; - -class FontManager { - public: - FontManager(Segment* seg) : _segment(seg), _flashFont(nullptr), _fileFont(nullptr) {} - - bool loadFont(const char* filename, const uint8_t* flashFont = nullptr, bool init = false); - void setFont(const uint8_t* flashFont, const char* filename); - void setCacheNumbers(bool cache) { _cacheNumbers = cache; } // If set, always cache digits 0-9 - void prepare(const char* text); - uint8_t getCharacterWidth(uint32_t code); - void drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); - - private: - Segment* _segment; - const uint8_t* _flashFont; - const char* _fileFont; - - void scanAvailableFonts(); // Scan filesystem for available fonts - - // Helper methods for unified flash/file font access - uint8_t getGlyphWidth(uint32_t code); - const uint8_t* getGlyphBitmap(uint32_t code, uint8_t& outWidth, uint8_t& outHeight); - int32_t getGlyphIndex(uint32_t unicode, uint8_t first,uint8_t last, uint32_t firstUnicode); - int32_t getGlyphIndex(uint32_t unicode, FontHeader* header); - bool _cacheNumbers = false; - - void rebuildCache(const char* text); -}; - - // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 //gap fill #define FX_MODE_2DCRAZYBEES 119 //gap fill @@ -482,6 +420,7 @@ typedef enum mapping1D2D { } mapping1D2D_t; class WS2812FX; +class FontManager; // segment, 76 bytes class Segment { @@ -1128,4 +1067,185 @@ class WS2812FX { extern const char JSON_mode_names[]; extern const char JSON_palette_names[]; +#define LAST_ASCII_CHAR 126 +#define FONT_HEADER_SIZE 11 +/** + * Unified Font Format (Flash and RAM use IDENTICAL layout) + * + * Header Layout (11 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height + * [2] Fixed/max glyph width + * [3] Spacing between chars + * [4] Flags: (0x01 = variable width) + * [5] First Char + * [6] Last Char + * [7-10] Unicode Offset (32-bit little-endian) + * + * Followed by: + * - Width table (if variable width): [first..last] byte array + * - Bitmap data: bit-packed glyphs + */ + +// Abstract byte reader for unified flash/RAM access +class ByteReader { +public: + virtual uint8_t readByte(size_t offset) const = 0; + inline uint32_t readUInt32LE(size_t offset) const { + return readByte(offset) | + (readByte(offset + 1) << 8) | + (readByte(offset + 2) << 16) | + (readByte(offset + 3) << 24); + } + virtual ~ByteReader() {} +}; + +// PROGMEM reader for flash fonts +class FlashByteReader : public ByteReader { +private: + const uint8_t* _base; +public: + FlashByteReader() : _base(nullptr) {} // default constructor + FlashByteReader(const uint8_t* base) : _base(base) {} + + inline uint8_t readByte(size_t offset) const override { + return _base ? pgm_read_byte_near(_base + offset) : 0; + } +}; + +// RAM reader for cached fonts +class RAMByteReader : public ByteReader { +private: + const uint8_t* _base; +public: + RAMByteReader() : _base(nullptr) {} // default constructor + RAMByteReader(const uint8_t* base) : _base(base) {} + + inline uint8_t readByte(size_t offset) const override { + return _base ? _base[offset] : 0; + } +}; + +// Glyph entry in RAM cache +struct GlyphEntry { + uint8_t code; // Glyph index (0-255) + uint8_t width; // Width in pixels + uint8_t height; // Height in pixels +}; + +// Segment metadata (stored BEFORE the font data in RAM) +struct SegmentFontMetadata { + uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) + uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none) + uint8_t fontsScanned; // 1 if filesystem scanned + uint8_t glyphCount; // Number of glyphs cached +}; + +// Memory layout for cached fonts: +// [SegmentFontMetadata] - 4 bytes +// [GlyphEntry array] - 4 bytes each +// [11-byte font header] - for compatibility and to store font info +// [Bitmap data] - sequential, matches registry order + +// Font header structure +struct FontHeader { + uint8_t height; + uint8_t width; + uint8_t spacing; + uint8_t flags; + uint8_t first; + uint8_t last; + uint32_t firstUnicode; +}; + +class FontManager { +public: + FontManager(Segment* seg) : + _segment(seg), + _flashFont(nullptr), + _fontNum(0), + _useFlashFont(false), + _cacheNumbers(false), + _headerValid(false), + _reader(nullptr), + _fontBase(nullptr) {} + + bool loadFont(uint8_t fontNum, bool useFile); + void setCacheNumbers(bool cache) { _cacheNumbers = cache; } + void prepare(const char* text); + + inline void beginFrame() { + if (!_headerValid) { + updateReader(); + if (_reader) { + parseHeader(*_reader, _cachedHeader); + _headerValid = true; + } + } + } + + // Get dimensions (use cached header) + inline uint8_t getFontHeight() { return _cachedHeader.height; } + inline uint8_t getFontSpacing() { return _cachedHeader.spacing; } + uint8_t getGlyphWidth(uint32_t unicode); + + // Rendering + void drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); + +private: + Segment* _segment; + const uint8_t* _flashFont; + uint8_t _fontNum; // Font number (0-4) + bool _useFlashFont; // true = flash, false = file + bool _cacheNumbers; + + // Cached data for performance (non-static, per-instance) + bool _headerValid; + FontHeader _cachedHeader; + const ByteReader* _reader; + const uint8_t* _fontBase; + FlashByteReader _flashReader; + RAMByteReader _ramReader; + + // Invalidate cached header (call when font changes) + inline void invalidateHeader() { + _headerValid = false; + } + + inline void updateReader() { + if (_flashFont) { + _flashReader = FlashByteReader(_flashFont); + _reader = &_flashReader; + _fontBase = _flashFont; + } else if (_segment->data) { + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + // Font header starts after metadata + registry + const uint8_t* fontData = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); + _ramReader = RAMByteReader(fontData); + _reader = &_ramReader; + _fontBase = fontData; + } else { + _reader = nullptr; + _fontBase = nullptr; + } + } + + // Metadata access (RAM only) + SegmentFontMetadata* getMetadata() { + return _segment->data ? (SegmentFontMetadata*)_segment->data : nullptr; + } + + // Unified operations (work identically for flash and RAM) + static bool parseHeader(const ByteReader& reader, FontHeader& hdr); + const uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); + + // Glyph index calculation (pure function, inline for speed) + static inline int32_t getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode); + + // File font management + void scanAvailableFonts(); + void rebuildCache(const char* text); + uint8_t collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes, uint8_t maxCount); +}; + #endif diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index fe5a05c903..5dc412734c 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -583,534 +583,507 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu } #undef WU_WEIGHT -#endif // WLED_DISABLE_2D +#include "src/font/console_font_4x6.h" +#include "src/font/console_font_5x8.h" +#include "src/font/console_font_5x12.h" +#include "src/font/console_font_6x8.h" +#include "src/font/console_font_7x9.h" + #define LAST_ASCII_CHAR 126 -// FontManager implementation +// Pure glyph index calculator (inline for speed) +inline int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { + if (unicode <= LAST_ASCII_CHAR) { + if (unicode >= first && unicode <= last) return unicode - first; + } else if (firstUnicode > 0 && unicode >= firstUnicode) { + uint32_t adjusted = unicode - firstUnicode + LAST_ASCII_CHAR + 1; + if (adjusted >= first && adjusted <= last) return adjusted - first; + } + return -1; +} + +// Parse header from either flash or RAM (IDENTICAL format) +bool FontManager::parseHeader(const ByteReader& reader, FontHeader& hdr) { + if (reader.readByte(0) != 0x57) return false; // Magic check + hdr.height = reader.readByte(1); + hdr.width = reader.readByte(2); + hdr.spacing = reader.readByte(3); + hdr.flags = reader.readByte(4); + hdr.first = reader.readByte(5); + hdr.last = reader.readByte(6); + hdr.firstUnicode = reader.readUInt32LE(7); + return true; +} + +// Get glyph width +uint8_t FontManager::getGlyphWidth(uint32_t unicode) { + if (!_headerValid) return 0; + int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); + if (idx < 0) return 0; + + // For flash fonts, read from width table + if (_useFlashFont) { + if (_cachedHeader.flags & 0x01) { + return _reader->readByte(FONT_HEADER_SIZE + idx); + } else { + return _cachedHeader.width; + } + } + + // For cached fonts, look up in registry + if (!_segment->data) return 0; + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + return registry[k].width; + } + } + + return 0; // Not found in cache +} + +// Get glyph bitmap (uses cached header and reader) +const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { + if (!_reader || !_fontBase) return nullptr; + + int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); + if (idx < 0) return nullptr; + // For flash fonts, calculate offset normally + if (_useFlashFont) { + uint8_t numGlyphs = _cachedHeader.last - _cachedHeader.first + 1; + outHeight = _cachedHeader.height; + size_t offset = FONT_HEADER_SIZE; // Start after header + + if (_cachedHeader.flags & 0x01) { + outWidth = _reader->readByte(FONT_HEADER_SIZE + idx); + offset += numGlyphs; + + for (int32_t i = 0; i < idx; i++) { + uint8_t w = _reader->readByte(FONT_HEADER_SIZE + i); + uint16_t bits = w * _cachedHeader.height; + offset += (bits + 7) / 8; + } + } else { + outWidth = _cachedHeader.width; + uint16_t bitsPerGlyph = _cachedHeader.width * _cachedHeader.height; + uint16_t bytesPerGlyph = (bitsPerGlyph + 7) / 8; + offset += idx * bytesPerGlyph; + } + + return _fontBase + offset; + } + + // For cached fonts, use registry lookup + if (!_segment->data) return nullptr; + + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + // Find glyph in registry + uint32_t bitmapOffset = 0; + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + outWidth = registry[k].width; + outHeight = registry[k].height; + + // Bitmap starts after: metadata + registry + header + const uint8_t* bitmap = _segment->data + sizeof(SegmentFontMetadata) +(meta->glyphCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE + bitmapOffset; + return bitmap; + } + + // Accumulate offset to next glyph + uint16_t bits = registry[k].width * registry[k].height; + bitmapOffset += (bits + 7) / 8; + } + + return nullptr; // Glyph not found in cache +} + void FontManager::scanAvailableFonts() { - FontHeader* header = (FontHeader*)_segment->data; - if (!header) return; + SegmentFontMetadata* meta = getMetadata(); + if (!meta) return; + + meta->availableFonts = 0; + - header->availableFonts = 0; - const char* fontNames[] = {"/font.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf"}; for (int i = 0; i < 5; i++) { - if (WLED_FS.exists(fontNames[i])) { - header->availableFonts |= (1 << i); // Set bit i + char fileName[16]; + strcpy_P(fileName, PSTR("/font")); + if (i > 0) sprintf(fileName + 5, "%d", i); + strcat_P(fileName, PSTR(".wbf")); + if (WLED_FS.exists(fileName)) { + meta->availableFonts |= (1 << i); } } - header->fontsScanned = 1; + meta->fontsScanned = 1; } -bool FontManager::loadFont(const char* filename, const uint8_t* flashFont, bool init) { - _flashFont = flashFont; - _fileFont = filename; +bool FontManager::loadFont(uint8_t fontNum, bool useFile) { + _fontNum = fontNum; + _useFlashFont = !useFile; + switch (_fontNum) { + default: + case 0: _flashFont = tinypixie2_6px; break; + case 1: _flashFont = console_font_5x8; break; + case 2: _flashFont = console_font_6x8; break; + case 3: _flashFont = console_font_7x9; break; + case 4: _flashFont = console_font_5x12; break; + } + invalidateHeader(); - if (flashFont) return true; - if (!filename) return false; - - // Extract font number from filename (font.wbf=0, font1.wbf=1, etc.) - uint8_t fontNum = 0; - if (strlen(filename) > 5 && filename[5] >= '1' && filename[5] <= '4') { - fontNum = filename[5] - '0'; + if (_useFlashFont) { + updateReader(); + return true; + } + // File font requested + SegmentFontMetadata* meta = getMetadata(); // is null if data is not allocated yet + // Ensure segment data exists + if (!meta) { + if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { + return false; } - - // Ensure segment data exists for font tracking - if (!_segment->data) { - if (!_segment->allocateData(sizeof(FontHeader))) { - return false; // Failed to allocate - } - FontHeader* header = (FontHeader*)_segment->data; - memset(header, 0, sizeof(FontHeader)); - header->cachedFontNum = 0xFF; // No font cached - header->fontsScanned = 0; + meta = getMetadata(); + memset(meta, 0, sizeof(SegmentFontMetadata)); + meta->cachedFontNum = 0xFF; + meta->fontsScanned = 0; + } + + // Scan filesystem only if not already scanned + if (!meta->fontsScanned) { + scanAvailableFonts(); + } + + // Determine which font to actually use (with fallback) + uint8_t fontToUse = fontNum; + + // Check if requested font is available + if (!(meta->availableFonts & (1 << fontNum))) { + // Not available - find first available font + fontToUse = 0xFF; + for (int i = 0; i < 5; i++) { + if (meta->availableFonts & (1 << i)) { + fontToUse = i; + break; + } } - FontHeader* header = (FontHeader*)_segment->data; - - // If initializing or font number changed, invalidate cache - if (init || fontNum != header->cachedFontNum) { - header->glyphCount = 0; // Invalidate glyph cache - header->cachedFontNum = fontNum; - - // Rescan filesystem if font changed (user may have added new fonts) - header->fontsScanned = 0; + if (fontToUse == 0xFF) { + _useFlashFont = true; // no custom fonts available, use flash font + updateReader(); + return true; } + } + + // Store the actual font being used + _fontNum = fontToUse; + + // Check if the ACTUAL font to use has changed + if (fontToUse != meta->cachedFontNum) { + // Font changed - clear cache but preserve scan results + uint8_t avail = meta->availableFonts; + uint8_t scanned = meta->fontsScanned; - // Scan filesystem on first use or after font change - if (!header->fontsScanned) { - scanAvailableFonts(); + if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { + return false; } - - // Check if requested font is available - if (header->availableFonts & (1 << fontNum)) { - return true; // Font available, will be loaded by prepare->rebuildCache + meta = getMetadata(); + meta->availableFonts = avail; + meta->cachedFontNum = fontToUse; + meta->fontsScanned = scanned; + } + + return true; +} + +uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes, uint8_t maxCount) { + uint8_t count = 0; + + // Pre-add numbers if caching + if (_cacheNumbers) { + const char* nums = "0123456789:. "; // TOD: use printf + for (const char* p = nums; *p && count < maxCount; p++) { + int32_t idx = getGlyphIndex(*p, hdr.first, hdr.last, hdr.firstUnicode); + if (idx >= 0 && idx < 256) { + outCodes[count++] = idx; + } } + } + + // Parse text + size_t i = 0, len = strlen(text); + while (i < len && count < maxCount) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[i], &charLen); + if (!charLen || charLen > 4) break; + i += charLen; - // Requested font not available - try fallback to any available font - for (int i = 0; i < 5; i++) { - if (header->availableFonts & (1 << i)) { - // Found an available font - const char* fallbackNames[] = {"/font.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf"}; - _fileFont = fallbackNames[i]; - header->cachedFontNum = i; - return true; - } + int32_t idx = getGlyphIndex(unicode, hdr.first, hdr.last, hdr.firstUnicode); + if (idx < 0) { + idx = getGlyphIndex('?', hdr.first, hdr.last, hdr.firstUnicode); } - // No fonts available at all - _fileFont = nullptr; - header->glyphCount = 0; - - return false; -} - -// Helper to get glyph index from unicode -int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { - // ASCII Range - if (unicode <= LAST_ASCII_CHAR) { - if (unicode >= first && unicode <= last) { - return unicode - first; - } - } - // Extended Range (uses Unicode offset) - else if (firstUnicode > 0 && unicode >= firstUnicode) { - uint32_t adjustedCode = unicode - firstUnicode + LAST_ASCII_CHAR + 1; - if (adjustedCode >= first && adjustedCode <= last) { - return adjustedCode - first; + if (idx >= 0 && idx < 256) { + // Add if unique + bool exists = false; + for (uint8_t k = 0; k < count; k++) { + if (outCodes[k] == idx) { + exists = true; + break; } + } + if (!exists) outCodes[count++] = idx; } - return -1; -} - -int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* header) { - if (!header) return -1; - return getGlyphIndex(unicode, header->first, header->last, header->firstUnicode); + } + return count; } void FontManager::prepare(const char* text) { - if (_flashFont) return; // PROGMEM fonts don't need preparation - if (!_fileFont) return; if (!text) return; + // Helper to ensure header is valid + auto ensureHeader = [this]() -> bool { + if (!_headerValid) { + updateReader(); + if (_reader && parseHeader(*_reader, _cachedHeader)) { + _headerValid = true; + return true; + } + return false; + } + return true; + }; + + // Flash fonts - just validate header and done + if (_useFlashFont) { + ensureHeader(); + return; + } - // Ensure data loaded for header + // Check if cache exists if (!_segment->data) { - Serial.println("FontManager: No data, rebuilding cache for header"); - rebuildCache(text); // Load header - if (!_segment->data) return; // Failed + rebuildCache(text); + ensureHeader(); + return; } - FontHeader* header = (FontHeader*)_segment->data; + SegmentFontMetadata* meta = getMetadata(); - // Check if cache was invalidated (glyphCount == 0) - if (header->glyphCount == 0) { + // If glyphCount is 0, cache is empty - rebuild + if (meta->glyphCount == 0) { rebuildCache(text); - if (!_segment->data) return; - header = (FontHeader*)_segment->data; + ensureHeader(); + return; } - - uint8_t neededCodes[64]; // Max unique chars - uint8_t neededCount = 0; - - // 0. Pre-add numbers if requested (Matrix/Clock mode) - if (_cacheNumbers) { - const char* nums = "0123456789:. "; - for (const char* p = nums; *p; p++) { - int32_t idx = getGlyphIndex((uint32_t)*p, header); - if (idx >= 0 && idx < 256) { - neededCodes[neededCount++] = (uint8_t)idx; - } - } + + // Validate header from existing cache + if (!ensureHeader()) { + rebuildCache(text); + ensureHeader(); + return; } - // 1. Decode text and find needed codes - size_t len = strlen(text); - size_t i = 0; - - while (i < len) { - uint8_t charLen; - uint32_t unicode = utf8_decode(&text[i], &charLen); - if (charLen == 0) { - // Malformed UTF8 - skip this byte to avoid infinite loop - i++; - continue; - } - i += charLen; - - int32_t index = getGlyphIndex(unicode, header); - - if (index < 0) { - // Fallback to '?' - index = getGlyphIndex('?', header); - } - - if (index >= 0 && index < 256) { - // Check if we already marked this code as needed - bool alreadyNeeded = false; - for (int k=0; kdata + sizeof(SegmentFontMetadata)); + + for (uint8_t k = 0; k < neededCount; k++) { + // Look up in registry bool found = false; - for (int c=0; cglyphCount; c++) { - if (registry[c].code == neededCodes[k]) { + for (uint8_t j = 0; j < meta->glyphCount; j++) { + if (registry[j].code == neededCodes[k]) { found = true; break; } } + if (!found) { - DEBUGFX_PRINTF("FontManager: Missing char idx %d\n", neededCodes[k]); - allCached = false; - break; + // Missing glyph - rebuild cache + rebuildCache(text); + ensureHeader(); + return; } } - - if (!allCached) { - DEBUGFX_PRINTLN("FontManager: Rebuilding cache due to missing chars"); - rebuildCache(text); - } + + // All glyphs present, cache is valid } void FontManager::rebuildCache(const char* text) { - if (_flashFont) return; - if (!_fileFont) return; - - DEBUGFX_PRINTF("FontManager::rebuildCache('%s') Font: %s\n", text ? text : "NULL", _fileFont); + if (_useFlashFont || !text) return; - // Preserve font tracking if segment data exists - uint8_t avail = 0, cached = 0xFF, scanned = 0; + // Preserve metadata + SegmentFontMetadata savedMeta = {0, 0xFF, 0, 0}; if (_segment->data) { - FontHeader* h = (FontHeader*)_segment->data; - avail = h->availableFonts; - cached = h->cachedFontNum; - scanned = h->fontsScanned; + memcpy(&savedMeta, _segment->data, sizeof(SegmentFontMetadata)); } - // Copy filename to local buffer in case _fileFont points to SEGENV.data which might be moved/freed by allocateData - char currentFontFile[32]; - if (_fileFont) strncpy(currentFontFile, _fileFont, 31); - else currentFontFile[0] = 0; - currentFontFile[31] = 0; - - while (!BusManager::canAllShow()) yield(); - File file = WLED_FS.open(currentFontFile, "r"); - // Fallback logic for missing fonts + // Build filename from font number TODO: make file name generation a function + char fileName[16]; + strcpy_P(fileName, PSTR("/font")); + if (_fontNum > 0) sprintf(fileName + 5, "%d", _fontNum); + strcat_P(fileName, PSTR(".wbf")); + #ifdef CONFIG_IDF_TARGET_ESP32C3 + while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed + #endif + File file = WLED_FS.open(fileName, "r"); + + // Fallback logic - try other available fonts if (!file) { - // List of fallback fonts to try - // User requested: font.wbf, font1.wbf ... font4.wbf - // The user's instruction implies a desire to replace this static list with a dynamic sprintf loop. - // However, the provided snippet also contains a critical analysis of why this is problematic - // if _fileFont is a pointer to a stack-allocated buffer, as it would become invalid. - // Given the explicit comment "Abort implementation change for now to avoid breaking it." - // within the provided code, I will keep the existing working static list approach for now, - // as implementing the dynamic sprintf loop directly would introduce a bug with pointer lifetime. - const char* fallbackFonts[] = { "/font.wbf", "/font0.wbf", "/font1.wbf", "/font2.wbf", "/font3.wbf", "/font4.wbf" }; - - for (int i = 0; i < 6; i++) { - // Don't try the same file again if it was the initial request - if (strncmp(currentFontFile, fallbackFonts[i], 15) == 0) continue; - - file = WLED_FS.open(fallbackFonts[i], "r"); + SegmentFontMetadata* meta = getMetadata(); + if (meta) { + for (int i = 0; i < 5; i++) { + if (i == _fontNum) continue; // Already tried this one + if (meta->availableFonts & (1 << i)) { + strcpy_P(fileName, PSTR("/font")); + if (i > 0) sprintf(fileName + 5, "%d", i); + strcat_P(fileName, PSTR(".wbf")); + + file = WLED_FS.open(fileName, "r"); if (file) { - strncpy(currentFontFile, fallbackFonts[i], 31); // Update current file - break; + _fontNum = i; // Update to fallback font + break; } + } } + } } - + if (!file) return; - // Read header - // Check Magic - if (file.read() != 'W') { file.close(); return; } // Magic - - FontHeader tempHeader; - memset(&tempHeader, 0, sizeof(FontHeader)); - - uint8_t version; - file.read(&version, 1); - tempHeader.height = file.read(); - tempHeader.width = file.read(); - tempHeader.flags = file.read(); - tempHeader.first = file.read(); - tempHeader.last = file.read(); - uint32_t firstUnicode; - file.read((uint8_t*)&firstUnicode, 4); - tempHeader.firstUnicode = firstUnicode; - - // Identify unique codes needed + // Read header from file + FontHeader fileHdr; + if (file.read() != 'W') { file.close(); return; } + // TODO: check if this works: file.read((uint8_t*)&fileHdr, 10); // Read remaining 10 bytes of header + fileHdr.height = file.read(); + fileHdr.width = file.read(); + fileHdr.spacing = file.read(); + fileHdr.flags = file.read(); + fileHdr.first = file.read(); + fileHdr.last = file.read(); + file.read((uint8_t*)&fileHdr.firstUnicode, 4); + + // Collect needed glyphs (no need to sort!) uint8_t neededCodes[64]; - uint8_t neededCount = 0; - - // 0. Pre-add numbers if requested (Matrix/Clock mode) - if (_cacheNumbers) { - const char* nums = "0123456789:. "; - for (const char* p = nums; *p; p++) { - int32_t idx = getGlyphIndex((uint32_t)*p, tempHeader.first, tempHeader.last, firstUnicode); - if (idx >= 0 && idx < 256) { - neededCodes[neededCount++] = (uint8_t)idx; - } - } - } - - size_t len = strlen(text); - size_t i = 0; - while (i < len) { - uint8_t charLen; - uint32_t unicode = utf8_decode(&text[i], &charLen); - if (!charLen || charLen > 4) break; // safety check to prevent infinite loop - i += charLen; + uint8_t neededCount = collectNeededCodes(text, fileHdr, neededCodes, 64); - int32_t index = getGlyphIndex(unicode, tempHeader.first, tempHeader.last, firstUnicode); - - if (index < 0) { - index = getGlyphIndex('?', tempHeader.first, tempHeader.last, firstUnicode); - } - - if (index >= 0 && index < 256) { - // Add unique - bool known = false; - for (int k=0; k= numGlyphs) { - bitmapSizes[k] = 0; - continue; - } - - // Calculate file offset for this code - uint32_t offset = fileDataStart; - for (int j=0; jallocateData(totalRam)) { + if (!_segment->allocateData(ramFontSize)) { file.close(); return; } - // Write Header - uint8_t* ptr = _segment->data; - memcpy(ptr, &tempHeader, sizeof(FontHeader)); - ptr += sizeof(FontHeader); + // Write metadata + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + meta->availableFonts = savedMeta.availableFonts; + meta->cachedFontNum = savedMeta.cachedFontNum; + meta->fontsScanned = savedMeta.fontsScanned; + meta->glyphCount = neededCount; - // Write Registry - GlyphEntry* registry = (GlyphEntry*)ptr; - ptr += neededCount * sizeof(GlyphEntry); + uint8_t* ptr = _segment->data + sizeof(SegmentFontMetadata); - uint8_t* bitmapDst = ptr; - - for (int k=0; k 0) { - file.seek(fileOffsets[k]); - file.read(bitmapDst, bitmapSizes[k]); - bitmapDst += bitmapSizes[k]; - } + registry[k].height = fileHdr.height; } + ptr += neededCount * sizeof(GlyphEntry); - file.close(); -} - -// Unified glyph width getter for both flash and file fonts -uint8_t FontManager::getGlyphWidth(uint32_t code) { - if (_flashFont) { - const uint8_t* font = _flashFont; - uint8_t flags = pgm_read_byte_near(&font[3]); - uint8_t first = pgm_read_byte_near(&font[4]); - uint8_t last = pgm_read_byte_near(&font[5]); - - if (code < first || code > last) return 0; - uint8_t glyphIndex = code - first; - - if (flags & 0x01) { // Variable width - read from width table - // Width table starts at offset 10 (after header) - return pgm_read_byte_near(&font[10 + glyphIndex]); - } else { // Fixed width - return pgm_read_byte_near(&font[2]); - } - } + // Write font header (for compatibility and easy access to spacing/firstUnicode) + file.seek(0); // Go back to start of file + file.read(ptr, FONT_HEADER_SIZE); // could also write it from fileHdr, but this is simpler + ptr += FONT_HEADER_SIZE; - // File font - use registry - if (_segment->data) { - FontHeader* header = (FontHeader*)_segment->data; - int32_t index = getGlyphIndex(code, header); - - if (index >= 0) { - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); - for (int k=0; kglyphCount; k++) { - if (registry[k].code == (uint8_t)index) { - return registry[k].width; - } - } - } - } - return 0; -} - -uint8_t FontManager::getCharacterWidth(uint32_t code) { - return getGlyphWidth(code); -} - -// Unified glyph bitmap getter for both flash and file fonts -const uint8_t* FontManager::getGlyphBitmap(uint32_t code, uint8_t& outWidth, uint8_t& outHeight) { - if (_flashFont) { - const uint8_t* font = _flashFont; - uint8_t h = pgm_read_byte_near(&font[1]); - uint8_t flags = pgm_read_byte_near(&font[4]); - uint8_t first = pgm_read_byte_near(&font[5]); - uint8_t last = pgm_read_byte_near(&font[6]); - - - if (code < first || code > last) return nullptr; - uint8_t glyphIndex = code - first; - - outHeight = h; - uint16_t offset = 10; // After 10-byte header (11 bytes total, but data at index 10) + // Write bitmap data in registry order (no sorting needed) + for (uint8_t k = 0; k < neededCount; k++) { + uint8_t code = neededCodes[k]; + uint16_t bits = widthTable[code] * fileHdr.height; + uint16_t bytes = (bits + 7) / 8; - if (flags & 0x01) { // Variable width - uint8_t numGlyphs = last - first + 1; - offset += numGlyphs; // Skip width table - outWidth = pgm_read_byte_near(&font[11 + glyphIndex]); - - // Sum bytes of all previous glyphs to find this one's offset - for (uint8_t i = 0; i < glyphIndex; i++) { - uint8_t w = pgm_read_byte_near(&font[11 + i]); - uint16_t bits = w * h; - offset += (bits + 7) / 8; // Round up to bytes - } - } else { // Fixed width - outWidth = pgm_read_byte_near(&font[2]); - uint16_t bitsPerGlyph = outWidth * h; - uint16_t bytesPerGlyph = (bitsPerGlyph + 7) / 8; - offset += glyphIndex * bytesPerGlyph; + // Calculate file offset + uint32_t offset = fileDataStart; + for (uint8_t j = 0; j < code; j++) { + uint16_t b = widthTable[j] * fileHdr.height; + offset += (b + 7) / 8; } - return &font[offset]; // PROGMEM pointer + // Read from file + file.seek(offset); + file.read(ptr, bytes); + ptr += bytes; } - // File font - bitmap in RAM cache - if (!_segment->data) return nullptr; - - FontHeader* header = (FontHeader*)_segment->data; - int32_t index = getGlyphIndex(code, header); - if (index < 0) return nullptr; - - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(FontHeader)); - uint32_t bitmapOffset = 0; - - for (int k = 0; k < header->glyphCount; k++) { - if (registry[k].code == (uint8_t)index) { - outWidth = registry[k].width; - outHeight = registry[k].height; - uint8_t* bitmap = _segment->data + sizeof(FontHeader) + - (header->glyphCount * sizeof(GlyphEntry)) + bitmapOffset; - return bitmap; // RAM pointer - } - uint16_t bits = registry[k].width * registry[k].height; - bitmapOffset += (bits + 7) / 8; - } - return nullptr; + file.close(); } -void FontManager::drawCharacter(uint32_t code, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { - // Get bitmap using unified helper (works for both flash and file fonts) +void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { + if (!_reader || !_fontBase) return; + uint8_t w, h; - const uint8_t* bitmap = getGlyphBitmap(code, w, h); + const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); if (!bitmap || w == 0) return; CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; - // Draw character bitmap - unified code for both flash and file fonts uint16_t bitIndex = 0; - for (int i = 0; i < h; i++) { - CRGBW c = ColorFromPalette(grad, (i + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); - for (int j = 0; j < w; j++) { - uint16_t bytePos = bitIndex >> 3; // bitIndex / 8 - uint8_t bitPos = 7 - (bitIndex & 7); // 7 - (bitIndex % 8) + for (int row = 0; row < h; row++) { + CRGBW c = ColorFromPalette(grad, (row + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); + + for (int col = 0; col < w; col++) { + uint16_t bytePos = bitIndex >> 3; + uint8_t bitPos = 7 - (bitIndex & 7); - // Read from bitmap - pgm_read for flash, direct for RAM - uint8_t byteVal = _flashFont ? - pgm_read_byte_near(&bitmap[bytePos]) : - bitmap[bytePos]; + // Direct pointer access for speed + uint8_t byteVal = _reader->readByte((bitmap - _fontBase) + bytePos); if ((byteVal >> bitPos) & 1) { - // Apply rotation int x0, y0; switch (rotate) { - case -1: x0 = x + (h-1) - i; y0 = y + j; break; + case -1: x0 = x + (h-1) - row; y0 = y + col; break; case -2: - case 2: x0 = x + (w-1) - j; y0 = y + (h-1) - i; break; - case 1: x0 = x + i; y0 = y + (w-1) - j; break; - default: x0 = x + j; y0 = y + i; break; + case 2: x0 = x + (w-1) - col; y0 = y + (h-1) - row; break; + case 1: x0 = x + row; y0 = y + (w-1) - col; break; + default: x0 = x + col; y0 = y + row; break; } - if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { + if (x0 >= 0 && x0 < (int)_segment->vWidth() && + y0 >= 0 && y0 < (int)_segment->vHeight()) { _segment->setPixelColorXYRaw(x0, y0, c.color32); } } bitIndex++; } } -} \ No newline at end of file +} + +#endif // WLED_DISABLE_2D \ No newline at end of file From c6e10f99e83fab6c67e3ae35fa80ec165dfab9b8 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 17:39:46 +0100 Subject: [PATCH 07/33] minor fix --- wled00/FX_2Dfcn.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 5dc412734c..be5fa4a156 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -1044,6 +1044,7 @@ void FontManager::rebuildCache(const char* text) { } file.close(); + invalidateHeader(); // Invalidate header to force re-parse with new data } void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { From 1339593976c54f80364d9a89f493ca7c724bb751 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 18:01:51 +0100 Subject: [PATCH 08/33] bugfix, now file fonts work again with extended chars --- wled00/FX_2Dfcn.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index be5fa4a156..ea06a0a049 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -845,6 +845,7 @@ void FontManager::prepare(const char* text) { // Helper to ensure header is valid auto ensureHeader = [this]() -> bool { + auto checkHeader = [this]() -> bool { if (!_headerValid) { updateReader(); if (_reader && parseHeader(*_reader, _cachedHeader)) { @@ -858,14 +859,13 @@ void FontManager::prepare(const char* text) { // Flash fonts - just validate header and done if (_useFlashFont) { - ensureHeader(); + checkHeader(); return; } // Check if cache exists if (!_segment->data) { rebuildCache(text); - ensureHeader(); return; } @@ -874,14 +874,12 @@ void FontManager::prepare(const char* text) { // If glyphCount is 0, cache is empty - rebuild if (meta->glyphCount == 0) { rebuildCache(text); - ensureHeader(); return; } // Validate header from existing cache - if (!ensureHeader()) { + if (!checkHeader()) { rebuildCache(text); - ensureHeader(); return; } @@ -904,7 +902,6 @@ void FontManager::prepare(const char* text) { if (!found) { // Missing glyph - rebuild cache rebuildCache(text); - ensureHeader(); return; } } @@ -1044,7 +1041,9 @@ void FontManager::rebuildCache(const char* text) { } file.close(); - invalidateHeader(); // Invalidate header to force re-parse with new data + memcpy(&_cachedHeader, &fileHdr, sizeof(FontHeader)); + _headerValid = true; // Mark as valid, we just loaded it directly + updateReader(); // Set up reader for cached access } void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { From 0f978bc5342c814f722e221e89faca905a6736bd Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 18:02:56 +0100 Subject: [PATCH 09/33] lost line --- wled00/FX_2Dfcn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index ea06a0a049..be7cc6e131 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -898,7 +898,7 @@ void FontManager::prepare(const char* text) { break; } } - + if (!found) { // Missing glyph - rebuild cache rebuildCache(text); From f61cbd78e53889b3e0b9a45412a01903e3e24aaa Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 18:03:07 +0100 Subject: [PATCH 10/33] another --- wled00/FX_2Dfcn.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index be7cc6e131..6247580da4 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -844,7 +844,6 @@ void FontManager::prepare(const char* text) { if (!text) return; // Helper to ensure header is valid - auto ensureHeader = [this]() -> bool { auto checkHeader = [this]() -> bool { if (!_headerValid) { updateReader(); From f729dc0fc43f8f01c80df6956ac77d166b184450 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 18:37:05 +0100 Subject: [PATCH 11/33] update to latest header format using 12 bytes --- wled00/FX.h | 7 +- wled00/FX_2Dfcn.cpp | 6 +- wled00/src/font/console_font_4x6.h | 387 +++++++++++++------- wled00/src/font/console_font_5x12.h | 539 ++++++++++++++-------------- wled00/src/font/console_font_5x8.h | 539 ++++++++++++++-------------- wled00/src/font/console_font_6x8.h | 539 ++++++++++++++-------------- wled00/src/font/console_font_7x9.h | 539 ++++++++++++++-------------- 7 files changed, 1354 insertions(+), 1202 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 148bf1b17a..99071eceac 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1068,11 +1068,11 @@ extern const char JSON_mode_names[]; extern const char JSON_palette_names[]; #define LAST_ASCII_CHAR 126 -#define FONT_HEADER_SIZE 11 +#define FONT_HEADER_SIZE 12 /** * Unified Font Format (Flash and RAM use IDENTICAL layout) * - * Header Layout (11 Bytes): + * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height * [2] Fixed/max glyph width @@ -1080,7 +1080,8 @@ extern const char JSON_palette_names[]; * [4] Flags: (0x01 = variable width) * [5] First Char * [6] Last Char - * [7-10] Unicode Offset (32-bit little-endian) + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian) * * Followed by: * - Width table (if variable width): [first..last] byte array diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 6247580da4..308da551e9 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -611,7 +611,8 @@ bool FontManager::parseHeader(const ByteReader& reader, FontHeader& hdr) { hdr.flags = reader.readByte(4); hdr.first = reader.readByte(5); hdr.last = reader.readByte(6); - hdr.firstUnicode = reader.readUInt32LE(7); + // [7] reserved: 0x00 + hdr.firstUnicode = reader.readUInt32LE(8); return true; } @@ -726,7 +727,7 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { _useFlashFont = !useFile; switch (_fontNum) { default: - case 0: _flashFont = tinypixie2_6px; break; + case 0: _flashFont = console_font_4x6; break; case 1: _flashFont = console_font_5x8; break; case 2: _flashFont = console_font_6x8; break; case 3: _flashFont = console_font_7x9; break; @@ -960,6 +961,7 @@ void FontManager::rebuildCache(const char* text) { fileHdr.flags = file.read(); fileHdr.first = file.read(); fileHdr.last = file.read(); + file.read(); // skip byte 7 (reserved) file.read((uint8_t*)&fileHdr.firstUnicode, 4); // Collect needed glyphs (no need to sort!) diff --git a/wled00/src/font/console_font_4x6.h b/wled00/src/font/console_font_4x6.h index 86504a1cdb..ee97fe94bb 100644 --- a/wled00/src/font/console_font_4x6.h +++ b/wled00/src/font/console_font_4x6.h @@ -1,23 +1,20 @@ - // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts /* - * WBF (WLED Bitmap Font) Packed Format - * Header Layout (11 Bytes): + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 6 - * [2] Fixed/max glyph width: 4 + * [2] Fixed/max glyph width: 3 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 * [6] Last Char: 126 - * [7-10] Unicode Offset (32-bit little-endian): 0x00000000 - * - * If variabls set ine width flag (0x01) i [4], header is followed by a - * width table of (Last Char - First Char + 1) bytes containing the - * width of each glyph. - * + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -41,116 +38,264 @@ * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ -// Font: TinyPixie2_6px -// Height: 6, Max Width: 6, Spacing: 1 -// Characters: 32-126 (95 glyphs) -// Unicode Offset: 0x00000000 -// Variable Width: Yes - -static const unsigned char tinypixie2_6px[] PROGMEM = { - 0x57, 0x06, 0x06, 0x01, 0x01, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, S, Flags, First, Last, UnicodeOffset (32bit) - // Width table - 0x03, 0x01, 0x03, 0x05, 0x03, 0x05, 0x06, 0x01, 0x02, 0x02, 0x05, 0x03, 0x01, 0x03, 0x01, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, - 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x03, - 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x03, - 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x01, 0x01, 0x03, 0x01, 0x05, 0x03, 0x03, - 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x05, 0x03, 0x03, 0x02, 0x03, 0x01, 0x03, 0x04, +static const unsigned char console_font_4x6[] PROGMEM = { + 0x57, 0x06, 0x03, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" ", w=3 */ - 0xE8, /* code=33, hex=0x21, ascii="!", w=1 */ - 0xB4, 0x00, 0x00, /* code=34, hex=0x22, ascii=""", w=3 */ - 0x57, 0xD5, 0xF5, 0x00, /* code=35, hex=0x23, ascii="#", w=5 */ - 0x5F, 0x3E, 0x80, /* code=36, hex=0x24, ascii="$", w=3 */ - 0xCE, 0x88, 0xB9, 0x80, /* code=37, hex=0x25, ascii="%", w=5 */ - 0x62, 0x46, 0x66, 0x74, 0x00, /* code=38, hex=0x26, ascii="&", w=6 */ - 0xC0, /* code=39, hex=0x27, ascii="'", w=1 */ - 0x6A, 0x40, /* code=40, hex=0x28, ascii="(", w=2 */ - 0x95, 0x80, /* code=41, hex=0x29, ascii=")", w=2 */ - 0x27, 0xDC, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*", w=5 */ - 0x0B, 0xA0, 0x00, /* code=43, hex=0x2B, ascii="+", w=3 */ - 0x0C, /* code=44, hex=0x2C, ascii=",", w=1 */ - 0x03, 0x80, 0x00, /* code=45, hex=0x2D, ascii="-", w=3 */ - 0x08, /* code=46, hex=0x2E, ascii=".", w=1 */ - 0x25, 0x48, 0x00, /* code=47, hex=0x2F, ascii="/", w=3 */ - 0x56, 0xD4, 0x00, /* code=48, hex=0x30, ascii="0", w=3 */ - 0x59, 0x2E, 0x00, /* code=49, hex=0x31, ascii="1", w=3 */ - 0xC5, 0x4E, 0x00, /* code=50, hex=0x32, ascii="2", w=3 */ - 0xE5, 0x1C, 0x00, /* code=51, hex=0x33, ascii="3", w=3 */ - 0x97, 0x92, 0x00, /* code=52, hex=0x34, ascii="4", w=3 */ - 0xF3, 0x1C, 0x00, /* code=53, hex=0x35, ascii="5", w=3 */ - 0x73, 0xD6, 0x00, /* code=54, hex=0x36, ascii="6", w=3 */ - 0xE5, 0x28, 0x00, /* code=55, hex=0x37, ascii="7", w=3 */ - 0xF7, 0xDE, 0x00, /* code=56, hex=0x38, ascii="8", w=3 */ - 0xD7, 0x9C, 0x00, /* code=57, hex=0x39, ascii="9", w=3 */ - 0x28, /* code=58, hex=0x3A, ascii=":", w=1 */ - 0x2C, /* code=59, hex=0x3B, ascii=";", w=1 */ - 0x2A, 0x22, 0x00, /* code=60, hex=0x3C, ascii="<", w=3 */ - 0x1C, 0x70, 0x00, /* code=61, hex=0x3D, ascii="=", w=3 */ - 0x88, 0xA8, 0x00, /* code=62, hex=0x3E, ascii=">", w=3 */ - 0xC5, 0x04, 0x00, /* code=63, hex=0x3F, ascii="?", w=3 */ - 0x7A, 0x1B, 0x6F, 0x81, 0xE0, /* code=64, hex=0x40, ascii="@", w=6 */ - 0xD6, 0xFA, 0x00, /* code=65, hex=0x41, ascii="A", w=3 */ - 0xD7, 0x5C, 0x00, /* code=66, hex=0x42, ascii="B", w=3 */ - 0x56, 0x54, 0x00, /* code=67, hex=0x43, ascii="C", w=3 */ - 0xD6, 0xDC, 0x00, /* code=68, hex=0x44, ascii="D", w=3 */ - 0xEE, 0xC0, /* code=69, hex=0x45, ascii="E", w=2 */ - 0xEE, 0x80, /* code=70, hex=0x46, ascii="F", w=2 */ - 0x72, 0xD6, 0x00, /* code=71, hex=0x47, ascii="G", w=3 */ - 0xB7, 0xDA, 0x00, /* code=72, hex=0x48, ascii="H", w=3 */ - 0xE9, 0x2E, 0x00, /* code=73, hex=0x49, ascii="I", w=3 */ - 0xD5, 0x60, /* code=74, hex=0x4A, ascii="J", w=2 */ - 0xB7, 0x5A, 0x00, /* code=75, hex=0x4B, ascii="K", w=3 */ - 0xAA, 0xC0, /* code=76, hex=0x4C, ascii="L", w=2 */ - 0x8E, 0xEB, 0x18, 0x80, /* code=77, hex=0x4D, ascii="M", w=5 */ - 0x99, 0xDB, 0x90, /* code=78, hex=0x4E, ascii="N", w=4 */ - 0xF6, 0xDE, 0x00, /* code=79, hex=0x4F, ascii="O", w=3 */ - 0xD6, 0xE8, 0x00, /* code=80, hex=0x50, ascii="P", w=3 */ - 0x56, 0xD6, 0x40, /* code=81, hex=0x51, ascii="Q", w=3 */ - 0xD6, 0xEA, 0x00, /* code=82, hex=0x52, ascii="R", w=3 */ - 0xED, 0xC0, /* code=83, hex=0x53, ascii="S", w=2 */ - 0xE9, 0x24, 0x00, /* code=84, hex=0x54, ascii="T", w=3 */ - 0xB6, 0xDE, 0x00, /* code=85, hex=0x55, ascii="U", w=3 */ - 0xB6, 0xA4, 0x00, /* code=86, hex=0x56, ascii="V", w=3 */ - 0xAD, 0x6A, 0xA5, 0x00, /* code=87, hex=0x57, ascii="W", w=5 */ - 0xB5, 0x5A, 0x00, /* code=88, hex=0x58, ascii="X", w=3 */ - 0xB5, 0x9C, 0x00, /* code=89, hex=0x59, ascii="Y", w=3 */ - 0xE5, 0x4E, 0x00, /* code=90, hex=0x5A, ascii="Z", w=3 */ - 0xEA, 0xC0, /* code=91, hex=0x5B, ascii="[", w=2 */ - 0x91, 0x12, 0x00, /* code=92, hex=0x5C, ascii="\", w=3 */ - 0xD5, 0xC0, /* code=93, hex=0x5D, ascii="]", w=2 */ - 0x22, 0xA2, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^", w=5 */ - 0x00, 0x01, 0xC0, /* code=95, hex=0x5F, ascii="_", w=3 */ - 0xC0, /* code=96, hex=0x60, ascii="`", w=1 */ - 0x19, 0xDE, 0x00, /* code=97, hex=0x61, ascii="a", w=3 */ - 0x9A, 0xDC, 0x00, /* code=98, hex=0x62, ascii="b", w=3 */ - 0x0E, 0x46, 0x00, /* code=99, hex=0x63, ascii="c", w=3 */ - 0x2E, 0xD6, 0x00, /* code=100, hex=0x64, ascii="d", w=3 */ - 0x0E, 0xE6, 0x00, /* code=101, hex=0x65, ascii="e", w=3 */ - 0x6E, 0x80, /* code=102, hex=0x66, ascii="f", w=2 */ - 0x0E, 0xB3, 0x80, /* code=103, hex=0x67, ascii="g", w=3 */ - 0x9A, 0xDA, 0x00, /* code=104, hex=0x68, ascii="h", w=3 */ - 0xB8, /* code=105, hex=0x69, ascii="i", w=1 */ - 0xBC, /* code=106, hex=0x6A, ascii="j", w=1 */ - 0x97, 0x6A, 0x00, /* code=107, hex=0x6B, ascii="k", w=3 */ - 0xF8, /* code=108, hex=0x6C, ascii="l", w=1 */ - 0x07, 0xAB, 0x5A, 0x80, /* code=109, hex=0x6D, ascii="m", w=5 */ - 0x1A, 0xDA, 0x00, /* code=110, hex=0x6E, ascii="n", w=3 */ - 0x0A, 0xD4, 0x00, /* code=111, hex=0x6F, ascii="o", w=3 */ - 0x1A, 0xDD, 0x00, /* code=112, hex=0x70, ascii="p", w=3 */ - 0x0A, 0xD6, 0x40, /* code=113, hex=0x71, ascii="q", w=3 */ - 0x3A, 0x80, /* code=114, hex=0x72, ascii="r", w=2 */ - 0x39, 0xC0, /* code=115, hex=0x73, ascii="s", w=2 */ - 0xBA, 0xC0, /* code=116, hex=0x74, ascii="t", w=2 */ - 0x16, 0xD6, 0x00, /* code=117, hex=0x75, ascii="u", w=3 */ - 0x16, 0xD4, 0x00, /* code=118, hex=0x76, ascii="v", w=3 */ - 0x04, 0x6B, 0x55, 0x00, /* code=119, hex=0x77, ascii="w", w=5 */ - 0x15, 0x2A, 0x00, /* code=120, hex=0x78, ascii="x", w=3 */ - 0x15, 0x9C, 0x00, /* code=121, hex=0x79, ascii="y", w=3 */ - 0x36, 0xC0, /* code=122, hex=0x7A, ascii="z", w=2 */ - 0x6B, 0x26, 0x00, /* code=123, hex=0x7B, ascii="{", w=3 */ - 0xFC, /* code=124, hex=0x7C, ascii="|", w=1 */ - 0xC9, 0xAC, 0x00, /* code=125, hex=0x7D, ascii="}", w=3 */ - 0x00, 0x5A, 0x00, /* code=126, hex=0x7E, ascii="~", w=4 */ -}; \ No newline at end of file + // 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x04, 0x90, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x04, 0x90, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x04, 0x90, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x90, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x04, 0x82, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x82, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x6D, 0xB6, 0xC0, // /* code=8, hex=0x08, ascii="^H" */ + // 0x04, 0x90, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x69, 0x26, 0xC0, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x12, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x04, 0x10, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x02, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x80, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x04, 0x90, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x24, 0x92, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x80, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x04, 0x10, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x24, 0x82, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x2D, 0x92, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x04, 0x82, 0x00, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x02, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x04, 0x10, 0x40, // /* code=23, hex=0x17, ascii="^W" */ + // 0x04, 0x00, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x10, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x01, 0x80, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x05, 0x90, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x90, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x04, 0x90, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x90, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x04, 0x80, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x00, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x24, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x24, 0x92, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x00, 0x82, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x20, 0x10, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x04, 0x12, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x24, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x04, 0x90, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x20, 0x02, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x20, 0x82, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x80, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x02, 0x40, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x80, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x12, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x04, 0x92, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x04, 0x02, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x20, 0x12, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x20, 0x02, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x04, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x24, 0x82, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x04, 0x90, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x20, 0x00, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x04, 0x10, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x04, 0x00, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x02, 0x40, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x80, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x82, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x20, 0x02, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x20, 0x00, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x24, 0x92, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x04, 0x92, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x24, 0x92, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x04, 0x90, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x24, 0x92, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x24, 0x92, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x24, 0x92, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x04, 0x90, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x24, 0x92, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x20, 0x02, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x10, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x24, 0x92, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x24, 0x92, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x24, 0x92, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x24, 0x92, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x04, 0x90, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x24, 0x92, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x04, 0x90, 0x00, /* code=81, hex=0x51, ascii="Q" */ + 0x24, 0x92, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x04, 0x82, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x20, 0x00, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x24, 0x92, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x24, 0x90, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x24, 0x92, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x24, 0x12, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x24, 0x00, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x20, 0x12, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x24, 0x92, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x24, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x20, 0x02, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x04, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0xC0, /* code=95, hex=0x5F, ascii="_" */ + 0x20, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x12, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x24, 0x92, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x10, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x10, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x90, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x80, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x90, 0x40, /* code=103, hex=0x67, ascii="g" */ + 0x24, 0x92, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x00, 0x00, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x00, 0x40, /* code=106, hex=0x6A, ascii="j" */ + 0x24, 0x92, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x00, 0x00, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x92, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x92, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x10, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x92, 0x40, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x10, 0x00, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x92, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x02, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x80, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x92, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x90, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x92, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x82, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x90, 0x40, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x80, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x80, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x00, 0x00, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x20, 0x02, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x28, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x90, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x04, 0x90, 0x40, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x20, 0x90, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x00, 0x90, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x04, 0x12, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x20, 0x12, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x20, 0x12, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x00, 0x12, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x04, 0x90, 0x40, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x04, 0x90, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x20, 0x90, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x20, 0x90, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x20, 0x00, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x04, 0x00, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x20, 0x00, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x20, 0x92, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x00, 0x92, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x00, 0x92, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x12, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x04, 0x92, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x04, 0x10, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x20, 0x10, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x20, 0x10, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x04, 0x12, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x20, 0x92, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x20, 0x90, 0x40, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x20, 0x90, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x20, 0x92, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x04, 0x90, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x00, 0x82, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x24, 0x10, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x04, 0x92, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x00, 0x02, 0x00, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x00, 0x12, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x00, 0x00, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x00, 0x92, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x00, 0x12, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x20, 0x92, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x20, 0x92, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x04, 0x82, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x04, 0x02, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x00, 0x10, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x04, 0x90, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x0C, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x24, 0x10, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x24, 0x10, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x00, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x05, 0x10, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x08, 0xA0, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x20, 0x82, 0x00, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x28, 0xA2, 0x80, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x4D, 0x34, 0xC0, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x00, 0x00, 0x00, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x01, 0x80, 0x00, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x0C, 0x30, 0x00, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x25, 0x92, 0x40, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x01, 0x92, 0x40, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x0C, 0x30, 0x00, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x2C, 0x32, 0x40, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x24, 0x92, 0x40, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x0C, 0x32, 0x40, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x2C, 0x30, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x25, 0x80, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x0C, 0x30, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x01, 0x80, 0x00, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x01, 0x80, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x01, 0x80, 0x00, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x00, 0x00, 0x00, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x01, 0x80, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x01, 0x80, 0x00, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x00, 0x00, 0x00, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x24, 0x92, 0x40, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x24, 0x90, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x04, 0x92, 0x40, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x2C, 0x30, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x0C, 0x32, 0x40, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x24, 0x92, 0x40, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x0C, 0x30, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x2C, 0x32, 0x40, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x0C, 0x30, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x25, 0x80, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x0C, 0x30, 0x00, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x01, 0x92, 0x40, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x24, 0x80, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x00, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x92, 0x40, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x25, 0x92, 0x40, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x0C, 0x30, 0x00, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x01, 0x80, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0x6D, 0xB6, 0xC0, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x36, 0xC0, // /* code=220, hex=0xDC, ascii="!\" */ + // 0x6D, 0xB6, 0xC0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x00, 0x00, 0x00, // /* code=222, hex=0xDE, ascii="!^" */ + // 0x6D, 0x80, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x92, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x04, 0x92, 0x40, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x24, 0x92, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x24, 0x92, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x24, 0x12, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x10, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x92, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x80, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x20, 0x82, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x04, 0x90, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x92, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x04, 0x10, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x92, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x04, 0x90, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x04, 0x90, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x04, 0x92, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x20, 0x82, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x04, 0x02, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x20, 0x82, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x04, 0x02, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x00, 0x00, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x00, 0x02, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x80, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x05, 0x14, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x04, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x80, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x10, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x24, 0x80, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x20, 0x90, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x90, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ +}; diff --git a/wled00/src/font/console_font_5x12.h b/wled00/src/font/console_font_5x12.h index 320e0f379d..95288f8691 100644 --- a/wled00/src/font/console_font_5x12.h +++ b/wled00/src/font/console_font_5x12.h @@ -1,19 +1,20 @@ -// font courtesy of https://github.com/idispatch/raster-fonts - // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts /* * WBF (WLED Bitmap Font) Packed Fixed-Width Format - * Header Layout (10 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height: 12 - * [2] Fixed glyph width: 5 - * [3] Flags: 0x00 (fixed width) - * [4] First Char: 32 - * [5] Last Char: 126 - * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 - * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 12 + * [2] Fixed/max glyph width: 4 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -34,266 +35,266 @@ * [Byte 1] [Byte 2] [Byte 3] * Final HEX for '!' = 0x22, 0x20, 0x20 * - * at the end of the stream, padding bits are added if necessary to fill the last byte + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ static const unsigned char console_font_5x12[] PROGMEM = { - 0x57, 0x0C, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + 0x57, 0x0C, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x74, 0x63, 0xB8, 0xC7, 0x75, 0x8B, 0x80, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x77, 0xFF, 0x5F, 0xFE, 0xBB, 0xFB, 0x80, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x02, 0xB7, 0xFF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x23, 0x9C, 0xE2, 0x7F, 0xEE, 0x23, 0x80, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x23, 0x80, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0xFF, 0xFF, 0xFF, 0xCE, 0x7F, 0xFF, 0xFF, 0xF0, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x00, 0x07, 0x29, 0x4E, 0x00, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0xFF, 0xFF, 0xF8, 0xD6, 0xB1, 0xFF, 0xFF, 0xF0, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x0E, 0x32, 0xB2, 0x52, 0x93, 0x00, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x03, 0x25, 0x29, 0x31, 0x08, 0xE2, 0x00, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x08, 0x63, 0x10, 0x84, 0xE6, 0x00, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x32, 0x9C, 0xA5, 0x29, 0xCE, 0xC6, 0x00, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x00, 0x00, 0x0A, 0xBA, 0x2E, 0xA8, 0x00, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x21, 0x8E, 0x7B, 0x98, 0x80, 0x00, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x04, 0x67, 0x79, 0xC6, 0x10, 0x00, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x00, 0x14, 0xA5, 0x29, 0x40, 0x52, 0x80, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x03, 0xB5, 0xAD, 0x69, 0x4A, 0x52, 0x80, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x03, 0x25, 0x06, 0x49, 0x82, 0x93, 0x00, 0x00, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x3E, 0x00, // /* code=23, hex=0x17, ascii="^W" */ - // 0x01, 0x1D, 0x52, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x08, 0x42, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0x82, 0x78, 0x88, 0x00, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x00, 0x44, 0x79, 0x04, 0x00, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x00, 0xA5, 0x7D, 0x4A, 0x00, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x42, 0x39, 0xDF, 0x00, 0x00, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x01, 0xF7, 0x38, 0x84, 0x00, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x01, 0x08, 0x42, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x52, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x02, 0x95, 0xF5, 0x2B, 0xEA, 0x50, 0x00, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x02, 0x19, 0x28, 0x20, 0x82, 0x93, 0x08, 0x00, /* code=36, hex=0x24, ascii="$" */ - 0x06, 0xB4, 0x42, 0x21, 0x08, 0xB5, 0x80, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x02, 0x29, 0x4A, 0x22, 0xB2, 0x93, 0x40, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x31, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x01, 0x10, 0x84, 0x21, 0x08, 0x41, 0x00, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x02, 0x08, 0x42, 0x10, 0x84, 0x22, 0x00, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x09, 0x57, 0x3A, 0xA4, 0x00, 0x00, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x00, 0x42, 0x7C, 0x84, 0x00, 0x00, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0x80, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x84, 0x42, 0x21, 0x08, 0x84, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x03, 0xA5, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x01, 0x19, 0x42, 0x10, 0x84, 0x27, 0x80, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x03, 0x25, 0x21, 0x11, 0x10, 0x87, 0x80, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x03, 0x24, 0x21, 0x30, 0x42, 0x93, 0x00, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x8C, 0xA5, 0x4B, 0xC2, 0x10, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x07, 0xA1, 0x08, 0x70, 0x42, 0x93, 0x00, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x01, 0x91, 0x0E, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x07, 0x84, 0x21, 0x10, 0x88, 0x42, 0x00, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x03, 0x25, 0x29, 0x32, 0x52, 0x93, 0x00, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x03, 0x25, 0x29, 0x49, 0xC2, 0x26, 0x00, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x00, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x08, 0x80, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x04, 0x44, 0x42, 0x08, 0x20, 0x80, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x20, 0x82, 0x08, 0x44, 0x44, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x03, 0x25, 0x21, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x03, 0x25, 0x29, 0x5A, 0xD0, 0x83, 0x80, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x03, 0x25, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x07, 0x25, 0x29, 0x72, 0x52, 0x97, 0x00, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x00, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x07, 0x25, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x87, 0x80, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x84, 0x00, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x03, 0x25, 0x28, 0x42, 0xD2, 0x93, 0x00, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x04, 0xA5, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x03, 0x88, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x03, 0x88, 0x42, 0x10, 0x94, 0xA2, 0x00, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x04, 0xA5, 0x4A, 0x62, 0x94, 0x94, 0x80, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x04, 0x21, 0x08, 0x42, 0x10, 0x87, 0x80, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x04, 0xA5, 0xEF, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x04, 0xA5, 0xAD, 0x5A, 0xD2, 0x94, 0x80, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x07, 0x25, 0x29, 0x72, 0x10, 0x84, 0x00, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x08, 0x20, /* code=81, hex=0x51, ascii="Q" */ - 0x07, 0x25, 0x29, 0x73, 0x14, 0x94, 0x80, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x03, 0x25, 0x28, 0x30, 0x52, 0x93, 0x00, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x07, 0xC8, 0x42, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x04, 0xA5, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x04, 0xA5, 0x29, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x04, 0xA5, 0x29, 0x4A, 0x5E, 0x94, 0x80, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x04, 0xA5, 0x26, 0x31, 0x92, 0x94, 0x80, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x04, 0x63, 0x15, 0x28, 0x84, 0x21, 0x00, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x07, 0x84, 0x42, 0x21, 0x10, 0x87, 0x80, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x03, 0x10, 0x84, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x04, 0x20, 0x84, 0x10, 0x84, 0x10, 0x80, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x00, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, /* code=95, hex=0x5F, ascii="_" */ - 0x63, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0x06, 0x09, 0xD2, 0x93, 0x80, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x80, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x84, 0x27, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x01, 0x10, 0x8E, 0x21, 0x08, 0x42, 0x00, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0xC0, /* code=103, hex=0x67, ascii="g" */ - 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x00, 0x08, 0x02, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x28, 0x80, /* code=106, hex=0x6A, ascii="j" */ - 0x04, 0x21, 0x09, 0x53, 0x18, 0xA4, 0x80, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x00, 0x09, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x00, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x00, 0x0E, 0x4A, 0x52, 0x97, 0x21, 0x00, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0x20, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0x0B, 0x29, 0x08, 0x42, 0x00, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0x06, 0x49, 0x04, 0x93, 0x00, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x10, 0x8E, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x00, 0x09, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x00, 0x09, 0x4A, 0x52, 0xF4, 0x80, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x00, 0x09, 0x49, 0x8C, 0x94, 0x80, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x00, 0x0F, 0x08, 0x88, 0x87, 0x80, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x01, 0x10, 0x84, 0x41, 0x08, 0x41, 0x00, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x21, 0x08, 0x40, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x02, 0x08, 0x42, 0x08, 0x84, 0x22, 0x00, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x02, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x01, 0x08, 0xA5, 0x46, 0x31, 0x8F, 0xC0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x08, 0x80, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x01, 0x90, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x03, 0x24, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x00, 0x14, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x06, 0x08, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x01, 0x14, 0x46, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x89, 0x80, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x03, 0x24, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x00, 0x14, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x06, 0x08, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x00, 0x14, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x03, 0x24, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x03, 0x04, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x50, 0x19, 0x29, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x22, 0x88, 0xC9, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x32, 0x01, 0xE8, 0x43, 0xD0, 0x87, 0x80, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x00, 0x07, 0x14, 0xAE, 0xA2, 0x80, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x1D, 0xCA, 0x53, 0xD4, 0xA5, 0x80, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x03, 0x24, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x00, 0x14, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x03, 0x04, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x03, 0x24, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x06, 0x08, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x50, 0x19, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x50, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x00, 0x47, 0x46, 0x11, 0x71, 0x00, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x01, 0x14, 0x84, 0x71, 0x08, 0xD7, 0x80, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x04, 0x54, 0xAF, 0x93, 0xE4, 0x21, 0x00, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x07, 0x25, 0x2E, 0x4A, 0xF2, 0x94, 0x80, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x11, 0x08, 0x42, 0x38, 0x84, 0x21, 0x28, 0x80, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x01, 0x90, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x01, 0x90, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x01, 0x90, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x01, 0x90, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x02, 0xA8, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x55, 0x01, 0x2D, 0x7A, 0xD2, 0x94, 0x80, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x03, 0x04, 0xE9, 0x38, 0x1E, 0x00, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x03, 0x25, 0x29, 0x30, 0x1E, 0x00, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x02, 0x10, 0x04, 0x22, 0x10, 0x93, 0x00, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x00, 0x03, 0xD0, 0x80, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x00, 0x03, 0xC2, 0x10, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x02, 0x14, 0xA2, 0x21, 0xD2, 0xA1, 0x80, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x02, 0x14, 0xA2, 0x21, 0x56, 0xB0, 0x80, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x00, 0xA5, 0x52, 0x8A, 0x50, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x01, 0x4A, 0x29, 0x54, 0xA0, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x00, 0x2A, 0x00, 0x28, 0x00, 0xA8, 0x00, 0xA0, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x02, 0x81, 0x50, 0x28, 0x15, 0x02, 0x81, 0x50, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x21, 0x08, 0x42, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x21, 0x08, 0x4E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x52, 0x94, 0xA5, 0x69, 0x4A, 0x52, 0x94, 0xA0, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x00, 0x79, 0x4A, 0x52, 0x94, 0xA0, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x00, 0x0E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x52, 0x94, 0xAD, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x52, 0x94, 0xA5, 0x29, 0x4A, 0x52, 0x94, 0xA0, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x00, 0x0F, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x52, 0x94, 0xAD, 0x0B, 0xC0, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x52, 0x94, 0xA5, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x21, 0x08, 0x4E, 0x13, 0x80, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x00, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x21, 0x08, 0x42, 0x1C, 0x00, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x21, 0x08, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x00, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x21, 0x08, 0x42, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x21, 0x08, 0x42, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x21, 0x08, 0x43, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x52, 0x94, 0xA5, 0x2D, 0x4A, 0x52, 0x94, 0xA0, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x52, 0x94, 0xA5, 0xA1, 0xE0, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x00, 0x07, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x52, 0x94, 0xAD, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x00, 0x0F, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x52, 0x94, 0xA5, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x52, 0x94, 0xAD, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x21, 0x08, 0x4F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x52, 0x94, 0xA5, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x00, 0x0F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x94, 0xA0, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x52, 0x94, 0xA5, 0x3C, 0x00, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x21, 0x08, 0x43, 0x90, 0xE0, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x03, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x00, 0x3D, 0x4A, 0x52, 0x94, 0xA0, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x52, 0x94, 0xA5, 0x6D, 0x4A, 0x52, 0x94, 0xA0, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x21, 0x08, 0x4F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x21, 0x08, 0x42, 0x70, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x00, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xC0, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x70, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x00, 0x9B, 0x52, 0x96, 0x48, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x03, 0x25, 0x2A, 0x72, 0x52, 0x97, 0x21, 0x00, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x00, 0x1E, 0x94, 0x21, 0x08, 0x42, 0x00, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x80, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x00, 0x01, 0xF4, 0x90, 0x44, 0x4F, 0xC0, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x00, 0x0F, 0xD2, 0x94, 0x40, 0x00, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x00, 0x09, 0x4A, 0x52, 0x97, 0x21, 0x00, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x00, 0x00, 0x2A, 0x84, 0x21, 0x00, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x00, 0x00, 0x07, 0x11, 0x4A, 0x23, 0x80, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x00, 0x45, 0x47, 0xF1, 0x51, 0x00, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x00, 0x45, 0x46, 0x2A, 0x56, 0xC0, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x00, 0x0C, 0x84, 0x11, 0xD2, 0x93, 0x00, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0x05, 0x56, 0xAA, 0x00, 0x00, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x08, 0x47, 0x56, 0xAE, 0x21, 0x00, 0x00, // /* code=237, hex=0xED, ascii="!m" */ - // 0x00, 0x00, 0xE8, 0x43, 0x90, 0x83, 0x80, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0x00, 0xC9, 0x4A, 0x52, 0x90, 0x00, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0x01, 0xE0, 0x78, 0x1E, 0x00, 0x00, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x00, 0x42, 0x7C, 0x84, 0x07, 0xC0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x04, 0x10, 0x41, 0x11, 0x10, 0x07, 0x80, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x88, 0x88, 0x20, 0x82, 0x07, 0x80, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x04, 0x52, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x21, 0x08, 0x42, 0x10, 0x84, 0xA2, 0x00, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x08, 0x40, 0x7C, 0x04, 0x20, 0x00, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x00, 0x05, 0x50, 0x0A, 0xA0, 0x00, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x64, 0xA4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x02, 0x38, 0x80, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x01, 0xC8, 0x42, 0x12, 0x94, 0x61, 0x00, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0xA6, 0xA5, 0x29, 0x48, 0x00, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x64, 0x84, 0xC8, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x00, 0xE7, 0x39, 0xCE, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x34, 0x46, 0x44, 0x65, 0x43, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x37, 0x75, 0x77, 0x56, 0x73, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x02, 0x67, 0x77, 0x73, 0x31, 0x10, // /* code=3, hex=0x03, ascii="^C" */ + // 0x11, 0x33, 0x77, 0x73, 0x31, 0x10, // /* code=4, hex=0x04, ascii="^D" */ + // 0x13, 0x33, 0x17, 0x73, 0x13, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x11, 0x33, 0x77, 0x73, 0x13, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x77, 0x77, 0x74, 0x47, 0x77, 0x77, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x32, 0x23, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x77, 0x77, 0x45, 0x54, 0x77, 0x77, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x10, 0x13, 0x44, 0x43, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x03, 0x44, 0x43, 0x22, 0x72, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x11, 0x11, 0x11, 0x76, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x12, 0x32, 0x22, 0x33, 0x66, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x53, 0x43, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x46, 0x77, 0x76, 0x40, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x01, 0x37, 0x31, 0x00, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x01, 0x35, 0x11, 0x15, 0x31, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x22, 0x22, 0x20, 0x22, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x03, 0x66, 0x66, 0x22, 0x22, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x03, 0x44, 0x34, 0x30, 0x43, 0x00, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x01, 0x35, 0x11, 0x15, 0x31, 0x70, // /* code=23, hex=0x17, ascii="^W" */ + // 0x01, 0x35, 0x11, 0x11, 0x11, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x11, 0x11, 0x15, 0x31, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x02, 0x17, 0x12, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x01, 0x27, 0x21, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x04, 0x47, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x02, 0x27, 0x22, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x01, 0x13, 0x37, 0x00, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x07, 0x33, 0x11, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x01, 0x11, 0x11, 0x10, 0x11, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x02, 0x27, 0x22, 0x72, 0x20, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x02, 0x34, 0x42, 0x10, 0x43, 0x10, /* code=36, hex=0x24, ascii="$" */ + 0x06, 0x61, 0x12, 0x22, 0x55, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x02, 0x55, 0x52, 0x54, 0x43, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x01, 0x22, 0x22, 0x22, 0x21, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x02, 0x11, 0x11, 0x11, 0x12, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x15, 0x33, 0x51, 0x00, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x01, 0x17, 0x11, 0x00, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x01, 0x12, 0x22, 0x44, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x03, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x01, 0x35, 0x11, 0x11, 0x17, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x03, 0x44, 0x01, 0x24, 0x47, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x03, 0x40, 0x03, 0x00, 0x43, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x12, 0x24, 0x70, 0x00, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x07, 0x44, 0x47, 0x00, 0x43, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x01, 0x24, 0x74, 0x44, 0x43, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x07, 0x00, 0x01, 0x12, 0x22, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x03, 0x44, 0x43, 0x44, 0x43, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x03, 0x44, 0x44, 0x30, 0x16, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x33, 0x00, 0x33, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x33, 0x00, 0x33, 0x12, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x01, 0x24, 0x42, 0x10, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x42, 0x10, 0x01, 0x24, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x03, 0x44, 0x01, 0x10, 0x11, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x03, 0x44, 0x45, 0x54, 0x43, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x03, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x07, 0x44, 0x47, 0x44, 0x47, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x03, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x07, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x07, 0x44, 0x47, 0x44, 0x47, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x07, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x03, 0x44, 0x44, 0x54, 0x43, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x04, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x03, 0x11, 0x11, 0x15, 0x52, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x04, 0x45, 0x56, 0x55, 0x44, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x04, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x04, 0x47, 0x74, 0x44, 0x44, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x04, 0x46, 0x65, 0x54, 0x44, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x03, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x07, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x03, 0x44, 0x44, 0x44, 0x43, 0x10, /* code=81, hex=0x51, ascii="Q" */ + 0x07, 0x44, 0x47, 0x65, 0x44, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x03, 0x44, 0x43, 0x04, 0x43, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x07, 0x11, 0x11, 0x11, 0x11, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x04, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x04, 0x44, 0x44, 0x22, 0x11, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x04, 0x44, 0x44, 0x47, 0x44, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x04, 0x44, 0x33, 0x34, 0x44, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x04, 0x44, 0x22, 0x11, 0x11, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x07, 0x01, 0x12, 0x24, 0x47, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x03, 0x22, 0x22, 0x22, 0x23, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x04, 0x42, 0x21, 0x11, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, /* code=95, hex=0x5F, ascii="_" */ + 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x30, 0x34, 0x43, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x44, 0x74, 0x44, 0x47, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x34, 0x47, 0x43, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x01, 0x22, 0x72, 0x22, 0x22, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x34, 0x44, 0x43, 0x03, /* code=103, hex=0x67, ascii="g" */ + 0x04, 0x44, 0x74, 0x44, 0x44, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x00, 0x10, 0x11, 0x11, 0x13, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x10, 0x11, 0x11, 0x11, 0x52, /* code=106, hex=0x6A, ascii="j" */ + 0x04, 0x44, 0x45, 0x66, 0x54, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x47, 0x44, 0x44, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x56, 0x44, 0x44, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x74, 0x44, 0x47, 0x44, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x52, 0x22, 0x22, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x34, 0x21, 0x43, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x22, 0x72, 0x22, 0x23, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x44, 0x44, 0x43, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x44, 0x22, 0x11, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x44, 0x44, 0x74, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x44, 0x33, 0x44, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x44, 0x44, 0x43, 0x07, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x70, 0x12, 0x47, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x01, 0x22, 0x24, 0x22, 0x21, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x11, 0x11, 0x01, 0x11, 0x11, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x11, 0x10, 0x11, 0x12, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x01, 0x12, 0x24, 0x44, 0x47, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x03, 0x44, 0x44, 0x44, 0x43, 0x12, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x00, 0x20, 0x44, 0x44, 0x43, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x01, 0x20, 0x34, 0x47, 0x43, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x03, 0x40, 0x34, 0x03, 0x43, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x00, 0x20, 0x34, 0x03, 0x43, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x06, 0x10, 0x34, 0x03, 0x43, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x21, 0x34, 0x03, 0x43, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x34, 0x44, 0x43, 0x16, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x03, 0x40, 0x34, 0x47, 0x43, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x00, 0x20, 0x34, 0x47, 0x43, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x06, 0x10, 0x34, 0x47, 0x43, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x00, 0x20, 0x31, 0x11, 0x13, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x03, 0x40, 0x31, 0x11, 0x13, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x03, 0x00, 0x31, 0x11, 0x13, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x20, 0x34, 0x44, 0x74, 0x44, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x12, 0x13, 0x44, 0x74, 0x44, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x12, 0x07, 0x44, 0x74, 0x47, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x31, 0x13, 0x52, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x37, 0x55, 0x75, 0x55, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x03, 0x40, 0x34, 0x44, 0x43, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x00, 0x20, 0x34, 0x44, 0x43, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x03, 0x00, 0x34, 0x44, 0x43, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x03, 0x40, 0x44, 0x44, 0x43, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x06, 0x10, 0x44, 0x44, 0x43, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x00, 0x20, 0x44, 0x44, 0x43, 0x07, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x20, 0x34, 0x44, 0x44, 0x43, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x20, 0x44, 0x44, 0x44, 0x43, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x01, 0x34, 0x44, 0x31, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x22, 0x27, 0x22, 0x67, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x04, 0x22, 0x71, 0x71, 0x11, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x07, 0x44, 0x74, 0x54, 0x44, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x01, 0x11, 0x13, 0x11, 0x11, 0x52, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x01, 0x20, 0x34, 0x03, 0x43, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x01, 0x20, 0x31, 0x11, 0x13, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x01, 0x20, 0x34, 0x44, 0x43, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x01, 0x20, 0x44, 0x44, 0x43, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x02, 0x50, 0x56, 0x44, 0x44, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x25, 0x04, 0x67, 0x54, 0x44, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x03, 0x03, 0x43, 0x07, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x03, 0x44, 0x43, 0x07, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x02, 0x20, 0x22, 0x44, 0x43, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x74, 0x40, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x02, 0x22, 0x12, 0x34, 0x51, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x02, 0x22, 0x12, 0x25, 0x50, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x10, 0x11, 0x11, 0x11, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x02, 0x25, 0x52, 0x20, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x05, 0x52, 0x25, 0x50, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x00, 0x50, 0x02, 0x00, 0x50, 0x02, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x11, 0x11, 0x17, 0x11, 0x11, 0x11, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x11, 0x11, 0x71, 0x71, 0x11, 0x11, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x22, 0x22, 0x26, 0x22, 0x22, 0x22, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x07, 0x22, 0x22, 0x22, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x71, 0x71, 0x11, 0x11, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x22, 0x22, 0x60, 0x62, 0x22, 0x22, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x70, 0x62, 0x22, 0x22, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x22, 0x22, 0x60, 0x70, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x22, 0x22, 0x27, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x11, 0x11, 0x71, 0x70, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x07, 0x11, 0x11, 0x11, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x11, 0x11, 0x17, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x07, 0x11, 0x11, 0x11, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x11, 0x11, 0x17, 0x11, 0x11, 0x11, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x22, 0x22, 0x22, 0x30, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x32, 0x22, 0x22, 0x22, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x22, 0x22, 0x60, 0x70, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x70, 0x62, 0x22, 0x22, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x22, 0x22, 0x60, 0x62, 0x22, 0x22, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x11, 0x11, 0x70, 0x70, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x22, 0x22, 0x27, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x70, 0x71, 0x11, 0x11, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x07, 0x22, 0x22, 0x22, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x22, 0x22, 0x23, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x11, 0x11, 0x11, 0x10, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x03, 0x22, 0x22, 0x22, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x22, 0x22, 0x26, 0x22, 0x22, 0x22, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x11, 0x11, 0x70, 0x71, 0x11, 0x11, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x11, 0x11, 0x17, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, // /* code=220, hex=0xDC, ascii="!\" */ + // 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=222, hex=0xDE, ascii="!^" */ + // 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x02, 0x55, 0x55, 0x20, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x44, 0x57, 0x44, 0x47, 0x44, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0x32, 0x22, 0x22, 0x22, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x00, 0x07, 0x22, 0x22, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x00, 0x07, 0x21, 0x01, 0x27, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x75, 0x55, 0x20, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x44, 0x44, 0x47, 0x44, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x00, 0x02, 0x51, 0x11, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x00, 0x00, 0x31, 0x22, 0x13, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x01, 0x24, 0x74, 0x21, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x01, 0x24, 0x42, 0x26, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x12, 0x21, 0x34, 0x43, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x25, 0x52, 0x00, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x11, 0x35, 0x53, 0x11, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0x03, 0x44, 0x74, 0x43, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x03, 0x44, 0x44, 0x40, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x01, 0x17, 0x11, 0x07, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x04, 0x21, 0x01, 0x24, 0x07, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x12, 0x42, 0x10, 0x07, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x11, 0x11, 0x11, 0x11, 0x52, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x11, 0x07, 0x01, 0x10, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x25, 0x02, 0x50, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x34, 0x43, 0x00, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x13, 0x10, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x01, 0x11, 0x11, 0x55, 0x31, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x56, 0x44, 0x44, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x34, 0x03, 0x47, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x03, 0x33, 0x33, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_5x8.h b/wled00/src/font/console_font_5x8.h index f2194a1f4e..4f503f2500 100644 --- a/wled00/src/font/console_font_5x8.h +++ b/wled00/src/font/console_font_5x8.h @@ -1,19 +1,20 @@ -// font courtesy of https://github.com/idispatch/raster-fonts - // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts /* * WBF (WLED Bitmap Font) Packed Fixed-Width Format - * Header Layout (10 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height: 8 - * [2] Fixed/max glyph width: 5 - * [3] Flags: 0x00 (fixed width) - * [4] First Char: 32 - * [5] Last Char: 126 - * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 - * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed/max glyph width: 4 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -34,266 +35,266 @@ * [Byte 1] [Byte 2] [Byte 3] * Final HEX for '!' = 0x22, 0x20, 0x20 * - * at the end of the stream, padding bits are added if necessary to fill the last byte + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ static const unsigned char console_font_5x8[] PROGMEM = { - 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + 0x57, 0x08, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x00, 0x1D, 0x5F, 0xED, 0xC0, // /* code=1, hex=0x01, ascii="^A" */ - // 0x00, 0x1D, 0x5F, 0xFD, 0xC0, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0x15, 0xFF, 0xB8, 0x80, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x08, 0xEF, 0xB8, 0x80, // /* code=4, hex=0x04, ascii="^D" */ - // 0x00, 0x1D, 0x5F, 0x90, 0x80, // /* code=5, hex=0x05, ascii="^E" */ - // 0x00, 0x08, 0xEF, 0xD4, 0x80, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x47, 0x10, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x0E, 0x36, 0xD1, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x00, 0x08, 0xA2, 0x38, 0x80, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x08, 0xA4, 0x62, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x0E, 0x95, 0xEA, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x10, 0xC7, 0x31, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x04, 0x67, 0x18, 0x40, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x00, 0x08, 0xE2, 0x38, 0x80, // /* code=18, hex=0x12, ascii="^R" */ - // 0x00, 0x14, 0xA5, 0x01, 0x40, // /* code=19, hex=0x13, ascii="^S" */ - // 0x00, 0x1F, 0xAD, 0x29, 0x4A, // /* code=20, hex=0x14, ascii="^T" */ - // 0x00, 0x06, 0xC9, 0x24, 0xD8, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x7F, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ - // 0x00, 0x08, 0xE2, 0x38, 0x8E, // /* code=23, hex=0x17, ascii="^W" */ - // 0x00, 0x08, 0xE2, 0x10, 0x80, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x08, 0x42, 0x38, 0x80, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0x2F, 0x88, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x00, 0x8F, 0xA0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x08, 0x7C, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x00, 0xAF, 0xA8, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x02, 0x3B, 0xE0, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x00, 0x0F, 0xB8, 0x80, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x08, 0x42, 0x00, 0x80, /* code=33, hex=0x21, ascii="!" */ - 0x00, 0x14, 0xA0, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0x15, 0xF5, 0x7D, 0x40, /* code=35, hex=0x23, ascii="#" */ - 0x00, 0x08, 0x64, 0x19, 0x84, /* code=36, hex=0x24, ascii="$" */ - 0x02, 0x2A, 0xA3, 0x36, 0x40, /* code=37, hex=0x25, ascii="%" */ - 0x00, 0x0C, 0x86, 0xC9, 0xA0, /* code=38, hex=0x26, ascii="&" */ - 0x01, 0x08, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x00, 0x08, 0x84, 0x20, 0x80, /* code=40, hex=0x28, ascii="(" */ - 0x00, 0x10, 0x42, 0x11, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x14, 0x47, 0x11, 0x40, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x00, 0x47, 0x10, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x88, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x01, 0xE0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x80, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x04, 0x42, 0x21, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x00, 0x19, 0x29, 0x49, 0x80, /* code=48, hex=0x30, ascii="0" */ - 0x00, 0x08, 0xC2, 0x10, 0x80, /* code=49, hex=0x31, ascii="1" */ - 0x00, 0x19, 0x22, 0x23, 0xC0, /* code=50, hex=0x32, ascii="2" */ - 0x00, 0x38, 0x26, 0x0B, 0x80, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x04, 0x65, 0x78, 0x40, /* code=52, hex=0x34, ascii="4" */ - 0x00, 0x3D, 0x0E, 0x0B, 0x80, /* code=53, hex=0x35, ascii="5" */ - 0x00, 0x19, 0x0E, 0x49, 0x80, /* code=54, hex=0x36, ascii="6" */ - 0x00, 0x3C, 0x22, 0x21, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x00, 0x19, 0x26, 0x49, 0x80, /* code=56, hex=0x38, ascii="8" */ - 0x00, 0x19, 0x27, 0x09, 0x80, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0x02, 0x00, 0x80, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0x02, 0x00, 0x88, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x04, 0x44, 0x10, 0x40, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0xE0, 0x38, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x10, 0x41, 0x11, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x00, 0x18, 0x26, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x00, 0x1D, 0x1B, 0x41, 0xC0, /* code=64, hex=0x40, ascii="@" */ - 0x00, 0x19, 0x2F, 0x4A, 0x40, /* code=65, hex=0x41, ascii="A" */ - 0x00, 0x39, 0x2E, 0x4B, 0x80, /* code=66, hex=0x42, ascii="B" */ - 0x00, 0x1D, 0x08, 0x41, 0xC0, /* code=67, hex=0x43, ascii="C" */ - 0x00, 0x39, 0x29, 0x4B, 0x80, /* code=68, hex=0x44, ascii="D" */ - 0x00, 0x3D, 0x0E, 0x43, 0xC0, /* code=69, hex=0x45, ascii="E" */ - 0x00, 0x3D, 0x0E, 0x42, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x00, 0x19, 0x28, 0x49, 0xC0, /* code=71, hex=0x47, ascii="G" */ - 0x00, 0x25, 0x2F, 0x4A, 0x40, /* code=72, hex=0x48, ascii="H" */ - 0x00, 0x1C, 0x42, 0x11, 0xC0, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x04, 0x29, 0x49, 0x80, /* code=74, hex=0x4A, ascii="J" */ - 0x00, 0x25, 0x4C, 0x52, 0x40, /* code=75, hex=0x4B, ascii="K" */ - 0x00, 0x21, 0x08, 0x43, 0xC0, /* code=76, hex=0x4C, ascii="L" */ - 0x00, 0x25, 0xE9, 0x4A, 0x40, /* code=77, hex=0x4D, ascii="M" */ - 0x00, 0x25, 0xAB, 0x4A, 0x40, /* code=78, hex=0x4E, ascii="N" */ - 0x00, 0x19, 0x29, 0x49, 0x80, /* code=79, hex=0x4F, ascii="O" */ - 0x00, 0x39, 0x2E, 0x42, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x00, 0x19, 0x29, 0x49, 0x82, /* code=81, hex=0x51, ascii="Q" */ - 0x00, 0x39, 0x2E, 0x4A, 0x40, /* code=82, hex=0x52, ascii="R" */ - 0x00, 0x1D, 0x06, 0x0B, 0x80, /* code=83, hex=0x53, ascii="S" */ - 0x00, 0x3E, 0x42, 0x10, 0x80, /* code=84, hex=0x54, ascii="T" */ - 0x00, 0x25, 0x29, 0x49, 0x80, /* code=85, hex=0x55, ascii="U" */ - 0x00, 0x25, 0x29, 0x31, 0x80, /* code=86, hex=0x56, ascii="V" */ - 0x00, 0x23, 0x5A, 0xA9, 0x40, /* code=87, hex=0x57, ascii="W" */ - 0x00, 0x25, 0x26, 0x2A, 0x40, /* code=88, hex=0x58, ascii="X" */ - 0x00, 0x14, 0xA5, 0x10, 0x80, /* code=89, hex=0x59, ascii="Y" */ - 0x00, 0x3C, 0x44, 0x43, 0xC0, /* code=90, hex=0x5A, ascii="Z" */ - 0x00, 0x18, 0x84, 0x21, 0x80, /* code=91, hex=0x5B, ascii="[" */ - 0x00, 0x10, 0x82, 0x10, 0x40, /* code=92, hex=0x5C, ascii="\" */ - 0x00, 0x18, 0x42, 0x11, 0x80, /* code=93, hex=0x5D, ascii="]" */ - 0x00, 0x08, 0xA0, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x1F, /* code=95, hex=0x5F, ascii="_" */ - 0x00, 0x10, 0x40, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0xC1, 0x39, 0x40, /* code=97, hex=0x61, ascii="a" */ - 0x04, 0x21, 0xC9, 0x4B, 0x80, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x64, 0x20, 0xC0, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x04, 0xE9, 0x49, 0xC0, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0xCF, 0x41, 0xC0, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x0C, 0x8E, 0x21, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0xE9, 0x38, 0x4C, /* code=103, hex=0x67, ascii="g" */ - 0x00, 0x21, 0xC9, 0x4A, 0x40, /* code=104, hex=0x68, ascii="h" */ - 0x01, 0x00, 0xC2, 0x11, 0xC0, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x80, 0x21, 0x08, 0x4C, /* code=106, hex=0x6A, ascii="j" */ - 0x00, 0x21, 0x4C, 0x52, 0x40, /* code=107, hex=0x6B, ascii="k" */ - 0x03, 0x08, 0x42, 0x11, 0xC0, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x01, 0x2F, 0x4A, 0x40, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x01, 0xC9, 0x4A, 0x40, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0xC9, 0x49, 0x80, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x01, 0xC9, 0x4B, 0x90, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0xE9, 0x49, 0xC2, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0xA6, 0x21, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0xEC, 0x1B, 0x80, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x11, 0xE4, 0x20, 0xC0, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x01, 0x29, 0x49, 0xC0, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x01, 0x29, 0x31, 0x80, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x01, 0x29, 0x7A, 0x40, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x01, 0x26, 0x32, 0x40, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x01, 0x29, 0x38, 0x4C, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x01, 0xE2, 0x23, 0xC0, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x88, 0x84, 0x10, 0x40, /* code=123, hex=0x7B, ascii="{" */ - 0x01, 0x08, 0x42, 0x10, 0x80, /* code=124, hex=0x7C, ascii="|" */ - 0x02, 0x08, 0x21, 0x11, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x00, 0x00, 0xAA, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x00, 0x45, 0x47, 0xE0, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x00, 0x1D, 0x08, 0x41, 0xC4, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x02, 0x81, 0x29, 0x49, 0xC0, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x11, 0x00, 0xCF, 0x41, 0xC0, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x22, 0x81, 0x82, 0x51, 0x40, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x02, 0x81, 0x82, 0x32, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x41, 0x01, 0x82, 0x32, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x01, 0x01, 0x82, 0x32, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x64, 0x20, 0xC4, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x22, 0x80, 0xCF, 0x41, 0xC0, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x02, 0x80, 0xCF, 0x41, 0xC0, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x41, 0x00, 0xCF, 0x41, 0xC0, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x02, 0x80, 0xC2, 0x11, 0xC0, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x22, 0x80, 0xC2, 0x11, 0xC0, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x41, 0x00, 0xC2, 0x11, 0xC0, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0xA0, 0x19, 0x2F, 0x4A, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x20, 0x19, 0x2F, 0x4A, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x11, 0x3D, 0x0E, 0x43, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x01, 0xB7, 0xF2, 0xE0, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x1D, 0x4F, 0x52, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x22, 0x80, 0xC9, 0x49, 0x80, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x41, 0x00, 0xC9, 0x49, 0x80, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x22, 0x81, 0x29, 0x49, 0xC0, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x41, 0x01, 0x29, 0x49, 0xC0, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x02, 0x81, 0x29, 0x38, 0x4C, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x50, 0x25, 0x29, 0x49, 0x80, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x08, 0xE8, 0x41, 0xC4, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x01, 0x94, 0x8E, 0x23, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x06, 0xD4, 0xA2, 0x38, 0x80, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x06, 0x29, 0x6F, 0xCA, 0x20, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x01, 0x90, 0x8F, 0x21, 0x10, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x22, 0x01, 0x82, 0x32, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ - // 0x11, 0x00, 0xC2, 0x11, 0xC0, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x11, 0x00, 0xC9, 0x49, 0x80, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x11, 0x01, 0x29, 0x49, 0xC0, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x55, 0x01, 0xC9, 0x4A, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x55, 0x25, 0xAD, 0x5A, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x01, 0x14, 0x60, 0x38, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x01, 0x14, 0x40, 0x38, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x01, 0x00, 0x44, 0x49, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x00, 0x7E, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x00, 0x7C, 0x20, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x04, 0x25, 0x45, 0xC4, 0xE0, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x04, 0x65, 0x44, 0xCC, 0xE1, // /* code=172, hex=0xAC, ascii="!," */ - // 0x01, 0x00, 0x42, 0x38, 0x80, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x00, 0x05, 0x51, 0x40, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x00, 0x0A, 0x2A, 0x80, // /* code=175, hex=0xAF, ascii="!/" */ - // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=176, hex=0xB0, ascii="!0" */ - // 0xEA, 0xAE, 0xAE, 0xAA, 0xEA, // /* code=177, hex=0xB1, ascii="!1" */ - // 0xDB, 0xB6, 0xED, 0xBB, 0x6E, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x21, 0x08, 0x42, 0x10, 0x84, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x21, 0x09, 0xC2, 0x10, 0x84, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x21, 0x38, 0x4E, 0x10, 0x84, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x52, 0x95, 0xA5, 0x29, 0x4A, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x01, 0xE5, 0x29, 0x4A, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x38, 0x4E, 0x10, 0x84, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x52, 0xB4, 0x2D, 0x29, 0x4A, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x52, 0x94, 0xA5, 0x29, 0x4A, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x3C, 0x2D, 0x29, 0x4A, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x52, 0xB4, 0x2F, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x52, 0x95, 0xE0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x21, 0x38, 0x4E, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x01, 0xC2, 0x10, 0x84, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x21, 0x08, 0x70, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x21, 0x09, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x01, 0xF2, 0x10, 0x84, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x21, 0x08, 0x72, 0x10, 0x84, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x01, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x21, 0x09, 0xF2, 0x10, 0x84, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x21, 0x0E, 0x43, 0x90, 0x84, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x52, 0x94, 0xB5, 0x29, 0x4A, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x52, 0x96, 0x87, 0x80, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x1E, 0x85, 0xA9, 0x4A, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x52, 0xB6, 0x0F, 0x80, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x3E, 0x0D, 0xA9, 0x4A, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x52, 0x96, 0x85, 0xA9, 0x4A, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x3E, 0x0F, 0x80, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x52, 0xB6, 0x0D, 0xA9, 0x4A, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x21, 0x3E, 0x0F, 0x80, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x52, 0x95, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x3E, 0x0F, 0x90, 0x84, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x01, 0xF5, 0x29, 0x4A, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x52, 0x94, 0xF0, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x21, 0x0E, 0x43, 0x80, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x0E, 0x43, 0x90, 0x84, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0xF5, 0x29, 0x4A, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x52, 0x95, 0xF5, 0x29, 0x4A, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x21, 0x3E, 0x4F, 0x90, 0x84, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x21, 0x09, 0xC0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x72, 0x10, 0x84, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x0F, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xE7, 0x39, 0xCE, 0x73, 0x9C, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x18, 0xC6, 0x31, 0x8C, 0x63, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xFF, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x00, 0xD9, 0x49, 0xA0, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x03, 0x25, 0xE9, 0x4B, 0x90, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x03, 0x90, 0x84, 0x21, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x1C, 0xA5, 0x29, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x07, 0xD2, 0x44, 0x47, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x1F, 0x29, 0x49, 0x80, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x01, 0x29, 0x4B, 0xB0, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x04, 0xD4, 0x42, 0x10, 0x80, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x01, 0x08, 0xE8, 0xB8, 0x84, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x1D, 0x1F, 0xC5, 0xC0, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x1D, 0x18, 0xAB, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x64, 0x10, 0xC9, 0x49, 0x80, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0xEA, 0xD5, 0xC0, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x02, 0xEA, 0xA6, 0xC0, // /* code=237, hex=0xED, ascii="!m" */ - // 0x01, 0x90, 0xE4, 0x20, 0xC0, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x03, 0x25, 0x29, 0x4A, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0x3C, 0x0F, 0x03, 0xC0, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x09, 0xF2, 0x03, 0xE0, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x02, 0x08, 0x22, 0x23, 0xC0, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x88, 0x82, 0x09, 0xC0, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x06, 0x52, 0x10, 0x84, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x21, 0x08, 0x4A, 0x60, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x18, 0x0F, 0x01, 0x80, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x15, 0x40, 0x2A, 0x80, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x00, 0x08, 0xA2, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0xC6, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x40, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x00, 0x06, 0x22, 0x51, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x03, 0x14, 0xA0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x03, 0x04, 0x47, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x00, 0xE7, 0x38, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x00, 0x35, 0x76, 0x30, // /* code=1, hex=0x01, ascii="^A" */ + // 0x00, 0x35, 0x77, 0x30, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0x27, 0x73, 0x10, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x13, 0x73, 0x10, // /* code=4, hex=0x04, ascii="^D" */ + // 0x00, 0x35, 0x71, 0x10, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x13, 0x75, 0x10, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x01, 0x31, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x07, 0x76, 0x46, 0x77, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x01, 0x21, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x07, 0x76, 0x46, 0x77, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x10, 0x35, 0x20, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x00, 0x12, 0x13, 0x10, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x12, 0x26, 0x40, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x12, 0x26, 0x40, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x01, 0x21, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x23, 0x33, 0x20, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x01, 0x31, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x00, 0x13, 0x13, 0x10, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x22, 0x20, 0x20, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x36, 0x62, 0x22, // /* code=20, hex=0x14, ascii="^T" */ + // 0x00, 0x03, 0x42, 0x16, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x07, 0x70, // /* code=22, hex=0x16, ascii="^V" */ + // 0x00, 0x13, 0x13, 0x13, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x13, 0x11, 0x10, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x11, 0x13, 0x10, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x70, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x02, 0x72, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x47, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x02, 0x72, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x13, 0x70, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x73, 0x10, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x11, 0x10, 0x10, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0x22, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0x27, 0x27, 0x20, /* code=35, hex=0x23, ascii="#" */ + 0x00, 0x11, 0x21, 0x31, /* code=36, hex=0x24, ascii="$" */ + 0x02, 0x52, 0x13, 0x40, /* code=37, hex=0x25, ascii="%" */ + 0x00, 0x12, 0x34, 0x30, /* code=38, hex=0x26, ascii="&" */ + 0x01, 0x10, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x12, 0x22, 0x10, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x21, 0x11, 0x20, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x21, 0x31, 0x20, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x01, 0x31, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x12, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x07, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x10, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x01, 0x12, 0x20, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x34, 0x44, 0x30, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x13, 0x11, 0x10, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x34, 0x12, 0x70, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x70, 0x30, 0x70, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x01, 0x27, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0x74, 0x70, 0x70, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x34, 0x74, 0x30, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0x70, 0x12, 0x20, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x34, 0x34, 0x30, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x34, 0x30, 0x30, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x10, 0x10, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x10, 0x12, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x01, 0x21, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x03, 0x03, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x21, 0x01, 0x20, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x30, 0x30, 0x20, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x34, 0x54, 0x30, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x34, 0x74, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0x74, 0x74, 0x70, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x34, 0x44, 0x30, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0x74, 0x44, 0x70, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0x74, 0x74, 0x70, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0x74, 0x74, 0x40, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x34, 0x44, 0x30, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0x44, 0x74, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x31, 0x11, 0x30, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x00, 0x44, 0x30, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0x45, 0x65, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0x44, 0x44, 0x70, /* code=76, hex=0x4C, ascii="L" */ + 0x00, 0x47, 0x44, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0x46, 0x54, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x34, 0x44, 0x30, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0x74, 0x74, 0x40, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x34, 0x44, 0x30, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0x74, 0x74, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x34, 0x30, 0x70, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0x71, 0x11, 0x10, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0x44, 0x44, 0x30, /* code=85, hex=0x55, ascii="U" */ + 0x00, 0x44, 0x43, 0x30, /* code=86, hex=0x56, ascii="V" */ + 0x00, 0x45, 0x52, 0x20, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0x44, 0x32, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0x22, 0x21, 0x10, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0x71, 0x24, 0x70, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x32, 0x22, 0x30, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0x22, 0x11, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x31, 0x11, 0x30, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x12, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x07, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x21, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x03, 0x03, 0x20, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x47, 0x44, 0x70, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x01, 0x22, 0x10, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x03, 0x44, 0x30, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x03, 0x74, 0x30, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x12, 0x72, 0x20, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x03, 0x43, 0x03, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0x47, 0x44, 0x40, /* code=104, hex=0x68, ascii="h" */ + 0x01, 0x03, 0x11, 0x30, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x00, 0x00, 0x03, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0x45, 0x65, 0x40, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x11, 0x11, 0x30, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x04, 0x74, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x07, 0x44, 0x40, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x03, 0x44, 0x30, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x07, 0x44, 0x74, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x03, 0x44, 0x30, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x02, 0x32, 0x20, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x03, 0x61, 0x70, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x27, 0x22, 0x10, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x04, 0x44, 0x30, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x04, 0x43, 0x30, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x04, 0x47, 0x40, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x04, 0x33, 0x40, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x04, 0x43, 0x03, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x07, 0x12, 0x70, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x12, 0x21, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x01, 0x11, 0x11, 0x10, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x10, 0x01, 0x20, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x02, 0x50, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x01, 0x24, 0x70, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x34, 0x44, 0x31, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x02, 0x04, 0x44, 0x30, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x01, 0x03, 0x74, 0x30, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x12, 0x06, 0x15, 0x20, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x02, 0x06, 0x13, 0x50, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x21, 0x06, 0x13, 0x50, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x06, 0x13, 0x50, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x01, 0x22, 0x11, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x12, 0x03, 0x74, 0x30, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x02, 0x03, 0x74, 0x30, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x21, 0x03, 0x74, 0x30, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x02, 0x03, 0x11, 0x30, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x12, 0x03, 0x11, 0x30, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x21, 0x03, 0x11, 0x30, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x50, 0x34, 0x74, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x10, 0x34, 0x74, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x01, 0x74, 0x74, 0x70, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x06, 0x37, 0x50, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x35, 0x75, 0x50, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x12, 0x03, 0x44, 0x30, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x02, 0x03, 0x44, 0x30, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x21, 0x03, 0x44, 0x30, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x12, 0x04, 0x44, 0x30, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x21, 0x04, 0x44, 0x30, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x02, 0x04, 0x43, 0x03, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x02, 0x03, 0x44, 0x30, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x20, 0x44, 0x44, 0x30, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x13, 0x44, 0x31, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x22, 0x72, 0x70, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x06, 0x22, 0x13, 0x10, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x55, 0x74, 0x40, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x01, 0x22, 0x72, 0x24, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x12, 0x06, 0x13, 0x50, // /* code=160, hex=0xA0, ascii="! " */ + // 0x01, 0x03, 0x11, 0x30, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x01, 0x03, 0x44, 0x30, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x01, 0x04, 0x44, 0x30, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x25, 0x07, 0x44, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x25, 0x46, 0x65, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x01, 0x21, 0x03, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x01, 0x21, 0x03, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x01, 0x01, 0x24, 0x30, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x07, 0x40, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x07, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x04, 0x45, 0x24, 0x10, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x04, 0x45, 0x24, 0x10, // /* code=172, hex=0xAC, ascii="!," */ + // 0x01, 0x01, 0x13, 0x10, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0x25, 0x20, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x00, 0x52, 0x50, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x52, 0x52, 0x52, 0x52, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x72, 0x52, 0x72, 0x52, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x63, 0x63, 0x63, 0x63, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x11, 0x11, 0x11, 0x11, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x11, 0x17, 0x11, 0x11, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x11, 0x71, 0x71, 0x11, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x22, 0x26, 0x22, 0x22, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x07, 0x22, 0x22, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x71, 0x71, 0x11, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x22, 0x60, 0x62, 0x22, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x22, 0x22, 0x22, 0x22, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x70, 0x62, 0x22, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x22, 0x60, 0x70, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x22, 0x27, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x11, 0x71, 0x70, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x07, 0x11, 0x11, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x11, 0x11, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x11, 0x17, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x07, 0x11, 0x11, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x11, 0x11, 0x11, 0x11, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x07, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x11, 0x17, 0x11, 0x11, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x11, 0x11, 0x11, 0x11, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x22, 0x22, 0x22, 0x22, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x22, 0x22, 0x30, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x32, 0x22, 0x22, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x22, 0x60, 0x70, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x70, 0x62, 0x22, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x22, 0x22, 0x22, 0x22, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x70, 0x70, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x22, 0x60, 0x62, 0x22, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x11, 0x70, 0x70, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x22, 0x27, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x70, 0x71, 0x11, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x07, 0x22, 0x22, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x22, 0x23, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x11, 0x11, 0x10, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x11, 0x11, 0x11, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x03, 0x22, 0x22, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x22, 0x27, 0x22, 0x22, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x11, 0x71, 0x71, 0x11, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x11, 0x17, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x01, 0x11, 0x11, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0x77, 0x77, 0x77, 0x77, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x77, 0x77, // /* code=220, hex=0xDC, ascii="!\" */ + // 0x77, 0x77, 0x77, 0x77, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x00, 0x00, 0x00, 0x00, // /* code=222, hex=0xDE, ascii="!^" */ + // 0x77, 0x77, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x03, 0x44, 0x30, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x47, 0x44, 0x74, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x03, 0x22, 0x22, 0x20, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x32, 0x22, 0x20, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x07, 0x21, 0x24, 0x70, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x34, 0x44, 0x30, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x04, 0x44, 0x74, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x04, 0x21, 0x11, 0x10, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x01, 0x13, 0x43, 0x11, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x34, 0x74, 0x30, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x34, 0x42, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x34, 0x23, 0x44, 0x30, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x03, 0x55, 0x30, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x03, 0x52, 0x50, // /* code=237, hex=0xED, ascii="!m" */ + // 0x01, 0x23, 0x22, 0x10, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x03, 0x44, 0x44, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x70, 0x70, 0x70, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x17, 0x10, 0x70, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x02, 0x10, 0x12, 0x70, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x12, 0x10, 0x30, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x01, 0x11, 0x11, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x11, 0x11, 0x56, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x30, 0x70, 0x30, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x25, 0x02, 0x50, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x12, 0x10, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x03, 0x30, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x01, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x00, 0x15, 0x20, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x03, 0x22, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x03, 0x01, 0x30, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x03, 0x33, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_6x8.h b/wled00/src/font/console_font_6x8.h index 3fbe0b4054..7f6c590bf9 100644 --- a/wled00/src/font/console_font_6x8.h +++ b/wled00/src/font/console_font_6x8.h @@ -1,19 +1,20 @@ -// font courtesy of https://github.com/idispatch/raster-fonts - // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts /* * WBF (WLED Bitmap Font) Packed Fixed-Width Format - * Header Layout (10 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height: 8 - * [2] Fixed glyph width: 6 - * [3] Flags: 0x00 (fixed width) - * [4] First Char: 32 - * [5] Last Char: 126 - * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 - * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed/max glyph width: 5 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -34,266 +35,266 @@ * [Byte 1] [Byte 2] [Byte 3] * Final HEX for '!' = 0x22, 0x20, 0x20 * - * at the end of the stream, padding bits are added if necessary to fill the last byte + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ static const unsigned char console_font_6x8[] PROGMEM = { - 0x57, 0x08, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x39, 0x16, 0xD1, 0x55, 0x13, 0x80, // /* code=1, hex=0x01, ascii="^A" */ - // 0x39, 0xF5, 0x5F, 0x45, 0xF3, 0x80, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0xA7, 0xDF, 0x7C, 0xE1, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x43, 0x9F, 0x7C, 0xE1, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x10, 0xE3, 0x84, 0x7D, 0xF1, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x00, 0x43, 0x9F, 0x7C, 0x43, 0x80, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0xFF, 0xFF, 0xF3, 0xCF, 0xFF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x07, 0x92, 0x49, 0xE0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0xFF, 0xF8, 0x6D, 0xB6, 0x1F, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x70, 0xCD, 0x49, 0x23, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x39, 0x14, 0x4E, 0x10, 0xE1, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x10, 0x61, 0x44, 0x31, 0xC6, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x0C, 0xD2, 0xCD, 0x2D, 0xB6, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x01, 0x53, 0x9B, 0x39, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x20, 0xC3, 0x8F, 0x38, 0xC2, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x08, 0x63, 0x9E, 0x38, 0x60, 0x80, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x28, 0xA2, 0x8A, 0x28, 0x02, 0x80, // /* code=19, hex=0x13, ascii="^S" */ - // 0x3D, 0x55, 0x4D, 0x14, 0x51, 0x40, // /* code=20, hex=0x14, ascii="^T" */ - // 0x39, 0x13, 0x0A, 0x19, 0x13, 0x80, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x01, 0xE7, 0x80, // /* code=22, hex=0x16, ascii="^V" */ - // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x0E, // /* code=23, hex=0x17, ascii="^W" */ - // 0x10, 0xE7, 0xC4, 0x10, 0x41, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x10, 0x41, 0x04, 0x7C, 0xE1, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x41, 0x9F, 0x18, 0x40, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x43, 0x1F, 0x30, 0x40, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x10, 0x41, 0x07, 0xC0, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0xA2, 0x9F, 0x28, 0xA0, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x10, 0x43, 0x8E, 0x7D, 0xF0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x7D, 0xF3, 0x8E, 0x10, 0x40, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x10, 0xE3, 0x84, 0x10, 0x01, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x6D, 0xB4, 0x80, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0xA7, 0xCA, 0x29, 0xF2, 0x80, /* code=35, hex=0x23, ascii="#" */ - 0x20, 0xE4, 0x0C, 0x09, 0xC1, 0x00, /* code=36, hex=0x24, ascii="$" */ - 0x65, 0x90, 0x84, 0x21, 0x34, 0xC0, /* code=37, hex=0x25, ascii="%" */ - 0x21, 0x45, 0x08, 0x55, 0x23, 0x40, /* code=38, hex=0x26, ascii="&" */ - 0x30, 0xC2, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x10, 0x82, 0x08, 0x20, 0x81, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x20, 0x41, 0x04, 0x10, 0x42, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0xA3, 0x9F, 0x38, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x41, 0x1F, 0x10, 0x40, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0xC3, 0x08, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x39, 0x14, 0xD5, 0x65, 0x13, 0x80, /* code=48, hex=0x30, ascii="0" */ - 0x10, 0xC1, 0x04, 0x10, 0x43, 0x80, /* code=49, hex=0x31, ascii="1" */ - 0x39, 0x10, 0x46, 0x21, 0x07, 0xC0, /* code=50, hex=0x32, ascii="2" */ - 0x39, 0x10, 0x4E, 0x05, 0x13, 0x80, /* code=51, hex=0x33, ascii="3" */ - 0x08, 0x62, 0x92, 0x7C, 0x20, 0x80, /* code=52, hex=0x34, ascii="4" */ - 0x7D, 0x04, 0x1E, 0x05, 0x13, 0x80, /* code=53, hex=0x35, ascii="5" */ - 0x18, 0x84, 0x1E, 0x45, 0x13, 0x80, /* code=54, hex=0x36, ascii="6" */ - 0x7C, 0x10, 0x84, 0x20, 0x82, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x39, 0x14, 0x4E, 0x45, 0x13, 0x80, /* code=56, hex=0x38, ascii="8" */ - 0x39, 0x14, 0x4F, 0x04, 0x23, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x08, /* code=59, hex=0x3B, ascii=";" */ - 0x08, 0x42, 0x10, 0x20, 0x40, 0x80, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x20, 0x40, 0x81, 0x08, 0x42, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x39, 0x10, 0x46, 0x10, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x39, 0x15, 0xD5, 0x5D, 0x03, 0x80, /* code=64, hex=0x40, ascii="@" */ - 0x39, 0x14, 0x51, 0x7D, 0x14, 0x40, /* code=65, hex=0x41, ascii="A" */ - 0x79, 0x14, 0x5E, 0x45, 0x17, 0x80, /* code=66, hex=0x42, ascii="B" */ - 0x39, 0x14, 0x10, 0x41, 0x13, 0x80, /* code=67, hex=0x43, ascii="C" */ - 0x79, 0x14, 0x51, 0x45, 0x17, 0x80, /* code=68, hex=0x44, ascii="D" */ - 0x7D, 0x04, 0x1E, 0x41, 0x07, 0xC0, /* code=69, hex=0x45, ascii="E" */ - 0x7D, 0x04, 0x1E, 0x41, 0x04, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x39, 0x14, 0x17, 0x45, 0x13, 0xC0, /* code=71, hex=0x47, ascii="G" */ - 0x45, 0x14, 0x5F, 0x45, 0x14, 0x40, /* code=72, hex=0x48, ascii="H" */ - 0x38, 0x41, 0x04, 0x10, 0x43, 0x80, /* code=73, hex=0x49, ascii="I" */ - 0x04, 0x10, 0x41, 0x45, 0x13, 0x80, /* code=74, hex=0x4A, ascii="J" */ - 0x45, 0x25, 0x18, 0x51, 0x24, 0x40, /* code=75, hex=0x4B, ascii="K" */ - 0x41, 0x04, 0x10, 0x41, 0x07, 0xC0, /* code=76, hex=0x4C, ascii="L" */ - 0x45, 0xB5, 0x51, 0x45, 0x14, 0x40, /* code=77, hex=0x4D, ascii="M" */ - 0x45, 0x95, 0x53, 0x45, 0x14, 0x40, /* code=78, hex=0x4E, ascii="N" */ - 0x39, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=79, hex=0x4F, ascii="O" */ - 0x79, 0x14, 0x5E, 0x41, 0x04, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x39, 0x14, 0x51, 0x55, 0x23, 0x40, /* code=81, hex=0x51, ascii="Q" */ - 0x79, 0x14, 0x5E, 0x49, 0x14, 0x40, /* code=82, hex=0x52, ascii="R" */ - 0x39, 0x14, 0x0E, 0x05, 0x13, 0x80, /* code=83, hex=0x53, ascii="S" */ - 0x7C, 0x41, 0x04, 0x10, 0x41, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x45, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=85, hex=0x55, ascii="U" */ - 0x45, 0x14, 0x51, 0x44, 0xA1, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x45, 0x15, 0x55, 0x55, 0x52, 0x80, /* code=87, hex=0x57, ascii="W" */ - 0x45, 0x12, 0x84, 0x29, 0x14, 0x40, /* code=88, hex=0x58, ascii="X" */ - 0x45, 0x14, 0x4A, 0x10, 0x41, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x78, 0x21, 0x08, 0x41, 0x07, 0x80, /* code=90, hex=0x5A, ascii="Z" */ - 0x38, 0x82, 0x08, 0x20, 0x83, 0x80, /* code=91, hex=0x5B, ascii="[" */ - 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x38, 0x20, 0x82, 0x08, 0x23, 0x80, /* code=93, hex=0x5D, ascii="]" */ - 0x10, 0xA4, 0x40, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, /* code=95, hex=0x5F, ascii="_" */ - 0x30, 0xC1, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x03, 0x81, 0x3D, 0x13, 0xC0, /* code=97, hex=0x61, ascii="a" */ - 0x41, 0x07, 0x91, 0x45, 0x17, 0x80, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x03, 0x91, 0x41, 0x13, 0x80, /* code=99, hex=0x63, ascii="c" */ - 0x04, 0x13, 0xD1, 0x45, 0x13, 0xC0, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x03, 0x91, 0x79, 0x03, 0x80, /* code=101, hex=0x65, ascii="e" */ - 0x18, 0x82, 0x1E, 0x20, 0x82, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x03, 0xD1, 0x44, 0xF0, 0x4E, /* code=103, hex=0x67, ascii="g" */ - 0x41, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=104, hex=0x68, ascii="h" */ - 0x10, 0x01, 0x04, 0x10, 0x41, 0x80, /* code=105, hex=0x69, ascii="i" */ - 0x08, 0x01, 0x82, 0x08, 0x24, 0x8C, /* code=106, hex=0x6A, ascii="j" */ - 0x41, 0x04, 0x94, 0x61, 0x44, 0x80, /* code=107, hex=0x6B, ascii="k" */ - 0x10, 0x41, 0x04, 0x10, 0x41, 0x80, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x06, 0x95, 0x55, 0x14, 0x40, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x03, 0x91, 0x45, 0x13, 0x80, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x07, 0x91, 0x45, 0x17, 0x90, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x03, 0xD1, 0x45, 0x13, 0xC1, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x05, 0x89, 0x20, 0x87, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x03, 0x90, 0x38, 0x13, 0x80, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x87, 0x88, 0x20, 0xA1, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x04, 0x92, 0x49, 0x62, 0x80, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x04, 0x51, 0x44, 0xA1, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x04, 0x51, 0x55, 0xF2, 0x80, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x04, 0x92, 0x31, 0x24, 0x80, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x04, 0x92, 0x48, 0xE1, 0x18, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x07, 0x82, 0x31, 0x07, 0x80, /* code=122, hex=0x7A, ascii="z" */ - 0x18, 0x82, 0x18, 0x20, 0x81, 0x80, /* code=123, hex=0x7B, ascii="{" */ - 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x30, 0x20, 0x83, 0x08, 0x23, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x10, 0xE6, 0xD1, 0x45, 0xF0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x39, 0x14, 0x10, 0x44, 0xE1, 0x0C, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x48, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x0C, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x38, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x28, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x30, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x38, 0xA3, 0x81, 0x3D, 0x13, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0xE4, 0x50, 0x44, 0xE1, 0x0C, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x38, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x28, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x30, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x28, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x10, 0xA0, 0x04, 0x10, 0x41, 0x80, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x20, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x28, 0x01, 0x0A, 0x45, 0xF4, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x38, 0xA3, 0x9B, 0x45, 0xF4, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x0C, 0x07, 0xD0, 0x79, 0x07, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x07, 0x85, 0x7D, 0x43, 0xC0, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x3D, 0x45, 0x1F, 0x51, 0x45, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x38, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x28, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x60, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x38, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x60, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x28, 0x04, 0x92, 0x48, 0xE1, 0x18, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x48, 0xC4, 0x92, 0x49, 0x23, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x28, 0x04, 0x92, 0x49, 0x23, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x43, 0x90, 0x40, 0xE1, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x18, 0x92, 0x1E, 0x20, 0x95, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x44, 0xA1, 0x1F, 0x11, 0xF1, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x61, 0x45, 0x1A, 0x5D, 0x24, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x08, 0x51, 0x0E, 0x10, 0x45, 0x08, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x18, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ - // 0x18, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x18, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x18, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x29, 0x40, 0x1C, 0x49, 0x24, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x29, 0x40, 0x12, 0x69, 0x64, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x38, 0x13, 0xD1, 0x3C, 0x03, 0xC0, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x31, 0x24, 0x92, 0x30, 0x07, 0x80, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x10, 0x01, 0x0C, 0x41, 0x13, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x07, 0xD0, 0x41, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x0F, 0xC1, 0x04, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x41, 0x25, 0x0E, 0x44, 0x21, 0xC0, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x41, 0x25, 0x0B, 0x54, 0x70, 0x40, // /* code=172, hex=0xAC, ascii="!," */ - // 0x10, 0x01, 0x04, 0x38, 0xE1, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x02, 0x52, 0x24, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x04, 0x89, 0x48, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x54, 0x0A, 0x80, 0x54, 0x0A, 0x80, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x56, 0xA5, 0x6A, 0x56, 0xA5, 0x6A, // /* code=177, hex=0xB1, ascii="!1" */ - // 0xAB, 0xF5, 0x7F, 0xAB, 0xF5, 0x7F, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x10, 0x41, 0x3C, 0x10, 0x41, 0x04, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x13, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x51, 0x45, 0x34, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x3C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x03, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x53, 0x41, 0x34, 0x51, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x03, 0xC1, 0x34, 0x51, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x53, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x51, 0x45, 0x3C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x13, 0xC1, 0x3C, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x3C, 0x10, 0x41, 0x04, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x10, 0x41, 0x07, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x10, 0x41, 0x3F, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x3F, 0x10, 0x41, 0x04, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x10, 0x41, 0x07, 0x10, 0x41, 0x04, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x10, 0x41, 0x3F, 0x10, 0x41, 0x04, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x10, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x51, 0x45, 0x17, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x51, 0x74, 0x1F, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x01, 0xF4, 0x17, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x53, 0x70, 0x3F, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x03, 0xF0, 0x37, 0x51, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x51, 0x74, 0x17, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x53, 0x70, 0x37, 0x51, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x13, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x51, 0x45, 0x3F, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x03, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x3F, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x51, 0x45, 0x1F, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x10, 0x71, 0x07, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x1F, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x51, 0x45, 0x37, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x13, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x10, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x07, 0x10, 0x41, 0x04, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x03, 0x52, 0x48, 0xD0, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x01, 0xC4, 0x9C, 0x49, 0x27, 0x10, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x79, 0x24, 0x10, 0x41, 0x04, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x01, 0xF2, 0x8A, 0x28, 0xA2, 0x80, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x79, 0x22, 0x04, 0x21, 0x27, 0x80, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x03, 0xD2, 0x48, 0xC0, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x04, 0x92, 0x49, 0xC4, 0x10, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x02, 0x94, 0x10, 0x41, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x38, 0x43, 0x91, 0x38, 0x43, 0x80, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x31, 0x24, 0x9E, 0x49, 0x23, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0xE4, 0x51, 0x28, 0xA6, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x31, 0x02, 0x04, 0x39, 0x23, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x02, 0x95, 0x54, 0xA0, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x43, 0x95, 0x54, 0xE1, 0x00, // /* code=237, hex=0xED, ascii="!m" */ - // 0x00, 0xE4, 0x1E, 0x40, 0xE0, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0xC4, 0x92, 0x49, 0x20, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x43, 0x84, 0x00, 0xE0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x40, 0xC0, 0x8C, 0x40, 0x07, 0x80, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x08, 0xC4, 0x0C, 0x08, 0x07, 0x80, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x21, 0x44, 0x10, 0x41, 0x04, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x10, 0x41, 0x04, 0x11, 0x42, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x40, 0x1F, 0x00, 0x40, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0xA5, 0x00, 0x29, 0x40, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x31, 0x24, 0x8C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x00, 0x71, 0x04, 0x51, 0x42, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x50, 0xA2, 0x8A, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x60, 0x42, 0x1C, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x07, 0x9E, 0x79, 0xE0, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x19, 0x0C, 0x42, 0x90, 0x60, // /* code=1, hex=0x01, ascii="^A" */ + // 0x19, 0xCA, 0x72, 0x1C, 0x60, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0x8E, 0x73, 0x8C, 0x20, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x46, 0x73, 0x8C, 0x20, // /* code=4, hex=0x04, ascii="^D" */ + // 0x08, 0xC6, 0x13, 0x9C, 0x20, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x46, 0x73, 0x84, 0x60, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x31, 0x80, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x7B, 0xDE, 0xC6, 0x3D, 0xEF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x0E, 0x42, 0x1C, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x7B, 0xD0, 0xB5, 0xA1, 0xEF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x40, 0x32, 0x10, 0x60, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x19, 0x08, 0x30, 0x8C, 0x20, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x08, 0x42, 0x11, 0x9C, 0xC0, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0xC4, 0x31, 0x18, 0xC0, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x01, 0x46, 0x61, 0x94, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x10, 0xC6, 0x31, 0x8C, 0x40, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x46, 0x71, 0x84, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x08, 0xCE, 0x13, 0x8C, 0x20, // /* code=18, hex=0x12, ascii="^R" */ + // 0x10, 0x84, 0x21, 0x00, 0x40, // /* code=19, hex=0x13, ascii="^S" */ + // 0x19, 0x4A, 0x30, 0x84, 0x20, // /* code=20, hex=0x14, ascii="^T" */ + // 0x19, 0x06, 0x20, 0x90, 0x60, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x1C, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ + // 0x08, 0xCE, 0x13, 0x8C, 0x23, // /* code=23, hex=0x17, ascii="^W" */ + // 0x08, 0xCE, 0x10, 0x84, 0x20, // /* code=24, hex=0x18, ascii="^X" */ + // 0x08, 0x42, 0x13, 0x8C, 0x20, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x42, 0x70, 0x84, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x46, 0x71, 0x84, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x42, 0x10, 0xE0, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x84, 0x71, 0x08, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x08, 0x46, 0x33, 0x9C, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x39, 0xC6, 0x30, 0x84, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x08, 0xC6, 0x10, 0x80, 0x20, /* code=33, hex=0x21, ascii="!" */ + 0x31, 0x88, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0x8E, 0x21, 0x1C, 0x40, /* code=35, hex=0x23, ascii="#" */ + 0x10, 0xC8, 0x30, 0x1C, 0x20, /* code=36, hex=0x24, ascii="$" */ + 0x31, 0x80, 0x11, 0x10, 0x80, /* code=37, hex=0x25, ascii="%" */ + 0x11, 0x4A, 0x22, 0x90, 0x60, /* code=38, hex=0x26, ascii="&" */ + 0x18, 0xC4, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x08, 0x84, 0x21, 0x08, 0x20, /* code=40, hex=0x28, ascii="(" */ + 0x10, 0x42, 0x10, 0x84, 0x40, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x86, 0x71, 0x88, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x42, 0x70, 0x84, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x0C, 0x62, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x70, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x0C, 0x60, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x00, 0x11, 0x10, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x19, 0x08, 0x53, 0x10, 0x60, /* code=48, hex=0x30, ascii="0" */ + 0x08, 0xC2, 0x10, 0x84, 0x60, /* code=49, hex=0x31, ascii="1" */ + 0x19, 0x00, 0x11, 0x10, 0xE0, /* code=50, hex=0x32, ascii="2" */ + 0x19, 0x00, 0x30, 0x10, 0x60, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x44, 0x43, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x39, 0x08, 0x70, 0x10, 0x60, /* code=53, hex=0x35, ascii="5" */ + 0x08, 0x88, 0x72, 0x10, 0x60, /* code=54, hex=0x36, ascii="6" */ + 0x38, 0x00, 0x11, 0x08, 0x40, /* code=55, hex=0x37, ascii="7" */ + 0x19, 0x08, 0x32, 0x10, 0x60, /* code=56, hex=0x38, ascii="8" */ + 0x19, 0x08, 0x30, 0x00, 0x60, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x06, 0x30, 0x0C, 0x60, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x06, 0x30, 0x0C, 0x62, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x44, 0x41, 0x04, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x0E, 0x00, 0x1C, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x10, 0x40, 0x00, 0x04, 0x40, /* code=62, hex=0x3E, ascii=">" */ + 0x19, 0x00, 0x10, 0x80, 0x20, /* code=63, hex=0x3F, ascii="?" */ + 0x19, 0x0A, 0x52, 0x90, 0x60, /* code=64, hex=0x40, ascii="@" */ + 0x19, 0x08, 0x43, 0x90, 0x80, /* code=65, hex=0x41, ascii="A" */ + 0x39, 0x08, 0x72, 0x10, 0xE0, /* code=66, hex=0x42, ascii="B" */ + 0x19, 0x08, 0x42, 0x10, 0x60, /* code=67, hex=0x43, ascii="C" */ + 0x39, 0x08, 0x42, 0x10, 0xE0, /* code=68, hex=0x44, ascii="D" */ + 0x39, 0x08, 0x72, 0x10, 0xE0, /* code=69, hex=0x45, ascii="E" */ + 0x39, 0x08, 0x72, 0x10, 0x80, /* code=70, hex=0x46, ascii="F" */ + 0x19, 0x08, 0x52, 0x10, 0x60, /* code=71, hex=0x47, ascii="G" */ + 0x21, 0x08, 0x72, 0x10, 0x80, /* code=72, hex=0x48, ascii="H" */ + 0x18, 0x42, 0x10, 0x84, 0x60, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x00, 0x02, 0x10, 0x60, /* code=74, hex=0x4A, ascii="J" */ + 0x21, 0x0A, 0x62, 0x90, 0x80, /* code=75, hex=0x4B, ascii="K" */ + 0x21, 0x08, 0x42, 0x10, 0xE0, /* code=76, hex=0x4C, ascii="L" */ + 0x21, 0x8A, 0x42, 0x10, 0x80, /* code=77, hex=0x4D, ascii="M" */ + 0x21, 0x8A, 0x42, 0x10, 0x80, /* code=78, hex=0x4E, ascii="N" */ + 0x19, 0x08, 0x42, 0x10, 0x60, /* code=79, hex=0x4F, ascii="O" */ + 0x39, 0x08, 0x72, 0x10, 0x80, /* code=80, hex=0x50, ascii="P" */ + 0x19, 0x08, 0x42, 0x90, 0x60, /* code=81, hex=0x51, ascii="Q" */ + 0x39, 0x08, 0x72, 0x10, 0x80, /* code=82, hex=0x52, ascii="R" */ + 0x19, 0x08, 0x30, 0x10, 0x60, /* code=83, hex=0x53, ascii="S" */ + 0x38, 0x42, 0x10, 0x84, 0x20, /* code=84, hex=0x54, ascii="T" */ + 0x21, 0x08, 0x42, 0x10, 0x60, /* code=85, hex=0x55, ascii="U" */ + 0x21, 0x08, 0x42, 0x08, 0x20, /* code=86, hex=0x56, ascii="V" */ + 0x21, 0x0A, 0x52, 0x94, 0x40, /* code=87, hex=0x57, ascii="W" */ + 0x21, 0x04, 0x11, 0x10, 0x80, /* code=88, hex=0x58, ascii="X" */ + 0x21, 0x08, 0x20, 0x84, 0x20, /* code=89, hex=0x59, ascii="Y" */ + 0x38, 0x02, 0x22, 0x10, 0xE0, /* code=90, hex=0x5A, ascii="Z" */ + 0x18, 0x84, 0x21, 0x08, 0x60, /* code=91, hex=0x5B, ascii="[" */ + 0x01, 0x04, 0x10, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x18, 0x00, 0x00, 0x00, 0x60, /* code=93, hex=0x5D, ascii="]" */ + 0x08, 0x88, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x0F, /* code=95, hex=0x5F, ascii="_" */ + 0x18, 0xC2, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x06, 0x01, 0x90, 0x60, /* code=97, hex=0x61, ascii="a" */ + 0x21, 0x0E, 0x42, 0x10, 0xE0, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x06, 0x42, 0x10, 0x60, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x06, 0x42, 0x10, 0x60, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x06, 0x43, 0x90, 0x60, /* code=101, hex=0x65, ascii="e" */ + 0x08, 0x84, 0x71, 0x08, 0x40, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x06, 0x42, 0x0C, 0x03, /* code=103, hex=0x67, ascii="g" */ + 0x21, 0x0E, 0x42, 0x10, 0x80, /* code=104, hex=0x68, ascii="h" */ + 0x08, 0x02, 0x10, 0x84, 0x20, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x02, 0x00, 0x00, 0x83, /* code=106, hex=0x6A, ascii="j" */ + 0x21, 0x08, 0x53, 0x14, 0x80, /* code=107, hex=0x6B, ascii="k" */ + 0x08, 0x42, 0x10, 0x84, 0x20, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x0C, 0x52, 0x90, 0x80, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x0E, 0x42, 0x10, 0x80, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x06, 0x42, 0x10, 0x60, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x0E, 0x42, 0x10, 0xE4, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x06, 0x42, 0x10, 0x60, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x0A, 0x21, 0x08, 0xE0, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x06, 0x41, 0x80, 0x60, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x8E, 0x21, 0x08, 0x20, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x08, 0x42, 0x14, 0x40, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x08, 0x42, 0x08, 0x20, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x08, 0x42, 0x9C, 0x40, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x08, 0x41, 0x90, 0x80, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x08, 0x42, 0x0C, 0x26, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x0E, 0x01, 0x90, 0xE0, /* code=122, hex=0x7A, ascii="z" */ + 0x08, 0x84, 0x61, 0x08, 0x20, /* code=123, hex=0x7B, ascii="{" */ + 0x08, 0x42, 0x00, 0x84, 0x20, /* code=124, hex=0x7C, ascii="|" */ + 0x18, 0x00, 0x00, 0x00, 0x60, /* code=125, hex=0x7D, ascii="}" */ + 0x11, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x08, 0xCC, 0x42, 0x1C, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x19, 0x08, 0x42, 0x0C, 0x23, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x20, 0x08, 0x42, 0x14, 0x40, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x00, 0x06, 0x43, 0x90, 0x60, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x18, 0x06, 0x01, 0x90, 0x60, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x10, 0x06, 0x01, 0x90, 0x60, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x18, 0x06, 0x01, 0x90, 0x60, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x18, 0x86, 0x01, 0x90, 0x60, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0xC8, 0x42, 0x0C, 0x23, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x18, 0x06, 0x43, 0x90, 0x60, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x10, 0x06, 0x43, 0x90, 0x60, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x18, 0x06, 0x43, 0x90, 0x60, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x10, 0x02, 0x10, 0x84, 0x20, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x08, 0x80, 0x10, 0x84, 0x20, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x10, 0x02, 0x10, 0x84, 0x20, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x10, 0x02, 0x22, 0x1C, 0x80, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x18, 0x86, 0x62, 0x1C, 0x80, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x00, 0x0E, 0x43, 0x90, 0xE0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x0E, 0x13, 0x94, 0x60, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x19, 0x4A, 0x72, 0x94, 0xA0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x18, 0x06, 0x42, 0x10, 0x60, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x10, 0x06, 0x42, 0x10, 0x60, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x30, 0x06, 0x42, 0x10, 0x60, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x18, 0x08, 0x42, 0x14, 0x40, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x30, 0x08, 0x42, 0x14, 0x40, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x10, 0x08, 0x42, 0x0C, 0x26, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x20, 0xC8, 0x42, 0x10, 0x60, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x10, 0x08, 0x42, 0x10, 0x60, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x46, 0x42, 0x0C, 0x20, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x08, 0x84, 0x71, 0x08, 0xA0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x20, 0x82, 0x70, 0x9C, 0x20, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x31, 0x4A, 0x62, 0x90, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x00, 0x42, 0x30, 0x84, 0xA2, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x08, 0x06, 0x01, 0x90, 0x60, // /* code=160, hex=0xA0, ascii="! " */ + // 0x08, 0x02, 0x10, 0x84, 0x20, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x08, 0x06, 0x42, 0x10, 0x60, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x08, 0x08, 0x42, 0x14, 0x40, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x11, 0x40, 0x72, 0x10, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x11, 0x40, 0x43, 0x14, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x18, 0x06, 0x41, 0x80, 0x60, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x19, 0x08, 0x41, 0x80, 0xE0, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x08, 0x02, 0x32, 0x10, 0x60, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x0E, 0x42, 0x10, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x1E, 0x00, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x21, 0x0A, 0x32, 0x00, 0x20, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x21, 0x0A, 0x22, 0x84, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x08, 0x02, 0x11, 0x8C, 0x20, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x04, 0x41, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x08, 0x22, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x28, 0x14, 0x02, 0x81, 0x40, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x2A, 0x8A, 0xA2, 0xA8, 0xAA, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x53, 0xCA, 0xF5, 0x3C, 0xAF, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x08, 0x42, 0xF0, 0x84, 0x21, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x0B, 0xC2, 0xF0, 0x84, 0x21, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x29, 0x4A, 0xD2, 0x94, 0xA5, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0xF2, 0x94, 0xA5, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x03, 0xC2, 0xF0, 0x84, 0x21, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x2B, 0x42, 0xD2, 0x94, 0xA5, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x29, 0x4A, 0x52, 0x94, 0xA5, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x03, 0xC2, 0xD2, 0x94, 0xA5, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x2B, 0x42, 0xF0, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x29, 0x4A, 0xF0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x0B, 0xC2, 0xF0, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0xF0, 0x84, 0x21, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x08, 0x42, 0x10, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x08, 0x42, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0xF0, 0x84, 0x21, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x08, 0x42, 0xF0, 0x84, 0x21, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x29, 0x4A, 0x52, 0x94, 0xA5, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x29, 0x48, 0x70, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x01, 0xC8, 0x52, 0x94, 0xA5, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x2B, 0x40, 0xF0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x03, 0xC0, 0xD2, 0x94, 0xA5, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x29, 0x48, 0x52, 0x94, 0xA5, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x03, 0xC0, 0xF0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x2B, 0x40, 0xD2, 0x94, 0xA5, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x0B, 0xC0, 0xF0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x29, 0x4A, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x03, 0xC0, 0xF0, 0x84, 0x21, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0xF2, 0x94, 0xA5, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x29, 0x4A, 0x70, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x08, 0x42, 0x10, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x42, 0x10, 0x84, 0x21, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x72, 0x94, 0xA5, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x29, 0x4A, 0xD2, 0x94, 0xA5, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x0B, 0xC0, 0xF0, 0x84, 0x21, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x08, 0x42, 0xF0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x10, 0x84, 0x21, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0x7B, 0xDE, 0xF7, 0xBD, 0xEF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x07, 0xBD, 0xEF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0x73, 0x9C, 0xE7, 0x39, 0xCE, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=222, hex=0xDE, ascii="!^" */ + // 0x7B, 0xDE, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x06, 0x42, 0x0C, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x01, 0xC8, 0x72, 0x10, 0xE4, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x39, 0x08, 0x42, 0x10, 0x80, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x01, 0xC4, 0x21, 0x08, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x39, 0x04, 0x11, 0x10, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x06, 0x42, 0x0C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x08, 0x42, 0x1C, 0x84, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x04, 0x50, 0x84, 0x20, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x18, 0x46, 0x41, 0x84, 0x60, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x19, 0x08, 0x72, 0x10, 0x60, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0xC8, 0x41, 0x08, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x19, 0x04, 0x11, 0x90, 0x60, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x04, 0x52, 0x88, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x46, 0x52, 0x8C, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0xC8, 0x72, 0x0C, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0xC8, 0x42, 0x10, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x01, 0xC0, 0x70, 0x1C, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x46, 0x10, 0x0C, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x20, 0xC0, 0x32, 0x00, 0xE0, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0xC8, 0x30, 0x00, 0xE0, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x02, 0x10, 0x84, 0x21, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x08, 0x42, 0x10, 0x94, 0x40, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x40, 0x70, 0x04, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x8A, 0x01, 0x14, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x19, 0x08, 0x30, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x31, 0x80, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x20, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x42, 0x12, 0x94, 0x40, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x28, 0x84, 0x20, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x30, 0x44, 0x70, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x0E, 0x73, 0x9C, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ }; diff --git a/wled00/src/font/console_font_7x9.h b/wled00/src/font/console_font_7x9.h index 58513addb7..c9996fb003 100644 --- a/wled00/src/font/console_font_7x9.h +++ b/wled00/src/font/console_font_7x9.h @@ -1,19 +1,20 @@ -// font courtesy of https://github.com/idispatch/raster-fonts - // code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), // which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts /* * WBF (WLED Bitmap Font) Packed Fixed-Width Format - * Header Layout (10 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height: 9 - * [2] Fixed glyph width: 7 - * [3] Flags: 0x00 (fixed width) - * [4] First Char: 32 - * [5] Last Char: 126 - * [6-9] Unicode Offset (not used in built in fonts): 0x00000000 - * if variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes containing the width of each glyph + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 9 + * [2] Fixed/max glyph width: 6 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. * Packing: row-by-row, top first bitstream, MSB-first. */ @@ -34,266 +35,266 @@ * [Byte 1] [Byte 2] [Byte 3] * Final HEX for '!' = 0x22, 0x20, 0x20 * - * at the end of the stream, padding bits are added if necessary to fill the last byte + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ static const unsigned char console_font_7x9[] PROGMEM = { - 0x57, 0x09, 0x07, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, Flags, First, Last, UnicodeOffset + 0x57, 0x09, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x38, 0x8A, 0xAD, 0x58, 0x35, 0x65, 0x3C, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x38, 0xFB, 0x5E, 0xBF, 0xF7, 0x71, 0xBE, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0xDB, 0xFF, 0xFF, 0xEF, 0x8E, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x20, 0xE3, 0xEF, 0xEF, 0x8E, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x38, 0x70, 0x46, 0xBF, 0xFA, 0xC4, 0x3E, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x10, 0x71, 0xF7, 0xFF, 0xEA, 0x84, 0x1C, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0xFF, 0xFF, 0x9E, 0x1C, 0x3C, 0xFF, 0xFF, 0xFE, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0xFF, 0xCF, 0x0C, 0xC9, 0x98, 0x79, 0xFF, 0xFE, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x0E, 0x0C, 0x28, 0xC3, 0xCC, 0xD9, 0x9E, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x3C, 0xCD, 0x99, 0xE1, 0x87, 0x86, 0x0C, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x70, 0xB1, 0x02, 0x04, 0x18, 0x30, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x78, 0x91, 0xE2, 0x44, 0x9B, 0x36, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x92, 0xA8, 0xE1, 0x4E, 0xE7, 0x15, 0x49, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x40, 0xC1, 0xC3, 0xC7, 0x0C, 0x10, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x08, 0x30, 0xE3, 0xC3, 0x83, 0x02, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x6C, 0xD9, 0xB3, 0x66, 0xC0, 0x1B, 0x36, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x00, 0x79, 0x52, 0xA3, 0xC2, 0x85, 0x0A, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x3C, 0xCD, 0x81, 0xE6, 0x6C, 0xCF, 0x03, 0x66, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x7C, // /* code=23, hex=0x17, ascii="^W" */ - // 0x00, 0x30, 0xF2, 0xD1, 0x83, 0x06, 0x0C, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x30, 0x60, 0xC1, 0x8B, 0x4F, 0x0C, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0x60, 0x67, 0xE1, 0x86, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x00, 0x61, 0x87, 0xE6, 0x06, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x00, 0x06, 0x0C, 0x1F, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x00, 0x93, 0x3F, 0xEC, 0xC9, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x00, 0x83, 0x8F, 0xBF, 0x80, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x00, 0x07, 0xF7, 0xC7, 0x04, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x30, 0x60, 0xC1, 0x80, 0x06, 0x0C, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x00, 0xD9, 0xB2, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x08, 0x30, 0xF3, 0x03, 0xC0, 0xDF, 0x0C, 0x10, /* code=36, hex=0x24, ascii="$" */ - 0x70, 0xA5, 0xD8, 0x61, 0x87, 0xDA, 0x87, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x38, 0xD9, 0xB1, 0xC6, 0xED, 0x9B, 0x1F, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x00, 0x30, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x00, 0x18, 0x61, 0x83, 0x06, 0x06, 0x06, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x00, 0x60, 0x60, 0x60, 0xC1, 0x86, 0x18, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x00, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x60, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x00, 0x79, 0x9B, 0x77, 0x6C, 0xD9, 0x9E, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x00, 0x31, 0xE0, 0xC1, 0x83, 0x06, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x00, 0x79, 0x9A, 0x31, 0xC6, 0x19, 0xBF, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x00, 0x79, 0x98, 0x31, 0xC0, 0xD9, 0x9E, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x18, 0x71, 0xE6, 0xCF, 0xC3, 0x0F, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x00, 0xFD, 0x9B, 0x07, 0xC0, 0xD9, 0x9E, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x00, 0x38, 0xC3, 0x07, 0xCC, 0xD9, 0x9E, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x00, 0xFD, 0x98, 0x30, 0xC3, 0x06, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x00, 0x79, 0x9B, 0x33, 0xCC, 0xD9, 0x9E, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x00, 0x79, 0x9B, 0x33, 0xE0, 0xC3, 0x1C, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x60, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x00, 0x61, 0x86, 0x06, 0x06, 0x00, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x00, 0xC0, 0xC0, 0xC3, 0x0C, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x00, 0x79, 0x98, 0x30, 0xC3, 0x00, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x00, 0x79, 0x8B, 0x76, 0xAD, 0x98, 0x9E, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x00, 0xF9, 0x9B, 0x37, 0xCC, 0xD9, 0xBE, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x00, 0xF9, 0x9B, 0x36, 0x6C, 0xD9, 0xBE, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x00, 0xFD, 0x9B, 0x07, 0x8C, 0x19, 0xBF, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x00, 0xFD, 0x9B, 0x07, 0xCC, 0x18, 0x30, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x00, 0x79, 0x9B, 0x06, 0xEC, 0xD9, 0x9F, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x00, 0xCD, 0x9B, 0x37, 0xEC, 0xD9, 0xB3, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x00, 0x78, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x3C, 0x30, 0x60, 0xCD, 0x9B, 0x1C, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x00, 0xCD, 0xB3, 0x67, 0x8D, 0x9B, 0x33, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x00, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xBF, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x00, 0xCD, 0xDB, 0xB7, 0xED, 0xD9, 0xB3, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x00, 0xF9, 0x9B, 0x36, 0x6F, 0x98, 0x30, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x00, 0x79, 0x9B, 0x36, 0x6E, 0xDB, 0x9E, 0x06, /* code=81, hex=0x51, ascii="Q" */ - 0x00, 0xF9, 0x9B, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x00, 0x79, 0x9B, 0x03, 0xC0, 0xD9, 0x9E, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x00, 0xFD, 0x68, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x00, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x00, 0xCD, 0x99, 0xE1, 0x87, 0x99, 0xB3, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x00, 0xCD, 0x9B, 0x33, 0xC3, 0x06, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x00, 0xFD, 0x98, 0x61, 0x86, 0x19, 0xBF, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x00, 0x78, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x00, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x00, 0x78, 0x30, 0x60, 0xC1, 0x83, 0x1E, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x00, 0x20, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, /* code=95, hex=0x5F, ascii="_" */ - 0x00, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x00, 0xC1, 0x83, 0xE6, 0x6C, 0xD9, 0xAE, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x01, 0xE6, 0x6C, 0x19, 0x9E, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x0C, 0x19, 0xF6, 0x6C, 0xD9, 0x9D, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0x01, 0xE6, 0x6F, 0xD8, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x38, 0xD9, 0x87, 0xC6, 0x0C, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xCF, 0x83, 0x3C, /* code=103, hex=0x67, ascii="g" */ - 0x00, 0xC1, 0x83, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x18, 0x30, 0x00, 0xC3, 0x83, 0x06, 0x1E, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x0C, 0x18, 0x00, 0x63, 0xC1, 0x93, 0x36, 0x38, /* code=106, hex=0x6A, ascii="j" */ - 0x00, 0xC1, 0x83, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x00, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x00, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x00, 0x03, 0xE6, 0x6C, 0xDD, 0xB6, 0x60, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xDB, 0x9B, 0x06, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0x01, 0x37, 0xE6, 0x0C, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0x01, 0xE6, 0x07, 0x81, 0x9E, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x00, 0x03, 0x36, 0x6C, 0xDB, 0x9B, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x00, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x00, 0x03, 0xF0, 0x63, 0x0C, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x38, 0xC1, 0x86, 0x06, 0x0C, 0x0E, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x18, 0x30, 0x60, 0xC0, 0x03, 0x06, 0x0C, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x00, 0xE0, 0x60, 0xC0, 0xC3, 0x06, 0x38, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x00, 0x20, 0xEB, 0x70, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x00, 0x20, 0xE3, 0x6C, 0x5F, 0x80, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x78, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x66, 0xCC, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x0C, 0x30, 0x01, 0xF6, 0x2F, 0xD8, 0x1F, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x1C, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x36, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x18, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x1C, 0x28, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x00, 0xE3, 0x6C, 0x0D, 0x8E, 0x78, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x08, 0x38, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x66, 0xCC, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x18, 0x18, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x66, 0xCC, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x10, 0x70, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x30, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0xC6, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x38, 0x50, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x1C, 0x61, 0xFB, 0x07, 0xCC, 0x18, 0x3F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x00, 0x03, 0xE1, 0xAF, 0xF6, 0x3F, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x3C, 0xE2, 0xC5, 0xFF, 0x36, 0x6F, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x10, 0x70, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x66, 0xCC, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x18, 0x18, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x08, 0x38, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x18, 0x18, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x66, 0xCC, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x66, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x66, 0x01, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x08, 0x10, 0xF3, 0x06, 0x07, 0x84, 0x08, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x1C, 0x6C, 0xC1, 0x87, 0xC6, 0x0F, 0x33, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x66, 0xCC, 0xF0, 0xC7, 0xE3, 0x1F, 0x8C, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0xE1, 0xA3, 0x47, 0xAC, 0xDB, 0xF3, 0x03, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x0E, 0x30, 0x60, 0xC7, 0xE3, 0x06, 0x0C, 0x70, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x06, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x0C, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x0C, 0x30, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x0C, 0x30, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x77, 0xB8, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x77, 0xB8, 0x03, 0x37, 0x6F, 0xDB, 0xB3, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x38, 0x18, 0xF3, 0x63, 0x40, 0x1F, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x3C, 0xCD, 0x99, 0xE0, 0x0F, 0xC0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x00, 0x30, 0x00, 0xC3, 0x0C, 0x19, 0x9E, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x01, 0xE3, 0xC6, 0x0C, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x03, 0xE7, 0xC1, 0x83, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x60, 0xC1, 0x83, 0x71, 0xA0, 0x86, 0x0F, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x60, 0xC1, 0x83, 0x67, 0xC5, 0x9F, 0x06, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x30, 0x00, 0xC1, 0x87, 0x8F, 0x0C, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x00, 0xCB, 0x3C, 0xCC, 0xCC, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x03, 0x33, 0x33, 0x2C, 0xF3, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x54, 0x02, 0xA8, 0x05, 0x40, 0x2A, 0x80, 0x54, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x92, 0x90, 0x94, 0x94, 0x84, 0xA4, 0xA4, 0x24, // /* code=177, hex=0xB1, ascii="!1" */ - // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x10, 0x20, 0x40, 0x8F, 0x02, 0x04, 0x08, 0x10, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x00, 0x07, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x28, 0x50, 0xA7, 0x40, 0x9D, 0x0A, 0x14, 0x28, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x28, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x00, 0x07, 0xC0, 0x9D, 0x0A, 0x14, 0x28, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x28, 0x50, 0xA7, 0x40, 0x9F, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x00, 0x0F, 0x02, 0x04, 0x08, 0x10, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x10, 0x20, 0x40, 0x81, 0xE0, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x10, 0x20, 0x40, 0x8F, 0xE0, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x04, 0x08, 0x10, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x10, 0x20, 0x40, 0x81, 0xE2, 0x04, 0x08, 0x10, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x10, 0x20, 0x40, 0x8F, 0xE2, 0x04, 0x08, 0x10, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x28, 0x50, 0xA1, 0x42, 0xE5, 0x0A, 0x14, 0x28, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x28, 0x50, 0xA1, 0x72, 0x07, 0xC0, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x00, 0x01, 0xF2, 0x05, 0xCA, 0x14, 0x28, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x28, 0x50, 0xA7, 0x70, 0x1F, 0xC0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1D, 0xCA, 0x14, 0x28, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x28, 0x50, 0xA1, 0x72, 0x05, 0xCA, 0x14, 0x28, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x28, 0x50, 0xA7, 0x70, 0x1D, 0xCA, 0x14, 0x28, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x10, 0x20, 0x47, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC4, 0x08, 0x10, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x28, 0x50, 0xA1, 0x43, 0xE0, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC0, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x00, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x00, 0x03, 0xE5, 0x0A, 0x14, 0x28, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x10, 0x20, 0x47, 0xF1, 0x1F, 0xC4, 0x08, 0x10, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x10, 0x20, 0x40, 0x8F, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x00, 0x01, 0xE2, 0x04, 0x08, 0x10, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x69, 0xA3, 0x46, 0x86, 0x80, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x7C, 0xCD, 0x9B, 0x66, 0x6C, 0x59, 0xB6, 0x08, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x00, 0xFD, 0x8B, 0x06, 0x0C, 0x18, 0x30, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x01, 0xB7, 0xFF, 0x6C, 0xDB, 0x36, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x01, 0xFF, 0x1B, 0x03, 0x86, 0x19, 0xFF, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x00, 0x01, 0xF6, 0xCD, 0x9B, 0x1C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x00, 0x01, 0xB3, 0x66, 0xCF, 0xB1, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x01, 0xEB, 0x50, 0xE1, 0x86, 0x0C, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x3C, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x1E, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x79, 0x9B, 0x37, 0xEC, 0xD9, 0x9E, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xC9, 0x33, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x00, 0x79, 0x81, 0x81, 0x87, 0x99, 0x9E, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0x01, 0xA4, 0xA9, 0x52, 0x9A, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x04, 0x79, 0x9B, 0x77, 0x6C, 0xCF, 0x08, 0x20, // /* code=237, hex=0xED, ascii="!m" */ - // 0x1E, 0x61, 0x83, 0x07, 0xEC, 0x0C, 0x0F, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0xB3, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x30, 0x63, 0xF1, 0x83, 0x00, 0x3F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x00, 0x60, 0x60, 0x61, 0x86, 0x00, 0x1E, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x18, 0x61, 0x81, 0x81, 0x80, 0x1E, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x0C, 0x34, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x2C, 0x30, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x30, 0x60, 0x07, 0xE0, 0x06, 0x0C, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x00, 0x6B, 0xB0, 0x03, 0x5D, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x00, 0x79, 0x9B, 0x33, 0xC0, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x0E, 0x18, 0x30, 0x60, 0xCD, 0x8F, 0x06, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x00, 0xF1, 0xB3, 0x66, 0xCD, 0x80, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x00, 0x71, 0x30, 0xC3, 0x0F, 0x80, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0xF9, 0xF3, 0xE7, 0xC0, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x1C, 0x85, 0x55, 0x41, 0x54, 0x8F, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x1C, 0xF6, 0x9A, 0x7D, 0x76, 0x0F, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xD7, 0xDF, 0x7C, 0xF1, 0xC2, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x21, 0xCF, 0x7C, 0xF1, 0xC2, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x1C, 0x70, 0x9A, 0x7D, 0xA0, 0x8F, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x08, 0x73, 0xDF, 0x7C, 0xA0, 0x87, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0xC7, 0x1C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x7D, 0xF7, 0x18, 0x61, 0xC7, 0xDF, 0x7C, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x31, 0xCC, 0x30, 0x70, 0xC0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x7D, 0xC6, 0x13, 0x4D, 0x87, 0x1F, 0x7C, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x04, 0x00, 0x43, 0x1C, 0xC3, 0x07, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x1C, 0xC3, 0x07, 0x0C, 0x70, 0xC3, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x71, 0x44, 0x10, 0x43, 0x0C, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x71, 0x07, 0x10, 0x43, 0x4D, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x48, 0xA1, 0xC5, 0x74, 0x72, 0x92, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x41, 0x87, 0x1C, 0x71, 0x84, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x00, 0x43, 0x1C, 0x30, 0x40, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x08, 0x73, 0xC2, 0x08, 0xF1, 0xC2, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x34, 0xD3, 0x4D, 0x34, 0x03, 0x4D, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x72, 0x8A, 0x1C, 0x20, 0x82, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x1C, 0xC3, 0x07, 0x30, 0xC1, 0xC0, 0x30, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0xF3, 0xC0, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x08, 0x73, 0xC2, 0x08, 0xF1, 0xC2, 0x3C, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x31, 0xCB, 0x0C, 0x30, 0xC3, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x30, 0xC3, 0x0C, 0xB1, 0xC3, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0xC1, 0x3C, 0x10, 0xC0, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0xC6, 0x3C, 0x60, 0xC0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x30, 0xC3, 0xC0, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x01, 0x0C, 0x7C, 0xC1, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x02, 0x1C, 0xF7, 0xC0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x1F, 0x3C, 0x70, 0x80, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x30, 0xC3, 0x0C, 0x00, 0xC3, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0xD3, 0x48, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xD3, 0x5F, 0x35, 0xF3, 0x4D, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x04, 0x31, 0xCC, 0x1C, 0x03, 0xC3, 0x08, /* code=36, hex=0x24, ascii="$" */ + 0x38, 0xA3, 0x81, 0x0C, 0x73, 0x41, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x1C, 0xD3, 0x47, 0x34, 0xD3, 0x47, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x00, 0x30, 0xC6, 0x18, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x10, 0xC6, 0x18, 0x60, 0xC1, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x60, 0xC1, 0x04, 0x10, 0xC6, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x83, 0x47, 0x7C, 0x73, 0x48, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0xC3, 0x3C, 0xF0, 0xC3, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x30, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x10, 0x43, 0x0C, 0x61, 0x8C, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x73, 0x0D, 0x38, 0xC3, 0x07, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x33, 0xC3, 0x0C, 0x30, 0xCF, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x73, 0x08, 0x0C, 0x63, 0x0F, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x73, 0x00, 0x0C, 0x03, 0x07, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x10, 0xC7, 0x34, 0xF0, 0x43, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0xF3, 0x0C, 0x3C, 0x03, 0x07, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x31, 0x8C, 0x3C, 0xC3, 0x07, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0xF3, 0x00, 0x04, 0x30, 0xC3, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x73, 0x0C, 0x1C, 0xC3, 0x07, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x73, 0x0C, 0x1C, 0x00, 0x47, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x30, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x00, 0xC6, 0x30, 0x60, 0xC0, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x01, 0x83, 0x04, 0x31, 0x80, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x73, 0x00, 0x04, 0x30, 0x03, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x73, 0x0D, 0x34, 0xD3, 0x07, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x21, 0xC5, 0x34, 0xF6, 0x18, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0F, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0xF3, 0x0C, 0x30, 0xC3, 0x0F, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0F, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0C, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x73, 0x0C, 0x34, 0xC3, 0x07, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0xC3, 0x0C, 0x3C, 0xC3, 0x0C, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x70, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x30, 0x41, 0x04, 0xD3, 0x47, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0xC3, 0x4D, 0x3C, 0xD3, 0x4C, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x01, 0x86, 0x1D, 0x7D, 0xA6, 0x9A, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0xC3, 0x8E, 0x3C, 0xD3, 0x0C, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0xF3, 0x0C, 0x30, 0xF3, 0x0C, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x73, 0x0C, 0x30, 0xE3, 0x47, 0x00, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0xF3, 0x0C, 0x34, 0xF3, 0x4C, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x73, 0x0C, 0x1C, 0x03, 0x07, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0xF2, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0xC3, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x01, 0x86, 0x0D, 0x34, 0x71, 0xC2, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x01, 0x86, 0x9A, 0x68, 0xF3, 0x48, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0xC3, 0x07, 0x0C, 0x73, 0x0C, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0xC3, 0x0C, 0x1C, 0x30, 0xC7, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0xF3, 0x01, 0x0C, 0x63, 0x0F, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x71, 0x86, 0x18, 0x61, 0x87, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x70, 0x41, 0x04, 0x10, 0x47, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x21, 0xCD, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x61, 0x83, 0x0C, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x07, 0x00, 0x73, 0x07, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x00, 0xC3, 0x0F, 0x30, 0xC3, 0x0B, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x07, 0x30, 0xF3, 0x07, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x31, 0x86, 0x3C, 0x61, 0x8F, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x07, 0x30, 0xC1, 0xC0, 0x1C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0xC3, 0x0D, 0x38, 0xC3, 0x0C, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x0C, 0x30, 0x03, 0x1C, 0x30, 0xC7, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x04, 0x10, 0x01, 0x1C, 0x12, 0x4D, 0x1C, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0xC3, 0x0C, 0x34, 0xF3, 0x4C, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x00, 0x30, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x0D, 0x7D, 0xA6, 0x9A, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x0D, 0x38, 0xC3, 0x0C, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x0F, 0x30, 0xC3, 0x8D, 0x30, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x07, 0x30, 0xC3, 0x46, 0x00, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x04, 0x3C, 0x61, 0x8F, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x07, 0x30, 0x70, 0x07, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x21, 0x9F, 0x18, 0x61, 0x83, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x0C, 0x30, 0xC3, 0x46, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x18, 0x60, 0xD1, 0xC2, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x1A, 0x68, 0xF3, 0x48, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x18, 0x34, 0x73, 0x58, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x0C, 0x30, 0x60, 0xCD, 0x1C, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x0F, 0x00, 0x31, 0x8F, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x31, 0x86, 0x30, 0x61, 0x83, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x0C, 0x30, 0xC3, 0x00, 0x30, 0xC3, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x00, 0xE0, 0xC3, 0x04, 0x30, 0xCE, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x21, 0xCD, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x43, 0x18, 0xC3, 0xC0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x3C, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x30, 0xC0, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x04, 0x30, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x0C, 0x60, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x18, 0x60, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x0C, 0x10, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x0C, 0x20, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x03, 0x18, 0xC1, 0x83, 0x3C, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x04, 0x30, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x30, 0xC0, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x0C, 0x10, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x30, 0xC0, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x08, 0x70, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x18, 0x30, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x60, 0x21, 0xC5, 0x34, 0xF6, 0x18, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x1C, 0x51, 0xC5, 0x34, 0xF6, 0x18, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x0C, 0x63, 0xCC, 0x3C, 0xC3, 0x0F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x0F, 0x0C, 0xF6, 0xCF, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x31, 0xCB, 0x2D, 0xF6, 0xDB, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x08, 0x70, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x30, 0xC0, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x0C, 0x10, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x04, 0x30, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x0C, 0x10, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x30, 0xC0, 0x0C, 0x30, 0x60, 0xCD, 0x1C, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x30, 0x01, 0xCC, 0x30, 0xC3, 0x07, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x30, 0x03, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x04, 0x11, 0xCC, 0x30, 0x70, 0x82, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x0C, 0x61, 0x86, 0x3C, 0x61, 0xCC, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x30, 0xC1, 0xC3, 0x3C, 0x33, 0xC3, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x71, 0xA6, 0x9E, 0x65, 0xB6, 0x40, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x04, 0x30, 0xC3, 0x3C, 0x30, 0xC3, 0x38, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x00, 0x10, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x04, 0x30, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x04, 0x30, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x04, 0x30, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x39, 0xB0, 0x0D, 0x38, 0xC3, 0x0C, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x39, 0xB0, 0x0C, 0x38, 0xF3, 0x4C, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x1C, 0x11, 0xCD, 0x18, 0x03, 0xC0, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x1C, 0xC3, 0x07, 0x00, 0xF0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x00, 0x30, 0x03, 0x18, 0xC3, 0x07, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x07, 0x1C, 0x61, 0x80, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x0F, 0x3C, 0x10, 0x40, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x30, 0xC3, 0x0D, 0x0C, 0x00, 0xC3, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x30, 0xC3, 0x0D, 0x3C, 0x53, 0xC1, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x30, 0x03, 0x0C, 0x71, 0xC3, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x01, 0x8C, 0x64, 0xC1, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x06, 0x4C, 0x18, 0xC6, 0x40, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x28, 0x05, 0x40, 0x28, 0x05, 0x40, 0x28, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x48, 0x91, 0x12, 0x24, 0x44, 0x89, 0x10, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x54, 0xA5, 0x4A, 0x54, 0xA5, 0x4A, 0x54, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x08, 0x20, 0x82, 0x78, 0x20, 0x82, 0x08, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x08, 0x20, 0x9E, 0x09, 0xE0, 0x82, 0x08, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x14, 0x51, 0x45, 0x74, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x7C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x1E, 0x09, 0xE0, 0x82, 0x08, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x14, 0x51, 0x5D, 0x05, 0xD1, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x1F, 0x05, 0xD1, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x14, 0x51, 0x5D, 0x05, 0xF0, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x14, 0x51, 0x45, 0x7C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x08, 0x20, 0x9E, 0x09, 0xE0, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x78, 0x20, 0x82, 0x08, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x08, 0x20, 0x82, 0x0C, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x08, 0x20, 0x82, 0x7C, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x7C, 0x20, 0x82, 0x08, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x08, 0x20, 0x82, 0x0C, 0x20, 0x82, 0x08, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x08, 0x20, 0x82, 0x7C, 0x20, 0x82, 0x08, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x08, 0x20, 0x83, 0x08, 0x30, 0x82, 0x08, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x14, 0x51, 0x45, 0x10, 0x70, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x07, 0x10, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x14, 0x51, 0x5D, 0x01, 0xF0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x1F, 0x01, 0xD1, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x14, 0x51, 0x45, 0x10, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x14, 0x51, 0x5D, 0x01, 0xD1, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x08, 0x20, 0x9F, 0x01, 0xF0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x14, 0x51, 0x45, 0x7C, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x82, 0x08, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x7C, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x14, 0x51, 0x45, 0x1C, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x08, 0x20, 0x83, 0x08, 0x30, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x03, 0x08, 0x30, 0x82, 0x08, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x1C, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x14, 0x51, 0x45, 0x74, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x08, 0x20, 0x9F, 0x09, 0xF0, 0x82, 0x08, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x08, 0x20, 0x82, 0x78, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x0C, 0x20, 0x82, 0x08, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7C, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x01, 0xF7, 0xDF, 0x7C, // /* code=220, hex=0xDC, ascii="!\" */ + // 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x78, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=222, hex=0xDE, ascii="!^" */ + // 0x7D, 0xF7, 0xDF, 0x7C, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x63, 0x4D, 0x34, 0x60, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x3C, 0xC3, 0x0D, 0x30, 0xC3, 0x0D, 0x04, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x03, 0x5F, 0x78, 0xC3, 0x4D, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x01, 0xF6, 0x0C, 0x1C, 0x63, 0x1F, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x07, 0x34, 0xD3, 0x47, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x06, 0x18, 0x61, 0xCC, 0x20, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x03, 0xCD, 0x04, 0x10, 0xC3, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x1C, 0x31, 0xCC, 0x30, 0x70, 0xC7, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x73, 0x0C, 0x3C, 0xC3, 0x07, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x73, 0x0C, 0x30, 0xC1, 0x0C, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x73, 0x06, 0x0C, 0x73, 0x07, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x06, 0x24, 0x92, 0x46, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x73, 0x0D, 0x38, 0xC1, 0xC2, 0x10, // /* code=237, hex=0xED, ascii="!m" */ + // 0x0C, 0x63, 0x0C, 0x3C, 0xC1, 0x83, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x01, 0xCC, 0x30, 0xC3, 0x0C, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x30, 0xCF, 0x0C, 0x30, 0x0F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x00, 0x60, 0xC1, 0x0C, 0x60, 0x07, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x10, 0xC6, 0x0C, 0x10, 0x07, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x04, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xCB, 0x18, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x30, 0xC0, 0x3C, 0x00, 0xC3, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0xCE, 0x00, 0x33, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x73, 0x0C, 0x1C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0xC7, 0x1C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x04, 0x10, 0x41, 0x04, 0xD1, 0xC1, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x00, 0xF3, 0x4D, 0x34, 0xD0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x00, 0x72, 0x43, 0x18, 0xF0, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0xF3, 0xCF, 0x3C, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; From e50dc583e2e6332e8d7a95d97eaa3f3b66dacda1 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 18:50:34 +0100 Subject: [PATCH 12/33] fixed up the fonts --- wled00/src/font/console_font_4x6.h | 510 +++++++++++++-------------- wled00/src/font/console_font_5x12.h | 516 ++++++++++++++-------------- wled00/src/font/console_font_5x8.h | 516 ++++++++++++++-------------- wled00/src/font/console_font_6x8.h | 516 ++++++++++++++-------------- wled00/src/font/console_font_7x9.h | 516 ++++++++++++++-------------- 5 files changed, 1287 insertions(+), 1287 deletions(-) diff --git a/wled00/src/font/console_font_4x6.h b/wled00/src/font/console_font_4x6.h index ee97fe94bb..3032192f69 100644 --- a/wled00/src/font/console_font_4x6.h +++ b/wled00/src/font/console_font_4x6.h @@ -7,7 +7,7 @@ * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 6 - * [2] Fixed/max glyph width: 3 + * [2] Fixed/max glyph width: 4 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 @@ -40,262 +40,262 @@ static const unsigned char console_font_4x6[] PROGMEM = { - 0x57, 0x06, 0x03, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x06, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset // 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x04, 0x90, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x04, 0x90, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x04, 0x90, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x90, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x04, 0x82, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x00, 0x82, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x6D, 0xB6, 0xC0, // /* code=8, hex=0x08, ascii="^H" */ - // 0x04, 0x90, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x69, 0x26, 0xC0, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x12, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x04, 0x10, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x02, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x80, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x04, 0x90, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x24, 0x92, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x80, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x04, 0x10, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x24, 0x82, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x2D, 0x92, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x04, 0x82, 0x00, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x02, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x04, 0x10, 0x40, // /* code=23, hex=0x17, ascii="^W" */ - // 0x04, 0x00, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x10, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x01, 0x80, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x05, 0x90, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x90, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x04, 0x90, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x90, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x04, 0x80, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + // 0x25, 0x75, 0x20, // /* code=1, hex=0x01, ascii="^A" */ + // 0x27, 0x57, 0x20, // /* code=2, hex=0x02, ascii="^B" */ + // 0x05, 0x77, 0x20, // /* code=3, hex=0x03, ascii="^C" */ + // 0x02, 0x77, 0x20, // /* code=4, hex=0x04, ascii="^D" */ + // 0x27, 0x72, 0x70, // /* code=5, hex=0x05, ascii="^E" */ + // 0x22, 0x72, 0x70, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x20, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xDF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x07, 0x57, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xF8, 0xA8, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x03, 0x16, 0x60, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x25, 0x27, 0x20, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x23, 0x22, 0x60, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x23, 0x51, 0x20, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x27, 0x57, 0x20, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x46, 0x76, 0x40, // /* code=16, hex=0x10, ascii="^P" */ + // 0x13, 0x73, 0x10, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x27, 0x27, 0x20, // /* code=18, hex=0x12, ascii="^R" */ + // 0x55, 0x50, 0x50, // /* code=19, hex=0x13, ascii="^S" */ + // 0x7D, 0xD5, 0x50, // /* code=20, hex=0x14, ascii="^T" */ + // 0x36, 0x53, 0x60, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x70, // /* code=22, hex=0x16, ascii="^V" */ + // 0x27, 0x27, 0x27, // /* code=23, hex=0x17, ascii="^W" */ + // 0x27, 0x22, 0x20, // /* code=24, hex=0x18, ascii="^X" */ + // 0x22, 0x27, 0x20, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x02, 0xF2, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x04, 0xF4, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x47, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x05, 0x75, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x02, 0x77, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x07, 0x72, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x00, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x24, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x24, 0x92, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x00, 0x82, 0x00, /* code=36, hex=0x24, ascii="$" */ - 0x20, 0x10, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x04, 0x12, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x24, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x04, 0x90, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x20, 0x02, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x20, 0x82, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x80, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x02, 0x40, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x80, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x12, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x04, 0x92, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x04, 0x02, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x20, 0x12, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x20, 0x02, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x04, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x24, 0x82, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x04, 0x90, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x20, 0x00, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x04, 0x10, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x04, 0x00, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x02, 0x40, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x80, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x82, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x20, 0x02, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x20, 0x00, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x24, 0x92, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x04, 0x92, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x24, 0x92, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x04, 0x90, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x24, 0x92, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x24, 0x92, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x24, 0x92, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x04, 0x90, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x24, 0x92, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x20, 0x02, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x10, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x24, 0x92, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x24, 0x92, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x24, 0x92, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x24, 0x92, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x04, 0x90, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x24, 0x92, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x04, 0x90, 0x00, /* code=81, hex=0x51, ascii="Q" */ - 0x24, 0x92, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x04, 0x82, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x20, 0x00, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x24, 0x92, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x24, 0x90, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x24, 0x92, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x24, 0x12, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x24, 0x00, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x20, 0x12, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x24, 0x92, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x24, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x20, 0x02, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x04, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0xC0, /* code=95, hex=0x5F, ascii="_" */ - 0x20, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x12, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x24, 0x92, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x10, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x10, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x90, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x80, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x90, 0x40, /* code=103, hex=0x67, ascii="g" */ - 0x24, 0x92, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x00, 0x00, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x00, 0x40, /* code=106, hex=0x6A, ascii="j" */ - 0x24, 0x92, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x00, 0x00, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x92, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x92, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x10, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x92, 0x40, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x10, 0x00, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x92, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x02, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x80, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x92, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x90, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x92, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x82, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x90, 0x40, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x80, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x80, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x00, 0x00, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x20, 0x02, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x28, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x90, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x04, 0x90, 0x40, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x20, 0x90, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x00, 0x90, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x04, 0x12, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x20, 0x12, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x20, 0x12, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x00, 0x12, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x04, 0x90, 0x40, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x04, 0x90, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x20, 0x90, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x20, 0x90, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x20, 0x00, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x04, 0x00, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x20, 0x00, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x20, 0x92, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x00, 0x92, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x00, 0x92, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x12, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x04, 0x92, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x04, 0x10, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x20, 0x10, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x20, 0x10, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x04, 0x12, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x20, 0x92, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x20, 0x90, 0x40, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x20, 0x90, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x20, 0x92, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x04, 0x90, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x00, 0x82, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x24, 0x10, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x04, 0x92, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x00, 0x02, 0x00, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x00, 0x12, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x00, 0x00, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x00, 0x92, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x00, 0x12, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x20, 0x92, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x20, 0x92, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x04, 0x82, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x04, 0x02, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x00, 0x10, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x04, 0x90, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x0C, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x24, 0x10, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x24, 0x10, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x00, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x05, 0x10, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x08, 0xA0, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x20, 0x82, 0x00, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x28, 0xA2, 0x80, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x4D, 0x34, 0xC0, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x00, 0x00, 0x00, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x01, 0x80, 0x00, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x0C, 0x30, 0x00, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x25, 0x92, 0x40, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x01, 0x92, 0x40, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x0C, 0x30, 0x00, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x2C, 0x32, 0x40, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x24, 0x92, 0x40, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x0C, 0x32, 0x40, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x2C, 0x30, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x25, 0x80, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x0C, 0x30, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x01, 0x80, 0x00, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x01, 0x80, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x01, 0x80, 0x00, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x00, 0x00, 0x00, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x01, 0x80, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x01, 0x80, 0x00, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x00, 0x00, 0x00, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x24, 0x92, 0x40, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x24, 0x90, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x04, 0x92, 0x40, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x2C, 0x30, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x0C, 0x32, 0x40, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x24, 0x92, 0x40, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x0C, 0x30, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x2C, 0x32, 0x40, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x0C, 0x30, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x25, 0x80, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x0C, 0x30, 0x00, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x01, 0x92, 0x40, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x24, 0x80, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x00, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x92, 0x40, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x25, 0x92, 0x40, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x0C, 0x30, 0x00, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x01, 0x80, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x00, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0x6D, 0xB6, 0xC0, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x36, 0xC0, // /* code=220, hex=0xDC, ascii="!\" */ - // 0x6D, 0xB6, 0xC0, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x00, 0x00, 0x00, // /* code=222, hex=0xDE, ascii="!^" */ - // 0x6D, 0x80, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x92, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x04, 0x92, 0x40, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x24, 0x92, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x24, 0x92, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x24, 0x12, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x10, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x92, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x80, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x20, 0x82, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x04, 0x90, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x92, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x04, 0x10, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x92, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x04, 0x90, 0x00, // /* code=237, hex=0xED, ascii="!m" */ - // 0x04, 0x90, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x04, 0x92, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x20, 0x82, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x04, 0x02, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x20, 0x82, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x04, 0x02, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x00, 0x00, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x00, 0x02, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x80, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x05, 0x14, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x04, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x80, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x00, 0x10, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x24, 0x80, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x20, 0x90, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x90, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + 0x22, 0x20, 0x20, /* code=33, hex=0x21, ascii="!" */ + 0x55, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x57, 0x57, 0x50, /* code=35, hex=0x23, ascii="#" */ + 0x23, 0x63, 0x62, /* code=36, hex=0x24, ascii="$" */ + 0x41, 0x24, 0x10, /* code=37, hex=0x25, ascii="%" */ + 0x25, 0x35, 0x70, /* code=38, hex=0x26, ascii="&" */ + 0x64, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x24, 0x44, 0x20, /* code=40, hex=0x28, ascii="(" */ + 0x42, 0x22, 0x40, /* code=41, hex=0x29, ascii=")" */ + 0x52, 0x72, 0x50, /* code=42, hex=0x2A, ascii="*" */ + 0x02, 0x72, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x64, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x70, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x20, /* code=46, hex=0x2E, ascii="." */ + 0x11, 0x24, 0x40, /* code=47, hex=0x2F, ascii="/" */ + 0x35, 0x55, 0x60, /* code=48, hex=0x30, ascii="0" */ + 0x26, 0x22, 0x70, /* code=49, hex=0x31, ascii="1" */ + 0x61, 0x24, 0x70, /* code=50, hex=0x32, ascii="2" */ + 0x61, 0x21, 0x60, /* code=51, hex=0x33, ascii="3" */ + 0x15, 0x71, 0x10, /* code=52, hex=0x34, ascii="4" */ + 0x74, 0x61, 0x60, /* code=53, hex=0x35, ascii="5" */ + 0x24, 0x65, 0x20, /* code=54, hex=0x36, ascii="6" */ + 0x71, 0x32, 0x20, /* code=55, hex=0x37, ascii="7" */ + 0x25, 0x25, 0x20, /* code=56, hex=0x38, ascii="8" */ + 0x25, 0x31, 0x20, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x20, 0x20, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x20, 0x64, /* code=59, hex=0x3B, ascii=";" */ + 0x12, 0x42, 0x10, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x70, 0x70, /* code=61, hex=0x3D, ascii="=" */ + 0x42, 0x12, 0x40, /* code=62, hex=0x3E, ascii=">" */ + 0x61, 0x20, 0x20, /* code=63, hex=0x3F, ascii="?" */ + 0x75, 0x54, 0x70, /* code=64, hex=0x40, ascii="@" */ + 0x25, 0x75, 0x50, /* code=65, hex=0x41, ascii="A" */ + 0x65, 0x65, 0x60, /* code=66, hex=0x42, ascii="B" */ + 0x34, 0x44, 0x30, /* code=67, hex=0x43, ascii="C" */ + 0x65, 0x55, 0x60, /* code=68, hex=0x44, ascii="D" */ + 0x74, 0x64, 0x70, /* code=69, hex=0x45, ascii="E" */ + 0x74, 0x64, 0x40, /* code=70, hex=0x46, ascii="F" */ + 0x34, 0x55, 0x30, /* code=71, hex=0x47, ascii="G" */ + 0x55, 0x75, 0x50, /* code=72, hex=0x48, ascii="H" */ + 0x72, 0x22, 0x70, /* code=73, hex=0x49, ascii="I" */ + 0x11, 0x15, 0x20, /* code=74, hex=0x4A, ascii="J" */ + 0x55, 0x65, 0x50, /* code=75, hex=0x4B, ascii="K" */ + 0x44, 0x44, 0x70, /* code=76, hex=0x4C, ascii="L" */ + 0x57, 0x75, 0x50, /* code=77, hex=0x4D, ascii="M" */ + 0x57, 0x55, 0x50, /* code=78, hex=0x4E, ascii="N" */ + 0x25, 0x55, 0x20, /* code=79, hex=0x4F, ascii="O" */ + 0x65, 0x64, 0x40, /* code=80, hex=0x50, ascii="P" */ + 0x25, 0x57, 0x30, /* code=81, hex=0x51, ascii="Q" */ + 0x65, 0x65, 0x50, /* code=82, hex=0x52, ascii="R" */ + 0x34, 0x71, 0x60, /* code=83, hex=0x53, ascii="S" */ + 0x72, 0x22, 0x20, /* code=84, hex=0x54, ascii="T" */ + 0x55, 0x55, 0x70, /* code=85, hex=0x55, ascii="U" */ + 0x55, 0x55, 0x20, /* code=86, hex=0x56, ascii="V" */ + 0x55, 0x77, 0x50, /* code=87, hex=0x57, ascii="W" */ + 0x55, 0x25, 0x50, /* code=88, hex=0x58, ascii="X" */ + 0x55, 0x22, 0x20, /* code=89, hex=0x59, ascii="Y" */ + 0x71, 0x24, 0x70, /* code=90, hex=0x5A, ascii="Z" */ + 0x64, 0x44, 0x60, /* code=91, hex=0x5B, ascii="[" */ + 0x44, 0x21, 0x10, /* code=92, hex=0x5C, ascii="\" */ + 0x62, 0x22, 0x60, /* code=93, hex=0x5D, ascii="]" */ + 0x25, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x0F, /* code=95, hex=0x5F, ascii="_" */ + 0x62, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x35, 0x70, /* code=97, hex=0x61, ascii="a" */ + 0x44, 0x65, 0x60, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x34, 0x30, /* code=99, hex=0x63, ascii="c" */ + 0x11, 0x35, 0x30, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x76, 0x30, /* code=101, hex=0x65, ascii="e" */ + 0x12, 0x72, 0x20, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x75, 0x17, /* code=103, hex=0x67, ascii="g" */ + 0x44, 0x65, 0x50, /* code=104, hex=0x68, ascii="h" */ + 0x20, 0x22, 0x20, /* code=105, hex=0x69, ascii="i" */ + 0x20, 0x22, 0x26, /* code=106, hex=0x6A, ascii="j" */ + 0x44, 0x56, 0x50, /* code=107, hex=0x6B, ascii="k" */ + 0x22, 0x22, 0x20, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x77, 0x50, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x65, 0x50, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x25, 0x20, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x65, 0x64, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x35, 0x31, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x64, 0x40, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x32, 0x60, /* code=115, hex=0x73, ascii="s" */ + 0x02, 0x72, 0x30, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x55, 0x70, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x55, 0x20, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x57, 0x70, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x52, 0x50, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x55, 0x24, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x62, 0x30, /* code=122, hex=0x7A, ascii="z" */ + 0x32, 0x62, 0x30, /* code=123, hex=0x7B, ascii="{" */ + 0x22, 0x22, 0x20, /* code=124, hex=0x7C, ascii="|" */ + 0x62, 0x32, 0x60, /* code=125, hex=0x7D, ascii="}" */ + 0x5A, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x02, 0x57, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x34, 0x47, 0x24, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x50, 0x55, 0x30, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x12, 0x76, 0x30, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x25, 0x35, 0x70, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x50, 0x35, 0x70, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x42, 0x35, 0x70, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x20, 0x35, 0x70, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x07, 0x47, 0x26, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x25, 0x76, 0x30, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x50, 0x76, 0x30, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x42, 0x76, 0x30, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x50, 0x22, 0x20, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x25, 0x02, 0x20, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x42, 0x02, 0x20, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x52, 0x57, 0x50, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x22, 0x57, 0x50, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x12, 0x76, 0x70, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x37, 0x60, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x36, 0x76, 0x70, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x25, 0x25, 0x20, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x50, 0x25, 0x20, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x42, 0x25, 0x20, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x25, 0x05, 0x70, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x42, 0x55, 0x70, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x50, 0x55, 0x24, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x52, 0x55, 0x20, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x55, 0x70, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x27, 0x47, 0x20, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x12, 0x72, 0x70, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x57, 0x27, 0x20, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x65, 0x50, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x32, 0x32, 0x60, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x12, 0x35, 0x70, // /* code=160, hex=0xA0, ascii="! " */ + // 0x12, 0x02, 0x20, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x12, 0x75, 0x70, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x12, 0x05, 0x70, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x70, 0x75, 0x50, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x70, 0x57, 0x50, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x35, 0x70, 0x70, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x25, 0x20, 0x70, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x20, 0x24, 0x30, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x07, 0x44, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x0E, 0x22, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x45, 0x25, 0x30, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x45, 0x27, 0x10, // /* code=172, hex=0xAC, ascii="!," */ + // 0x20, 0x22, 0x20, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x05, 0xA5, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x0A, 0x5A, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x41, 0x41, 0x41, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x5A, 0x5A, 0x5A, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xBE, 0xBE, 0xBE, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x22, 0x22, 0x22, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x22, 0xE2, 0x22, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x2E, 0x2E, 0x22, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x55, 0xD5, 0x55, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0xF5, 0x55, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x0E, 0x2E, 0x22, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x5D, 0x1D, 0x55, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x55, 0x55, 0x55, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x0F, 0x1D, 0x55, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x5D, 0x1F, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x55, 0xF0, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x2E, 0x2E, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0xE2, 0x22, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x22, 0x30, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x22, 0xF0, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0xF2, 0x22, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x22, 0x32, 0x22, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0xF0, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x22, 0xF2, 0x22, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x23, 0x23, 0x22, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x55, 0x55, 0x55, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x55, 0x47, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x07, 0x45, 0x55, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x5D, 0x0F, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x0F, 0x0D, 0x55, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x55, 0x45, 0x55, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x0F, 0x0F, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x5D, 0x0D, 0x55, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x2F, 0x0F, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x55, 0xF0, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x0F, 0x0F, 0x22, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0xF5, 0x55, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x55, 0x70, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x23, 0x23, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x03, 0x23, 0x22, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x75, 0x55, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x55, 0xD5, 0x55, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x2F, 0x0F, 0x22, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x22, 0xE0, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x32, 0x22, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x0F, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xCC, 0xCC, 0xCC, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x33, 0x33, 0x33, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xF0, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x76, 0x70, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x25, 0x65, 0x64, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x75, 0x44, 0x40, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x75, 0x55, 0x50, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x74, 0x24, 0x70, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x35, 0x20, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x55, 0x74, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x01, 0x62, 0x20, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x72, 0x52, 0x70, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x25, 0x75, 0x20, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x02, 0x55, 0x50, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x34, 0x25, 0x20, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x75, 0x70, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x27, 0x57, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x34, 0x74, 0x30, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x25, 0x55, 0x50, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x70, 0x70, 0x70, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x27, 0x20, 0x70, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x61, 0x60, 0x70, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x34, 0x30, 0x70, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x01, 0x22, 0x22, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x22, 0x22, 0x40, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x20, 0x70, 0x20, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x05, 0xA5, 0xA0, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x25, 0x20, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x02, 0x72, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x20, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x32, 0x26, 0x20, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x75, 0x50, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x62, 0x46, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x66, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ // 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_5x12.h b/wled00/src/font/console_font_5x12.h index 95288f8691..24d37cb011 100644 --- a/wled00/src/font/console_font_5x12.h +++ b/wled00/src/font/console_font_5x12.h @@ -7,7 +7,7 @@ * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 12 - * [2] Fixed/max glyph width: 4 + * [2] Fixed/max glyph width: 5 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 @@ -39,262 +39,262 @@ */ static const unsigned char console_font_5x12[] PROGMEM = { - 0x57, 0x0C, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x0C, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x34, 0x46, 0x44, 0x65, 0x43, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x37, 0x75, 0x77, 0x56, 0x73, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x02, 0x67, 0x77, 0x73, 0x31, 0x10, // /* code=3, hex=0x03, ascii="^C" */ - // 0x11, 0x33, 0x77, 0x73, 0x31, 0x10, // /* code=4, hex=0x04, ascii="^D" */ - // 0x13, 0x33, 0x17, 0x73, 0x13, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x11, 0x33, 0x77, 0x73, 0x13, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x77, 0x77, 0x74, 0x47, 0x77, 0x77, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x00, 0x32, 0x23, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x77, 0x77, 0x45, 0x54, 0x77, 0x77, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x10, 0x13, 0x44, 0x43, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x03, 0x44, 0x43, 0x22, 0x72, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x11, 0x11, 0x11, 0x76, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x12, 0x32, 0x22, 0x33, 0x66, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x00, 0x00, 0x53, 0x43, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x46, 0x77, 0x76, 0x40, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x01, 0x37, 0x31, 0x00, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x01, 0x35, 0x11, 0x15, 0x31, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x00, 0x22, 0x22, 0x20, 0x22, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x03, 0x66, 0x66, 0x22, 0x22, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x03, 0x44, 0x34, 0x30, 0x43, 0x00, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x01, 0x35, 0x11, 0x15, 0x31, 0x70, // /* code=23, hex=0x17, ascii="^W" */ - // 0x01, 0x35, 0x11, 0x11, 0x11, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x11, 0x11, 0x15, 0x31, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x02, 0x17, 0x12, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x01, 0x27, 0x21, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x04, 0x47, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x02, 0x27, 0x22, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x01, 0x13, 0x37, 0x00, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x07, 0x33, 0x11, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x01, 0x11, 0x11, 0x10, 0x11, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x02, 0x27, 0x22, 0x72, 0x20, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x02, 0x34, 0x42, 0x10, 0x43, 0x10, /* code=36, hex=0x24, ascii="$" */ - 0x06, 0x61, 0x12, 0x22, 0x55, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x02, 0x55, 0x52, 0x54, 0x43, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x01, 0x22, 0x22, 0x22, 0x21, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x02, 0x11, 0x11, 0x11, 0x12, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x15, 0x33, 0x51, 0x00, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x01, 0x17, 0x11, 0x00, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x01, 0x12, 0x22, 0x44, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x03, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x01, 0x35, 0x11, 0x11, 0x17, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x03, 0x44, 0x01, 0x24, 0x47, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x03, 0x40, 0x03, 0x00, 0x43, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x12, 0x24, 0x70, 0x00, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x07, 0x44, 0x47, 0x00, 0x43, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x01, 0x24, 0x74, 0x44, 0x43, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x07, 0x00, 0x01, 0x12, 0x22, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x03, 0x44, 0x43, 0x44, 0x43, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x03, 0x44, 0x44, 0x30, 0x16, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0x33, 0x00, 0x33, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0x33, 0x00, 0x33, 0x12, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x01, 0x24, 0x42, 0x10, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x42, 0x10, 0x01, 0x24, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x03, 0x44, 0x01, 0x10, 0x11, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x03, 0x44, 0x45, 0x54, 0x43, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x03, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x07, 0x44, 0x47, 0x44, 0x47, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x03, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x07, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x07, 0x44, 0x47, 0x44, 0x47, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x07, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x03, 0x44, 0x44, 0x54, 0x43, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x04, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x03, 0x11, 0x11, 0x15, 0x52, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x04, 0x45, 0x56, 0x55, 0x44, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x04, 0x44, 0x44, 0x44, 0x47, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x04, 0x47, 0x74, 0x44, 0x44, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x04, 0x46, 0x65, 0x54, 0x44, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x03, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x07, 0x44, 0x47, 0x44, 0x44, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x03, 0x44, 0x44, 0x44, 0x43, 0x10, /* code=81, hex=0x51, ascii="Q" */ - 0x07, 0x44, 0x47, 0x65, 0x44, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x03, 0x44, 0x43, 0x04, 0x43, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x07, 0x11, 0x11, 0x11, 0x11, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x04, 0x44, 0x44, 0x44, 0x43, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x04, 0x44, 0x44, 0x22, 0x11, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x04, 0x44, 0x44, 0x47, 0x44, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x04, 0x44, 0x33, 0x34, 0x44, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x04, 0x44, 0x22, 0x11, 0x11, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x07, 0x01, 0x12, 0x24, 0x47, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x03, 0x22, 0x22, 0x22, 0x23, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x04, 0x42, 0x21, 0x11, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, /* code=95, hex=0x5F, ascii="_" */ - 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0x30, 0x34, 0x43, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x04, 0x44, 0x74, 0x44, 0x47, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0x34, 0x47, 0x43, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x01, 0x22, 0x72, 0x22, 0x22, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0x34, 0x44, 0x43, 0x03, /* code=103, hex=0x67, ascii="g" */ - 0x04, 0x44, 0x74, 0x44, 0x44, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x00, 0x10, 0x11, 0x11, 0x13, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x10, 0x11, 0x11, 0x11, 0x52, /* code=106, hex=0x6A, ascii="j" */ - 0x04, 0x44, 0x45, 0x66, 0x54, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x03, 0x11, 0x11, 0x11, 0x13, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x00, 0x47, 0x44, 0x44, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x00, 0x56, 0x44, 0x44, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x00, 0x74, 0x44, 0x47, 0x44, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0x34, 0x44, 0x43, 0x00, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0x52, 0x22, 0x22, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0x34, 0x21, 0x43, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x22, 0x72, 0x22, 0x23, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x00, 0x44, 0x44, 0x43, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x00, 0x44, 0x22, 0x11, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x00, 0x44, 0x44, 0x74, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x00, 0x44, 0x33, 0x44, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x00, 0x44, 0x44, 0x43, 0x07, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x00, 0x70, 0x12, 0x47, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x01, 0x22, 0x24, 0x22, 0x21, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x11, 0x11, 0x01, 0x11, 0x11, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x02, 0x11, 0x10, 0x11, 0x12, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x01, 0x12, 0x24, 0x44, 0x47, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x03, 0x44, 0x44, 0x44, 0x43, 0x12, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x00, 0x20, 0x44, 0x44, 0x43, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x01, 0x20, 0x34, 0x47, 0x43, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x03, 0x40, 0x34, 0x03, 0x43, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x00, 0x20, 0x34, 0x03, 0x43, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x06, 0x10, 0x34, 0x03, 0x43, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x01, 0x21, 0x34, 0x03, 0x43, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x34, 0x44, 0x43, 0x16, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x03, 0x40, 0x34, 0x47, 0x43, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x00, 0x20, 0x34, 0x47, 0x43, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x06, 0x10, 0x34, 0x47, 0x43, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x00, 0x20, 0x31, 0x11, 0x13, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x03, 0x40, 0x31, 0x11, 0x13, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x03, 0x00, 0x31, 0x11, 0x13, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x20, 0x34, 0x44, 0x74, 0x44, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x12, 0x13, 0x44, 0x74, 0x44, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x12, 0x07, 0x44, 0x74, 0x47, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x00, 0x31, 0x13, 0x52, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x37, 0x55, 0x75, 0x55, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x03, 0x40, 0x34, 0x44, 0x43, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x00, 0x20, 0x34, 0x44, 0x43, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x03, 0x00, 0x34, 0x44, 0x43, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x03, 0x40, 0x44, 0x44, 0x43, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x06, 0x10, 0x44, 0x44, 0x43, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x00, 0x20, 0x44, 0x44, 0x43, 0x07, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x20, 0x34, 0x44, 0x44, 0x43, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x20, 0x44, 0x44, 0x44, 0x43, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x01, 0x34, 0x44, 0x31, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x01, 0x22, 0x27, 0x22, 0x67, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x04, 0x22, 0x71, 0x71, 0x11, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x07, 0x44, 0x74, 0x54, 0x44, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x01, 0x11, 0x13, 0x11, 0x11, 0x52, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x01, 0x20, 0x34, 0x03, 0x43, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x01, 0x20, 0x31, 0x11, 0x13, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x01, 0x20, 0x34, 0x44, 0x43, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x01, 0x20, 0x44, 0x44, 0x43, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x02, 0x50, 0x56, 0x44, 0x44, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x25, 0x04, 0x67, 0x54, 0x44, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x03, 0x03, 0x43, 0x07, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x03, 0x44, 0x43, 0x07, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x02, 0x20, 0x22, 0x44, 0x43, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x00, 0x74, 0x40, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x02, 0x22, 0x12, 0x34, 0x51, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x02, 0x22, 0x12, 0x25, 0x50, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x10, 0x11, 0x11, 0x11, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x02, 0x25, 0x52, 0x20, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x05, 0x52, 0x25, 0x50, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x00, 0x50, 0x02, 0x00, 0x50, 0x02, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x11, 0x11, 0x17, 0x11, 0x11, 0x11, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x11, 0x11, 0x71, 0x71, 0x11, 0x11, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x22, 0x22, 0x26, 0x22, 0x22, 0x22, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x07, 0x22, 0x22, 0x22, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x00, 0x71, 0x71, 0x11, 0x11, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x22, 0x22, 0x60, 0x62, 0x22, 0x22, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x00, 0x70, 0x62, 0x22, 0x22, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x22, 0x22, 0x60, 0x70, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x22, 0x22, 0x27, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x11, 0x11, 0x71, 0x70, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x07, 0x11, 0x11, 0x11, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x11, 0x11, 0x17, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x07, 0x11, 0x11, 0x11, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x11, 0x11, 0x17, 0x11, 0x11, 0x11, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x22, 0x22, 0x22, 0x30, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x00, 0x32, 0x22, 0x22, 0x22, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x22, 0x22, 0x60, 0x70, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x00, 0x70, 0x62, 0x22, 0x22, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x22, 0x22, 0x60, 0x62, 0x22, 0x22, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x11, 0x11, 0x70, 0x70, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x22, 0x22, 0x27, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x00, 0x70, 0x71, 0x11, 0x11, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x07, 0x22, 0x22, 0x22, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x22, 0x22, 0x23, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x11, 0x11, 0x11, 0x10, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x03, 0x22, 0x22, 0x22, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x22, 0x22, 0x26, 0x22, 0x22, 0x22, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x11, 0x11, 0x70, 0x71, 0x11, 0x11, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x11, 0x11, 0x17, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, // /* code=220, hex=0xDC, ascii="!\" */ - // 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, // /* code=222, hex=0xDE, ascii="!^" */ - // 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x02, 0x55, 0x55, 0x20, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x03, 0x44, 0x57, 0x44, 0x47, 0x44, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x00, 0x32, 0x22, 0x22, 0x22, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x00, 0x07, 0x22, 0x22, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x00, 0x07, 0x21, 0x01, 0x27, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x00, 0x75, 0x55, 0x20, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x00, 0x44, 0x44, 0x47, 0x44, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x00, 0x02, 0x51, 0x11, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x00, 0x00, 0x31, 0x22, 0x13, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x01, 0x24, 0x74, 0x21, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x01, 0x24, 0x42, 0x26, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x00, 0x12, 0x21, 0x34, 0x43, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0x25, 0x52, 0x00, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x11, 0x35, 0x53, 0x11, 0x00, // /* code=237, hex=0xED, ascii="!m" */ - // 0x00, 0x03, 0x44, 0x74, 0x43, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0x03, 0x44, 0x44, 0x40, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x01, 0x17, 0x11, 0x07, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x04, 0x21, 0x01, 0x24, 0x07, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x12, 0x42, 0x10, 0x07, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x11, 0x11, 0x11, 0x11, 0x52, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x11, 0x07, 0x01, 0x10, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x00, 0x25, 0x02, 0x50, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x34, 0x43, 0x00, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x13, 0x10, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x01, 0x11, 0x11, 0x55, 0x31, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x56, 0x44, 0x44, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x34, 0x03, 0x47, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x03, 0x33, 0x33, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x74, 0x63, 0xB8, 0xC7, 0x75, 0x8B, 0x80, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x77, 0xFF, 0x5F, 0xFE, 0xBB, 0xFB, 0x80, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x02, 0xB7, 0xFF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x71, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x23, 0x9C, 0xE2, 0x7F, 0xEE, 0x23, 0x80, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x21, 0x1C, 0xEF, 0xFF, 0xEE, 0x23, 0x80, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0xFF, 0xCE, 0x7F, 0xFF, 0xFF, 0xF0, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x07, 0x29, 0x4E, 0x00, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xFF, 0xF8, 0xD6, 0xB1, 0xFF, 0xFF, 0xF0, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x0E, 0x32, 0xB2, 0x52, 0x93, 0x00, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x03, 0x25, 0x29, 0x31, 0x08, 0xE2, 0x00, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x08, 0x63, 0x10, 0x84, 0xE6, 0x00, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x32, 0x9C, 0xA5, 0x29, 0xCE, 0xC6, 0x00, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x0A, 0xBA, 0x2E, 0xA8, 0x00, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x21, 0x8E, 0x7B, 0x98, 0x80, 0x00, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x04, 0x67, 0x79, 0xC6, 0x10, 0x00, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x14, 0xA5, 0x29, 0x40, 0x52, 0x80, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x03, 0xB5, 0xAD, 0x69, 0x4A, 0x52, 0x80, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x03, 0x25, 0x06, 0x49, 0x82, 0x93, 0x00, 0x00, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x01, 0x1D, 0x52, 0x10, 0x95, 0x71, 0x3E, 0x00, // /* code=23, hex=0x17, ascii="^W" */ + // 0x01, 0x1D, 0x52, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x08, 0x42, 0x10, 0x95, 0x71, 0x00, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x82, 0x78, 0x88, 0x00, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x44, 0x79, 0x04, 0x00, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0xA5, 0x7D, 0x4A, 0x00, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x42, 0x39, 0xDF, 0x00, 0x00, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x01, 0xF7, 0x38, 0x84, 0x00, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x01, 0x08, 0x42, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x52, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x02, 0x95, 0xF5, 0x2B, 0xEA, 0x50, 0x00, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x02, 0x19, 0x28, 0x20, 0x82, 0x93, 0x08, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x06, 0xB4, 0x42, 0x21, 0x08, 0xB5, 0x80, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x02, 0x29, 0x4A, 0x22, 0xB2, 0x93, 0x40, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x31, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x01, 0x10, 0x84, 0x21, 0x08, 0x41, 0x00, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x02, 0x08, 0x42, 0x10, 0x84, 0x22, 0x00, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x09, 0x57, 0x3A, 0xA4, 0x00, 0x00, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x42, 0x7C, 0x84, 0x00, 0x00, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0x80, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x84, 0x42, 0x21, 0x08, 0x84, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x03, 0xA5, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x01, 0x19, 0x42, 0x10, 0x84, 0x27, 0x80, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x03, 0x25, 0x21, 0x11, 0x10, 0x87, 0x80, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x03, 0x24, 0x21, 0x30, 0x42, 0x93, 0x00, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x8C, 0xA5, 0x4B, 0xC2, 0x10, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x07, 0xA1, 0x08, 0x70, 0x42, 0x93, 0x00, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x01, 0x91, 0x0E, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x07, 0x84, 0x21, 0x10, 0x88, 0x42, 0x00, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x03, 0x25, 0x29, 0x32, 0x52, 0x93, 0x00, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x03, 0x25, 0x29, 0x49, 0xC2, 0x26, 0x00, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x00, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x06, 0x30, 0x00, 0x63, 0x08, 0x80, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x04, 0x44, 0x42, 0x08, 0x20, 0x80, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x20, 0x82, 0x08, 0x44, 0x44, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x03, 0x25, 0x21, 0x10, 0x80, 0x21, 0x00, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x03, 0x25, 0x29, 0x5A, 0xD0, 0x83, 0x80, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x03, 0x25, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x07, 0x25, 0x29, 0x72, 0x52, 0x97, 0x00, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x00, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x07, 0x25, 0x29, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x87, 0x80, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x07, 0xA1, 0x08, 0x7A, 0x10, 0x84, 0x00, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x03, 0x25, 0x28, 0x42, 0xD2, 0x93, 0x00, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x04, 0xA5, 0x29, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x03, 0x88, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x03, 0x88, 0x42, 0x10, 0x94, 0xA2, 0x00, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x04, 0xA5, 0x4A, 0x62, 0x94, 0x94, 0x80, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x04, 0x21, 0x08, 0x42, 0x10, 0x87, 0x80, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x04, 0xA5, 0xEF, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x04, 0xA5, 0xAD, 0x5A, 0xD2, 0x94, 0x80, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x07, 0x25, 0x29, 0x72, 0x10, 0x84, 0x00, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x03, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x08, 0x20, /* code=81, hex=0x51, ascii="Q" */ + 0x07, 0x25, 0x29, 0x73, 0x14, 0x94, 0x80, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x03, 0x25, 0x28, 0x30, 0x52, 0x93, 0x00, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x07, 0xC8, 0x42, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x04, 0xA5, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x04, 0xA5, 0x29, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x04, 0xA5, 0x29, 0x4A, 0x5E, 0x94, 0x80, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x04, 0xA5, 0x26, 0x31, 0x92, 0x94, 0x80, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x04, 0x63, 0x15, 0x28, 0x84, 0x21, 0x00, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x07, 0x84, 0x42, 0x21, 0x10, 0x87, 0x80, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x03, 0x10, 0x84, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x04, 0x20, 0x84, 0x10, 0x84, 0x10, 0x80, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x00, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, /* code=95, hex=0x5F, ascii="_" */ + 0x63, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x06, 0x09, 0xD2, 0x93, 0x80, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x97, 0x00, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x80, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x84, 0x27, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x01, 0x10, 0x8E, 0x21, 0x08, 0x42, 0x00, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0xC0, /* code=103, hex=0x67, ascii="g" */ + 0x04, 0x21, 0x0E, 0x4A, 0x52, 0x94, 0x80, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x00, 0x08, 0x02, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x28, 0x80, /* code=106, hex=0x6A, ascii="j" */ + 0x04, 0x21, 0x09, 0x53, 0x18, 0xA4, 0x80, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x08, 0x42, 0x10, 0x84, 0x23, 0x80, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x09, 0x7A, 0x52, 0x94, 0x80, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x0E, 0x4A, 0x52, 0x97, 0x21, 0x00, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x07, 0x4A, 0x52, 0x93, 0x84, 0x20, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x0B, 0x29, 0x08, 0x42, 0x00, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x06, 0x49, 0x04, 0x93, 0x00, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x10, 0x8E, 0x21, 0x08, 0x43, 0x00, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x09, 0x49, 0x4A, 0x21, 0x00, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0xF4, 0x80, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x09, 0x49, 0x8C, 0x94, 0x80, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x0F, 0x08, 0x88, 0x87, 0x80, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x01, 0x10, 0x84, 0x41, 0x08, 0x41, 0x00, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x21, 0x08, 0x40, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x08, 0x42, 0x08, 0x84, 0x22, 0x00, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x02, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x01, 0x08, 0xA5, 0x46, 0x31, 0x8F, 0xC0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x03, 0x25, 0x28, 0x42, 0x10, 0x93, 0x08, 0x80, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x01, 0x90, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x03, 0x24, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x00, 0x14, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x06, 0x08, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x14, 0x46, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x07, 0x42, 0x10, 0x83, 0x89, 0x80, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x03, 0x24, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x00, 0x14, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x06, 0x08, 0x06, 0x4A, 0x5E, 0x83, 0x80, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x00, 0x14, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x03, 0x24, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x03, 0x04, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x50, 0x19, 0x29, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x22, 0x88, 0xC9, 0x4B, 0xD2, 0x94, 0x80, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x32, 0x01, 0xE8, 0x43, 0xD0, 0x87, 0x80, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x07, 0x14, 0xAE, 0xA2, 0x80, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x1D, 0xCA, 0x53, 0xD4, 0xA5, 0x80, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x03, 0x24, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x00, 0x14, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x03, 0x04, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x03, 0x24, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x06, 0x08, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x00, 0x14, 0x09, 0x4A, 0x52, 0x93, 0x85, 0xC0, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x50, 0x19, 0x29, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x25, 0x29, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x00, 0x47, 0x46, 0x11, 0x71, 0x00, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x14, 0x84, 0x71, 0x08, 0xD7, 0x80, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x04, 0x54, 0xAF, 0x93, 0xE4, 0x21, 0x00, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x07, 0x25, 0x2E, 0x4A, 0xF2, 0x94, 0x80, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x11, 0x08, 0x42, 0x38, 0x84, 0x21, 0x28, 0x80, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x01, 0x90, 0x06, 0x48, 0x4E, 0x93, 0x80, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x01, 0x90, 0x06, 0x10, 0x84, 0x23, 0x80, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x01, 0x90, 0x06, 0x4A, 0x52, 0x93, 0x00, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x01, 0x90, 0x09, 0x4A, 0x52, 0x93, 0x80, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x02, 0xA8, 0x0A, 0x6A, 0x52, 0x94, 0x80, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x55, 0x01, 0x2D, 0x7A, 0xD2, 0x94, 0x80, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x03, 0x04, 0xE9, 0x38, 0x1E, 0x00, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x03, 0x25, 0x29, 0x30, 0x1E, 0x00, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x02, 0x10, 0x04, 0x22, 0x10, 0x93, 0x00, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x03, 0xD0, 0x80, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x03, 0xC2, 0x10, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x02, 0x14, 0xA2, 0x21, 0xD2, 0xA1, 0x80, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x02, 0x14, 0xA2, 0x21, 0x56, 0xB0, 0x80, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x08, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0xA5, 0x52, 0x8A, 0x50, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x01, 0x4A, 0x29, 0x54, 0xA0, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x00, 0x2A, 0x00, 0x28, 0x00, 0xA8, 0x00, 0xA0, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x02, 0x81, 0x50, 0x28, 0x15, 0x02, 0x81, 0x50, // /* code=177, hex=0xB1, ascii="!1" */ + // 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x21, 0x08, 0x42, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x21, 0x08, 0x4E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x52, 0x94, 0xA5, 0x69, 0x4A, 0x52, 0x94, 0xA0, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x79, 0x4A, 0x52, 0x94, 0xA0, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x0E, 0x13, 0x84, 0x21, 0x08, 0x40, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x52, 0x94, 0xAD, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x52, 0x94, 0xA5, 0x29, 0x4A, 0x52, 0x94, 0xA0, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x0F, 0x0B, 0x4A, 0x52, 0x94, 0xA0, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x52, 0x94, 0xAD, 0x0B, 0xC0, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x52, 0x94, 0xA5, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x21, 0x08, 0x4E, 0x13, 0x80, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x70, 0x84, 0x21, 0x08, 0x40, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x21, 0x08, 0x42, 0x1C, 0x00, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x21, 0x08, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x21, 0x08, 0x42, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x21, 0x08, 0x42, 0x7C, 0x84, 0x21, 0x08, 0x40, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x21, 0x08, 0x43, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x52, 0x94, 0xA5, 0x2D, 0x4A, 0x52, 0x94, 0xA0, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x52, 0x94, 0xA5, 0xA1, 0xE0, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x07, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x52, 0x94, 0xAD, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x0F, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x52, 0x94, 0xA5, 0xA1, 0x6A, 0x52, 0x94, 0xA0, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x52, 0x94, 0xAD, 0x83, 0x6A, 0x52, 0x94, 0xA0, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x21, 0x08, 0x4F, 0x83, 0xE0, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x52, 0x94, 0xA5, 0x7C, 0x00, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x0F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x94, 0xA0, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x52, 0x94, 0xA5, 0x3C, 0x00, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x21, 0x08, 0x43, 0x90, 0xE0, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x03, 0x90, 0xE4, 0x21, 0x08, 0x40, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x3D, 0x4A, 0x52, 0x94, 0xA0, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x52, 0x94, 0xA5, 0x6D, 0x4A, 0x52, 0x94, 0xA0, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x21, 0x08, 0x4F, 0x83, 0xE4, 0x21, 0x08, 0x40, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x21, 0x08, 0x42, 0x70, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x1C, 0x84, 0x21, 0x08, 0x40, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xC0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x70, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x00, 0x9B, 0x52, 0x96, 0x48, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x25, 0x2A, 0x72, 0x52, 0x97, 0x21, 0x00, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0x1E, 0x94, 0x21, 0x08, 0x42, 0x00, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x00, 0x00, 0x7D, 0x4A, 0x52, 0x80, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x00, 0x01, 0xF4, 0x90, 0x44, 0x4F, 0xC0, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x0F, 0xD2, 0x94, 0x40, 0x00, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x09, 0x4A, 0x52, 0x97, 0x21, 0x00, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x00, 0x00, 0x2A, 0x84, 0x21, 0x00, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x00, 0x00, 0x07, 0x11, 0x4A, 0x23, 0x80, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x00, 0x45, 0x47, 0xF1, 0x51, 0x00, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x00, 0x45, 0x46, 0x2A, 0x56, 0xC0, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x0C, 0x84, 0x11, 0xD2, 0x93, 0x00, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x05, 0x56, 0xAA, 0x00, 0x00, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x08, 0x47, 0x56, 0xAE, 0x21, 0x00, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0x00, 0xE8, 0x43, 0x90, 0x83, 0x80, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x00, 0xC9, 0x4A, 0x52, 0x90, 0x00, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x01, 0xE0, 0x78, 0x1E, 0x00, 0x00, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x00, 0x42, 0x7C, 0x84, 0x07, 0xC0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x04, 0x10, 0x41, 0x11, 0x10, 0x07, 0x80, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x88, 0x88, 0x20, 0x82, 0x07, 0x80, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x04, 0x52, 0x10, 0x84, 0x21, 0x08, 0x40, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, 0xA2, 0x00, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x08, 0x40, 0x7C, 0x04, 0x20, 0x00, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x05, 0x50, 0x0A, 0xA0, 0x00, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x64, 0xA4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x02, 0x38, 0x80, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x01, 0xC8, 0x42, 0x12, 0x94, 0x61, 0x00, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0xA6, 0xA5, 0x29, 0x48, 0x00, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x64, 0x84, 0xC8, 0x78, 0x00, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x00, 0xE7, 0x39, 0xCE, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_5x8.h b/wled00/src/font/console_font_5x8.h index 4f503f2500..f5404eca27 100644 --- a/wled00/src/font/console_font_5x8.h +++ b/wled00/src/font/console_font_5x8.h @@ -7,7 +7,7 @@ * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 8 - * [2] Fixed/max glyph width: 4 + * [2] Fixed/max glyph width: 5 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 @@ -39,262 +39,262 @@ */ static const unsigned char console_font_5x8[] PROGMEM = { - 0x57, 0x08, 0x04, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x00, 0x35, 0x76, 0x30, // /* code=1, hex=0x01, ascii="^A" */ - // 0x00, 0x35, 0x77, 0x30, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0x27, 0x73, 0x10, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x13, 0x73, 0x10, // /* code=4, hex=0x04, ascii="^D" */ - // 0x00, 0x35, 0x71, 0x10, // /* code=5, hex=0x05, ascii="^E" */ - // 0x00, 0x13, 0x75, 0x10, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x01, 0x31, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x07, 0x76, 0x46, 0x77, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x01, 0x21, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x07, 0x76, 0x46, 0x77, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x10, 0x35, 0x20, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x00, 0x12, 0x13, 0x10, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x12, 0x26, 0x40, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x12, 0x26, 0x40, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x00, 0x01, 0x21, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x23, 0x33, 0x20, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x01, 0x31, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x00, 0x13, 0x13, 0x10, // /* code=18, hex=0x12, ascii="^R" */ - // 0x00, 0x22, 0x20, 0x20, // /* code=19, hex=0x13, ascii="^S" */ - // 0x00, 0x36, 0x62, 0x22, // /* code=20, hex=0x14, ascii="^T" */ - // 0x00, 0x03, 0x42, 0x16, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x07, 0x70, // /* code=22, hex=0x16, ascii="^V" */ - // 0x00, 0x13, 0x13, 0x13, // /* code=23, hex=0x17, ascii="^W" */ - // 0x00, 0x13, 0x11, 0x10, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x11, 0x13, 0x10, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0x70, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x02, 0x72, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x47, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x02, 0x72, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x13, 0x70, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x00, 0x73, 0x10, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x11, 0x10, 0x10, /* code=33, hex=0x21, ascii="!" */ - 0x00, 0x22, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0x27, 0x27, 0x20, /* code=35, hex=0x23, ascii="#" */ - 0x00, 0x11, 0x21, 0x31, /* code=36, hex=0x24, ascii="$" */ - 0x02, 0x52, 0x13, 0x40, /* code=37, hex=0x25, ascii="%" */ - 0x00, 0x12, 0x34, 0x30, /* code=38, hex=0x26, ascii="&" */ - 0x01, 0x10, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x00, 0x12, 0x22, 0x10, /* code=40, hex=0x28, ascii="(" */ - 0x00, 0x21, 0x11, 0x20, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x21, 0x31, 0x20, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x01, 0x31, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x12, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x07, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x10, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x01, 0x12, 0x20, /* code=47, hex=0x2F, ascii="/" */ - 0x00, 0x34, 0x44, 0x30, /* code=48, hex=0x30, ascii="0" */ - 0x00, 0x13, 0x11, 0x10, /* code=49, hex=0x31, ascii="1" */ - 0x00, 0x34, 0x12, 0x70, /* code=50, hex=0x32, ascii="2" */ - 0x00, 0x70, 0x30, 0x70, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x01, 0x27, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x00, 0x74, 0x70, 0x70, /* code=53, hex=0x35, ascii="5" */ - 0x00, 0x34, 0x74, 0x30, /* code=54, hex=0x36, ascii="6" */ - 0x00, 0x70, 0x12, 0x20, /* code=55, hex=0x37, ascii="7" */ - 0x00, 0x34, 0x34, 0x30, /* code=56, hex=0x38, ascii="8" */ - 0x00, 0x34, 0x30, 0x30, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0x10, 0x10, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0x10, 0x12, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x01, 0x21, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x03, 0x03, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x21, 0x01, 0x20, /* code=62, hex=0x3E, ascii=">" */ - 0x00, 0x30, 0x30, 0x20, /* code=63, hex=0x3F, ascii="?" */ - 0x00, 0x34, 0x54, 0x30, /* code=64, hex=0x40, ascii="@" */ - 0x00, 0x34, 0x74, 0x40, /* code=65, hex=0x41, ascii="A" */ - 0x00, 0x74, 0x74, 0x70, /* code=66, hex=0x42, ascii="B" */ - 0x00, 0x34, 0x44, 0x30, /* code=67, hex=0x43, ascii="C" */ - 0x00, 0x74, 0x44, 0x70, /* code=68, hex=0x44, ascii="D" */ - 0x00, 0x74, 0x74, 0x70, /* code=69, hex=0x45, ascii="E" */ - 0x00, 0x74, 0x74, 0x40, /* code=70, hex=0x46, ascii="F" */ - 0x00, 0x34, 0x44, 0x30, /* code=71, hex=0x47, ascii="G" */ - 0x00, 0x44, 0x74, 0x40, /* code=72, hex=0x48, ascii="H" */ - 0x00, 0x31, 0x11, 0x30, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x00, 0x44, 0x30, /* code=74, hex=0x4A, ascii="J" */ - 0x00, 0x45, 0x65, 0x40, /* code=75, hex=0x4B, ascii="K" */ - 0x00, 0x44, 0x44, 0x70, /* code=76, hex=0x4C, ascii="L" */ - 0x00, 0x47, 0x44, 0x40, /* code=77, hex=0x4D, ascii="M" */ - 0x00, 0x46, 0x54, 0x40, /* code=78, hex=0x4E, ascii="N" */ - 0x00, 0x34, 0x44, 0x30, /* code=79, hex=0x4F, ascii="O" */ - 0x00, 0x74, 0x74, 0x40, /* code=80, hex=0x50, ascii="P" */ - 0x00, 0x34, 0x44, 0x30, /* code=81, hex=0x51, ascii="Q" */ - 0x00, 0x74, 0x74, 0x40, /* code=82, hex=0x52, ascii="R" */ - 0x00, 0x34, 0x30, 0x70, /* code=83, hex=0x53, ascii="S" */ - 0x00, 0x71, 0x11, 0x10, /* code=84, hex=0x54, ascii="T" */ - 0x00, 0x44, 0x44, 0x30, /* code=85, hex=0x55, ascii="U" */ - 0x00, 0x44, 0x43, 0x30, /* code=86, hex=0x56, ascii="V" */ - 0x00, 0x45, 0x52, 0x20, /* code=87, hex=0x57, ascii="W" */ - 0x00, 0x44, 0x32, 0x40, /* code=88, hex=0x58, ascii="X" */ - 0x00, 0x22, 0x21, 0x10, /* code=89, hex=0x59, ascii="Y" */ - 0x00, 0x71, 0x24, 0x70, /* code=90, hex=0x5A, ascii="Z" */ - 0x00, 0x32, 0x22, 0x30, /* code=91, hex=0x5B, ascii="[" */ - 0x00, 0x22, 0x11, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x00, 0x31, 0x11, 0x30, /* code=93, hex=0x5D, ascii="]" */ - 0x00, 0x12, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x07, /* code=95, hex=0x5F, ascii="_" */ - 0x00, 0x21, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x03, 0x03, 0x20, /* code=97, hex=0x61, ascii="a" */ - 0x04, 0x47, 0x44, 0x70, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x01, 0x22, 0x10, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x03, 0x44, 0x30, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x03, 0x74, 0x30, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x12, 0x72, 0x20, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x03, 0x43, 0x03, /* code=103, hex=0x67, ascii="g" */ - 0x00, 0x47, 0x44, 0x40, /* code=104, hex=0x68, ascii="h" */ - 0x01, 0x03, 0x11, 0x30, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x00, 0x00, 0x03, /* code=106, hex=0x6A, ascii="j" */ - 0x00, 0x45, 0x65, 0x40, /* code=107, hex=0x6B, ascii="k" */ - 0x03, 0x11, 0x11, 0x30, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x04, 0x74, 0x40, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x07, 0x44, 0x40, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x03, 0x44, 0x30, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x07, 0x44, 0x74, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x03, 0x44, 0x30, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x02, 0x32, 0x20, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x03, 0x61, 0x70, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x27, 0x22, 0x10, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x04, 0x44, 0x30, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x04, 0x43, 0x30, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x04, 0x47, 0x40, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x04, 0x33, 0x40, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x04, 0x43, 0x03, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x07, 0x12, 0x70, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x12, 0x21, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x01, 0x11, 0x11, 0x10, /* code=124, hex=0x7C, ascii="|" */ - 0x02, 0x10, 0x01, 0x20, /* code=125, hex=0x7D, ascii="}" */ - 0x00, 0x02, 0x50, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x01, 0x24, 0x70, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x00, 0x34, 0x44, 0x31, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x02, 0x04, 0x44, 0x30, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x01, 0x03, 0x74, 0x30, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x12, 0x06, 0x15, 0x20, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x02, 0x06, 0x13, 0x50, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x21, 0x06, 0x13, 0x50, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x01, 0x06, 0x13, 0x50, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x01, 0x22, 0x11, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x12, 0x03, 0x74, 0x30, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x02, 0x03, 0x74, 0x30, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x21, 0x03, 0x74, 0x30, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x02, 0x03, 0x11, 0x30, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x12, 0x03, 0x11, 0x30, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x21, 0x03, 0x11, 0x30, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x50, 0x34, 0x74, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x10, 0x34, 0x74, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x01, 0x74, 0x74, 0x70, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x06, 0x37, 0x50, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x35, 0x75, 0x50, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x12, 0x03, 0x44, 0x30, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x02, 0x03, 0x44, 0x30, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x21, 0x03, 0x44, 0x30, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x12, 0x04, 0x44, 0x30, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x21, 0x04, 0x44, 0x30, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x02, 0x04, 0x43, 0x03, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x02, 0x03, 0x44, 0x30, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x20, 0x44, 0x44, 0x30, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x13, 0x44, 0x31, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x01, 0x22, 0x72, 0x70, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x06, 0x22, 0x13, 0x10, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x06, 0x55, 0x74, 0x40, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x01, 0x22, 0x72, 0x24, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x12, 0x06, 0x13, 0x50, // /* code=160, hex=0xA0, ascii="! " */ - // 0x01, 0x03, 0x11, 0x30, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x01, 0x03, 0x44, 0x30, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x01, 0x04, 0x44, 0x30, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x25, 0x07, 0x44, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x25, 0x46, 0x65, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x01, 0x21, 0x03, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x01, 0x21, 0x03, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x01, 0x01, 0x24, 0x30, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x07, 0x40, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x07, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x04, 0x45, 0x24, 0x10, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x04, 0x45, 0x24, 0x10, // /* code=172, hex=0xAC, ascii="!," */ - // 0x01, 0x01, 0x13, 0x10, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x00, 0x25, 0x20, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x00, 0x52, 0x50, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x52, 0x52, 0x52, 0x52, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x72, 0x52, 0x72, 0x52, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x63, 0x63, 0x63, 0x63, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x11, 0x11, 0x11, 0x11, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x11, 0x17, 0x11, 0x11, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x11, 0x71, 0x71, 0x11, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x22, 0x26, 0x22, 0x22, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x07, 0x22, 0x22, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x71, 0x71, 0x11, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x22, 0x60, 0x62, 0x22, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x22, 0x22, 0x22, 0x22, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x70, 0x62, 0x22, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x22, 0x60, 0x70, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x22, 0x27, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x11, 0x71, 0x70, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x07, 0x11, 0x11, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x11, 0x11, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x11, 0x17, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x07, 0x11, 0x11, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x11, 0x11, 0x11, 0x11, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x07, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x11, 0x17, 0x11, 0x11, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x11, 0x11, 0x11, 0x11, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x22, 0x22, 0x22, 0x22, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x22, 0x22, 0x30, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x32, 0x22, 0x22, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x22, 0x60, 0x70, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x70, 0x62, 0x22, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x22, 0x22, 0x22, 0x22, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x70, 0x70, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x22, 0x60, 0x62, 0x22, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x11, 0x70, 0x70, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x22, 0x27, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x70, 0x71, 0x11, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x07, 0x22, 0x22, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x22, 0x23, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x11, 0x11, 0x10, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x11, 0x11, 0x11, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x03, 0x22, 0x22, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x22, 0x27, 0x22, 0x22, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x11, 0x71, 0x71, 0x11, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x11, 0x17, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x01, 0x11, 0x11, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0x77, 0x77, 0x77, 0x77, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x77, 0x77, // /* code=220, hex=0xDC, ascii="!\" */ - // 0x77, 0x77, 0x77, 0x77, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x00, 0x00, 0x00, 0x00, // /* code=222, hex=0xDE, ascii="!^" */ - // 0x77, 0x77, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x03, 0x44, 0x30, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x03, 0x47, 0x44, 0x74, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x03, 0x22, 0x22, 0x20, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x32, 0x22, 0x20, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x07, 0x21, 0x24, 0x70, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x34, 0x44, 0x30, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x04, 0x44, 0x74, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x04, 0x21, 0x11, 0x10, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x01, 0x13, 0x43, 0x11, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x34, 0x74, 0x30, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x34, 0x42, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x34, 0x23, 0x44, 0x30, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x03, 0x55, 0x30, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x03, 0x52, 0x50, // /* code=237, hex=0xED, ascii="!m" */ - // 0x01, 0x23, 0x22, 0x10, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x03, 0x44, 0x44, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0x70, 0x70, 0x70, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x17, 0x10, 0x70, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x02, 0x10, 0x12, 0x70, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x12, 0x10, 0x30, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x01, 0x11, 0x11, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x11, 0x11, 0x56, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x30, 0x70, 0x30, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x25, 0x02, 0x50, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x00, 0x12, 0x10, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x03, 0x30, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x01, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x00, 0x00, 0x15, 0x20, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x03, 0x22, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x03, 0x01, 0x30, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x03, 0x33, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x00, 0x1D, 0x5F, 0xED, 0xC0, // /* code=1, hex=0x01, ascii="^A" */ + // 0x00, 0x1D, 0x5F, 0xFD, 0xC0, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0x15, 0xFF, 0xB8, 0x80, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x08, 0xEF, 0xB8, 0x80, // /* code=4, hex=0x04, ascii="^D" */ + // 0x00, 0x1D, 0x5F, 0x90, 0x80, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x08, 0xEF, 0xD4, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x47, 0x10, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x0E, 0x36, 0xD1, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x00, 0x08, 0xA2, 0x38, 0x80, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x08, 0xA4, 0x62, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x0E, 0x95, 0xEA, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x10, 0xC7, 0x31, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x04, 0x67, 0x18, 0x40, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x00, 0x08, 0xE2, 0x38, 0x80, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x14, 0xA5, 0x01, 0x40, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x1F, 0xAD, 0x29, 0x4A, // /* code=20, hex=0x14, ascii="^T" */ + // 0x00, 0x06, 0xC9, 0x24, 0xD8, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x7F, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ + // 0x00, 0x08, 0xE2, 0x38, 0x8E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x08, 0xE2, 0x10, 0x80, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x08, 0x42, 0x38, 0x80, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x2F, 0x88, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x8F, 0xA0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x08, 0x7C, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0xAF, 0xA8, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x02, 0x3B, 0xE0, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x0F, 0xB8, 0x80, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x08, 0x42, 0x00, 0x80, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0x14, 0xA0, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0x15, 0xF5, 0x7D, 0x40, /* code=35, hex=0x23, ascii="#" */ + 0x00, 0x08, 0x64, 0x19, 0x84, /* code=36, hex=0x24, ascii="$" */ + 0x02, 0x2A, 0xA3, 0x36, 0x40, /* code=37, hex=0x25, ascii="%" */ + 0x00, 0x0C, 0x86, 0xC9, 0xA0, /* code=38, hex=0x26, ascii="&" */ + 0x01, 0x08, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x08, 0x84, 0x20, 0x80, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x10, 0x42, 0x11, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x14, 0x47, 0x11, 0x40, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x47, 0x10, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x88, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x01, 0xE0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x80, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x04, 0x42, 0x21, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x08, 0xC2, 0x10, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x19, 0x22, 0x23, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x38, 0x26, 0x0B, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x04, 0x65, 0x78, 0x40, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0x3D, 0x0E, 0x0B, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x19, 0x0E, 0x49, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0x3C, 0x22, 0x21, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x19, 0x26, 0x49, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x19, 0x27, 0x09, 0x80, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x02, 0x00, 0x80, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x02, 0x00, 0x88, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x04, 0x44, 0x10, 0x40, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0xE0, 0x38, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x10, 0x41, 0x11, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x18, 0x26, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x1D, 0x1B, 0x41, 0xC0, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x19, 0x2F, 0x4A, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0x39, 0x2E, 0x4B, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x1D, 0x08, 0x41, 0xC0, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0x39, 0x29, 0x4B, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0x3D, 0x0E, 0x43, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0x3D, 0x0E, 0x42, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x19, 0x28, 0x49, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0x25, 0x2F, 0x4A, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x1C, 0x42, 0x11, 0xC0, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x04, 0x29, 0x49, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0x25, 0x4C, 0x52, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0x21, 0x08, 0x43, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x00, 0x25, 0xE9, 0x4A, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0x25, 0xAB, 0x4A, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0x39, 0x2E, 0x42, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x19, 0x29, 0x49, 0x82, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0x39, 0x2E, 0x4A, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x1D, 0x06, 0x0B, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0x3E, 0x42, 0x10, 0x80, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0x25, 0x29, 0x49, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x00, 0x25, 0x29, 0x31, 0x80, /* code=86, hex=0x56, ascii="V" */ + 0x00, 0x23, 0x5A, 0xA9, 0x40, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0x25, 0x26, 0x2A, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0x14, 0xA5, 0x10, 0x80, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0x3C, 0x44, 0x43, 0xC0, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x18, 0x84, 0x21, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0x10, 0x82, 0x10, 0x40, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x18, 0x42, 0x11, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x08, 0xA0, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x1F, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x10, 0x40, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0xC1, 0x39, 0x40, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x21, 0xC9, 0x4B, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x64, 0x20, 0xC0, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x04, 0xE9, 0x49, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0xCF, 0x41, 0xC0, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x0C, 0x8E, 0x21, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0xE9, 0x38, 0x4C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0x21, 0xC9, 0x4A, 0x40, /* code=104, hex=0x68, ascii="h" */ + 0x01, 0x00, 0xC2, 0x11, 0xC0, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x80, 0x21, 0x08, 0x4C, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0x21, 0x4C, 0x52, 0x40, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x08, 0x42, 0x11, 0xC0, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x01, 0x2F, 0x4A, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x01, 0xC9, 0x4A, 0x40, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0xC9, 0x49, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x01, 0xC9, 0x4B, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0xE9, 0x49, 0xC2, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0xA6, 0x21, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0xEC, 0x1B, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x11, 0xE4, 0x20, 0xC0, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x01, 0x29, 0x49, 0xC0, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x01, 0x29, 0x31, 0x80, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x01, 0x29, 0x7A, 0x40, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x01, 0x26, 0x32, 0x40, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x01, 0x29, 0x38, 0x4C, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x01, 0xE2, 0x23, 0xC0, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x88, 0x84, 0x10, 0x40, /* code=123, hex=0x7B, ascii="{" */ + 0x01, 0x08, 0x42, 0x10, 0x80, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x08, 0x21, 0x11, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x00, 0xAA, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x45, 0x47, 0xE0, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x1D, 0x08, 0x41, 0xC4, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x02, 0x81, 0x29, 0x49, 0xC0, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x11, 0x00, 0xCF, 0x41, 0xC0, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x22, 0x81, 0x82, 0x51, 0x40, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x02, 0x81, 0x82, 0x32, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x41, 0x01, 0x82, 0x32, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x01, 0x82, 0x32, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x64, 0x20, 0xC4, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x22, 0x80, 0xCF, 0x41, 0xC0, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x02, 0x80, 0xCF, 0x41, 0xC0, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x41, 0x00, 0xCF, 0x41, 0xC0, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x02, 0x80, 0xC2, 0x11, 0xC0, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x22, 0x80, 0xC2, 0x11, 0xC0, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x41, 0x00, 0xC2, 0x11, 0xC0, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xA0, 0x19, 0x2F, 0x4A, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x20, 0x19, 0x2F, 0x4A, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x11, 0x3D, 0x0E, 0x43, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x01, 0xB7, 0xF2, 0xE0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x1D, 0x4F, 0x52, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x22, 0x80, 0xC9, 0x49, 0x80, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x41, 0x00, 0xC9, 0x49, 0x80, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x22, 0x81, 0x29, 0x49, 0xC0, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x41, 0x01, 0x29, 0x49, 0xC0, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x02, 0x81, 0x29, 0x38, 0x4C, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x25, 0x29, 0x49, 0x80, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x08, 0xE8, 0x41, 0xC4, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x94, 0x8E, 0x23, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x06, 0xD4, 0xA2, 0x38, 0x80, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x29, 0x6F, 0xCA, 0x20, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x01, 0x90, 0x8F, 0x21, 0x10, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x22, 0x01, 0x82, 0x32, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x11, 0x00, 0xC2, 0x11, 0xC0, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x11, 0x00, 0xC9, 0x49, 0x80, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x11, 0x01, 0x29, 0x49, 0xC0, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x55, 0x01, 0xC9, 0x4A, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x55, 0x25, 0xAD, 0x5A, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x01, 0x14, 0x60, 0x38, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x01, 0x14, 0x40, 0x38, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x01, 0x00, 0x44, 0x49, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x7E, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x7C, 0x20, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x04, 0x25, 0x45, 0xC4, 0xE0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x04, 0x65, 0x44, 0xCC, 0xE1, // /* code=172, hex=0xAC, ascii="!," */ + // 0x01, 0x00, 0x42, 0x38, 0x80, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0x05, 0x51, 0x40, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x00, 0x0A, 0x2A, 0x80, // /* code=175, hex=0xAF, ascii="!/" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=176, hex=0xB0, ascii="!0" */ + // 0xEA, 0xAE, 0xAE, 0xAA, 0xEA, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xDB, 0xB6, 0xED, 0xBB, 0x6E, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x21, 0x09, 0xC2, 0x10, 0x84, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x21, 0x38, 0x4E, 0x10, 0x84, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x52, 0x95, 0xA5, 0x29, 0x4A, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x01, 0xE5, 0x29, 0x4A, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x38, 0x4E, 0x10, 0x84, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x52, 0xB4, 0x2D, 0x29, 0x4A, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x52, 0x94, 0xA5, 0x29, 0x4A, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x3C, 0x2D, 0x29, 0x4A, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x52, 0xB4, 0x2F, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x52, 0x95, 0xE0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x21, 0x38, 0x4E, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x01, 0xC2, 0x10, 0x84, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x21, 0x08, 0x70, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x21, 0x09, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x01, 0xF2, 0x10, 0x84, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x21, 0x08, 0x72, 0x10, 0x84, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x01, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x21, 0x09, 0xF2, 0x10, 0x84, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x21, 0x0E, 0x43, 0x90, 0x84, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x52, 0x94, 0xB5, 0x29, 0x4A, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x52, 0x96, 0x87, 0x80, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x1E, 0x85, 0xA9, 0x4A, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x52, 0xB6, 0x0F, 0x80, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x3E, 0x0D, 0xA9, 0x4A, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x52, 0x96, 0x85, 0xA9, 0x4A, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x3E, 0x0F, 0x80, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x52, 0xB6, 0x0D, 0xA9, 0x4A, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x21, 0x3E, 0x0F, 0x80, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x52, 0x95, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x3E, 0x0F, 0x90, 0x84, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x01, 0xF5, 0x29, 0x4A, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x52, 0x94, 0xF0, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x21, 0x0E, 0x43, 0x80, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x0E, 0x43, 0x90, 0x84, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0xF5, 0x29, 0x4A, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x52, 0x95, 0xF5, 0x29, 0x4A, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x21, 0x3E, 0x4F, 0x90, 0x84, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x21, 0x09, 0xC0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x72, 0x10, 0x84, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x0F, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE7, 0x39, 0xCE, 0x73, 0x9C, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x18, 0xC6, 0x31, 0x8C, 0x63, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x00, 0xD9, 0x49, 0xA0, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x25, 0xE9, 0x4B, 0x90, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x03, 0x90, 0x84, 0x21, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x1C, 0xA5, 0x29, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x07, 0xD2, 0x44, 0x47, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x1F, 0x29, 0x49, 0x80, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x01, 0x29, 0x4B, 0xB0, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x04, 0xD4, 0x42, 0x10, 0x80, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x01, 0x08, 0xE8, 0xB8, 0x84, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x1D, 0x1F, 0xC5, 0xC0, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x1D, 0x18, 0xAB, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x64, 0x10, 0xC9, 0x49, 0x80, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0xEA, 0xD5, 0xC0, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x02, 0xEA, 0xA6, 0xC0, // /* code=237, hex=0xED, ascii="!m" */ + // 0x01, 0x90, 0xE4, 0x20, 0xC0, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x03, 0x25, 0x29, 0x4A, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x3C, 0x0F, 0x03, 0xC0, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x09, 0xF2, 0x03, 0xE0, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x02, 0x08, 0x22, 0x23, 0xC0, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x88, 0x82, 0x09, 0xC0, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x06, 0x52, 0x10, 0x84, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x21, 0x08, 0x4A, 0x60, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x18, 0x0F, 0x01, 0x80, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x15, 0x40, 0x2A, 0x80, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x08, 0xA2, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0xC6, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x40, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x06, 0x22, 0x51, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x03, 0x14, 0xA0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x03, 0x04, 0x47, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x00, 0xE7, 0x38, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; diff --git a/wled00/src/font/console_font_6x8.h b/wled00/src/font/console_font_6x8.h index 7f6c590bf9..47be78bb5f 100644 --- a/wled00/src/font/console_font_6x8.h +++ b/wled00/src/font/console_font_6x8.h @@ -7,7 +7,7 @@ * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 8 - * [2] Fixed/max glyph width: 5 + * [2] Fixed/max glyph width: 6 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 @@ -39,262 +39,262 @@ */ static const unsigned char console_font_6x8[] PROGMEM = { - 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x08, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x19, 0x0C, 0x42, 0x90, 0x60, // /* code=1, hex=0x01, ascii="^A" */ - // 0x19, 0xCA, 0x72, 0x1C, 0x60, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0x8E, 0x73, 0x8C, 0x20, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x46, 0x73, 0x8C, 0x20, // /* code=4, hex=0x04, ascii="^D" */ - // 0x08, 0xC6, 0x13, 0x9C, 0x20, // /* code=5, hex=0x05, ascii="^E" */ - // 0x00, 0x46, 0x73, 0x84, 0x60, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x31, 0x80, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x7B, 0xDE, 0xC6, 0x3D, 0xEF, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x0E, 0x42, 0x1C, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x7B, 0xD0, 0xB5, 0xA1, 0xEF, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x00, 0x40, 0x32, 0x10, 0x60, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x19, 0x08, 0x30, 0x8C, 0x20, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x08, 0x42, 0x11, 0x9C, 0xC0, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0xC4, 0x31, 0x18, 0xC0, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x01, 0x46, 0x61, 0x94, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x10, 0xC6, 0x31, 0x8C, 0x40, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x46, 0x71, 0x84, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x08, 0xCE, 0x13, 0x8C, 0x20, // /* code=18, hex=0x12, ascii="^R" */ - // 0x10, 0x84, 0x21, 0x00, 0x40, // /* code=19, hex=0x13, ascii="^S" */ - // 0x19, 0x4A, 0x30, 0x84, 0x20, // /* code=20, hex=0x14, ascii="^T" */ - // 0x19, 0x06, 0x20, 0x90, 0x60, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x1C, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ - // 0x08, 0xCE, 0x13, 0x8C, 0x23, // /* code=23, hex=0x17, ascii="^W" */ - // 0x08, 0xCE, 0x10, 0x84, 0x20, // /* code=24, hex=0x18, ascii="^X" */ - // 0x08, 0x42, 0x13, 0x8C, 0x20, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x42, 0x70, 0x84, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x46, 0x71, 0x84, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x42, 0x10, 0xE0, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x84, 0x71, 0x08, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x08, 0x46, 0x33, 0x9C, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x39, 0xC6, 0x30, 0x84, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x08, 0xC6, 0x10, 0x80, 0x20, /* code=33, hex=0x21, ascii="!" */ - 0x31, 0x88, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0x8E, 0x21, 0x1C, 0x40, /* code=35, hex=0x23, ascii="#" */ - 0x10, 0xC8, 0x30, 0x1C, 0x20, /* code=36, hex=0x24, ascii="$" */ - 0x31, 0x80, 0x11, 0x10, 0x80, /* code=37, hex=0x25, ascii="%" */ - 0x11, 0x4A, 0x22, 0x90, 0x60, /* code=38, hex=0x26, ascii="&" */ - 0x18, 0xC4, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x08, 0x84, 0x21, 0x08, 0x20, /* code=40, hex=0x28, ascii="(" */ - 0x10, 0x42, 0x10, 0x84, 0x40, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x86, 0x71, 0x88, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x42, 0x70, 0x84, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x0C, 0x62, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x70, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x0C, 0x60, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x00, 0x11, 0x10, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x19, 0x08, 0x53, 0x10, 0x60, /* code=48, hex=0x30, ascii="0" */ - 0x08, 0xC2, 0x10, 0x84, 0x60, /* code=49, hex=0x31, ascii="1" */ - 0x19, 0x00, 0x11, 0x10, 0xE0, /* code=50, hex=0x32, ascii="2" */ - 0x19, 0x00, 0x30, 0x10, 0x60, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x44, 0x43, 0x80, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x39, 0x08, 0x70, 0x10, 0x60, /* code=53, hex=0x35, ascii="5" */ - 0x08, 0x88, 0x72, 0x10, 0x60, /* code=54, hex=0x36, ascii="6" */ - 0x38, 0x00, 0x11, 0x08, 0x40, /* code=55, hex=0x37, ascii="7" */ - 0x19, 0x08, 0x32, 0x10, 0x60, /* code=56, hex=0x38, ascii="8" */ - 0x19, 0x08, 0x30, 0x00, 0x60, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x06, 0x30, 0x0C, 0x60, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x06, 0x30, 0x0C, 0x62, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x44, 0x41, 0x04, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x0E, 0x00, 0x1C, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x10, 0x40, 0x00, 0x04, 0x40, /* code=62, hex=0x3E, ascii=">" */ - 0x19, 0x00, 0x10, 0x80, 0x20, /* code=63, hex=0x3F, ascii="?" */ - 0x19, 0x0A, 0x52, 0x90, 0x60, /* code=64, hex=0x40, ascii="@" */ - 0x19, 0x08, 0x43, 0x90, 0x80, /* code=65, hex=0x41, ascii="A" */ - 0x39, 0x08, 0x72, 0x10, 0xE0, /* code=66, hex=0x42, ascii="B" */ - 0x19, 0x08, 0x42, 0x10, 0x60, /* code=67, hex=0x43, ascii="C" */ - 0x39, 0x08, 0x42, 0x10, 0xE0, /* code=68, hex=0x44, ascii="D" */ - 0x39, 0x08, 0x72, 0x10, 0xE0, /* code=69, hex=0x45, ascii="E" */ - 0x39, 0x08, 0x72, 0x10, 0x80, /* code=70, hex=0x46, ascii="F" */ - 0x19, 0x08, 0x52, 0x10, 0x60, /* code=71, hex=0x47, ascii="G" */ - 0x21, 0x08, 0x72, 0x10, 0x80, /* code=72, hex=0x48, ascii="H" */ - 0x18, 0x42, 0x10, 0x84, 0x60, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x00, 0x02, 0x10, 0x60, /* code=74, hex=0x4A, ascii="J" */ - 0x21, 0x0A, 0x62, 0x90, 0x80, /* code=75, hex=0x4B, ascii="K" */ - 0x21, 0x08, 0x42, 0x10, 0xE0, /* code=76, hex=0x4C, ascii="L" */ - 0x21, 0x8A, 0x42, 0x10, 0x80, /* code=77, hex=0x4D, ascii="M" */ - 0x21, 0x8A, 0x42, 0x10, 0x80, /* code=78, hex=0x4E, ascii="N" */ - 0x19, 0x08, 0x42, 0x10, 0x60, /* code=79, hex=0x4F, ascii="O" */ - 0x39, 0x08, 0x72, 0x10, 0x80, /* code=80, hex=0x50, ascii="P" */ - 0x19, 0x08, 0x42, 0x90, 0x60, /* code=81, hex=0x51, ascii="Q" */ - 0x39, 0x08, 0x72, 0x10, 0x80, /* code=82, hex=0x52, ascii="R" */ - 0x19, 0x08, 0x30, 0x10, 0x60, /* code=83, hex=0x53, ascii="S" */ - 0x38, 0x42, 0x10, 0x84, 0x20, /* code=84, hex=0x54, ascii="T" */ - 0x21, 0x08, 0x42, 0x10, 0x60, /* code=85, hex=0x55, ascii="U" */ - 0x21, 0x08, 0x42, 0x08, 0x20, /* code=86, hex=0x56, ascii="V" */ - 0x21, 0x0A, 0x52, 0x94, 0x40, /* code=87, hex=0x57, ascii="W" */ - 0x21, 0x04, 0x11, 0x10, 0x80, /* code=88, hex=0x58, ascii="X" */ - 0x21, 0x08, 0x20, 0x84, 0x20, /* code=89, hex=0x59, ascii="Y" */ - 0x38, 0x02, 0x22, 0x10, 0xE0, /* code=90, hex=0x5A, ascii="Z" */ - 0x18, 0x84, 0x21, 0x08, 0x60, /* code=91, hex=0x5B, ascii="[" */ - 0x01, 0x04, 0x10, 0x00, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x18, 0x00, 0x00, 0x00, 0x60, /* code=93, hex=0x5D, ascii="]" */ - 0x08, 0x88, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x0F, /* code=95, hex=0x5F, ascii="_" */ - 0x18, 0xC2, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x06, 0x01, 0x90, 0x60, /* code=97, hex=0x61, ascii="a" */ - 0x21, 0x0E, 0x42, 0x10, 0xE0, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x06, 0x42, 0x10, 0x60, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x06, 0x42, 0x10, 0x60, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x06, 0x43, 0x90, 0x60, /* code=101, hex=0x65, ascii="e" */ - 0x08, 0x84, 0x71, 0x08, 0x40, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x06, 0x42, 0x0C, 0x03, /* code=103, hex=0x67, ascii="g" */ - 0x21, 0x0E, 0x42, 0x10, 0x80, /* code=104, hex=0x68, ascii="h" */ - 0x08, 0x02, 0x10, 0x84, 0x20, /* code=105, hex=0x69, ascii="i" */ - 0x00, 0x02, 0x00, 0x00, 0x83, /* code=106, hex=0x6A, ascii="j" */ - 0x21, 0x08, 0x53, 0x14, 0x80, /* code=107, hex=0x6B, ascii="k" */ - 0x08, 0x42, 0x10, 0x84, 0x20, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x0C, 0x52, 0x90, 0x80, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x0E, 0x42, 0x10, 0x80, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x06, 0x42, 0x10, 0x60, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x0E, 0x42, 0x10, 0xE4, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x06, 0x42, 0x10, 0x60, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x0A, 0x21, 0x08, 0xE0, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x06, 0x41, 0x80, 0x60, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x8E, 0x21, 0x08, 0x20, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x08, 0x42, 0x14, 0x40, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x08, 0x42, 0x08, 0x20, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x08, 0x42, 0x9C, 0x40, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x08, 0x41, 0x90, 0x80, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x08, 0x42, 0x0C, 0x26, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x0E, 0x01, 0x90, 0xE0, /* code=122, hex=0x7A, ascii="z" */ - 0x08, 0x84, 0x61, 0x08, 0x20, /* code=123, hex=0x7B, ascii="{" */ - 0x08, 0x42, 0x00, 0x84, 0x20, /* code=124, hex=0x7C, ascii="|" */ - 0x18, 0x00, 0x00, 0x00, 0x60, /* code=125, hex=0x7D, ascii="}" */ - 0x11, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x08, 0xCC, 0x42, 0x1C, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x19, 0x08, 0x42, 0x0C, 0x23, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x20, 0x08, 0x42, 0x14, 0x40, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x00, 0x06, 0x43, 0x90, 0x60, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x18, 0x06, 0x01, 0x90, 0x60, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x10, 0x06, 0x01, 0x90, 0x60, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x18, 0x06, 0x01, 0x90, 0x60, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x18, 0x86, 0x01, 0x90, 0x60, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0xC8, 0x42, 0x0C, 0x23, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x18, 0x06, 0x43, 0x90, 0x60, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x10, 0x06, 0x43, 0x90, 0x60, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x18, 0x06, 0x43, 0x90, 0x60, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x10, 0x02, 0x10, 0x84, 0x20, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x08, 0x80, 0x10, 0x84, 0x20, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x10, 0x02, 0x10, 0x84, 0x20, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x10, 0x02, 0x22, 0x1C, 0x80, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x18, 0x86, 0x62, 0x1C, 0x80, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x00, 0x0E, 0x43, 0x90, 0xE0, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x0E, 0x13, 0x94, 0x60, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x19, 0x4A, 0x72, 0x94, 0xA0, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x18, 0x06, 0x42, 0x10, 0x60, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x10, 0x06, 0x42, 0x10, 0x60, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x30, 0x06, 0x42, 0x10, 0x60, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x18, 0x08, 0x42, 0x14, 0x40, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x30, 0x08, 0x42, 0x14, 0x40, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x10, 0x08, 0x42, 0x0C, 0x26, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x20, 0xC8, 0x42, 0x10, 0x60, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x10, 0x08, 0x42, 0x10, 0x60, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x00, 0x46, 0x42, 0x0C, 0x20, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x08, 0x84, 0x71, 0x08, 0xA0, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x20, 0x82, 0x70, 0x9C, 0x20, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x31, 0x4A, 0x62, 0x90, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x00, 0x42, 0x30, 0x84, 0xA2, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x08, 0x06, 0x01, 0x90, 0x60, // /* code=160, hex=0xA0, ascii="! " */ - // 0x08, 0x02, 0x10, 0x84, 0x20, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x08, 0x06, 0x42, 0x10, 0x60, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x08, 0x08, 0x42, 0x14, 0x40, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x11, 0x40, 0x72, 0x10, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x11, 0x40, 0x43, 0x14, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x18, 0x06, 0x41, 0x80, 0x60, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x19, 0x08, 0x41, 0x80, 0xE0, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x08, 0x02, 0x32, 0x10, 0x60, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x0E, 0x42, 0x10, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x1E, 0x00, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x21, 0x0A, 0x32, 0x00, 0x20, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x21, 0x0A, 0x22, 0x84, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x08, 0x02, 0x11, 0x8C, 0x20, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x04, 0x41, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x08, 0x22, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x28, 0x14, 0x02, 0x81, 0x40, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x2A, 0x8A, 0xA2, 0xA8, 0xAA, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x53, 0xCA, 0xF5, 0x3C, 0xAF, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x08, 0x42, 0xF0, 0x84, 0x21, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x0B, 0xC2, 0xF0, 0x84, 0x21, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x29, 0x4A, 0xD2, 0x94, 0xA5, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0xF2, 0x94, 0xA5, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x03, 0xC2, 0xF0, 0x84, 0x21, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x2B, 0x42, 0xD2, 0x94, 0xA5, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x29, 0x4A, 0x52, 0x94, 0xA5, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x03, 0xC2, 0xD2, 0x94, 0xA5, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x2B, 0x42, 0xF0, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x29, 0x4A, 0xF0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x0B, 0xC2, 0xF0, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0xF0, 0x84, 0x21, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x08, 0x42, 0x10, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x08, 0x42, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0xF0, 0x84, 0x21, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x08, 0x42, 0xF0, 0x84, 0x21, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x29, 0x4A, 0x52, 0x94, 0xA5, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x29, 0x48, 0x70, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x01, 0xC8, 0x52, 0x94, 0xA5, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x2B, 0x40, 0xF0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x03, 0xC0, 0xD2, 0x94, 0xA5, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x29, 0x48, 0x52, 0x94, 0xA5, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x03, 0xC0, 0xF0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x2B, 0x40, 0xD2, 0x94, 0xA5, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x0B, 0xC0, 0xF0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x29, 0x4A, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x03, 0xC0, 0xF0, 0x84, 0x21, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0xF2, 0x94, 0xA5, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x29, 0x4A, 0x70, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x08, 0x42, 0x10, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x42, 0x10, 0x84, 0x21, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x72, 0x94, 0xA5, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x29, 0x4A, 0xD2, 0x94, 0xA5, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x0B, 0xC0, 0xF0, 0x84, 0x21, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x08, 0x42, 0xF0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x10, 0x84, 0x21, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0x7B, 0xDE, 0xF7, 0xBD, 0xEF, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x07, 0xBD, 0xEF, // /* code=220, hex=0xDC, ascii="!\" */ - // 0x73, 0x9C, 0xE7, 0x39, 0xCE, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x08, 0x42, 0x10, 0x84, 0x21, // /* code=222, hex=0xDE, ascii="!^" */ - // 0x7B, 0xDE, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x06, 0x42, 0x0C, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x01, 0xC8, 0x72, 0x10, 0xE4, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x39, 0x08, 0x42, 0x10, 0x80, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x01, 0xC4, 0x21, 0x08, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x39, 0x04, 0x11, 0x10, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x06, 0x42, 0x0C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x08, 0x42, 0x1C, 0x84, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x04, 0x50, 0x84, 0x20, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x18, 0x46, 0x41, 0x84, 0x60, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x19, 0x08, 0x72, 0x10, 0x60, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0xC8, 0x41, 0x08, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x19, 0x04, 0x11, 0x90, 0x60, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x04, 0x52, 0x88, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x46, 0x52, 0x8C, 0x20, // /* code=237, hex=0xED, ascii="!m" */ - // 0x00, 0xC8, 0x72, 0x0C, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0xC8, 0x42, 0x10, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x01, 0xC0, 0x70, 0x1C, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x46, 0x10, 0x0C, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x20, 0xC0, 0x32, 0x00, 0xE0, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0xC8, 0x30, 0x00, 0xE0, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x00, 0x02, 0x10, 0x84, 0x21, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x08, 0x42, 0x10, 0x94, 0x40, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x40, 0x70, 0x04, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x8A, 0x01, 0x14, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x19, 0x08, 0x30, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x31, 0x80, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x20, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x00, 0x42, 0x12, 0x94, 0x40, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x28, 0x84, 0x20, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x30, 0x44, 0x70, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0x0E, 0x73, 0x9C, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x39, 0x16, 0xD1, 0x55, 0x13, 0x80, // /* code=1, hex=0x01, ascii="^A" */ + // 0x39, 0xF5, 0x5F, 0x45, 0xF3, 0x80, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xA7, 0xDF, 0x7C, 0xE1, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x43, 0x9F, 0x7C, 0xE1, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x10, 0xE3, 0x84, 0x7D, 0xF1, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x43, 0x9F, 0x7C, 0x43, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0xF3, 0xCF, 0xFF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x07, 0x92, 0x49, 0xE0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xF8, 0x6D, 0xB6, 0x1F, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x70, 0xCD, 0x49, 0x23, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x39, 0x14, 0x4E, 0x10, 0xE1, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x10, 0x61, 0x44, 0x31, 0xC6, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x0C, 0xD2, 0xCD, 0x2D, 0xB6, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x01, 0x53, 0x9B, 0x39, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x20, 0xC3, 0x8F, 0x38, 0xC2, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x08, 0x63, 0x9E, 0x38, 0x60, 0x80, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x28, 0xA2, 0x8A, 0x28, 0x02, 0x80, // /* code=19, hex=0x13, ascii="^S" */ + // 0x3D, 0x55, 0x4D, 0x14, 0x51, 0x40, // /* code=20, hex=0x14, ascii="^T" */ + // 0x39, 0x13, 0x0A, 0x19, 0x13, 0x80, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x01, 0xE7, 0x80, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x0E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x10, 0xE7, 0xC4, 0x10, 0x41, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x10, 0x41, 0x04, 0x7C, 0xE1, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x41, 0x9F, 0x18, 0x40, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x43, 0x1F, 0x30, 0x40, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x10, 0x41, 0x07, 0xC0, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0xA2, 0x9F, 0x28, 0xA0, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x10, 0x43, 0x8E, 0x7D, 0xF0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x7D, 0xF3, 0x8E, 0x10, 0x40, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x10, 0xE3, 0x84, 0x10, 0x01, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x6D, 0xB4, 0x80, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xA7, 0xCA, 0x29, 0xF2, 0x80, /* code=35, hex=0x23, ascii="#" */ + 0x20, 0xE4, 0x0C, 0x09, 0xC1, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x65, 0x90, 0x84, 0x21, 0x34, 0xC0, /* code=37, hex=0x25, ascii="%" */ + 0x21, 0x45, 0x08, 0x55, 0x23, 0x40, /* code=38, hex=0x26, ascii="&" */ + 0x30, 0xC2, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x10, 0x82, 0x08, 0x20, 0x81, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x20, 0x41, 0x04, 0x10, 0x42, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0xA3, 0x9F, 0x38, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x41, 0x1F, 0x10, 0x40, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x08, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x39, 0x14, 0xD5, 0x65, 0x13, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x10, 0xC1, 0x04, 0x10, 0x43, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x39, 0x10, 0x46, 0x21, 0x07, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x39, 0x10, 0x4E, 0x05, 0x13, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x08, 0x62, 0x92, 0x7C, 0x20, 0x80, /* code=52, hex=0x34, ascii="4" */ + 0x7D, 0x04, 0x1E, 0x05, 0x13, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x18, 0x84, 0x1E, 0x45, 0x13, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x7C, 0x10, 0x84, 0x20, 0x82, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x39, 0x14, 0x4E, 0x45, 0x13, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x39, 0x14, 0x4F, 0x04, 0x23, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x08, /* code=59, hex=0x3B, ascii=";" */ + 0x08, 0x42, 0x10, 0x20, 0x40, 0x80, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x20, 0x40, 0x81, 0x08, 0x42, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x39, 0x10, 0x46, 0x10, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x39, 0x15, 0xD5, 0x5D, 0x03, 0x80, /* code=64, hex=0x40, ascii="@" */ + 0x39, 0x14, 0x51, 0x7D, 0x14, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x79, 0x14, 0x5E, 0x45, 0x17, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x39, 0x14, 0x10, 0x41, 0x13, 0x80, /* code=67, hex=0x43, ascii="C" */ + 0x79, 0x14, 0x51, 0x45, 0x17, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x7D, 0x04, 0x1E, 0x41, 0x07, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x7D, 0x04, 0x1E, 0x41, 0x04, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x39, 0x14, 0x17, 0x45, 0x13, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x45, 0x14, 0x5F, 0x45, 0x14, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x38, 0x41, 0x04, 0x10, 0x43, 0x80, /* code=73, hex=0x49, ascii="I" */ + 0x04, 0x10, 0x41, 0x45, 0x13, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x45, 0x25, 0x18, 0x51, 0x24, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x41, 0x04, 0x10, 0x41, 0x07, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x45, 0xB5, 0x51, 0x45, 0x14, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x45, 0x95, 0x53, 0x45, 0x14, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x39, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x79, 0x14, 0x5E, 0x41, 0x04, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x39, 0x14, 0x51, 0x55, 0x23, 0x40, /* code=81, hex=0x51, ascii="Q" */ + 0x79, 0x14, 0x5E, 0x49, 0x14, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x39, 0x14, 0x0E, 0x05, 0x13, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x7C, 0x41, 0x04, 0x10, 0x41, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x45, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x45, 0x14, 0x51, 0x44, 0xA1, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x45, 0x15, 0x55, 0x55, 0x52, 0x80, /* code=87, hex=0x57, ascii="W" */ + 0x45, 0x12, 0x84, 0x29, 0x14, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x45, 0x14, 0x4A, 0x10, 0x41, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x78, 0x21, 0x08, 0x41, 0x07, 0x80, /* code=90, hex=0x5A, ascii="Z" */ + 0x38, 0x82, 0x08, 0x20, 0x83, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x38, 0x20, 0x82, 0x08, 0x23, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x10, 0xA4, 0x40, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, /* code=95, hex=0x5F, ascii="_" */ + 0x30, 0xC1, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x03, 0x81, 0x3D, 0x13, 0xC0, /* code=97, hex=0x61, ascii="a" */ + 0x41, 0x07, 0x91, 0x45, 0x17, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x03, 0x91, 0x41, 0x13, 0x80, /* code=99, hex=0x63, ascii="c" */ + 0x04, 0x13, 0xD1, 0x45, 0x13, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x03, 0x91, 0x79, 0x03, 0x80, /* code=101, hex=0x65, ascii="e" */ + 0x18, 0x82, 0x1E, 0x20, 0x82, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x03, 0xD1, 0x44, 0xF0, 0x4E, /* code=103, hex=0x67, ascii="g" */ + 0x41, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=104, hex=0x68, ascii="h" */ + 0x10, 0x01, 0x04, 0x10, 0x41, 0x80, /* code=105, hex=0x69, ascii="i" */ + 0x08, 0x01, 0x82, 0x08, 0x24, 0x8C, /* code=106, hex=0x6A, ascii="j" */ + 0x41, 0x04, 0x94, 0x61, 0x44, 0x80, /* code=107, hex=0x6B, ascii="k" */ + 0x10, 0x41, 0x04, 0x10, 0x41, 0x80, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x06, 0x95, 0x55, 0x14, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x03, 0x91, 0x45, 0x13, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x07, 0x91, 0x45, 0x17, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x03, 0xD1, 0x45, 0x13, 0xC1, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x05, 0x89, 0x20, 0x87, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x03, 0x90, 0x38, 0x13, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x87, 0x88, 0x20, 0xA1, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x04, 0x92, 0x49, 0x62, 0x80, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x04, 0x51, 0x44, 0xA1, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x04, 0x51, 0x55, 0xF2, 0x80, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x04, 0x92, 0x31, 0x24, 0x80, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x04, 0x92, 0x48, 0xE1, 0x18, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x07, 0x82, 0x31, 0x07, 0x80, /* code=122, hex=0x7A, ascii="z" */ + 0x18, 0x82, 0x18, 0x20, 0x81, 0x80, /* code=123, hex=0x7B, ascii="{" */ + 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x30, 0x20, 0x83, 0x08, 0x23, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x10, 0xE6, 0xD1, 0x45, 0xF0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x39, 0x14, 0x10, 0x44, 0xE1, 0x0C, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x48, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x38, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x28, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x30, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x38, 0xA3, 0x81, 0x3D, 0x13, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0xE4, 0x50, 0x44, 0xE1, 0x0C, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x38, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x28, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x30, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x28, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0xA0, 0x04, 0x10, 0x41, 0x80, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x20, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x28, 0x01, 0x0A, 0x45, 0xF4, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0xA3, 0x9B, 0x45, 0xF4, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x0C, 0x07, 0xD0, 0x79, 0x07, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x07, 0x85, 0x7D, 0x43, 0xC0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x3D, 0x45, 0x1F, 0x51, 0x45, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x38, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x28, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x60, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x38, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x60, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x28, 0x04, 0x92, 0x48, 0xE1, 0x18, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x48, 0xC4, 0x92, 0x49, 0x23, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x28, 0x04, 0x92, 0x49, 0x23, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x43, 0x90, 0x40, 0xE1, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x18, 0x92, 0x1E, 0x20, 0x95, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x44, 0xA1, 0x1F, 0x11, 0xF1, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x61, 0x45, 0x1A, 0x5D, 0x24, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x08, 0x51, 0x0E, 0x10, 0x45, 0x08, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x18, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x18, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x18, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x18, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x29, 0x40, 0x1C, 0x49, 0x24, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x29, 0x40, 0x12, 0x69, 0x64, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x13, 0xD1, 0x3C, 0x03, 0xC0, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x31, 0x24, 0x92, 0x30, 0x07, 0x80, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x10, 0x01, 0x0C, 0x41, 0x13, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x07, 0xD0, 0x41, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x0F, 0xC1, 0x04, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x41, 0x25, 0x0E, 0x44, 0x21, 0xC0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x41, 0x25, 0x0B, 0x54, 0x70, 0x40, // /* code=172, hex=0xAC, ascii="!," */ + // 0x10, 0x01, 0x04, 0x38, 0xE1, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x02, 0x52, 0x24, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x04, 0x89, 0x48, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x0A, 0x80, 0x54, 0x0A, 0x80, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x56, 0xA5, 0x6A, 0x56, 0xA5, 0x6A, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAB, 0xF5, 0x7F, 0xAB, 0xF5, 0x7F, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x41, 0x3C, 0x10, 0x41, 0x04, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x13, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x51, 0x45, 0x34, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x3C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x03, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x53, 0x41, 0x34, 0x51, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x03, 0xC1, 0x34, 0x51, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x53, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x51, 0x45, 0x3C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x13, 0xC1, 0x3C, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x3C, 0x10, 0x41, 0x04, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x41, 0x07, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x41, 0x3F, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x3F, 0x10, 0x41, 0x04, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x41, 0x07, 0x10, 0x41, 0x04, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x41, 0x3F, 0x10, 0x41, 0x04, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x51, 0x45, 0x17, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x51, 0x74, 0x1F, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x01, 0xF4, 0x17, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x53, 0x70, 0x3F, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x03, 0xF0, 0x37, 0x51, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x51, 0x74, 0x17, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x53, 0x70, 0x37, 0x51, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x13, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x51, 0x45, 0x3F, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x03, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x3F, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x51, 0x45, 0x1F, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x71, 0x07, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x1F, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x51, 0x45, 0x37, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x13, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x07, 0x10, 0x41, 0x04, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x03, 0x52, 0x48, 0xD0, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x01, 0xC4, 0x9C, 0x49, 0x27, 0x10, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x79, 0x24, 0x10, 0x41, 0x04, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x01, 0xF2, 0x8A, 0x28, 0xA2, 0x80, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x79, 0x22, 0x04, 0x21, 0x27, 0x80, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x03, 0xD2, 0x48, 0xC0, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x04, 0x92, 0x49, 0xC4, 0x10, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x02, 0x94, 0x10, 0x41, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x38, 0x43, 0x91, 0x38, 0x43, 0x80, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x31, 0x24, 0x9E, 0x49, 0x23, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0xE4, 0x51, 0x28, 0xA6, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x31, 0x02, 0x04, 0x39, 0x23, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x02, 0x95, 0x54, 0xA0, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x43, 0x95, 0x54, 0xE1, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0xE4, 0x1E, 0x40, 0xE0, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0xC4, 0x92, 0x49, 0x20, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x43, 0x84, 0x00, 0xE0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x40, 0xC0, 0x8C, 0x40, 0x07, 0x80, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x08, 0xC4, 0x0C, 0x08, 0x07, 0x80, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x21, 0x44, 0x10, 0x41, 0x04, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x10, 0x41, 0x04, 0x11, 0x42, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x40, 0x1F, 0x00, 0x40, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0xA5, 0x00, 0x29, 0x40, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x31, 0x24, 0x8C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x71, 0x04, 0x51, 0x42, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x50, 0xA2, 0x8A, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x60, 0x42, 0x1C, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x07, 0x9E, 0x79, 0xE0, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ }; diff --git a/wled00/src/font/console_font_7x9.h b/wled00/src/font/console_font_7x9.h index c9996fb003..e26f1b6b3a 100644 --- a/wled00/src/font/console_font_7x9.h +++ b/wled00/src/font/console_font_7x9.h @@ -7,7 +7,7 @@ * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height: 9 - * [2] Fixed/max glyph width: 6 + * [2] Fixed/max glyph width: 7 * [3] Spacing between chars: 1 * [4] Flags: 0x00 (0x01 = variable width) * [5] First Char: 32 @@ -39,262 +39,262 @@ */ static const unsigned char console_font_7x9[] PROGMEM = { - 0x57, 0x09, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x09, 0x07, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x1C, 0x85, 0x55, 0x41, 0x54, 0x8F, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x1C, 0xF6, 0x9A, 0x7D, 0x76, 0x0F, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0xD7, 0xDF, 0x7C, 0xF1, 0xC2, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x21, 0xCF, 0x7C, 0xF1, 0xC2, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x1C, 0x70, 0x9A, 0x7D, 0xA0, 0x8F, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x08, 0x73, 0xDF, 0x7C, 0xA0, 0x87, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0xC7, 0x1C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0x7D, 0xF7, 0x18, 0x61, 0xC7, 0xDF, 0x7C, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x31, 0xCC, 0x30, 0x70, 0xC0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0x7D, 0xC6, 0x13, 0x4D, 0x87, 0x1F, 0x7C, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x04, 0x00, 0x43, 0x1C, 0xC3, 0x07, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x1C, 0xC3, 0x07, 0x0C, 0x70, 0xC3, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x71, 0x44, 0x10, 0x43, 0x0C, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x71, 0x07, 0x10, 0x43, 0x4D, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x48, 0xA1, 0xC5, 0x74, 0x72, 0x92, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x41, 0x87, 0x1C, 0x71, 0x84, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x00, 0x43, 0x1C, 0x30, 0x40, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x08, 0x73, 0xC2, 0x08, 0xF1, 0xC2, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x34, 0xD3, 0x4D, 0x34, 0x03, 0x4D, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x00, 0x72, 0x8A, 0x1C, 0x20, 0x82, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x1C, 0xC3, 0x07, 0x30, 0xC1, 0xC0, 0x30, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x00, 0xF3, 0xC0, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x08, 0x73, 0xC2, 0x08, 0xF1, 0xC2, 0x3C, // /* code=23, hex=0x17, ascii="^W" */ - // 0x00, 0x31, 0xCB, 0x0C, 0x30, 0xC3, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x30, 0xC3, 0x0C, 0xB1, 0xC3, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0xC1, 0x3C, 0x10, 0xC0, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x00, 0xC6, 0x3C, 0x60, 0xC0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x00, 0x30, 0xC3, 0xC0, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x01, 0x0C, 0x7C, 0xC1, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x02, 0x1C, 0xF7, 0xC0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x00, 0x1F, 0x3C, 0x70, 0x80, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x30, 0xC3, 0x0C, 0x00, 0xC3, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x00, 0xD3, 0x48, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0xD3, 0x5F, 0x35, 0xF3, 0x4D, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x04, 0x31, 0xCC, 0x1C, 0x03, 0xC3, 0x08, /* code=36, hex=0x24, ascii="$" */ - 0x38, 0xA3, 0x81, 0x0C, 0x73, 0x41, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x1C, 0xD3, 0x47, 0x34, 0xD3, 0x47, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x00, 0x30, 0xC6, 0x18, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x00, 0x10, 0xC6, 0x18, 0x60, 0xC1, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x00, 0x60, 0xC1, 0x04, 0x10, 0xC6, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x83, 0x47, 0x7C, 0x73, 0x48, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x00, 0xC3, 0x3C, 0xF0, 0xC3, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x30, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x10, 0x43, 0x0C, 0x61, 0x8C, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x00, 0x73, 0x0D, 0x38, 0xC3, 0x07, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x00, 0x33, 0xC3, 0x0C, 0x30, 0xCF, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x00, 0x73, 0x08, 0x0C, 0x63, 0x0F, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x00, 0x73, 0x00, 0x0C, 0x03, 0x07, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x10, 0xC7, 0x34, 0xF0, 0x43, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x00, 0xF3, 0x0C, 0x3C, 0x03, 0x07, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x00, 0x31, 0x8C, 0x3C, 0xC3, 0x07, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x00, 0xF3, 0x00, 0x04, 0x30, 0xC3, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x00, 0x73, 0x0C, 0x1C, 0xC3, 0x07, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x00, 0x73, 0x0C, 0x1C, 0x00, 0x47, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x30, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x00, 0xC6, 0x30, 0x60, 0xC0, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x01, 0x83, 0x04, 0x31, 0x80, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x00, 0x73, 0x00, 0x04, 0x30, 0x03, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x00, 0x73, 0x0D, 0x34, 0xD3, 0x07, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x00, 0x21, 0xC5, 0x34, 0xF6, 0x18, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0F, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x00, 0xF3, 0x0C, 0x30, 0xC3, 0x0F, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0F, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x00, 0xF3, 0x0C, 0x3C, 0xC3, 0x0C, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x00, 0x73, 0x0C, 0x34, 0xC3, 0x07, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x00, 0xC3, 0x0C, 0x3C, 0xC3, 0x0C, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x00, 0x70, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x30, 0x41, 0x04, 0xD3, 0x47, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x00, 0xC3, 0x4D, 0x3C, 0xD3, 0x4C, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x00, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x01, 0x86, 0x1D, 0x7D, 0xA6, 0x9A, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x00, 0xC3, 0x8E, 0x3C, 0xD3, 0x0C, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x00, 0xF3, 0x0C, 0x30, 0xF3, 0x0C, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x00, 0x73, 0x0C, 0x30, 0xE3, 0x47, 0x00, /* code=81, hex=0x51, ascii="Q" */ - 0x00, 0xF3, 0x0C, 0x34, 0xF3, 0x4C, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x00, 0x73, 0x0C, 0x1C, 0x03, 0x07, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x00, 0xF2, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x00, 0xC3, 0x0C, 0x30, 0xC3, 0x07, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x01, 0x86, 0x0D, 0x34, 0x71, 0xC2, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x01, 0x86, 0x9A, 0x68, 0xF3, 0x48, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x00, 0xC3, 0x07, 0x0C, 0x73, 0x0C, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x00, 0xC3, 0x0C, 0x1C, 0x30, 0xC7, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x00, 0xF3, 0x01, 0x0C, 0x63, 0x0F, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x00, 0x71, 0x86, 0x18, 0x61, 0x87, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x00, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x00, 0x70, 0x41, 0x04, 0x10, 0x47, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x00, 0x21, 0xCD, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, /* code=95, hex=0x5F, ascii="_" */ - 0x00, 0x61, 0x83, 0x0C, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0x07, 0x00, 0x73, 0x07, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x00, 0xC3, 0x0F, 0x30, 0xC3, 0x0B, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0x07, 0x30, 0xF3, 0x07, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x31, 0x86, 0x3C, 0x61, 0x8F, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0x07, 0x30, 0xC1, 0xC0, 0x1C, /* code=103, hex=0x67, ascii="g" */ - 0x00, 0xC3, 0x0D, 0x38, 0xC3, 0x0C, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x0C, 0x30, 0x03, 0x1C, 0x30, 0xC7, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x04, 0x10, 0x01, 0x1C, 0x12, 0x4D, 0x1C, /* code=106, hex=0x6A, ascii="j" */ - 0x00, 0xC3, 0x0C, 0x34, 0xF3, 0x4C, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x00, 0x30, 0xC3, 0x0C, 0x30, 0xC7, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x00, 0x0D, 0x7D, 0xA6, 0x9A, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x00, 0x0D, 0x38, 0xC3, 0x0C, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0x07, 0x30, 0xC3, 0x07, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x00, 0x0F, 0x30, 0xC3, 0x8D, 0x30, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0x07, 0x30, 0xC3, 0x46, 0x00, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0x04, 0x3C, 0x61, 0x8F, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0x07, 0x30, 0x70, 0x07, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x21, 0x9F, 0x18, 0x61, 0x83, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x00, 0x0C, 0x30, 0xC3, 0x46, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x00, 0x18, 0x60, 0xD1, 0xC2, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x00, 0x1A, 0x68, 0xF3, 0x48, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x00, 0x18, 0x34, 0x73, 0x58, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x00, 0x0C, 0x30, 0x60, 0xCD, 0x1C, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x00, 0x0F, 0x00, 0x31, 0x8F, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x31, 0x86, 0x30, 0x61, 0x83, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x0C, 0x30, 0xC3, 0x00, 0x30, 0xC3, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x00, 0xE0, 0xC3, 0x04, 0x30, 0xCE, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x00, 0x21, 0xCD, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x00, 0x43, 0x18, 0xC3, 0xC0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x00, 0x73, 0x0C, 0x30, 0xC3, 0x07, 0x3C, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x30, 0xC0, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x04, 0x30, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x0C, 0x60, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x18, 0x60, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x0C, 0x10, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x0C, 0x20, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x03, 0x18, 0xC1, 0x83, 0x3C, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x04, 0x30, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x30, 0xC0, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x0C, 0x10, 0x07, 0x30, 0xF3, 0x07, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x30, 0xC0, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x08, 0x70, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x18, 0x30, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0x60, 0x21, 0xC5, 0x34, 0xF6, 0x18, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x1C, 0x51, 0xC5, 0x34, 0xF6, 0x18, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x0C, 0x63, 0xCC, 0x3C, 0xC3, 0x0F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x00, 0x0F, 0x0C, 0xF6, 0xCF, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x31, 0xCB, 0x2D, 0xF6, 0xDB, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x08, 0x70, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x30, 0xC0, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x0C, 0x10, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x04, 0x30, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x0C, 0x10, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x30, 0xC0, 0x0C, 0x30, 0x60, 0xCD, 0x1C, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x30, 0x01, 0xCC, 0x30, 0xC3, 0x07, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x30, 0x03, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x04, 0x11, 0xCC, 0x30, 0x70, 0x82, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x0C, 0x61, 0x86, 0x3C, 0x61, 0xCC, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x30, 0xC1, 0xC3, 0x3C, 0x33, 0xC3, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0x71, 0xA6, 0x9E, 0x65, 0xB6, 0x40, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x04, 0x30, 0xC3, 0x3C, 0x30, 0xC3, 0x38, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x00, 0x10, 0x07, 0x00, 0x73, 0x07, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x04, 0x30, 0x07, 0x0C, 0x30, 0xC7, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x04, 0x30, 0x07, 0x30, 0xC3, 0x07, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x04, 0x30, 0x0C, 0x30, 0xC3, 0x07, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x39, 0xB0, 0x0D, 0x38, 0xC3, 0x0C, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x39, 0xB0, 0x0C, 0x38, 0xF3, 0x4C, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x1C, 0x11, 0xCD, 0x18, 0x03, 0xC0, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x1C, 0xC3, 0x07, 0x00, 0xF0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x00, 0x30, 0x03, 0x18, 0xC3, 0x07, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x07, 0x1C, 0x61, 0x80, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x0F, 0x3C, 0x10, 0x40, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x30, 0xC3, 0x0D, 0x0C, 0x00, 0xC3, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x30, 0xC3, 0x0D, 0x3C, 0x53, 0xC1, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x30, 0x03, 0x0C, 0x71, 0xC3, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x01, 0x8C, 0x64, 0xC1, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x06, 0x4C, 0x18, 0xC6, 0x40, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x28, 0x05, 0x40, 0x28, 0x05, 0x40, 0x28, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x48, 0x91, 0x12, 0x24, 0x44, 0x89, 0x10, // /* code=177, hex=0xB1, ascii="!1" */ - // 0x54, 0xA5, 0x4A, 0x54, 0xA5, 0x4A, 0x54, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x08, 0x20, 0x82, 0x78, 0x20, 0x82, 0x08, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x08, 0x20, 0x9E, 0x09, 0xE0, 0x82, 0x08, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x14, 0x51, 0x45, 0x74, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x00, 0x7C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x00, 0x1E, 0x09, 0xE0, 0x82, 0x08, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x14, 0x51, 0x5D, 0x05, 0xD1, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x00, 0x1F, 0x05, 0xD1, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x14, 0x51, 0x5D, 0x05, 0xF0, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x14, 0x51, 0x45, 0x7C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x08, 0x20, 0x9E, 0x09, 0xE0, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x00, 0x78, 0x20, 0x82, 0x08, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x08, 0x20, 0x82, 0x0C, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x08, 0x20, 0x82, 0x7C, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x00, 0x7C, 0x20, 0x82, 0x08, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x08, 0x20, 0x82, 0x0C, 0x20, 0x82, 0x08, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x08, 0x20, 0x82, 0x7C, 0x20, 0x82, 0x08, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x08, 0x20, 0x83, 0x08, 0x30, 0x82, 0x08, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x14, 0x51, 0x45, 0x10, 0x70, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x00, 0x07, 0x10, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x14, 0x51, 0x5D, 0x01, 0xF0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x00, 0x1F, 0x01, 0xD1, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x14, 0x51, 0x45, 0x10, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x14, 0x51, 0x5D, 0x01, 0xD1, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x08, 0x20, 0x9F, 0x01, 0xF0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x14, 0x51, 0x45, 0x7C, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x82, 0x08, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x00, 0x7C, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x14, 0x51, 0x45, 0x1C, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x08, 0x20, 0x83, 0x08, 0x30, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x03, 0x08, 0x30, 0x82, 0x08, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x00, 0x1C, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x14, 0x51, 0x45, 0x74, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x08, 0x20, 0x9F, 0x09, 0xF0, 0x82, 0x08, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x08, 0x20, 0x82, 0x78, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x00, 0x0C, 0x20, 0x82, 0x08, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7C, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0x01, 0xF7, 0xDF, 0x7C, // /* code=220, hex=0xDC, ascii="!\" */ - // 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x78, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=222, hex=0xDE, ascii="!^" */ - // 0x7D, 0xF7, 0xDF, 0x7C, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x63, 0x4D, 0x34, 0x60, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x3C, 0xC3, 0x0D, 0x30, 0xC3, 0x0D, 0x04, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x00, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x03, 0x5F, 0x78, 0xC3, 0x4D, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x01, 0xF6, 0x0C, 0x1C, 0x63, 0x1F, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x00, 0x07, 0x34, 0xD3, 0x47, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x00, 0x06, 0x18, 0x61, 0xCC, 0x20, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x03, 0xCD, 0x04, 0x10, 0xC3, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x1C, 0x31, 0xCC, 0x30, 0x70, 0xC7, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x73, 0x0C, 0x3C, 0xC3, 0x07, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x73, 0x0C, 0x30, 0xC1, 0x0C, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x00, 0x73, 0x06, 0x0C, 0x73, 0x07, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0x06, 0x24, 0x92, 0x46, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x00, 0x73, 0x0D, 0x38, 0xC1, 0xC2, 0x10, // /* code=237, hex=0xED, ascii="!m" */ - // 0x0C, 0x63, 0x0C, 0x3C, 0xC1, 0x83, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0x01, 0xCC, 0x30, 0xC3, 0x0C, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x30, 0xCF, 0x0C, 0x30, 0x0F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x00, 0x60, 0xC1, 0x0C, 0x60, 0x07, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x10, 0xC6, 0x0C, 0x10, 0x07, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x04, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xCB, 0x18, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x30, 0xC0, 0x3C, 0x00, 0xC3, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x00, 0xCE, 0x00, 0x33, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x00, 0x73, 0x0C, 0x1C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0xC7, 0x1C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x04, 0x10, 0x41, 0x04, 0xD1, 0xC1, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x00, 0xF3, 0x4D, 0x34, 0xD0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x00, 0x72, 0x43, 0x18, 0xF0, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0xF3, 0xCF, 0x3C, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x38, 0x8A, 0xAD, 0x58, 0x35, 0x65, 0x3C, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x38, 0xFB, 0x5E, 0xBF, 0xF7, 0x71, 0xBE, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xDB, 0xFF, 0xFF, 0xEF, 0x8E, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x20, 0xE3, 0xEF, 0xEF, 0x8E, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x38, 0x70, 0x46, 0xBF, 0xFA, 0xC4, 0x3E, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x10, 0x71, 0xF7, 0xFF, 0xEA, 0x84, 0x1C, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0x9E, 0x1C, 0x3C, 0xFF, 0xFF, 0xFE, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xCF, 0x0C, 0xC9, 0x98, 0x79, 0xFF, 0xFE, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x0E, 0x0C, 0x28, 0xC3, 0xCC, 0xD9, 0x9E, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x3C, 0xCD, 0x99, 0xE1, 0x87, 0x86, 0x0C, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x70, 0xB1, 0x02, 0x04, 0x18, 0x30, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x78, 0x91, 0xE2, 0x44, 0x9B, 0x36, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x92, 0xA8, 0xE1, 0x4E, 0xE7, 0x15, 0x49, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x40, 0xC1, 0xC3, 0xC7, 0x0C, 0x10, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x08, 0x30, 0xE3, 0xC3, 0x83, 0x02, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x6C, 0xD9, 0xB3, 0x66, 0xC0, 0x1B, 0x36, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x79, 0x52, 0xA3, 0xC2, 0x85, 0x0A, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x3C, 0xCD, 0x81, 0xE6, 0x6C, 0xCF, 0x03, 0x66, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x7C, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x30, 0xF2, 0xD1, 0x83, 0x06, 0x0C, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x30, 0x60, 0xC1, 0x8B, 0x4F, 0x0C, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x60, 0x67, 0xE1, 0x86, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x61, 0x87, 0xE6, 0x06, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x06, 0x0C, 0x1F, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0x93, 0x3F, 0xEC, 0xC9, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x00, 0x83, 0x8F, 0xBF, 0x80, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x07, 0xF7, 0xC7, 0x04, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x30, 0x60, 0xC1, 0x80, 0x06, 0x0C, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0xD9, 0xB2, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x08, 0x30, 0xF3, 0x03, 0xC0, 0xDF, 0x0C, 0x10, /* code=36, hex=0x24, ascii="$" */ + 0x70, 0xA5, 0xD8, 0x61, 0x87, 0xDA, 0x87, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x38, 0xD9, 0xB1, 0xC6, 0xED, 0x9B, 0x1F, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x00, 0x30, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x18, 0x61, 0x83, 0x06, 0x06, 0x06, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x60, 0x60, 0x60, 0xC1, 0x86, 0x18, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x60, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x79, 0x9B, 0x77, 0x6C, 0xD9, 0x9E, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x31, 0xE0, 0xC1, 0x83, 0x06, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x79, 0x9A, 0x31, 0xC6, 0x19, 0xBF, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x79, 0x98, 0x31, 0xC0, 0xD9, 0x9E, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x18, 0x71, 0xE6, 0xCF, 0xC3, 0x0F, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0xFD, 0x9B, 0x07, 0xC0, 0xD9, 0x9E, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x38, 0xC3, 0x07, 0xCC, 0xD9, 0x9E, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0xFD, 0x98, 0x30, 0xC3, 0x06, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x79, 0x9B, 0x33, 0xCC, 0xD9, 0x9E, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x79, 0x9B, 0x33, 0xE0, 0xC3, 0x1C, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x60, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x00, 0x61, 0x86, 0x06, 0x06, 0x00, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x00, 0xC0, 0xC0, 0xC3, 0x0C, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x79, 0x98, 0x30, 0xC3, 0x00, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x79, 0x8B, 0x76, 0xAD, 0x98, 0x9E, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0xF9, 0x9B, 0x37, 0xCC, 0xD9, 0xBE, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6C, 0xD9, 0xBE, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0xFD, 0x9B, 0x07, 0x8C, 0x19, 0xBF, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0xFD, 0x9B, 0x07, 0xCC, 0x18, 0x30, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x79, 0x9B, 0x06, 0xEC, 0xD9, 0x9F, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0xCD, 0x9B, 0x37, 0xEC, 0xD9, 0xB3, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x78, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x3C, 0x30, 0x60, 0xCD, 0x9B, 0x1C, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0xCD, 0xB3, 0x67, 0x8D, 0x9B, 0x33, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xBF, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0xCD, 0xDB, 0xB7, 0xED, 0xD9, 0xB3, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6F, 0x98, 0x30, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x79, 0x9B, 0x36, 0x6E, 0xDB, 0x9E, 0x06, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0xF9, 0x9B, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x79, 0x9B, 0x03, 0xC0, 0xD9, 0x9E, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0xFD, 0x68, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0xCD, 0x99, 0xE1, 0x87, 0x99, 0xB3, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0xCD, 0x9B, 0x33, 0xC3, 0x06, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0xFD, 0x98, 0x61, 0x86, 0x19, 0xBF, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x78, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x78, 0x30, 0x60, 0xC1, 0x83, 0x1E, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x20, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x00, 0xC1, 0x83, 0xE6, 0x6C, 0xD9, 0xAE, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0x19, 0x9E, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x0C, 0x19, 0xF6, 0x6C, 0xD9, 0x9D, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x01, 0xE6, 0x6F, 0xD8, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x38, 0xD9, 0x87, 0xC6, 0x0C, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xCF, 0x83, 0x3C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0xC1, 0x83, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x18, 0x30, 0x00, 0xC3, 0x83, 0x06, 0x1E, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x0C, 0x18, 0x00, 0x63, 0xC1, 0x93, 0x36, 0x38, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0xC1, 0x83, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x00, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x03, 0xE6, 0x6C, 0xDD, 0xB6, 0x60, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xDB, 0x9B, 0x06, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x01, 0x37, 0xE6, 0x0C, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x01, 0xE6, 0x07, 0x81, 0x9E, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x03, 0x36, 0x6C, 0xDB, 0x9B, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x03, 0xF0, 0x63, 0x0C, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x38, 0xC1, 0x86, 0x06, 0x0C, 0x0E, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x18, 0x30, 0x60, 0xC0, 0x03, 0x06, 0x0C, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x00, 0xE0, 0x60, 0xC0, 0xC3, 0x06, 0x38, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x20, 0xEB, 0x70, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x20, 0xE3, 0x6C, 0x5F, 0x80, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x78, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x66, 0xCC, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x30, 0x01, 0xF6, 0x2F, 0xD8, 0x1F, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x1C, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x36, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x18, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x1C, 0x28, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x00, 0xE3, 0x6C, 0x0D, 0x8E, 0x78, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x08, 0x38, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x66, 0xCC, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0x70, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x30, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xC6, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0x50, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x1C, 0x61, 0xFB, 0x07, 0xCC, 0x18, 0x3F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x03, 0xE1, 0xAF, 0xF6, 0x3F, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x3C, 0xE2, 0xC5, 0xFF, 0x36, 0x6F, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x10, 0x70, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x08, 0x38, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x18, 0x18, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x66, 0xCC, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x66, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x66, 0x01, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x08, 0x10, 0xF3, 0x06, 0x07, 0x84, 0x08, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x1C, 0x6C, 0xC1, 0x87, 0xC6, 0x0F, 0x33, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x66, 0xCC, 0xF0, 0xC7, 0xE3, 0x1F, 0x8C, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0xE1, 0xA3, 0x47, 0xAC, 0xDB, 0xF3, 0x03, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x0E, 0x30, 0x60, 0xC7, 0xE3, 0x06, 0x0C, 0x70, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x06, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x0C, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x0C, 0x30, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x0C, 0x30, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x77, 0xB8, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x77, 0xB8, 0x03, 0x37, 0x6F, 0xDB, 0xB3, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x18, 0xF3, 0x63, 0x40, 0x1F, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x3C, 0xCD, 0x99, 0xE0, 0x0F, 0xC0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x00, 0x30, 0x00, 0xC3, 0x0C, 0x19, 0x9E, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x01, 0xE3, 0xC6, 0x0C, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x03, 0xE7, 0xC1, 0x83, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x60, 0xC1, 0x83, 0x71, 0xA0, 0x86, 0x0F, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x60, 0xC1, 0x83, 0x67, 0xC5, 0x9F, 0x06, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x30, 0x00, 0xC1, 0x87, 0x8F, 0x0C, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0xCB, 0x3C, 0xCC, 0xCC, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x03, 0x33, 0x33, 0x2C, 0xF3, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x02, 0xA8, 0x05, 0x40, 0x2A, 0x80, 0x54, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x92, 0x90, 0x94, 0x94, 0x84, 0xA4, 0xA4, 0x24, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x20, 0x40, 0x8F, 0x02, 0x04, 0x08, 0x10, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x07, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9D, 0x0A, 0x14, 0x28, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x28, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x07, 0xC0, 0x9D, 0x0A, 0x14, 0x28, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9F, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x0F, 0x02, 0x04, 0x08, 0x10, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x20, 0x40, 0x81, 0xE0, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE0, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x04, 0x08, 0x10, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x20, 0x40, 0x81, 0xE2, 0x04, 0x08, 0x10, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE2, 0x04, 0x08, 0x10, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x28, 0x50, 0xA1, 0x42, 0xE5, 0x0A, 0x14, 0x28, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x28, 0x50, 0xA1, 0x72, 0x07, 0xC0, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x01, 0xF2, 0x05, 0xCA, 0x14, 0x28, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1F, 0xC0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1D, 0xCA, 0x14, 0x28, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x28, 0x50, 0xA1, 0x72, 0x05, 0xCA, 0x14, 0x28, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1D, 0xCA, 0x14, 0x28, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x10, 0x20, 0x47, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC4, 0x08, 0x10, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x28, 0x50, 0xA1, 0x43, 0xE0, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC0, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x00, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x03, 0xE5, 0x0A, 0x14, 0x28, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x10, 0x20, 0x47, 0xF1, 0x1F, 0xC4, 0x08, 0x10, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x20, 0x40, 0x8F, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x01, 0xE2, 0x04, 0x08, 0x10, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x69, 0xA3, 0x46, 0x86, 0x80, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x7C, 0xCD, 0x9B, 0x66, 0x6C, 0x59, 0xB6, 0x08, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0xFD, 0x8B, 0x06, 0x0C, 0x18, 0x30, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x01, 0xB7, 0xFF, 0x6C, 0xDB, 0x36, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x01, 0xFF, 0x1B, 0x03, 0x86, 0x19, 0xFF, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x01, 0xF6, 0xCD, 0x9B, 0x1C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x01, 0xB3, 0x66, 0xCF, 0xB1, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x01, 0xEB, 0x50, 0xE1, 0x86, 0x0C, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x3C, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x1E, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x79, 0x9B, 0x37, 0xEC, 0xD9, 0x9E, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xC9, 0x33, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x79, 0x81, 0x81, 0x87, 0x99, 0x9E, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x01, 0xA4, 0xA9, 0x52, 0x9A, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x04, 0x79, 0x9B, 0x77, 0x6C, 0xCF, 0x08, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x1E, 0x61, 0x83, 0x07, 0xEC, 0x0C, 0x0F, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0xB3, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x30, 0x63, 0xF1, 0x83, 0x00, 0x3F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x00, 0x60, 0x60, 0x61, 0x86, 0x00, 0x1E, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x18, 0x61, 0x81, 0x81, 0x80, 0x1E, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x0C, 0x34, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x2C, 0x30, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x30, 0x60, 0x07, 0xE0, 0x06, 0x0C, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x6B, 0xB0, 0x03, 0x5D, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x79, 0x9B, 0x33, 0xC0, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x0E, 0x18, 0x30, 0x60, 0xCD, 0x8F, 0x06, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x00, 0xF1, 0xB3, 0x66, 0xCD, 0x80, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x00, 0x71, 0x30, 0xC3, 0x0F, 0x80, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0xF9, 0xF3, 0xE7, 0xC0, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ }; From 5d3c554ff5c75b9ccd9229a557d32907f6a0780c Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 19:19:45 +0100 Subject: [PATCH 13/33] fix off by one, new font uses full 0-127 ASCII --- wled00/FX.h | 2 +- wled00/FX_2Dfcn.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 99071eceac..92943f7dd5 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1067,7 +1067,7 @@ class WS2812FX { extern const char JSON_mode_names[]; extern const char JSON_palette_names[]; -#define LAST_ASCII_CHAR 126 +#define LAST_ASCII_CHAR 127 #define FONT_HEADER_SIZE 12 /** * Unified Font Format (Flash and RAM use IDENTICAL layout) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 308da551e9..97e5266c26 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -589,8 +589,6 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #include "src/font/console_font_6x8.h" #include "src/font/console_font_7x9.h" -#define LAST_ASCII_CHAR 126 - // Pure glyph index calculator (inline for speed) inline int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { if (unicode <= LAST_ASCII_CHAR) { From 619d700997debcfbaba6db9c6fa9f4fee4a2f499 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 15 Feb 2026 19:40:55 +0100 Subject: [PATCH 14/33] bugfix, update some comments --- wled00/FX.cpp | 2 +- wled00/FX.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 4ab62ecd8c..8ac1ea69a2 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6397,7 +6397,7 @@ void mode_2Dscrollingtext(void) { // Get font dimensions uint8_t letterHeight = fontManager.getFontHeight(); - uint8_t letterWidth = 8; // Max width (not used for layout with variable width) + uint8_t letterWidth = fontManager.getFontWidth(); // for fonts with variable width, this is the max letter width TODO: actually use variable width uint8_t letterSpacing = fontManager.getFontSpacing(); // Calculate rotated dimensions diff --git a/wled00/FX.h b/wled00/FX.h index 92943f7dd5..641e03bf3a 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1082,10 +1082,10 @@ extern const char JSON_palette_names[]; * [6] Last Char * [7] reserved: 0x00 * [8-11] Unicode Offset (32-bit little-endian) - * + * * Followed by: * - Width table (if variable width): [first..last] byte array - * - Bitmap data: bit-packed glyphs + * - Bitmap data: bit-packed glyphs - top left to bottom right, row by row, MSB first, see src/font files for example */ // Abstract byte reader for unified flash/RAM access @@ -1187,6 +1187,7 @@ class FontManager { // Get dimensions (use cached header) inline uint8_t getFontHeight() { return _cachedHeader.height; } + inline uint8_t getFontWidth() { return _cachedHeader.width; } inline uint8_t getFontSpacing() { return _cachedHeader.spacing; } uint8_t getGlyphWidth(uint32_t unicode); From 76a3ea409bc55ceb515fe0f9852efccf4b31c200 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 16 Feb 2026 21:03:48 +0100 Subject: [PATCH 15/33] fix reasonable rabbit suggestions --- wled00/FX.h | 14 +++++------ wled00/FX_2Dfcn.cpp | 57 +++++++-------------------------------------- wled00/util.cpp | 36 ++++++++++++++-------------- 3 files changed, 34 insertions(+), 73 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 641e03bf3a..c6512e5f94 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -811,8 +811,8 @@ class Segment { inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, bool soft = false) {} - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) {} - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) {} + inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) {} + inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) {} inline void wu_pixel(uint32_t x, uint32_t y, CRGB c) {} #endif friend class WS2812FX; @@ -1093,10 +1093,10 @@ class ByteReader { public: virtual uint8_t readByte(size_t offset) const = 0; inline uint32_t readUInt32LE(size_t offset) const { - return readByte(offset) | - (readByte(offset + 1) << 8) | - (readByte(offset + 2) << 16) | - (readByte(offset + 3) << 24); + return (uint32_t)(readByte(offset)) | + ((uint32_t)(readByte(offset + 1)) << 8) | + ((uint32_t)(readByte(offset + 2)) << 16) | + ((uint32_t)(readByte(offset + 3)) << 24); } virtual ~ByteReader() {} }; @@ -1145,7 +1145,7 @@ struct SegmentFontMetadata { // Memory layout for cached fonts: // [SegmentFontMetadata] - 4 bytes // [GlyphEntry array] - 4 bytes each -// [11-byte font header] - for compatibility and to store font info +// [12-byte font header] - for compatibility and to store font info // [Bitmap data] - sequential, matches registry order // Font header structure diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 97e5266c26..4b69181ec7 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -676,38 +676,29 @@ const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, // For cached fonts, use registry lookup if (!_segment->data) return nullptr; - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - // Find glyph in registry uint32_t bitmapOffset = 0; for (uint8_t k = 0; k < meta->glyphCount; k++) { if (registry[k].code == idx) { outWidth = registry[k].width; outHeight = registry[k].height; - // Bitmap starts after: metadata + registry + header const uint8_t* bitmap = _segment->data + sizeof(SegmentFontMetadata) +(meta->glyphCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE + bitmapOffset; return bitmap; } - // Accumulate offset to next glyph uint16_t bits = registry[k].width * registry[k].height; bitmapOffset += (bits + 7) / 8; } - return nullptr; // Glyph not found in cache } void FontManager::scanAvailableFonts() { SegmentFontMetadata* meta = getMetadata(); if (!meta) return; - meta->availableFonts = 0; - - - for (int i = 0; i < 5; i++) { char fileName[16]; strcpy_P(fileName, PSTR("/font")); @@ -754,10 +745,8 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { if (!meta->fontsScanned) { scanAvailableFonts(); } - // Determine which font to actually use (with fallback) uint8_t fontToUse = fontNum; - // Check if requested font is available if (!(meta->availableFonts & (1 << fontNum))) { // Not available - find first available font @@ -768,23 +757,19 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { break; } } - if (fontToUse == 0xFF) { _useFlashFont = true; // no custom fonts available, use flash font updateReader(); return true; } } - // Store the actual font being used _fontNum = fontToUse; - // Check if the ACTUAL font to use has changed if (fontToUse != meta->cachedFontNum) { // Font changed - clear cache but preserve scan results uint8_t avail = meta->availableFonts; uint8_t scanned = meta->fontsScanned; - if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { return false; } @@ -792,14 +777,13 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { meta->availableFonts = avail; meta->cachedFontNum = fontToUse; meta->fontsScanned = scanned; + meta->glyphCount = 0; } - return true; } uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes, uint8_t maxCount) { uint8_t count = 0; - // Pre-add numbers if caching if (_cacheNumbers) { const char* nums = "0123456789:. "; // TOD: use printf @@ -810,7 +794,6 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, } } } - // Parse text size_t i = 0, len = strlen(text); while (i < len && count < maxCount) { @@ -818,12 +801,10 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint32_t unicode = utf8_decode(&text[i], &charLen); if (!charLen || charLen > 4) break; i += charLen; - int32_t idx = getGlyphIndex(unicode, hdr.first, hdr.last, hdr.firstUnicode); if (idx < 0) { idx = getGlyphIndex('?', hdr.first, hdr.last, hdr.firstUnicode); } - if (idx >= 0 && idx < 256) { // Add if unique bool exists = false; @@ -866,15 +847,12 @@ void FontManager::prepare(const char* text) { rebuildCache(text); return; } - SegmentFontMetadata* meta = getMetadata(); - // If glyphCount is 0, cache is empty - rebuild if (meta->glyphCount == 0) { rebuildCache(text); return; } - // Validate header from existing cache if (!checkHeader()) { rebuildCache(text); @@ -886,7 +864,6 @@ void FontManager::prepare(const char* text) { uint8_t neededCount = collectNeededCodes(text, _cachedHeader, neededCodes, 64); GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - for (uint8_t k = 0; k < neededCount; k++) { // Look up in registry bool found = false; @@ -903,7 +880,6 @@ void FontManager::prepare(const char* text) { return; } } - // All glyphs present, cache is valid } @@ -936,7 +912,6 @@ void FontManager::rebuildCache(const char* text) { strcpy_P(fileName, PSTR("/font")); if (i > 0) sprintf(fileName + 5, "%d", i); strcat_P(fileName, PSTR(".wbf")); - file = WLED_FS.open(fileName, "r"); if (file) { _fontNum = i; // Update to fallback font @@ -946,7 +921,6 @@ void FontManager::rebuildCache(const char* text) { } } } - if (!file) return; // Read header from file @@ -965,23 +939,22 @@ void FontManager::rebuildCache(const char* text) { // Collect needed glyphs (no need to sort!) uint8_t neededCodes[64]; uint8_t neededCount = collectNeededCodes(text, fileHdr, neededCodes, 64); - + if (fileHdr.last < fileHdr.first) { file.close(); return; } // Invalid header uint8_t numGlyphs = fileHdr.last - fileHdr.first + 1; uint8_t widthTable[numGlyphs]; - + // Read width table if (fileHdr.flags & 0x01) { - file.read(widthTable, numGlyphs); + if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table incomplete } else { for (uint8_t k = 0; k < numGlyphs; k++) { widthTable[k] = fileHdr.width; } } - // Calculate size: metadata + registry + header + bitmaps uint32_t fileDataStart = FONT_HEADER_SIZE + ((fileHdr.flags & 0x01) ? numGlyphs : 0); size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; // Just the header, no width table needed - + for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; if (code < numGlyphs) { @@ -989,22 +962,20 @@ void FontManager::rebuildCache(const char* text) { ramFontSize += (bits + 7) / 8; } } - // Allocate RAM if (!_segment->allocateData(ramFontSize)) { file.close(); return; } - // Write metadata SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; meta->availableFonts = savedMeta.availableFonts; meta->cachedFontNum = savedMeta.cachedFontNum; meta->fontsScanned = savedMeta.fontsScanned; meta->glyphCount = neededCount; - + uint8_t* ptr = _segment->data + sizeof(SegmentFontMetadata); - + // Write registry (GlyphEntry array) GlyphEntry* registry = (GlyphEntry*)ptr; for (uint8_t k = 0; k < neededCount; k++) { @@ -1014,31 +985,28 @@ void FontManager::rebuildCache(const char* text) { registry[k].height = fileHdr.height; } ptr += neededCount * sizeof(GlyphEntry); - + // Write font header (for compatibility and easy access to spacing/firstUnicode) file.seek(0); // Go back to start of file file.read(ptr, FONT_HEADER_SIZE); // could also write it from fileHdr, but this is simpler ptr += FONT_HEADER_SIZE; - + // Write bitmap data in registry order (no sorting needed) for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; uint16_t bits = widthTable[code] * fileHdr.height; uint16_t bytes = (bits + 7) / 8; - // Calculate file offset uint32_t offset = fileDataStart; for (uint8_t j = 0; j < code; j++) { uint16_t b = widthTable[j] * fileHdr.height; offset += (b + 7) / 8; } - // Read from file file.seek(offset); file.read(ptr, bytes); ptr += bytes; } - file.close(); memcpy(&_cachedHeader, &fileHdr, sizeof(FontHeader)); _headerValid = true; // Mark as valid, we just loaded it directly @@ -1047,24 +1015,18 @@ void FontManager::rebuildCache(const char* text) { void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { if (!_reader || !_fontBase) return; - uint8_t w, h; const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); if (!bitmap || w == 0) return; - CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; - uint16_t bitIndex = 0; for (int row = 0; row < h; row++) { CRGBW c = ColorFromPalette(grad, (row + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); - for (int col = 0; col < w; col++) { uint16_t bytePos = bitIndex >> 3; uint8_t bitPos = 7 - (bitIndex & 7); - // Direct pointer access for speed uint8_t byteVal = _reader->readByte((bitmap - _fontBase) + bytePos); - if ((byteVal >> bitPos) & 1) { int x0, y0; switch (rotate) { @@ -1074,7 +1036,6 @@ void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t case 1: x0 = x + row; y0 = y + (w-1) - col; break; default: x0 = x + col; y0 = y + row; break; } - if (x0 >= 0 && x0 < (int)_segment->vWidth() && y0 >= 0 && y0 < (int)_segment->vHeight()) { _segment->setPixelColorXYRaw(x0, y0, c.color32); diff --git a/wled00/util.cpp b/wled00/util.cpp index 5f57c29f91..20f922ccb5 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -163,36 +163,36 @@ bool isAsterisksOnly(const char* str, byte maxLen) } /* - UTF-8 to unicode onversion: + UTF-8 to unicode conversion: 1 byte: 0xxxxxxx: U+0000 - U+007F 2 bytes: 110xxxxx 10xxxxxx: U+0080 - U+07FF 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx: U+0800 - U+FFFF - 4 bytes: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx: U+10000 - U+10FFFFc + 4 bytes: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx: U+10000 - U+10FFFF */ #define UTF8_LEN(c) ((c) < 0x80 ? 1 : ((c) < 0xE0 ? 2 : ((c) < 0xF0 ? 3 : 4))) // determine UTF-8 sequence length from first byte uint32_t utf8_decode(const char *s, uint8_t *len) { - uint8_t c = (uint8_t)s[0]; - if (c == '\0') { - return 0; - } - uint8_t n = UTF8_LEN(c); // number of bytes in this UTF-8 sequence - uint32_t cp = c; - *len = n; // return byte count to caller - if (n > 1) { - // check if there are enough continuation bytes - if (strlen(s) < n) { + uint8_t c = (uint8_t)s[0]; + if (c == '\0') { + return 0; + } + uint8_t n = UTF8_LEN(c); // number of bytes in this UTF-8 sequence + uint32_t cp = c; + *len = n; // return byte count to caller + if (n > 1) { + // check if there are enough continuation bytes + for (uint8_t i = 1; i < n; i++) { + if ((s[i] & 0xC0) != 0x80) { // not a valid continuation byte (also catches '\0') *len = 1; // invalid sequence, return default char return '?'; } - cp &= (1U << (8 - n)) - 1; // mask off the UTF-8 prefix bits (110, 1110, 11110) - for (uint8_t i = 1; i < n; i++) - cp = (cp << 6) | (s[i] & 0x3F); // Each continuation byte has the form: 10xxxxxx, the lower 6 bits are appended to the code point. - // note: no error checking is done, if the input strint is invalid, it will return invalid code points. could check and return '?' but what to do with a malformed string? } - - return cp; + cp &= (1U << (8 - n)) - 1; // mask off the UTF-8 prefix bits (110, 1110, 11110) + for (uint8_t i = 1; i < n; i++) + cp = (cp << 6) | (s[i] & 0x3F); // Each continuation byte has the form: 10xxxxxx, the lower 6 bits are appended to the code point. + } + return cp; } // Count the number of UTF-8 characters in a string From 3962c6b3c2764b7dbf441a4958611799b620fedc Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Tue, 24 Feb 2026 16:44:50 +0100 Subject: [PATCH 16/33] code cleanup, WIP --- wled00/FX.cpp | 94 +++--- wled00/FX.h | 24 +- wled00/FX_2Dfcn.cpp | 48 ++- wled00/src/font/font_TinyPixie2_6px.h | 146 +++++++++ .../font/{ => old fonts}/console_font_4x6.h | 0 .../src/font/old fonts/console_font_4x6.wbf | Bin 0 -> 297 bytes .../old fonts/console_font_4x6_showcase.png | Bin 0 -> 30967 bytes wled00/src/font/old fonts/console_font_5x12.h | 300 ++++++++++++++++++ .../src/font/old fonts/console_font_5x12.wbf | Bin 0 -> 772 bytes .../old fonts/console_font_5x12_showcase.png | Bin 0 -> 40939 bytes wled00/src/font/old fonts/console_font_5x8.h | 300 ++++++++++++++++++ .../src/font/old fonts/console_font_5x8.wbf | Bin 0 -> 487 bytes .../old fonts/console_font_5x8_showcase.png | Bin 0 -> 33264 bytes wled00/src/font/old fonts/console_font_6x8.h | 300 ++++++++++++++++++ .../src/font/old fonts/console_font_6x8.wbf | Bin 0 -> 582 bytes .../old fonts/console_font_6x8_showcase.png | Bin 0 -> 36868 bytes wled00/src/font/old fonts/console_font_7x9.h | 300 ++++++++++++++++++ .../src/font/old fonts/console_font_7x9.wbf | Bin 0 -> 772 bytes .../old fonts/console_font_7x9_showcase.png | Bin 0 -> 40789 bytes 19 files changed, 1426 insertions(+), 86 deletions(-) create mode 100644 wled00/src/font/font_TinyPixie2_6px.h rename wled00/src/font/{ => old fonts}/console_font_4x6.h (100%) create mode 100644 wled00/src/font/old fonts/console_font_4x6.wbf create mode 100644 wled00/src/font/old fonts/console_font_4x6_showcase.png create mode 100644 wled00/src/font/old fonts/console_font_5x12.h create mode 100644 wled00/src/font/old fonts/console_font_5x12.wbf create mode 100644 wled00/src/font/old fonts/console_font_5x12_showcase.png create mode 100644 wled00/src/font/old fonts/console_font_5x8.h create mode 100644 wled00/src/font/old fonts/console_font_5x8.wbf create mode 100644 wled00/src/font/old fonts/console_font_5x8_showcase.png create mode 100644 wled00/src/font/old fonts/console_font_6x8.h create mode 100644 wled00/src/font/old fonts/console_font_6x8.wbf create mode 100644 wled00/src/font/old fonts/console_font_6x8_showcase.png create mode 100644 wled00/src/font/old fonts/console_font_7x9.h create mode 100644 wled00/src/font/old fonts/console_font_7x9.wbf create mode 100644 wled00/src/font/old fonts/console_font_7x9_showcase.png diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 8ac1ea69a2..33e3f2c482 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6309,16 +6309,6 @@ void mode_2Dscrollingtext(void) { const int cols = SEG_W; const int rows = SEG_H; - // Font selection - const uint8_t* selectedFont = nullptr; - char fileName[32]; - bool useCustomFont = SEGMENT.check2; - uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); - bool init = (SEGENV.call == 0); - - // letters are rotated - const int8_t rotate = map(SEGMENT.custom3, 0, 31, -2, 2); - // generate time/date if there are any # tokens char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'}; size_t result_pos = 0; @@ -6333,10 +6323,13 @@ void mode_2Dscrollingtext(void) { sprintf_P(sec, PSTR(":%02d"), second(localTime)); } + // prepare text string from segment name size_t len = 0; if (SEGMENT.name) len = strlen(SEGMENT.name); // note: SEGMENT.name is limited to WLED_MAX_SEGNAME_LEN - if (len == 0) { // fallback if empty segment name: display date and time + if (len == 0) { + // fallback if empty segment name: display date and time "#MON #DD #YYYY #TIME" sprintf_P(text, PSTR("%s %d, %d %d:%02d%s"), monthShortStr(month(localTime)), day(localTime), year(localTime), AmPmHour, minute(localTime), sec); + fontManager.cacheNumbers(true); // cache all numbers when using clock to avoid frequent re-caching } else { size_t i = 0; while (i < len) { @@ -6353,7 +6346,7 @@ void mode_2Dscrollingtext(void) { token[j] = '\0'; int advance = 5; // number of chars to advance in 'text' after processing the token - // Process token + // process token char temp[32]; if (!strncmp_P(token,PSTR("#DATE"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d.%04d"):PSTR("%d.%d.%d"), day(localTime), month(localTime), year(localTime)); else if (!strncmp_P(token,PSTR("#DDMM"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d") :PSTR("%d.%d"), day(localTime), month(localTime)); @@ -6366,7 +6359,7 @@ void mode_2Dscrollingtext(void) { else if (!strncmp_P(token,PSTR("#YY"),3)) { sprintf (temp, ("%02d") , year(localTime)%100); advance = 3; } else if (!strncmp_P(token,PSTR("#HH"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), AmPmHour); advance = 3; } else if (!strncmp_P(token,PSTR("#MM"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), minute(localTime)); advance = 3; } - else if (!strncmp_P(token,PSTR("#SS"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), second(localTime)); advance = 3; fontManager.setCacheNumbers(true);} // cache all numbers + else if (!strncmp_P(token,PSTR("#SS"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), second(localTime)); advance = 3; } else if (!strncmp_P(token,PSTR("#MON"),4)) { sprintf (temp, ("%s") , monthShortStr(month(localTime))); advance = 4; } else if (!strncmp_P(token,PSTR("#MO"),3)) { sprintf (temp, zero? ("%02d") : ("%d"), month(localTime)); advance = 3; } else if (!strncmp_P(token,PSTR("#DAY"),4)) { sprintf (temp, ("%s") , dayShortStr(weekday(localTime))); advance = 4; } @@ -6379,7 +6372,7 @@ void mode_2Dscrollingtext(void) { strcpy(text + result_pos, temp); result_pos += temp_len; } - + fontManager.cacheNumbers(true); // cache all numbers when using clocks to avoid frequent re-caching i += advance; } else { @@ -6391,25 +6384,23 @@ void mode_2Dscrollingtext(void) { } } + // Font selection + bool useCustomFont = SEGMENT.check2; + uint8_t fontNum = map(SEGMENT.custom2, 0, 255, 0, 4); + + // letters orientation: -2/+2 = upside down, -1 = 90° clockwise, 0 = normal, 1 = 90° counterclockwise + const int8_t rotate = map(SEGMENT.custom3, 0, 31, -2, 2); + const bool isRotated = (rotate == 1 || rotate == -1); // +/- 90° rotated, swap width and height for calculations + // Load the font fontManager.loadFont(fontNum, useCustomFont); // TODO: simplify this code, prepare is not really needed as a separate function. fontManager.prepare(text); // Get font dimensions - uint8_t letterHeight = fontManager.getFontHeight(); - uint8_t letterWidth = fontManager.getFontWidth(); // for fonts with variable width, this is the max letter width TODO: actually use variable width + uint8_t glyphHeight = fontManager.getFontHeight(); + uint8_t fontWidth = fontManager.getFontWidth(); // for fonts with variable width, this is the max letter width uint8_t letterSpacing = fontManager.getFontSpacing(); - // Calculate rotated dimensions - unsigned rotLW, rotLH; - if (rotate == 1 || rotate == -1) { - rotLH = letterWidth; - rotLW = letterHeight; - } else { - rotLW = letterWidth; - rotLH = letterHeight; - } - // Calculate total text width int totalTextWidth = 0; int idx = 0; @@ -6420,33 +6411,33 @@ void mode_2Dscrollingtext(void) { uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - if (rotate == 1 || rotate == -1) { - totalTextWidth += letterHeight; // Fixed dimension when rotated + if (isRotated) { + totalTextWidth += glyphHeight + 1; // use height when rotated, spacing of 1 } else { - uint8_t w = fontManager.getGlyphWidth(unicode); - totalTextWidth += w; + totalTextWidth += fontManager.getGlyphWidth(unicode) + letterSpacing; } if (c < numberOfChars - 1) totalTextWidth += letterSpacing; } + totalTextWidth -= letterSpacing; // remove spacing after last character - // Y offset calculation - int yoffset = map(SEGMENT.intensity, 0, 255, -rows / 2, rows / 2) + (rows - rotLH) / 2; + // y-offset calculation + int yoffset = map(SEGMENT.intensity, 0, 255, -rows / 2, rows / 2); if (totalTextWidth <= cols) { - // scroll vertically + // if text fits matrix width, scroll vertically int speed = map(SEGMENT.speed, 0, 255, 5000, 1000); int frac = strip.now % speed + 1; if (SEGMENT.intensity == 255) { - yoffset = (2 * frac * rows) / speed - rows; + yoffset = (2 * frac * rows)/speed - rows; } else if (SEGMENT.intensity == 0) { - yoffset = rows - (2 * frac * rows) / speed; + yoffset = rows - (2 * frac * rows)/speed; } } - // Animation step + // scroll step (AUX0 is current scrolling offset) if (SEGENV.step < strip.now) { if (totalTextWidth > cols) { - if (SEGMENT.check3) { + if (SEGMENT.check3) { // reverse direction if (SEGENV.aux0 == 0) SEGENV.aux0 = totalTextWidth + cols - 1; else --SEGENV.aux0; } else { @@ -6455,44 +6446,47 @@ void mode_2Dscrollingtext(void) { } else { SEGENV.aux0 = (cols - totalTextWidth) / 2; // Center } - ++SEGENV.aux1 &= 0xFF; + ++SEGENV.aux1 &= 0xFF; // color shift SEGENV.step = strip.now + map(SEGMENT.speed, 0, 255, 250, 50); } - SEGMENT.fade_out(255 - (SEGMENT.custom1 >> 4)); + SEGMENT.fade_out(255 - (SEGMENT.custom1>>4)); // trail uint32_t col1 = SEGMENT.color_from_palette(SEGENV.aux1, false, PALETTE_SOLID_WRAP, 0); uint32_t col2 = BLACK; - if (SEGMENT.check1) { - if (SEGMENT.palette == 0) { + // if gradient is selected and palette is default (0) drawCharacter() uses gradient from SEGCOLOR(0) to SEGCOLOR(2) + // otherwise col2 == BLACK means use currently selected palette for gradient + // if gradient is not selected set both colors the same + if (SEGMENT.check1) { // use gradient + if (SEGMENT.palette == 0) { // use colors for gradient col1 = SEGCOLOR(0); col2 = SEGCOLOR(2); } - } else { - col2 = col1; - } + } else col2 = col1; // force characters to use single color (from palette) // Draw characters idx = 0; - int currentXOffset = 0; + int currentXOffset = 0; // offset of current glyph from text start for (int c = 0; c < numberOfChars; c++) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; uint8_t glyphWidth = fontManager.getGlyphWidth(unicode); - int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; - int advance = (rotate == 1 || rotate == -1) ? letterHeight : glyphWidth; + int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; // AUX0 is scrolling offset + int advance = isRotated ? glyphHeight + 1 : glyphWidth + letterSpacing; // when rotated use spacing of 1 // Skip if off-screen if (drawX + advance < 0) { - currentXOffset += advance + letterSpacing; + currentXOffset += advance; continue; } if (drawX >= cols) break; + unsigned rotHeight = isRotated ? glyphWidth : glyphHeight; // use (variable) glyph-width for height if 90° rotated + int16_t drawY = yoffset + (rows - rotHeight) / 2; // center glyph vertically - fontManager.drawCharacter(unicode, drawX, yoffset, col1, col2, rotate); - currentXOffset += advance + letterSpacing; + fontManager.drawCharacter(unicode, drawX, drawY, col1, col2, rotate); + currentXOffset += advance; } } static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Custom Font,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0"; diff --git a/wled00/FX.h b/wled00/FX.h index c6512e5f94..b73bfc0946 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1148,6 +1148,10 @@ struct SegmentFontMetadata { // [12-byte font header] - for compatibility and to store font info // [Bitmap data] - sequential, matches registry order +static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string length is 64 chars so this is absolute worst case +static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 +static constexpr size_t FONT_NAME_BUFFER_SIZE = 16; // font names is /fontX.wbf + // Font header structure struct FontHeader { uint8_t height; @@ -1172,7 +1176,7 @@ class FontManager { _fontBase(nullptr) {} bool loadFont(uint8_t fontNum, bool useFile); - void setCacheNumbers(bool cache) { _cacheNumbers = cache; } + void cacheNumbers(bool cache) { _cacheNumbers = cache; } void prepare(const char* text); inline void beginFrame() { @@ -1184,13 +1188,13 @@ class FontManager { } } } - + // Get dimensions (use cached header) inline uint8_t getFontHeight() { return _cachedHeader.height; } inline uint8_t getFontWidth() { return _cachedHeader.width; } inline uint8_t getFontSpacing() { return _cachedHeader.spacing; } uint8_t getGlyphWidth(uint32_t unicode); - + // Rendering void drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); @@ -1200,7 +1204,7 @@ class FontManager { uint8_t _fontNum; // Font number (0-4) bool _useFlashFont; // true = flash, false = file bool _cacheNumbers; - + // Cached data for performance (non-static, per-instance) bool _headerValid; FontHeader _cachedHeader; @@ -1208,7 +1212,7 @@ class FontManager { const uint8_t* _fontBase; FlashByteReader _flashReader; RAMByteReader _ramReader; - + // Invalidate cached header (call when font changes) inline void invalidateHeader() { _headerValid = false; @@ -1231,23 +1235,23 @@ class FontManager { _fontBase = nullptr; } } - + // Metadata access (RAM only) SegmentFontMetadata* getMetadata() { return _segment->data ? (SegmentFontMetadata*)_segment->data : nullptr; } - + // Unified operations (work identically for flash and RAM) static bool parseHeader(const ByteReader& reader, FontHeader& hdr); const uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); - + // Glyph index calculation (pure function, inline for speed) static inline int32_t getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode); - + // File font management void scanAvailableFonts(); void rebuildCache(const char* text); - uint8_t collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes, uint8_t maxCount); + uint8_t collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes); }; #endif diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 4b69181ec7..b45282871b 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -583,7 +583,7 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu } #undef WU_WEIGHT -#include "src/font/console_font_4x6.h" +#include "src/font/font_TinyPixie2_6px.h" #include "src/font/console_font_5x8.h" #include "src/font/console_font_5x12.h" #include "src/font/console_font_6x8.h" @@ -699,8 +699,8 @@ void FontManager::scanAvailableFonts() { SegmentFontMetadata* meta = getMetadata(); if (!meta) return; meta->availableFonts = 0; - for (int i = 0; i < 5; i++) { - char fileName[16]; + for (int i = 0; i < MAX_FONTS; i++) { + char fileName[FONT_NAME_BUFFER_SIZE]; strcpy_P(fileName, PSTR("/font")); if (i > 0) sprintf(fileName + 5, "%d", i); strcat_P(fileName, PSTR(".wbf")); @@ -716,7 +716,7 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { _useFlashFont = !useFile; switch (_fontNum) { default: - case 0: _flashFont = console_font_4x6; break; + case 0: _flashFont = font_TinyPixie2_6px; break; case 1: _flashFont = console_font_5x8; break; case 2: _flashFont = console_font_6x8; break; case 3: _flashFont = console_font_7x9; break; @@ -751,7 +751,7 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { if (!(meta->availableFonts & (1 << fontNum))) { // Not available - find first available font fontToUse = 0xFF; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < MAX_FONTS; i++) { if (meta->availableFonts & (1 << i)) { fontToUse = i; break; @@ -782,12 +782,12 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { return true; } -uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes, uint8_t maxCount) { +uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes) { uint8_t count = 0; - // Pre-add numbers if caching + // Pre-add numbers if caching (for clock use without constant re-caching) if (_cacheNumbers) { - const char* nums = "0123456789:. "; // TOD: use printf - for (const char* p = nums; *p && count < maxCount; p++) { + static const char s_nums[] PROGMEM = "0123456789:. "; + for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { int32_t idx = getGlyphIndex(*p, hdr.first, hdr.last, hdr.firstUnicode); if (idx >= 0 && idx < 256) { outCodes[count++] = idx; @@ -796,10 +796,10 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, } // Parse text size_t i = 0, len = strlen(text); - while (i < len && count < maxCount) { + while (i < len && count < MAX_CACHED_GLYPHS) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[i], &charLen); - if (!charLen || charLen > 4) break; + if (!charLen) break; // invalid input, stop processing i += charLen; int32_t idx = getGlyphIndex(unicode, hdr.first, hdr.last, hdr.firstUnicode); if (idx < 0) { @@ -860,8 +860,8 @@ void FontManager::prepare(const char* text) { } // Check if all needed glyphs are present - uint8_t neededCodes[64]; - uint8_t neededCount = collectNeededCodes(text, _cachedHeader, neededCodes, 64); + uint8_t neededCodes[MAX_CACHED_GLYPHS]; + uint8_t neededCount = collectNeededCodes(text, _cachedHeader, neededCodes); GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); for (uint8_t k = 0; k < neededCount; k++) { @@ -893,7 +893,7 @@ void FontManager::rebuildCache(const char* text) { } // Build filename from font number TODO: make file name generation a function - char fileName[16]; + char fileName[FONT_NAME_BUFFER_SIZE]; strcpy_P(fileName, PSTR("/font")); if (_fontNum > 0) sprintf(fileName + 5, "%d", _fontNum); strcat_P(fileName, PSTR(".wbf")); @@ -906,7 +906,7 @@ void FontManager::rebuildCache(const char* text) { if (!file) { SegmentFontMetadata* meta = getMetadata(); if (meta) { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < MAX_FONTS; i++) { if (i == _fontNum) continue; // Already tried this one if (meta->availableFonts & (1 << i)) { strcpy_P(fileName, PSTR("/font")); @@ -936,9 +936,9 @@ void FontManager::rebuildCache(const char* text) { file.read(); // skip byte 7 (reserved) file.read((uint8_t*)&fileHdr.firstUnicode, 4); - // Collect needed glyphs (no need to sort!) - uint8_t neededCodes[64]; - uint8_t neededCount = collectNeededCodes(text, fileHdr, neededCodes, 64); + // Collect needed glyphs + uint8_t neededCodes[MAX_CACHED_GLYPHS]; + uint8_t neededCount = collectNeededCodes(text, fileHdr, neededCodes); if (fileHdr.last < fileHdr.first) { file.close(); return; } // Invalid header uint8_t numGlyphs = fileHdr.last - fileHdr.first + 1; uint8_t widthTable[numGlyphs]; @@ -1025,21 +1025,17 @@ void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t for (int col = 0; col < w; col++) { uint16_t bytePos = bitIndex >> 3; uint8_t bitPos = 7 - (bitIndex & 7); - // Direct pointer access for speed - uint8_t byteVal = _reader->readByte((bitmap - _fontBase) + bytePos); + uint8_t byteVal = _reader->readByte((bitmap - _fontBase) + bytePos); // note: could read only if new byte is needed but this is fast enough and simpler if ((byteVal >> bitPos) & 1) { int x0, y0; switch (rotate) { - case -1: x0 = x + (h-1) - row; y0 = y + col; break; + case -1: x0 = x + row; y0 = y + col; break; // 90° CW + case 1: x0 = x + (h-1) - row; y0 = y + (w-1) - col; break; // 90° CCW case -2: case 2: x0 = x + (w-1) - col; y0 = y + (h-1) - row; break; - case 1: x0 = x + row; y0 = y + (w-1) - col; break; default: x0 = x + col; y0 = y + row; break; } - if (x0 >= 0 && x0 < (int)_segment->vWidth() && - y0 >= 0 && y0 < (int)_segment->vHeight()) { - _segment->setPixelColorXYRaw(x0, y0, c.color32); - } + _segment->setPixelColorXY(x0, y0, c.color32); // bounds checking is done in setPixelColorXY } bitIndex++; } diff --git a/wled00/src/font/font_TinyPixie2_6px.h b/wled00/src/font/font_TinyPixie2_6px.h new file mode 100644 index 0000000000..7c2ca12d88 --- /dev/null +++ b/wled00/src/font/font_TinyPixie2_6px.h @@ -0,0 +1,146 @@ +// TinyPixie2, public domain, source: https://nimblebeastscollective.itch.io/nb-pixel-font-bundle +// ASCII chars 0-31 and 127-255 are not included to save memory + +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 6 + * [2] Fixed/max glyph width: 4 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte + */ + +static const unsigned char font_TinyPixie2_6px[] PROGMEM = { + 0x57, 0x06, 0x04, 0x01, 0x01, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + + // Width table + 0x03, 0x01, 0x03, 0x05, 0x03, 0x05, 0x06, 0x01, 0x02, 0x02, 0x05, 0x03, 0x01, 0x03, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, + 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x05, 0x03, + 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x01, 0x01, 0x03, 0x01, 0x05, 0x03, 0x03, + 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x05, 0x03, 0x03, 0x02, 0x03, 0x01, 0x03, 0x04, + + 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" ", w=3 */ + 0xE8, /* code=33, hex=0x21, ascii="!", w=1 */ + 0xB4, 0x00, 0x00, /* code=34, hex=0x22, ascii=""", w=3 */ + 0x57, 0xD5, 0xF5, 0x00, /* code=35, hex=0x23, ascii="#", w=5 */ + 0x5F, 0x3E, 0x80, /* code=36, hex=0x24, ascii="$", w=3 */ + 0xCE, 0x88, 0xB9, 0x80, /* code=37, hex=0x25, ascii="%", w=5 */ + 0x62, 0x46, 0x66, 0x74, 0x00, /* code=38, hex=0x26, ascii="&", w=6 */ + 0xC0, /* code=39, hex=0x27, ascii="'", w=1 */ + 0x6A, 0x40, /* code=40, hex=0x28, ascii="(", w=2 */ + 0x95, 0x80, /* code=41, hex=0x29, ascii=")", w=2 */ + 0x27, 0xDC, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*", w=5 */ + 0x0B, 0xA0, 0x00, /* code=43, hex=0x2B, ascii="+", w=3 */ + 0x0C, /* code=44, hex=0x2C, ascii=",", w=1 */ + 0x03, 0x80, 0x00, /* code=45, hex=0x2D, ascii="-", w=3 */ + 0x08, /* code=46, hex=0x2E, ascii=".", w=1 */ + 0x25, 0x48, 0x00, /* code=47, hex=0x2F, ascii="/", w=3 */ + 0x56, 0xD4, 0x00, /* code=48, hex=0x30, ascii="0", w=3 */ + 0x59, 0x2E, 0x00, /* code=49, hex=0x31, ascii="1", w=3 */ + 0xC5, 0x4E, 0x00, /* code=50, hex=0x32, ascii="2", w=3 */ + 0xE5, 0x1C, 0x00, /* code=51, hex=0x33, ascii="3", w=3 */ + 0x97, 0x92, 0x00, /* code=52, hex=0x34, ascii="4", w=3 */ + 0xF3, 0x1C, 0x00, /* code=53, hex=0x35, ascii="5", w=3 */ + 0x73, 0xD6, 0x00, /* code=54, hex=0x36, ascii="6", w=3 */ + 0xE5, 0x28, 0x00, /* code=55, hex=0x37, ascii="7", w=3 */ + 0xF7, 0xDE, 0x00, /* code=56, hex=0x38, ascii="8", w=3 */ + 0xD7, 0x9C, 0x00, /* code=57, hex=0x39, ascii="9", w=3 */ + 0x28, /* code=58, hex=0x3A, ascii=":", w=1 */ + 0x2C, /* code=59, hex=0x3B, ascii=";", w=1 */ + 0x2A, 0x22, 0x00, /* code=60, hex=0x3C, ascii="<", w=3 */ + 0x1C, 0x70, 0x00, /* code=61, hex=0x3D, ascii="=", w=3 */ + 0x88, 0xA8, 0x00, /* code=62, hex=0x3E, ascii=">", w=3 */ + 0xC5, 0x04, 0x00, /* code=63, hex=0x3F, ascii="?", w=3 */ + 0x7A, 0x1B, 0x6F, 0x81, 0xE0, /* code=64, hex=0x40, ascii="@", w=6 */ + 0xD6, 0xFA, 0x00, /* code=65, hex=0x41, ascii="A", w=3 */ + 0xD7, 0x5C, 0x00, /* code=66, hex=0x42, ascii="B", w=3 */ + 0x56, 0x54, 0x00, /* code=67, hex=0x43, ascii="C", w=3 */ + 0xD6, 0xDC, 0x00, /* code=68, hex=0x44, ascii="D", w=3 */ + 0xEE, 0xC0, /* code=69, hex=0x45, ascii="E", w=2 */ + 0xEE, 0x80, /* code=70, hex=0x46, ascii="F", w=2 */ + 0x72, 0xD6, 0x00, /* code=71, hex=0x47, ascii="G", w=3 */ + 0xB7, 0xDA, 0x00, /* code=72, hex=0x48, ascii="H", w=3 */ + 0xE9, 0x2E, 0x00, /* code=73, hex=0x49, ascii="I", w=3 */ + 0xD5, 0x60, /* code=74, hex=0x4A, ascii="J", w=2 */ + 0xB7, 0x5A, 0x00, /* code=75, hex=0x4B, ascii="K", w=3 */ + 0xAA, 0xC0, /* code=76, hex=0x4C, ascii="L", w=2 */ + 0x8E, 0xEB, 0x18, 0x80, /* code=77, hex=0x4D, ascii="M", w=5 */ + 0x99, 0xDB, 0x90, /* code=78, hex=0x4E, ascii="N", w=4 */ + 0xF6, 0xDE, 0x00, /* code=79, hex=0x4F, ascii="O", w=3 */ + 0xD6, 0xE8, 0x00, /* code=80, hex=0x50, ascii="P", w=3 */ + 0x56, 0xD6, 0x40, /* code=81, hex=0x51, ascii="Q", w=3 */ + 0xD6, 0xEA, 0x00, /* code=82, hex=0x52, ascii="R", w=3 */ + 0xED, 0xC0, /* code=83, hex=0x53, ascii="S", w=2 */ + 0xE9, 0x24, 0x00, /* code=84, hex=0x54, ascii="T", w=3 */ + 0xB6, 0xDE, 0x00, /* code=85, hex=0x55, ascii="U", w=3 */ + 0xB6, 0xA4, 0x00, /* code=86, hex=0x56, ascii="V", w=3 */ + 0xAD, 0x6A, 0xA5, 0x00, /* code=87, hex=0x57, ascii="W", w=5 */ + 0xB5, 0x5A, 0x00, /* code=88, hex=0x58, ascii="X", w=3 */ + 0xB5, 0x9C, 0x00, /* code=89, hex=0x59, ascii="Y", w=3 */ + 0xE5, 0x4E, 0x00, /* code=90, hex=0x5A, ascii="Z", w=3 */ + 0xEA, 0xC0, /* code=91, hex=0x5B, ascii="[", w=2 */ + 0x91, 0x12, 0x00, /* code=92, hex=0x5C, ascii="\", w=3 */ + 0xD5, 0xC0, /* code=93, hex=0x5D, ascii="]", w=2 */ + 0x22, 0xA2, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^", w=5 */ + 0x00, 0x01, 0xC0, /* code=95, hex=0x5F, ascii="_", w=3 */ + 0xC0, /* code=96, hex=0x60, ascii="`", w=1 */ + 0x19, 0xDE, 0x00, /* code=97, hex=0x61, ascii="a", w=3 */ + 0x9A, 0xDC, 0x00, /* code=98, hex=0x62, ascii="b", w=3 */ + 0x0E, 0x46, 0x00, /* code=99, hex=0x63, ascii="c", w=3 */ + 0x2E, 0xD6, 0x00, /* code=100, hex=0x64, ascii="d", w=3 */ + 0x0E, 0xE6, 0x00, /* code=101, hex=0x65, ascii="e", w=3 */ + 0x6E, 0x80, /* code=102, hex=0x66, ascii="f", w=2 */ + 0x0E, 0xB3, 0x80, /* code=103, hex=0x67, ascii="g", w=3 */ + 0x9A, 0xDA, 0x00, /* code=104, hex=0x68, ascii="h", w=3 */ + 0xB8, /* code=105, hex=0x69, ascii="i", w=1 */ + 0xBC, /* code=106, hex=0x6A, ascii="j", w=1 */ + 0x97, 0x6A, 0x00, /* code=107, hex=0x6B, ascii="k", w=3 */ + 0xF8, /* code=108, hex=0x6C, ascii="l", w=1 */ + 0x07, 0xAB, 0x5A, 0x80, /* code=109, hex=0x6D, ascii="m", w=5 */ + 0x1A, 0xDA, 0x00, /* code=110, hex=0x6E, ascii="n", w=3 */ + 0x0A, 0xD4, 0x00, /* code=111, hex=0x6F, ascii="o", w=3 */ + 0x1A, 0xDD, 0x00, /* code=112, hex=0x70, ascii="p", w=3 */ + 0x0A, 0xD6, 0x40, /* code=113, hex=0x71, ascii="q", w=3 */ + 0x3A, 0x80, /* code=114, hex=0x72, ascii="r", w=2 */ + 0x39, 0xC0, /* code=115, hex=0x73, ascii="s", w=2 */ + 0xBA, 0xC0, /* code=116, hex=0x74, ascii="t", w=2 */ + 0x16, 0xD6, 0x00, /* code=117, hex=0x75, ascii="u", w=3 */ + 0x16, 0xD4, 0x00, /* code=118, hex=0x76, ascii="v", w=3 */ + 0x04, 0x6B, 0x55, 0x00, /* code=119, hex=0x77, ascii="w", w=5 */ + 0x15, 0x2A, 0x00, /* code=120, hex=0x78, ascii="x", w=3 */ + 0x15, 0x9C, 0x00, /* code=121, hex=0x79, ascii="y", w=3 */ + 0x36, 0xC0, /* code=122, hex=0x7A, ascii="z", w=2 */ + 0x6B, 0x26, 0x00, /* code=123, hex=0x7B, ascii="{", w=3 */ + 0xFC, /* code=124, hex=0x7C, ascii="|", w=1 */ + 0xC9, 0xAC, 0x00, /* code=125, hex=0x7D, ascii="}", w=3 */ + 0x00, 0x5A, 0x00, /* code=126, hex=0x7E, ascii="~", w=4 */ +}; \ No newline at end of file diff --git a/wled00/src/font/console_font_4x6.h b/wled00/src/font/old fonts/console_font_4x6.h similarity index 100% rename from wled00/src/font/console_font_4x6.h rename to wled00/src/font/old fonts/console_font_4x6.h diff --git a/wled00/src/font/old fonts/console_font_4x6.wbf b/wled00/src/font/old fonts/console_font_4x6.wbf new file mode 100644 index 0000000000000000000000000000000000000000..db5f181ac851f85bb0d8a256c3e33000282b6df2 GIT binary patch literal 297 zcmXYsu};J=5JZO)q9uuRqTMt0)xId{!^t18I{^EIq}mR>q_fe{>Uc`Wxmw3$3(YM#NA5zP zy}7woP`x(8NVL7H+qjg}1z#ksS=T&t;$`E-XniCp9D>G;qp%Yyd2rE}!rhz}Ln10d za%XWYhGwfdq;RSxlic6@=V?c;p(J#^?mfPJvk-af`U~=a ZHXRlZQ3xR_ZVa)Qd^`EwpW5^Z`~nn-LahJ* literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_4x6_showcase.png b/wled00/src/font/old fonts/console_font_4x6_showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..5f27a069d63250241c886edf1a567af729d0b365 GIT binary patch literal 30967 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

Zw0WJM1WniUz& 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 literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_5x8.h b/wled00/src/font/old fonts/console_font_5x8.h new file mode 100644 index 0000000000..f5404eca27 --- /dev/null +++ b/wled00/src/font/old fonts/console_font_5x8.h @@ -0,0 +1,300 @@ +// code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), +// which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts + +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed/max glyph width: 5 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte + */ + +static const unsigned char console_font_5x8[] PROGMEM = { + 0x57, 0x08, 0x05, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x00, 0x1D, 0x5F, 0xED, 0xC0, // /* code=1, hex=0x01, ascii="^A" */ + // 0x00, 0x1D, 0x5F, 0xFD, 0xC0, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0x15, 0xFF, 0xB8, 0x80, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x08, 0xEF, 0xB8, 0x80, // /* code=4, hex=0x04, ascii="^D" */ + // 0x00, 0x1D, 0x5F, 0x90, 0x80, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x08, 0xEF, 0xD4, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x47, 0x10, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0x07, 0xFF, 0xB8, 0xEF, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x0E, 0x36, 0xD1, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x00, 0x08, 0xA2, 0x38, 0x80, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x08, 0xA4, 0x62, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x0E, 0x95, 0xEA, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x00, 0x00, 0x45, 0x10, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x10, 0xC7, 0x31, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x04, 0x67, 0x18, 0x40, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x00, 0x08, 0xE2, 0x38, 0x80, // /* code=18, hex=0x12, ascii="^R" */ + // 0x00, 0x14, 0xA5, 0x01, 0x40, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x1F, 0xAD, 0x29, 0x4A, // /* code=20, hex=0x14, ascii="^T" */ + // 0x00, 0x06, 0xC9, 0x24, 0xD8, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x7F, 0xE0, // /* code=22, hex=0x16, ascii="^V" */ + // 0x00, 0x08, 0xE2, 0x38, 0x8E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x08, 0xE2, 0x10, 0x80, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x08, 0x42, 0x38, 0x80, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x2F, 0x88, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x8F, 0xA0, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x08, 0x7C, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0xAF, 0xA8, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x02, 0x3B, 0xE0, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x0F, 0xB8, 0x80, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x08, 0x42, 0x00, 0x80, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0x14, 0xA0, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0x15, 0xF5, 0x7D, 0x40, /* code=35, hex=0x23, ascii="#" */ + 0x00, 0x08, 0x64, 0x19, 0x84, /* code=36, hex=0x24, ascii="$" */ + 0x02, 0x2A, 0xA3, 0x36, 0x40, /* code=37, hex=0x25, ascii="%" */ + 0x00, 0x0C, 0x86, 0xC9, 0xA0, /* code=38, hex=0x26, ascii="&" */ + 0x01, 0x08, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x08, 0x84, 0x20, 0x80, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x10, 0x42, 0x11, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x14, 0x47, 0x11, 0x40, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x47, 0x10, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x88, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x01, 0xE0, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x80, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x04, 0x42, 0x21, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x08, 0xC2, 0x10, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x19, 0x22, 0x23, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x38, 0x26, 0x0B, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x04, 0x65, 0x78, 0x40, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0x3D, 0x0E, 0x0B, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x19, 0x0E, 0x49, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0x3C, 0x22, 0x21, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x19, 0x26, 0x49, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x19, 0x27, 0x09, 0x80, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0x02, 0x00, 0x80, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0x02, 0x00, 0x88, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x04, 0x44, 0x10, 0x40, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0xE0, 0x38, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x10, 0x41, 0x11, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x18, 0x26, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x1D, 0x1B, 0x41, 0xC0, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x19, 0x2F, 0x4A, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0x39, 0x2E, 0x4B, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x1D, 0x08, 0x41, 0xC0, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0x39, 0x29, 0x4B, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0x3D, 0x0E, 0x43, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0x3D, 0x0E, 0x42, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x19, 0x28, 0x49, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0x25, 0x2F, 0x4A, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x1C, 0x42, 0x11, 0xC0, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x04, 0x29, 0x49, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0x25, 0x4C, 0x52, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0x21, 0x08, 0x43, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x00, 0x25, 0xE9, 0x4A, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0x25, 0xAB, 0x4A, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x19, 0x29, 0x49, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0x39, 0x2E, 0x42, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x19, 0x29, 0x49, 0x82, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0x39, 0x2E, 0x4A, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x1D, 0x06, 0x0B, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0x3E, 0x42, 0x10, 0x80, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0x25, 0x29, 0x49, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x00, 0x25, 0x29, 0x31, 0x80, /* code=86, hex=0x56, ascii="V" */ + 0x00, 0x23, 0x5A, 0xA9, 0x40, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0x25, 0x26, 0x2A, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0x14, 0xA5, 0x10, 0x80, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0x3C, 0x44, 0x43, 0xC0, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x18, 0x84, 0x21, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0x10, 0x82, 0x10, 0x40, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x18, 0x42, 0x11, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x08, 0xA0, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x1F, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x10, 0x40, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0xC1, 0x39, 0x40, /* code=97, hex=0x61, ascii="a" */ + 0x04, 0x21, 0xC9, 0x4B, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x64, 0x20, 0xC0, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x04, 0xE9, 0x49, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0xCF, 0x41, 0xC0, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x0C, 0x8E, 0x21, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0xE9, 0x38, 0x4C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0x21, 0xC9, 0x4A, 0x40, /* code=104, hex=0x68, ascii="h" */ + 0x01, 0x00, 0xC2, 0x11, 0xC0, /* code=105, hex=0x69, ascii="i" */ + 0x00, 0x80, 0x21, 0x08, 0x4C, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0x21, 0x4C, 0x52, 0x40, /* code=107, hex=0x6B, ascii="k" */ + 0x03, 0x08, 0x42, 0x11, 0xC0, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x01, 0x2F, 0x4A, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x01, 0xC9, 0x4A, 0x40, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0xC9, 0x49, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x01, 0xC9, 0x4B, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0xE9, 0x49, 0xC2, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0xA6, 0x21, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0xEC, 0x1B, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x11, 0xE4, 0x20, 0xC0, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x01, 0x29, 0x49, 0xC0, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x01, 0x29, 0x31, 0x80, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x01, 0x29, 0x7A, 0x40, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x01, 0x26, 0x32, 0x40, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x01, 0x29, 0x38, 0x4C, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x01, 0xE2, 0x23, 0xC0, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x88, 0x84, 0x10, 0x40, /* code=123, hex=0x7B, ascii="{" */ + 0x01, 0x08, 0x42, 0x10, 0x80, /* code=124, hex=0x7C, ascii="|" */ + 0x02, 0x08, 0x21, 0x11, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x00, 0xAA, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x45, 0x47, 0xE0, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x1D, 0x08, 0x41, 0xC4, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x02, 0x81, 0x29, 0x49, 0xC0, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x11, 0x00, 0xCF, 0x41, 0xC0, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x22, 0x81, 0x82, 0x51, 0x40, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x02, 0x81, 0x82, 0x32, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x41, 0x01, 0x82, 0x32, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x01, 0x01, 0x82, 0x32, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x64, 0x20, 0xC4, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x22, 0x80, 0xCF, 0x41, 0xC0, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x02, 0x80, 0xCF, 0x41, 0xC0, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x41, 0x00, 0xCF, 0x41, 0xC0, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x02, 0x80, 0xC2, 0x11, 0xC0, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x22, 0x80, 0xC2, 0x11, 0xC0, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x41, 0x00, 0xC2, 0x11, 0xC0, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xA0, 0x19, 0x2F, 0x4A, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x20, 0x19, 0x2F, 0x4A, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x11, 0x3D, 0x0E, 0x43, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x01, 0xB7, 0xF2, 0xE0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x1D, 0x4F, 0x52, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x22, 0x80, 0xC9, 0x49, 0x80, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x41, 0x00, 0xC9, 0x49, 0x80, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x22, 0x81, 0x29, 0x49, 0xC0, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x41, 0x01, 0x29, 0x49, 0xC0, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x02, 0x81, 0x29, 0x38, 0x4C, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x02, 0x80, 0xC9, 0x49, 0x80, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x50, 0x25, 0x29, 0x49, 0x80, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x08, 0xE8, 0x41, 0xC4, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x01, 0x94, 0x8E, 0x23, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x06, 0xD4, 0xA2, 0x38, 0x80, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x06, 0x29, 0x6F, 0xCA, 0x20, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x01, 0x90, 0x8F, 0x21, 0x10, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x22, 0x01, 0x82, 0x32, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x11, 0x00, 0xC2, 0x11, 0xC0, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x11, 0x00, 0xC9, 0x49, 0x80, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x11, 0x01, 0x29, 0x49, 0xC0, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x55, 0x01, 0xC9, 0x4A, 0x40, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x55, 0x25, 0xAD, 0x5A, 0x40, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x01, 0x14, 0x60, 0x38, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x01, 0x14, 0x40, 0x38, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x01, 0x00, 0x44, 0x49, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x00, 0x7E, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x00, 0x7C, 0x20, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x04, 0x25, 0x45, 0xC4, 0xE0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x04, 0x65, 0x44, 0xCC, 0xE1, // /* code=172, hex=0xAC, ascii="!," */ + // 0x01, 0x00, 0x42, 0x38, 0x80, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0x05, 0x51, 0x40, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x00, 0x0A, 0x2A, 0x80, // /* code=175, hex=0xAF, ascii="!/" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=176, hex=0xB0, ascii="!0" */ + // 0xEA, 0xAE, 0xAE, 0xAA, 0xEA, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xDB, 0xB6, 0xED, 0xBB, 0x6E, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x21, 0x08, 0x42, 0x10, 0x84, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x21, 0x09, 0xC2, 0x10, 0x84, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x21, 0x38, 0x4E, 0x10, 0x84, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x52, 0x95, 0xA5, 0x29, 0x4A, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x01, 0xE5, 0x29, 0x4A, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x38, 0x4E, 0x10, 0x84, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x52, 0xB4, 0x2D, 0x29, 0x4A, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x52, 0x94, 0xA5, 0x29, 0x4A, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x3C, 0x2D, 0x29, 0x4A, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x52, 0xB4, 0x2F, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x52, 0x95, 0xE0, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x21, 0x38, 0x4E, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x01, 0xC2, 0x10, 0x84, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x21, 0x08, 0x70, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x21, 0x09, 0xF0, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x01, 0xF2, 0x10, 0x84, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x21, 0x08, 0x72, 0x10, 0x84, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x01, 0xF0, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x21, 0x09, 0xF2, 0x10, 0x84, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x21, 0x0E, 0x43, 0x90, 0x84, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x52, 0x94, 0xB5, 0x29, 0x4A, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x52, 0x96, 0x87, 0x80, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x1E, 0x85, 0xA9, 0x4A, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x52, 0xB6, 0x0F, 0x80, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x3E, 0x0D, 0xA9, 0x4A, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x52, 0x96, 0x85, 0xA9, 0x4A, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x3E, 0x0F, 0x80, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x52, 0xB6, 0x0D, 0xA9, 0x4A, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x21, 0x3E, 0x0F, 0x80, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x52, 0x95, 0xF0, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x3E, 0x0F, 0x90, 0x84, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x01, 0xF5, 0x29, 0x4A, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x52, 0x94, 0xF0, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x21, 0x0E, 0x43, 0x80, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x0E, 0x43, 0x90, 0x84, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0xF5, 0x29, 0x4A, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x52, 0x95, 0xF5, 0x29, 0x4A, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x21, 0x3E, 0x4F, 0x90, 0x84, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x21, 0x09, 0xC0, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x72, 0x10, 0x84, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x0F, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE7, 0x39, 0xCE, 0x73, 0x9C, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x18, 0xC6, 0x31, 0x8C, 0x63, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xF0, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x00, 0xD9, 0x49, 0xA0, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x03, 0x25, 0xE9, 0x4B, 0x90, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x03, 0x90, 0x84, 0x21, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x1C, 0xA5, 0x29, 0x40, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x07, 0xD2, 0x44, 0x47, 0xE0, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x1F, 0x29, 0x49, 0x80, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x01, 0x29, 0x4B, 0xB0, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x04, 0xD4, 0x42, 0x10, 0x80, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x01, 0x08, 0xE8, 0xB8, 0x84, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x1D, 0x1F, 0xC5, 0xC0, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x1D, 0x18, 0xAB, 0x60, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x64, 0x10, 0xC9, 0x49, 0x80, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0xEA, 0xD5, 0xC0, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x02, 0xEA, 0xA6, 0xC0, // /* code=237, hex=0xED, ascii="!m" */ + // 0x01, 0x90, 0xE4, 0x20, 0xC0, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x03, 0x25, 0x29, 0x4A, 0x40, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0x3C, 0x0F, 0x03, 0xC0, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x09, 0xF2, 0x03, 0xE0, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x02, 0x08, 0x22, 0x23, 0xC0, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x88, 0x82, 0x09, 0xC0, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x06, 0x52, 0x10, 0x84, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x21, 0x08, 0x4A, 0x60, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x18, 0x0F, 0x01, 0x80, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x15, 0x40, 0x2A, 0x80, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x08, 0xA2, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0xC6, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x40, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x06, 0x22, 0x51, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x03, 0x14, 0xA0, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x03, 0x04, 0x47, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x00, 0xE7, 0x38, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ +}; diff --git a/wled00/src/font/old fonts/console_font_5x8.wbf b/wled00/src/font/old fonts/console_font_5x8.wbf new file mode 100644 index 0000000000000000000000000000000000000000..a4542b684476255418ad0631f7b9a24ea1108158 GIT binary patch literal 487 zcmYL_!Ab&A6o&t67B>=^0Rsn<9A&1)g;9%eK;t?IGU}>L(AwT1g5nYquA)Z}qM&+- z$=$4a1&KC7+xGo;Hr>VH+;h(V-|yUWxh_z<#s85JG)i+8wtsIFWu_#e~XRFD}`>6nNwu9Q#W%y zGiPs81379LX2|y~1uWZu)#F2DUjWrgFM)F~R0vxmjjH4|448F`rwKzutNl2EXGV4+ zJ3-zMc;hn#S8~K#vEjWlWN2Z_D1!KoeymkDNOcks*UMzVp+@84l?uP9PT>-%@|7c-3(k?9T^M5EBUE`eB^4$$608V>Pm&fMxGGldG2C>h1Qz7euH=<`YtrBf z11{JFQi6+g^hia#0A7str=nqh(^LdB6^2g)*9yWvVhHFgz8VQ;Q%ecSJ#y0J*WnHL E13zD2n*aa+ literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_5x8_showcase.png b/wled00/src/font/old fonts/console_font_5x8_showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..61da20729ba9442d34a69df6d75d718f1e252f8c GIT binary patch literal 33264 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 ftU&|1a>aK|eLPVTCLUa literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_6x8.h b/wled00/src/font/old fonts/console_font_6x8.h new file mode 100644 index 0000000000..47be78bb5f --- /dev/null +++ b/wled00/src/font/old fonts/console_font_6x8.h @@ -0,0 +1,300 @@ +// code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), +// which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts + +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 8 + * [2] Fixed/max glyph width: 6 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte + */ + +static const unsigned char console_font_6x8[] PROGMEM = { + 0x57, 0x08, 0x06, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x39, 0x16, 0xD1, 0x55, 0x13, 0x80, // /* code=1, hex=0x01, ascii="^A" */ + // 0x39, 0xF5, 0x5F, 0x45, 0xF3, 0x80, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xA7, 0xDF, 0x7C, 0xE1, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x43, 0x9F, 0x7C, 0xE1, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x10, 0xE3, 0x84, 0x7D, 0xF1, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x00, 0x43, 0x9F, 0x7C, 0x43, 0x80, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0xF3, 0xCF, 0xFF, 0xFF, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x07, 0x92, 0x49, 0xE0, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xF8, 0x6D, 0xB6, 0x1F, 0xFF, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x00, 0x70, 0xCD, 0x49, 0x23, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x39, 0x14, 0x4E, 0x10, 0xE1, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x10, 0x61, 0x44, 0x31, 0xC6, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x0C, 0xD2, 0xCD, 0x2D, 0xB6, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x01, 0x53, 0x9B, 0x39, 0x50, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x20, 0xC3, 0x8F, 0x38, 0xC2, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x08, 0x63, 0x9E, 0x38, 0x60, 0x80, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x28, 0xA2, 0x8A, 0x28, 0x02, 0x80, // /* code=19, hex=0x13, ascii="^S" */ + // 0x3D, 0x55, 0x4D, 0x14, 0x51, 0x40, // /* code=20, hex=0x14, ascii="^T" */ + // 0x39, 0x13, 0x0A, 0x19, 0x13, 0x80, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x01, 0xE7, 0x80, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0xE7, 0xC4, 0x7C, 0xE1, 0x0E, // /* code=23, hex=0x17, ascii="^W" */ + // 0x10, 0xE7, 0xC4, 0x10, 0x41, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x10, 0x41, 0x04, 0x7C, 0xE1, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x41, 0x9F, 0x18, 0x40, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x43, 0x1F, 0x30, 0x40, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x10, 0x41, 0x07, 0xC0, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0xA2, 0x9F, 0x28, 0xA0, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x10, 0x43, 0x8E, 0x7D, 0xF0, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x7D, 0xF3, 0x8E, 0x10, 0x40, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x10, 0xE3, 0x84, 0x10, 0x01, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x6D, 0xB4, 0x80, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xA7, 0xCA, 0x29, 0xF2, 0x80, /* code=35, hex=0x23, ascii="#" */ + 0x20, 0xE4, 0x0C, 0x09, 0xC1, 0x00, /* code=36, hex=0x24, ascii="$" */ + 0x65, 0x90, 0x84, 0x21, 0x34, 0xC0, /* code=37, hex=0x25, ascii="%" */ + 0x21, 0x45, 0x08, 0x55, 0x23, 0x40, /* code=38, hex=0x26, ascii="&" */ + 0x30, 0xC2, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x10, 0x82, 0x08, 0x20, 0x81, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x20, 0x41, 0x04, 0x10, 0x42, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0xA3, 0x9F, 0x38, 0xA0, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x41, 0x1F, 0x10, 0x40, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x08, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x10, 0x84, 0x21, 0x00, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x39, 0x14, 0xD5, 0x65, 0x13, 0x80, /* code=48, hex=0x30, ascii="0" */ + 0x10, 0xC1, 0x04, 0x10, 0x43, 0x80, /* code=49, hex=0x31, ascii="1" */ + 0x39, 0x10, 0x46, 0x21, 0x07, 0xC0, /* code=50, hex=0x32, ascii="2" */ + 0x39, 0x10, 0x4E, 0x05, 0x13, 0x80, /* code=51, hex=0x33, ascii="3" */ + 0x08, 0x62, 0x92, 0x7C, 0x20, 0x80, /* code=52, hex=0x34, ascii="4" */ + 0x7D, 0x04, 0x1E, 0x05, 0x13, 0x80, /* code=53, hex=0x35, ascii="5" */ + 0x18, 0x84, 0x1E, 0x45, 0x13, 0x80, /* code=54, hex=0x36, ascii="6" */ + 0x7C, 0x10, 0x84, 0x20, 0x82, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x39, 0x14, 0x4E, 0x45, 0x13, 0x80, /* code=56, hex=0x38, ascii="8" */ + 0x39, 0x14, 0x4F, 0x04, 0x23, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x03, 0x0C, 0x00, 0xC3, 0x08, /* code=59, hex=0x3B, ascii=";" */ + 0x08, 0x42, 0x10, 0x20, 0x40, 0x80, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x20, 0x40, 0x81, 0x08, 0x42, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x39, 0x10, 0x46, 0x10, 0x01, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x39, 0x15, 0xD5, 0x5D, 0x03, 0x80, /* code=64, hex=0x40, ascii="@" */ + 0x39, 0x14, 0x51, 0x7D, 0x14, 0x40, /* code=65, hex=0x41, ascii="A" */ + 0x79, 0x14, 0x5E, 0x45, 0x17, 0x80, /* code=66, hex=0x42, ascii="B" */ + 0x39, 0x14, 0x10, 0x41, 0x13, 0x80, /* code=67, hex=0x43, ascii="C" */ + 0x79, 0x14, 0x51, 0x45, 0x17, 0x80, /* code=68, hex=0x44, ascii="D" */ + 0x7D, 0x04, 0x1E, 0x41, 0x07, 0xC0, /* code=69, hex=0x45, ascii="E" */ + 0x7D, 0x04, 0x1E, 0x41, 0x04, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x39, 0x14, 0x17, 0x45, 0x13, 0xC0, /* code=71, hex=0x47, ascii="G" */ + 0x45, 0x14, 0x5F, 0x45, 0x14, 0x40, /* code=72, hex=0x48, ascii="H" */ + 0x38, 0x41, 0x04, 0x10, 0x43, 0x80, /* code=73, hex=0x49, ascii="I" */ + 0x04, 0x10, 0x41, 0x45, 0x13, 0x80, /* code=74, hex=0x4A, ascii="J" */ + 0x45, 0x25, 0x18, 0x51, 0x24, 0x40, /* code=75, hex=0x4B, ascii="K" */ + 0x41, 0x04, 0x10, 0x41, 0x07, 0xC0, /* code=76, hex=0x4C, ascii="L" */ + 0x45, 0xB5, 0x51, 0x45, 0x14, 0x40, /* code=77, hex=0x4D, ascii="M" */ + 0x45, 0x95, 0x53, 0x45, 0x14, 0x40, /* code=78, hex=0x4E, ascii="N" */ + 0x39, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=79, hex=0x4F, ascii="O" */ + 0x79, 0x14, 0x5E, 0x41, 0x04, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x39, 0x14, 0x51, 0x55, 0x23, 0x40, /* code=81, hex=0x51, ascii="Q" */ + 0x79, 0x14, 0x5E, 0x49, 0x14, 0x40, /* code=82, hex=0x52, ascii="R" */ + 0x39, 0x14, 0x0E, 0x05, 0x13, 0x80, /* code=83, hex=0x53, ascii="S" */ + 0x7C, 0x41, 0x04, 0x10, 0x41, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x45, 0x14, 0x51, 0x45, 0x13, 0x80, /* code=85, hex=0x55, ascii="U" */ + 0x45, 0x14, 0x51, 0x44, 0xA1, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x45, 0x15, 0x55, 0x55, 0x52, 0x80, /* code=87, hex=0x57, ascii="W" */ + 0x45, 0x12, 0x84, 0x29, 0x14, 0x40, /* code=88, hex=0x58, ascii="X" */ + 0x45, 0x14, 0x4A, 0x10, 0x41, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x78, 0x21, 0x08, 0x41, 0x07, 0x80, /* code=90, hex=0x5A, ascii="Z" */ + 0x38, 0x82, 0x08, 0x20, 0x83, 0x80, /* code=91, hex=0x5B, ascii="[" */ + 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x38, 0x20, 0x82, 0x08, 0x23, 0x80, /* code=93, hex=0x5D, ascii="]" */ + 0x10, 0xA4, 0x40, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, /* code=95, hex=0x5F, ascii="_" */ + 0x30, 0xC1, 0x00, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x03, 0x81, 0x3D, 0x13, 0xC0, /* code=97, hex=0x61, ascii="a" */ + 0x41, 0x07, 0x91, 0x45, 0x17, 0x80, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x03, 0x91, 0x41, 0x13, 0x80, /* code=99, hex=0x63, ascii="c" */ + 0x04, 0x13, 0xD1, 0x45, 0x13, 0xC0, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x03, 0x91, 0x79, 0x03, 0x80, /* code=101, hex=0x65, ascii="e" */ + 0x18, 0x82, 0x1E, 0x20, 0x82, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x03, 0xD1, 0x44, 0xF0, 0x4E, /* code=103, hex=0x67, ascii="g" */ + 0x41, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=104, hex=0x68, ascii="h" */ + 0x10, 0x01, 0x04, 0x10, 0x41, 0x80, /* code=105, hex=0x69, ascii="i" */ + 0x08, 0x01, 0x82, 0x08, 0x24, 0x8C, /* code=106, hex=0x6A, ascii="j" */ + 0x41, 0x04, 0x94, 0x61, 0x44, 0x80, /* code=107, hex=0x6B, ascii="k" */ + 0x10, 0x41, 0x04, 0x10, 0x41, 0x80, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x06, 0x95, 0x55, 0x14, 0x40, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x07, 0x12, 0x49, 0x24, 0x80, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x03, 0x91, 0x45, 0x13, 0x80, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x07, 0x91, 0x45, 0x17, 0x90, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x03, 0xD1, 0x45, 0x13, 0xC1, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x05, 0x89, 0x20, 0x87, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x03, 0x90, 0x38, 0x13, 0x80, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x87, 0x88, 0x20, 0xA1, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x04, 0x92, 0x49, 0x62, 0x80, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x04, 0x51, 0x44, 0xA1, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x04, 0x51, 0x55, 0xF2, 0x80, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x04, 0x92, 0x31, 0x24, 0x80, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x04, 0x92, 0x48, 0xE1, 0x18, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x07, 0x82, 0x31, 0x07, 0x80, /* code=122, hex=0x7A, ascii="z" */ + 0x18, 0x82, 0x18, 0x20, 0x81, 0x80, /* code=123, hex=0x7B, ascii="{" */ + 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x30, 0x20, 0x83, 0x08, 0x23, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x10, 0xE6, 0xD1, 0x45, 0xF0, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x39, 0x14, 0x10, 0x44, 0xE1, 0x0C, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x48, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x38, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x28, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x30, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x38, 0xA3, 0x81, 0x3D, 0x13, 0xC0, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0xE4, 0x50, 0x44, 0xE1, 0x0C, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x38, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x28, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x30, 0x03, 0x91, 0x79, 0x03, 0x80, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x28, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0xA0, 0x04, 0x10, 0x41, 0x80, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x20, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0x28, 0x01, 0x0A, 0x45, 0xF4, 0x40, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0xA3, 0x9B, 0x45, 0xF4, 0x40, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x0C, 0x07, 0xD0, 0x79, 0x07, 0xC0, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x07, 0x85, 0x7D, 0x43, 0xC0, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x3D, 0x45, 0x1F, 0x51, 0x45, 0xC0, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x38, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x28, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x60, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x38, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x60, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x28, 0x04, 0x92, 0x48, 0xE1, 0x18, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x48, 0xC4, 0x92, 0x49, 0x23, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x28, 0x04, 0x92, 0x49, 0x23, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x00, 0x43, 0x90, 0x40, 0xE1, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x18, 0x92, 0x1E, 0x20, 0x95, 0xC0, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x44, 0xA1, 0x1F, 0x11, 0xF1, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0x61, 0x45, 0x1A, 0x5D, 0x24, 0x80, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x08, 0x51, 0x0E, 0x10, 0x45, 0x08, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x18, 0x03, 0x81, 0x3D, 0x13, 0xC0, // /* code=160, hex=0xA0, ascii="! " */ + // 0x18, 0x01, 0x04, 0x10, 0x41, 0x80, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x18, 0x03, 0x12, 0x49, 0x23, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x18, 0x04, 0x92, 0x49, 0x62, 0x80, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x29, 0x40, 0x1C, 0x49, 0x24, 0x80, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x29, 0x40, 0x12, 0x69, 0x64, 0x80, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x13, 0xD1, 0x3C, 0x03, 0xC0, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x31, 0x24, 0x92, 0x30, 0x07, 0x80, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x10, 0x01, 0x0C, 0x41, 0x13, 0x80, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x07, 0xD0, 0x41, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x0F, 0xC1, 0x04, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x41, 0x25, 0x0E, 0x44, 0x21, 0xC0, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x41, 0x25, 0x0B, 0x54, 0x70, 0x40, // /* code=172, hex=0xAC, ascii="!," */ + // 0x10, 0x01, 0x04, 0x38, 0xE1, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x02, 0x52, 0x24, 0x00, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x04, 0x89, 0x48, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x0A, 0x80, 0x54, 0x0A, 0x80, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x56, 0xA5, 0x6A, 0x56, 0xA5, 0x6A, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAB, 0xF5, 0x7F, 0xAB, 0xF5, 0x7F, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x41, 0x3C, 0x10, 0x41, 0x04, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x13, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x51, 0x45, 0x34, 0x51, 0x45, 0x14, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x3C, 0x51, 0x45, 0x14, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x03, 0xC1, 0x3C, 0x10, 0x41, 0x04, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x53, 0x41, 0x34, 0x51, 0x45, 0x14, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x03, 0xC1, 0x34, 0x51, 0x45, 0x14, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x53, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x51, 0x45, 0x3C, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x13, 0xC1, 0x3C, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x3C, 0x10, 0x41, 0x04, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x41, 0x07, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x41, 0x3F, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x3F, 0x10, 0x41, 0x04, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x41, 0x07, 0x10, 0x41, 0x04, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x41, 0x3F, 0x10, 0x41, 0x04, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x51, 0x45, 0x17, 0x51, 0x45, 0x14, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x51, 0x74, 0x1F, 0x00, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x01, 0xF4, 0x17, 0x51, 0x45, 0x14, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x53, 0x70, 0x3F, 0x00, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x03, 0xF0, 0x37, 0x51, 0x45, 0x14, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x51, 0x74, 0x17, 0x51, 0x45, 0x14, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x53, 0x70, 0x37, 0x51, 0x45, 0x14, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x13, 0xF0, 0x3F, 0x00, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x51, 0x45, 0x3F, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x03, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x3F, 0x51, 0x45, 0x14, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x51, 0x45, 0x1F, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x71, 0x07, 0x00, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x71, 0x07, 0x10, 0x41, 0x04, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x1F, 0x51, 0x45, 0x14, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x51, 0x45, 0x37, 0x51, 0x45, 0x14, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x13, 0xF0, 0x3F, 0x10, 0x41, 0x04, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x41, 0x3C, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x07, 0x10, 0x41, 0x04, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x03, 0x52, 0x48, 0xD0, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x01, 0xC4, 0x9C, 0x49, 0x27, 0x10, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x79, 0x24, 0x10, 0x41, 0x04, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x01, 0xF2, 0x8A, 0x28, 0xA2, 0x80, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x79, 0x22, 0x04, 0x21, 0x27, 0x80, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x03, 0xD2, 0x48, 0xC0, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x04, 0x92, 0x49, 0xC4, 0x10, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x02, 0x94, 0x10, 0x41, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x38, 0x43, 0x91, 0x38, 0x43, 0x80, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x31, 0x24, 0x9E, 0x49, 0x23, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0xE4, 0x51, 0x28, 0xA6, 0xC0, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x31, 0x02, 0x04, 0x39, 0x23, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x02, 0x95, 0x54, 0xA0, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x00, 0x43, 0x95, 0x54, 0xE1, 0x00, // /* code=237, hex=0xED, ascii="!m" */ + // 0x00, 0xE4, 0x1E, 0x40, 0xE0, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0xC4, 0x92, 0x49, 0x20, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x43, 0x84, 0x00, 0xE0, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x40, 0xC0, 0x8C, 0x40, 0x07, 0x80, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x08, 0xC4, 0x0C, 0x08, 0x07, 0x80, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x00, 0x21, 0x44, 0x10, 0x41, 0x04, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x10, 0x41, 0x04, 0x11, 0x42, 0x00, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x40, 0x1F, 0x00, 0x40, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0xA5, 0x00, 0x29, 0x40, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x31, 0x24, 0x8C, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x00, 0x71, 0x04, 0x51, 0x42, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x50, 0xA2, 0x8A, 0x00, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x60, 0x42, 0x1C, 0x00, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0x07, 0x9E, 0x79, 0xE0, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^ź" */ +}; diff --git a/wled00/src/font/old fonts/console_font_6x8.wbf b/wled00/src/font/old fonts/console_font_6x8.wbf new file mode 100644 index 0000000000000000000000000000000000000000..6d8806e01d7b0dda4f9a2e355eeb87fda6d97597 GIT binary patch literal 582 zcmYLF!DI=<7yR+hbN_}w*CCC!{nF4TzV(}(0EQNFD**Ph zRx6?QI92!Jph?xV6SCZ29vVIpUGS*x+K>-bZ7S%e;HiEndPM%Z^KmHUNSTZ&XuK;j z*<6kYZpfT&UOx4qFOGCJ)6eV{xXMGG=>i=7dC)i%aNe?EWA$^Zvjq9~Sg0Jk?Cq%N zXDC2vzZK}(v&TSqq6^PWMD%oT8Is11dx;tF8)SvH$O&**gGx?{;FTx9?1)upGRb5<${EP9`G!Hf= zeO4Z}v-B$2f0v8*FUG7~9;UUkQfJg^FpK=;JQtX?;fgwM%?W%K3F;?r%sG)*PWG9E i%MUEC!IwLIhxdO)6jVC_wnt_Tf5IP{W7(rY8~-mY$$|g? literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_6x8_showcase.png b/wled00/src/font/old fonts/console_font_6x8_showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..c30a665f68066497bdf93444b69cba8374f8839f GIT binary patch literal 36868 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�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±}SgbOsXbVArTWbZXyxXieHZ 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 literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_7x9.h b/wled00/src/font/old fonts/console_font_7x9.h new file mode 100644 index 0000000000..e26f1b6b3a --- /dev/null +++ b/wled00/src/font/old fonts/console_font_7x9.h @@ -0,0 +1,300 @@ +// code points 0-31 and 127-255 are commented out to save memory, they contain extra characters (CP437), +// which could be used with an UTF-8 to CP437 conversion +// font courtesy of https://github.com/idispatch/raster-fonts + +/* + * WBF (WLED Bitmap Font) Packed Fixed-Width Format + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height: 9 + * [2] Fixed/max glyph width: 7 + * [3] Spacing between chars: 1 + * [4] Flags: 0x00 (0x01 = variable width) + * [5] First Char: 32 + * [6] Last Char: 126 + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian): 0x00000000 + * If variable width flag is set, header is followed by a width table of (Last Char - First Char + 1) bytes. + * Packing: row-by-row, top first bitstream, MSB-first. + */ + +/* + * PACKING EXAMPLE: 4x6 Character '!' + * ------------------------------------- + * VISUAL GRID (4x6): BINARY ROWS + * [Row 1] . # . . (2) 0010 + * [Row 2] . # . . (2) 0010 + * [Row 3] . # . . (2) 0010 + * [Row 4] . . . . (0) 0000 + * [Row 5] . # . . (2) 0010 + * [Row 6] . . . . (0) 0000 + * ------------------------------------- + * CONCATENATED STREAM: + * Rows: 1 & 2 | 3 & 4 | 5 & 6 + * Bits: 00100010 00100000 00100000 + * [Byte 1] [Byte 2] [Byte 3] + * Final HEX for '!' = 0x22, 0x20, 0x20 + * + * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte + */ + +static const unsigned char console_font_7x9[] PROGMEM = { + 0x57, 0x09, 0x07, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ + // 0x38, 0x8A, 0xAD, 0x58, 0x35, 0x65, 0x3C, 0x00, // /* code=1, hex=0x01, ascii="^A" */ + // 0x38, 0xFB, 0x5E, 0xBF, 0xF7, 0x71, 0xBE, 0x00, // /* code=2, hex=0x02, ascii="^B" */ + // 0x00, 0xDB, 0xFF, 0xFF, 0xEF, 0x8E, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ + // 0x00, 0x20, 0xE3, 0xEF, 0xEF, 0x8E, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ + // 0x38, 0x70, 0x46, 0xBF, 0xFA, 0xC4, 0x3E, 0x00, // /* code=5, hex=0x05, ascii="^E" */ + // 0x10, 0x71, 0xF7, 0xFF, 0xEA, 0x84, 0x1C, 0x00, // /* code=6, hex=0x06, ascii="^F" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ + // 0xFF, 0xFF, 0x9E, 0x1C, 0x3C, 0xFF, 0xFF, 0xFE, // /* code=8, hex=0x08, ascii="^H" */ + // 0x00, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ + // 0xFF, 0xCF, 0x0C, 0xC9, 0x98, 0x79, 0xFF, 0xFE, // /* code=10, hex=0x0A, ascii="^J" */ + // 0x0E, 0x0C, 0x28, 0xC3, 0xCC, 0xD9, 0x9E, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ + // 0x3C, 0xCD, 0x99, 0xE1, 0x87, 0x86, 0x0C, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ + // 0x00, 0x70, 0xB1, 0x02, 0x04, 0x18, 0x30, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ + // 0x00, 0x78, 0x91, 0xE2, 0x44, 0x9B, 0x36, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ + // 0x92, 0xA8, 0xE1, 0x4E, 0xE7, 0x15, 0x49, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ + // 0x00, 0x40, 0xC1, 0xC3, 0xC7, 0x0C, 0x10, 0x00, // /* code=16, hex=0x10, ascii="^P" */ + // 0x00, 0x08, 0x30, 0xE3, 0xC3, 0x83, 0x02, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x00, // /* code=18, hex=0x12, ascii="^R" */ + // 0x6C, 0xD9, 0xB3, 0x66, 0xC0, 0x1B, 0x36, 0x00, // /* code=19, hex=0x13, ascii="^S" */ + // 0x00, 0x79, 0x52, 0xA3, 0xC2, 0x85, 0x0A, 0x00, // /* code=20, hex=0x14, ascii="^T" */ + // 0x3C, 0xCD, 0x81, 0xE6, 0x6C, 0xCF, 0x03, 0x66, // /* code=21, hex=0x15, ascii="^U" */ + // 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, // /* code=22, hex=0x16, ascii="^V" */ + // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x7C, // /* code=23, hex=0x17, ascii="^W" */ + // 0x00, 0x30, 0xF2, 0xD1, 0x83, 0x06, 0x0C, 0x00, // /* code=24, hex=0x18, ascii="^X" */ + // 0x00, 0x30, 0x60, 0xC1, 0x8B, 0x4F, 0x0C, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ + // 0x00, 0x00, 0x60, 0x67, 0xE1, 0x86, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ + // 0x00, 0x00, 0x61, 0x87, 0xE6, 0x06, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ + // 0x00, 0x00, 0x00, 0x06, 0x0C, 0x1F, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ + // 0x00, 0x00, 0x93, 0x3F, 0xEC, 0xC9, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ + // 0x00, 0x00, 0x00, 0x83, 0x8F, 0xBF, 0x80, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ + // 0x00, 0x00, 0x07, 0xF7, 0xC7, 0x04, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ + 0x00, 0x30, 0x60, 0xC1, 0x80, 0x06, 0x0C, 0x00, /* code=33, hex=0x21, ascii="!" */ + 0x00, 0xD9, 0xB2, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ + 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#" */ + 0x08, 0x30, 0xF3, 0x03, 0xC0, 0xDF, 0x0C, 0x10, /* code=36, hex=0x24, ascii="$" */ + 0x70, 0xA5, 0xD8, 0x61, 0x87, 0xDA, 0x87, 0x00, /* code=37, hex=0x25, ascii="%" */ + 0x38, 0xD9, 0xB1, 0xC6, 0xED, 0x9B, 0x1F, 0x00, /* code=38, hex=0x26, ascii="&" */ + 0x00, 0x30, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ + 0x00, 0x18, 0x61, 0x83, 0x06, 0x06, 0x06, 0x00, /* code=40, hex=0x28, ascii="(" */ + 0x00, 0x60, 0x60, 0x60, 0xC1, 0x86, 0x18, 0x00, /* code=41, hex=0x29, ascii=")" */ + 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*" */ + 0x00, 0x00, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x60, /* code=44, hex=0x2C, ascii="," */ + 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, /* code=46, hex=0x2E, ascii="." */ + 0x00, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x00, /* code=47, hex=0x2F, ascii="/" */ + 0x00, 0x79, 0x9B, 0x77, 0x6C, 0xD9, 0x9E, 0x00, /* code=48, hex=0x30, ascii="0" */ + 0x00, 0x31, 0xE0, 0xC1, 0x83, 0x06, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1" */ + 0x00, 0x79, 0x9A, 0x31, 0xC6, 0x19, 0xBF, 0x00, /* code=50, hex=0x32, ascii="2" */ + 0x00, 0x79, 0x98, 0x31, 0xC0, 0xD9, 0x9E, 0x00, /* code=51, hex=0x33, ascii="3" */ + 0x00, 0x18, 0x71, 0xE6, 0xCF, 0xC3, 0x0F, 0x00, /* code=52, hex=0x34, ascii="4" */ + 0x00, 0xFD, 0x9B, 0x07, 0xC0, 0xD9, 0x9E, 0x00, /* code=53, hex=0x35, ascii="5" */ + 0x00, 0x38, 0xC3, 0x07, 0xCC, 0xD9, 0x9E, 0x00, /* code=54, hex=0x36, ascii="6" */ + 0x00, 0xFD, 0x98, 0x30, 0xC3, 0x06, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7" */ + 0x00, 0x79, 0x9B, 0x33, 0xCC, 0xD9, 0x9E, 0x00, /* code=56, hex=0x38, ascii="8" */ + 0x00, 0x79, 0x9B, 0x33, 0xE0, 0xC3, 0x1C, 0x00, /* code=57, hex=0x39, ascii="9" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x00, /* code=58, hex=0x3A, ascii=":" */ + 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x60, /* code=59, hex=0x3B, ascii=";" */ + 0x00, 0x00, 0x61, 0x86, 0x06, 0x06, 0x00, 0x00, /* code=60, hex=0x3C, ascii="<" */ + 0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ + 0x00, 0x00, 0xC0, 0xC0, 0xC3, 0x0C, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ + 0x00, 0x79, 0x98, 0x30, 0xC3, 0x00, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?" */ + 0x00, 0x79, 0x8B, 0x76, 0xAD, 0x98, 0x9E, 0x00, /* code=64, hex=0x40, ascii="@" */ + 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A" */ + 0x00, 0xF9, 0x9B, 0x37, 0xCC, 0xD9, 0xBE, 0x00, /* code=66, hex=0x42, ascii="B" */ + 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x00, /* code=67, hex=0x43, ascii="C" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6C, 0xD9, 0xBE, 0x00, /* code=68, hex=0x44, ascii="D" */ + 0x00, 0xFD, 0x9B, 0x07, 0x8C, 0x19, 0xBF, 0x00, /* code=69, hex=0x45, ascii="E" */ + 0x00, 0xFD, 0x9B, 0x07, 0xCC, 0x18, 0x30, 0x00, /* code=70, hex=0x46, ascii="F" */ + 0x00, 0x79, 0x9B, 0x06, 0xEC, 0xD9, 0x9F, 0x00, /* code=71, hex=0x47, ascii="G" */ + 0x00, 0xCD, 0x9B, 0x37, 0xEC, 0xD9, 0xB3, 0x00, /* code=72, hex=0x48, ascii="H" */ + 0x00, 0x78, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=73, hex=0x49, ascii="I" */ + 0x00, 0x3C, 0x30, 0x60, 0xCD, 0x9B, 0x1C, 0x00, /* code=74, hex=0x4A, ascii="J" */ + 0x00, 0xCD, 0xB3, 0x67, 0x8D, 0x9B, 0x33, 0x00, /* code=75, hex=0x4B, ascii="K" */ + 0x00, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xBF, 0x00, /* code=76, hex=0x4C, ascii="L" */ + 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M" */ + 0x00, 0xCD, 0xDB, 0xB7, 0xED, 0xD9, 0xB3, 0x00, /* code=78, hex=0x4E, ascii="N" */ + 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=79, hex=0x4F, ascii="O" */ + 0x00, 0xF9, 0x9B, 0x36, 0x6F, 0x98, 0x30, 0x00, /* code=80, hex=0x50, ascii="P" */ + 0x00, 0x79, 0x9B, 0x36, 0x6E, 0xDB, 0x9E, 0x06, /* code=81, hex=0x51, ascii="Q" */ + 0x00, 0xF9, 0x9B, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=82, hex=0x52, ascii="R" */ + 0x00, 0x79, 0x9B, 0x03, 0xC0, 0xD9, 0x9E, 0x00, /* code=83, hex=0x53, ascii="S" */ + 0x00, 0xFD, 0x68, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T" */ + 0x00, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=85, hex=0x55, ascii="U" */ + 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V" */ + 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W" */ + 0x00, 0xCD, 0x99, 0xE1, 0x87, 0x99, 0xB3, 0x00, /* code=88, hex=0x58, ascii="X" */ + 0x00, 0xCD, 0x9B, 0x33, 0xC3, 0x06, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y" */ + 0x00, 0xFD, 0x98, 0x61, 0x86, 0x19, 0xBF, 0x00, /* code=90, hex=0x5A, ascii="Z" */ + 0x00, 0x78, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x00, /* code=91, hex=0x5B, ascii="[" */ + 0x00, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x00, /* code=92, hex=0x5C, ascii="\" */ + 0x00, 0x78, 0x30, 0x60, 0xC1, 0x83, 0x1E, 0x00, /* code=93, hex=0x5D, ascii="]" */ + 0x00, 0x20, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, /* code=95, hex=0x5F, ascii="_" */ + 0x00, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ + 0x00, 0x00, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, /* code=97, hex=0x61, ascii="a" */ + 0x00, 0xC1, 0x83, 0xE6, 0x6C, 0xD9, 0xAE, 0x00, /* code=98, hex=0x62, ascii="b" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0x19, 0x9E, 0x00, /* code=99, hex=0x63, ascii="c" */ + 0x00, 0x0C, 0x19, 0xF6, 0x6C, 0xD9, 0x9D, 0x00, /* code=100, hex=0x64, ascii="d" */ + 0x00, 0x00, 0x01, 0xE6, 0x6F, 0xD8, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e" */ + 0x00, 0x38, 0xD9, 0x87, 0xC6, 0x0C, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xCF, 0x83, 0x3C, /* code=103, hex=0x67, ascii="g" */ + 0x00, 0xC1, 0x83, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=104, hex=0x68, ascii="h" */ + 0x18, 0x30, 0x00, 0xC3, 0x83, 0x06, 0x1E, 0x00, /* code=105, hex=0x69, ascii="i" */ + 0x0C, 0x18, 0x00, 0x63, 0xC1, 0x93, 0x36, 0x38, /* code=106, hex=0x6A, ascii="j" */ + 0x00, 0xC1, 0x83, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=107, hex=0x6B, ascii="k" */ + 0x00, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=108, hex=0x6C, ascii="l" */ + 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m" */ + 0x00, 0x00, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=110, hex=0x6E, ascii="n" */ + 0x00, 0x00, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, /* code=111, hex=0x6F, ascii="o" */ + 0x00, 0x00, 0x03, 0xE6, 0x6C, 0xDD, 0xB6, 0x60, /* code=112, hex=0x70, ascii="p" */ + 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xDB, 0x9B, 0x06, /* code=113, hex=0x71, ascii="q" */ + 0x00, 0x00, 0x01, 0x37, 0xE6, 0x0C, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r" */ + 0x00, 0x00, 0x01, 0xE6, 0x07, 0x81, 0x9E, 0x00, /* code=115, hex=0x73, ascii="s" */ + 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t" */ + 0x00, 0x00, 0x03, 0x36, 0x6C, 0xDB, 0x9B, 0x00, /* code=117, hex=0x75, ascii="u" */ + 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v" */ + 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w" */ + 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x" */ + 0x00, 0x00, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, /* code=121, hex=0x79, ascii="y" */ + 0x00, 0x00, 0x03, 0xF0, 0x63, 0x0C, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z" */ + 0x00, 0x38, 0xC1, 0x86, 0x06, 0x0C, 0x0E, 0x00, /* code=123, hex=0x7B, ascii="{" */ + 0x18, 0x30, 0x60, 0xC0, 0x03, 0x06, 0x0C, 0x00, /* code=124, hex=0x7C, ascii="|" */ + 0x00, 0xE0, 0x60, 0xC0, 0xC3, 0x06, 0x38, 0x00, /* code=125, hex=0x7D, ascii="}" */ + 0x00, 0x20, 0xEB, 0x70, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ + // 0x00, 0x00, 0x20, 0xE3, 0x6C, 0x5F, 0x80, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ + // 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x78, // /* code=128, hex=0x80, ascii="!^@" */ + // 0x66, 0xCC, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ + // 0x0C, 0x30, 0x01, 0xF6, 0x2F, 0xD8, 0x1F, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ + // 0x1C, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ + // 0x36, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ + // 0x18, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ + // 0x1C, 0x28, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ + // 0x00, 0x00, 0x00, 0xE3, 0x6C, 0x0D, 0x8E, 0x78, // /* code=135, hex=0x87, ascii="!^G" */ + // 0x08, 0x38, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ + // 0x66, 0xCC, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ + // 0x10, 0x70, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ + // 0x30, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ + // 0xC6, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ + // 0x38, 0x50, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ + // 0x1C, 0x61, 0xFB, 0x07, 0xCC, 0x18, 0x3F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ + // 0x00, 0x00, 0x03, 0xE1, 0xAF, 0xF6, 0x3F, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ + // 0x00, 0x3C, 0xE2, 0xC5, 0xFF, 0x36, 0x6F, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ + // 0x10, 0x70, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ + // 0x66, 0xCC, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ + // 0x18, 0x18, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ + // 0x08, 0x38, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ + // 0x18, 0x18, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ + // 0x66, 0xCC, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, // /* code=152, hex=0x98, ascii="!^X" */ + // 0x66, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ + // 0x66, 0x01, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ + // 0x08, 0x10, 0xF3, 0x06, 0x07, 0x84, 0x08, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ + // 0x1C, 0x6C, 0xC1, 0x87, 0xC6, 0x0F, 0x33, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ + // 0x66, 0xCC, 0xF0, 0xC7, 0xE3, 0x1F, 0x8C, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ + // 0xE1, 0xA3, 0x47, 0xAC, 0xDB, 0xF3, 0x03, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ + // 0x0E, 0x30, 0x60, 0xC7, 0xE3, 0x06, 0x0C, 0x70, // /* code=159, hex=0x9F, ascii="!^_" */ + // 0x06, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=160, hex=0xA0, ascii="! " */ + // 0x0C, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ + // 0x0C, 0x30, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ + // 0x0C, 0x30, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ + // 0x77, 0xB8, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ + // 0x77, 0xB8, 0x03, 0x37, 0x6F, 0xDB, 0xB3, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ + // 0x38, 0x18, 0xF3, 0x63, 0x40, 0x1F, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ + // 0x3C, 0xCD, 0x99, 0xE0, 0x0F, 0xC0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ + // 0x00, 0x30, 0x00, 0xC3, 0x0C, 0x19, 0x9E, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ + // 0x00, 0x00, 0x01, 0xE3, 0xC6, 0x0C, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ + // 0x00, 0x00, 0x03, 0xE7, 0xC1, 0x83, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ + // 0x60, 0xC1, 0x83, 0x71, 0xA0, 0x86, 0x0F, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ + // 0x60, 0xC1, 0x83, 0x67, 0xC5, 0x9F, 0x06, 0x00, // /* code=172, hex=0xAC, ascii="!," */ + // 0x00, 0x30, 0x00, 0xC1, 0x87, 0x8F, 0x0C, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ + // 0x00, 0x00, 0xCB, 0x3C, 0xCC, 0xCC, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ + // 0x00, 0x03, 0x33, 0x33, 0x2C, 0xF3, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ + // 0x54, 0x02, 0xA8, 0x05, 0x40, 0x2A, 0x80, 0x54, // /* code=176, hex=0xB0, ascii="!0" */ + // 0x92, 0x90, 0x94, 0x94, 0x84, 0xA4, 0xA4, 0x24, // /* code=177, hex=0xB1, ascii="!1" */ + // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=178, hex=0xB2, ascii="!2" */ + // 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, // /* code=179, hex=0xB3, ascii="!3" */ + // 0x10, 0x20, 0x40, 0x8F, 0x02, 0x04, 0x08, 0x10, // /* code=180, hex=0xB4, ascii="!4" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=181, hex=0xB5, ascii="!5" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=182, hex=0xB6, ascii="!6" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=183, hex=0xB7, ascii="!7" */ + // 0x00, 0x00, 0x07, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=184, hex=0xB8, ascii="!8" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9D, 0x0A, 0x14, 0x28, // /* code=185, hex=0xB9, ascii="!9" */ + // 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x28, // /* code=186, hex=0xBA, ascii="!:" */ + // 0x00, 0x00, 0x07, 0xC0, 0x9D, 0x0A, 0x14, 0x28, // /* code=187, hex=0xBB, ascii="!;" */ + // 0x28, 0x50, 0xA7, 0x40, 0x9F, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ + // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ + // 0x00, 0x00, 0x00, 0x0F, 0x02, 0x04, 0x08, 0x10, // /* code=191, hex=0xBF, ascii="!?" */ + // 0x10, 0x20, 0x40, 0x81, 0xE0, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE0, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x04, 0x08, 0x10, // /* code=194, hex=0xC2, ascii="!B" */ + // 0x10, 0x20, 0x40, 0x81, 0xE2, 0x04, 0x08, 0x10, // /* code=195, hex=0xC3, ascii="!C" */ + // 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ + // 0x10, 0x20, 0x40, 0x8F, 0xE2, 0x04, 0x08, 0x10, // /* code=197, hex=0xC5, ascii="!E" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=198, hex=0xC6, ascii="!F" */ + // 0x28, 0x50, 0xA1, 0x42, 0xE5, 0x0A, 0x14, 0x28, // /* code=199, hex=0xC7, ascii="!G" */ + // 0x28, 0x50, 0xA1, 0x72, 0x07, 0xC0, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ + // 0x00, 0x00, 0x01, 0xF2, 0x05, 0xCA, 0x14, 0x28, // /* code=201, hex=0xC9, ascii="!I" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1F, 0xC0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1D, 0xCA, 0x14, 0x28, // /* code=203, hex=0xCB, ascii="!K" */ + // 0x28, 0x50, 0xA1, 0x72, 0x05, 0xCA, 0x14, 0x28, // /* code=204, hex=0xCC, ascii="!L" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ + // 0x28, 0x50, 0xA7, 0x70, 0x1D, 0xCA, 0x14, 0x28, // /* code=206, hex=0xCE, ascii="!N" */ + // 0x10, 0x20, 0x47, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ + // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ + // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC4, 0x08, 0x10, // /* code=209, hex=0xD1, ascii="!Q" */ + // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=210, hex=0xD2, ascii="!R" */ + // 0x28, 0x50, 0xA1, 0x43, 0xE0, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ + // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC0, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ + // 0x00, 0x00, 0x00, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=213, hex=0xD5, ascii="!U" */ + // 0x00, 0x00, 0x00, 0x03, 0xE5, 0x0A, 0x14, 0x28, // /* code=214, hex=0xD6, ascii="!V" */ + // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=215, hex=0xD7, ascii="!W" */ + // 0x10, 0x20, 0x47, 0xF1, 0x1F, 0xC4, 0x08, 0x10, // /* code=216, hex=0xD8, ascii="!X" */ + // 0x10, 0x20, 0x40, 0x8F, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ + // 0x00, 0x00, 0x00, 0x01, 0xE2, 0x04, 0x08, 0x10, // /* code=218, hex=0xDA, ascii="!Z" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, // /* code=219, hex=0xDB, ascii="![" */ + // 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, // /* code=220, hex=0xDC, ascii="!\" */ + // 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, // /* code=221, hex=0xDD, ascii="!]" */ + // 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, // /* code=222, hex=0xDE, ascii="!^" */ + // 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ + // 0x00, 0x69, 0xA3, 0x46, 0x86, 0x80, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ + // 0x7C, 0xCD, 0x9B, 0x66, 0x6C, 0x59, 0xB6, 0x08, // /* code=225, hex=0xE1, ascii="!a" */ + // 0x00, 0xFD, 0x8B, 0x06, 0x0C, 0x18, 0x30, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ + // 0x00, 0x01, 0xB7, 0xFF, 0x6C, 0xDB, 0x36, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ + // 0x01, 0xFF, 0x1B, 0x03, 0x86, 0x19, 0xFF, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ + // 0x00, 0x00, 0x01, 0xF6, 0xCD, 0x9B, 0x1C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ + // 0x00, 0x00, 0x01, 0xB3, 0x66, 0xCF, 0xB1, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ + // 0x00, 0x01, 0xEB, 0x50, 0xE1, 0x86, 0x0C, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ + // 0x3C, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x1E, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ + // 0x00, 0x79, 0x9B, 0x37, 0xEC, 0xD9, 0x9E, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ + // 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xC9, 0x33, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ + // 0x00, 0x79, 0x81, 0x81, 0x87, 0x99, 0x9E, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ + // 0x00, 0x00, 0x01, 0xA4, 0xA9, 0x52, 0x9A, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ + // 0x04, 0x79, 0x9B, 0x77, 0x6C, 0xCF, 0x08, 0x20, // /* code=237, hex=0xED, ascii="!m" */ + // 0x1E, 0x61, 0x83, 0x07, 0xEC, 0x0C, 0x0F, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ + // 0x00, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0xB3, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ + // 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ + // 0x00, 0x30, 0x63, 0xF1, 0x83, 0x00, 0x3F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ + // 0x00, 0x60, 0x60, 0x61, 0x86, 0x00, 0x1E, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ + // 0x00, 0x18, 0x61, 0x81, 0x81, 0x80, 0x1E, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ + // 0x0C, 0x34, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, // /* code=244, hex=0xF4, ascii="!t" */ + // 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x2C, 0x30, // /* code=245, hex=0xF5, ascii="!u" */ + // 0x00, 0x30, 0x60, 0x07, 0xE0, 0x06, 0x0C, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ + // 0x00, 0x00, 0x6B, 0xB0, 0x03, 0x5D, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ + // 0x00, 0x79, 0x9B, 0x33, 0xC0, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ + // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ + // 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ + // 0x0E, 0x18, 0x30, 0x60, 0xCD, 0x8F, 0x06, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ + // 0x00, 0xF1, 0xB3, 0x66, 0xCD, 0x80, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ + // 0x00, 0x71, 0x30, 0xC3, 0x0F, 0x80, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ + // 0x00, 0xF9, 0xF3, 0xE7, 0xC0, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ +}; diff --git a/wled00/src/font/old fonts/console_font_7x9.wbf b/wled00/src/font/old fonts/console_font_7x9.wbf new file mode 100644 index 0000000000000000000000000000000000000000..90f9c8bf27b1c2b7cf7f3e2afb794bc746589652 GIT binary patch literal 772 zcmY*X!E4iC6n`b~r9#|1rc_+;FGwk*Jrw83f5Dr4rLcO4c3!jr(T+fhsM}$e%n#?u zqe30HlP)39UK(@tIfwFx#%|)7vg%41jYUdOExjC1X0)S_SJD!mwdP&XkSvrIY%hc@8WL38yEeht?Jrj zsf>JgKJ^5?bG&mr+(Eur)Faxz@Y^2g?9*bz;fAZw1N89&yNHcBNB95Y#$(_CJ{U!5 z)=giN-rP>#6V7e&uT{=%sw3_l;(Rk5jxBa*-jU}mj*n`O#{e_+<6 m+L8Bb6Wj~R&yKc=Izx|XOQ?$n3jHTD9z+bUjg$48*!>q581oqb literal 0 HcmV?d00001 diff --git a/wled00/src/font/old fonts/console_font_7x9_showcase.png b/wled00/src/font/old fonts/console_font_7x9_showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..7cbecb19b1b18947118c666f2a5ffbd754fd16f2 GIT binary patch literal 40789 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

DDayu7y0zn$m61 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 literal 0 HcmV?d00001 From da492b1d8e98d268d01e6591631e0e4e1db0bea9 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Tue, 24 Feb 2026 22:00:18 +0100 Subject: [PATCH 17/33] add font file helper, also cache flash fonts (reduces complexity) --- wled00/FX.cpp | 3 +- wled00/FX.h | 68 ++--------- wled00/FX_2Dfcn.cpp | 289 ++++++++++++++++++++++---------------------- 3 files changed, 152 insertions(+), 208 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 33e3f2c482..5bbe1b71fd 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6393,8 +6393,7 @@ void mode_2Dscrollingtext(void) { const bool isRotated = (rotate == 1 || rotate == -1); // +/- 90° rotated, swap width and height for calculations // Load the font - fontManager.loadFont(fontNum, useCustomFont); // TODO: simplify this code, prepare is not really needed as a separate function. - fontManager.prepare(text); + fontManager.loadFont(fontNum, text, useCustomFont); // Get font dimensions uint8_t glyphHeight = fontManager.getFontHeight(); diff --git a/wled00/FX.h b/wled00/FX.h index b73bfc0946..44bd9f30c4 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1088,44 +1088,6 @@ extern const char JSON_palette_names[]; * - Bitmap data: bit-packed glyphs - top left to bottom right, row by row, MSB first, see src/font files for example */ -// Abstract byte reader for unified flash/RAM access -class ByteReader { -public: - virtual uint8_t readByte(size_t offset) const = 0; - inline uint32_t readUInt32LE(size_t offset) const { - return (uint32_t)(readByte(offset)) | - ((uint32_t)(readByte(offset + 1)) << 8) | - ((uint32_t)(readByte(offset + 2)) << 16) | - ((uint32_t)(readByte(offset + 3)) << 24); - } - virtual ~ByteReader() {} -}; - -// PROGMEM reader for flash fonts -class FlashByteReader : public ByteReader { -private: - const uint8_t* _base; -public: - FlashByteReader() : _base(nullptr) {} // default constructor - FlashByteReader(const uint8_t* base) : _base(base) {} - - inline uint8_t readByte(size_t offset) const override { - return _base ? pgm_read_byte_near(_base + offset) : 0; - } -}; - -// RAM reader for cached fonts -class RAMByteReader : public ByteReader { -private: - const uint8_t* _base; -public: - RAMByteReader() : _base(nullptr) {} // default constructor - RAMByteReader(const uint8_t* base) : _base(base) {} - - inline uint8_t readByte(size_t offset) const override { - return _base ? _base[offset] : 0; - } -}; // Glyph entry in RAM cache struct GlyphEntry { @@ -1172,19 +1134,17 @@ class FontManager { _useFlashFont(false), _cacheNumbers(false), _headerValid(false), - _reader(nullptr), _fontBase(nullptr) {} - bool loadFont(uint8_t fontNum, bool useFile); + bool loadFont(uint8_t fontNum, const char* text, bool useFile); void cacheNumbers(bool cache) { _cacheNumbers = cache; } void prepare(const char* text); inline void beginFrame() { if (!_headerValid) { - updateReader(); - if (_reader) { - parseHeader(*_reader, _cachedHeader); - _headerValid = true; + updateFontBase(); + if (_fontBase) { + parseHeader(); } } } @@ -1208,30 +1168,19 @@ class FontManager { // Cached data for performance (non-static, per-instance) bool _headerValid; FontHeader _cachedHeader; - const ByteReader* _reader; const uint8_t* _fontBase; - FlashByteReader _flashReader; - RAMByteReader _ramReader; // Invalidate cached header (call when font changes) inline void invalidateHeader() { _headerValid = false; } - inline void updateReader() { - if (_flashFont) { - _flashReader = FlashByteReader(_flashFont); - _reader = &_flashReader; - _fontBase = _flashFont; - } else if (_segment->data) { + inline void updateFontBase() { + if (_segment->data) { SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; // Font header starts after metadata + registry - const uint8_t* fontData = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); - _ramReader = RAMByteReader(fontData); - _reader = &_ramReader; - _fontBase = fontData; + _fontBase = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); } else { - _reader = nullptr; _fontBase = nullptr; } } @@ -1241,8 +1190,7 @@ class FontManager { return _segment->data ? (SegmentFontMetadata*)_segment->data : nullptr; } - // Unified operations (work identically for flash and RAM) - static bool parseHeader(const ByteReader& reader, FontHeader& hdr); + void parseHeader(); const uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); // Glyph index calculation (pure function, inline for speed) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index b45282871b..a270b8b258 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -589,6 +589,12 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #include "src/font/console_font_6x8.h" #include "src/font/console_font_7x9.h" +static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { + strcpy_P(buffer, PSTR("/font")); + if (fontNum > 0) snprintf(buffer + 5, bufferSize - 5, "%d", fontNum); + strcat_P(buffer, PSTR(".wbf")); +} + // Pure glyph index calculator (inline for speed) inline int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { if (unicode <= LAST_ASCII_CHAR) { @@ -600,18 +606,19 @@ inline int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8 return -1; } -// Parse header from either flash or RAM (IDENTICAL format) -bool FontManager::parseHeader(const ByteReader& reader, FontHeader& hdr) { - if (reader.readByte(0) != 0x57) return false; // Magic check - hdr.height = reader.readByte(1); - hdr.width = reader.readByte(2); - hdr.spacing = reader.readByte(3); - hdr.flags = reader.readByte(4); - hdr.first = reader.readByte(5); - hdr.last = reader.readByte(6); +void FontManager::parseHeader() { + _cachedHeader.height = _fontBase[1]; + _cachedHeader.width = _fontBase[2]; + _cachedHeader.spacing = _fontBase[3]; + _cachedHeader.flags = _fontBase[4]; + _cachedHeader.first = _fontBase[5]; + _cachedHeader.last = _fontBase[6]; // [7] reserved: 0x00 - hdr.firstUnicode = reader.readUInt32LE(8); - return true; + _cachedHeader.firstUnicode = (uint32_t)(_fontBase[8]) | + ((uint32_t)(_fontBase[9]) << 8) | + ((uint32_t)(_fontBase[10]) << 16) | + ((uint32_t)(_fontBase[11]) << 24); + _headerValid = true; } // Get glyph width @@ -620,15 +627,6 @@ uint8_t FontManager::getGlyphWidth(uint32_t unicode) { int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); if (idx < 0) return 0; - // For flash fonts, read from width table - if (_useFlashFont) { - if (_cachedHeader.flags & 0x01) { - return _reader->readByte(FONT_HEADER_SIZE + idx); - } else { - return _cachedHeader.width; - } - } - // For cached fonts, look up in registry if (!_segment->data) return 0; SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; @@ -643,50 +641,23 @@ uint8_t FontManager::getGlyphWidth(uint32_t unicode) { return 0; // Not found in cache } -// Get glyph bitmap (uses cached header and reader) +// Get glyph bitmap const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { - if (!_reader || !_fontBase) return nullptr; + if (!_fontBase) return nullptr; int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); if (idx < 0) return nullptr; - // For flash fonts, calculate offset normally - if (_useFlashFont) { - uint8_t numGlyphs = _cachedHeader.last - _cachedHeader.first + 1; - outHeight = _cachedHeader.height; - size_t offset = FONT_HEADER_SIZE; // Start after header - - if (_cachedHeader.flags & 0x01) { - outWidth = _reader->readByte(FONT_HEADER_SIZE + idx); - offset += numGlyphs; - - for (int32_t i = 0; i < idx; i++) { - uint8_t w = _reader->readByte(FONT_HEADER_SIZE + i); - uint16_t bits = w * _cachedHeader.height; - offset += (bits + 7) / 8; - } - } else { - outWidth = _cachedHeader.width; - uint16_t bitsPerGlyph = _cachedHeader.width * _cachedHeader.height; - uint16_t bytesPerGlyph = (bitsPerGlyph + 7) / 8; - offset += idx * bytesPerGlyph; - } - return _fontBase + offset; - } - - // For cached fonts, use registry lookup if (!_segment->data) return nullptr; SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - // Find glyph in registry + uint32_t bitmapOffset = 0; for (uint8_t k = 0; k < meta->glyphCount; k++) { if (registry[k].code == idx) { outWidth = registry[k].width; outHeight = registry[k].height; - // Bitmap starts after: metadata + registry + header - const uint8_t* bitmap = _segment->data + sizeof(SegmentFontMetadata) +(meta->glyphCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE + bitmapOffset; - return bitmap; + return _fontBase + FONT_HEADER_SIZE + bitmapOffset; } // Accumulate offset to next glyph uint16_t bits = registry[k].width * registry[k].height; @@ -701,9 +672,7 @@ void FontManager::scanAvailableFonts() { meta->availableFonts = 0; for (int i = 0; i < MAX_FONTS; i++) { char fileName[FONT_NAME_BUFFER_SIZE]; - strcpy_P(fileName, PSTR("/font")); - if (i > 0) sprintf(fileName + 5, "%d", i); - strcat_P(fileName, PSTR(".wbf")); + getFontFileName(i, fileName, sizeof(fileName)); if (WLED_FS.exists(fileName)) { meta->availableFonts |= (1 << i); } @@ -711,9 +680,8 @@ void FontManager::scanAvailableFonts() { meta->fontsScanned = 1; } -bool FontManager::loadFont(uint8_t fontNum, bool useFile) { +bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { _fontNum = fontNum; - _useFlashFont = !useFile; switch (_fontNum) { default: case 0: _flashFont = font_TinyPixie2_6px; break; @@ -724,12 +692,7 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { } invalidateHeader(); - if (_useFlashFont) { - updateReader(); - return true; - } - // File font requested - SegmentFontMetadata* meta = getMetadata(); // is null if data is not allocated yet + SegmentFontMetadata* meta = getMetadata(); // Ensure segment data exists if (!meta) { if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { @@ -747,8 +710,9 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { } // Determine which font to actually use (with fallback) uint8_t fontToUse = fontNum; + bool actualUseFlash = !useFile; // Check if requested font is available - if (!(meta->availableFonts & (1 << fontNum))) { + if (useFile && !(meta->availableFonts & (1 << fontNum))) { // Not available - find first available font fontToUse = 0xFF; for (int i = 0; i < MAX_FONTS; i++) { @@ -758,15 +722,17 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { } } if (fontToUse == 0xFF) { - _useFlashFont = true; // no custom fonts available, use flash font - updateReader(); - return true; + fontToUse = fontNum; // no custom fonts available, use flash font + actualUseFlash = true; } } // Store the actual font being used _fontNum = fontToUse; + _useFlashFont = actualUseFlash; + uint8_t cacheID = _fontNum | (_useFlashFont ? 0x80 : 0x00); + // Check if the ACTUAL font to use has changed - if (fontToUse != meta->cachedFontNum) { + if (cacheID != meta->cachedFontNum) { // Font changed - clear cache but preserve scan results uint8_t avail = meta->availableFonts; uint8_t scanned = meta->fontsScanned; @@ -775,10 +741,11 @@ bool FontManager::loadFont(uint8_t fontNum, bool useFile) { } meta = getMetadata(); meta->availableFonts = avail; - meta->cachedFontNum = fontToUse; + meta->cachedFontNum = cacheID; meta->fontsScanned = scanned; meta->glyphCount = 0; } + prepare(text); return true; } @@ -826,9 +793,9 @@ void FontManager::prepare(const char* text) { // Helper to ensure header is valid auto checkHeader = [this]() -> bool { if (!_headerValid) { - updateReader(); - if (_reader && parseHeader(*_reader, _cachedHeader)) { - _headerValid = true; + updateFontBase(); + if (_fontBase) { + parseHeader(); return true; } return false; @@ -836,12 +803,6 @@ void FontManager::prepare(const char* text) { return true; }; - // Flash fonts - just validate header and done - if (_useFlashFont) { - checkHeader(); - return; - } - // Check if cache exists if (!_segment->data) { rebuildCache(text); @@ -849,12 +810,7 @@ void FontManager::prepare(const char* text) { } SegmentFontMetadata* meta = getMetadata(); // If glyphCount is 0, cache is empty - rebuild - if (meta->glyphCount == 0) { - rebuildCache(text); - return; - } - // Validate header from existing cache - if (!checkHeader()) { + if (meta->glyphCount == 0 || !checkHeader()) { rebuildCache(text); return; } @@ -884,7 +840,7 @@ void FontManager::prepare(const char* text) { } void FontManager::rebuildCache(const char* text) { - if (_useFlashFont || !text) return; + if (!text) return; // Preserve metadata SegmentFontMetadata savedMeta = {0, 0xFF, 0, 0}; @@ -892,81 +848,110 @@ void FontManager::rebuildCache(const char* text) { memcpy(&savedMeta, _segment->data, sizeof(SegmentFontMetadata)); } - // Build filename from font number TODO: make file name generation a function - char fileName[FONT_NAME_BUFFER_SIZE]; - strcpy_P(fileName, PSTR("/font")); - if (_fontNum > 0) sprintf(fileName + 5, "%d", _fontNum); - strcat_P(fileName, PSTR(".wbf")); - #ifdef CONFIG_IDF_TARGET_ESP32C3 - while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed - #endif - File file = WLED_FS.open(fileName, "r"); - - // Fallback logic - try other available fonts - if (!file) { - SegmentFontMetadata* meta = getMetadata(); - if (meta) { - for (int i = 0; i < MAX_FONTS; i++) { - if (i == _fontNum) continue; // Already tried this one - if (meta->availableFonts & (1 << i)) { - strcpy_P(fileName, PSTR("/font")); - if (i > 0) sprintf(fileName + 5, "%d", i); - strcat_P(fileName, PSTR(".wbf")); - file = WLED_FS.open(fileName, "r"); - if (file) { - _fontNum = i; // Update to fallback font - break; + File file; + if (!_useFlashFont) { + // Build filename from font number + char fileName[FONT_NAME_BUFFER_SIZE]; + getFontFileName(_fontNum, fileName, sizeof(fileName)); + + #ifdef CONFIG_IDF_TARGET_ESP32C3 + while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed + #endif + file = WLED_FS.open(fileName, "r"); + + // Fallback logic - try other available fonts + if (!file) { + SegmentFontMetadata* meta = getMetadata(); + if (meta) { + for (int i = 0; i < MAX_FONTS; i++) { + if (i == _fontNum) continue; // Already tried this one + if (meta->availableFonts & (1 << i)) { + getFontFileName(i, fileName, sizeof(fileName)); + file = WLED_FS.open(fileName, "r"); + if (file) { + _fontNum = i; // Update to fallback font + savedMeta.cachedFontNum = i; + break; + } } } } } + + if (!file) { + _useFlashFont = true; // Fallback straight to flash font + savedMeta.cachedFontNum = _fontNum | 0x80; + } + } + + if (!file && !_flashFont) return; + + // Read header + FontHeader hdr; + if (file) { + if (file.read() != 0x57) { file.close(); return; } + hdr.height = file.read(); + hdr.width = file.read(); + hdr.spacing = file.read(); + hdr.flags = file.read(); + hdr.first = file.read(); + hdr.last = file.read(); + file.read(); // skip byte 7 (reserved) + file.read((uint8_t*)&hdr.firstUnicode, 4); + } else { + if (pgm_read_byte_near(_flashFont) != 0x57) return; + hdr.height = pgm_read_byte_near(_flashFont + 1); + hdr.width = pgm_read_byte_near(_flashFont + 2); + hdr.spacing = pgm_read_byte_near(_flashFont + 3); + hdr.flags = pgm_read_byte_near(_flashFont + 4); + hdr.first = pgm_read_byte_near(_flashFont + 5); + hdr.last = pgm_read_byte_near(_flashFont + 6); + hdr.firstUnicode = (uint32_t)(pgm_read_byte_near(_flashFont + 8)) | + ((uint32_t)(pgm_read_byte_near(_flashFont + 9)) << 8) | + ((uint32_t)(pgm_read_byte_near(_flashFont + 10)) << 16) | + ((uint32_t)(pgm_read_byte_near(_flashFont + 11)) << 24); } - if (!file) return; - - // Read header from file - FontHeader fileHdr; - if (file.read() != 'W') { file.close(); return; } - // TODO: check if this works: file.read((uint8_t*)&fileHdr, 10); // Read remaining 10 bytes of header - fileHdr.height = file.read(); - fileHdr.width = file.read(); - fileHdr.spacing = file.read(); - fileHdr.flags = file.read(); - fileHdr.first = file.read(); - fileHdr.last = file.read(); - file.read(); // skip byte 7 (reserved) - file.read((uint8_t*)&fileHdr.firstUnicode, 4); // Collect needed glyphs uint8_t neededCodes[MAX_CACHED_GLYPHS]; - uint8_t neededCount = collectNeededCodes(text, fileHdr, neededCodes); - if (fileHdr.last < fileHdr.first) { file.close(); return; } // Invalid header - uint8_t numGlyphs = fileHdr.last - fileHdr.first + 1; + uint8_t neededCount = collectNeededCodes(text, hdr, neededCodes); + if (hdr.last < hdr.first) { if (file) file.close(); return; } // Invalid header + uint8_t numGlyphs = hdr.last - hdr.first + 1; uint8_t widthTable[numGlyphs]; // Read width table - if (fileHdr.flags & 0x01) { - if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table incomplete + if (hdr.flags & 0x01) { + if (file) { + if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table incomplete + } else { + for (uint8_t k = 0; k < numGlyphs; k++) { + widthTable[k] = pgm_read_byte_near(_flashFont + FONT_HEADER_SIZE + k); + } + } } else { for (uint8_t k = 0; k < numGlyphs; k++) { - widthTable[k] = fileHdr.width; + widthTable[k] = hdr.width; } } + // Calculate size: metadata + registry + header + bitmaps - uint32_t fileDataStart = FONT_HEADER_SIZE + ((fileHdr.flags & 0x01) ? numGlyphs : 0); + uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; // Just the header, no width table needed for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; if (code < numGlyphs) { - uint16_t bits = widthTable[code] * fileHdr.height; + uint16_t bits = widthTable[code] * hdr.height; ramFontSize += (bits + 7) / 8; } } + // Allocate RAM if (!_segment->allocateData(ramFontSize)) { - file.close(); + if (file) file.close(); return; } + // Write metadata SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; meta->availableFonts = savedMeta.availableFonts; @@ -982,39 +967,51 @@ void FontManager::rebuildCache(const char* text) { uint8_t code = neededCodes[k]; registry[k].code = code; registry[k].width = widthTable[code]; - registry[k].height = fileHdr.height; + registry[k].height = hdr.height; } ptr += neededCount * sizeof(GlyphEntry); // Write font header (for compatibility and easy access to spacing/firstUnicode) - file.seek(0); // Go back to start of file - file.read(ptr, FONT_HEADER_SIZE); // could also write it from fileHdr, but this is simpler + if (file) { + file.seek(0); // Go back to start of file + file.read(ptr, FONT_HEADER_SIZE); // could also write it from fileHdr, but this is simpler + } else { + for (int i = 0; i < FONT_HEADER_SIZE; i++) { + ptr[i] = pgm_read_byte_near(_flashFont + i); + } + } ptr += FONT_HEADER_SIZE; // Write bitmap data in registry order (no sorting needed) for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; - uint16_t bits = widthTable[code] * fileHdr.height; + uint16_t bits = widthTable[code] * hdr.height; uint16_t bytes = (bits + 7) / 8; // Calculate file offset - uint32_t offset = fileDataStart; + uint32_t offset = dataStart; for (uint8_t j = 0; j < code; j++) { - uint16_t b = widthTable[j] * fileHdr.height; + uint16_t b = widthTable[j] * hdr.height; offset += (b + 7) / 8; } - // Read from file - file.seek(offset); - file.read(ptr, bytes); + // Read from file or flash + if (file) { + file.seek(offset); + file.read(ptr, bytes); + } else { + for (uint16_t i = 0; i < bytes; i++) { + ptr[i] = pgm_read_byte_near(_flashFont + offset + i); + } + } ptr += bytes; } - file.close(); - memcpy(&_cachedHeader, &fileHdr, sizeof(FontHeader)); - _headerValid = true; // Mark as valid, we just loaded it directly - updateReader(); // Set up reader for cached access + + if (file) file.close(); + invalidateHeader(); // Mark as invalid, so it gets re-parsed from cache next frame + updateFontBase(); // Set up pointer to cached header/bitmaps } void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { - if (!_reader || !_fontBase) return; + if (!_fontBase) return; uint8_t w, h; const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); if (!bitmap || w == 0) return; @@ -1025,7 +1022,7 @@ void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t for (int col = 0; col < w; col++) { uint16_t bytePos = bitIndex >> 3; uint8_t bitPos = 7 - (bitIndex & 7); - uint8_t byteVal = _reader->readByte((bitmap - _fontBase) + bytePos); // note: could read only if new byte is needed but this is fast enough and simpler + uint8_t byteVal = bitmap[bytePos]; if ((byteVal >> bitPos) & 1) { int x0, y0; switch (rotate) { From 2fec051d612dd8e2b9e13a9180a4c6ad07fd8648 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Wed, 25 Feb 2026 19:35:30 +0100 Subject: [PATCH 18/33] update built-in fonts with similar but nicer ones --- wled00/FX_2Dfcn.cpp | 20 +- wled00/src/font/6x12.wbf | Bin 0 -> 797 bytes wled00/src/font/console_font_5x12.h | 300 ---------------- wled00/src/font/console_font_5x8.h | 300 ---------------- wled00/src/font/console_font_6x8.h | 368 ++++++-------------- wled00/src/font/console_font_6x8.wbf | Bin 0 -> 523 bytes wled00/src/font/console_font_7x9.h | 367 ++++++------------- wled00/src/font/console_font_7x9.wbf | Bin 0 -> 728 bytes wled00/src/font/font_6x12.h | 157 +++++++++ wled00/src/font/font_TinyPixie2_6px.h | 146 -------- wled00/src/font/font_TinyUnicode_8px.h | 152 ++++++++ wled00/src/font/font_TinyUnicode_8px.wbf | Bin 0 -> 436 bytes wled00/src/font/font_tom-thumb_6px.wbf | Bin 0 -> 297 bytes wled00/src/font/font_tom_thumb_6px.h | 145 ++++++++ wled00/src/font/old fonts/tom-thumb_6px.wbf | Bin 0 -> 297 bytes 15 files changed, 685 insertions(+), 1270 deletions(-) create mode 100644 wled00/src/font/6x12.wbf delete mode 100644 wled00/src/font/console_font_5x12.h delete mode 100644 wled00/src/font/console_font_5x8.h create mode 100644 wled00/src/font/console_font_6x8.wbf create mode 100644 wled00/src/font/console_font_7x9.wbf create mode 100644 wled00/src/font/font_6x12.h delete mode 100644 wled00/src/font/font_TinyPixie2_6px.h create mode 100644 wled00/src/font/font_TinyUnicode_8px.h create mode 100644 wled00/src/font/font_TinyUnicode_8px.wbf create mode 100644 wled00/src/font/font_tom-thumb_6px.wbf create mode 100644 wled00/src/font/font_tom_thumb_6px.h create mode 100644 wled00/src/font/old fonts/tom-thumb_6px.wbf diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index a270b8b258..bef8e2f1ce 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -583,9 +583,9 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu } #undef WU_WEIGHT -#include "src/font/font_TinyPixie2_6px.h" -#include "src/font/console_font_5x8.h" -#include "src/font/console_font_5x12.h" +#include "src/font/font_tom_thumb_6px.h" +#include "src/font/font_TinyUnicode_8px.h" +#include "src/font/font_6x12.h" #include "src/font/console_font_6x8.h" #include "src/font/console_font_7x9.h" @@ -641,7 +641,7 @@ uint8_t FontManager::getGlyphWidth(uint32_t unicode) { return 0; // Not found in cache } -// Get glyph bitmap +// Get glyph bitmap const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { if (!_fontBase) return nullptr; @@ -651,7 +651,7 @@ const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, if (!_segment->data) return nullptr; SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - + uint32_t bitmapOffset = 0; for (uint8_t k = 0; k < meta->glyphCount; k++) { if (registry[k].code == idx) { @@ -684,11 +684,11 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { _fontNum = fontNum; switch (_fontNum) { default: - case 0: _flashFont = font_TinyPixie2_6px; break; - case 1: _flashFont = console_font_5x8; break; - case 2: _flashFont = console_font_6x8; break; - case 3: _flashFont = console_font_7x9; break; - case 4: _flashFont = console_font_5x12; break; + case 0: _flashFont = font_tom_thumb_6px; break; + case 1: _flashFont = font_TinyUnicode_8px; break; + case 2: _flashFont = console_font_6x8; break; + case 3: _flashFont = console_font_7x9; break; + case 4: _flashFont = font_6x12; break; } invalidateHeader(); diff --git a/wled00/src/font/6x12.wbf b/wled00/src/font/6x12.wbf new file mode 100644 index 0000000000000000000000000000000000000000..def86f3d2efa337fe3ebb64df4e7a1dc29b37279 GIT binary patch literal 797 zcmZWnF=!KE6n=m1KkwH>`k%C#4ANW)lxFe}q?25aSWOlcMHfLyw3NCiU1}-zs0T(A zDwpD*lZ1fUf>Q;H!&xLcI%RIbsZ%0O4&wLjtb@MczW=-Lz4yKM-(Ag_LKN>4M@ASX zLKpzU%<%b7WD;SYLHsuie)qS+kpHC!(}csacl0Ye4ZmIAyFesHYm=P;jOSk3hc*Ht zyEfKpd31*+s-<(mqa)QCiSpi4E+O)l!t^l5u#}$ru@|Kqph3G zhcQ{(W0TI~fGE6GzODnZcC$B`8*R1d0|~{_WwM1;*k}ty`MPGeUz`cf3((NZtbc?&GRr~Ue@nImyP@{ z7j?%=(KQmE9ObuQ(kRy>yp*6^BpX{jPLlJ_d-FgH*-eIT=YOWnz}HvE0_Qq3PnNd6 z;4&QUm*xXs*HYfwd=rqYckCMXt#^_6gxxH?rH$dn&yqkKZfCA=4bohA`0&*+%W6zLVZU%*%@9&{wM-jMv57awm7Cxk_?mpngLXwEOm0hm*kgj3MC0ZxBTRA5@_fF$pVQL4L#XWR~>pnT-_9U zk`@Uxd{pW9@X6DHMZl4T;mM>5rA3fXVPLTT!oVOSe)K_$EzmIxvJ$QbIN~LaK46fQ zcRXO?5A?sh#2&qlmoq1Htr0L3oYpbx)Pz-Q7)+y%DKG#9ff|k;U;t{p091GMA%o5o zcGd$dUtAR!X3h>^PzJh%L0Rgr1H;VB2@Er*>o9!G_+aAWV({*eveJPlpfdoV CJ*O@J literal 0 HcmV?d00001 diff --git a/wled00/src/font/console_font_7x9.h b/wled00/src/font/console_font_7x9.h index e26f1b6b3a..0e1de00d3c 100644 --- a/wled00/src/font/console_font_7x9.h +++ b/wled00/src/font/console_font_7x9.h @@ -38,263 +38,116 @@ * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ +// Font: console_font_7x9 +// Height: 9, Max Width: 7, Spacing: 1 +// Characters: 32-126 (95 glyphs) +// Unicode Offset: 0x00000000 +// Variable Width: Yes + static const unsigned char console_font_7x9[] PROGMEM = { - 0x57, 0x09, 0x07, 0x01, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: Magic, H, W, Spacing, Flags, First, Last, Reserved, UnicodeOffset + 0x57, 0x09, 0x07, 0x01, 0x01, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, S, Flags, First, Last, Reserved, UnicodeOffset (32bit) + + // Width table + 0x07, 0x02, 0x05, 0x07, 0x06, 0x06, 0x06, 0x03, 0x04, 0x04, 0x07, 0x06, 0x03, 0x05, 0x02, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x05, 0x04, 0x05, 0x05, + 0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x05, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x05, 0x02, 0x05, 0x06, - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=0, hex=0x00, ascii="^@" */ - // 0x38, 0x8A, 0xAD, 0x58, 0x35, 0x65, 0x3C, 0x00, // /* code=1, hex=0x01, ascii="^A" */ - // 0x38, 0xFB, 0x5E, 0xBF, 0xF7, 0x71, 0xBE, 0x00, // /* code=2, hex=0x02, ascii="^B" */ - // 0x00, 0xDB, 0xFF, 0xFF, 0xEF, 0x8E, 0x08, 0x00, // /* code=3, hex=0x03, ascii="^C" */ - // 0x00, 0x20, 0xE3, 0xEF, 0xEF, 0x8E, 0x08, 0x00, // /* code=4, hex=0x04, ascii="^D" */ - // 0x38, 0x70, 0x46, 0xBF, 0xFA, 0xC4, 0x3E, 0x00, // /* code=5, hex=0x05, ascii="^E" */ - // 0x10, 0x71, 0xF7, 0xFF, 0xEA, 0x84, 0x1C, 0x00, // /* code=6, hex=0x06, ascii="^F" */ - // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=7, hex=0x07, ascii="^G" */ - // 0xFF, 0xFF, 0x9E, 0x1C, 0x3C, 0xFF, 0xFF, 0xFE, // /* code=8, hex=0x08, ascii="^H" */ - // 0x00, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x00, 0x00, // /* code=9, hex=0x09, ascii="^I" */ - // 0xFF, 0xCF, 0x0C, 0xC9, 0x98, 0x79, 0xFF, 0xFE, // /* code=10, hex=0x0A, ascii="^J" */ - // 0x0E, 0x0C, 0x28, 0xC3, 0xCC, 0xD9, 0x9E, 0x00, // /* code=11, hex=0x0B, ascii="^K" */ - // 0x3C, 0xCD, 0x99, 0xE1, 0x87, 0x86, 0x0C, 0x00, // /* code=12, hex=0x0C, ascii="^L" */ - // 0x00, 0x70, 0xB1, 0x02, 0x04, 0x18, 0x30, 0x00, // /* code=13, hex=0x0D, ascii="^M" */ - // 0x00, 0x78, 0x91, 0xE2, 0x44, 0x9B, 0x36, 0x00, // /* code=14, hex=0x0E, ascii="^N" */ - // 0x92, 0xA8, 0xE1, 0x4E, 0xE7, 0x15, 0x49, 0x00, // /* code=15, hex=0x0F, ascii="^O" */ - // 0x00, 0x40, 0xC1, 0xC3, 0xC7, 0x0C, 0x10, 0x00, // /* code=16, hex=0x10, ascii="^P" */ - // 0x00, 0x08, 0x30, 0xE3, 0xC3, 0x83, 0x02, 0x00, // /* code=17, hex=0x11, ascii="^Q" */ - // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x00, // /* code=18, hex=0x12, ascii="^R" */ - // 0x6C, 0xD9, 0xB3, 0x66, 0xC0, 0x1B, 0x36, 0x00, // /* code=19, hex=0x13, ascii="^S" */ - // 0x00, 0x79, 0x52, 0xA3, 0xC2, 0x85, 0x0A, 0x00, // /* code=20, hex=0x14, ascii="^T" */ - // 0x3C, 0xCD, 0x81, 0xE6, 0x6C, 0xCF, 0x03, 0x66, // /* code=21, hex=0x15, ascii="^U" */ - // 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, // /* code=22, hex=0x16, ascii="^V" */ - // 0x10, 0x71, 0xF0, 0x81, 0x0F, 0x8E, 0x08, 0x7C, // /* code=23, hex=0x17, ascii="^W" */ - // 0x00, 0x30, 0xF2, 0xD1, 0x83, 0x06, 0x0C, 0x00, // /* code=24, hex=0x18, ascii="^X" */ - // 0x00, 0x30, 0x60, 0xC1, 0x8B, 0x4F, 0x0C, 0x00, // /* code=25, hex=0x19, ascii="^Y" */ - // 0x00, 0x00, 0x60, 0x67, 0xE1, 0x86, 0x00, 0x00, // /* code=26, hex=0x1A, ascii="^Z" */ - // 0x00, 0x00, 0x61, 0x87, 0xE6, 0x06, 0x00, 0x00, // /* code=27, hex=0x1B, ascii="^[" */ - // 0x00, 0x00, 0x00, 0x06, 0x0C, 0x1F, 0x00, 0x00, // /* code=28, hex=0x1C, ascii="^\" */ - // 0x00, 0x00, 0x93, 0x3F, 0xEC, 0xC9, 0x00, 0x00, // /* code=29, hex=0x1D, ascii="^]" */ - // 0x00, 0x00, 0x00, 0x83, 0x8F, 0xBF, 0x80, 0x00, // /* code=30, hex=0x1E, ascii="^^" */ - // 0x00, 0x00, 0x07, 0xF7, 0xC7, 0x04, 0x00, 0x00, // /* code=31, hex=0x1F, ascii="^_" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" " */ - 0x00, 0x30, 0x60, 0xC1, 0x80, 0x06, 0x0C, 0x00, /* code=33, hex=0x21, ascii="!" */ - 0x00, 0xD9, 0xB2, 0x20, 0x00, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""" */ - 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#" */ - 0x08, 0x30, 0xF3, 0x03, 0xC0, 0xDF, 0x0C, 0x10, /* code=36, hex=0x24, ascii="$" */ - 0x70, 0xA5, 0xD8, 0x61, 0x87, 0xDA, 0x87, 0x00, /* code=37, hex=0x25, ascii="%" */ - 0x38, 0xD9, 0xB1, 0xC6, 0xED, 0x9B, 0x1F, 0x00, /* code=38, hex=0x26, ascii="&" */ - 0x00, 0x30, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, /* code=39, hex=0x27, ascii="'" */ - 0x00, 0x18, 0x61, 0x83, 0x06, 0x06, 0x06, 0x00, /* code=40, hex=0x28, ascii="(" */ - 0x00, 0x60, 0x60, 0x60, 0xC1, 0x86, 0x18, 0x00, /* code=41, hex=0x29, ascii=")" */ - 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*" */ - 0x00, 0x00, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x60, /* code=44, hex=0x2C, ascii="," */ - 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, /* code=46, hex=0x2E, ascii="." */ - 0x00, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x00, /* code=47, hex=0x2F, ascii="/" */ - 0x00, 0x79, 0x9B, 0x77, 0x6C, 0xD9, 0x9E, 0x00, /* code=48, hex=0x30, ascii="0" */ - 0x00, 0x31, 0xE0, 0xC1, 0x83, 0x06, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1" */ - 0x00, 0x79, 0x9A, 0x31, 0xC6, 0x19, 0xBF, 0x00, /* code=50, hex=0x32, ascii="2" */ - 0x00, 0x79, 0x98, 0x31, 0xC0, 0xD9, 0x9E, 0x00, /* code=51, hex=0x33, ascii="3" */ - 0x00, 0x18, 0x71, 0xE6, 0xCF, 0xC3, 0x0F, 0x00, /* code=52, hex=0x34, ascii="4" */ - 0x00, 0xFD, 0x9B, 0x07, 0xC0, 0xD9, 0x9E, 0x00, /* code=53, hex=0x35, ascii="5" */ - 0x00, 0x38, 0xC3, 0x07, 0xCC, 0xD9, 0x9E, 0x00, /* code=54, hex=0x36, ascii="6" */ - 0x00, 0xFD, 0x98, 0x30, 0xC3, 0x06, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7" */ - 0x00, 0x79, 0x9B, 0x33, 0xCC, 0xD9, 0x9E, 0x00, /* code=56, hex=0x38, ascii="8" */ - 0x00, 0x79, 0x9B, 0x33, 0xE0, 0xC3, 0x1C, 0x00, /* code=57, hex=0x39, ascii="9" */ - 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x00, /* code=58, hex=0x3A, ascii=":" */ - 0x00, 0x00, 0xC1, 0x80, 0x00, 0x0C, 0x18, 0x60, /* code=59, hex=0x3B, ascii=";" */ - 0x00, 0x00, 0x61, 0x86, 0x06, 0x06, 0x00, 0x00, /* code=60, hex=0x3C, ascii="<" */ - 0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=" */ - 0x00, 0x00, 0xC0, 0xC0, 0xC3, 0x0C, 0x00, 0x00, /* code=62, hex=0x3E, ascii=">" */ - 0x00, 0x79, 0x98, 0x30, 0xC3, 0x00, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?" */ - 0x00, 0x79, 0x8B, 0x76, 0xAD, 0x98, 0x9E, 0x00, /* code=64, hex=0x40, ascii="@" */ - 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A" */ - 0x00, 0xF9, 0x9B, 0x37, 0xCC, 0xD9, 0xBE, 0x00, /* code=66, hex=0x42, ascii="B" */ - 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x00, /* code=67, hex=0x43, ascii="C" */ - 0x00, 0xF9, 0x9B, 0x36, 0x6C, 0xD9, 0xBE, 0x00, /* code=68, hex=0x44, ascii="D" */ - 0x00, 0xFD, 0x9B, 0x07, 0x8C, 0x19, 0xBF, 0x00, /* code=69, hex=0x45, ascii="E" */ - 0x00, 0xFD, 0x9B, 0x07, 0xCC, 0x18, 0x30, 0x00, /* code=70, hex=0x46, ascii="F" */ - 0x00, 0x79, 0x9B, 0x06, 0xEC, 0xD9, 0x9F, 0x00, /* code=71, hex=0x47, ascii="G" */ - 0x00, 0xCD, 0x9B, 0x37, 0xEC, 0xD9, 0xB3, 0x00, /* code=72, hex=0x48, ascii="H" */ - 0x00, 0x78, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=73, hex=0x49, ascii="I" */ - 0x00, 0x3C, 0x30, 0x60, 0xCD, 0x9B, 0x1C, 0x00, /* code=74, hex=0x4A, ascii="J" */ - 0x00, 0xCD, 0xB3, 0x67, 0x8D, 0x9B, 0x33, 0x00, /* code=75, hex=0x4B, ascii="K" */ - 0x00, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xBF, 0x00, /* code=76, hex=0x4C, ascii="L" */ - 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M" */ - 0x00, 0xCD, 0xDB, 0xB7, 0xED, 0xD9, 0xB3, 0x00, /* code=78, hex=0x4E, ascii="N" */ - 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=79, hex=0x4F, ascii="O" */ - 0x00, 0xF9, 0x9B, 0x36, 0x6F, 0x98, 0x30, 0x00, /* code=80, hex=0x50, ascii="P" */ - 0x00, 0x79, 0x9B, 0x36, 0x6E, 0xDB, 0x9E, 0x06, /* code=81, hex=0x51, ascii="Q" */ - 0x00, 0xF9, 0x9B, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=82, hex=0x52, ascii="R" */ - 0x00, 0x79, 0x9B, 0x03, 0xC0, 0xD9, 0x9E, 0x00, /* code=83, hex=0x53, ascii="S" */ - 0x00, 0xFD, 0x68, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T" */ - 0x00, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, /* code=85, hex=0x55, ascii="U" */ - 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V" */ - 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W" */ - 0x00, 0xCD, 0x99, 0xE1, 0x87, 0x99, 0xB3, 0x00, /* code=88, hex=0x58, ascii="X" */ - 0x00, 0xCD, 0x9B, 0x33, 0xC3, 0x06, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y" */ - 0x00, 0xFD, 0x98, 0x61, 0x86, 0x19, 0xBF, 0x00, /* code=90, hex=0x5A, ascii="Z" */ - 0x00, 0x78, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x00, /* code=91, hex=0x5B, ascii="[" */ - 0x00, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x00, /* code=92, hex=0x5C, ascii="\" */ - 0x00, 0x78, 0x30, 0x60, 0xC1, 0x83, 0x1E, 0x00, /* code=93, hex=0x5D, ascii="]" */ - 0x00, 0x20, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^" */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, /* code=95, hex=0x5F, ascii="_" */ - 0x00, 0x60, 0xC0, 0xC1, 0x80, 0x00, 0x00, 0x00, /* code=96, hex=0x60, ascii="`" */ - 0x00, 0x00, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, /* code=97, hex=0x61, ascii="a" */ - 0x00, 0xC1, 0x83, 0xE6, 0x6C, 0xD9, 0xAE, 0x00, /* code=98, hex=0x62, ascii="b" */ - 0x00, 0x00, 0x01, 0xE6, 0x6C, 0x19, 0x9E, 0x00, /* code=99, hex=0x63, ascii="c" */ - 0x00, 0x0C, 0x19, 0xF6, 0x6C, 0xD9, 0x9D, 0x00, /* code=100, hex=0x64, ascii="d" */ - 0x00, 0x00, 0x01, 0xE6, 0x6F, 0xD8, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e" */ - 0x00, 0x38, 0xD9, 0x87, 0xC6, 0x0C, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f" */ - 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xCF, 0x83, 0x3C, /* code=103, hex=0x67, ascii="g" */ - 0x00, 0xC1, 0x83, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=104, hex=0x68, ascii="h" */ - 0x18, 0x30, 0x00, 0xC3, 0x83, 0x06, 0x1E, 0x00, /* code=105, hex=0x69, ascii="i" */ - 0x0C, 0x18, 0x00, 0x63, 0xC1, 0x93, 0x36, 0x38, /* code=106, hex=0x6A, ascii="j" */ - 0x00, 0xC1, 0x83, 0x36, 0xCF, 0x1B, 0x33, 0x00, /* code=107, hex=0x6B, ascii="k" */ - 0x00, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1E, 0x00, /* code=108, hex=0x6C, ascii="l" */ - 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m" */ - 0x00, 0x00, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, /* code=110, hex=0x6E, ascii="n" */ - 0x00, 0x00, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, /* code=111, hex=0x6F, ascii="o" */ - 0x00, 0x00, 0x03, 0xE6, 0x6C, 0xDD, 0xB6, 0x60, /* code=112, hex=0x70, ascii="p" */ - 0x00, 0x00, 0x01, 0xD6, 0x6C, 0xDB, 0x9B, 0x06, /* code=113, hex=0x71, ascii="q" */ - 0x00, 0x00, 0x01, 0x37, 0xE6, 0x0C, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r" */ - 0x00, 0x00, 0x01, 0xE6, 0x07, 0x81, 0x9E, 0x00, /* code=115, hex=0x73, ascii="s" */ - 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t" */ - 0x00, 0x00, 0x03, 0x36, 0x6C, 0xDB, 0x9B, 0x00, /* code=117, hex=0x75, ascii="u" */ - 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v" */ - 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w" */ - 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x" */ - 0x00, 0x00, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, /* code=121, hex=0x79, ascii="y" */ - 0x00, 0x00, 0x03, 0xF0, 0x63, 0x0C, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z" */ - 0x00, 0x38, 0xC1, 0x86, 0x06, 0x0C, 0x0E, 0x00, /* code=123, hex=0x7B, ascii="{" */ - 0x18, 0x30, 0x60, 0xC0, 0x03, 0x06, 0x0C, 0x00, /* code=124, hex=0x7C, ascii="|" */ - 0x00, 0xE0, 0x60, 0xC0, 0xC3, 0x06, 0x38, 0x00, /* code=125, hex=0x7D, ascii="}" */ - 0x00, 0x20, 0xEB, 0x70, 0x40, 0x00, 0x00, 0x00, /* code=126, hex=0x7E, ascii="~" */ - // 0x00, 0x00, 0x20, 0xE3, 0x6C, 0x5F, 0x80, 0x00, // /* code=127, hex=0x7F, ascii="^?" */ - // 0x00, 0x79, 0x9B, 0x06, 0x0C, 0x19, 0x9E, 0x78, // /* code=128, hex=0x80, ascii="!^@" */ - // 0x66, 0xCC, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=129, hex=0x81, ascii="!^A" */ - // 0x0C, 0x30, 0x01, 0xF6, 0x2F, 0xD8, 0x1F, 0x00, // /* code=130, hex=0x82, ascii="!^B" */ - // 0x1C, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=131, hex=0x83, ascii="!^C" */ - // 0x36, 0x6C, 0x01, 0xE0, 0x67, 0xD9, 0x9F, 0x00, // /* code=132, hex=0x84, ascii="!^D" */ - // 0x18, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=133, hex=0x85, ascii="!^E" */ - // 0x1C, 0x28, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=134, hex=0x86, ascii="!^F" */ - // 0x00, 0x00, 0x00, 0xE3, 0x6C, 0x0D, 0x8E, 0x78, // /* code=135, hex=0x87, ascii="!^G" */ - // 0x08, 0x38, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=136, hex=0x88, ascii="!^H" */ - // 0x66, 0xCC, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=137, hex=0x89, ascii="!^I" */ - // 0x18, 0x18, 0x01, 0xE6, 0x6F, 0xD8, 0x1F, 0x00, // /* code=138, hex=0x8A, ascii="!^J" */ - // 0x66, 0xCC, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=139, hex=0x8B, ascii="!^K" */ - // 0x10, 0x70, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=140, hex=0x8C, ascii="!^L" */ - // 0x30, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=141, hex=0x8D, ascii="!^M" */ - // 0xC6, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=142, hex=0x8E, ascii="!^N" */ - // 0x38, 0x50, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, // /* code=143, hex=0x8F, ascii="!^O" */ - // 0x1C, 0x61, 0xFB, 0x07, 0xCC, 0x18, 0x3F, 0x00, // /* code=144, hex=0x90, ascii="!^P" */ - // 0x00, 0x00, 0x03, 0xE1, 0xAF, 0xF6, 0x3F, 0x00, // /* code=145, hex=0x91, ascii="!^Q" */ - // 0x00, 0x3C, 0xE2, 0xC5, 0xFF, 0x36, 0x6F, 0x00, // /* code=146, hex=0x92, ascii="!^R" */ - // 0x10, 0x70, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=147, hex=0x93, ascii="!^S" */ - // 0x66, 0xCC, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=148, hex=0x94, ascii="!^T" */ - // 0x18, 0x18, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=149, hex=0x95, ascii="!^U" */ - // 0x08, 0x38, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=150, hex=0x96, ascii="!^V" */ - // 0x18, 0x18, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=151, hex=0x97, ascii="!^W" */ - // 0x66, 0xCC, 0x03, 0x36, 0x66, 0xC7, 0x36, 0x38, // /* code=152, hex=0x98, ascii="!^X" */ - // 0x66, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=153, hex=0x99, ascii="!^Y" */ - // 0x66, 0x01, 0x9B, 0x36, 0x6C, 0xD9, 0x9E, 0x00, // /* code=154, hex=0x9A, ascii="!^Z" */ - // 0x08, 0x10, 0xF3, 0x06, 0x07, 0x84, 0x08, 0x00, // /* code=155, hex=0x9B, ascii="!^[" */ - // 0x1C, 0x6C, 0xC1, 0x87, 0xC6, 0x0F, 0x33, 0x00, // /* code=156, hex=0x9C, ascii="!^\" */ - // 0x66, 0xCC, 0xF0, 0xC7, 0xE3, 0x1F, 0x8C, 0x00, // /* code=157, hex=0x9D, ascii="!^]" */ - // 0xE1, 0xA3, 0x47, 0xAC, 0xDB, 0xF3, 0x03, 0x00, // /* code=158, hex=0x9E, ascii="!^^" */ - // 0x0E, 0x30, 0x60, 0xC7, 0xE3, 0x06, 0x0C, 0x70, // /* code=159, hex=0x9F, ascii="!^_" */ - // 0x06, 0x18, 0x01, 0xE0, 0x67, 0xD9, 0x9D, 0x00, // /* code=160, hex=0xA0, ascii="! " */ - // 0x0C, 0x30, 0x01, 0xC1, 0x83, 0x06, 0x1E, 0x00, // /* code=161, hex=0xA1, ascii="!!" */ - // 0x0C, 0x30, 0x01, 0xE6, 0x6C, 0xD9, 0x9E, 0x00, // /* code=162, hex=0xA2, ascii="!"" */ - // 0x0C, 0x30, 0x03, 0x36, 0x6C, 0xD9, 0x9D, 0x00, // /* code=163, hex=0xA3, ascii="!#" */ - // 0x77, 0xB8, 0x03, 0x67, 0x6C, 0xD9, 0xB3, 0x00, // /* code=164, hex=0xA4, ascii="!$" */ - // 0x77, 0xB8, 0x03, 0x37, 0x6F, 0xDB, 0xB3, 0x00, // /* code=165, hex=0xA5, ascii="!%" */ - // 0x38, 0x18, 0xF3, 0x63, 0x40, 0x1F, 0x00, 0x00, // /* code=166, hex=0xA6, ascii="!&" */ - // 0x3C, 0xCD, 0x99, 0xE0, 0x0F, 0xC0, 0x00, 0x00, // /* code=167, hex=0xA7, ascii="!'" */ - // 0x00, 0x30, 0x00, 0xC3, 0x0C, 0x19, 0x9E, 0x00, // /* code=168, hex=0xA8, ascii="!(" */ - // 0x00, 0x00, 0x01, 0xE3, 0xC6, 0x0C, 0x00, 0x00, // /* code=169, hex=0xA9, ascii="!)" */ - // 0x00, 0x00, 0x03, 0xE7, 0xC1, 0x83, 0x00, 0x00, // /* code=170, hex=0xAA, ascii="!*" */ - // 0x60, 0xC1, 0x83, 0x71, 0xA0, 0x86, 0x0F, 0x00, // /* code=171, hex=0xAB, ascii="!+" */ - // 0x60, 0xC1, 0x83, 0x67, 0xC5, 0x9F, 0x06, 0x00, // /* code=172, hex=0xAC, ascii="!," */ - // 0x00, 0x30, 0x00, 0xC1, 0x87, 0x8F, 0x0C, 0x00, // /* code=173, hex=0xAD, ascii="!-" */ - // 0x00, 0x00, 0xCB, 0x3C, 0xCC, 0xCC, 0x80, 0x00, // /* code=174, hex=0xAE, ascii="!." */ - // 0x00, 0x03, 0x33, 0x33, 0x2C, 0xF3, 0x00, 0x00, // /* code=175, hex=0xAF, ascii="!/" */ - // 0x54, 0x02, 0xA8, 0x05, 0x40, 0x2A, 0x80, 0x54, // /* code=176, hex=0xB0, ascii="!0" */ - // 0x92, 0x90, 0x94, 0x94, 0x84, 0xA4, 0xA4, 0x24, // /* code=177, hex=0xB1, ascii="!1" */ - // 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // /* code=178, hex=0xB2, ascii="!2" */ - // 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, // /* code=179, hex=0xB3, ascii="!3" */ - // 0x10, 0x20, 0x40, 0x8F, 0x02, 0x04, 0x08, 0x10, // /* code=180, hex=0xB4, ascii="!4" */ - // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=181, hex=0xB5, ascii="!5" */ - // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=182, hex=0xB6, ascii="!6" */ - // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=183, hex=0xB7, ascii="!7" */ - // 0x00, 0x00, 0x07, 0x81, 0x1E, 0x04, 0x08, 0x10, // /* code=184, hex=0xB8, ascii="!8" */ - // 0x28, 0x50, 0xA7, 0x40, 0x9D, 0x0A, 0x14, 0x28, // /* code=185, hex=0xB9, ascii="!9" */ - // 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x28, // /* code=186, hex=0xBA, ascii="!:" */ - // 0x00, 0x00, 0x07, 0xC0, 0x9D, 0x0A, 0x14, 0x28, // /* code=187, hex=0xBB, ascii="!;" */ - // 0x28, 0x50, 0xA7, 0x40, 0x9F, 0x00, 0x00, 0x00, // /* code=188, hex=0xBC, ascii="!<" */ - // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=189, hex=0xBD, ascii="!=" */ - // 0x10, 0x20, 0x47, 0x81, 0x1E, 0x00, 0x00, 0x00, // /* code=190, hex=0xBE, ascii="!>" */ - // 0x00, 0x00, 0x00, 0x0F, 0x02, 0x04, 0x08, 0x10, // /* code=191, hex=0xBF, ascii="!?" */ - // 0x10, 0x20, 0x40, 0x81, 0xE0, 0x00, 0x00, 0x00, // /* code=192, hex=0xC0, ascii="!@" */ - // 0x10, 0x20, 0x40, 0x8F, 0xE0, 0x00, 0x00, 0x00, // /* code=193, hex=0xC1, ascii="!A" */ - // 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x04, 0x08, 0x10, // /* code=194, hex=0xC2, ascii="!B" */ - // 0x10, 0x20, 0x40, 0x81, 0xE2, 0x04, 0x08, 0x10, // /* code=195, hex=0xC3, ascii="!C" */ - // 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, // /* code=196, hex=0xC4, ascii="!D" */ - // 0x10, 0x20, 0x40, 0x8F, 0xE2, 0x04, 0x08, 0x10, // /* code=197, hex=0xC5, ascii="!E" */ - // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=198, hex=0xC6, ascii="!F" */ - // 0x28, 0x50, 0xA1, 0x42, 0xE5, 0x0A, 0x14, 0x28, // /* code=199, hex=0xC7, ascii="!G" */ - // 0x28, 0x50, 0xA1, 0x72, 0x07, 0xC0, 0x00, 0x00, // /* code=200, hex=0xC8, ascii="!H" */ - // 0x00, 0x00, 0x01, 0xF2, 0x05, 0xCA, 0x14, 0x28, // /* code=201, hex=0xC9, ascii="!I" */ - // 0x28, 0x50, 0xA7, 0x70, 0x1F, 0xC0, 0x00, 0x00, // /* code=202, hex=0xCA, ascii="!J" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1D, 0xCA, 0x14, 0x28, // /* code=203, hex=0xCB, ascii="!K" */ - // 0x28, 0x50, 0xA1, 0x72, 0x05, 0xCA, 0x14, 0x28, // /* code=204, hex=0xCC, ascii="!L" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=205, hex=0xCD, ascii="!M" */ - // 0x28, 0x50, 0xA7, 0x70, 0x1D, 0xCA, 0x14, 0x28, // /* code=206, hex=0xCE, ascii="!N" */ - // 0x10, 0x20, 0x47, 0xF0, 0x1F, 0xC0, 0x00, 0x00, // /* code=207, hex=0xCF, ascii="!O" */ - // 0x28, 0x50, 0xA1, 0x4F, 0x80, 0x00, 0x00, 0x00, // /* code=208, hex=0xD0, ascii="!P" */ - // 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xC4, 0x08, 0x10, // /* code=209, hex=0xD1, ascii="!Q" */ - // 0x00, 0x00, 0x00, 0x0F, 0x85, 0x0A, 0x14, 0x28, // /* code=210, hex=0xD2, ascii="!R" */ - // 0x28, 0x50, 0xA1, 0x43, 0xE0, 0x00, 0x00, 0x00, // /* code=211, hex=0xD3, ascii="!S" */ - // 0x10, 0x20, 0x40, 0xF1, 0x03, 0xC0, 0x00, 0x00, // /* code=212, hex=0xD4, ascii="!T" */ - // 0x00, 0x00, 0x00, 0xF1, 0x03, 0xC4, 0x08, 0x10, // /* code=213, hex=0xD5, ascii="!U" */ - // 0x00, 0x00, 0x00, 0x03, 0xE5, 0x0A, 0x14, 0x28, // /* code=214, hex=0xD6, ascii="!V" */ - // 0x28, 0x50, 0xA1, 0x4E, 0x85, 0x0A, 0x14, 0x28, // /* code=215, hex=0xD7, ascii="!W" */ - // 0x10, 0x20, 0x47, 0xF1, 0x1F, 0xC4, 0x08, 0x10, // /* code=216, hex=0xD8, ascii="!X" */ - // 0x10, 0x20, 0x40, 0x8F, 0x00, 0x00, 0x00, 0x00, // /* code=217, hex=0xD9, ascii="!Y" */ - // 0x00, 0x00, 0x00, 0x01, 0xE2, 0x04, 0x08, 0x10, // /* code=218, hex=0xDA, ascii="!Z" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, // /* code=219, hex=0xDB, ascii="![" */ - // 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, // /* code=220, hex=0xDC, ascii="!\" */ - // 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, // /* code=221, hex=0xDD, ascii="!]" */ - // 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, // /* code=222, hex=0xDE, ascii="!^" */ - // 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, // /* code=223, hex=0xDF, ascii="!_" */ - // 0x00, 0x69, 0xA3, 0x46, 0x86, 0x80, 0x00, 0x00, // /* code=224, hex=0xE0, ascii="!`" */ - // 0x7C, 0xCD, 0x9B, 0x66, 0x6C, 0x59, 0xB6, 0x08, // /* code=225, hex=0xE1, ascii="!a" */ - // 0x00, 0xFD, 0x8B, 0x06, 0x0C, 0x18, 0x30, 0x00, // /* code=226, hex=0xE2, ascii="!b" */ - // 0x00, 0x01, 0xB7, 0xFF, 0x6C, 0xDB, 0x36, 0x00, // /* code=227, hex=0xE3, ascii="!c" */ - // 0x01, 0xFF, 0x1B, 0x03, 0x86, 0x19, 0xFF, 0x00, // /* code=228, hex=0xE4, ascii="!d" */ - // 0x00, 0x00, 0x01, 0xF6, 0xCD, 0x9B, 0x1C, 0x00, // /* code=229, hex=0xE5, ascii="!e" */ - // 0x00, 0x00, 0x01, 0xB3, 0x66, 0xCF, 0xB1, 0x40, // /* code=230, hex=0xE6, ascii="!f" */ - // 0x00, 0x01, 0xEB, 0x50, 0xE1, 0x86, 0x0C, 0x00, // /* code=231, hex=0xE7, ascii="!g" */ - // 0x3C, 0x30, 0xF3, 0x36, 0x67, 0x86, 0x1E, 0x00, // /* code=232, hex=0xE8, ascii="!h" */ - // 0x00, 0x79, 0x9B, 0x37, 0xEC, 0xD9, 0x9E, 0x00, // /* code=233, hex=0xE9, ascii="!i" */ - // 0x00, 0x79, 0x9B, 0x36, 0x6C, 0xC9, 0x33, 0x00, // /* code=234, hex=0xEA, ascii="!j" */ - // 0x00, 0x79, 0x81, 0x81, 0x87, 0x99, 0x9E, 0x00, // /* code=235, hex=0xEB, ascii="!k" */ - // 0x00, 0x00, 0x01, 0xA4, 0xA9, 0x52, 0x9A, 0x00, // /* code=236, hex=0xEC, ascii="!l" */ - // 0x04, 0x79, 0x9B, 0x77, 0x6C, 0xCF, 0x08, 0x20, // /* code=237, hex=0xED, ascii="!m" */ - // 0x1E, 0x61, 0x83, 0x07, 0xEC, 0x0C, 0x0F, 0x00, // /* code=238, hex=0xEE, ascii="!n" */ - // 0x00, 0x00, 0xF3, 0x36, 0x6C, 0xD9, 0xB3, 0x00, // /* code=239, hex=0xEF, ascii="!o" */ - // 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, // /* code=240, hex=0xF0, ascii="!p" */ - // 0x00, 0x30, 0x63, 0xF1, 0x83, 0x00, 0x3F, 0x00, // /* code=241, hex=0xF1, ascii="!q" */ - // 0x00, 0x60, 0x60, 0x61, 0x86, 0x00, 0x1E, 0x00, // /* code=242, hex=0xF2, ascii="!r" */ - // 0x00, 0x18, 0x61, 0x81, 0x81, 0x80, 0x1E, 0x00, // /* code=243, hex=0xF3, ascii="!s" */ - // 0x0C, 0x34, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, // /* code=244, hex=0xF4, ascii="!t" */ - // 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x2C, 0x30, // /* code=245, hex=0xF5, ascii="!u" */ - // 0x00, 0x30, 0x60, 0x07, 0xE0, 0x06, 0x0C, 0x00, // /* code=246, hex=0xF6, ascii="!v" */ - // 0x00, 0x00, 0x6B, 0xB0, 0x03, 0x5D, 0x80, 0x00, // /* code=247, hex=0xF7, ascii="!w" */ - // 0x00, 0x79, 0x9B, 0x33, 0xC0, 0x00, 0x00, 0x00, // /* code=248, hex=0xF8, ascii="!x" */ - // 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x00, 0x00, // /* code=249, hex=0xF9, ascii="!y" */ - // 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, // /* code=250, hex=0xFA, ascii="!z" */ - // 0x0E, 0x18, 0x30, 0x60, 0xCD, 0x8F, 0x06, 0x00, // /* code=251, hex=0xFB, ascii="!{" */ - // 0x00, 0xF1, 0xB3, 0x66, 0xCD, 0x80, 0x00, 0x00, // /* code=252, hex=0xFC, ascii="!|" */ - // 0x00, 0x71, 0x30, 0xC3, 0x0F, 0x80, 0x00, 0x00, // /* code=253, hex=0xFD, ascii="!}" */ - // 0x00, 0xF9, 0xF3, 0xE7, 0xC0, 0x00, 0x00, 0x00, // /* code=254, hex=0xFE, ascii="!~" */ - // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // /* code=255, hex=0xFF, ascii="!^Ÿ" */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" ", w=7 */ + 0x3F, 0xCF, 0x00, /* code=33, hex=0x21, ascii="!", w=2 */ + 0x06, 0xF7, 0x10, 0x00, 0x00, 0x00, /* code=34, hex=0x22, ascii=""", w=5 */ + 0x00, 0xD9, 0xB7, 0xF6, 0xDF, 0xDB, 0x36, 0x00, /* code=35, hex=0x23, ascii="#", w=7 */ + 0x10, 0xC7, 0xB0, 0x78, 0x3F, 0x8C, 0x20, /* code=36, hex=0x24, ascii="$", w=6 */ + 0xE2, 0x9E, 0xC6, 0x31, 0xFD, 0x47, 0x00, /* code=37, hex=0x25, ascii="%", w=6 */ + 0x73, 0x6D, 0x9C, 0xDF, 0x6D, 0x9F, 0x00, /* code=38, hex=0x26, ascii="&", w=6 */ + 0x0D, 0xEC, 0x00, 0x00, /* code=39, hex=0x27, ascii="'", w=3 */ + 0x03, 0x6C, 0xCC, 0x63, 0x00, /* code=40, hex=0x28, ascii="(", w=4 */ + 0x0C, 0x63, 0x33, 0x6C, 0x00, /* code=41, hex=0x29, ascii=")", w=4 */ + 0x00, 0x89, 0xB1, 0xCF, 0xE7, 0x1B, 0x22, 0x00, /* code=42, hex=0x2A, ascii="*", w=7 */ + 0x00, 0x03, 0x0C, 0xFF, 0xF3, 0x0C, 0x00, /* code=43, hex=0x2B, ascii="+", w=6 */ + 0x00, 0x00, 0x1B, 0xC0, /* code=44, hex=0x2C, ascii=",", w=3 */ + 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, /* code=45, hex=0x2D, ascii="-", w=5 */ + 0x00, 0x0F, 0x00, /* code=46, hex=0x2E, ascii=".", w=2 */ + 0x00, 0xC6, 0x63, 0x31, 0x98, 0x00, /* code=47, hex=0x2F, ascii="/", w=5 */ + 0x01, 0xEC, 0xF7, 0xEF, 0x3C, 0xDE, 0x00, /* code=48, hex=0x30, ascii="0", w=6 */ + 0x00, 0xCF, 0x0C, 0x30, 0xC3, 0x3F, 0x00, /* code=49, hex=0x31, ascii="1", w=6 */ + 0x01, 0xEC, 0xE3, 0x39, 0x8C, 0xFF, 0x00, /* code=50, hex=0x32, ascii="2", w=6 */ + 0x01, 0xEC, 0xC3, 0x38, 0x3C, 0xDE, 0x00, /* code=51, hex=0x33, ascii="3", w=6 */ + 0x00, 0x63, 0x9E, 0xDB, 0xF1, 0x8F, 0x00, /* code=52, hex=0x34, ascii="4", w=6 */ + 0x03, 0xFC, 0xF0, 0xF8, 0x3C, 0xDE, 0x00, /* code=53, hex=0x35, ascii="5", w=6 */ + 0x00, 0xE6, 0x30, 0xFB, 0x3C, 0xDE, 0x00, /* code=54, hex=0x36, ascii="6", w=6 */ + 0x03, 0xFC, 0xC3, 0x18, 0xC3, 0x0C, 0x00, /* code=55, hex=0x37, ascii="7", w=6 */ + 0x01, 0xEC, 0xF3, 0x7B, 0x3C, 0xDE, 0x00, /* code=56, hex=0x38, ascii="8", w=6 */ + 0x01, 0xEC, 0xF3, 0x7C, 0x31, 0x9C, 0x00, /* code=57, hex=0x39, ascii="9", w=6 */ + 0x0F, 0x0F, 0x00, /* code=58, hex=0x3A, ascii=":", w=2 */ + 0x01, 0xB0, 0x1B, 0xC0, /* code=59, hex=0x3B, ascii=";", w=3 */ + 0x00, 0x36, 0xC6, 0x30, 0x00, /* code=60, hex=0x3C, ascii="<", w=4 */ + 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x00, /* code=61, hex=0x3D, ascii="=", w=5 */ + 0x00, 0xC6, 0x36, 0xC0, 0x00, /* code=62, hex=0x3E, ascii=">", w=4 */ + 0x01, 0xEC, 0xC3, 0x18, 0xC0, 0x0C, 0x00, /* code=63, hex=0x3F, ascii="?", w=6 */ + 0x01, 0xEC, 0x77, 0xD7, 0x6C, 0x5E, 0x00, /* code=64, hex=0x40, ascii="@", w=6 */ + 0x00, 0x20, 0xE1, 0x46, 0xCF, 0xB1, 0xE3, 0x00, /* code=65, hex=0x41, ascii="A", w=7 */ + 0x03, 0xEC, 0xF3, 0xFB, 0x3C, 0xFE, 0x00, /* code=66, hex=0x42, ascii="B", w=6 */ + 0x01, 0xEC, 0xF0, 0xC3, 0x0C, 0xDE, 0x00, /* code=67, hex=0x43, ascii="C", w=6 */ + 0x03, 0xEC, 0xF3, 0xCF, 0x3C, 0xFE, 0x00, /* code=68, hex=0x44, ascii="D", w=6 */ + 0x03, 0xFC, 0xF0, 0xF3, 0x0C, 0xFF, 0x00, /* code=69, hex=0x45, ascii="E", w=6 */ + 0x03, 0xFC, 0xF0, 0xFB, 0x0C, 0x30, 0x00, /* code=70, hex=0x46, ascii="F", w=6 */ + 0x01, 0xEC, 0xF0, 0xDF, 0x3C, 0xDF, 0x00, /* code=71, hex=0x47, ascii="G", w=6 */ + 0x03, 0x3C, 0xF3, 0xFF, 0x3C, 0xF3, 0x00, /* code=72, hex=0x48, ascii="H", w=6 */ + 0x0F, 0x66, 0x66, 0x6F, 0x00, /* code=73, hex=0x49, ascii="I", w=4 */ + 0x00, 0xF1, 0x86, 0x1B, 0x6D, 0x9C, 0x00, /* code=74, hex=0x4A, ascii="J", w=6 */ + 0x03, 0x3D, 0xB6, 0xF3, 0x6D, 0xB3, 0x00, /* code=75, hex=0x4B, ascii="K", w=6 */ + 0x03, 0x0C, 0x30, 0xC3, 0x0C, 0xFF, 0x00, /* code=76, hex=0x4C, ascii="L", w=6 */ + 0x01, 0x8F, 0x1F, 0x7F, 0xFA, 0xF5, 0xEB, 0x00, /* code=77, hex=0x4D, ascii="M", w=7 */ + 0x03, 0x3E, 0xFB, 0xFF, 0x7C, 0xF3, 0x00, /* code=78, hex=0x4E, ascii="N", w=6 */ + 0x01, 0xEC, 0xF3, 0xCF, 0x3C, 0xDE, 0x00, /* code=79, hex=0x4F, ascii="O", w=6 */ + 0x03, 0xEC, 0xF3, 0xCF, 0xEC, 0x30, 0x00, /* code=80, hex=0x50, ascii="P", w=6 */ + 0x01, 0xEC, 0xF3, 0xCF, 0xBD, 0xDE, 0x0C, /* code=81, hex=0x51, ascii="Q", w=6 */ + 0x03, 0xEC, 0xF3, 0xDB, 0xCD, 0xB3, 0x00, /* code=82, hex=0x52, ascii="R", w=6 */ + 0x01, 0xEC, 0xF0, 0x78, 0x3C, 0xDE, 0x00, /* code=83, hex=0x53, ascii="S", w=6 */ + 0x03, 0xFB, 0x4C, 0x30, 0xC3, 0x1E, 0x00, /* code=84, hex=0x54, ascii="T", w=6 */ + 0x03, 0x3C, 0xF3, 0xCF, 0x3C, 0xDE, 0x00, /* code=85, hex=0x55, ascii="U", w=6 */ + 0x01, 0x8F, 0x1B, 0x66, 0xC7, 0x0E, 0x08, 0x00, /* code=86, hex=0x56, ascii="V", w=7 */ + 0x01, 0x8F, 0x5E, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=87, hex=0x57, ascii="W", w=7 */ + 0x03, 0x3C, 0xDE, 0x31, 0xEC, 0xF3, 0x00, /* code=88, hex=0x58, ascii="X", w=6 */ + 0x03, 0x3C, 0xF3, 0x78, 0xC3, 0x1E, 0x00, /* code=89, hex=0x59, ascii="Y", w=6 */ + 0x03, 0xFC, 0xC6, 0x31, 0x8C, 0xFF, 0x00, /* code=90, hex=0x5A, ascii="Z", w=6 */ + 0x0F, 0xCC, 0xCC, 0xCF, 0x00, /* code=91, hex=0x5B, ascii="[", w=4 */ + 0x06, 0x30, 0xC6, 0x18, 0xC3, 0x00, /* code=92, hex=0x5C, ascii="\", w=5 */ + 0x0F, 0x33, 0x33, 0x3F, 0x00, /* code=93, hex=0x5D, ascii="]", w=4 */ + 0x01, 0x1D, 0xB0, 0x00, 0x00, 0x00, /* code=94, hex=0x5E, ascii="^", w=5 */ + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, /* code=95, hex=0x5F, ascii="_", w=5 */ + 0x1B, 0x36, 0x00, 0x00, /* code=96, hex=0x60, ascii="`", w=3 */ + 0x00, 0x00, 0x1E, 0x0D, 0xFC, 0xDD, 0x00, /* code=97, hex=0x61, ascii="a", w=6 */ + 0x03, 0x0C, 0x3E, 0xCF, 0x3C, 0xEE, 0x00, /* code=98, hex=0x62, ascii="b", w=6 */ + 0x00, 0x00, 0x1E, 0xCF, 0x0C, 0xDE, 0x00, /* code=99, hex=0x63, ascii="c", w=6 */ + 0x00, 0x30, 0xDF, 0xCF, 0x3C, 0xDD, 0x00, /* code=100, hex=0x64, ascii="d", w=6 */ + 0x00, 0x00, 0x1E, 0xCF, 0xFC, 0x1E, 0x00, /* code=101, hex=0x65, ascii="e", w=6 */ + 0x00, 0xE6, 0xD8, 0xF9, 0x86, 0x3C, 0x00, /* code=102, hex=0x66, ascii="f", w=6 */ + 0x00, 0x00, 0x1D, 0xCF, 0x37, 0xC3, 0x78, /* code=103, hex=0x67, ascii="g", w=6 */ + 0x03, 0x0C, 0x36, 0xEF, 0x3C, 0xF3, 0x00, /* code=104, hex=0x68, ascii="h", w=6 */ + 0x66, 0x06, 0xE6, 0x6F, 0x00, /* code=105, hex=0x69, ascii="i", w=4 */ + 0x18, 0xC0, 0x37, 0x8E, 0x7B, 0x70, /* code=106, hex=0x6A, ascii="j", w=5 */ + 0x03, 0x0C, 0x33, 0xDB, 0xCD, 0xB3, 0x00, /* code=107, hex=0x6B, ascii="k", w=6 */ + 0x06, 0x66, 0x66, 0x6F, 0x00, /* code=108, hex=0x6C, ascii="l", w=4 */ + 0x00, 0x00, 0x03, 0x6F, 0xFA, 0xF5, 0xEB, 0x00, /* code=109, hex=0x6D, ascii="m", w=7 */ + 0x00, 0x00, 0x36, 0xEF, 0x3C, 0xF3, 0x00, /* code=110, hex=0x6E, ascii="n", w=6 */ + 0x00, 0x00, 0x1E, 0xCF, 0x3C, 0xDE, 0x00, /* code=111, hex=0x6F, ascii="o", w=6 */ + 0x00, 0x00, 0x3E, 0xCF, 0x3E, 0xF6, 0xC0, /* code=112, hex=0x70, ascii="p", w=6 */ + 0x00, 0x00, 0x1D, 0xCF, 0x3D, 0xDB, 0x0C, /* code=113, hex=0x71, ascii="q", w=6 */ + 0x00, 0x00, 0x13, 0xFD, 0x86, 0x3C, 0x00, /* code=114, hex=0x72, ascii="r", w=6 */ + 0x00, 0x00, 0x1E, 0xC1, 0xE0, 0xDE, 0x00, /* code=115, hex=0x73, ascii="s", w=6 */ + 0x00, 0x20, 0xC7, 0xE3, 0x06, 0x0D, 0x8E, 0x00, /* code=116, hex=0x74, ascii="t", w=7 */ + 0x00, 0x00, 0x33, 0xCF, 0x3D, 0xDB, 0x00, /* code=117, hex=0x75, ascii="u", w=6 */ + 0x00, 0x00, 0x06, 0x3C, 0x6D, 0x8E, 0x08, 0x00, /* code=118, hex=0x76, ascii="v", w=7 */ + 0x00, 0x00, 0x06, 0xBD, 0x6F, 0x9B, 0x22, 0x00, /* code=119, hex=0x77, ascii="w", w=7 */ + 0x00, 0x00, 0x06, 0x36, 0xC7, 0x1B, 0x63, 0x00, /* code=120, hex=0x78, ascii="x", w=7 */ + 0x00, 0x00, 0x33, 0xCD, 0xB3, 0xB6, 0x70, /* code=121, hex=0x79, ascii="y", w=6 */ + 0x00, 0x00, 0x3F, 0x0C, 0xC6, 0x3F, 0x00, /* code=122, hex=0x7A, ascii="z", w=6 */ + 0x01, 0xD8, 0xCC, 0x31, 0x87, 0x00, /* code=123, hex=0x7B, ascii="{", w=5 */ + 0xFF, 0x3F, 0x00, /* code=124, hex=0x7C, ascii="|", w=2 */ + 0x07, 0x0C, 0x61, 0x98, 0xDC, 0x00, /* code=125, hex=0x7D, ascii="}", w=5 */ + 0x00, 0x87, 0x77, 0x08, 0x00, 0x00, 0x00 /* code=126, hex=0x7E, ascii="~", w=6 */ }; diff --git a/wled00/src/font/console_font_7x9.wbf b/wled00/src/font/console_font_7x9.wbf new file mode 100644 index 0000000000000000000000000000000000000000..22da5a63baf02c98de8af0f248b74f791757d554 GIT binary patch literal 728 zcmX|9L2DCH5T5PJzOC@$7Q6(OrlG%JLtv}0O>TPe?yVq!oDx#-&_ILUT7;5Z3x@VD zqy*}z5Lwt)^@eDlpW@0&L-`|O^fX_=SAVJzr|lu{%T zh7|gOj{ILNh=iVyl2s0*|8r?@6|$}i);JQnghd<%bfoMS&%jS1AbGRI?8DpZ(ZHdl zUb|M<%X~TTvv*JEMWr>W98z*ZB+C6Fsba27^!h0HYOSKA=Apt-t4m}?NK7KXnB6CB za&zepi2`MN1+ej>y*a>p$i?Ep;HpU?n%*+Iux9`fc_~k!CENxB)Uz!zP14%%c6^&i zo7OSFce?D8>T>Va`|<`+=JVs=XiQ=f&fMRqPCW&`Nf>}(NT}uvGi9?jaz`ZGaPEd= zmP%Eks~xM-BC&oPRyx?n_Ry|1S6==4@r^`&Hm`>`2Cu)C6E+EhlcBn>?CBh#!Zo*#cP=TKAzt8Qy!VQ93E-8jr}-QZY_r~ zos7BvPXe?9$f}jV6g5AI^W^t(^cGQF`(HqeuU2#{{2vB(%N1$25=k>%6Q b@g}|`ze_?<7(Mrg??=%yP0S%5QuZIz5+x1}HR)2RxHV}64MGSKZ;Bvr2zquMUW-95 z92)uq-VkAXOSH7UO@#Kor+vfy&UeoF?z#8a&>72JA}XDUm=rO_xe#11A-Vi7qG-^i z6jF%jB->mfNQmrQ#K=Au8JBFPlb!U4q^oBcK>HP7hrbobZXuWQiz4^6g`hROt3Eqm zZ6JelNa;gUF0vKvwhU|425(If@7d6LF5<}&G}ndJPb0-LS`m{8Ovg$~>|UMK#&Kv5 z3YO==+7B${!EOe22l`DPCJEWiKu@?ZM?R7VfxM``!TeUUJj=U|`m&`$=vOwfdB>z@ zn1dnYN&N|?t6);w zMS5FKhAmCUU%0NDyugMAjf5MbhQ25GtntJc>KXsGBp%=~=CsH82Co7Gwl}%Ra%(er z4OtR4NGuy12kdIJP1*`>m7zj8Br+I!OB2|-?Pb;S2(KRT1)BWI3p|8;tH0!uAjUo+=$YfwLGfl6?&R<`q0`nnG zfSgAc$nUJwkq5Tpv#y~!_GO7@oyC~6&xA+%4Oy(o22-o-XGjTBU(Ee5nw zMS5FKhAmCUU%0NDyugMAjf5MbhQ25GtntJc>KXsGBp%=~=CsH82Co7Gwl}%Ra%(er z4OtR4NGuy12kdIJP1*`>m7zj8Br+I!OB2|-?Pb;S2(KRT1)BWI3p|8;tH0!uAjUo+=$YfwLGfl6?&R<`q0`nnG zfSgAc$nUJwkq5Tpv#y~!_GO7@oyC~6&xA+%4Oy(o22-o-XGjTBU(Ee5n Date: Wed, 25 Feb 2026 20:02:39 +0100 Subject: [PATCH 19/33] some code claenaup --- wled00/FX.cpp | 5 ++--- wled00/FX.h | 26 ++++++++++++-------------- wled00/FX_2Dfcn.cpp | 35 +++++++++++++++++------------------ 3 files changed, 31 insertions(+), 35 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 5bbe1b71fd..e71a9f34d7 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6302,14 +6302,13 @@ static const char _data_FX_MODE_2DBLOBS[] PROGMEM = "Blobs@!,# blobs,Blur,Trail; //////////////////////////// // 2D Scrolling text // //////////////////////////// - void mode_2Dscrollingtext(void) { if (!strip.isMatrix || !SEGMENT.is2D()) FX_FALLBACK_STATIC; // not a 2D set-up FontManager fontManager(&SEGMENT); const int cols = SEG_W; const int rows = SEG_H; - // generate time/date if there are any # tokens + // generate time/date if there are any # tokens or no segment name set char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'}; size_t result_pos = 0; char sec[5]; @@ -6346,7 +6345,7 @@ void mode_2Dscrollingtext(void) { token[j] = '\0'; int advance = 5; // number of chars to advance in 'text' after processing the token - // process token + // Process token char temp[32]; if (!strncmp_P(token,PSTR("#DATE"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d.%04d"):PSTR("%d.%d.%d"), day(localTime), month(localTime), year(localTime)); else if (!strncmp_P(token,PSTR("#DDMM"),5)) sprintf_P(temp, zero?PSTR("%02d.%02d") :PSTR("%d.%d"), day(localTime), month(localTime)); diff --git a/wled00/FX.h b/wled00/FX.h index 44bd9f30c4..63cde66829 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1070,8 +1070,8 @@ extern const char JSON_palette_names[]; #define LAST_ASCII_CHAR 127 #define FONT_HEADER_SIZE 12 /** - * Unified Font Format (Flash and RAM use IDENTICAL layout) - * + * Font format: + * * Header Layout (12 Bytes): * [0] Magic 'W' (0x57) * [1] Glyph height @@ -1084,11 +1084,10 @@ extern const char JSON_palette_names[]; * [8-11] Unicode Offset (32-bit little-endian) * * Followed by: - * - Width table (if variable width): [first..last] byte array + * - Width table (if variable width): [first..last] byte array omitted for fixed width fonts i.e. glyphs start after header * - Bitmap data: bit-packed glyphs - top left to bottom right, row by row, MSB first, see src/font files for example */ - // Glyph entry in RAM cache struct GlyphEntry { uint8_t code; // Glyph index (0-255) @@ -1096,7 +1095,7 @@ struct GlyphEntry { uint8_t height; // Height in pixels }; -// Segment metadata (stored BEFORE the font data in RAM) +// Segment metadata (stored BEFORE the font data in segment data) struct SegmentFontMetadata { uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none) @@ -1104,7 +1103,7 @@ struct SegmentFontMetadata { uint8_t glyphCount; // Number of glyphs cached }; -// Memory layout for cached fonts: +// Memory layout of cached font in segment data: // [SegmentFontMetadata] - 4 bytes // [GlyphEntry array] - 4 bytes each // [12-byte font header] - for compatibility and to store font info @@ -1114,7 +1113,6 @@ static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string lengt static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 static constexpr size_t FONT_NAME_BUFFER_SIZE = 16; // font names is /fontX.wbf -// Font header structure struct FontHeader { uint8_t height; uint8_t width; @@ -1127,11 +1125,11 @@ struct FontHeader { class FontManager { public: - FontManager(Segment* seg) : - _segment(seg), - _flashFont(nullptr), + FontManager(Segment* seg) : + _segment(seg), + _flashFont(nullptr), // pointer to font data in flash (if used) _fontNum(0), - _useFlashFont(false), + _useFileFont(false), _cacheNumbers(false), _headerValid(false), _fontBase(nullptr) {} @@ -1160,9 +1158,9 @@ class FontManager { private: Segment* _segment; + uint8_t _fontNum; // Font number (0-4) + bool _useFileFont; // true = file, false = flash const uint8_t* _flashFont; - uint8_t _fontNum; // Font number (0-4) - bool _useFlashFont; // true = flash, false = file bool _cacheNumbers; // Cached data for performance (non-static, per-instance) @@ -1194,7 +1192,7 @@ class FontManager { const uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); // Glyph index calculation (pure function, inline for speed) - static inline int32_t getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode); + static inline int32_t getGlyphIndex(uint32_t unicode, const FontHeader& hdr); // File font management void scanAvailableFonts(); diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index bef8e2f1ce..313242b2ab 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -596,12 +596,12 @@ static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { } // Pure glyph index calculator (inline for speed) -inline int32_t FontManager::getGlyphIndex(uint32_t unicode, uint8_t first, uint8_t last, uint32_t firstUnicode) { +inline int32_t FontManager::getGlyphIndex(uint32_t unicode, const FontHeader& hdr) { if (unicode <= LAST_ASCII_CHAR) { - if (unicode >= first && unicode <= last) return unicode - first; - } else if (firstUnicode > 0 && unicode >= firstUnicode) { - uint32_t adjusted = unicode - firstUnicode + LAST_ASCII_CHAR + 1; - if (adjusted >= first && adjusted <= last) return adjusted - first; + if (unicode >= hdr.first && unicode <= hdr.last) return unicode - hdr.first; + } else if (hdr.firstUnicode > 0 && unicode >= hdr.firstUnicode) { + uint32_t adjusted = unicode - hdr.firstUnicode + LAST_ASCII_CHAR + 1; + if (adjusted >= hdr.first && adjusted <= hdr.last) return adjusted - hdr.first; } return -1; } @@ -624,7 +624,7 @@ void FontManager::parseHeader() { // Get glyph width uint8_t FontManager::getGlyphWidth(uint32_t unicode) { if (!_headerValid) return 0; - int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); + int32_t idx = getGlyphIndex(unicode, _cachedHeader); if (idx < 0) return 0; // For cached fonts, look up in registry @@ -645,7 +645,7 @@ uint8_t FontManager::getGlyphWidth(uint32_t unicode) { const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { if (!_fontBase) return nullptr; - int32_t idx = getGlyphIndex(unicode, _cachedHeader.first, _cachedHeader.last, _cachedHeader.firstUnicode); + int32_t idx = getGlyphIndex(unicode, _cachedHeader); if (idx < 0) return nullptr; if (!_segment->data) return nullptr; @@ -710,7 +710,7 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { } // Determine which font to actually use (with fallback) uint8_t fontToUse = fontNum; - bool actualUseFlash = !useFile; + bool _useFileFont = useFile; // Check if requested font is available if (useFile && !(meta->availableFonts & (1 << fontNum))) { // Not available - find first available font @@ -723,13 +723,12 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { } if (fontToUse == 0xFF) { fontToUse = fontNum; // no custom fonts available, use flash font - actualUseFlash = true; + _useFileFont = false; } } // Store the actual font being used _fontNum = fontToUse; - _useFlashFont = actualUseFlash; - uint8_t cacheID = _fontNum | (_useFlashFont ? 0x80 : 0x00); + uint8_t cacheID = _fontNum | (_useFileFont ? 0x80 : 0x00); // Check if the ACTUAL font to use has changed if (cacheID != meta->cachedFontNum) { @@ -755,7 +754,7 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, if (_cacheNumbers) { static const char s_nums[] PROGMEM = "0123456789:. "; for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { - int32_t idx = getGlyphIndex(*p, hdr.first, hdr.last, hdr.firstUnicode); + int32_t idx = getGlyphIndex(*p, hdr); if (idx >= 0 && idx < 256) { outCodes[count++] = idx; } @@ -768,9 +767,9 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint32_t unicode = utf8_decode(&text[i], &charLen); if (!charLen) break; // invalid input, stop processing i += charLen; - int32_t idx = getGlyphIndex(unicode, hdr.first, hdr.last, hdr.firstUnicode); + int32_t idx = getGlyphIndex(unicode, hdr); if (idx < 0) { - idx = getGlyphIndex('?', hdr.first, hdr.last, hdr.firstUnicode); + idx = getGlyphIndex('?', hdr); } if (idx >= 0 && idx < 256) { // Add if unique @@ -849,7 +848,7 @@ void FontManager::rebuildCache(const char* text) { } File file; - if (!_useFlashFont) { + if (_useFileFont) { // Build filename from font number char fileName[FONT_NAME_BUFFER_SIZE]; getFontFileName(_fontNum, fileName, sizeof(fileName)); @@ -870,7 +869,7 @@ void FontManager::rebuildCache(const char* text) { file = WLED_FS.open(fileName, "r"); if (file) { _fontNum = i; // Update to fallback font - savedMeta.cachedFontNum = i; + savedMeta.cachedFontNum = i | 0x80; break; } } @@ -879,8 +878,8 @@ void FontManager::rebuildCache(const char* text) { } if (!file) { - _useFlashFont = true; // Fallback straight to flash font - savedMeta.cachedFontNum = _fontNum | 0x80; + _useFileFont = false; // Fallback straight to flash font + savedMeta.cachedFontNum = _fontNum; } } From c66d697f64504dc6750747e99674bd5a5661ba85 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Thu, 26 Feb 2026 10:27:54 +0100 Subject: [PATCH 20/33] started code cleanup --- wled00/FX.h | 15 ++----- wled00/FX_2Dfcn.cpp | 100 +++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 68 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 63cde66829..eb62804838 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1098,7 +1098,7 @@ struct GlyphEntry { // Segment metadata (stored BEFORE the font data in segment data) struct SegmentFontMetadata { uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) - uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none) + uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none, highest bit set = file font) uint8_t fontsScanned; // 1 if filesystem scanned uint8_t glyphCount; // Number of glyphs cached }; @@ -1136,16 +1136,7 @@ class FontManager { bool loadFont(uint8_t fontNum, const char* text, bool useFile); void cacheNumbers(bool cache) { _cacheNumbers = cache; } - void prepare(const char* text); - - inline void beginFrame() { - if (!_headerValid) { - updateFontBase(); - if (_fontBase) { - parseHeader(); - } - } - } + void cacheGlyphs(const char* text); // Get dimensions (use cached header) inline uint8_t getFontHeight() { return _cachedHeader.height; } @@ -1183,7 +1174,7 @@ class FontManager { } } - // Metadata access (RAM only) + // Metadata access SegmentFontMetadata* getMetadata() { return _segment->data ? (SegmentFontMetadata*)_segment->data : nullptr; } diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 313242b2ab..78771a952c 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -691,60 +691,46 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { case 4: _flashFont = font_6x12; break; } invalidateHeader(); + if (_segment->call == 0) { + _segment->allocateData(sizeof(SegmentFontMetadata)); // allocates memory and/or sets it to 0 + } SegmentFontMetadata* meta = getMetadata(); - // Ensure segment data exists - if (!meta) { - if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { - return false; - } - meta = getMetadata(); - memset(meta, 0, sizeof(SegmentFontMetadata)); - meta->cachedFontNum = 0xFF; - meta->fontsScanned = 0; - } + if (!meta) + return false; // ensure segment data exists - // Scan filesystem only if not already scanned - if (!meta->fontsScanned) { - scanAvailableFonts(); - } - // Determine which font to actually use (with fallback) - uint8_t fontToUse = fontNum; - bool _useFileFont = useFile; - // Check if requested font is available - if (useFile && !(meta->availableFonts & (1 << fontNum))) { - // Not available - find first available font - fontToUse = 0xFF; - for (int i = 0; i < MAX_FONTS; i++) { - if (meta->availableFonts & (1 << i)) { - fontToUse = i; - break; - } + _fontNum = fontNum; // store font to be used + if (useFile) { + if (!meta->fontsScanned) { + scanAvailableFonts(); // scan filesystem if not already scanned } - if (fontToUse == 0xFF) { - fontToUse = fontNum; // no custom fonts available, use flash font - _useFileFont = false; + // Determine which font to actually use (with fallback) + uint8_t fontToUse = fontNum; + _useFileFont = useFile; + // Check if requested font is available + if (!(meta->availableFonts & (1 << fontNum))) { + // Not available - find first available font + _fontNum = 0xFF; + for (int i = 0; i < MAX_FONTS; i++) { + if (meta->availableFonts & (1 << i)) { + _fontNum = i; + break; + } + } + if (_fontNum == 0xFF) { + _fontNum = fontNum; // no custom fonts available, use flash font + _useFileFont = false; + } } } - // Store the actual font being used - _fontNum = fontToUse; - uint8_t cacheID = _fontNum | (_useFileFont ? 0x80 : 0x00); - // Check if the ACTUAL font to use has changed + uint8_t cacheID = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash + if (cacheID != meta->cachedFontNum) { - // Font changed - clear cache but preserve scan results - uint8_t avail = meta->availableFonts; - uint8_t scanned = meta->fontsScanned; - if (!_segment->allocateData(sizeof(SegmentFontMetadata))) { - return false; - } - meta = getMetadata(); - meta->availableFonts = avail; - meta->cachedFontNum = cacheID; - meta->fontsScanned = scanned; - meta->glyphCount = 0; + meta->cachedFontNum = cacheID; // new font + meta->glyphCount = 0; // invalidate cache and rebuild with new font } - prepare(text); + cacheGlyphs(text); // prepare cache with needed glyphs return true; } @@ -786,7 +772,7 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, return count; } -void FontManager::prepare(const char* text) { +void FontManager::cacheGlyphs(const char* text) { if (!text) return; // Helper to ensure header is valid @@ -802,19 +788,21 @@ void FontManager::prepare(const char* text) { return true; }; - // Check if cache exists - if (!_segment->data) { - rebuildCache(text); - return; - } SegmentFontMetadata* meta = getMetadata(); - // If glyphCount is 0, cache is empty - rebuild - if (meta->glyphCount == 0 || !checkHeader()) { + // if glyphCount is 0, cache is empty - rebuild + if (meta->glyphCount == 0) { rebuildCache(text); - return; } - // Check if all needed glyphs are present + // TODO: this assumes a font is cached, if not, this can read out of bounds of segment data, maybe better track it elsewhere? after rebuilding? + if (!_headerValid) { + updateFontBase(); + if (_fontBase) { + parseHeader(); + } + } + + // check if all needed glyphs for the text are present in cache uint8_t neededCodes[MAX_CACHED_GLYPHS]; uint8_t neededCount = collectNeededCodes(text, _cachedHeader, neededCodes); @@ -935,7 +923,7 @@ void FontManager::rebuildCache(const char* text) { // Calculate size: metadata + registry + header + bitmaps uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); - size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; // Just the header, no width table needed + size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; From 3804f3eb2a4174cd3b0e040faeedf7ad343366e1 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Thu, 26 Feb 2026 13:42:23 +0100 Subject: [PATCH 21/33] more code cleanup, remove obsolete variables and functions --- wled00/FX.cpp | 2 +- wled00/FX.h | 55 ++++------- wled00/FX_2Dfcn.cpp | 229 ++++++++++++++++---------------------------- 3 files changed, 102 insertions(+), 184 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index e71a9f34d7..e8f051dfa9 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6392,7 +6392,7 @@ void mode_2Dscrollingtext(void) { const bool isRotated = (rotate == 1 || rotate == -1); // +/- 90° rotated, swap width and height for calculations // Load the font - fontManager.loadFont(fontNum, text, useCustomFont); + if (!fontManager.loadFont(fontNum, text, useCustomFont)) return; // note: FontManageraccess can lead to crashes if font loading fails due to low heap // Get font dimensions uint8_t glyphHeight = fontManager.getFontHeight(); diff --git a/wled00/FX.h b/wled00/FX.h index eb62804838..198b11f450 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1105,33 +1105,35 @@ struct SegmentFontMetadata { // Memory layout of cached font in segment data: // [SegmentFontMetadata] - 4 bytes -// [GlyphEntry array] - 4 bytes each -// [12-byte font header] - for compatibility and to store font info +// [GlyphEntry array] +// [12-byte font header] - copy of the relevant font header data // [Bitmap data] - sequential, matches registry order static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string length is 64 chars so this is absolute worst case static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 static constexpr size_t FONT_NAME_BUFFER_SIZE = 16; // font names is /fontX.wbf +// font header, identical to wbf header, size must be FONT_HEADER_SIZE struct FontHeader { - uint8_t height; + uint8_t magic; // should be 'W' (0x57) + uint8_t height; // TODO: should we use the padding bytes and store a full copy of the header? might make copying the header easier? uint8_t width; uint8_t spacing; uint8_t flags; uint8_t first; uint8_t last; + uint8_t reserved; // should be 0x00 uint32_t firstUnicode; }; +static_assert(sizeof(FontHeader) == FONT_HEADER_SIZE, "FontHeader size must be exactly FONT_HEADER_SIZE bytes"); class FontManager { public: FontManager(Segment* seg) : _segment(seg), - _flashFont(nullptr), // pointer to font data in flash (if used) _fontNum(0), _useFileFont(false), _cacheNumbers(false), - _headerValid(false), _fontBase(nullptr) {} bool loadFont(uint8_t fontNum, const char* text, bool useFile); @@ -1139,9 +1141,9 @@ class FontManager { void cacheGlyphs(const char* text); // Get dimensions (use cached header) - inline uint8_t getFontHeight() { return _cachedHeader.height; } - inline uint8_t getFontWidth() { return _cachedHeader.width; } - inline uint8_t getFontSpacing() { return _cachedHeader.spacing; } + inline uint8_t getFontHeight() { return reinterpret_cast(_fontBase)->height; } + inline uint8_t getFontWidth() { return reinterpret_cast(_fontBase)->width; } + inline uint8_t getFontSpacing() { return reinterpret_cast(_fontBase)->spacing; } uint8_t getGlyphWidth(uint32_t unicode); // Rendering @@ -1151,44 +1153,29 @@ class FontManager { Segment* _segment; uint8_t _fontNum; // Font number (0-4) bool _useFileFont; // true = file, false = flash - const uint8_t* _flashFont; bool _cacheNumbers; + uint8_t* _fontBase; // pointer to start of font data (header + bitmaps) in segment data - // Cached data for performance (non-static, per-instance) - bool _headerValid; - FontHeader _cachedHeader; - const uint8_t* _fontBase; - - // Invalidate cached header (call when font changes) - inline void invalidateHeader() { - _headerValid = false; - } - - inline void updateFontBase() { - if (_segment->data) { - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; - // Font header starts after metadata + registry - _fontBase = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); - } else { - _fontBase = nullptr; - } + // get metadata pointer + SegmentFontMetadata* getMetadata() { + return (SegmentFontMetadata*)_segment->data; } - // Metadata access - SegmentFontMetadata* getMetadata() { - return _segment->data ? (SegmentFontMetadata*)_segment->data : nullptr; + void updateFontBase() { + SegmentFontMetadata* meta = getMetadata(); + // font data (header + glyph bitmaps) starts after metadata + registry + _fontBase = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); } - void parseHeader(); - const uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); + uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); // Glyph index calculation (pure function, inline for speed) - static inline int32_t getGlyphIndex(uint32_t unicode, const FontHeader& hdr); + int32_t getGlyphIndex(uint32_t unicode, FontHeader* hdr); // File font management void scanAvailableFonts(); void rebuildCache(const char* text); - uint8_t collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes); + uint8_t collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes); }; #endif diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 78771a952c..e231e29d80 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -559,8 +559,6 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3 } } -// Segment::wu_pixel implementation is next - #define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8)) void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu_pixel procedure by reddit u/sutaburosu if (!isActive()) return; // not active @@ -595,36 +593,21 @@ static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { strcat_P(buffer, PSTR(".wbf")); } -// Pure glyph index calculator (inline for speed) -inline int32_t FontManager::getGlyphIndex(uint32_t unicode, const FontHeader& hdr) { +// glyph index calculator +int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* hdr) { if (unicode <= LAST_ASCII_CHAR) { - if (unicode >= hdr.first && unicode <= hdr.last) return unicode - hdr.first; - } else if (hdr.firstUnicode > 0 && unicode >= hdr.firstUnicode) { - uint32_t adjusted = unicode - hdr.firstUnicode + LAST_ASCII_CHAR + 1; - if (adjusted >= hdr.first && adjusted <= hdr.last) return adjusted - hdr.first; + if (unicode >= hdr->first && unicode <= hdr->last) return unicode - hdr->first; + } else if (hdr->firstUnicode > 0 && unicode >= hdr->firstUnicode) { + uint32_t adjusted = unicode - hdr->firstUnicode + LAST_ASCII_CHAR + 1; + if (adjusted >= hdr->first && adjusted <= hdr->last) return adjusted - hdr->first; } return -1; } -void FontManager::parseHeader() { - _cachedHeader.height = _fontBase[1]; - _cachedHeader.width = _fontBase[2]; - _cachedHeader.spacing = _fontBase[3]; - _cachedHeader.flags = _fontBase[4]; - _cachedHeader.first = _fontBase[5]; - _cachedHeader.last = _fontBase[6]; - // [7] reserved: 0x00 - _cachedHeader.firstUnicode = (uint32_t)(_fontBase[8]) | - ((uint32_t)(_fontBase[9]) << 8) | - ((uint32_t)(_fontBase[10]) << 16) | - ((uint32_t)(_fontBase[11]) << 24); - _headerValid = true; -} - // Get glyph width uint8_t FontManager::getGlyphWidth(uint32_t unicode) { - if (!_headerValid) return 0; - int32_t idx = getGlyphIndex(unicode, _cachedHeader); + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); if (idx < 0) return 0; // For cached fonts, look up in registry @@ -642,10 +625,9 @@ uint8_t FontManager::getGlyphWidth(uint32_t unicode) { } // Get glyph bitmap -const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { - if (!_fontBase) return nullptr; - - int32_t idx = getGlyphIndex(unicode, _cachedHeader); +uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); if (idx < 0) return nullptr; if (!_segment->data) return nullptr; @@ -666,6 +648,7 @@ const uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, return nullptr; // Glyph not found in cache } +// scan file system for available fonts void FontManager::scanAvailableFonts() { SegmentFontMetadata* meta = getMetadata(); if (!meta) return; @@ -680,20 +663,10 @@ void FontManager::scanAvailableFonts() { meta->fontsScanned = 1; } +// load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { _fontNum = fontNum; - switch (_fontNum) { - default: - case 0: _flashFont = font_tom_thumb_6px; break; - case 1: _flashFont = font_TinyUnicode_8px; break; - case 2: _flashFont = console_font_6x8; break; - case 3: _flashFont = console_font_7x9; break; - case 4: _flashFont = font_6x12; break; - } - invalidateHeader(); - if (_segment->call == 0) { - _segment->allocateData(sizeof(SegmentFontMetadata)); // allocates memory and/or sets it to 0 - } + _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0 SegmentFontMetadata* meta = getMetadata(); if (!meta) @@ -704,13 +677,13 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { if (!meta->fontsScanned) { scanAvailableFonts(); // scan filesystem if not already scanned } - // Determine which font to actually use (with fallback) + // determine which font to actually use (with fallback) uint8_t fontToUse = fontNum; _useFileFont = useFile; - // Check if requested font is available + // check if requested font is available if (!(meta->availableFonts & (1 << fontNum))) { // Not available - find first available font - _fontNum = 0xFF; + _fontNum = 0xFF; // invalidate for (int i = 0; i < MAX_FONTS; i++) { if (meta->availableFonts & (1 << i)) { _fontNum = i; @@ -734,7 +707,7 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { return true; } -uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, uint8_t* outCodes) { +uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { uint8_t count = 0; // Pre-add numbers if caching (for clock use without constant re-caching) if (_cacheNumbers) { @@ -775,36 +748,20 @@ uint8_t FontManager::collectNeededCodes(const char* text, const FontHeader& hdr, void FontManager::cacheGlyphs(const char* text) { if (!text) return; - // Helper to ensure header is valid - auto checkHeader = [this]() -> bool { - if (!_headerValid) { - updateFontBase(); - if (_fontBase) { - parseHeader(); - return true; - } - return false; - } - return true; - }; - - SegmentFontMetadata* meta = getMetadata(); + SegmentFontMetadata* meta = getMetadata(); // loadFont ensures pointer is valid // if glyphCount is 0, cache is empty - rebuild if (meta->glyphCount == 0) { rebuildCache(text); + return; // cache built, we are done } - // TODO: this assumes a font is cached, if not, this can read out of bounds of segment data, maybe better track it elsewhere? after rebuilding? - if (!_headerValid) { - updateFontBase(); - if (_fontBase) { - parseHeader(); - } - } + // if there is a cached font, update the pointers + updateFontBase(); + FontHeader* hdr = reinterpret_cast(_fontBase); // check if all needed glyphs for the text are present in cache uint8_t neededCodes[MAX_CACHED_GLYPHS]; - uint8_t neededCount = collectNeededCodes(text, _cachedHeader, neededCodes); + uint8_t neededCount = collectNeededCodes(text, hdr, neededCodes); GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); for (uint8_t k = 0; k < neededCount; k++) { @@ -818,22 +775,21 @@ void FontManager::cacheGlyphs(const char* text) { } if (!found) { - // Missing glyph - rebuild cache - rebuildCache(text); + rebuildCache(text); // missing glyph - rebuild cache return; } } - // All glyphs present, cache is valid } void FontManager::rebuildCache(const char* text) { if (!text) return; - // Preserve metadata - SegmentFontMetadata savedMeta = {0, 0xFF, 0, 0}; - if (_segment->data) { - memcpy(&savedMeta, _segment->data, sizeof(SegmentFontMetadata)); - } + // Preserve metadata (function is only called if segment data is allocated so no null check needed) + SegmentFontMetadata savedMeta; + SegmentFontMetadata* meta = getMetadata(); + meta->glyphCount = 0; // invalidates cached font + memcpy(&savedMeta, meta, sizeof(SegmentFontMetadata)); + savedMeta.cachedFontNum = 0xFF; // invalidate cache File file; if (_useFileFont) { @@ -846,20 +802,16 @@ void FontManager::rebuildCache(const char* text) { #endif file = WLED_FS.open(fileName, "r"); - // Fallback logic - try other available fonts + // fallback logic - try other available fonts if (!file) { - SegmentFontMetadata* meta = getMetadata(); - if (meta) { - for (int i = 0; i < MAX_FONTS; i++) { - if (i == _fontNum) continue; // Already tried this one - if (meta->availableFonts & (1 << i)) { - getFontFileName(i, fileName, sizeof(fileName)); - file = WLED_FS.open(fileName, "r"); - if (file) { - _fontNum = i; // Update to fallback font - savedMeta.cachedFontNum = i | 0x80; - break; - } + for (int i = 0; i < MAX_FONTS; i++) { + if (meta->availableFonts & (1 << i)) { + getFontFileName(i, fileName, sizeof(fileName)); + file = WLED_FS.open(fileName, "r"); + if (file) { + _fontNum = i; // Update to fallback font + savedMeta.cachedFontNum = i | 0x80; + break; } } } @@ -870,135 +822,114 @@ void FontManager::rebuildCache(const char* text) { savedMeta.cachedFontNum = _fontNum; } } + const uint8_t* flashFont; + if (!_useFileFont) { + switch (_fontNum) { + default: + case 0: flashFont = font_tom_thumb_6px; break; + case 1: flashFont = font_TinyUnicode_8px; break; + case 2: flashFont = console_font_6x8; break; + case 3: flashFont = console_font_7x9; break; + case 4: flashFont = font_6x12; break; + } + } - if (!file && !_flashFont) return; - - // Read header + // read wbf font header FontHeader hdr; if (file) { - if (file.read() != 0x57) { file.close(); return; } - hdr.height = file.read(); - hdr.width = file.read(); - hdr.spacing = file.read(); - hdr.flags = file.read(); - hdr.first = file.read(); - hdr.last = file.read(); - file.read(); // skip byte 7 (reserved) - file.read((uint8_t*)&hdr.firstUnicode, 4); + if (file.read((uint8_t*)&hdr, FONT_HEADER_SIZE) != FONT_HEADER_SIZE) { file.close(); return; } // header incomplete + if (hdr.magic != 0x57) { file.close(); return; } // invalid header + if (hdr.last < hdr.first) { file.close(); return; } // Invalid header } else { - if (pgm_read_byte_near(_flashFont) != 0x57) return; - hdr.height = pgm_read_byte_near(_flashFont + 1); - hdr.width = pgm_read_byte_near(_flashFont + 2); - hdr.spacing = pgm_read_byte_near(_flashFont + 3); - hdr.flags = pgm_read_byte_near(_flashFont + 4); - hdr.first = pgm_read_byte_near(_flashFont + 5); - hdr.last = pgm_read_byte_near(_flashFont + 6); - hdr.firstUnicode = (uint32_t)(pgm_read_byte_near(_flashFont + 8)) | - ((uint32_t)(pgm_read_byte_near(_flashFont + 9)) << 8) | - ((uint32_t)(pgm_read_byte_near(_flashFont + 10)) << 16) | - ((uint32_t)(pgm_read_byte_near(_flashFont + 11)) << 24); + memcpy_P(&hdr, flashFont, FONT_HEADER_SIZE); // assumes built in fonts are in a valid, compatible format } // Collect needed glyphs uint8_t neededCodes[MAX_CACHED_GLYPHS]; - uint8_t neededCount = collectNeededCodes(text, hdr, neededCodes); - if (hdr.last < hdr.first) { if (file) file.close(); return; } // Invalid header + uint8_t neededCount = collectNeededCodes(text, &hdr, neededCodes); uint8_t numGlyphs = hdr.last - hdr.first + 1; uint8_t widthTable[numGlyphs]; // Read width table if (hdr.flags & 0x01) { if (file) { - if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table incomplete + if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table starts directly after header if used } else { - for (uint8_t k = 0; k < numGlyphs; k++) { - widthTable[k] = pgm_read_byte_near(_flashFont + FONT_HEADER_SIZE + k); - } + memcpy_P(widthTable, flashFont + FONT_HEADER_SIZE, numGlyphs); // assumes built in fonts are in a valid, compatible format } } else { for (uint8_t k = 0; k < numGlyphs; k++) { - widthTable[k] = hdr.width; + widthTable[k] = hdr.width; // fixed width, fill with given width from header } } - // Calculate size: metadata + registry + header + bitmaps - uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); + // calculate total size for cache: metadata + registry + header + bitmaps size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; if (code < numGlyphs) { uint16_t bits = widthTable[code] * hdr.height; - ramFontSize += (bits + 7) / 8; + ramFontSize += (bits + 7) / 8; // add bitmap size for each needed glyph } } - // Allocate RAM if (!_segment->allocateData(ramFontSize)) { if (file) file.close(); return; } // Write metadata - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + meta = getMetadata(); // get pointer again in case segment was reallocated meta->availableFonts = savedMeta.availableFonts; meta->cachedFontNum = savedMeta.cachedFontNum; meta->fontsScanned = savedMeta.fontsScanned; - meta->glyphCount = neededCount; + meta->glyphCount = neededCount; // glyph count is used to determine if cache is valid. If file is corrupted, ram cache is still large enough to not cause crashes - uint8_t* ptr = _segment->data + sizeof(SegmentFontMetadata); + uint8_t* dataptr = _segment->data + sizeof(SegmentFontMetadata); // Write registry (GlyphEntry array) - GlyphEntry* registry = (GlyphEntry*)ptr; + GlyphEntry* registry = (GlyphEntry*)dataptr; for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; registry[k].code = code; registry[k].width = widthTable[code]; registry[k].height = hdr.height; } - ptr += neededCount * sizeof(GlyphEntry); + dataptr += neededCount * sizeof(GlyphEntry); - // Write font header (for compatibility and easy access to spacing/firstUnicode) - if (file) { - file.seek(0); // Go back to start of file - file.read(ptr, FONT_HEADER_SIZE); // could also write it from fileHdr, but this is simpler - } else { - for (int i = 0; i < FONT_HEADER_SIZE; i++) { - ptr[i] = pgm_read_byte_near(_flashFont + i); - } - } - ptr += FONT_HEADER_SIZE; + // write font header + memcpy(dataptr, &hdr, FONT_HEADER_SIZE); - // Write bitmap data in registry order (no sorting needed) + dataptr += FONT_HEADER_SIZE; + + // write bitmap data to cache in registry order + uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); // bitmap data in wbf font starts after header and width table (if used) for (uint8_t k = 0; k < neededCount; k++) { - uint8_t code = neededCodes[k]; - uint16_t bits = widthTable[code] * hdr.height; + uint8_t glyphIdx = neededCodes[k]; // neededCodes contais index of the glyph in the font, not the raw unicode value + uint16_t bits = widthTable[glyphIdx] * hdr.height; uint16_t bytes = (bits + 7) / 8; // Calculate file offset uint32_t offset = dataStart; - for (uint8_t j = 0; j < code; j++) { + for (uint8_t j = 0; j < glyphIdx; j++) { uint16_t b = widthTable[j] * hdr.height; offset += (b + 7) / 8; } // Read from file or flash if (file) { file.seek(offset); - file.read(ptr, bytes); + file.read(dataptr, bytes); } else { - for (uint16_t i = 0; i < bytes; i++) { - ptr[i] = pgm_read_byte_near(_flashFont + offset + i); - } + memcpy_P(dataptr, flashFont + offset, bytes); } - ptr += bytes; + dataptr += bytes; } - + if (file) file.close(); - invalidateHeader(); // Mark as invalid, so it gets re-parsed from cache next frame updateFontBase(); // Set up pointer to cached header/bitmaps } void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { - if (!_fontBase) return; uint8_t w, h; const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); if (!bitmap || w == 0) return; From f8d0a5c2276b95476f3c3755e931bd37457ec20b Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Thu, 26 Feb 2026 13:50:27 +0100 Subject: [PATCH 22/33] prevent crash if font file is invalid --- wled00/FX_2Dfcn.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index e231e29d80..b8d6faa7e5 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -704,6 +704,10 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { meta->glyphCount = 0; // invalidate cache and rebuild with new font } cacheGlyphs(text); // prepare cache with needed glyphs + meta = getMetadata(); // reload metadata after potential cache rebuild + if (meta->glyphCount == 0) { + return false; // cache build failed (invalid font file) + } return true; } @@ -783,8 +787,7 @@ void FontManager::cacheGlyphs(const char* text) { void FontManager::rebuildCache(const char* text) { if (!text) return; - - // Preserve metadata (function is only called if segment data is allocated so no null check needed) + // preserve metadata (function is only called if segment data is allocated so no null check needed) SegmentFontMetadata savedMeta; SegmentFontMetadata* meta = getMetadata(); meta->glyphCount = 0; // invalidates cached font From 6092ff714ba192990ec6baf943468166475181b6 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Thu, 26 Feb 2026 14:02:53 +0100 Subject: [PATCH 23/33] reorder functions, minor cleanup --- wled00/FX_2Dfcn.cpp | 258 ++++++++++++++++++++++---------------------- 1 file changed, 127 insertions(+), 131 deletions(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index b8d6faa7e5..774b2cf3e1 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -593,76 +593,6 @@ static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { strcat_P(buffer, PSTR(".wbf")); } -// glyph index calculator -int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* hdr) { - if (unicode <= LAST_ASCII_CHAR) { - if (unicode >= hdr->first && unicode <= hdr->last) return unicode - hdr->first; - } else if (hdr->firstUnicode > 0 && unicode >= hdr->firstUnicode) { - uint32_t adjusted = unicode - hdr->firstUnicode + LAST_ASCII_CHAR + 1; - if (adjusted >= hdr->first && adjusted <= hdr->last) return adjusted - hdr->first; - } - return -1; -} - -// Get glyph width -uint8_t FontManager::getGlyphWidth(uint32_t unicode) { - FontHeader* hdr = reinterpret_cast(_fontBase); - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) return 0; - - // For cached fonts, look up in registry - if (!_segment->data) return 0; - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - - for (uint8_t k = 0; k < meta->glyphCount; k++) { - if (registry[k].code == idx) { - return registry[k].width; - } - } - - return 0; // Not found in cache -} - -// Get glyph bitmap -uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { - FontHeader* hdr = reinterpret_cast(_fontBase); - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) return nullptr; - - if (!_segment->data) return nullptr; - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - - uint32_t bitmapOffset = 0; - for (uint8_t k = 0; k < meta->glyphCount; k++) { - if (registry[k].code == idx) { - outWidth = registry[k].width; - outHeight = registry[k].height; - return _fontBase + FONT_HEADER_SIZE + bitmapOffset; - } - // Accumulate offset to next glyph - uint16_t bits = registry[k].width * registry[k].height; - bitmapOffset += (bits + 7) / 8; - } - return nullptr; // Glyph not found in cache -} - -// scan file system for available fonts -void FontManager::scanAvailableFonts() { - SegmentFontMetadata* meta = getMetadata(); - if (!meta) return; - meta->availableFonts = 0; - for (int i = 0; i < MAX_FONTS; i++) { - char fileName[FONT_NAME_BUFFER_SIZE]; - getFontFileName(i, fileName, sizeof(fileName)); - if (WLED_FS.exists(fileName)) { - meta->availableFonts |= (1 << i); - } - } - meta->fontsScanned = 1; -} - // load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { _fontNum = fontNum; @@ -680,9 +610,8 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { // determine which font to actually use (with fallback) uint8_t fontToUse = fontNum; _useFileFont = useFile; - // check if requested font is available + // check if requested font is available - find first available font if not if (!(meta->availableFonts & (1 << fontNum))) { - // Not available - find first available font _fontNum = 0xFF; // invalidate for (int i = 0; i < MAX_FONTS; i++) { if (meta->availableFonts & (1 << i)) { @@ -706,49 +635,12 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { cacheGlyphs(text); // prepare cache with needed glyphs meta = getMetadata(); // reload metadata after potential cache rebuild if (meta->glyphCount == 0) { + errorFlag = ERR_NOT_IMPL; // TODO: need a better error code if more codes are added return false; // cache build failed (invalid font file) } return true; } -uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { - uint8_t count = 0; - // Pre-add numbers if caching (for clock use without constant re-caching) - if (_cacheNumbers) { - static const char s_nums[] PROGMEM = "0123456789:. "; - for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { - int32_t idx = getGlyphIndex(*p, hdr); - if (idx >= 0 && idx < 256) { - outCodes[count++] = idx; - } - } - } - // Parse text - size_t i = 0, len = strlen(text); - while (i < len && count < MAX_CACHED_GLYPHS) { - uint8_t charLen; - uint32_t unicode = utf8_decode(&text[i], &charLen); - if (!charLen) break; // invalid input, stop processing - i += charLen; - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) { - idx = getGlyphIndex('?', hdr); - } - if (idx >= 0 && idx < 256) { - // Add if unique - bool exists = false; - for (uint8_t k = 0; k < count; k++) { - if (outCodes[k] == idx) { - exists = true; - break; - } - } - if (!exists) outCodes[count++] = idx; - } - } - return count; -} - void FontManager::cacheGlyphs(const char* text) { if (!text) return; @@ -769,7 +661,7 @@ void FontManager::cacheGlyphs(const char* text) { GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); for (uint8_t k = 0; k < neededCount; k++) { - // Look up in registry + // look up glyph in registry bool found = false; for (uint8_t j = 0; j < meta->glyphCount; j++) { if (registry[j].code == neededCodes[k]) { @@ -796,7 +688,7 @@ void FontManager::rebuildCache(const char* text) { File file; if (_useFileFont) { - // Build filename from font number + // build filename from font number char fileName[FONT_NAME_BUFFER_SIZE]; getFontFileName(_fontNum, fileName, sizeof(fileName)); @@ -812,7 +704,7 @@ void FontManager::rebuildCache(const char* text) { getFontFileName(i, fileName, sizeof(fileName)); file = WLED_FS.open(fileName, "r"); if (file) { - _fontNum = i; // Update to fallback font + _fontNum = i; // update to fallback font savedMeta.cachedFontNum = i | 0x80; break; } @@ -821,20 +713,20 @@ void FontManager::rebuildCache(const char* text) { } if (!file) { - _useFileFont = false; // Fallback straight to flash font + _useFileFont = false; // fallback straight to flash font savedMeta.cachedFontNum = _fontNum; } } + + // determine flash font to use (not used if using file font) const uint8_t* flashFont; - if (!_useFileFont) { - switch (_fontNum) { - default: - case 0: flashFont = font_tom_thumb_6px; break; - case 1: flashFont = font_TinyUnicode_8px; break; - case 2: flashFont = console_font_6x8; break; - case 3: flashFont = console_font_7x9; break; - case 4: flashFont = font_6x12; break; - } + switch (_fontNum) { + default: + case 0: flashFont = font_tom_thumb_6px; break; + case 1: flashFont = font_TinyUnicode_8px; break; + case 2: flashFont = console_font_6x8; break; + case 3: flashFont = console_font_7x9; break; + case 4: flashFont = font_6x12; break; } // read wbf font header @@ -847,13 +739,13 @@ void FontManager::rebuildCache(const char* text) { memcpy_P(&hdr, flashFont, FONT_HEADER_SIZE); // assumes built in fonts are in a valid, compatible format } - // Collect needed glyphs + // collect needed glyphs uint8_t neededCodes[MAX_CACHED_GLYPHS]; uint8_t neededCount = collectNeededCodes(text, &hdr, neededCodes); uint8_t numGlyphs = hdr.last - hdr.first + 1; uint8_t widthTable[numGlyphs]; - // Read width table + // read width table if (hdr.flags & 0x01) { if (file) { if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table starts directly after header if used @@ -882,7 +774,7 @@ void FontManager::rebuildCache(const char* text) { return; } - // Write metadata + // write metadata meta = getMetadata(); // get pointer again in case segment was reallocated meta->availableFonts = savedMeta.availableFonts; meta->cachedFontNum = savedMeta.cachedFontNum; @@ -891,7 +783,7 @@ void FontManager::rebuildCache(const char* text) { uint8_t* dataptr = _segment->data + sizeof(SegmentFontMetadata); - // Write registry (GlyphEntry array) + // write registry (GlyphEntry array) GlyphEntry* registry = (GlyphEntry*)dataptr; for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; @@ -903,7 +795,6 @@ void FontManager::rebuildCache(const char* text) { // write font header memcpy(dataptr, &hdr, FONT_HEADER_SIZE); - dataptr += FONT_HEADER_SIZE; // write bitmap data to cache in registry order @@ -912,13 +803,13 @@ void FontManager::rebuildCache(const char* text) { uint8_t glyphIdx = neededCodes[k]; // neededCodes contais index of the glyph in the font, not the raw unicode value uint16_t bits = widthTable[glyphIdx] * hdr.height; uint16_t bytes = (bits + 7) / 8; - // Calculate file offset + // calculate file offset uint32_t offset = dataStart; for (uint8_t j = 0; j < glyphIdx; j++) { uint16_t b = widthTable[j] * hdr.height; offset += (b + 7) / 8; } - // Read from file or flash + // read from file or flash if (file) { file.seek(offset); file.read(dataptr, bytes); @@ -929,7 +820,112 @@ void FontManager::rebuildCache(const char* text) { } if (file) file.close(); - updateFontBase(); // Set up pointer to cached header/bitmaps + updateFontBase(); // set pointer to cached header/bitmaps +} + +// glyph index calculator +int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* hdr) { + if (unicode <= LAST_ASCII_CHAR) { + if (unicode >= hdr->first && unicode <= hdr->last) return unicode - hdr->first; + } else if (hdr->firstUnicode > 0 && unicode >= hdr->firstUnicode) { + uint32_t adjusted = unicode - hdr->firstUnicode + LAST_ASCII_CHAR + 1; + if (adjusted >= hdr->first && adjusted <= hdr->last) return adjusted - hdr->first; + } + return -1; +} + +// Get glyph width +uint8_t FontManager::getGlyphWidth(uint32_t unicode) { + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) return 0; + + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + return registry[k].width; + } + } + return 0; // Not found in cache +} + +// Get glyph bitmap +uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) return nullptr; + + if (!_segment->data) return nullptr; + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + uint32_t bitmapOffset = 0; + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + outWidth = registry[k].width; + outHeight = registry[k].height; + return _fontBase + FONT_HEADER_SIZE + bitmapOffset; + } + // Accumulate offset to next glyph + uint16_t bits = registry[k].width * registry[k].height; + bitmapOffset += (bits + 7) / 8; + } + return nullptr; // Glyph not found in cache +} + +// scan file system for available fonts +void FontManager::scanAvailableFonts() { + SegmentFontMetadata* meta = getMetadata(); + if (!meta) return; + meta->availableFonts = 0; + for (int i = 0; i < MAX_FONTS; i++) { + char fileName[FONT_NAME_BUFFER_SIZE]; + getFontFileName(i, fileName, sizeof(fileName)); + if (WLED_FS.exists(fileName)) { + meta->availableFonts |= (1 << i); + } + } + meta->fontsScanned = 1; +} + +uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { + uint8_t count = 0; + // add numbers to cache if needed (for clock use without constant re-caching) + if (_cacheNumbers) { + static const char s_nums[] PROGMEM = "0123456789:. "; + for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { + int32_t idx = getGlyphIndex(*p, hdr); + if (idx >= 0 && idx < 256) { + outCodes[count++] = idx; + } + } + } + // parse text + size_t i = 0, len = strlen(text); + while (i < len && count < MAX_CACHED_GLYPHS) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[i], &charLen); + if (!charLen) break; // invalid input, stop processing + i += charLen; + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) { + idx = getGlyphIndex('?', hdr); + } + if (idx >= 0 && idx < 256) { + // add if unique + bool exists = false; + for (uint8_t k = 0; k < count; k++) { + if (outCodes[k] == idx) { + exists = true; + break; + } + } + if (!exists) outCodes[count++] = idx; + } + } + return count; } void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { From d355ab413f89e9502e7c930a58552e3ebb9fd3ab Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Thu, 26 Feb 2026 20:35:56 +0100 Subject: [PATCH 24/33] bugfixes in FX calculations (size/position) rename & fix font --- wled00/FX.cpp | 25 +++++++++---------- wled00/FX_2Dfcn.cpp | 10 +++----- wled00/src/font/{font_6x12.h => font_5x12.h} | 14 ++++------- wled00/src/font/{6x12.wbf => font_5x12.wbf} | Bin 4 files changed, 21 insertions(+), 28 deletions(-) rename wled00/src/font/{font_6x12.h => font_5x12.h} (97%) rename wled00/src/font/{6x12.wbf => font_5x12.wbf} (100%) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index e8f051dfa9..19d8678b01 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6395,9 +6395,9 @@ void mode_2Dscrollingtext(void) { if (!fontManager.loadFont(fontNum, text, useCustomFont)) return; // note: FontManageraccess can lead to crashes if font loading fails due to low heap // Get font dimensions - uint8_t glyphHeight = fontManager.getFontHeight(); + uint8_t fontHeight = fontManager.getFontHeight(); uint8_t fontWidth = fontManager.getFontWidth(); // for fonts with variable width, this is the max letter width - uint8_t letterSpacing = fontManager.getFontSpacing(); + uint8_t letterSpacing = isRotated ? 1 : fontManager.getFontSpacing(); // when rotated use spacing of 1, otherwise use font defined spacing // Calculate total text width int totalTextWidth = 0; @@ -6410,11 +6410,10 @@ void mode_2Dscrollingtext(void) { idx += charLen; if (isRotated) { - totalTextWidth += glyphHeight + 1; // use height when rotated, spacing of 1 + totalTextWidth += fontHeight + letterSpacing; // use height when rotated, spacing of 1 } else { totalTextWidth += fontManager.getGlyphWidth(unicode) + letterSpacing; } - if (c < numberOfChars - 1) totalTextWidth += letterSpacing; } totalTextWidth -= letterSpacing; // remove spacing after last character @@ -6442,7 +6441,7 @@ void mode_2Dscrollingtext(void) { ++SEGENV.aux0 %= totalTextWidth + cols; } } else { - SEGENV.aux0 = (cols - totalTextWidth) / 2; // Center + SEGENV.aux0 = (cols + totalTextWidth) / 2; // text fits, position it at the center } ++SEGENV.aux1 &= 0xFF; // color shift SEGENV.step = strip.now + map(SEGMENT.speed, 0, 255, 250, 50); @@ -6470,18 +6469,18 @@ void mode_2Dscrollingtext(void) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - uint8_t glyphWidth = fontManager.getGlyphWidth(unicode); - int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; // AUX0 is scrolling offset - int advance = isRotated ? glyphHeight + 1 : glyphWidth + letterSpacing; // when rotated use spacing of 1 + int glyphWidth = isRotated ? fontHeight : fontManager.getGlyphWidth(unicode); + int glyphHeight = isRotated ? glyphWidth : fontHeight; // use (variable) glyph-width for height if 90° rotated + int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; // aux0 is (scrolling) offset, no offset position is right side boarder (cols) + if (drawX >= cols) break; // skip if character is off-screen on the right + int advance = glyphWidth + letterSpacing; - // Skip if off-screen if (drawX + advance < 0) { currentXOffset += advance; - continue; + continue; // Skip if off-screen on the left } - if (drawX >= cols) break; - unsigned rotHeight = isRotated ? glyphWidth : glyphHeight; // use (variable) glyph-width for height if 90° rotated - int16_t drawY = yoffset + (rows - rotHeight) / 2; // center glyph vertically + + int16_t drawY = yoffset + (rows - glyphHeight) / 2; // center glyph vertically fontManager.drawCharacter(unicode, drawX, drawY, col1, col2, rotate); currentXOffset += advance; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 774b2cf3e1..668795b405 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -583,7 +583,7 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #include "src/font/font_tom_thumb_6px.h" #include "src/font/font_TinyUnicode_8px.h" -#include "src/font/font_6x12.h" +#include "src/font/font_5x12.h" #include "src/font/console_font_6x8.h" #include "src/font/console_font_7x9.h" @@ -595,14 +595,14 @@ static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { // load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { - _fontNum = fontNum; _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0 SegmentFontMetadata* meta = getMetadata(); if (!meta) - return false; // ensure segment data exists + return false; // can not continue if no segment data _fontNum = fontNum; // store font to be used + if (useFile) { if (!meta->fontsScanned) { scanAvailableFonts(); // scan filesystem if not already scanned @@ -726,7 +726,7 @@ void FontManager::rebuildCache(const char* text) { case 1: flashFont = font_TinyUnicode_8px; break; case 2: flashFont = console_font_6x8; break; case 3: flashFont = console_font_7x9; break; - case 4: flashFont = font_6x12; break; + case 4: flashFont = font_5x12; break; } // read wbf font header @@ -856,8 +856,6 @@ uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_ FontHeader* hdr = reinterpret_cast(_fontBase); int32_t idx = getGlyphIndex(unicode, hdr); if (idx < 0) return nullptr; - - if (!_segment->data) return nullptr; SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); diff --git a/wled00/src/font/font_6x12.h b/wled00/src/font/font_5x12.h similarity index 97% rename from wled00/src/font/font_6x12.h rename to wled00/src/font/font_5x12.h index 025c2adfa3..98415f0da8 100644 --- a/wled00/src/font/font_6x12.h +++ b/wled00/src/font/font_5x12.h @@ -37,19 +37,15 @@ * * at the end of each glyph bitmap, padding bits are added if necessary to fill the last byte */ -// Font: 6x12 -// Height: 12, Max Width: 5, Spacing: 1 -// Characters: 32-127 (96 glyphs) -// Unicode Offset: 0x00000000 -// Variable Width: Yes -// Font: 6x12 + +// Font: 5x12 // Height: 12, Max Width: 5, Spacing: 1 -// Characters: 32-127 (96 glyphs) +// Characters: 32-126 (95 glyphs) // Unicode Offset: 0x00000000 // Variable Width: Yes -static const unsigned char font_6x12[] PROGMEM = { - 0x57, 0x0C, 0x05, 0x01, 0x01, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, S, Flags, First, Last, Reserved, UnicodeOffset (32bit) +static const unsigned char font_5x12[] PROGMEM = { + 0x57, 0x0C, 0x05, 0x01, 0x01, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // Header: 'W', H, W, S, Flags, First, Last, Reserved, UnicodeOffset (32bit) // Width table 0x02, 0x01, 0x03, 0x05, 0x05, 0x05, 0x05, 0x01, 0x03, 0x03, 0x05, 0x05, 0x03, 0x05, 0x02, 0x05, diff --git a/wled00/src/font/6x12.wbf b/wled00/src/font/font_5x12.wbf similarity index 100% rename from wled00/src/font/6x12.wbf rename to wled00/src/font/font_5x12.wbf From 4970c4175d3e280b61924f73413b2ab5111f1ea1 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 27 Feb 2026 06:29:27 +0100 Subject: [PATCH 25/33] minor fixes --- wled00/FX.cpp | 7 ++++--- wled00/FX.h | 2 +- wled00/FX_2Dfcn.cpp | 11 ++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 19d8678b01..bb6a319a7c 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -6469,9 +6469,10 @@ void mode_2Dscrollingtext(void) { uint8_t charLen; uint32_t unicode = utf8_decode(&text[idx], &charLen); idx += charLen; - int glyphWidth = isRotated ? fontHeight : fontManager.getGlyphWidth(unicode); - int glyphHeight = isRotated ? glyphWidth : fontHeight; // use (variable) glyph-width for height if 90° rotated - int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; // aux0 is (scrolling) offset, no offset position is right side boarder (cols) + int unrotatedWidth = fontManager.getGlyphWidth(unicode); + int glyphWidth = isRotated ? fontHeight : unrotatedWidth; // use font height for width if 90° rotated + int glyphHeight = isRotated ? unrotatedWidth : fontHeight; // use (variable) glyph-width for height if 90° rotated + int drawX = int(cols) - int(SEGENV.aux0) + currentXOffset; // aux0 is (scrolling) offset, no offset position is right side boarder (cols) if (drawX >= cols) break; // skip if character is off-screen on the right int advance = glyphWidth + letterSpacing; diff --git a/wled00/FX.h b/wled00/FX.h index 198b11f450..309415482f 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1099,7 +1099,7 @@ struct GlyphEntry { struct SegmentFontMetadata { uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none, highest bit set = file font) - uint8_t fontsScanned; // 1 if filesystem scanned + uint8_t fontsScanned; // 1 if filesystem scanned (only done once when using file fonts) uint8_t glyphCount; // Number of glyphs cached }; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 668795b405..9c95cc2db3 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -608,7 +608,6 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { scanAvailableFonts(); // scan filesystem if not already scanned } // determine which font to actually use (with fallback) - uint8_t fontToUse = fontNum; _useFileFont = useFile; // check if requested font is available - find first available font if not if (!(meta->availableFonts & (1 << fontNum))) { @@ -626,10 +625,10 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { } } - uint8_t cacheID = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash + uint8_t fontToUse = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash - if (cacheID != meta->cachedFontNum) { - meta->cachedFontNum = cacheID; // new font + if (fontToUse != meta->cachedFontNum) { + meta->cachedFontNum = fontToUse; // new font meta->glyphCount = 0; // invalidate cache and rebuild with new font } cacheGlyphs(text); // prepare cache with needed glyphs @@ -641,6 +640,7 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { return true; } +// check if all glyphs needed for the given text are present in cache, rebuild cache if not void FontManager::cacheGlyphs(const char* text) { if (!text) return; @@ -705,7 +705,7 @@ void FontManager::rebuildCache(const char* text) { file = WLED_FS.open(fileName, "r"); if (file) { _fontNum = i; // update to fallback font - savedMeta.cachedFontNum = i | 0x80; + savedMeta.cachedFontNum = i | 0x80; // set highest bit to indicate file font break; } } @@ -787,6 +787,7 @@ void FontManager::rebuildCache(const char* text) { GlyphEntry* registry = (GlyphEntry*)dataptr; for (uint8_t k = 0; k < neededCount; k++) { uint8_t code = neededCodes[k]; + if (code >= numGlyphs) continue; // skip invalid codes (safety check if anything is corrupted) registry[k].code = code; registry[k].width = widthTable[code]; registry[k].height = hdr.height; From 087c06b04c4ef520e1db4e421ea1d9d1b758efe7 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 27 Feb 2026 18:29:56 +0100 Subject: [PATCH 26/33] add support for any wbf file name, dropping the fixed name scheme (at expense of increased loading time) --- wled00/FX.h | 5 +- wled00/FX_2Dfcn.cpp | 93 ++++++++++++++++++++++--------------- wled00/src/font/font_5x12.h | 2 +- 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 309415482f..48dff5c1fe 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1099,7 +1099,7 @@ struct GlyphEntry { struct SegmentFontMetadata { uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none, highest bit set = file font) - uint8_t fontsScanned; // 1 if filesystem scanned (only done once when using file fonts) + uint8_t lastFontNum; // font number requested in last call uint8_t glyphCount; // Number of glyphs cached }; @@ -1111,7 +1111,7 @@ struct SegmentFontMetadata { static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string length is 64 chars so this is absolute worst case static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 -static constexpr size_t FONT_NAME_BUFFER_SIZE = 16; // font names is /fontX.wbf +static constexpr size_t FONT_NAME_BUFFER_SIZE = 64; // font names // font header, identical to wbf header, size must be FONT_HEADER_SIZE struct FontHeader { @@ -1173,6 +1173,7 @@ class FontManager { int32_t getGlyphIndex(uint32_t unicode, FontHeader* hdr); // File font management + void getFontFileName(uint8_t fontNum, char* buffer, bool scanAll = false); void scanAvailableFonts(); void rebuildCache(const char* text); uint8_t collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes); diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 9c95cc2db3..15ac4880cb 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -587,29 +587,65 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu #include "src/font/console_font_6x8.h" #include "src/font/console_font_7x9.h" -static void getFontFileName(uint8_t fontNum, char* buffer, size_t bufferSize) { - strcpy_P(buffer, PSTR("/font")); - if (fontNum > 0) snprintf(buffer + 5, bufferSize - 5, "%d", fontNum); - strcat_P(buffer, PSTR(".wbf")); +// scan file system for .wbf font files, if scanAll is set, also updates availableFonts +void FontManager::getFontFileName(uint8_t fontNum, char* buffer, bool scanAll) { + SegmentFontMetadata* meta = getMetadata(); + if (scanAll) { + if (!meta) return; + meta->availableFonts = 0; // reset available fonts before scanning + } + buffer[0] = '\0'; // invalidate + #ifdef CONFIG_IDF_TARGET_ESP32C3 + while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed + #endif + File rootdir = WLED_FS.open("/", "r"); + File rootfile = rootdir.openNextFile(); + uint8_t i = 0; + while (rootfile && i < MAX_FONTS) { + String name = rootfile.name(); + if (name.endsWith(F(".wbf"))) { + if (i == fontNum) { + if (name.charAt(0) != '/') name = "/" + name; // need to add leading slash + strncpy(buffer, name.c_str(), FONT_NAME_BUFFER_SIZE - 1); + buffer[FONT_NAME_BUFFER_SIZE - 1] = '\0'; + if (!scanAll) { + rootfile.close(); + rootdir.close(); + return; + } + } + if (scanAll) + meta->availableFonts |= (1 << i); // note: openNextFile() usually opens them in alphaetical order but there is no guarantee + i++; + } + rootfile = rootdir.openNextFile(); + } + rootfile.close(); + rootdir.close(); +} + +// scan file system for available fonts +void FontManager::scanAvailableFonts() { + char buffer[FONT_NAME_BUFFER_SIZE]; + getFontFileName(0, buffer, true); } // load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { - _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0 - + _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0, does nothing if already allocated SegmentFontMetadata* meta = getMetadata(); if (!meta) return false; // can not continue if no segment data _fontNum = fontNum; // store font to be used + _useFileFont = useFile; + uint8_t fontRequested = fontNum | (useFile ? 0x80 : 0x00); if (useFile) { - if (!meta->fontsScanned) { - scanAvailableFonts(); // scan filesystem if not already scanned + if (meta->lastFontNum != fontRequested) { + scanAvailableFonts(); // scan filesystem again if file font changes } - // determine which font to actually use (with fallback) - _useFileFont = useFile; - // check if requested font is available - find first available font if not + // determine which font to actually use (with fallback): check if requested font is available - find first available font if not if (!(meta->availableFonts & (1 << fontNum))) { _fontNum = 0xFF; // invalidate for (int i = 0; i < MAX_FONTS; i++) { @@ -624,12 +660,11 @@ bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { } } } + meta->lastFontNum = fontRequested; // store last requested file font (only used to check file fonts) uint8_t fontToUse = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash - if (fontToUse != meta->cachedFontNum) { - meta->cachedFontNum = fontToUse; // new font - meta->glyphCount = 0; // invalidate cache and rebuild with new font + meta->glyphCount = 0; // invalidate cache } cacheGlyphs(text); // prepare cache with needed glyphs meta = getMetadata(); // reload metadata after potential cache rebuild @@ -684,13 +719,12 @@ void FontManager::rebuildCache(const char* text) { SegmentFontMetadata* meta = getMetadata(); meta->glyphCount = 0; // invalidates cached font memcpy(&savedMeta, meta, sizeof(SegmentFontMetadata)); - savedMeta.cachedFontNum = 0xFF; // invalidate cache File file; if (_useFileFont) { // build filename from font number char fileName[FONT_NAME_BUFFER_SIZE]; - getFontFileName(_fontNum, fileName, sizeof(fileName)); + getFontFileName(_fontNum, fileName); #ifdef CONFIG_IDF_TARGET_ESP32C3 while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed @@ -701,11 +735,11 @@ void FontManager::rebuildCache(const char* text) { if (!file) { for (int i = 0; i < MAX_FONTS; i++) { if (meta->availableFonts & (1 << i)) { - getFontFileName(i, fileName, sizeof(fileName)); + getFontFileName(i, fileName); file = WLED_FS.open(fileName, "r"); if (file) { _fontNum = i; // update to fallback font - savedMeta.cachedFontNum = i | 0x80; // set highest bit to indicate file font + //savedMeta.cachedFontNum = i | 0x80; // set highest bit to indicate file font break; } } @@ -714,10 +748,12 @@ void FontManager::rebuildCache(const char* text) { if (!file) { _useFileFont = false; // fallback straight to flash font - savedMeta.cachedFontNum = _fontNum; + //savedMeta.cachedFontNum = _fontNum; } } + savedMeta.cachedFontNum = _fontNum | (_useFileFont ? 0x80 : 0x00); // set highest bit to indicate file font + // determine flash font to use (not used if using file font) const uint8_t* flashFont; switch (_fontNum) { @@ -776,9 +812,7 @@ void FontManager::rebuildCache(const char* text) { // write metadata meta = getMetadata(); // get pointer again in case segment was reallocated - meta->availableFonts = savedMeta.availableFonts; - meta->cachedFontNum = savedMeta.cachedFontNum; - meta->fontsScanned = savedMeta.fontsScanned; + memcpy(meta, &savedMeta, sizeof(SegmentFontMetadata)); meta->glyphCount = neededCount; // glyph count is used to determine if cache is valid. If file is corrupted, ram cache is still large enough to not cause crashes uint8_t* dataptr = _segment->data + sizeof(SegmentFontMetadata); @@ -874,21 +908,6 @@ uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_ return nullptr; // Glyph not found in cache } -// scan file system for available fonts -void FontManager::scanAvailableFonts() { - SegmentFontMetadata* meta = getMetadata(); - if (!meta) return; - meta->availableFonts = 0; - for (int i = 0; i < MAX_FONTS; i++) { - char fileName[FONT_NAME_BUFFER_SIZE]; - getFontFileName(i, fileName, sizeof(fileName)); - if (WLED_FS.exists(fileName)) { - meta->availableFonts |= (1 << i); - } - } - meta->fontsScanned = 1; -} - uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { uint8_t count = 0; // add numbers to cache if needed (for clock use without constant re-caching) diff --git a/wled00/src/font/font_5x12.h b/wled00/src/font/font_5x12.h index 98415f0da8..d7445cc85d 100644 --- a/wled00/src/font/font_5x12.h +++ b/wled00/src/font/font_5x12.h @@ -53,7 +53,7 @@ static const unsigned char font_5x12[] PROGMEM = { 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x03, 0x05, 0x05, 0x02, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x04, 0x05, 0x03, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x01, 0x05, 0x05, 0x00, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, /* code=32, hex=0x20, ascii=" ", w=2 */ 0x7F, 0x40, /* code=33, hex=0x21, ascii="!", w=1 */ From a62be1bf7faff04258135b3baa562f0f9aa12553 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 27 Feb 2026 18:51:10 +0100 Subject: [PATCH 27/33] remove drawCharacter() declarations from segment, fix overflow with umGlyphs --- wled00/FX.h | 3 --- wled00/FX_2Dfcn.cpp | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 48dff5c1fe..3ecb83587c 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -776,7 +776,6 @@ class Segment { inline void drawCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { drawCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) const { fillCircle(cx, cy, radius, RGBW32(c.r,c.g,c.b,0), soft); } inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, bool soft = false) const { drawLine(x0, y0, x1, y1, RGBW32(c.r,c.g,c.b,0), soft); } // automatic inline - inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) const { drawCharacter(unicode, x, y, fontData, fontFile, RGBW32(c.r,c.g,c.b,0), RGBW32(c2.r,c2.g,c2.b,0), rotate); } // automatic inline inline void fill_solid(CRGB c) const { fill(RGBW32(c.r,c.g,c.b,0)); } #else inline bool is2D() const { return false; } @@ -811,8 +810,6 @@ class Segment { inline void fillCircle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c, bool soft = false) {} inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, bool soft = false) {} - inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0) {} - inline void drawCharacter(uint32_t unicode, int16_t x, int16_t y, const uint8_t* fontData, File &fontFile, CRGB c, CRGB c2 = CRGB::Black, int8_t rotate = 0) {} inline void wu_pixel(uint32_t x, uint32_t y, CRGB c) {} #endif friend class WS2812FX; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 15ac4880cb..66dd5d619d 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -778,7 +778,7 @@ void FontManager::rebuildCache(const char* text) { // collect needed glyphs uint8_t neededCodes[MAX_CACHED_GLYPHS]; uint8_t neededCount = collectNeededCodes(text, &hdr, neededCodes); - uint8_t numGlyphs = hdr.last - hdr.first + 1; + uint32_t numGlyphs = hdr.last - hdr.first + 1; uint8_t widthTable[numGlyphs]; // read width table @@ -789,7 +789,7 @@ void FontManager::rebuildCache(const char* text) { memcpy_P(widthTable, flashFont + FONT_HEADER_SIZE, numGlyphs); // assumes built in fonts are in a valid, compatible format } } else { - for (uint8_t k = 0; k < numGlyphs; k++) { + for (uint32_t k = 0; k < numGlyphs; k++) { widthTable[k] = hdr.width; // fixed width, fill with given width from header } } @@ -957,7 +957,7 @@ void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t for (int col = 0; col < w; col++) { uint16_t bytePos = bitIndex >> 3; uint8_t bitPos = 7 - (bitIndex & 7); - uint8_t byteVal = bitmap[bytePos]; + uint8_t byteVal = [bytePos]; if ((byteVal >> bitPos) & 1) { int x0, y0; switch (rotate) { From 7606ac6cb7eea0ec3cb79c78f16b91c2c6dbcd6c Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 27 Feb 2026 18:53:51 +0100 Subject: [PATCH 28/33] add padding to glyph entry --- wled00/FX.h | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/FX.h b/wled00/FX.h index 3ecb83587c..63987ca6c8 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1090,6 +1090,7 @@ struct GlyphEntry { uint8_t code; // Glyph index (0-255) uint8_t width; // Width in pixels uint8_t height; // Height in pixels + uint8_t reserved; // Padding to keep FontHeader 4-byte aligned }; // Segment metadata (stored BEFORE the font data in segment data) From 869808943a9cca41cde2a928f6ae3fb4a698c2bb Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 27 Feb 2026 18:55:49 +0100 Subject: [PATCH 29/33] fix accidental removal of bitmap --- wled00/FX_2Dfcn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 66dd5d619d..4f5813a76a 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -957,7 +957,7 @@ void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t for (int col = 0; col < w; col++) { uint16_t bytePos = bitIndex >> 3; uint8_t bitPos = 7 - (bitIndex & 7); - uint8_t byteVal = [bytePos]; + uint8_t byteVal = bitmap[bytePos]; if ((byteVal >> bitPos) & 1) { int x0, y0; switch (rotate) { From 9474de3adc7214098b33cd0bdf12fa7b385b76a7 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 7 Mar 2026 09:17:36 +0100 Subject: [PATCH 30/33] add comment --- wled00/FX_2Dfcn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 4f5813a76a..df58384cd8 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -627,7 +627,7 @@ void FontManager::getFontFileName(uint8_t fontNum, char* buffer, bool scanAll) { // scan file system for available fonts void FontManager::scanAvailableFonts() { char buffer[FONT_NAME_BUFFER_SIZE]; - getFontFileName(0, buffer, true); + getFontFileName(0, buffer, true); // scan all fonts to update availableFonts in metadata } // load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! From 2627cc10efd68d25f7fdd18e7e772817faad9dc8 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Tue, 17 Mar 2026 12:25:34 +0100 Subject: [PATCH 31/33] refactor: move fontmanager into its own files --- wled00/FX.cpp | 1 + wled00/FX.h | 113 ----------- wled00/FX_2Dfcn.cpp | 393 +------------------------------------- wled00/fontmanager.cpp | 415 +++++++++++++++++++++++++++++++++++++++++ wled00/fontmanager.h | 120 ++++++++++++ 5 files changed, 537 insertions(+), 505 deletions(-) create mode 100644 wled00/fontmanager.cpp create mode 100644 wled00/fontmanager.h diff --git a/wled00/FX.cpp b/wled00/FX.cpp index bb6a319a7c..852b9ea489 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -12,6 +12,7 @@ #include "wled.h" #include "FX.h" +#include "fontmanager.h" #include "fcn_declare.h" #define FX_FALLBACK_STATIC { mode_static(); return; } diff --git a/wled00/FX.h b/wled00/FX.h index 63987ca6c8..a64f8c347b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -1064,117 +1064,4 @@ class WS2812FX { extern const char JSON_mode_names[]; extern const char JSON_palette_names[]; -#define LAST_ASCII_CHAR 127 -#define FONT_HEADER_SIZE 12 -/** - * Font format: - * - * Header Layout (12 Bytes): - * [0] Magic 'W' (0x57) - * [1] Glyph height - * [2] Fixed/max glyph width - * [3] Spacing between chars - * [4] Flags: (0x01 = variable width) - * [5] First Char - * [6] Last Char - * [7] reserved: 0x00 - * [8-11] Unicode Offset (32-bit little-endian) - * - * Followed by: - * - Width table (if variable width): [first..last] byte array omitted for fixed width fonts i.e. glyphs start after header - * - Bitmap data: bit-packed glyphs - top left to bottom right, row by row, MSB first, see src/font files for example - */ - -// Glyph entry in RAM cache -struct GlyphEntry { - uint8_t code; // Glyph index (0-255) - uint8_t width; // Width in pixels - uint8_t height; // Height in pixels - uint8_t reserved; // Padding to keep FontHeader 4-byte aligned -}; - -// Segment metadata (stored BEFORE the font data in segment data) -struct SegmentFontMetadata { - uint8_t availableFonts; // Bitflags for available fonts: set to 1 << fontNum if font is available in FS (0-4) - uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none, highest bit set = file font) - uint8_t lastFontNum; // font number requested in last call - uint8_t glyphCount; // Number of glyphs cached -}; - -// Memory layout of cached font in segment data: -// [SegmentFontMetadata] - 4 bytes -// [GlyphEntry array] -// [12-byte font header] - copy of the relevant font header data -// [Bitmap data] - sequential, matches registry order - -static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string length is 64 chars so this is absolute worst case -static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 -static constexpr size_t FONT_NAME_BUFFER_SIZE = 64; // font names - -// font header, identical to wbf header, size must be FONT_HEADER_SIZE -struct FontHeader { - uint8_t magic; // should be 'W' (0x57) - uint8_t height; // TODO: should we use the padding bytes and store a full copy of the header? might make copying the header easier? - uint8_t width; - uint8_t spacing; - uint8_t flags; - uint8_t first; - uint8_t last; - uint8_t reserved; // should be 0x00 - uint32_t firstUnicode; -}; -static_assert(sizeof(FontHeader) == FONT_HEADER_SIZE, "FontHeader size must be exactly FONT_HEADER_SIZE bytes"); - -class FontManager { -public: - FontManager(Segment* seg) : - _segment(seg), - _fontNum(0), - _useFileFont(false), - _cacheNumbers(false), - _fontBase(nullptr) {} - - bool loadFont(uint8_t fontNum, const char* text, bool useFile); - void cacheNumbers(bool cache) { _cacheNumbers = cache; } - void cacheGlyphs(const char* text); - - // Get dimensions (use cached header) - inline uint8_t getFontHeight() { return reinterpret_cast(_fontBase)->height; } - inline uint8_t getFontWidth() { return reinterpret_cast(_fontBase)->width; } - inline uint8_t getFontSpacing() { return reinterpret_cast(_fontBase)->spacing; } - uint8_t getGlyphWidth(uint32_t unicode); - - // Rendering - void drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); - -private: - Segment* _segment; - uint8_t _fontNum; // Font number (0-4) - bool _useFileFont; // true = file, false = flash - bool _cacheNumbers; - uint8_t* _fontBase; // pointer to start of font data (header + bitmaps) in segment data - - // get metadata pointer - SegmentFontMetadata* getMetadata() { - return (SegmentFontMetadata*)_segment->data; - } - - void updateFontBase() { - SegmentFontMetadata* meta = getMetadata(); - // font data (header + glyph bitmaps) starts after metadata + registry - _fontBase = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); - } - - uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); - - // Glyph index calculation (pure function, inline for speed) - int32_t getGlyphIndex(uint32_t unicode, FontHeader* hdr); - - // File font management - void getFontFileName(uint8_t fontNum, char* buffer, bool scanAll = false); - void scanAvailableFonts(); - void rebuildCache(const char* text); - uint8_t collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes); -}; - #endif diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index df58384cd8..599cd8cc5a 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -581,397 +581,6 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) const { //awesome wu } #undef WU_WEIGHT -#include "src/font/font_tom_thumb_6px.h" -#include "src/font/font_TinyUnicode_8px.h" -#include "src/font/font_5x12.h" -#include "src/font/console_font_6x8.h" -#include "src/font/console_font_7x9.h" - -// scan file system for .wbf font files, if scanAll is set, also updates availableFonts -void FontManager::getFontFileName(uint8_t fontNum, char* buffer, bool scanAll) { - SegmentFontMetadata* meta = getMetadata(); - if (scanAll) { - if (!meta) return; - meta->availableFonts = 0; // reset available fonts before scanning - } - buffer[0] = '\0'; // invalidate - #ifdef CONFIG_IDF_TARGET_ESP32C3 - while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed - #endif - File rootdir = WLED_FS.open("/", "r"); - File rootfile = rootdir.openNextFile(); - uint8_t i = 0; - while (rootfile && i < MAX_FONTS) { - String name = rootfile.name(); - if (name.endsWith(F(".wbf"))) { - if (i == fontNum) { - if (name.charAt(0) != '/') name = "/" + name; // need to add leading slash - strncpy(buffer, name.c_str(), FONT_NAME_BUFFER_SIZE - 1); - buffer[FONT_NAME_BUFFER_SIZE - 1] = '\0'; - if (!scanAll) { - rootfile.close(); - rootdir.close(); - return; - } - } - if (scanAll) - meta->availableFonts |= (1 << i); // note: openNextFile() usually opens them in alphaetical order but there is no guarantee - i++; - } - rootfile = rootdir.openNextFile(); - } - rootfile.close(); - rootdir.close(); -} - -// scan file system for available fonts -void FontManager::scanAvailableFonts() { - char buffer[FONT_NAME_BUFFER_SIZE]; - getFontFileName(0, buffer, true); // scan all fonts to update availableFonts in metadata -} - -// load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! -bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { - _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0, does nothing if already allocated - SegmentFontMetadata* meta = getMetadata(); - if (!meta) - return false; // can not continue if no segment data - - _fontNum = fontNum; // store font to be used - _useFileFont = useFile; - uint8_t fontRequested = fontNum | (useFile ? 0x80 : 0x00); - - if (useFile) { - if (meta->lastFontNum != fontRequested) { - scanAvailableFonts(); // scan filesystem again if file font changes - } - // determine which font to actually use (with fallback): check if requested font is available - find first available font if not - if (!(meta->availableFonts & (1 << fontNum))) { - _fontNum = 0xFF; // invalidate - for (int i = 0; i < MAX_FONTS; i++) { - if (meta->availableFonts & (1 << i)) { - _fontNum = i; - break; - } - } - if (_fontNum == 0xFF) { - _fontNum = fontNum; // no custom fonts available, use flash font - _useFileFont = false; - } - } - } - meta->lastFontNum = fontRequested; // store last requested file font (only used to check file fonts) - - uint8_t fontToUse = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash - if (fontToUse != meta->cachedFontNum) { - meta->glyphCount = 0; // invalidate cache - } - cacheGlyphs(text); // prepare cache with needed glyphs - meta = getMetadata(); // reload metadata after potential cache rebuild - if (meta->glyphCount == 0) { - errorFlag = ERR_NOT_IMPL; // TODO: need a better error code if more codes are added - return false; // cache build failed (invalid font file) - } - return true; -} - -// check if all glyphs needed for the given text are present in cache, rebuild cache if not -void FontManager::cacheGlyphs(const char* text) { - if (!text) return; - - SegmentFontMetadata* meta = getMetadata(); // loadFont ensures pointer is valid - // if glyphCount is 0, cache is empty - rebuild - if (meta->glyphCount == 0) { - rebuildCache(text); - return; // cache built, we are done - } - - // if there is a cached font, update the pointers - updateFontBase(); - FontHeader* hdr = reinterpret_cast(_fontBase); - - // check if all needed glyphs for the text are present in cache - uint8_t neededCodes[MAX_CACHED_GLYPHS]; - uint8_t neededCount = collectNeededCodes(text, hdr, neededCodes); - - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - for (uint8_t k = 0; k < neededCount; k++) { - // look up glyph in registry - bool found = false; - for (uint8_t j = 0; j < meta->glyphCount; j++) { - if (registry[j].code == neededCodes[k]) { - found = true; - break; - } - } - - if (!found) { - rebuildCache(text); // missing glyph - rebuild cache - return; - } - } -} - -void FontManager::rebuildCache(const char* text) { - if (!text) return; - // preserve metadata (function is only called if segment data is allocated so no null check needed) - SegmentFontMetadata savedMeta; - SegmentFontMetadata* meta = getMetadata(); - meta->glyphCount = 0; // invalidates cached font - memcpy(&savedMeta, meta, sizeof(SegmentFontMetadata)); - - File file; - if (_useFileFont) { - // build filename from font number - char fileName[FONT_NAME_BUFFER_SIZE]; - getFontFileName(_fontNum, fileName); - - #ifdef CONFIG_IDF_TARGET_ESP32C3 - while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed - #endif - file = WLED_FS.open(fileName, "r"); - - // fallback logic - try other available fonts - if (!file) { - for (int i = 0; i < MAX_FONTS; i++) { - if (meta->availableFonts & (1 << i)) { - getFontFileName(i, fileName); - file = WLED_FS.open(fileName, "r"); - if (file) { - _fontNum = i; // update to fallback font - //savedMeta.cachedFontNum = i | 0x80; // set highest bit to indicate file font - break; - } - } - } - } - - if (!file) { - _useFileFont = false; // fallback straight to flash font - //savedMeta.cachedFontNum = _fontNum; - } - } - - savedMeta.cachedFontNum = _fontNum | (_useFileFont ? 0x80 : 0x00); // set highest bit to indicate file font - - // determine flash font to use (not used if using file font) - const uint8_t* flashFont; - switch (_fontNum) { - default: - case 0: flashFont = font_tom_thumb_6px; break; - case 1: flashFont = font_TinyUnicode_8px; break; - case 2: flashFont = console_font_6x8; break; - case 3: flashFont = console_font_7x9; break; - case 4: flashFont = font_5x12; break; - } - - // read wbf font header - FontHeader hdr; - if (file) { - if (file.read((uint8_t*)&hdr, FONT_HEADER_SIZE) != FONT_HEADER_SIZE) { file.close(); return; } // header incomplete - if (hdr.magic != 0x57) { file.close(); return; } // invalid header - if (hdr.last < hdr.first) { file.close(); return; } // Invalid header - } else { - memcpy_P(&hdr, flashFont, FONT_HEADER_SIZE); // assumes built in fonts are in a valid, compatible format - } - - // collect needed glyphs - uint8_t neededCodes[MAX_CACHED_GLYPHS]; - uint8_t neededCount = collectNeededCodes(text, &hdr, neededCodes); - uint32_t numGlyphs = hdr.last - hdr.first + 1; - uint8_t widthTable[numGlyphs]; - - // read width table - if (hdr.flags & 0x01) { - if (file) { - if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table starts directly after header if used - } else { - memcpy_P(widthTable, flashFont + FONT_HEADER_SIZE, numGlyphs); // assumes built in fonts are in a valid, compatible format - } - } else { - for (uint32_t k = 0; k < numGlyphs; k++) { - widthTable[k] = hdr.width; // fixed width, fill with given width from header - } - } - - // calculate total size for cache: metadata + registry + header + bitmaps - size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; - - for (uint8_t k = 0; k < neededCount; k++) { - uint8_t code = neededCodes[k]; - if (code < numGlyphs) { - uint16_t bits = widthTable[code] * hdr.height; - ramFontSize += (bits + 7) / 8; // add bitmap size for each needed glyph - } - } - - if (!_segment->allocateData(ramFontSize)) { - if (file) file.close(); - return; - } - - // write metadata - meta = getMetadata(); // get pointer again in case segment was reallocated - memcpy(meta, &savedMeta, sizeof(SegmentFontMetadata)); - meta->glyphCount = neededCount; // glyph count is used to determine if cache is valid. If file is corrupted, ram cache is still large enough to not cause crashes - - uint8_t* dataptr = _segment->data + sizeof(SegmentFontMetadata); - - // write registry (GlyphEntry array) - GlyphEntry* registry = (GlyphEntry*)dataptr; - for (uint8_t k = 0; k < neededCount; k++) { - uint8_t code = neededCodes[k]; - if (code >= numGlyphs) continue; // skip invalid codes (safety check if anything is corrupted) - registry[k].code = code; - registry[k].width = widthTable[code]; - registry[k].height = hdr.height; - } - dataptr += neededCount * sizeof(GlyphEntry); - - // write font header - memcpy(dataptr, &hdr, FONT_HEADER_SIZE); - dataptr += FONT_HEADER_SIZE; - - // write bitmap data to cache in registry order - uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); // bitmap data in wbf font starts after header and width table (if used) - for (uint8_t k = 0; k < neededCount; k++) { - uint8_t glyphIdx = neededCodes[k]; // neededCodes contais index of the glyph in the font, not the raw unicode value - uint16_t bits = widthTable[glyphIdx] * hdr.height; - uint16_t bytes = (bits + 7) / 8; - // calculate file offset - uint32_t offset = dataStart; - for (uint8_t j = 0; j < glyphIdx; j++) { - uint16_t b = widthTable[j] * hdr.height; - offset += (b + 7) / 8; - } - // read from file or flash - if (file) { - file.seek(offset); - file.read(dataptr, bytes); - } else { - memcpy_P(dataptr, flashFont + offset, bytes); - } - dataptr += bytes; - } - - if (file) file.close(); - updateFontBase(); // set pointer to cached header/bitmaps -} - -// glyph index calculator -int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* hdr) { - if (unicode <= LAST_ASCII_CHAR) { - if (unicode >= hdr->first && unicode <= hdr->last) return unicode - hdr->first; - } else if (hdr->firstUnicode > 0 && unicode >= hdr->firstUnicode) { - uint32_t adjusted = unicode - hdr->firstUnicode + LAST_ASCII_CHAR + 1; - if (adjusted >= hdr->first && adjusted <= hdr->last) return adjusted - hdr->first; - } - return -1; -} - -// Get glyph width -uint8_t FontManager::getGlyphWidth(uint32_t unicode) { - FontHeader* hdr = reinterpret_cast(_fontBase); - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) return 0; - - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - - for (uint8_t k = 0; k < meta->glyphCount; k++) { - if (registry[k].code == idx) { - return registry[k].width; - } - } - return 0; // Not found in cache -} - -// Get glyph bitmap -uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { - FontHeader* hdr = reinterpret_cast(_fontBase); - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) return nullptr; - SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; - GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); - - uint32_t bitmapOffset = 0; - for (uint8_t k = 0; k < meta->glyphCount; k++) { - if (registry[k].code == idx) { - outWidth = registry[k].width; - outHeight = registry[k].height; - return _fontBase + FONT_HEADER_SIZE + bitmapOffset; - } - // Accumulate offset to next glyph - uint16_t bits = registry[k].width * registry[k].height; - bitmapOffset += (bits + 7) / 8; - } - return nullptr; // Glyph not found in cache -} - -uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { - uint8_t count = 0; - // add numbers to cache if needed (for clock use without constant re-caching) - if (_cacheNumbers) { - static const char s_nums[] PROGMEM = "0123456789:. "; - for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { - int32_t idx = getGlyphIndex(*p, hdr); - if (idx >= 0 && idx < 256) { - outCodes[count++] = idx; - } - } - } - // parse text - size_t i = 0, len = strlen(text); - while (i < len && count < MAX_CACHED_GLYPHS) { - uint8_t charLen; - uint32_t unicode = utf8_decode(&text[i], &charLen); - if (!charLen) break; // invalid input, stop processing - i += charLen; - int32_t idx = getGlyphIndex(unicode, hdr); - if (idx < 0) { - idx = getGlyphIndex('?', hdr); - } - if (idx >= 0 && idx < 256) { - // add if unique - bool exists = false; - for (uint8_t k = 0; k < count; k++) { - if (outCodes[k] == idx) { - exists = true; - break; - } - } - if (!exists) outCodes[count++] = idx; - } - } - return count; -} - -void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { - uint8_t w, h; - const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); - if (!bitmap || w == 0) return; - CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; - uint16_t bitIndex = 0; - for (int row = 0; row < h; row++) { - CRGBW c = ColorFromPalette(grad, (row + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); - for (int col = 0; col < w; col++) { - uint16_t bytePos = bitIndex >> 3; - uint8_t bitPos = 7 - (bitIndex & 7); - uint8_t byteVal = bitmap[bytePos]; - if ((byteVal >> bitPos) & 1) { - int x0, y0; - switch (rotate) { - case -1: x0 = x + row; y0 = y + col; break; // 90° CW - case 1: x0 = x + (h-1) - row; y0 = y + (w-1) - col; break; // 90° CCW - case -2: - case 2: x0 = x + (w-1) - col; y0 = y + (h-1) - row; break; - default: x0 = x + col; y0 = y + row; break; - } - _segment->setPixelColorXY(x0, y0, c.color32); // bounds checking is done in setPixelColorXY - } - bitIndex++; - } - } -} + #endif // WLED_DISABLE_2D \ No newline at end of file diff --git a/wled00/fontmanager.cpp b/wled00/fontmanager.cpp new file mode 100644 index 0000000000..76dae7b4d2 --- /dev/null +++ b/wled00/fontmanager.cpp @@ -0,0 +1,415 @@ +/* + * FontManager class for managing wbf format font loading, caching, and rendering + * Supports up to 5 fonts (0-4) from flash or file system + * Caches glyphs in segment data for fast access during rendering + * Note: fontmanager relies on the Segment class for storing cached font data as well as rendering + * + * (c) 2026 by @dedehai + */ + +#include "wled.h" +#include "fontmanager.h" + +#include "src/font/font_tom_thumb_6px.h" +#include "src/font/font_TinyUnicode_8px.h" +#include "src/font/font_5x12.h" +#include "src/font/console_font_6x8.h" +#include "src/font/console_font_7x9.h" + +// get metadata pointer +SegmentFontMetadata* FontManager::getMetadata() { + return (SegmentFontMetadata*)_segment->data; +} + +void FontManager::updateFontBase() { + SegmentFontMetadata* meta = getMetadata(); + // font data (header + glyph bitmaps) starts after metadata + registry + _fontBase = _segment->data + sizeof(SegmentFontMetadata) + (meta->glyphCount * sizeof(GlyphEntry)); +} + +// scan file system for .wbf font files, if scanAll is set, also updates availableFonts +void FontManager::getFontFileName(uint8_t fontNum, char* buffer, bool scanAll) { + SegmentFontMetadata* meta = getMetadata(); + if (scanAll) { + if (!meta) return; + meta->availableFonts = 0; // reset available fonts before scanning + } + buffer[0] = '\0'; // invalidate + #ifdef CONFIG_IDF_TARGET_ESP32C3 + while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed + #endif + File rootdir = WLED_FS.open("/", "r"); + File rootfile = rootdir.openNextFile(); + uint8_t i = 0; + while (rootfile && i < MAX_FONTS) { + String name = rootfile.name(); + if (name.endsWith(F(".wbf"))) { + if (i == fontNum) { + if (name.charAt(0) != '/') name = "/" + name; // need to add leading slash + strncpy(buffer, name.c_str(), FONT_NAME_BUFFER_SIZE - 1); + buffer[FONT_NAME_BUFFER_SIZE - 1] = '\0'; + if (!scanAll) { + rootfile.close(); + rootdir.close(); + return; + } + } + if (scanAll) + meta->availableFonts |= (1 << i); // note: openNextFile() usually opens them in alphaetical order but there is no guarantee + i++; + } + rootfile = rootdir.openNextFile(); + } + rootfile.close(); + rootdir.close(); +} + +// scan file system for available fonts +void FontManager::scanAvailableFonts() { + char buffer[FONT_NAME_BUFFER_SIZE]; + getFontFileName(0, buffer, true); // scan all fonts to update availableFonts in metadata +} + +// load font by number and prepare/validate font cache, must be called before using any other FontManager functions, must not use the font if this function returns false! +bool FontManager::loadFont(uint8_t fontNum, const char* text, bool useFile) { + _segment->allocateData(sizeof(SegmentFontMetadata)); // make sure at least metadata is available, sets to 0 if segment.call==0, does nothing if already allocated + SegmentFontMetadata* meta = getMetadata(); + if (!meta) + return false; // can not continue if no segment data + + _fontNum = fontNum; // store font to be used + _useFileFont = useFile; + uint8_t fontRequested = fontNum | (useFile ? 0x80 : 0x00); + + if (useFile) { + if (meta->lastFontNum != fontRequested) { + scanAvailableFonts(); // scan filesystem again if file font changes + } + // determine which font to actually use (with fallback): check if requested font is available - find first available font if not + if (!(meta->availableFonts & (1 << fontNum))) { + _fontNum = 0xFF; // invalidate + for (int i = 0; i < MAX_FONTS; i++) { + if (meta->availableFonts & (1 << i)) { + _fontNum = i; + break; + } + } + if (_fontNum == 0xFF) { + _fontNum = fontNum; // no custom fonts available, use flash font + _useFileFont = false; + } + } + } + meta->lastFontNum = fontRequested; // store last requested file font (only used to check file fonts) + + uint8_t fontToUse = _fontNum | (_useFileFont ? 0x80 : 0x00); // highest bit indicates file vs flash + if (fontToUse != meta->cachedFontNum) { + meta->glyphCount = 0; // invalidate cache + } + cacheGlyphs(text); // prepare cache with needed glyphs + meta = getMetadata(); // reload metadata after potential cache rebuild + if (meta->glyphCount == 0) { + errorFlag = ERR_NOT_IMPL; // TODO: need a better error code if more codes are added + return false; // cache build failed (invalid font file) + } + return true; +} + +// check if all glyphs needed for the given text are present in cache, rebuild cache if not +void FontManager::cacheGlyphs(const char* text) { + if (!text) return; + + SegmentFontMetadata* meta = getMetadata(); // loadFont ensures pointer is valid + // if glyphCount is 0, cache is empty - rebuild + if (meta->glyphCount == 0) { + rebuildCache(text); + return; // cache built, we are done + } + + // if there is a cached font, update the pointers + updateFontBase(); + FontHeader* hdr = reinterpret_cast(_fontBase); + + // check if all needed glyphs for the text are present in cache + uint8_t neededCodes[MAX_CACHED_GLYPHS]; + uint8_t neededCount = collectNeededCodes(text, hdr, neededCodes); + + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + for (uint8_t k = 0; k < neededCount; k++) { + // look up glyph in registry + bool found = false; + for (uint8_t j = 0; j < meta->glyphCount; j++) { + if (registry[j].code == neededCodes[k]) { + found = true; + break; + } + } + + if (!found) { + rebuildCache(text); // missing glyph - rebuild cache + return; + } + } +} + +void FontManager::rebuildCache(const char* text) { + if (!text) return; + // preserve metadata (function is only called if segment data is allocated so no null check needed) + SegmentFontMetadata savedMeta; + SegmentFontMetadata* meta = getMetadata(); + meta->glyphCount = 0; // invalidates cached font + memcpy(&savedMeta, meta, sizeof(SegmentFontMetadata)); + + File file; + if (_useFileFont) { + // build filename from font number + char fileName[FONT_NAME_BUFFER_SIZE]; + getFontFileName(_fontNum, fileName); + + #ifdef CONFIG_IDF_TARGET_ESP32C3 + while (!BusManager::canAllShow()) yield(); // accessing FS causes glitches due to RMT issue on C3 TODO: remove this when fixed + #endif + file = WLED_FS.open(fileName, "r"); + + // fallback logic - try other available fonts + if (!file) { + for (int i = 0; i < MAX_FONTS; i++) { + if (meta->availableFonts & (1 << i)) { + getFontFileName(i, fileName); + file = WLED_FS.open(fileName, "r"); + if (file) { + _fontNum = i; // update to fallback font + //savedMeta.cachedFontNum = i | 0x80; // set highest bit to indicate file font + break; + } + } + } + } + + if (!file) { + _useFileFont = false; // fallback straight to flash font + //savedMeta.cachedFontNum = _fontNum; + } + } + + savedMeta.cachedFontNum = _fontNum | (_useFileFont ? 0x80 : 0x00); // set highest bit to indicate file font + + // determine flash font to use (not used if using file font) + const uint8_t* flashFont; + switch (_fontNum) { + default: + case 0: flashFont = font_tom_thumb_6px; break; + case 1: flashFont = font_TinyUnicode_8px; break; + case 2: flashFont = console_font_6x8; break; + case 3: flashFont = console_font_7x9; break; + case 4: flashFont = font_5x12; break; + } + + // read wbf font header + FontHeader hdr; + if (file) { + if (file.read((uint8_t*)&hdr, FONT_HEADER_SIZE) != FONT_HEADER_SIZE) { file.close(); return; } // header incomplete + if (hdr.magic != 0x57) { file.close(); return; } // invalid header + if (hdr.last < hdr.first) { file.close(); return; } // Invalid header + } else { + memcpy_P(&hdr, flashFont, FONT_HEADER_SIZE); // assumes built in fonts are in a valid, compatible format + } + + // collect needed glyphs + uint8_t neededCodes[MAX_CACHED_GLYPHS]; + uint8_t neededCount = collectNeededCodes(text, &hdr, neededCodes); + uint32_t numGlyphs = hdr.last - hdr.first + 1; + uint8_t widthTable[numGlyphs]; + + // read width table + if (hdr.flags & 0x01) { + if (file) { + if (file.read(widthTable, numGlyphs) != numGlyphs) { file.close(); return; } // width table starts directly after header if used + } else { + memcpy_P(widthTable, flashFont + FONT_HEADER_SIZE, numGlyphs); // assumes built in fonts are in a valid, compatible format + } + } else { + for (uint32_t k = 0; k < numGlyphs; k++) { + widthTable[k] = hdr.width; // fixed width, fill with given width from header + } + } + + // calculate total size for cache: metadata + registry + header + bitmaps + size_t ramFontSize = sizeof(SegmentFontMetadata) + (neededCount * sizeof(GlyphEntry)) + FONT_HEADER_SIZE; + + for (uint8_t k = 0; k < neededCount; k++) { + uint8_t code = neededCodes[k]; + if (code < numGlyphs) { + uint16_t bits = widthTable[code] * hdr.height; + ramFontSize += (bits + 7) / 8; // add bitmap size for each needed glyph + } + } + + if (!_segment->allocateData(ramFontSize)) { + if (file) file.close(); + return; + } + + // write metadata + meta = getMetadata(); // get pointer again in case segment was reallocated + memcpy(meta, &savedMeta, sizeof(SegmentFontMetadata)); + meta->glyphCount = neededCount; // glyph count is used to determine if cache is valid. If file is corrupted, ram cache is still large enough to not cause crashes + + uint8_t* dataptr = _segment->data + sizeof(SegmentFontMetadata); + + // write registry (GlyphEntry array) + GlyphEntry* registry = (GlyphEntry*)dataptr; + for (uint8_t k = 0; k < neededCount; k++) { + uint8_t code = neededCodes[k]; + if (code >= numGlyphs) continue; // skip invalid codes (safety check if anything is corrupted) + registry[k].code = code; + registry[k].width = widthTable[code]; + registry[k].height = hdr.height; + } + dataptr += neededCount * sizeof(GlyphEntry); + + // write font header + memcpy(dataptr, &hdr, FONT_HEADER_SIZE); + dataptr += FONT_HEADER_SIZE; + + // write bitmap data to cache in registry order + uint32_t dataStart = FONT_HEADER_SIZE + ((hdr.flags & 0x01) ? numGlyphs : 0); // bitmap data in wbf font starts after header and width table (if used) + for (uint8_t k = 0; k < neededCount; k++) { + uint8_t glyphIdx = neededCodes[k]; // neededCodes contais index of the glyph in the font, not the raw unicode value + uint16_t bits = widthTable[glyphIdx] * hdr.height; + uint16_t bytes = (bits + 7) / 8; + // calculate file offset + uint32_t offset = dataStart; + for (uint8_t j = 0; j < glyphIdx; j++) { + uint16_t b = widthTable[j] * hdr.height; + offset += (b + 7) / 8; + } + // read from file or flash + if (file) { + file.seek(offset); + file.read(dataptr, bytes); + } else { + memcpy_P(dataptr, flashFont + offset, bytes); + } + dataptr += bytes; + } + + if (file) file.close(); + updateFontBase(); // set pointer to cached header/bitmaps +} + +// glyph index calculator +int32_t FontManager::getGlyphIndex(uint32_t unicode, FontHeader* hdr) { + if (unicode <= LAST_ASCII_CHAR) { + if (unicode >= hdr->first && unicode <= hdr->last) return unicode - hdr->first; + } else if (hdr->firstUnicode > 0 && unicode >= hdr->firstUnicode) { + uint32_t adjusted = unicode - hdr->firstUnicode + LAST_ASCII_CHAR + 1; + if (adjusted >= hdr->first && adjusted <= hdr->last) return adjusted - hdr->first; + } + return -1; +} + +// Get glyph width +uint8_t FontManager::getGlyphWidth(uint32_t unicode) { + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) return 0; + + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + return registry[k].width; + } + } + return 0; // Not found in cache +} + +// Get glyph bitmap +uint8_t* FontManager::getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight) { + FontHeader* hdr = reinterpret_cast(_fontBase); + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) return nullptr; + SegmentFontMetadata* meta = (SegmentFontMetadata*)_segment->data; + GlyphEntry* registry = (GlyphEntry*)(_segment->data + sizeof(SegmentFontMetadata)); + + uint32_t bitmapOffset = 0; + for (uint8_t k = 0; k < meta->glyphCount; k++) { + if (registry[k].code == idx) { + outWidth = registry[k].width; + outHeight = registry[k].height; + return _fontBase + FONT_HEADER_SIZE + bitmapOffset; + } + // Accumulate offset to next glyph + uint16_t bits = registry[k].width * registry[k].height; + bitmapOffset += (bits + 7) / 8; + } + return nullptr; // Glyph not found in cache +} + +uint8_t FontManager::collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes) { + uint8_t count = 0; + // add numbers to cache if needed (for clock use without constant re-caching) + if (_cacheNumbers) { + static const char s_nums[] PROGMEM = "0123456789:. "; + for (const char* p = s_nums; *p && count < MAX_CACHED_GLYPHS; p++) { + int32_t idx = getGlyphIndex(*p, hdr); + if (idx >= 0 && idx < 256) { + outCodes[count++] = idx; + } + } + } + // parse text + size_t i = 0, len = strlen(text); + while (i < len && count < MAX_CACHED_GLYPHS) { + uint8_t charLen; + uint32_t unicode = utf8_decode(&text[i], &charLen); + if (!charLen) break; // invalid input, stop processing + i += charLen; + int32_t idx = getGlyphIndex(unicode, hdr); + if (idx < 0) { + idx = getGlyphIndex('?', hdr); + } + if (idx >= 0 && idx < 256) { + // add if unique + bool exists = false; + for (uint8_t k = 0; k < count; k++) { + if (outCodes[k] == idx) { + exists = true; + break; + } + } + if (!exists) outCodes[count++] = idx; + } + } + return count; +} + +void FontManager::drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate) { + uint8_t w, h; + const uint8_t* bitmap = getGlyphBitmap(unicode, w, h); + if (!bitmap || w == 0) return; + CRGBPalette16 grad = col2 ? CRGBPalette16(CRGB(color), CRGB(col2)) : SEGPALETTE; + uint16_t bitIndex = 0; + for (int row = 0; row < h; row++) { + CRGBW c = ColorFromPalette(grad, (row + 1) * 255 / h, 255, LINEARBLEND_NOWRAP); + for (int col = 0; col < w; col++) { + uint16_t bytePos = bitIndex >> 3; + uint8_t bitPos = 7 - (bitIndex & 7); + uint8_t byteVal = bitmap[bytePos]; + if ((byteVal >> bitPos) & 1) { + int x0, y0; + switch (rotate) { + case -1: x0 = x + row; y0 = y + col; break; // 90° CW + case 1: x0 = x + (h-1) - row; y0 = y + (w-1) - col; break; // 90° CCW + case -2: + case 2: x0 = x + (w-1) - col; y0 = y + (h-1) - row; break; + default: x0 = x + col; y0 = y + row; break; + } + _segment->setPixelColorXY(x0, y0, c.color32); // bounds checking is done in setPixelColorXY + } + bitIndex++; + } + } +} diff --git a/wled00/fontmanager.h b/wled00/fontmanager.h new file mode 100644 index 0000000000..a3a2112684 --- /dev/null +++ b/wled00/fontmanager.h @@ -0,0 +1,120 @@ +#pragma once +/* + * FontManager class for managing wbf format font loading, caching, and rendering + * Supports up to 5 fonts (0-4) from flash or file system + * Caches glyphs in segment data for fast access during rendering + * + * (c) 2026 by @dedehai + */ + +#include +#include + +class Segment; // forward declaration + +#define LAST_ASCII_CHAR 127 // last standard ASCII char, higher chars are mapped to unicode offset set in font header and accessed via unicode values, not direct index, see getGlyphIndex() +#define FONT_HEADER_SIZE 12 +/** + * Font format: + * + * Header Layout (12 Bytes): + * [0] Magic 'W' (0x57) + * [1] Glyph height + * [2] Fixed/max glyph width + * [3] Spacing between chars + * [4] Flags: (0x01 = variable width) + * [5] First Char + * [6] Last Char + * [7] reserved: 0x00 + * [8-11] Unicode Offset (32-bit little-endian) + * + * Followed by: + * - Width table (if variable width): [first..last] byte array omitted for fixed width fonts i.e. glyphs start after header + * - Bitmap data: bit-packed glyphs - top left to bottom right, row by row, MSB first, see src/font files for example + */ + +// Glyph entry in RAM cache +struct GlyphEntry { + uint8_t code; // Glyph index (0-255) + uint8_t width; // Width in pixels + uint8_t height; // Height in pixels + uint8_t reserved; // Padding to keep FontHeader 4-byte aligned +}; + +// Segment metadata (stored BEFORE the font data in segment data) +struct SegmentFontMetadata { + uint8_t availableFonts; // Bitflags for available fonts on FS: set to 1 << fontNum if font is available in FS (0-4) + uint8_t cachedFontNum; // Currently cached font (0-4, 0xFF = none, highest bit set = file font) + uint8_t lastFontNum; // font number requested in last call + uint8_t glyphCount; // Number of glyphs cached +}; + +// Memory layout of cached font in segment data: +// [SegmentFontMetadata] - 4 bytes +// [GlyphEntry array] +// [12-byte font header] - copy of the relevant font header data +// [Bitmap data] - sequential, matches registry order + +static constexpr uint8_t MAX_CACHED_GLYPHS = 64; // max segment string length is 64 chars so this is absolute worst case +static constexpr uint8_t MAX_FONTS = 5; // scrolli text supports font numbers 0-4 +static constexpr size_t FONT_NAME_BUFFER_SIZE = 64; // font names + +// font header, identical to wbf header, size must be FONT_HEADER_SIZE +struct FontHeader { + uint8_t magic; // should be 'W' (0x57) + uint8_t height; // TODO: should we use the padding bytes and store a full copy of the header? might make copying the header easier? + uint8_t width; + uint8_t spacing; + uint8_t flags; + uint8_t first; + uint8_t last; + uint8_t reserved; // should be 0x00 + uint32_t firstUnicode; +}; +static_assert(sizeof(FontHeader) == FONT_HEADER_SIZE, "FontHeader size must be exactly FONT_HEADER_SIZE bytes"); + +class FontManager { +public: + FontManager(Segment* seg) : + _segment(seg), + _fontNum(0), + _useFileFont(false), + _cacheNumbers(false), + _fontBase(nullptr) {} + + bool loadFont(uint8_t fontNum, const char* text, bool useFile); + void cacheNumbers(bool cache) { _cacheNumbers = cache; } + void cacheGlyphs(const char* text); + + // Get dimensions (use cached header) + inline uint8_t getFontHeight() { return reinterpret_cast(_fontBase)->height; } + inline uint8_t getFontWidth() { return reinterpret_cast(_fontBase)->width; } + inline uint8_t getFontSpacing() { return reinterpret_cast(_fontBase)->spacing; } + uint8_t getGlyphWidth(uint32_t unicode); + + // Rendering + void drawCharacter(uint32_t unicode, int16_t x, int16_t y, uint32_t color, uint32_t col2, int8_t rotate); + +private: + Segment* _segment; + uint8_t _fontNum; // Font number (0-4) + bool _useFileFont; // true = file, false = flash + bool _cacheNumbers; + uint8_t* _fontBase; // pointer to start of font data (header + bitmaps) in segment data + + // get metadata pointer + SegmentFontMetadata* getMetadata(); + + void updateFontBase(); + + uint8_t* getGlyphBitmap(uint32_t unicode, uint8_t& outWidth, uint8_t& outHeight); + + // Glyph index calculation (pure function, inline for speed) + int32_t getGlyphIndex(uint32_t unicode, FontHeader* hdr); + + // File font management + void getFontFileName(uint8_t fontNum, char* buffer, bool scanAll = false); + void scanAvailableFonts(); + void rebuildCache(const char* text); + uint8_t collectNeededCodes(const char* text, FontHeader* hdr, uint8_t* outCodes); +}; From 8550b3820f4c09965b6d8651db4c5f606adf30bf Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 22 Mar 2026 10:51:38 +0100 Subject: [PATCH 32/33] add simulated preview canvas to scrolling text tab --- wled00/data/pixelforge/pixelforge.htm | 78 ++++++++++++++++++++------- 1 file changed, 59 insertions(+), 19 deletions(-) diff --git a/wled00/data/pixelforge/pixelforge.htm b/wled00/data/pixelforge/pixelforge.htm index 75adf02a7c..f4149a1b11 100644 --- a/wled00/data/pixelforge/pixelforge.htm +++ b/wled00/data/pixelforge/pixelforge.htm @@ -96,7 +96,7 @@ background: #555; } .cm button.danger { - color: #f44; + color: #b21; } /* Editor styles */ @@ -335,29 +335,24 @@

Text to show

+ +

Settings

-
- Speed -
-
- Y Offset -
-
- Trail -
-
- Font Size -
-
- Rotate -
+
Speed
+
Y Offset
+
Trail
+
Font
+
Rotate
-
+
Tips:
• Mix text and tokens: "It's #HHMM O'Clock" or "#HH:#MM:#SS"
• Add '0' suffix for leading zeros: #TIME0, #HH0, etc. @@ -452,6 +447,7 @@

PIXEL MAGIC Tool

await segLoad(); // load available segments await flU(); // update file list + tabSw(localStorage.tab||'img'); // restore last active tab toolChk('pixelpaint.htm','t1'); // update buttons of additional tools toolChk('videolab.htm','t2'); toolChk('pxmagic.htm','t3'); @@ -550,7 +546,7 @@

PIXEL MAGIC Tool

}catch(e){console.error(e);} } -/* load images into grid TODO: when switching tabs, it can throw 503 and have unloaded images, tried to fix it but all my attempts failed*/ +/* load images into grid */ async function imgLoad2(imgs){ const grid=gId('gr'); for(const f of imgs){ @@ -1174,7 +1170,6 @@

PIXEL MAGIC Tool

'Img,Txt,Oth'.split(',').forEach((s,i)=>{ gId('t'+s).onclick=()=>tabSw(['img','txt','oth'][i]); }); -tabSw(localStorage.tab||'img'); /* tokens insert */ function txtIns(el,t){ @@ -1234,6 +1229,51 @@

PIXEL MAGIC Tool

}catch(e){ msg(`Error: ${e.message}`,'err'); } finally{ ovHide(); } }; + +/* preview canvas (not "accurate", just a simulation)*/ +const tpv = gId('tpv'), tpx = tpv.getContext('2d'); +function draw() { + // fade out to simulate "trail" + let tr = 1 - (gId('c1').value / 280); // c1 controls trail length + //tpx.fillStyle = `rgba(0,0,0,${tr.toFixed(2)})`; + tpx.fillStyle = `rgba(0,0,0,${tr})`; + tpx.fillRect(0,0,100,50); + + let txt = gId('txt').value || 'WLED'; // note: decoding tokens is not implemented as it just takes a lot of code for little benefit + let sx = gId('sx').value; + let ix = gId('ix').value, c2 = gId('c2').value, c3 = gId('c3').value; + + let fzs = [8, 12, 14, 20, 28][Math.floor(c2/52)] || 8; // Font sizes 1-5 + let rot = -(Math.round((c3)/7.5)-2) * Math.PI/2; // -2 to 2 maps to 180 to -180 + let t = (Date.now() * (0.02 + (sx / 255) * 0.1)) % (100 + txt.length * fzs); + let x = gId('o3').checked ? (t - (txt.length * fzs)) : 100 - t; + let y = 25 + (ix - 128) / 5; + + // draw char-by-char just like the FX + tpx.fillStyle = "#fff"; + tpx.font = fzs + "px monospace"; + tpx.textAlign = "center"; + tpx.textBaseline = "middle"; + + for(let i=0; i 120) continue; + tpx.save(); + tpx.translate(charX, y); + tpx.rotate(rot); + tpx.fillStyle = "#fff"; + if (gId('o1').checked) { // gradient color + let g = tpx.createLinearGradient(0, -fzs/2, 0, fzs/2); + g.addColorStop(0, "#f5f"); g.addColorStop(1, "#8cf"); + tpx.fillStyle = g; + } + tpx.fillText(txt[i], 0, 0); + tpx.restore(); + } + requestAnimationFrame(draw); +} +draw(); + \ No newline at end of file From 5705ffcf18ae411f56a0af9cbfa5f2f01cc3a789 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 22 Mar 2026 11:03:36 +0100 Subject: [PATCH 33/33] bugfix: load actual slider values in pixelforge scrolling text tab --- wled00/data/pixelforge/pixelforge.htm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wled00/data/pixelforge/pixelforge.htm b/wled00/data/pixelforge/pixelforge.htm index f4149a1b11..caf1f078a5 100644 --- a/wled00/data/pixelforge/pixelforge.htm +++ b/wled00/data/pixelforge/pixelforge.htm @@ -492,6 +492,7 @@

PIXEL MAGIC Tool

} if(v1) s1.value=v1; if(v2) s2.value=v2; s2.onchange(); // trigger on load to toggle show/hide of text tool + txtSegLoad(); // load settings for currently selected segment const o=s1.options[s1.selectedIndex]; if(o){ gId('w').value=o.dataset.w||16; gId('h').value=o.dataset.h||16; } }).catch(console.error); @@ -518,6 +519,7 @@

PIXEL MAGIC Tool

const is2D = (gId('segT').selectedOptions[0].dataset.h || 1) > 1; gId('ti').style.display = is2D ? 'block' : 'none'; gId('ti1D').style.display = is2D ? 'none' : 'block'; + txtSegLoad(); // update controls to match selected segment }; /* image list */