ThingPulse OLED SSD1306
Dependents: Turtle_RadioShuttle mbed-os5-F303-18650-Manager-tp4056 Kretanje_kroz_izbornike_OLED128x64_4tipke
Revision 0:56dd5df33ab4, committed 2019-04-10
- Comitter:
- Helmut64
- Date:
- Wed Apr 10 14:15:31 2019 +0000
- Child:
- 1:9270c15c6aea
- Commit message:
- initial mbed library
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplay.cpp Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,967 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
+ * Copyright (c) 2018 by Fabrice Weinberg
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+ /*
+ * TODO Helmut
+ * - test/finish dislplay.printf() on mbed-os
+ * - Finish _putc with drawLogBuffer when running display
+ * - Fix problem that the x is larger than 0 (somehow shifted display) on single buffer
+ */
+
+#include "OLEDDisplay.h"
+
+OLEDDisplay::OLEDDisplay() {
+
+ displayWidth = 128;
+ displayHeight = 64;
+ displayBufferSize = 1024;
+ color = WHITE;
+ geometry = GEOMETRY_128_64;
+ textAlignment = TEXT_ALIGN_LEFT;
+ fontData = ArialMT_Plain_10;
+ fontTableLookupFunction = DefaultFontTableLookup;
+ buffer = NULL;
+ buffer_back = NULL;
+}
+
+OLEDDisplay::~OLEDDisplay() {
+ end();
+}
+
+bool OLEDDisplay::init() {
+
+ logBufferSize = 0;
+ logBufferFilled = 0;
+ logBufferLine = 0;
+ logBufferMaxLines = 0;
+ logBuffer = NULL;
+
+ if (!this->connect()) {
+ DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Can't establish connection to display\n");
+ return false;
+ }
+
+ if(this->buffer==NULL) {
+ this->buffer = (uint8_t*) malloc((sizeof(uint8_t) * displayBufferSize) + getBufferOffset());
+ this->buffer += getBufferOffset();
+
+ if(!this->buffer) {
+ DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create display\n");
+ return false;
+ }
+ }
+
+ #ifdef OLEDDISPLAY_DOUBLE_BUFFER
+ if(this->buffer_back==NULL) {
+ this->buffer_back = (uint8_t*) malloc((sizeof(uint8_t) * displayBufferSize) + getBufferOffset());
+ this->buffer_back += getBufferOffset();
+
+ if(!this->buffer_back) {
+ DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create back buffer\n");
+ free(this->buffer - getBufferOffset());
+ return false;
+ }
+ }
+ #endif
+
+ sendInitCommands();
+ resetDisplay();
+
+ return true;
+}
+
+void OLEDDisplay::end() {
+ if (this->buffer) { free(this->buffer - getBufferOffset()); this->buffer = NULL; }
+ #ifdef OLEDDISPLAY_DOUBLE_BUFFER
+ if (this->buffer_back) { free(this->buffer_back - getBufferOffset()); this->buffer_back = NULL; }
+ #endif
+ if (this->logBuffer != NULL) { free(this->logBuffer); this->logBuffer = NULL; }
+}
+
+void OLEDDisplay::resetDisplay(void) {
+ clear();
+ #ifdef OLEDDISPLAY_DOUBLE_BUFFER
+ memset(buffer_back, 1, displayBufferSize);
+ #endif
+ display();
+}
+
+void OLEDDisplay::setColor(OLEDDISPLAY_COLOR color) {
+ this->color = color;
+}
+
+OLEDDISPLAY_COLOR OLEDDisplay::getColor() {
+ return this->color;
+}
+
+void OLEDDisplay::setPixel(int16_t x, int16_t y) {
+ if (x >= 0 && x < this->width() && y >= 0 && y < this->height()) {
+ switch (color) {
+ case WHITE: buffer[x + (y / 8) * this->width()] |= (1 << (y & 7)); break;
+ case BLACK: buffer[x + (y / 8) * this->width()] &= ~(1 << (y & 7)); break;
+ case INVERSE: buffer[x + (y / 8) * this->width()] ^= (1 << (y & 7)); break;
+ }
+ }
+}
+
+// Bresenham's algorithm - thx wikipedia and Adafruit_GFX
+void OLEDDisplay::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) {
+ int16_t steep = abs(y1 - y0) > abs(x1 - x0);
+ if (steep) {
+ _swap_int16_t(x0, y0);
+ _swap_int16_t(x1, y1);
+ }
+
+ if (x0 > x1) {
+ _swap_int16_t(x0, x1);
+ _swap_int16_t(y0, y1);
+ }
+
+ int16_t dx, dy;
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ int16_t err = dx / 2;
+ int16_t ystep;
+
+ if (y0 < y1) {
+ ystep = 1;
+ } else {
+ ystep = -1;
+ }
+
+ for (; x0<=x1; x0++) {
+ if (steep) {
+ setPixel(y0, x0);
+ } else {
+ setPixel(x0, y0);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+}
+
+void OLEDDisplay::drawRect(int16_t x, int16_t y, int16_t width, int16_t height) {
+ drawHorizontalLine(x, y, width);
+ drawVerticalLine(x, y, height);
+ drawVerticalLine(x + width - 1, y, height);
+ drawHorizontalLine(x, y + height - 1, width);
+}
+
+void OLEDDisplay::fillRect(int16_t xMove, int16_t yMove, int16_t width, int16_t height) {
+ for (int16_t x = xMove; x < xMove + width; x++) {
+ drawVerticalLine(x, yMove, height);
+ }
+}
+
+void OLEDDisplay::drawCircle(int16_t x0, int16_t y0, int16_t radius) {
+ int16_t x = 0, y = radius;
+ int16_t dp = 1 - radius;
+ do {
+ if (dp < 0)
+ dp = dp + 2 * (x++) + 3;
+ else
+ dp = dp + 2 * (x++) - 2 * (y--) + 5;
+
+ setPixel(x0 + x, y0 + y); //For the 8 octants
+ setPixel(x0 - x, y0 + y);
+ setPixel(x0 + x, y0 - y);
+ setPixel(x0 - x, y0 - y);
+ setPixel(x0 + y, y0 + x);
+ setPixel(x0 - y, y0 + x);
+ setPixel(x0 + y, y0 - x);
+ setPixel(x0 - y, y0 - x);
+
+ } while (x < y);
+
+ setPixel(x0 + radius, y0);
+ setPixel(x0, y0 + radius);
+ setPixel(x0 - radius, y0);
+ setPixel(x0, y0 - radius);
+}
+
+void OLEDDisplay::drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads) {
+ int16_t x = 0, y = radius;
+ int16_t dp = 1 - radius;
+ while (x < y) {
+ if (dp < 0)
+ dp = dp + 2 * (x++) + 3;
+ else
+ dp = dp + 2 * (x++) - 2 * (y--) + 5;
+ if (quads & 0x1) {
+ setPixel(x0 + x, y0 - y);
+ setPixel(x0 + y, y0 - x);
+ }
+ if (quads & 0x2) {
+ setPixel(x0 - y, y0 - x);
+ setPixel(x0 - x, y0 - y);
+ }
+ if (quads & 0x4) {
+ setPixel(x0 - y, y0 + x);
+ setPixel(x0 - x, y0 + y);
+ }
+ if (quads & 0x8) {
+ setPixel(x0 + x, y0 + y);
+ setPixel(x0 + y, y0 + x);
+ }
+ }
+ if (quads & 0x1 && quads & 0x8) {
+ setPixel(x0 + radius, y0);
+ }
+ if (quads & 0x4 && quads & 0x8) {
+ setPixel(x0, y0 + radius);
+ }
+ if (quads & 0x2 && quads & 0x4) {
+ setPixel(x0 - radius, y0);
+ }
+ if (quads & 0x1 && quads & 0x2) {
+ setPixel(x0, y0 - radius);
+ }
+}
+
+
+void OLEDDisplay::fillCircle(int16_t x0, int16_t y0, int16_t radius) {
+ int16_t x = 0, y = radius;
+ int16_t dp = 1 - radius;
+ do {
+ if (dp < 0)
+ dp = dp + 2 * (x++) + 3;
+ else
+ dp = dp + 2 * (x++) - 2 * (y--) + 5;
+
+ drawHorizontalLine(x0 - x, y0 - y, 2*x);
+ drawHorizontalLine(x0 - x, y0 + y, 2*x);
+ drawHorizontalLine(x0 - y, y0 - x, 2*y);
+ drawHorizontalLine(x0 - y, y0 + x, 2*y);
+
+
+ } while (x < y);
+ drawHorizontalLine(x0 - radius, y0, 2 * radius);
+
+}
+
+void OLEDDisplay::drawHorizontalLine(int16_t x, int16_t y, int16_t length) {
+ if (y < 0 || y >= this->height()) { return; }
+
+ if (x < 0) {
+ length += x;
+ x = 0;
+ }
+
+ if ( (x + length) > this->width()) {
+ length = (this->width() - x);
+ }
+
+ if (length <= 0) { return; }
+
+ uint8_t * bufferPtr = buffer;
+ bufferPtr += (y >> 3) * this->width();
+ bufferPtr += x;
+
+ uint8_t drawBit = 1 << (y & 7);
+
+ switch (color) {
+ case WHITE: while (length--) {
+ *bufferPtr++ |= drawBit;
+ }; break;
+ case BLACK: drawBit = ~drawBit; while (length--) {
+ *bufferPtr++ &= drawBit;
+ }; break;
+ case INVERSE: while (length--) {
+ *bufferPtr++ ^= drawBit;
+ }; break;
+ }
+}
+
+void OLEDDisplay::drawVerticalLine(int16_t x, int16_t y, int16_t length) {
+ if (x < 0 || x >= this->width()) return;
+
+ if (y < 0) {
+ length += y;
+ y = 0;
+ }
+
+ if ( (y + length) > this->height()) {
+ length = (this->height() - y);
+ }
+
+ if (length <= 0) return;
+
+
+ uint8_t yOffset = y & 7;
+ uint8_t drawBit;
+ uint8_t *bufferPtr = buffer;
+
+ bufferPtr += (y >> 3) * this->width();
+ bufferPtr += x;
+
+ if (yOffset) {
+ yOffset = 8 - yOffset;
+ drawBit = ~(0xFF >> (yOffset));
+
+ if (length < yOffset) {
+ drawBit &= (0xFF >> (yOffset - length));
+ }
+
+ switch (color) {
+ case WHITE: *bufferPtr |= drawBit; break;
+ case BLACK: *bufferPtr &= ~drawBit; break;
+ case INVERSE: *bufferPtr ^= drawBit; break;
+ }
+
+ if (length < yOffset) return;
+
+ length -= yOffset;
+ bufferPtr += this->width();
+ }
+
+ if (length >= 8) {
+ switch (color) {
+ case WHITE:
+ case BLACK:
+ drawBit = (color == WHITE) ? 0xFF : 0x00;
+ do {
+ *bufferPtr = drawBit;
+ bufferPtr += this->width();
+ length -= 8;
+ } while (length >= 8);
+ break;
+ case INVERSE:
+ do {
+ *bufferPtr = ~(*bufferPtr);
+ bufferPtr += this->width();
+ length -= 8;
+ } while (length >= 8);
+ break;
+ }
+ }
+
+ if (length > 0) {
+ drawBit = (1 << (length & 7)) - 1;
+ switch (color) {
+ case WHITE: *bufferPtr |= drawBit; break;
+ case BLACK: *bufferPtr &= ~drawBit; break;
+ case INVERSE: *bufferPtr ^= drawBit; break;
+ }
+ }
+}
+
+void OLEDDisplay::drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress) {
+ uint16_t radius = height / 2;
+ uint16_t xRadius = x + radius;
+ uint16_t yRadius = y + radius;
+ uint16_t doubleRadius = 2 * radius;
+ uint16_t innerRadius = radius - 2;
+
+ setColor(WHITE);
+ drawCircleQuads(xRadius, yRadius, radius, 0b00000110);
+ drawHorizontalLine(xRadius, y, width - doubleRadius + 1);
+ drawHorizontalLine(xRadius, y + height, width - doubleRadius + 1);
+ drawCircleQuads(x + width - radius, yRadius, radius, 0b00001001);
+
+ uint16_t maxProgressWidth = (width - doubleRadius + 1) * progress / 100;
+
+ fillCircle(xRadius, yRadius, innerRadius);
+ fillRect(xRadius + 1, y + 2, maxProgressWidth, height - 3);
+ fillCircle(xRadius + maxProgressWidth, yRadius, innerRadius);
+}
+
+void OLEDDisplay::drawFastImage(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *image) {
+ drawInternal(xMove, yMove, width, height, image, 0, 0);
+}
+
+void OLEDDisplay::drawXbm(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm) {
+ int16_t widthInXbm = (width + 7) / 8;
+ uint8_t data = 0;
+
+ for(int16_t y = 0; y < height; y++) {
+ for(int16_t x = 0; x < width; x++ ) {
+ if (x & 7) {
+ data >>= 1; // Move a bit
+ } else { // Read new data every 8 bit
+ data = pgm_read_byte(xbm + (x / 8) + y * widthInXbm);
+ }
+ // if there is a bit draw it
+ if (data & 0x01) {
+ setPixel(xMove + x, yMove + y);
+ }
+ }
+ }
+}
+
+void OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth) {
+ uint8_t textHeight = pgm_read_byte(fontData + HEIGHT_POS);
+ uint8_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS);
+ uint16_t sizeOfJumpTable = pgm_read_byte(fontData + CHAR_NUM_POS) * JUMPTABLE_BYTES;
+
+ uint8_t cursorX = 0;
+ uint8_t cursorY = 0;
+
+ switch (textAlignment) {
+ case TEXT_ALIGN_CENTER_BOTH:
+ yMove -= textHeight >> 1;
+ // Fallthrough
+ case TEXT_ALIGN_CENTER:
+ xMove -= textWidth >> 1; // divide by 2
+ break;
+ case TEXT_ALIGN_RIGHT:
+ xMove -= textWidth;
+ break;
+ case TEXT_ALIGN_LEFT:
+ break;
+ }
+
+ // Don't draw anything if it is not on the screen.
+ if (xMove + textWidth < 0 || xMove > this->width() ) {return;}
+ if (yMove + textHeight < 0 || yMove > this->width() ) {return;}
+
+ for (uint16_t j = 0; j < textLength; j++) {
+ int16_t xPos = xMove + cursorX;
+ int16_t yPos = yMove + cursorY;
+
+ uint8_t code = text[j];
+ if (code >= firstChar) {
+ uint8_t charCode = code - firstChar;
+
+ // 4 Bytes per char code
+ uint8_t msbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES ); // MSB \ JumpAddress
+ uint8_t lsbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_LSB); // LSB /
+ uint8_t charByteSize = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_SIZE); // Size
+ uint8_t currentCharWidth = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); // Width
+
+ // Test if the char is drawable
+ if (!(msbJumpToChar == 255 && lsbJumpToChar == 255)) {
+ // Get the position of the char data
+ uint16_t charDataPosition = JUMPTABLE_START + sizeOfJumpTable + ((msbJumpToChar << 8) + lsbJumpToChar);
+ drawInternal(xPos, yPos, currentCharWidth, textHeight, fontData, charDataPosition, charByteSize);
+ }
+
+ cursorX += currentCharWidth;
+ }
+ }
+}
+
+
+void OLEDDisplay::drawString(int16_t xMove, int16_t yMove, String strUser) {
+ uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS);
+
+ // char* text must be freed!
+ char* text = utf8ascii(strUser);
+
+ uint16_t yOffset = 0;
+ // If the string should be centered vertically too
+ // we need to now how heigh the string is.
+ if (textAlignment == TEXT_ALIGN_CENTER_BOTH) {
+ uint16_t lb = 0;
+ // Find number of linebreaks in text
+ for (uint16_t i=0;text[i] != 0; i++) {
+ lb += (text[i] == 10);
+ }
+ // Calculate center
+ yOffset = (lb * lineHeight) / 2;
+ }
+
+ uint16_t line = 0;
+ char* textPart = strtok(text,"\n");
+ while (textPart != NULL) {
+ uint16_t length = strlen(textPart);
+ drawStringInternal(xMove, yMove - yOffset + (line++) * lineHeight, textPart, length, getStringWidth(textPart, length));
+ textPart = strtok(NULL, "\n");
+ }
+ free(text);
+}
+
+void OLEDDisplay::drawStringMaxWidth(int16_t xMove, int16_t yMove, uint16_t maxLineWidth, String strUser) {
+ uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS);
+ uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS);
+
+ char* text = utf8ascii(strUser);
+
+ uint16_t length = strlen(text);
+ uint16_t lastDrawnPos = 0;
+ uint16_t lineNumber = 0;
+ uint16_t strWidth = 0;
+
+ uint16_t preferredBreakpoint = 0;
+ uint16_t widthAtBreakpoint = 0;
+
+ for (uint16_t i = 0; i < length; i++) {
+ strWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[i] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
+
+ // Always try to break on a space or dash
+ if (text[i] == ' ' || text[i]== '-') {
+ preferredBreakpoint = i;
+ widthAtBreakpoint = strWidth;
+ }
+
+ if (strWidth >= maxLineWidth) {
+ if (preferredBreakpoint == 0) {
+ preferredBreakpoint = i;
+ widthAtBreakpoint = strWidth;
+ }
+ drawStringInternal(xMove, yMove + (lineNumber++) * lineHeight , &text[lastDrawnPos], preferredBreakpoint - lastDrawnPos, widthAtBreakpoint);
+ lastDrawnPos = preferredBreakpoint + 1;
+ // It is possible that we did not draw all letters to i so we need
+ // to account for the width of the chars from `i - preferredBreakpoint`
+ // by calculating the width we did not draw yet.
+ strWidth = strWidth - widthAtBreakpoint;
+ preferredBreakpoint = 0;
+ }
+ }
+
+ // Draw last part if needed
+ if (lastDrawnPos < length) {
+ drawStringInternal(xMove, yMove + lineNumber * lineHeight , &text[lastDrawnPos], length - lastDrawnPos, getStringWidth(&text[lastDrawnPos], length - lastDrawnPos));
+ }
+
+ free(text);
+}
+
+uint16_t OLEDDisplay::getStringWidth(const char* text, uint16_t length) {
+ uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS);
+
+ uint16_t stringWidth = 0;
+ uint16_t maxWidth = 0;
+
+ while (length--) {
+ stringWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[length] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH);
+ if (text[length] == 10) {
+ maxWidth = max(maxWidth, stringWidth);
+ stringWidth = 0;
+ }
+ }
+
+ return max(maxWidth, stringWidth);
+}
+
+uint16_t OLEDDisplay::getStringWidth(String strUser) {
+ char* text = utf8ascii(strUser);
+ uint16_t length = strlen(text);
+ uint16_t width = getStringWidth(text, length);
+ free(text);
+ return width;
+}
+
+void OLEDDisplay::setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment) {
+ this->textAlignment = textAlignment;
+}
+
+void OLEDDisplay::setFont(const uint8_t *fontData) {
+ this->fontData = fontData;
+}
+
+void OLEDDisplay::displayOn(void) {
+ sendCommand(DISPLAYON);
+}
+
+void OLEDDisplay::displayOff(void) {
+ sendCommand(DISPLAYOFF);
+}
+
+void OLEDDisplay::invertDisplay(void) {
+ sendCommand(INVERTDISPLAY);
+}
+
+void OLEDDisplay::normalDisplay(void) {
+ sendCommand(NORMALDISPLAY);
+}
+
+void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge, uint8_t comdetect) {
+ sendCommand(SETPRECHARGE); //0xD9
+ sendCommand(precharge); //0xF1 default, to lower the contrast, put 1-1F
+ sendCommand(SETCONTRAST);
+ sendCommand(contrast); // 0-255
+ sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast)
+ sendCommand(comdetect); //0x40 default, to lower the contrast, put 0
+ sendCommand(DISPLAYALLON_RESUME);
+ sendCommand(NORMALDISPLAY);
+ sendCommand(DISPLAYON);
+}
+
+void OLEDDisplay::setBrightness(uint8_t brightness) {
+ uint8_t contrast = brightness;
+ if (brightness < 128) {
+ // Magic values to get a smooth/ step-free transition
+ contrast = brightness * 1.171;
+ } else {
+ contrast = brightness * 1.171 - 43;
+ }
+
+ uint8_t precharge = 241;
+ if (brightness == 0) {
+ precharge = 0;
+ }
+ uint8_t comdetect = brightness / 8;
+
+ setContrast(contrast, precharge, comdetect);
+}
+
+void OLEDDisplay::resetOrientation() {
+ sendCommand(SEGREMAP);
+ sendCommand(COMSCANINC); //Reset screen rotation or mirroring
+}
+
+void OLEDDisplay::flipScreenVertically() {
+ sendCommand(SEGREMAP | 0x01);
+ sendCommand(COMSCANDEC); //Rotate screen 180 Deg
+}
+
+void OLEDDisplay::mirrorScreen() {
+ sendCommand(SEGREMAP);
+ sendCommand(COMSCANDEC); //Mirror screen
+}
+
+void OLEDDisplay::clear(void) {
+ memset(buffer, 0, displayBufferSize);
+}
+
+void OLEDDisplay::drawLogBuffer(uint16_t xMove, uint16_t yMove) {
+ uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS);
+ // Always align left
+ setTextAlignment(TEXT_ALIGN_LEFT);
+
+ // State values
+ uint16_t length = 0;
+ uint16_t line = 0;
+ uint16_t lastPos = 0;
+
+ for (uint16_t i=0;i<this->logBufferFilled;i++){
+ // Everytime we have a \n print
+ if (this->logBuffer[i] == 10) {
+ length++;
+ // Draw string on line `line` from lastPos to length
+ // Passing 0 as the lenght because we are in TEXT_ALIGN_LEFT
+ drawStringInternal(xMove, yMove + (line++) * lineHeight, &this->logBuffer[lastPos], length, 0);
+ // Remember last pos
+ lastPos = i;
+ // Reset length
+ length = 0;
+ } else {
+ // Count chars until next linebreak
+ length++;
+ }
+ }
+ // Draw the remaining string
+ if (length > 0) {
+ drawStringInternal(xMove, yMove + line * lineHeight, &this->logBuffer[lastPos], length, 0);
+ }
+}
+
+uint16_t OLEDDisplay::getWidth(void) {
+ return displayWidth;
+}
+
+uint16_t OLEDDisplay::getHeight(void) {
+ return displayHeight;
+}
+
+bool OLEDDisplay::setLogBuffer(uint16_t lines, uint16_t chars){
+ if (logBuffer != NULL) free(logBuffer);
+ uint16_t size = lines * chars;
+ if (size > 0) {
+ this->logBufferLine = 0; // Lines printed
+ this->logBufferFilled = 0; // Nothing stored yet
+ this->logBufferMaxLines = lines; // Lines max printable
+ this->logBufferSize = size; // Total number of characters the buffer can hold
+ this->logBuffer = (char *) malloc(size * sizeof(uint8_t));
+ if(!this->logBuffer) {
+ DEBUG_OLEDDISPLAY("[OLEDDISPLAY][setLogBuffer] Not enough memory to create log buffer\n");
+ return false;
+ }
+ }
+ return true;
+}
+
+size_t OLEDDisplay::write(uint8_t c) {
+ if (this->logBufferSize > 0) {
+ // Don't waste space on \r\n line endings, dropping \r
+ if (c == 13) return 1;
+
+ // convert UTF-8 character to font table index
+ c = (this->fontTableLookupFunction)(c);
+ // drop unknown character
+ if (c == 0) return 1;
+
+ bool maxLineNotReached = this->logBufferLine < this->logBufferMaxLines;
+ bool bufferNotFull = this->logBufferFilled < this->logBufferSize;
+
+ // Can we write to the buffer?
+ if (bufferNotFull && maxLineNotReached) {
+ this->logBuffer[logBufferFilled] = c;
+ this->logBufferFilled++;
+ // Keep track of lines written
+ if (c == 10) this->logBufferLine++;
+ } else {
+ // Max line number is reached
+ if (!maxLineNotReached) this->logBufferLine--;
+
+ // Find the end of the first line
+ uint16_t firstLineEnd = 0;
+ for (uint16_t i=0;i<this->logBufferFilled;i++) {
+ if (this->logBuffer[i] == 10){
+ // Include last char too
+ firstLineEnd = i + 1;
+ break;
+ }
+ }
+ // If there was a line ending
+ if (firstLineEnd > 0) {
+ // Calculate the new logBufferFilled value
+ this->logBufferFilled = logBufferFilled - firstLineEnd;
+ // Now we move the lines infront of the buffer
+ memcpy(this->logBuffer, &this->logBuffer[firstLineEnd], logBufferFilled);
+ } else {
+ // Let's reuse the buffer if it was full
+ if (!bufferNotFull) {
+ this->logBufferFilled = 0;
+ }// else {
+ // Nothing to do here
+ //}
+ }
+ write(c);
+ }
+ }
+ // We are always writing all uint8_t to the buffer
+ return 1;
+}
+
+size_t OLEDDisplay::write(const char* str) {
+ if (str == NULL) return 0;
+ size_t length = strlen(str);
+ for (size_t i = 0; i < length; i++) {
+ write(str[i]);
+ }
+ return length;
+}
+
+#ifdef __MBED__
+int OLEDDisplay::_putc(int c) {
+
+ if (!fontData)
+ return 1;
+ if (!logBufferSize) {
+ uint8_t textHeight = pgm_read_byte(fontData + HEIGHT_POS);
+ uint16_t lines = this->displayHeight / textHeight;
+ uint16_t chars = 2 * (this->displayWidth / textHeight);
+
+ if (this->displayHeight % textHeight)
+ lines++;
+ if (this->displayWidth % textHeight)
+ chars++;
+ setLogBuffer(lines, chars);
+ }
+
+ return this->write((uint8_t)c);
+}
+#endif
+
+// Private functions
+void OLEDDisplay::setGeometry(OLEDDISPLAY_GEOMETRY g) {
+ this->geometry = g;
+ if (g == GEOMETRY_128_64) {
+ this->displayWidth = 128;
+ this->displayHeight = 64;
+ } else if (g == GEOMETRY_128_32) {
+ this->displayWidth = 128;
+ this->displayHeight = 32;
+ }
+ this->displayBufferSize = displayWidth*displayHeight/8;
+}
+
+void OLEDDisplay::sendInitCommands(void) {
+ sendCommand(DISPLAYOFF);
+ sendCommand(SETDISPLAYCLOCKDIV);
+ sendCommand(0xF0); // Increase speed of the display max ~96Hz
+ sendCommand(SETMULTIPLEX);
+ sendCommand(this->height() - 1);
+ sendCommand(SETDISPLAYOFFSET);
+ sendCommand(0x00);
+ sendCommand(SETSTARTLINE);
+ sendCommand(CHARGEPUMP);
+ sendCommand(0x14);
+ sendCommand(MEMORYMODE);
+ sendCommand(0x00);
+ sendCommand(SEGREMAP);
+ sendCommand(COMSCANINC);
+ sendCommand(SETCOMPINS);
+
+ if (geometry == GEOMETRY_128_64) {
+ sendCommand(0x12);
+ } else if (geometry == GEOMETRY_128_32) {
+ sendCommand(0x02);
+ }
+
+ sendCommand(SETCONTRAST);
+
+ if (geometry == GEOMETRY_128_64) {
+ sendCommand(0xCF);
+ } else if (geometry == GEOMETRY_128_32) {
+ sendCommand(0x8F);
+ }
+
+ sendCommand(SETPRECHARGE);
+ sendCommand(0xF1);
+ sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast)
+ sendCommand(0x40); //0x40 default, to lower the contrast, put 0
+ sendCommand(DISPLAYALLON_RESUME);
+ sendCommand(NORMALDISPLAY);
+ sendCommand(0x2e); // stop scroll
+ sendCommand(DISPLAYON);
+}
+
+void inline OLEDDisplay::drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) {
+ if (width < 0 || height < 0) return;
+ if (yMove + height < 0 || yMove > this->height()) return;
+ if (xMove + width < 0 || xMove > this->width()) return;
+
+ uint8_t rasterHeight = 1 + ((height - 1) >> 3); // fast ceil(height / 8.0)
+ int8_t yOffset = yMove & 7;
+
+ bytesInData = bytesInData == 0 ? width * rasterHeight : bytesInData;
+
+ int16_t initYMove = yMove;
+ int8_t initYOffset = yOffset;
+
+
+ for (uint16_t i = 0; i < bytesInData; i++) {
+
+ // Reset if next horizontal drawing phase is started.
+ if ( i % rasterHeight == 0) {
+ yMove = initYMove;
+ yOffset = initYOffset;
+ }
+
+ uint8_t currentByte = pgm_read_byte(data + offset + i);
+
+ int16_t xPos = xMove + (i / rasterHeight);
+ int16_t yPos = ((yMove >> 3) + (i % rasterHeight)) * this->width();
+
+// int16_t yScreenPos = yMove + yOffset;
+ int16_t dataPos = xPos + yPos;
+
+ if (dataPos >= 0 && dataPos < displayBufferSize &&
+ xPos >= 0 && xPos < this->width() ) {
+
+ if (yOffset >= 0) {
+ switch (this->color) {
+ case WHITE: buffer[dataPos] |= currentByte << yOffset; break;
+ case BLACK: buffer[dataPos] &= ~(currentByte << yOffset); break;
+ case INVERSE: buffer[dataPos] ^= currentByte << yOffset; break;
+ }
+
+ if (dataPos < (displayBufferSize - this->width())) {
+ switch (this->color) {
+ case WHITE: buffer[dataPos + this->width()] |= currentByte >> (8 - yOffset); break;
+ case BLACK: buffer[dataPos + this->width()] &= ~(currentByte >> (8 - yOffset)); break;
+ case INVERSE: buffer[dataPos + this->width()] ^= currentByte >> (8 - yOffset); break;
+ }
+ }
+ } else {
+ // Make new offset position
+ yOffset = -yOffset;
+
+ switch (this->color) {
+ case WHITE: buffer[dataPos] |= currentByte >> yOffset; break;
+ case BLACK: buffer[dataPos] &= ~(currentByte >> yOffset); break;
+ case INVERSE: buffer[dataPos] ^= currentByte >> yOffset; break;
+ }
+
+ // Prepare for next iteration by moving one block up
+ yMove -= 8;
+
+ // and setting the new yOffset
+ yOffset = 8 - yOffset;
+ }
+#ifndef __MBED__
+ yield();
+#endif
+ }
+ }
+}
+
+// You need to free the char!
+char* OLEDDisplay::utf8ascii(String str) {
+ uint16_t k = 0;
+ uint16_t length = str.length() + 1;
+
+ // Copy the string into a char array
+ char* s = (char*) malloc(length * sizeof(char));
+ if(!s) {
+ DEBUG_OLEDDISPLAY("[OLEDDISPLAY][utf8ascii] Can't allocate another char array. Drop support for UTF-8.\n");
+ return (char*) str.c_str();
+ }
+ str.toCharArray(s, length);
+
+ length--;
+
+ for (uint16_t i=0; i < length; i++) {
+ char c = (this->fontTableLookupFunction)(s[i]);
+ if (c!=0) {
+ s[k++]=c;
+ }
+ }
+
+ s[k]=0;
+
+ // This will leak 's' be sure to free it in the calling function.
+ return s;
+}
+
+void OLEDDisplay::setFontTableLookupFunction(FontTableLookupFunction function) {
+ this->fontTableLookupFunction = function;
+}
+
+
+char DefaultFontTableLookup(const char ch) {
+ // UTF-8 to font table index converter
+ // Code form http://playground.arduino.cc/Main/Utf8ascii
+ static uint8_t LASTCHAR;
+
+ if (ch < 128) { // Standard ASCII-set 0..0x7F handling
+ LASTCHAR = 0;
+ return ch;
+ }
+
+ uint8_t last = LASTCHAR; // get last char
+ LASTCHAR = ch;
+
+ switch (last) { // conversion depnding on first UTF8-character
+ case 0xC2: return (uint8_t) ch;
+ case 0xC3: return (uint8_t) (ch | 0xC0);
+ case 0x82: if (ch == 0xAC) return (uint8_t) 0x80; // special case Euro-symbol
+ }
+
+ return (uint8_t) 0; // otherwise: return zero, if character has to be ignored
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplay.h Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,359 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
+ * Copyright (c) 2018 by Fabrice Weinberg
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+#ifndef OLEDDISPLAY_h
+#define OLEDDISPLAY_h
+
+#ifdef ARDUINO
+#include <Arduino.h>
+#elif __MBED__
+#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+
+#include <mbed.h>
+#define delay(x) wait_ms(x)
+#define yield() void()
+
+/*
+ * This is a little Arduino String emulation to keep the OLEDDisplay
+ * library code in common between Arduino and mbed-os
+ */
+class String {
+public:
+ String(const char *s) { _str = s; };
+ int length() { return strlen(_str); };
+ const char *c_str() { return _str; };
+ void toCharArray(char *buf, unsigned int bufsize, unsigned int index = 0) const {
+ memcpy(buf, _str + index, std::min(bufsize, strlen(_str)));
+ };
+private:
+ const char *_str;
+};
+
+#else
+#error "Unkown operating system"
+#endif
+
+#include "OLEDDisplayFonts.h"
+
+//#define DEBUG_OLEDDISPLAY(...) Serial.printf( __VA_ARGS__ )
+//#define DEBUG_OLEDDISPLAY(...) dprintf("%s", __VA_ARGS__ )
+
+#ifndef DEBUG_OLEDDISPLAY
+#define DEBUG_OLEDDISPLAY(...)
+#endif
+
+// Use DOUBLE BUFFERING by default
+#ifndef OLEDDISPLAY_REDUCE_MEMORY
+#define OLEDDISPLAY_DOUBLE_BUFFER
+#endif
+
+// Header Values
+#define JUMPTABLE_BYTES 4
+
+#define JUMPTABLE_LSB 1
+#define JUMPTABLE_SIZE 2
+#define JUMPTABLE_WIDTH 3
+#define JUMPTABLE_START 4
+
+#define WIDTH_POS 0
+#define HEIGHT_POS 1
+#define FIRST_CHAR_POS 2
+#define CHAR_NUM_POS 3
+
+
+// Display commands
+#define CHARGEPUMP 0x8D
+#define COLUMNADDR 0x21
+#define COMSCANDEC 0xC8
+#define COMSCANINC 0xC0
+#define DISPLAYALLON 0xA5
+#define DISPLAYALLON_RESUME 0xA4
+#define DISPLAYOFF 0xAE
+#define DISPLAYON 0xAF
+#define EXTERNALVCC 0x1
+#define INVERTDISPLAY 0xA7
+#define MEMORYMODE 0x20
+#define NORMALDISPLAY 0xA6
+#define PAGEADDR 0x22
+#define SEGREMAP 0xA0
+#define SETCOMPINS 0xDA
+#define SETCONTRAST 0x81
+#define SETDISPLAYCLOCKDIV 0xD5
+#define SETDISPLAYOFFSET 0xD3
+#define SETHIGHCOLUMN 0x10
+#define SETLOWCOLUMN 0x00
+#define SETMULTIPLEX 0xA8
+#define SETPRECHARGE 0xD9
+#define SETSEGMENTREMAP 0xA1
+#define SETSTARTLINE 0x40
+#define SETVCOMDETECT 0xDB
+#define SWITCHCAPVCC 0x2
+
+#ifndef _swap_int16_t
+#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
+#endif
+
+enum OLEDDISPLAY_COLOR {
+ BLACK = 0,
+ WHITE = 1,
+ INVERSE = 2
+};
+
+enum OLEDDISPLAY_TEXT_ALIGNMENT {
+ TEXT_ALIGN_LEFT = 0,
+ TEXT_ALIGN_RIGHT = 1,
+ TEXT_ALIGN_CENTER = 2,
+ TEXT_ALIGN_CENTER_BOTH = 3
+};
+
+
+enum OLEDDISPLAY_GEOMETRY {
+ GEOMETRY_128_64 = 0,
+ GEOMETRY_128_32 = 1
+};
+
+typedef char (*FontTableLookupFunction)(const char ch);
+char DefaultFontTableLookup(const char ch);
+
+
+#ifdef ARDUINO
+class OLEDDisplay : public Print {
+#elif __MBED__
+class OLEDDisplay : public Stream {
+#else
+#error "Unkown operating system"
+#endif
+
+ public:
+ OLEDDisplay();
+ virtual ~OLEDDisplay();
+
+ uint16_t width(void) const { return displayWidth; };
+ uint16_t height(void) const { return displayHeight; };
+
+ // Initialize the display
+ bool init();
+
+ // Free the memory used by the display
+ void end();
+
+ // Cycle through the initialization
+ void resetDisplay(void);
+
+ /* Drawing functions */
+ // Sets the color of all pixel operations
+ void setColor(OLEDDISPLAY_COLOR color);
+
+ // Returns the current color.
+ OLEDDISPLAY_COLOR getColor();
+
+ // Draw a pixel at given position
+ void setPixel(int16_t x, int16_t y);
+
+ // Draw a line from position 0 to position 1
+ void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1);
+
+ // Draw the border of a rectangle at the given location
+ void drawRect(int16_t x, int16_t y, int16_t width, int16_t height);
+
+ // Fill the rectangle
+ void fillRect(int16_t x, int16_t y, int16_t width, int16_t height);
+
+ // Draw the border of a circle
+ void drawCircle(int16_t x, int16_t y, int16_t radius);
+
+ // Draw all Quadrants specified in the quads bit mask
+ void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads);
+
+ // Fill circle
+ void fillCircle(int16_t x, int16_t y, int16_t radius);
+
+ // Draw a line horizontally
+ void drawHorizontalLine(int16_t x, int16_t y, int16_t length);
+
+ // Draw a line vertically
+ void drawVerticalLine(int16_t x, int16_t y, int16_t length);
+
+ // Draws a rounded progress bar with the outer dimensions given by width and height. Progress is
+ // a unsigned byte value between 0 and 100
+ void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress);
+
+ // Draw a bitmap in the internal image format
+ void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image);
+
+ // Draw a XBM
+ void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *xbm);
+
+ /* Text functions */
+
+ // Draws a string at the given location
+ void drawString(int16_t x, int16_t y, String text);
+
+ // Draws a String with a maximum width at the given location.
+ // If the given String is wider than the specified width
+ // The text will be wrapped to the next line at a space or dash
+ void drawStringMaxWidth(int16_t x, int16_t y, uint16_t maxLineWidth, String text);
+
+ // Returns the width of the const char* with the current
+ // font settings
+ uint16_t getStringWidth(const char* text, uint16_t length);
+
+ // Convencience method for the const char version
+ uint16_t getStringWidth(String text);
+
+ // Specifies relative to which anchor point
+ // the text is rendered. Available constants:
+ // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH
+ void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment);
+
+ // Sets the current font. Available default fonts
+ // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24
+ void setFont(const uint8_t *fontData);
+
+ // Set the function that will convert utf-8 to font table index
+ void setFontTableLookupFunction(FontTableLookupFunction function);
+
+ /* Display functions */
+
+ // Turn the display on
+ void displayOn(void);
+
+ // Turn the display offs
+ void displayOff(void);
+
+ // Inverted display mode
+ void invertDisplay(void);
+
+ // Normal display mode
+ void normalDisplay(void);
+
+ // Set display contrast
+ // really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0
+ // normal brightness & contrast: contrast = 100
+ void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64);
+
+ // Convenience method to access
+ void setBrightness(uint8_t);
+
+ // Reset display rotation or mirroring
+ void resetOrientation();
+
+ // Turn the display upside down
+ void flipScreenVertically();
+
+ // Mirror the display (to be used in a mirror or as a projector)
+ void mirrorScreen();
+
+ // Write the buffer to the display memory
+ virtual void display(void) = 0;
+
+ // Clear the local pixel buffer
+ void clear(void);
+
+ // Log buffer implementation
+
+ // This will define the lines and characters you can
+ // print to the screen. When you exeed the buffer size (lines * chars)
+ // the output may be truncated due to the size constraint.
+ bool setLogBuffer(uint16_t lines, uint16_t chars);
+
+ // Draw the log buffer at position (x, y)
+ void drawLogBuffer(uint16_t x, uint16_t y);
+
+ // Get screen geometry
+ uint16_t getWidth(void);
+ uint16_t getHeight(void);
+
+ // Implement needed function to be compatible with Print class
+ size_t write(uint8_t c);
+ size_t write(const char* s);
+
+ // Implement needed function to be compatible with Stream class
+#ifdef __MBED__
+ int _putc(int c);
+ int _getc() { return -1; };
+#endif
+
+
+ uint8_t *buffer;
+
+ #ifdef OLEDDISPLAY_DOUBLE_BUFFER
+ uint8_t *buffer_back;
+ #endif
+
+ protected:
+
+ OLEDDISPLAY_GEOMETRY geometry;
+
+ uint16_t displayWidth;
+ uint16_t displayHeight;
+ uint16_t displayBufferSize;
+
+ // Set the correct height, width and buffer for the geometry
+ void setGeometry(OLEDDISPLAY_GEOMETRY g);
+
+ OLEDDISPLAY_TEXT_ALIGNMENT textAlignment;
+ OLEDDISPLAY_COLOR color;
+
+ const uint8_t *fontData;
+
+ // State values for logBuffer
+ uint16_t logBufferSize;
+ uint16_t logBufferFilled;
+ uint16_t logBufferLine;
+ uint16_t logBufferMaxLines;
+ char *logBuffer;
+
+
+ // the header size of the buffer used, e.g. for the SPI command header
+ virtual int getBufferOffset(void) = 0;
+
+ // Send a command to the display (low level function)
+ virtual void sendCommand(uint8_t com) {(void)com;};
+
+ // Connect to the display
+ virtual bool connect() { return false; };
+
+ // Send all the init commands
+ void sendInitCommands();
+
+ // converts utf8 characters to extended ascii
+ char* utf8ascii(String s);
+
+ void inline drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) __attribute__((always_inline));
+
+ void drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth);
+
+ FontTableLookupFunction fontTableLookupFunction;
+};
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplayFonts.h Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,1279 @@
+#ifndef OLEDDISPLAYFONTS_h
+#define OLEDDISPLAYFONTS_h
+
+#ifdef __MBED__
+#define PROGMEM
+#endif
+
+const uint8_t ArialMT_Plain_10[] PROGMEM = {
+ 0x0A, // Width: 10
+ 0x0D, // Height: 13
+ 0x20, // First Char: 32
+ 0xE0, // Numbers of Chars: 224
+
+ // Jump Table:
+ 0xFF, 0xFF, 0x00, 0x03, // 32:65535
+ 0x00, 0x00, 0x04, 0x03, // 33:0
+ 0x00, 0x04, 0x05, 0x04, // 34:4
+ 0x00, 0x09, 0x09, 0x06, // 35:9
+ 0x00, 0x12, 0x0A, 0x06, // 36:18
+ 0x00, 0x1C, 0x10, 0x09, // 37:28
+ 0x00, 0x2C, 0x0E, 0x07, // 38:44
+ 0x00, 0x3A, 0x01, 0x02, // 39:58
+ 0x00, 0x3B, 0x06, 0x03, // 40:59
+ 0x00, 0x41, 0x06, 0x03, // 41:65
+ 0x00, 0x47, 0x05, 0x04, // 42:71
+ 0x00, 0x4C, 0x09, 0x06, // 43:76
+ 0x00, 0x55, 0x04, 0x03, // 44:85
+ 0x00, 0x59, 0x03, 0x03, // 45:89
+ 0x00, 0x5C, 0x04, 0x03, // 46:92
+ 0x00, 0x60, 0x05, 0x03, // 47:96
+ 0x00, 0x65, 0x0A, 0x06, // 48:101
+ 0x00, 0x6F, 0x08, 0x06, // 49:111
+ 0x00, 0x77, 0x0A, 0x06, // 50:119
+ 0x00, 0x81, 0x0A, 0x06, // 51:129
+ 0x00, 0x8B, 0x0B, 0x06, // 52:139
+ 0x00, 0x96, 0x0A, 0x06, // 53:150
+ 0x00, 0xA0, 0x0A, 0x06, // 54:160
+ 0x00, 0xAA, 0x09, 0x06, // 55:170
+ 0x00, 0xB3, 0x0A, 0x06, // 56:179
+ 0x00, 0xBD, 0x0A, 0x06, // 57:189
+ 0x00, 0xC7, 0x04, 0x03, // 58:199
+ 0x00, 0xCB, 0x04, 0x03, // 59:203
+ 0x00, 0xCF, 0x0A, 0x06, // 60:207
+ 0x00, 0xD9, 0x09, 0x06, // 61:217
+ 0x00, 0xE2, 0x09, 0x06, // 62:226
+ 0x00, 0xEB, 0x0B, 0x06, // 63:235
+ 0x00, 0xF6, 0x14, 0x0A, // 64:246
+ 0x01, 0x0A, 0x0E, 0x07, // 65:266
+ 0x01, 0x18, 0x0C, 0x07, // 66:280
+ 0x01, 0x24, 0x0C, 0x07, // 67:292
+ 0x01, 0x30, 0x0B, 0x07, // 68:304
+ 0x01, 0x3B, 0x0C, 0x07, // 69:315
+ 0x01, 0x47, 0x09, 0x06, // 70:327
+ 0x01, 0x50, 0x0D, 0x08, // 71:336
+ 0x01, 0x5D, 0x0C, 0x07, // 72:349
+ 0x01, 0x69, 0x04, 0x03, // 73:361
+ 0x01, 0x6D, 0x08, 0x05, // 74:365
+ 0x01, 0x75, 0x0E, 0x07, // 75:373
+ 0x01, 0x83, 0x0C, 0x06, // 76:387
+ 0x01, 0x8F, 0x10, 0x08, // 77:399
+ 0x01, 0x9F, 0x0C, 0x07, // 78:415
+ 0x01, 0xAB, 0x0E, 0x08, // 79:427
+ 0x01, 0xB9, 0x0B, 0x07, // 80:441
+ 0x01, 0xC4, 0x0E, 0x08, // 81:452
+ 0x01, 0xD2, 0x0C, 0x07, // 82:466
+ 0x01, 0xDE, 0x0C, 0x07, // 83:478
+ 0x01, 0xEA, 0x0B, 0x06, // 84:490
+ 0x01, 0xF5, 0x0C, 0x07, // 85:501
+ 0x02, 0x01, 0x0D, 0x07, // 86:513
+ 0x02, 0x0E, 0x11, 0x09, // 87:526
+ 0x02, 0x1F, 0x0E, 0x07, // 88:543
+ 0x02, 0x2D, 0x0D, 0x07, // 89:557
+ 0x02, 0x3A, 0x0C, 0x06, // 90:570
+ 0x02, 0x46, 0x06, 0x03, // 91:582
+ 0x02, 0x4C, 0x06, 0x03, // 92:588
+ 0x02, 0x52, 0x04, 0x03, // 93:594
+ 0x02, 0x56, 0x09, 0x05, // 94:598
+ 0x02, 0x5F, 0x0C, 0x06, // 95:607
+ 0x02, 0x6B, 0x03, 0x03, // 96:619
+ 0x02, 0x6E, 0x0A, 0x06, // 97:622
+ 0x02, 0x78, 0x0A, 0x06, // 98:632
+ 0x02, 0x82, 0x0A, 0x05, // 99:642
+ 0x02, 0x8C, 0x0A, 0x06, // 100:652
+ 0x02, 0x96, 0x0A, 0x06, // 101:662
+ 0x02, 0xA0, 0x05, 0x03, // 102:672
+ 0x02, 0xA5, 0x0A, 0x06, // 103:677
+ 0x02, 0xAF, 0x0A, 0x06, // 104:687
+ 0x02, 0xB9, 0x04, 0x02, // 105:697
+ 0x02, 0xBD, 0x04, 0x02, // 106:701
+ 0x02, 0xC1, 0x08, 0x05, // 107:705
+ 0x02, 0xC9, 0x04, 0x02, // 108:713
+ 0x02, 0xCD, 0x10, 0x08, // 109:717
+ 0x02, 0xDD, 0x0A, 0x06, // 110:733
+ 0x02, 0xE7, 0x0A, 0x06, // 111:743
+ 0x02, 0xF1, 0x0A, 0x06, // 112:753
+ 0x02, 0xFB, 0x0A, 0x06, // 113:763
+ 0x03, 0x05, 0x05, 0x03, // 114:773
+ 0x03, 0x0A, 0x08, 0x05, // 115:778
+ 0x03, 0x12, 0x06, 0x03, // 116:786
+ 0x03, 0x18, 0x0A, 0x06, // 117:792
+ 0x03, 0x22, 0x09, 0x05, // 118:802
+ 0x03, 0x2B, 0x0E, 0x07, // 119:811
+ 0x03, 0x39, 0x0A, 0x05, // 120:825
+ 0x03, 0x43, 0x09, 0x05, // 121:835
+ 0x03, 0x4C, 0x0A, 0x05, // 122:844
+ 0x03, 0x56, 0x06, 0x03, // 123:854
+ 0x03, 0x5C, 0x04, 0x03, // 124:860
+ 0x03, 0x60, 0x05, 0x03, // 125:864
+ 0x03, 0x65, 0x09, 0x06, // 126:869
+ 0xFF, 0xFF, 0x00, 0x00, // 127:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 128:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 129:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 130:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 131:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 132:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 133:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 134:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 135:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 136:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 137:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 138:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 139:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 140:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 141:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 142:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 143:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 144:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 145:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 146:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 147:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 148:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 149:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 150:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 151:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 152:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 153:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 154:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 155:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 156:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 157:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 158:65535
+ 0xFF, 0xFF, 0x00, 0x0A, // 159:65535
+ 0xFF, 0xFF, 0x00, 0x03, // 160:65535
+ 0x03, 0x6E, 0x04, 0x03, // 161:878
+ 0x03, 0x72, 0x0A, 0x06, // 162:882
+ 0x03, 0x7C, 0x0C, 0x06, // 163:892
+ 0x03, 0x88, 0x0A, 0x06, // 164:904
+ 0x03, 0x92, 0x0A, 0x06, // 165:914
+ 0x03, 0x9C, 0x04, 0x03, // 166:924
+ 0x03, 0xA0, 0x0A, 0x06, // 167:928
+ 0x03, 0xAA, 0x05, 0x03, // 168:938
+ 0x03, 0xAF, 0x0D, 0x07, // 169:943
+ 0x03, 0xBC, 0x07, 0x04, // 170:956
+ 0x03, 0xC3, 0x0A, 0x06, // 171:963
+ 0x03, 0xCD, 0x09, 0x06, // 172:973
+ 0x03, 0xD6, 0x03, 0x03, // 173:982
+ 0x03, 0xD9, 0x0D, 0x07, // 174:985
+ 0x03, 0xE6, 0x0B, 0x06, // 175:998
+ 0x03, 0xF1, 0x07, 0x04, // 176:1009
+ 0x03, 0xF8, 0x0A, 0x05, // 177:1016
+ 0x04, 0x02, 0x05, 0x03, // 178:1026
+ 0x04, 0x07, 0x05, 0x03, // 179:1031
+ 0x04, 0x0C, 0x05, 0x03, // 180:1036
+ 0x04, 0x11, 0x0A, 0x06, // 181:1041
+ 0x04, 0x1B, 0x09, 0x05, // 182:1051
+ 0x04, 0x24, 0x03, 0x03, // 183:1060
+ 0x04, 0x27, 0x06, 0x03, // 184:1063
+ 0x04, 0x2D, 0x05, 0x03, // 185:1069
+ 0x04, 0x32, 0x07, 0x04, // 186:1074
+ 0x04, 0x39, 0x0A, 0x06, // 187:1081
+ 0x04, 0x43, 0x10, 0x08, // 188:1091
+ 0x04, 0x53, 0x10, 0x08, // 189:1107
+ 0x04, 0x63, 0x10, 0x08, // 190:1123
+ 0x04, 0x73, 0x0A, 0x06, // 191:1139
+ 0x04, 0x7D, 0x0E, 0x07, // 192:1149
+ 0x04, 0x8B, 0x0E, 0x07, // 193:1163
+ 0x04, 0x99, 0x0E, 0x07, // 194:1177
+ 0x04, 0xA7, 0x0E, 0x07, // 195:1191
+ 0x04, 0xB5, 0x0E, 0x07, // 196:1205
+ 0x04, 0xC3, 0x0E, 0x07, // 197:1219
+ 0x04, 0xD1, 0x12, 0x0A, // 198:1233
+ 0x04, 0xE3, 0x0C, 0x07, // 199:1251
+ 0x04, 0xEF, 0x0C, 0x07, // 200:1263
+ 0x04, 0xFB, 0x0C, 0x07, // 201:1275
+ 0x05, 0x07, 0x0C, 0x07, // 202:1287
+ 0x05, 0x13, 0x0C, 0x07, // 203:1299
+ 0x05, 0x1F, 0x05, 0x03, // 204:1311
+ 0x05, 0x24, 0x04, 0x03, // 205:1316
+ 0x05, 0x28, 0x04, 0x03, // 206:1320
+ 0x05, 0x2C, 0x05, 0x03, // 207:1324
+ 0x05, 0x31, 0x0B, 0x07, // 208:1329
+ 0x05, 0x3C, 0x0C, 0x07, // 209:1340
+ 0x05, 0x48, 0x0E, 0x08, // 210:1352
+ 0x05, 0x56, 0x0E, 0x08, // 211:1366
+ 0x05, 0x64, 0x0E, 0x08, // 212:1380
+ 0x05, 0x72, 0x0E, 0x08, // 213:1394
+ 0x05, 0x80, 0x0E, 0x08, // 214:1408
+ 0x05, 0x8E, 0x0A, 0x06, // 215:1422
+ 0x05, 0x98, 0x0D, 0x08, // 216:1432
+ 0x05, 0xA5, 0x0C, 0x07, // 217:1445
+ 0x05, 0xB1, 0x0C, 0x07, // 218:1457
+ 0x05, 0xBD, 0x0C, 0x07, // 219:1469
+ 0x05, 0xC9, 0x0C, 0x07, // 220:1481
+ 0x05, 0xD5, 0x0D, 0x07, // 221:1493
+ 0x05, 0xE2, 0x0B, 0x07, // 222:1506
+ 0x05, 0xED, 0x0C, 0x06, // 223:1517
+ 0x05, 0xF9, 0x0A, 0x06, // 224:1529
+ 0x06, 0x03, 0x0A, 0x06, // 225:1539
+ 0x06, 0x0D, 0x0A, 0x06, // 226:1549
+ 0x06, 0x17, 0x0A, 0x06, // 227:1559
+ 0x06, 0x21, 0x0A, 0x06, // 228:1569
+ 0x06, 0x2B, 0x0A, 0x06, // 229:1579
+ 0x06, 0x35, 0x10, 0x09, // 230:1589
+ 0x06, 0x45, 0x0A, 0x05, // 231:1605
+ 0x06, 0x4F, 0x0A, 0x06, // 232:1615
+ 0x06, 0x59, 0x0A, 0x06, // 233:1625
+ 0x06, 0x63, 0x0A, 0x06, // 234:1635
+ 0x06, 0x6D, 0x0A, 0x06, // 235:1645
+ 0x06, 0x77, 0x05, 0x03, // 236:1655
+ 0x06, 0x7C, 0x04, 0x03, // 237:1660
+ 0x06, 0x80, 0x05, 0x03, // 238:1664
+ 0x06, 0x85, 0x05, 0x03, // 239:1669
+ 0x06, 0x8A, 0x0A, 0x06, // 240:1674
+ 0x06, 0x94, 0x0A, 0x06, // 241:1684
+ 0x06, 0x9E, 0x0A, 0x06, // 242:1694
+ 0x06, 0xA8, 0x0A, 0x06, // 243:1704
+ 0x06, 0xB2, 0x0A, 0x06, // 244:1714
+ 0x06, 0xBC, 0x0A, 0x06, // 245:1724
+ 0x06, 0xC6, 0x0A, 0x06, // 246:1734
+ 0x06, 0xD0, 0x09, 0x05, // 247:1744
+ 0x06, 0xD9, 0x0A, 0x06, // 248:1753
+ 0x06, 0xE3, 0x0A, 0x06, // 249:1763
+ 0x06, 0xED, 0x0A, 0x06, // 250:1773
+ 0x06, 0xF7, 0x0A, 0x06, // 251:1783
+ 0x07, 0x01, 0x0A, 0x06, // 252:1793
+ 0x07, 0x0B, 0x09, 0x05, // 253:1803
+ 0x07, 0x14, 0x0A, 0x06, // 254:1812
+ 0x07, 0x1E, 0x09, 0x05, // 255:1822
+
+ // Font Data:
+ 0x00,0x00,0xF8,0x02, // 33
+ 0x38,0x00,0x00,0x00,0x38, // 34
+ 0xA0,0x03,0xE0,0x00,0xB8,0x03,0xE0,0x00,0xB8, // 35
+ 0x30,0x01,0x28,0x02,0xF8,0x07,0x48,0x02,0x90,0x01, // 36
+ 0x00,0x00,0x30,0x00,0x48,0x00,0x30,0x03,0xC0,0x00,0xB0,0x01,0x48,0x02,0x80,0x01, // 37
+ 0x80,0x01,0x50,0x02,0x68,0x02,0xA8,0x02,0x18,0x01,0x80,0x03,0x80,0x02, // 38
+ 0x38, // 39
+ 0xE0,0x03,0x10,0x04,0x08,0x08, // 40
+ 0x08,0x08,0x10,0x04,0xE0,0x03, // 41
+ 0x28,0x00,0x18,0x00,0x28, // 42
+ 0x40,0x00,0x40,0x00,0xF0,0x01,0x40,0x00,0x40, // 43
+ 0x00,0x00,0x00,0x06, // 44
+ 0x80,0x00,0x80, // 45
+ 0x00,0x00,0x00,0x02, // 46
+ 0x00,0x03,0xE0,0x00,0x18, // 47
+ 0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 48
+ 0x00,0x00,0x20,0x00,0x10,0x00,0xF8,0x03, // 49
+ 0x10,0x02,0x08,0x03,0x88,0x02,0x48,0x02,0x30,0x02, // 50
+ 0x10,0x01,0x08,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 51
+ 0xC0,0x00,0xA0,0x00,0x90,0x00,0x88,0x00,0xF8,0x03,0x80, // 52
+ 0x60,0x01,0x38,0x02,0x28,0x02,0x28,0x02,0xC8,0x01, // 53
+ 0xF0,0x01,0x28,0x02,0x28,0x02,0x28,0x02,0xD0,0x01, // 54
+ 0x08,0x00,0x08,0x03,0xC8,0x00,0x38,0x00,0x08, // 55
+ 0xB0,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 56
+ 0x70,0x01,0x88,0x02,0x88,0x02,0x88,0x02,0xF0,0x01, // 57
+ 0x00,0x00,0x20,0x02, // 58
+ 0x00,0x00,0x20,0x06, // 59
+ 0x00,0x00,0x40,0x00,0xA0,0x00,0xA0,0x00,0x10,0x01, // 60
+ 0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0, // 61
+ 0x00,0x00,0x10,0x01,0xA0,0x00,0xA0,0x00,0x40, // 62
+ 0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x02,0x48,0x00,0x30, // 63
+ 0x00,0x00,0xC0,0x03,0x30,0x04,0xD0,0x09,0x28,0x0A,0x28,0x0A,0xC8,0x0B,0x68,0x0A,0x10,0x05,0xE0,0x04, // 64
+ 0x00,0x02,0xC0,0x01,0xB0,0x00,0x88,0x00,0xB0,0x00,0xC0,0x01,0x00,0x02, // 65
+ 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0xF0,0x01, // 66
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x10,0x01, // 67
+ 0x00,0x00,0xF8,0x03,0x08,0x02,0x08,0x02,0x10,0x01,0xE0, // 68
+ 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0x48,0x02, // 69
+ 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x08, // 70
+ 0x00,0x00,0xE0,0x00,0x10,0x01,0x08,0x02,0x48,0x02,0x50,0x01,0xC0, // 71
+ 0x00,0x00,0xF8,0x03,0x40,0x00,0x40,0x00,0x40,0x00,0xF8,0x03, // 72
+ 0x00,0x00,0xF8,0x03, // 73
+ 0x00,0x03,0x00,0x02,0x00,0x02,0xF8,0x01, // 74
+ 0x00,0x00,0xF8,0x03,0x80,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 75
+ 0x00,0x00,0xF8,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 76
+ 0x00,0x00,0xF8,0x03,0x30,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x30,0x00,0xF8,0x03, // 77
+ 0x00,0x00,0xF8,0x03,0x30,0x00,0x40,0x00,0x80,0x01,0xF8,0x03, // 78
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 79
+ 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x48,0x00,0x30, // 80
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x03,0x08,0x03,0xF0,0x02, // 81
+ 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0xC8,0x00,0x30,0x03, // 82
+ 0x00,0x00,0x30,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0x90,0x01, // 83
+ 0x00,0x00,0x08,0x00,0x08,0x00,0xF8,0x03,0x08,0x00,0x08, // 84
+ 0x00,0x00,0xF8,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x01, // 85
+ 0x08,0x00,0x70,0x00,0x80,0x01,0x00,0x02,0x80,0x01,0x70,0x00,0x08, // 86
+ 0x18,0x00,0xE0,0x01,0x00,0x02,0xF0,0x01,0x08,0x00,0xF0,0x01,0x00,0x02,0xE0,0x01,0x18, // 87
+ 0x00,0x02,0x08,0x01,0x90,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 88
+ 0x08,0x00,0x10,0x00,0x20,0x00,0xC0,0x03,0x20,0x00,0x10,0x00,0x08, // 89
+ 0x08,0x03,0x88,0x02,0xC8,0x02,0x68,0x02,0x38,0x02,0x18,0x02, // 90
+ 0x00,0x00,0xF8,0x0F,0x08,0x08, // 91
+ 0x18,0x00,0xE0,0x00,0x00,0x03, // 92
+ 0x08,0x08,0xF8,0x0F, // 93
+ 0x40,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x40, // 94
+ 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08, // 95
+ 0x08,0x00,0x10, // 96
+ 0x00,0x00,0x00,0x03,0xA0,0x02,0xA0,0x02,0xE0,0x03, // 97
+ 0x00,0x00,0xF8,0x03,0x20,0x02,0x20,0x02,0xC0,0x01, // 98
+ 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x40,0x01, // 99
+ 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xF8,0x03, // 100
+ 0x00,0x00,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 101
+ 0x20,0x00,0xF0,0x03,0x28, // 102
+ 0x00,0x00,0xC0,0x05,0x20,0x0A,0x20,0x0A,0xE0,0x07, // 103
+ 0x00,0x00,0xF8,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 104
+ 0x00,0x00,0xE8,0x03, // 105
+ 0x00,0x08,0xE8,0x07, // 106
+ 0xF8,0x03,0x80,0x00,0xC0,0x01,0x20,0x02, // 107
+ 0x00,0x00,0xF8,0x03, // 108
+ 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 109
+ 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 110
+ 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xC0,0x01, // 111
+ 0x00,0x00,0xE0,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 112
+ 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xE0,0x0F, // 113
+ 0x00,0x00,0xE0,0x03,0x20, // 114
+ 0x40,0x02,0xA0,0x02,0xA0,0x02,0x20,0x01, // 115
+ 0x20,0x00,0xF8,0x03,0x20,0x02, // 116
+ 0x00,0x00,0xE0,0x01,0x00,0x02,0x00,0x02,0xE0,0x03, // 117
+ 0x20,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x20, // 118
+ 0xE0,0x01,0x00,0x02,0xC0,0x01,0x20,0x00,0xC0,0x01,0x00,0x02,0xE0,0x01, // 119
+ 0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02, // 120
+ 0x20,0x00,0xC0,0x09,0x00,0x06,0xC0,0x01,0x20, // 121
+ 0x20,0x02,0x20,0x03,0xA0,0x02,0x60,0x02,0x20,0x02, // 122
+ 0x80,0x00,0x78,0x0F,0x08,0x08, // 123
+ 0x00,0x00,0xF8,0x0F, // 124
+ 0x08,0x08,0x78,0x0F,0x80, // 125
+ 0xC0,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0xC0, // 126
+ 0x00,0x00,0xA0,0x0F, // 161
+ 0x00,0x00,0xC0,0x01,0xA0,0x0F,0x78,0x02,0x40,0x01, // 162
+ 0x40,0x02,0x70,0x03,0xC8,0x02,0x48,0x02,0x08,0x02,0x10,0x02, // 163
+ 0x00,0x00,0xE0,0x01,0x20,0x01,0x20,0x01,0xE0,0x01, // 164
+ 0x48,0x01,0x70,0x01,0xC0,0x03,0x70,0x01,0x48,0x01, // 165
+ 0x00,0x00,0x38,0x0F, // 166
+ 0xD0,0x04,0x28,0x09,0x48,0x09,0x48,0x0A,0x90,0x05, // 167
+ 0x08,0x00,0x00,0x00,0x08, // 168
+ 0xE0,0x00,0x10,0x01,0x48,0x02,0xA8,0x02,0xA8,0x02,0x10,0x01,0xE0, // 169
+ 0x68,0x00,0x68,0x00,0x68,0x00,0x78, // 170
+ 0x00,0x00,0x80,0x01,0x40,0x02,0x80,0x01,0x40,0x02, // 171
+ 0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0, // 172
+ 0x80,0x00,0x80, // 173
+ 0xE0,0x00,0x10,0x01,0xE8,0x02,0x68,0x02,0xC8,0x02,0x10,0x01,0xE0, // 174
+ 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 175
+ 0x00,0x00,0x38,0x00,0x28,0x00,0x38, // 176
+ 0x40,0x02,0x40,0x02,0xF0,0x03,0x40,0x02,0x40,0x02, // 177
+ 0x48,0x00,0x68,0x00,0x58, // 178
+ 0x48,0x00,0x58,0x00,0x68, // 179
+ 0x00,0x00,0x10,0x00,0x08, // 180
+ 0x00,0x00,0xE0,0x0F,0x00,0x02,0x00,0x02,0xE0,0x03, // 181
+ 0x70,0x00,0xF8,0x0F,0x08,0x00,0xF8,0x0F,0x08, // 182
+ 0x00,0x00,0x40, // 183
+ 0x00,0x00,0x00,0x14,0x00,0x18, // 184
+ 0x00,0x00,0x10,0x00,0x78, // 185
+ 0x30,0x00,0x48,0x00,0x48,0x00,0x30, // 186
+ 0x00,0x00,0x40,0x02,0x80,0x01,0x40,0x02,0x80,0x01, // 187
+ 0x00,0x00,0x10,0x02,0x78,0x01,0xC0,0x00,0x20,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 188
+ 0x00,0x00,0x10,0x02,0x78,0x01,0x80,0x00,0x60,0x00,0x50,0x02,0x48,0x03,0xC0,0x02, // 189
+ 0x48,0x00,0x58,0x00,0x68,0x03,0x80,0x00,0x60,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 190
+ 0x00,0x00,0x00,0x06,0x00,0x09,0xA0,0x09,0x00,0x04, // 191
+ 0x00,0x02,0xC0,0x01,0xB0,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 192
+ 0x00,0x02,0xC0,0x01,0xB0,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 193
+ 0x00,0x02,0xC0,0x01,0xB2,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 194
+ 0x00,0x02,0xC2,0x01,0xB1,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 195
+ 0x00,0x02,0xC0,0x01,0xB2,0x00,0x88,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 196
+ 0x00,0x02,0xC0,0x01,0xBE,0x00,0x8A,0x00,0xBE,0x00,0xC0,0x01,0x00,0x02, // 197
+ 0x00,0x03,0xC0,0x00,0xE0,0x00,0x98,0x00,0x88,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02, // 198
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x16,0x08,0x1A,0x10,0x01, // 199
+ 0x00,0x00,0xF8,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 200
+ 0x00,0x00,0xF8,0x03,0x48,0x02,0x4A,0x02,0x49,0x02,0x48,0x02, // 201
+ 0x00,0x00,0xFA,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 202
+ 0x00,0x00,0xF8,0x03,0x4A,0x02,0x48,0x02,0x4A,0x02,0x48,0x02, // 203
+ 0x00,0x00,0xF9,0x03,0x02, // 204
+ 0x02,0x00,0xF9,0x03, // 205
+ 0x01,0x00,0xFA,0x03, // 206
+ 0x02,0x00,0xF8,0x03,0x02, // 207
+ 0x40,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x10,0x01,0xE0, // 208
+ 0x00,0x00,0xFA,0x03,0x31,0x00,0x42,0x00,0x81,0x01,0xF8,0x03, // 209
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x09,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 210
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0xF0,0x01, // 211
+ 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x0A,0x02,0xF0,0x01, // 212
+ 0x00,0x00,0xF0,0x01,0x0A,0x02,0x09,0x02,0x0A,0x02,0x09,0x02,0xF0,0x01, // 213
+ 0x00,0x00,0xF0,0x01,0x0A,0x02,0x08,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 214
+ 0x10,0x01,0xA0,0x00,0xE0,0x00,0xA0,0x00,0x10,0x01, // 215
+ 0x00,0x00,0xF0,0x02,0x08,0x03,0xC8,0x02,0x28,0x02,0x18,0x03,0xE8, // 216
+ 0x00,0x00,0xF8,0x01,0x01,0x02,0x02,0x02,0x00,0x02,0xF8,0x01, // 217
+ 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x00,0x02,0xF8,0x01, // 218
+ 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x02,0x02,0xF8,0x01, // 219
+ 0x00,0x00,0xF8,0x01,0x02,0x02,0x00,0x02,0x02,0x02,0xF8,0x01, // 220
+ 0x08,0x00,0x10,0x00,0x20,0x00,0xC2,0x03,0x21,0x00,0x10,0x00,0x08, // 221
+ 0x00,0x00,0xF8,0x03,0x10,0x01,0x10,0x01,0x10,0x01,0xE0, // 222
+ 0x00,0x00,0xF0,0x03,0x08,0x01,0x48,0x02,0xB0,0x02,0x80,0x01, // 223
+ 0x00,0x00,0x00,0x03,0xA4,0x02,0xA8,0x02,0xE0,0x03, // 224
+ 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE0,0x03, // 225
+ 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE8,0x03, // 226
+ 0x00,0x00,0x08,0x03,0xA4,0x02,0xA8,0x02,0xE4,0x03, // 227
+ 0x00,0x00,0x00,0x03,0xA8,0x02,0xA0,0x02,0xE8,0x03, // 228
+ 0x00,0x00,0x00,0x03,0xAE,0x02,0xAA,0x02,0xEE,0x03, // 229
+ 0x00,0x00,0x40,0x03,0xA0,0x02,0xA0,0x02,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 230
+ 0x00,0x00,0xC0,0x01,0x20,0x16,0x20,0x1A,0x40,0x01, // 231
+ 0x00,0x00,0xC0,0x01,0xA4,0x02,0xA8,0x02,0xC0,0x02, // 232
+ 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC0,0x02, // 233
+ 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC8,0x02, // 234
+ 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA0,0x02,0xC8,0x02, // 235
+ 0x00,0x00,0xE4,0x03,0x08, // 236
+ 0x08,0x00,0xE4,0x03, // 237
+ 0x08,0x00,0xE4,0x03,0x08, // 238
+ 0x08,0x00,0xE0,0x03,0x08, // 239
+ 0x00,0x00,0xC0,0x01,0x28,0x02,0x38,0x02,0xE0,0x01, // 240
+ 0x00,0x00,0xE8,0x03,0x24,0x00,0x28,0x00,0xC4,0x03, // 241
+ 0x00,0x00,0xC0,0x01,0x24,0x02,0x28,0x02,0xC0,0x01, // 242
+ 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC0,0x01, // 243
+ 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC8,0x01, // 244
+ 0x00,0x00,0xC8,0x01,0x24,0x02,0x28,0x02,0xC4,0x01, // 245
+ 0x00,0x00,0xC0,0x01,0x28,0x02,0x20,0x02,0xC8,0x01, // 246
+ 0x40,0x00,0x40,0x00,0x50,0x01,0x40,0x00,0x40, // 247
+ 0x00,0x00,0xC0,0x02,0xA0,0x03,0x60,0x02,0xA0,0x01, // 248
+ 0x00,0x00,0xE0,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 249
+ 0x00,0x00,0xE0,0x01,0x08,0x02,0x04,0x02,0xE0,0x03, // 250
+ 0x00,0x00,0xE8,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 251
+ 0x00,0x00,0xE0,0x01,0x08,0x02,0x00,0x02,0xE8,0x03, // 252
+ 0x20,0x00,0xC0,0x09,0x08,0x06,0xC4,0x01,0x20, // 253
+ 0x00,0x00,0xF8,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 254
+ 0x20,0x00,0xC8,0x09,0x00,0x06,0xC8,0x01,0x20 // 255
+};
+
+const uint8_t ArialMT_Plain_16[] PROGMEM = {
+ 0x10, // Width: 16
+ 0x13, // Height: 19
+ 0x20, // First Char: 32
+ 0xE0, // Numbers of Chars: 224
+
+ // Jump Table:
+ 0xFF, 0xFF, 0x00, 0x04, // 32:65535
+ 0x00, 0x00, 0x08, 0x04, // 33:0
+ 0x00, 0x08, 0x0D, 0x06, // 34:8
+ 0x00, 0x15, 0x1A, 0x09, // 35:21
+ 0x00, 0x2F, 0x17, 0x09, // 36:47
+ 0x00, 0x46, 0x26, 0x0E, // 37:70
+ 0x00, 0x6C, 0x1D, 0x0B, // 38:108
+ 0x00, 0x89, 0x04, 0x03, // 39:137
+ 0x00, 0x8D, 0x0C, 0x05, // 40:141
+ 0x00, 0x99, 0x0B, 0x05, // 41:153
+ 0x00, 0xA4, 0x0D, 0x06, // 42:164
+ 0x00, 0xB1, 0x17, 0x09, // 43:177
+ 0x00, 0xC8, 0x09, 0x04, // 44:200
+ 0x00, 0xD1, 0x0B, 0x05, // 45:209
+ 0x00, 0xDC, 0x08, 0x04, // 46:220
+ 0x00, 0xE4, 0x0A, 0x04, // 47:228
+ 0x00, 0xEE, 0x17, 0x09, // 48:238
+ 0x01, 0x05, 0x11, 0x09, // 49:261
+ 0x01, 0x16, 0x17, 0x09, // 50:278
+ 0x01, 0x2D, 0x17, 0x09, // 51:301
+ 0x01, 0x44, 0x17, 0x09, // 52:324
+ 0x01, 0x5B, 0x17, 0x09, // 53:347
+ 0x01, 0x72, 0x17, 0x09, // 54:370
+ 0x01, 0x89, 0x16, 0x09, // 55:393
+ 0x01, 0x9F, 0x17, 0x09, // 56:415
+ 0x01, 0xB6, 0x17, 0x09, // 57:438
+ 0x01, 0xCD, 0x05, 0x04, // 58:461
+ 0x01, 0xD2, 0x06, 0x04, // 59:466
+ 0x01, 0xD8, 0x17, 0x09, // 60:472
+ 0x01, 0xEF, 0x17, 0x09, // 61:495
+ 0x02, 0x06, 0x17, 0x09, // 62:518
+ 0x02, 0x1D, 0x16, 0x09, // 63:541
+ 0x02, 0x33, 0x2F, 0x10, // 64:563
+ 0x02, 0x62, 0x1D, 0x0B, // 65:610
+ 0x02, 0x7F, 0x1D, 0x0B, // 66:639
+ 0x02, 0x9C, 0x20, 0x0C, // 67:668
+ 0x02, 0xBC, 0x20, 0x0C, // 68:700
+ 0x02, 0xDC, 0x1D, 0x0B, // 69:732
+ 0x02, 0xF9, 0x19, 0x0A, // 70:761
+ 0x03, 0x12, 0x20, 0x0C, // 71:786
+ 0x03, 0x32, 0x1D, 0x0C, // 72:818
+ 0x03, 0x4F, 0x05, 0x04, // 73:847
+ 0x03, 0x54, 0x14, 0x08, // 74:852
+ 0x03, 0x68, 0x1D, 0x0B, // 75:872
+ 0x03, 0x85, 0x17, 0x09, // 76:901
+ 0x03, 0x9C, 0x23, 0x0D, // 77:924
+ 0x03, 0xBF, 0x1D, 0x0C, // 78:959
+ 0x03, 0xDC, 0x20, 0x0C, // 79:988
+ 0x03, 0xFC, 0x1C, 0x0B, // 80:1020
+ 0x04, 0x18, 0x20, 0x0C, // 81:1048
+ 0x04, 0x38, 0x1D, 0x0C, // 82:1080
+ 0x04, 0x55, 0x1D, 0x0B, // 83:1109
+ 0x04, 0x72, 0x19, 0x0A, // 84:1138
+ 0x04, 0x8B, 0x1D, 0x0C, // 85:1163
+ 0x04, 0xA8, 0x1C, 0x0B, // 86:1192
+ 0x04, 0xC4, 0x2B, 0x0F, // 87:1220
+ 0x04, 0xEF, 0x20, 0x0B, // 88:1263
+ 0x05, 0x0F, 0x19, 0x0B, // 89:1295
+ 0x05, 0x28, 0x1A, 0x0A, // 90:1320
+ 0x05, 0x42, 0x0C, 0x04, // 91:1346
+ 0x05, 0x4E, 0x0B, 0x04, // 92:1358
+ 0x05, 0x59, 0x09, 0x04, // 93:1369
+ 0x05, 0x62, 0x14, 0x08, // 94:1378
+ 0x05, 0x76, 0x1B, 0x09, // 95:1398
+ 0x05, 0x91, 0x07, 0x05, // 96:1425
+ 0x05, 0x98, 0x17, 0x09, // 97:1432
+ 0x05, 0xAF, 0x17, 0x09, // 98:1455
+ 0x05, 0xC6, 0x14, 0x08, // 99:1478
+ 0x05, 0xDA, 0x17, 0x09, // 100:1498
+ 0x05, 0xF1, 0x17, 0x09, // 101:1521
+ 0x06, 0x08, 0x0A, 0x04, // 102:1544
+ 0x06, 0x12, 0x17, 0x09, // 103:1554
+ 0x06, 0x29, 0x14, 0x09, // 104:1577
+ 0x06, 0x3D, 0x05, 0x04, // 105:1597
+ 0x06, 0x42, 0x06, 0x04, // 106:1602
+ 0x06, 0x48, 0x17, 0x08, // 107:1608
+ 0x06, 0x5F, 0x05, 0x04, // 108:1631
+ 0x06, 0x64, 0x23, 0x0D, // 109:1636
+ 0x06, 0x87, 0x14, 0x09, // 110:1671
+ 0x06, 0x9B, 0x17, 0x09, // 111:1691
+ 0x06, 0xB2, 0x17, 0x09, // 112:1714
+ 0x06, 0xC9, 0x18, 0x09, // 113:1737
+ 0x06, 0xE1, 0x0D, 0x05, // 114:1761
+ 0x06, 0xEE, 0x14, 0x08, // 115:1774
+ 0x07, 0x02, 0x0B, 0x04, // 116:1794
+ 0x07, 0x0D, 0x14, 0x09, // 117:1805
+ 0x07, 0x21, 0x13, 0x08, // 118:1825
+ 0x07, 0x34, 0x1F, 0x0C, // 119:1844
+ 0x07, 0x53, 0x14, 0x08, // 120:1875
+ 0x07, 0x67, 0x13, 0x08, // 121:1895
+ 0x07, 0x7A, 0x14, 0x08, // 122:1914
+ 0x07, 0x8E, 0x0F, 0x05, // 123:1934
+ 0x07, 0x9D, 0x06, 0x04, // 124:1949
+ 0x07, 0xA3, 0x0E, 0x05, // 125:1955
+ 0x07, 0xB1, 0x17, 0x09, // 126:1969
+ 0xFF, 0xFF, 0x00, 0x00, // 127:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 128:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 129:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 130:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 131:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 132:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 133:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 134:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 135:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 136:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 137:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 138:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 139:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 140:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 141:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 142:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 143:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 144:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 145:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 146:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 147:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 148:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 149:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 150:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 151:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 152:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 153:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 154:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 155:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 156:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 157:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 158:65535
+ 0xFF, 0xFF, 0x00, 0x10, // 159:65535
+ 0xFF, 0xFF, 0x00, 0x04, // 160:65535
+ 0x07, 0xC8, 0x09, 0x05, // 161:1992
+ 0x07, 0xD1, 0x17, 0x09, // 162:2001
+ 0x07, 0xE8, 0x17, 0x09, // 163:2024
+ 0x07, 0xFF, 0x14, 0x09, // 164:2047
+ 0x08, 0x13, 0x1A, 0x09, // 165:2067
+ 0x08, 0x2D, 0x06, 0x04, // 166:2093
+ 0x08, 0x33, 0x17, 0x09, // 167:2099
+ 0x08, 0x4A, 0x07, 0x05, // 168:2122
+ 0x08, 0x51, 0x23, 0x0C, // 169:2129
+ 0x08, 0x74, 0x0E, 0x06, // 170:2164
+ 0x08, 0x82, 0x14, 0x09, // 171:2178
+ 0x08, 0x96, 0x17, 0x09, // 172:2198
+ 0x08, 0xAD, 0x0B, 0x05, // 173:2221
+ 0x08, 0xB8, 0x23, 0x0C, // 174:2232
+ 0x08, 0xDB, 0x19, 0x09, // 175:2267
+ 0x08, 0xF4, 0x0D, 0x06, // 176:2292
+ 0x09, 0x01, 0x17, 0x09, // 177:2305
+ 0x09, 0x18, 0x0E, 0x05, // 178:2328
+ 0x09, 0x26, 0x0D, 0x05, // 179:2342
+ 0x09, 0x33, 0x0A, 0x05, // 180:2355
+ 0x09, 0x3D, 0x17, 0x09, // 181:2365
+ 0x09, 0x54, 0x19, 0x09, // 182:2388
+ 0x09, 0x6D, 0x08, 0x05, // 183:2413
+ 0x09, 0x75, 0x0C, 0x05, // 184:2421
+ 0x09, 0x81, 0x0B, 0x05, // 185:2433
+ 0x09, 0x8C, 0x0D, 0x06, // 186:2444
+ 0x09, 0x99, 0x17, 0x09, // 187:2457
+ 0x09, 0xB0, 0x26, 0x0D, // 188:2480
+ 0x09, 0xD6, 0x26, 0x0D, // 189:2518
+ 0x09, 0xFC, 0x26, 0x0D, // 190:2556
+ 0x0A, 0x22, 0x1A, 0x0A, // 191:2594
+ 0x0A, 0x3C, 0x1D, 0x0B, // 192:2620
+ 0x0A, 0x59, 0x1D, 0x0B, // 193:2649
+ 0x0A, 0x76, 0x1D, 0x0B, // 194:2678
+ 0x0A, 0x93, 0x1D, 0x0B, // 195:2707
+ 0x0A, 0xB0, 0x1D, 0x0B, // 196:2736
+ 0x0A, 0xCD, 0x1D, 0x0B, // 197:2765
+ 0x0A, 0xEA, 0x2C, 0x10, // 198:2794
+ 0x0B, 0x16, 0x20, 0x0C, // 199:2838
+ 0x0B, 0x36, 0x1D, 0x0B, // 200:2870
+ 0x0B, 0x53, 0x1D, 0x0B, // 201:2899
+ 0x0B, 0x70, 0x1D, 0x0B, // 202:2928
+ 0x0B, 0x8D, 0x1D, 0x0B, // 203:2957
+ 0x0B, 0xAA, 0x05, 0x04, // 204:2986
+ 0x0B, 0xAF, 0x07, 0x04, // 205:2991
+ 0x0B, 0xB6, 0x0A, 0x04, // 206:2998
+ 0x0B, 0xC0, 0x07, 0x04, // 207:3008
+ 0x0B, 0xC7, 0x20, 0x0C, // 208:3015
+ 0x0B, 0xE7, 0x1D, 0x0C, // 209:3047
+ 0x0C, 0x04, 0x20, 0x0C, // 210:3076
+ 0x0C, 0x24, 0x20, 0x0C, // 211:3108
+ 0x0C, 0x44, 0x20, 0x0C, // 212:3140
+ 0x0C, 0x64, 0x20, 0x0C, // 213:3172
+ 0x0C, 0x84, 0x20, 0x0C, // 214:3204
+ 0x0C, 0xA4, 0x17, 0x09, // 215:3236
+ 0x0C, 0xBB, 0x20, 0x0C, // 216:3259
+ 0x0C, 0xDB, 0x1D, 0x0C, // 217:3291
+ 0x0C, 0xF8, 0x1D, 0x0C, // 218:3320
+ 0x0D, 0x15, 0x1D, 0x0C, // 219:3349
+ 0x0D, 0x32, 0x1D, 0x0C, // 220:3378
+ 0x0D, 0x4F, 0x19, 0x0B, // 221:3407
+ 0x0D, 0x68, 0x1D, 0x0B, // 222:3432
+ 0x0D, 0x85, 0x17, 0x0A, // 223:3461
+ 0x0D, 0x9C, 0x17, 0x09, // 224:3484
+ 0x0D, 0xB3, 0x17, 0x09, // 225:3507
+ 0x0D, 0xCA, 0x17, 0x09, // 226:3530
+ 0x0D, 0xE1, 0x17, 0x09, // 227:3553
+ 0x0D, 0xF8, 0x17, 0x09, // 228:3576
+ 0x0E, 0x0F, 0x17, 0x09, // 229:3599
+ 0x0E, 0x26, 0x29, 0x0E, // 230:3622
+ 0x0E, 0x4F, 0x14, 0x08, // 231:3663
+ 0x0E, 0x63, 0x17, 0x09, // 232:3683
+ 0x0E, 0x7A, 0x17, 0x09, // 233:3706
+ 0x0E, 0x91, 0x17, 0x09, // 234:3729
+ 0x0E, 0xA8, 0x17, 0x09, // 235:3752
+ 0x0E, 0xBF, 0x05, 0x04, // 236:3775
+ 0x0E, 0xC4, 0x07, 0x04, // 237:3780
+ 0x0E, 0xCB, 0x0A, 0x04, // 238:3787
+ 0x0E, 0xD5, 0x07, 0x04, // 239:3797
+ 0x0E, 0xDC, 0x17, 0x09, // 240:3804
+ 0x0E, 0xF3, 0x14, 0x09, // 241:3827
+ 0x0F, 0x07, 0x17, 0x09, // 242:3847
+ 0x0F, 0x1E, 0x17, 0x09, // 243:3870
+ 0x0F, 0x35, 0x17, 0x09, // 244:3893
+ 0x0F, 0x4C, 0x17, 0x09, // 245:3916
+ 0x0F, 0x63, 0x17, 0x09, // 246:3939
+ 0x0F, 0x7A, 0x17, 0x09, // 247:3962
+ 0x0F, 0x91, 0x17, 0x0A, // 248:3985
+ 0x0F, 0xA8, 0x14, 0x09, // 249:4008
+ 0x0F, 0xBC, 0x14, 0x09, // 250:4028
+ 0x0F, 0xD0, 0x14, 0x09, // 251:4048
+ 0x0F, 0xE4, 0x14, 0x09, // 252:4068
+ 0x0F, 0xF8, 0x13, 0x08, // 253:4088
+ 0x10, 0x0B, 0x17, 0x09, // 254:4107
+ 0x10, 0x22, 0x13, 0x08, // 255:4130
+
+ // Font Data:
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x5F, // 33
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, // 34
+ 0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08, // 35
+ 0x00,0x00,0x00,0xE0,0x10,0x00,0x10,0x21,0x00,0x08,0x41,0x00,0xFC,0xFF,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 36
+ 0x00,0x00,0x00,0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x61,0x00,0xF0,0x18,0x00,0x00,0x06,0x00,0xC0,0x01,0x00,0x30,0x3C,0x00,0x08,0x42,0x00,0x00,0x42,0x00,0x00,0x42,0x00,0x00,0x3C, // 37
+ 0x00,0x00,0x00,0x00,0x1C,0x00,0x70,0x22,0x00,0x88,0x41,0x00,0x08,0x43,0x00,0x88,0x44,0x00,0x70,0x28,0x00,0x00,0x10,0x00,0x00,0x28,0x00,0x00,0x44, // 38
+ 0x00,0x00,0x00,0x78, // 39
+ 0x00,0x00,0x00,0x80,0x3F,0x00,0x70,0xC0,0x01,0x08,0x00,0x02, // 40
+ 0x00,0x00,0x00,0x08,0x00,0x02,0x70,0xC0,0x01,0x80,0x3F, // 41
+ 0x10,0x00,0x00,0xD0,0x00,0x00,0x38,0x00,0x00,0xD0,0x00,0x00,0x10, // 42
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xC0,0x1F,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 43
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01, // 44
+ 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 45
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, // 46
+ 0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 47
+ 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xE0,0x1F, // 48
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0xF8,0x7F, // 49
+ 0x00,0x00,0x00,0x20,0x40,0x00,0x10,0x60,0x00,0x08,0x50,0x00,0x08,0x48,0x00,0x08,0x44,0x00,0x10,0x43,0x00,0xE0,0x40, // 50
+ 0x00,0x00,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x88,0x41,0x00,0xF0,0x22,0x00,0x00,0x1C, // 51
+ 0x00,0x0C,0x00,0x00,0x0A,0x00,0x00,0x09,0x00,0xC0,0x08,0x00,0x20,0x08,0x00,0x10,0x08,0x00,0xF8,0x7F,0x00,0x00,0x08, // 52
+ 0x00,0x00,0x00,0xC0,0x11,0x00,0xB8,0x20,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x08,0x21,0x00,0x08,0x1E, // 53
+ 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x21,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x10,0x21,0x00,0x20,0x1E, // 54
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x78,0x00,0x08,0x07,0x00,0xC8,0x00,0x00,0x28,0x00,0x00,0x18, // 55
+ 0x00,0x00,0x00,0x60,0x1C,0x00,0x90,0x22,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 56
+ 0x00,0x00,0x00,0xE0,0x11,0x00,0x10,0x22,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x10,0x22,0x00,0xE0,0x1F, // 57
+ 0x00,0x00,0x00,0x40,0x40, // 58
+ 0x00,0x00,0x00,0x40,0xC0,0x01, // 59
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x40,0x10, // 60
+ 0x00,0x00,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08, // 61
+ 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x02, // 62
+ 0x00,0x00,0x00,0x60,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x08,0x5C,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 63
+ 0x00,0x00,0x00,0x00,0x3F,0x00,0xC0,0x40,0x00,0x20,0x80,0x00,0x10,0x1E,0x01,0x10,0x21,0x01,0x88,0x40,0x02,0x48,0x40,0x02,0x48,0x40,0x02,0x48,0x20,0x02,0x88,0x7C,0x02,0xC8,0x43,0x02,0x10,0x40,0x02,0x10,0x20,0x01,0x60,0x10,0x01,0x80,0x8F, // 64
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x08,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 65
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 66
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 67
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 68
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 69
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08, // 70
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x12,0x00,0x00,0x0E, // 71
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0xF8,0x7F, // 72
+ 0x00,0x00,0x00,0xF8,0x7F, // 73
+ 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0xF8,0x3F, // 74
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x80,0x03,0x00,0x40,0x04,0x00,0x20,0x18,0x00,0x10,0x20,0x00,0x08,0x40, // 75
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40, // 76
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0xF8,0x7F, // 77
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 78
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 79
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 80
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x50,0x00,0x08,0x50,0x00,0x10,0x20,0x00,0x20,0x70,0x00,0xC0,0x4F, // 81
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x06,0x00,0x08,0x1A,0x00,0x10,0x21,0x00,0xE0,0x40, // 82
+ 0x00,0x00,0x00,0x60,0x10,0x00,0x90,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 83
+ 0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0x7F,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 84
+ 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 85
+ 0x00,0x00,0x00,0x18,0x00,0x00,0xE0,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0xE0,0x00,0x00,0x18, // 86
+ 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x70,0x00,0x00,0x08,0x00,0x00,0x70,0x00,0x00,0x80,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 87
+ 0x00,0x40,0x00,0x08,0x20,0x00,0x10,0x10,0x00,0x60,0x0C,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x80,0x02,0x00,0x60,0x0C,0x00,0x10,0x10,0x00,0x08,0x20,0x00,0x00,0x40, // 88
+ 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x00,0x7E,0x00,0x80,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 89
+ 0x00,0x40,0x00,0x08,0x60,0x00,0x08,0x58,0x00,0x08,0x44,0x00,0x08,0x43,0x00,0x88,0x40,0x00,0x68,0x40,0x00,0x18,0x40,0x00,0x08,0x40, // 90
+ 0x00,0x00,0x00,0xF8,0xFF,0x03,0x08,0x00,0x02,0x08,0x00,0x02, // 91
+ 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60, // 92
+ 0x08,0x00,0x02,0x08,0x00,0x02,0xF8,0xFF,0x03, // 93
+ 0x00,0x01,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x01, // 94
+ 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 95
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x10, // 96
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 97
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 98
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20, // 99
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xF8,0x7F, // 100
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 101
+ 0x40,0x00,0x00,0xF0,0x7F,0x00,0x48,0x00,0x00,0x48, // 102
+ 0x00,0x00,0x00,0x00,0x1F,0x01,0x80,0x20,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x80,0x20,0x01,0xC0,0xFF, // 103
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 104
+ 0x00,0x00,0x00,0xC8,0x7F, // 105
+ 0x00,0x00,0x02,0xC8,0xFF,0x01, // 106
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x19,0x00,0x80,0x20,0x00,0x40,0x40, // 107
+ 0x00,0x00,0x00,0xF8,0x7F, // 108
+ 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 109
+ 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 110
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 111
+ 0x00,0x00,0x00,0xC0,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 112
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xC0,0xFF,0x03, // 113
+ 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40, // 114
+ 0x00,0x00,0x00,0x80,0x23,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x38, // 115
+ 0x40,0x00,0x00,0xF0,0x7F,0x00,0x40,0x40,0x00,0x40,0x40, // 116
+ 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 117
+ 0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0, // 118
+ 0xC0,0x00,0x00,0x00,0x1F,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1F,0x00,0xC0, // 119
+ 0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x40,0x40, // 120
+ 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x00,0xE0,0x01,0x00,0x38,0x00,0x00,0x07,0x00,0xC0, // 121
+ 0x40,0x40,0x00,0x40,0x60,0x00,0x40,0x58,0x00,0x40,0x44,0x00,0x40,0x43,0x00,0xC0,0x40,0x00,0x40,0x40, // 122
+ 0x00,0x04,0x00,0x00,0x04,0x00,0xF0,0xFB,0x01,0x08,0x00,0x02,0x08,0x00,0x02, // 123
+ 0x00,0x00,0x00,0xF8,0xFF,0x03, // 124
+ 0x08,0x00,0x02,0x08,0x00,0x02,0xF0,0xFB,0x01,0x00,0x04,0x00,0x00,0x04, // 125
+ 0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01, // 126
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0x03, // 161
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x03,0x40,0xF0,0x00,0x40,0x4E,0x00,0xC0,0x41,0x00,0xB8,0x20,0x00,0x00,0x11, // 162
+ 0x00,0x41,0x00,0xE0,0x31,0x00,0x10,0x2F,0x00,0x08,0x21,0x00,0x08,0x21,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x20,0x20, // 163
+ 0x00,0x00,0x00,0x40,0x0B,0x00,0x80,0x04,0x00,0x40,0x08,0x00,0x40,0x08,0x00,0x80,0x04,0x00,0x40,0x0B, // 164
+ 0x08,0x0A,0x00,0x10,0x0A,0x00,0x60,0x0A,0x00,0x80,0x0B,0x00,0x00,0x7E,0x00,0x80,0x0B,0x00,0x60,0x0A,0x00,0x10,0x0A,0x00,0x08,0x0A, // 165
+ 0x00,0x00,0x00,0xF8,0xF1,0x03, // 166
+ 0x00,0x86,0x00,0x70,0x09,0x01,0xC8,0x10,0x02,0x88,0x10,0x02,0x08,0x21,0x02,0x08,0x61,0x02,0x30,0xD2,0x01,0x00,0x0C, // 167
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x08, // 168
+ 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xC8,0x47,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x48,0x44,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 169
+ 0xD0,0x00,0x00,0x48,0x01,0x00,0x28,0x01,0x00,0x28,0x01,0x00,0xF0,0x01, // 170
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20, // 171
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x0F, // 172
+ 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 173
+ 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xE8,0x4F,0x00,0x28,0x41,0x00,0x28,0x41,0x00,0x28,0x43,0x00,0x28,0x45,0x00,0xC8,0x48,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 174
+ 0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04, // 175
+ 0x00,0x00,0x00,0x30,0x00,0x00,0x48,0x00,0x00,0x48,0x00,0x00,0x30, // 176
+ 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0xE0,0x4F,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41, // 177
+ 0x10,0x01,0x00,0x88,0x01,0x00,0x48,0x01,0x00,0x48,0x01,0x00,0x30,0x01, // 178
+ 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x28,0x01,0x00,0xD8, // 179
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x08, // 180
+ 0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 181
+ 0xF0,0x00,0x00,0xF8,0x00,0x00,0xF8,0x01,0x00,0xF8,0x01,0x00,0xF8,0xFF,0x03,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0xFF,0x03,0x08, // 182
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, // 183
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x03, // 184
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0xF8,0x01, // 185
+ 0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0xF0, // 186
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04, // 187
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x21,0x00,0x00,0x10,0x00,0x00,0x0C,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 188
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x31,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x60,0x44,0x00,0x10,0x62,0x00,0x08,0x52,0x00,0x00,0x52,0x00,0x00,0x4C, // 189
+ 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x41,0x00,0x28,0x21,0x00,0xD8,0x18,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 190
+ 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x10,0x01,0x00,0x08,0x02,0x40,0x07,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0xC0, // 191
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x71,0x04,0x00,0x0A,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 192
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x0A,0x04,0x00,0x71,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 193
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x71,0x04,0x00,0x82,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 194
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x72,0x04,0x00,0x81,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 195
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x08,0x04,0x00,0x72,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 196
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x7E,0x04,0x00,0x0A,0x04,0x00,0x7E,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 197
+ 0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x06,0x00,0x80,0x05,0x00,0x60,0x04,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41, // 198
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x02,0x08,0xC0,0x02,0x08,0x40,0x03,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 199
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 200
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 201
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 202
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 203
+ 0x01,0x00,0x00,0xFA,0x7F, // 204
+ 0x00,0x00,0x00,0xFA,0x7F,0x00,0x01, // 205
+ 0x02,0x00,0x00,0xF9,0x7F,0x00,0x01,0x00,0x00,0x02, // 206
+ 0x02,0x00,0x00,0xF8,0x7F,0x00,0x02, // 207
+ 0x00,0x02,0x00,0xF8,0x7F,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 208
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x82,0x00,0x00,0x01,0x03,0x00,0x02,0x04,0x00,0x01,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 209
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 210
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 211
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 212
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 213
+ 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 214
+ 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x07,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x40,0x10, // 215
+ 0x00,0x00,0x00,0xC0,0x4F,0x00,0x20,0x30,0x00,0x10,0x30,0x00,0x08,0x4C,0x00,0x08,0x42,0x00,0x08,0x41,0x00,0xC8,0x40,0x00,0x30,0x20,0x00,0x30,0x10,0x00,0xC8,0x0F, // 216
+ 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 217
+ 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 218
+ 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 219
+ 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 220
+ 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x02,0x7E,0x00,0x81,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 221
+ 0x00,0x00,0x00,0xF8,0x7F,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 222
+ 0x00,0x00,0x00,0xE0,0x7F,0x00,0x10,0x00,0x00,0x08,0x20,0x00,0x88,0x43,0x00,0x70,0x42,0x00,0x00,0x44,0x00,0x00,0x38, // 223
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 224
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 225
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x42,0x00,0x50,0x22,0x00,0x80,0x7F, // 226
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x48,0x22,0x00,0x80,0x7F, // 227
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 228
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x5C,0x44,0x00,0x54,0x44,0x00,0x5C,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 229
+ 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x3F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 230
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x02,0x40,0xC0,0x02,0x40,0x40,0x03,0x80,0x20, // 231
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x48,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 232
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 233
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x44,0x00,0x90,0x24,0x00,0x00,0x17, // 234
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 235
+ 0x08,0x00,0x00,0xD0,0x7F, // 236
+ 0x00,0x00,0x00,0xD0,0x7F,0x00,0x08, // 237
+ 0x10,0x00,0x00,0xC8,0x7F,0x00,0x08,0x00,0x00,0x10, // 238
+ 0x10,0x00,0x00,0xC0,0x7F,0x00,0x10, // 239
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0xA0,0x20,0x00,0x68,0x40,0x00,0x58,0x40,0x00,0x70,0x40,0x00,0xE8,0x20,0x00,0x00,0x1F, // 240
+ 0x00,0x00,0x00,0xC0,0x7F,0x00,0x90,0x00,0x00,0x48,0x00,0x00,0x50,0x00,0x00,0x48,0x00,0x00,0x80,0x7F, // 241
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 242
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 243
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x48,0x40,0x00,0x90,0x20,0x00,0x00,0x1F, // 244
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x88,0x20,0x00,0x00,0x1F, // 245
+ 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 246
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x80,0x0A,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 247
+ 0x00,0x00,0x00,0x00,0x5F,0x00,0x80,0x30,0x00,0x40,0x48,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x80,0x21,0x00,0x40,0x1F, // 248
+ 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 249
+ 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x08,0x20,0x00,0xC0,0x7F, // 250
+ 0x00,0x00,0x00,0xC0,0x3F,0x00,0x10,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xC0,0x7F, // 251
+ 0x00,0x00,0x00,0xD0,0x3F,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 252
+ 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x10,0xE0,0x01,0x08,0x38,0x00,0x00,0x07,0x00,0xC0, // 253
+ 0x00,0x00,0x00,0xF8,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 254
+ 0xC0,0x01,0x00,0x00,0x06,0x02,0x10,0x38,0x02,0x00,0xE0,0x01,0x10,0x38,0x00,0x00,0x07,0x00,0xC0 // 255
+};
+const uint8_t ArialMT_Plain_24[] PROGMEM = {
+ 0x18, // Width: 24
+ 0x1C, // Height: 28
+ 0x20, // First Char: 32
+ 0xE0, // Numbers of Chars: 224
+
+ // Jump Table:
+ 0xFF, 0xFF, 0x00, 0x07, // 32:65535
+ 0x00, 0x00, 0x13, 0x07, // 33:0
+ 0x00, 0x13, 0x1A, 0x09, // 34:19
+ 0x00, 0x2D, 0x33, 0x0D, // 35:45
+ 0x00, 0x60, 0x2F, 0x0D, // 36:96
+ 0x00, 0x8F, 0x4F, 0x15, // 37:143
+ 0x00, 0xDE, 0x3B, 0x10, // 38:222
+ 0x01, 0x19, 0x0A, 0x05, // 39:281
+ 0x01, 0x23, 0x1C, 0x08, // 40:291
+ 0x01, 0x3F, 0x1B, 0x08, // 41:319
+ 0x01, 0x5A, 0x21, 0x09, // 42:346
+ 0x01, 0x7B, 0x32, 0x0E, // 43:379
+ 0x01, 0xAD, 0x10, 0x07, // 44:429
+ 0x01, 0xBD, 0x1B, 0x08, // 45:445
+ 0x01, 0xD8, 0x0F, 0x07, // 46:472
+ 0x01, 0xE7, 0x19, 0x07, // 47:487
+ 0x02, 0x00, 0x2F, 0x0D, // 48:512
+ 0x02, 0x2F, 0x23, 0x0D, // 49:559
+ 0x02, 0x52, 0x2F, 0x0D, // 50:594
+ 0x02, 0x81, 0x2F, 0x0D, // 51:641
+ 0x02, 0xB0, 0x2F, 0x0D, // 52:688
+ 0x02, 0xDF, 0x2F, 0x0D, // 53:735
+ 0x03, 0x0E, 0x2F, 0x0D, // 54:782
+ 0x03, 0x3D, 0x2D, 0x0D, // 55:829
+ 0x03, 0x6A, 0x2F, 0x0D, // 56:874
+ 0x03, 0x99, 0x2F, 0x0D, // 57:921
+ 0x03, 0xC8, 0x0F, 0x07, // 58:968
+ 0x03, 0xD7, 0x10, 0x07, // 59:983
+ 0x03, 0xE7, 0x2F, 0x0E, // 60:999
+ 0x04, 0x16, 0x2F, 0x0E, // 61:1046
+ 0x04, 0x45, 0x2E, 0x0E, // 62:1093
+ 0x04, 0x73, 0x2E, 0x0D, // 63:1139
+ 0x04, 0xA1, 0x5B, 0x18, // 64:1185
+ 0x04, 0xFC, 0x3B, 0x10, // 65:1276
+ 0x05, 0x37, 0x3B, 0x10, // 66:1335
+ 0x05, 0x72, 0x3F, 0x11, // 67:1394
+ 0x05, 0xB1, 0x3F, 0x11, // 68:1457
+ 0x05, 0xF0, 0x3B, 0x10, // 69:1520
+ 0x06, 0x2B, 0x35, 0x0F, // 70:1579
+ 0x06, 0x60, 0x43, 0x13, // 71:1632
+ 0x06, 0xA3, 0x3B, 0x11, // 72:1699
+ 0x06, 0xDE, 0x0F, 0x07, // 73:1758
+ 0x06, 0xED, 0x27, 0x0C, // 74:1773
+ 0x07, 0x14, 0x3F, 0x10, // 75:1812
+ 0x07, 0x53, 0x2F, 0x0D, // 76:1875
+ 0x07, 0x82, 0x43, 0x14, // 77:1922
+ 0x07, 0xC5, 0x3B, 0x11, // 78:1989
+ 0x08, 0x00, 0x47, 0x13, // 79:2048
+ 0x08, 0x47, 0x3A, 0x10, // 80:2119
+ 0x08, 0x81, 0x47, 0x13, // 81:2177
+ 0x08, 0xC8, 0x3F, 0x11, // 82:2248
+ 0x09, 0x07, 0x3B, 0x10, // 83:2311
+ 0x09, 0x42, 0x35, 0x0F, // 84:2370
+ 0x09, 0x77, 0x3B, 0x11, // 85:2423
+ 0x09, 0xB2, 0x39, 0x10, // 86:2482
+ 0x09, 0xEB, 0x59, 0x17, // 87:2539
+ 0x0A, 0x44, 0x3B, 0x10, // 88:2628
+ 0x0A, 0x7F, 0x3D, 0x10, // 89:2687
+ 0x0A, 0xBC, 0x37, 0x0F, // 90:2748
+ 0x0A, 0xF3, 0x14, 0x07, // 91:2803
+ 0x0B, 0x07, 0x1B, 0x07, // 92:2823
+ 0x0B, 0x22, 0x18, 0x07, // 93:2850
+ 0x0B, 0x3A, 0x2A, 0x0B, // 94:2874
+ 0x0B, 0x64, 0x34, 0x0D, // 95:2916
+ 0x0B, 0x98, 0x11, 0x08, // 96:2968
+ 0x0B, 0xA9, 0x2F, 0x0D, // 97:2985
+ 0x0B, 0xD8, 0x33, 0x0D, // 98:3032
+ 0x0C, 0x0B, 0x2B, 0x0C, // 99:3083
+ 0x0C, 0x36, 0x2F, 0x0D, // 100:3126
+ 0x0C, 0x65, 0x2F, 0x0D, // 101:3173
+ 0x0C, 0x94, 0x1A, 0x07, // 102:3220
+ 0x0C, 0xAE, 0x2F, 0x0D, // 103:3246
+ 0x0C, 0xDD, 0x2F, 0x0D, // 104:3293
+ 0x0D, 0x0C, 0x0F, 0x05, // 105:3340
+ 0x0D, 0x1B, 0x10, 0x05, // 106:3355
+ 0x0D, 0x2B, 0x2F, 0x0C, // 107:3371
+ 0x0D, 0x5A, 0x0F, 0x05, // 108:3418
+ 0x0D, 0x69, 0x47, 0x14, // 109:3433
+ 0x0D, 0xB0, 0x2F, 0x0D, // 110:3504
+ 0x0D, 0xDF, 0x2F, 0x0D, // 111:3551
+ 0x0E, 0x0E, 0x33, 0x0D, // 112:3598
+ 0x0E, 0x41, 0x30, 0x0D, // 113:3649
+ 0x0E, 0x71, 0x1E, 0x08, // 114:3697
+ 0x0E, 0x8F, 0x2B, 0x0C, // 115:3727
+ 0x0E, 0xBA, 0x1B, 0x07, // 116:3770
+ 0x0E, 0xD5, 0x2F, 0x0D, // 117:3797
+ 0x0F, 0x04, 0x2A, 0x0C, // 118:3844
+ 0x0F, 0x2E, 0x42, 0x11, // 119:3886
+ 0x0F, 0x70, 0x2B, 0x0C, // 120:3952
+ 0x0F, 0x9B, 0x2A, 0x0C, // 121:3995
+ 0x0F, 0xC5, 0x2B, 0x0C, // 122:4037
+ 0x0F, 0xF0, 0x1C, 0x08, // 123:4080
+ 0x10, 0x0C, 0x10, 0x06, // 124:4108
+ 0x10, 0x1C, 0x1B, 0x08, // 125:4124
+ 0x10, 0x37, 0x32, 0x0E, // 126:4151
+ 0xFF, 0xFF, 0x00, 0x00, // 127:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 128:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 129:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 130:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 131:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 132:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 133:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 134:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 135:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 136:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 137:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 138:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 139:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 140:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 141:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 142:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 143:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 144:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 145:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 146:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 147:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 148:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 149:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 150:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 151:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 152:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 153:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 154:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 155:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 156:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 157:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 158:65535
+ 0xFF, 0xFF, 0x00, 0x18, // 159:65535
+ 0xFF, 0xFF, 0x00, 0x07, // 160:65535
+ 0x10, 0x69, 0x14, 0x08, // 161:4201
+ 0x10, 0x7D, 0x2B, 0x0D, // 162:4221
+ 0x10, 0xA8, 0x2F, 0x0D, // 163:4264
+ 0x10, 0xD7, 0x33, 0x0D, // 164:4311
+ 0x11, 0x0A, 0x31, 0x0D, // 165:4362
+ 0x11, 0x3B, 0x10, 0x06, // 166:4411
+ 0x11, 0x4B, 0x2F, 0x0D, // 167:4427
+ 0x11, 0x7A, 0x19, 0x08, // 168:4474
+ 0x11, 0x93, 0x46, 0x12, // 169:4499
+ 0x11, 0xD9, 0x1A, 0x09, // 170:4569
+ 0x11, 0xF3, 0x27, 0x0D, // 171:4595
+ 0x12, 0x1A, 0x2F, 0x0E, // 172:4634
+ 0x12, 0x49, 0x1B, 0x08, // 173:4681
+ 0x12, 0x64, 0x46, 0x12, // 174:4708
+ 0x12, 0xAA, 0x31, 0x0D, // 175:4778
+ 0x12, 0xDB, 0x1E, 0x0A, // 176:4827
+ 0x12, 0xF9, 0x33, 0x0D, // 177:4857
+ 0x13, 0x2C, 0x1A, 0x08, // 178:4908
+ 0x13, 0x46, 0x1A, 0x08, // 179:4934
+ 0x13, 0x60, 0x19, 0x08, // 180:4960
+ 0x13, 0x79, 0x2F, 0x0E, // 181:4985
+ 0x13, 0xA8, 0x31, 0x0D, // 182:5032
+ 0x13, 0xD9, 0x12, 0x08, // 183:5081
+ 0x13, 0xEB, 0x18, 0x08, // 184:5099
+ 0x14, 0x03, 0x16, 0x08, // 185:5123
+ 0x14, 0x19, 0x1E, 0x09, // 186:5145
+ 0x14, 0x37, 0x2E, 0x0D, // 187:5175
+ 0x14, 0x65, 0x4F, 0x14, // 188:5221
+ 0x14, 0xB4, 0x4B, 0x14, // 189:5300
+ 0x14, 0xFF, 0x4B, 0x14, // 190:5375
+ 0x15, 0x4A, 0x33, 0x0F, // 191:5450
+ 0x15, 0x7D, 0x3B, 0x10, // 192:5501
+ 0x15, 0xB8, 0x3B, 0x10, // 193:5560
+ 0x15, 0xF3, 0x3B, 0x10, // 194:5619
+ 0x16, 0x2E, 0x3B, 0x10, // 195:5678
+ 0x16, 0x69, 0x3B, 0x10, // 196:5737
+ 0x16, 0xA4, 0x3B, 0x10, // 197:5796
+ 0x16, 0xDF, 0x5B, 0x18, // 198:5855
+ 0x17, 0x3A, 0x3F, 0x11, // 199:5946
+ 0x17, 0x79, 0x3B, 0x10, // 200:6009
+ 0x17, 0xB4, 0x3B, 0x10, // 201:6068
+ 0x17, 0xEF, 0x3B, 0x10, // 202:6127
+ 0x18, 0x2A, 0x3B, 0x10, // 203:6186
+ 0x18, 0x65, 0x11, 0x07, // 204:6245
+ 0x18, 0x76, 0x11, 0x07, // 205:6262
+ 0x18, 0x87, 0x15, 0x07, // 206:6279
+ 0x18, 0x9C, 0x15, 0x07, // 207:6300
+ 0x18, 0xB1, 0x3F, 0x11, // 208:6321
+ 0x18, 0xF0, 0x3B, 0x11, // 209:6384
+ 0x19, 0x2B, 0x47, 0x13, // 210:6443
+ 0x19, 0x72, 0x47, 0x13, // 211:6514
+ 0x19, 0xB9, 0x47, 0x13, // 212:6585
+ 0x1A, 0x00, 0x47, 0x13, // 213:6656
+ 0x1A, 0x47, 0x47, 0x13, // 214:6727
+ 0x1A, 0x8E, 0x2B, 0x0E, // 215:6798
+ 0x1A, 0xB9, 0x47, 0x13, // 216:6841
+ 0x1B, 0x00, 0x3B, 0x11, // 217:6912
+ 0x1B, 0x3B, 0x3B, 0x11, // 218:6971
+ 0x1B, 0x76, 0x3B, 0x11, // 219:7030
+ 0x1B, 0xB1, 0x3B, 0x11, // 220:7089
+ 0x1B, 0xEC, 0x3D, 0x10, // 221:7148
+ 0x1C, 0x29, 0x3A, 0x10, // 222:7209
+ 0x1C, 0x63, 0x37, 0x0F, // 223:7267
+ 0x1C, 0x9A, 0x2F, 0x0D, // 224:7322
+ 0x1C, 0xC9, 0x2F, 0x0D, // 225:7369
+ 0x1C, 0xF8, 0x2F, 0x0D, // 226:7416
+ 0x1D, 0x27, 0x2F, 0x0D, // 227:7463
+ 0x1D, 0x56, 0x2F, 0x0D, // 228:7510
+ 0x1D, 0x85, 0x2F, 0x0D, // 229:7557
+ 0x1D, 0xB4, 0x53, 0x15, // 230:7604
+ 0x1E, 0x07, 0x2B, 0x0C, // 231:7687
+ 0x1E, 0x32, 0x2F, 0x0D, // 232:7730
+ 0x1E, 0x61, 0x2F, 0x0D, // 233:7777
+ 0x1E, 0x90, 0x2F, 0x0D, // 234:7824
+ 0x1E, 0xBF, 0x2F, 0x0D, // 235:7871
+ 0x1E, 0xEE, 0x11, 0x07, // 236:7918
+ 0x1E, 0xFF, 0x11, 0x07, // 237:7935
+ 0x1F, 0x10, 0x15, 0x07, // 238:7952
+ 0x1F, 0x25, 0x15, 0x07, // 239:7973
+ 0x1F, 0x3A, 0x2F, 0x0D, // 240:7994
+ 0x1F, 0x69, 0x2F, 0x0D, // 241:8041
+ 0x1F, 0x98, 0x2F, 0x0D, // 242:8088
+ 0x1F, 0xC7, 0x2F, 0x0D, // 243:8135
+ 0x1F, 0xF6, 0x2F, 0x0D, // 244:8182
+ 0x20, 0x25, 0x2F, 0x0D, // 245:8229
+ 0x20, 0x54, 0x2F, 0x0D, // 246:8276
+ 0x20, 0x83, 0x32, 0x0D, // 247:8323
+ 0x20, 0xB5, 0x33, 0x0F, // 248:8373
+ 0x20, 0xE8, 0x2F, 0x0D, // 249:8424
+ 0x21, 0x17, 0x2F, 0x0D, // 250:8471
+ 0x21, 0x46, 0x2F, 0x0D, // 251:8518
+ 0x21, 0x75, 0x2F, 0x0D, // 252:8565
+ 0x21, 0xA4, 0x2A, 0x0C, // 253:8612
+ 0x21, 0xCE, 0x2F, 0x0D, // 254:8654
+ 0x21, 0xFD, 0x2A, 0x0C, // 255:8701
+
+ // Font Data:
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x33,0x00,0xE0,0xFF,0x33, // 33
+ 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 34
+ 0x00,0x0C,0x03,0x00,0x00,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x03,0x00,0x00,0x0C,0x03, // 35
+ 0x00,0x00,0x00,0x00,0x80,0x07,0x06,0x00,0xC0,0x0F,0x1E,0x00,0xC0,0x18,0x1C,0x00,0x60,0x18,0x38,0x00,0x60,0x30,0x30,0x00,0xF0,0xFF,0xFF,0x00,0x60,0x30,0x30,0x00,0x60,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0xC1,0x1F,0x00,0x00,0x81,0x07, // 36
+ 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x00,0x60,0x30,0x38,0x00,0xC0,0x1F,0x1E,0x00,0x80,0x8F,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x8F,0x0F,0x00,0xC0,0xC3,0x1F,0x00,0xE0,0x60,0x30,0x00,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 37
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0F,0x00,0x80,0xE3,0x1C,0x00,0xC0,0x77,0x38,0x00,0xE0,0x3C,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x78,0x30,0x00,0xE0,0xEC,0x38,0x00,0xC0,0x8F,0x1B,0x00,0x80,0x03,0x1F,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x10, // 38
+ 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 39
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFE,0x7F,0x00,0x80,0x0F,0xF0,0x01,0xC0,0x01,0x80,0x03,0x60,0x00,0x00,0x06,0x20,0x00,0x00,0x04, // 40
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x04,0x60,0x00,0x00,0x06,0xC0,0x01,0x80,0x03,0x80,0x0F,0xF0,0x01,0x00,0xFE,0x7F,0x00,0x00,0xF0,0x0F, // 41
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x04,0x00,0x00,0x80, // 42
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 43
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0xF0,0x01, // 44
+ 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 45
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 46
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x3F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60, // 47
+ 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x01,0x1C,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x03, // 48
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 49
+ 0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x00,0xC0,0x03,0x38,0x00,0xC0,0x00,0x3C,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x33,0x00,0x60,0x80,0x31,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x30,0x00,0xC0,0x30,0x30,0x00,0xC0,0x1F,0x30,0x00,0x00,0x0F,0x30, // 50
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0xC0,0x01,0x0E,0x00,0xC0,0x00,0x1C,0x00,0x60,0x00,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x0F,0x00,0x00,0x80,0x07, // 51
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x03,0x00,0x00,0x0E,0x03,0x00,0x80,0x07,0x03,0x00,0xC0,0x01,0x03,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 52
+ 0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x80,0x3F,0x0E,0x00,0xE0,0x1F,0x18,0x00,0x60,0x08,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x18,0x1C,0x00,0x60,0xF0,0x0F,0x00,0x00,0xE0,0x03, // 53
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x63,0x1C,0x00,0xC0,0x30,0x38,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0xE0,0x30,0x18,0x00,0xC0,0xF1,0x0F,0x00,0x80,0xC1,0x07, // 54
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x3C,0x00,0x60,0x80,0x3F,0x00,0x60,0xE0,0x03,0x00,0x60,0x78,0x00,0x00,0x60,0x0E,0x00,0x00,0x60,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60, // 55
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x80,0xC7,0x1F,0x00,0xC0,0x6F,0x18,0x00,0xE0,0x38,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xE0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 56
+ 0x00,0x00,0x00,0x00,0x00,0x1F,0x0C,0x00,0x80,0x7F,0x1C,0x00,0xC0,0x61,0x38,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x18,0x00,0xC0,0x31,0x1E,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x01, // 57
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 58
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x03,0x00,0x06,0xF0,0x01, // 59
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x03,0x06, // 60
+ 0x00,0x00,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01, // 61
+ 0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x04,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20, // 62
+ 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x33,0x00,0x60,0xE0,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x07, // 63
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xC0,0x01,0x80,0xC3,0x87,0x01,0xC0,0xF1,0x9F,0x03,0xC0,0x38,0x18,0x03,0xC0,0x0C,0x30,0x03,0x60,0x0E,0x30,0x06,0x60,0x06,0x30,0x06,0x60,0x06,0x18,0x06,0x60,0x06,0x0C,0x06,0x60,0x0C,0x1E,0x06,0x60,0xF8,0x3F,0x06,0xE0,0xFE,0x31,0x06,0xC0,0x0E,0x30,0x06,0xC0,0x01,0x18,0x03,0x80,0x03,0x1C,0x03,0x00,0x07,0x8F,0x01,0x00,0xFE,0x87,0x01,0x00,0xF8,0xC1,0x00,0x00,0x00,0x40, // 64
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE0,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 65
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x78,0x30,0x00,0xC0,0xFF,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 66
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 67
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 68
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 69
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60, // 70
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x60,0x30,0x00,0x60,0x60,0x30,0x00,0xE0,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0x61,0x18,0x00,0x80,0xE3,0x0F,0x00,0x00,0xE2,0x0F, // 71
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 72
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 73
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F, // 74
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE7,0x01,0x00,0x80,0x83,0x07,0x00,0xC0,0x01,0x0F,0x00,0xE0,0x00,0x1E,0x00,0x60,0x00,0x38,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 75
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 76
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 77
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 78
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 79
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0xC0,0x30,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x0F, // 80
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x0C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x36,0x00,0xE0,0x00,0x3C,0x00,0xC0,0x00,0x1C,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x3F,0x00,0x00,0xFF,0x77,0x00,0x00,0xFC,0x61, // 81
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x70,0x00,0x00,0x60,0xF0,0x00,0x00,0x60,0xF0,0x03,0x00,0x60,0xB0,0x07,0x00,0xE0,0x18,0x1F,0x00,0xC0,0x1F,0x3C,0x00,0x80,0x0F,0x30,0x00,0x00,0x00,0x20, // 82
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x0F,0x00,0xC0,0x1F,0x1C,0x00,0xC0,0x18,0x18,0x00,0x60,0x38,0x38,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x70,0x30,0x00,0xC0,0x60,0x18,0x00,0xC0,0xE1,0x18,0x00,0x80,0xC3,0x0F,0x00,0x00,0x83,0x07, // 83
+ 0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 84
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 85
+ 0x20,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xF8,0x01,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x20, // 86
+ 0x60,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x3F,0x00,0x00,0xF8,0x0F,0x00,0x80,0xFF,0x00,0x00,0xE0,0x07,0x00,0x00,0x60, // 87
+ 0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x60,0x00,0x3C,0x00,0xE0,0x01,0x1E,0x00,0xC0,0x83,0x07,0x00,0x00,0xCF,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xCF,0x03,0x00,0xC0,0x03,0x07,0x00,0xE0,0x01,0x1E,0x00,0x60,0x00,0x3C,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 88
+ 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 89
+ 0x00,0x00,0x30,0x00,0x60,0x00,0x38,0x00,0x60,0x00,0x3C,0x00,0x60,0x00,0x37,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0x60,0x0E,0x30,0x00,0x60,0x07,0x30,0x00,0xE0,0x01,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x30, // 90
+ 0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 91
+ 0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 92
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07, // 93
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x20, // 94
+ 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 95
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80, // 96
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 97
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 98
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 99
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 100
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 101
+ 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x06,0x00,0x00,0x60,0x06,0x00,0x00,0x60,0x06, // 102
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x83,0x01,0x00,0xF8,0x8F,0x03,0x00,0x1C,0x1C,0x07,0x00,0x0E,0x38,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x0C,0x18,0x07,0x00,0x18,0x8C,0x03,0x00,0xFE,0xFF,0x01,0x00,0xFE,0xFF, // 103
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 104
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F, // 105
+ 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x60,0xFE,0xFF,0x07,0x60,0xFE,0xFF,0x03, // 106
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x98,0x07,0x00,0x00,0x0C,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x02,0x30,0x00,0x00,0x00,0x20, // 107
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 108
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 109
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 110
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 111
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 112
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07, // 113
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 114
+ 0x00,0x00,0x00,0x00,0x00,0x38,0x0C,0x00,0x00,0x7C,0x1C,0x00,0x00,0xEE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x31,0x00,0x00,0xC6,0x31,0x00,0x00,0x8E,0x39,0x00,0x00,0x9C,0x1F,0x00,0x00,0x18,0x0F, // 115
+ 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 116
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 117
+ 0x00,0x06,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 118
+ 0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x7C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xF0,0x03,0x00,0x00,0x7E,0x00,0x00,0x00,0x0E, // 119
+ 0x00,0x02,0x20,0x00,0x00,0x06,0x30,0x00,0x00,0x1E,0x3C,0x00,0x00,0x38,0x0E,0x00,0x00,0xF0,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x38,0x0E,0x00,0x00,0x1C,0x3C,0x00,0x00,0x0E,0x30,0x00,0x00,0x02,0x20, // 120
+ 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 121
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x3E,0x00,0x00,0x06,0x37,0x00,0x00,0xC6,0x33,0x00,0x00,0xE6,0x30,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x30,0x00,0x00,0x1E,0x30,0x00,0x00,0x06,0x30, // 122
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x03,0x00,0xC0,0x7F,0xFE,0x03,0xE0,0x3F,0xFC,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 123
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0xE0,0xFF,0xFF,0x0F, // 124
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0x3F,0xFC,0x07,0xC0,0x7F,0xFF,0x03,0x00,0xC0,0x03,0x00,0x00,0x80,0x01, // 125
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60, // 126
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0x07,0x00,0xE6,0xFF,0x07, // 161
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x9C,0x07,0x00,0x0E,0x78,0x00,0x00,0x06,0x3F,0x00,0x00,0xF6,0x30,0x00,0x00,0x0E,0x30,0x00,0xE0,0x0D,0x1C,0x00,0x00,0x1C,0x0E,0x00,0x00,0x10,0x06, // 162
+ 0x00,0x60,0x10,0x00,0x00,0x60,0x38,0x00,0x00,0x7F,0x1C,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xE0,0x19,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x30,0x00,0xE0,0x00,0x30,0x00,0xC0,0x01,0x30,0x00,0x80,0x01,0x38,0x00,0x00,0x00,0x10, // 163
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0xF7,0x0E,0x00,0x00,0xFE,0x07,0x00,0x00,0x0C,0x03,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x0C,0x03,0x00,0x00,0xFE,0x07,0x00,0x00,0xF7,0x0E,0x00,0x00,0x02,0x04, // 164
+ 0xE0,0x60,0x06,0x00,0xC0,0x61,0x06,0x00,0x80,0x67,0x06,0x00,0x00,0x7E,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x7C,0x06,0x00,0x00,0x7E,0x06,0x00,0x80,0x67,0x06,0x00,0xC0,0x61,0x06,0x00,0xE0,0x60,0x06,0x00,0x20, // 165
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0xF8,0x0F,0xE0,0x7F,0xF8,0x0F, // 166
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x80,0xF3,0xC1,0x00,0xC0,0x1F,0xC3,0x03,0xE0,0x0C,0x07,0x03,0x60,0x1C,0x06,0x06,0x60,0x18,0x0C,0x06,0x60,0x30,0x1C,0x06,0xE0,0x70,0x38,0x07,0xC0,0xE1,0xF4,0x03,0x80,0xC1,0xE7,0x01,0x00,0x80,0x03, // 167
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 168
+ 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x79,0x1C,0x00,0xC0,0xFE,0x19,0x00,0x60,0x86,0x31,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x87,0x33,0x00,0xC0,0x86,0x19,0x00,0xC0,0x85,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 169
+ 0x00,0x00,0x00,0x00,0xC0,0x1C,0x00,0x00,0xE0,0x3E,0x00,0x00,0x60,0x32,0x00,0x00,0x60,0x32,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x3F, // 170
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x84,0x10,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x04,0x10, // 171
+ 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFC,0x01, // 172
+ 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 173
+ 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x01,0x1C,0x00,0xC0,0xFE,0x1B,0x00,0x60,0xFE,0x33,0x00,0x60,0x66,0x30,0x00,0x60,0x66,0x30,0x00,0x60,0xE6,0x30,0x00,0x60,0xFE,0x31,0x00,0x60,0x3C,0x33,0x00,0xC0,0x00,0x1A,0x00,0xC0,0x01,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 174
+ 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 175
+ 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x40,0x04,0x00,0x00,0x80,0x03, // 176
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30, // 177
+ 0x40,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x38,0x00,0x00,0x20,0x2C,0x00,0x00,0x20,0x26,0x00,0x00,0xE0,0x23,0x00,0x00,0xC0,0x21, // 178
+ 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0xE0,0x3D,0x00,0x00,0xC0,0x1D, // 179
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 180
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 181
+ 0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60, // 182
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 183
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0xC0,0x02,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x01, // 184
+ 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F, // 185
+ 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x38,0x00,0x00,0x60,0x30,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 186
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x84,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x80, // 187
+ 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x38,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x0C,0x00,0xC0,0x01,0x0E,0x00,0xE0,0x80,0x0B,0x00,0x60,0xC0,0x08,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x08, // 188
+ 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x30,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x4E,0x20,0x00,0x00,0x67,0x30,0x00,0xC0,0x21,0x38,0x00,0xE0,0x20,0x2C,0x00,0x60,0x20,0x26,0x00,0x00,0xE0,0x27,0x00,0x00,0xC0,0x21, // 189
+ 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x20,0x00,0x20,0x22,0x30,0x00,0xE0,0x3D,0x38,0x00,0xC0,0x1D,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x0C,0x00,0x00,0x07,0x0E,0x00,0x80,0x83,0x0B,0x00,0xE0,0xC0,0x08,0x00,0x60,0xE0,0x3F,0x00,0x20,0xE0,0x3F,0x00,0x00,0x00,0x08, // 190
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x1E,0x03,0x00,0x00,0x07,0x07,0x00,0xE6,0x03,0x06,0x00,0xE6,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0, // 191
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x82,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE8,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 192
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE8,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x82,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 193
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x88,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x08,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 194
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x0C,0xFE,0x01,0x00,0x8E,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xEC,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0E,0xFE,0x01,0x00,0x06,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 195
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x8C,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0C,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 196
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x9C,0x8F,0x01,0x00,0xE2,0x83,0x01,0x00,0x62,0x80,0x01,0x00,0xE2,0x83,0x01,0x00,0x9C,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 197
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x01,0x00,0x00,0xBC,0x01,0x00,0x00,0x8F,0x01,0x00,0xC0,0x83,0x01,0x00,0xE0,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 198
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x02,0x60,0x00,0x30,0x02,0x60,0x00,0xF0,0x02,0x60,0x00,0xB0,0x03,0x60,0x00,0x30,0x01,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 199
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 200
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 201
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 202
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 203
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xEE,0xFF,0x3F,0x00,0x08, // 204
+ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xEE,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x02, // 205
+ 0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x08, // 206
+ 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x0C, // 207
+ 0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 208
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x8C,0x03,0x00,0x00,0x0E,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x70,0x00,0x00,0x0C,0xE0,0x01,0x00,0x0C,0x80,0x03,0x00,0x0E,0x00,0x0F,0x00,0x06,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 209
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x62,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 210
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x62,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 211
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x68,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xE8,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 212
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xCC,0x00,0x18,0x00,0xEE,0x00,0x38,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0xE6,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 213
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xEC,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 214
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x8E,0x03,0x00,0x00,0xDC,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xDC,0x01,0x00,0x00,0x8E,0x03,0x00,0x00,0x06,0x03, // 215
+ 0x00,0x00,0x00,0x00,0x00,0xFC,0x21,0x00,0x00,0xFF,0x77,0x00,0x80,0x07,0x3F,0x00,0xC0,0x01,0x1E,0x00,0xC0,0x00,0x1F,0x00,0xE0,0x80,0x3B,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x70,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0xE0,0x0E,0x38,0x00,0xC0,0x07,0x18,0x00,0xC0,0x03,0x1C,0x00,0xE0,0x07,0x0F,0x00,0x70,0xFF,0x07,0x00,0x20,0xFC,0x01, // 216
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x02,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 217
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 218
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x08,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x08,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 219
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 220
+ 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x08,0xF0,0x3F,0x00,0x0E,0xF0,0x3F,0x00,0x06,0x3C,0x00,0x00,0x02,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 221
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x07,0x00,0x00,0x86,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0xF8, // 222
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x08,0x00,0x60,0x00,0x1C,0x00,0x60,0x00,0x38,0x00,0xE0,0x78,0x30,0x00,0xC0,0x7F,0x30,0x00,0x80,0xC7,0x30,0x00,0x00,0x80,0x39,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x0F, // 223
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x20,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 224
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x80,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x18,0x00,0x20,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 225
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x80,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0x60,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0x80,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 226
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0xC0,0x1C,0x1F,0x00,0xE0,0x8C,0x39,0x00,0x60,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xC0,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xE0,0xCE,0x0C,0x00,0x60,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 227
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0xC0,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xC0,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 228
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x70,0x86,0x31,0x00,0x88,0x86,0x31,0x00,0x88,0xC6,0x30,0x00,0x88,0xC6,0x18,0x00,0x70,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 229
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x0F,0x00,0x00,0x9C,0x1F,0x00,0x00,0xCC,0x39,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0x66,0x18,0x00,0x00,0x6E,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xCC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xE0,0x04, // 230
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x02,0x00,0x06,0x30,0x02,0x00,0x06,0xF0,0x02,0x00,0x06,0xB0,0x03,0x00,0x0E,0x38,0x01,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 231
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x20,0xCE,0x38,0x00,0x60,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 232
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x80,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x20,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 233
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x80,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0x80,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 234
+ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 235
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0xE0,0xFE,0x3F,0x00,0x80, // 236
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0x20, // 237
+ 0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0x80, // 238
+ 0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0xC0, // 239
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1D,0x1C,0x00,0xA0,0x0F,0x38,0x00,0xA0,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0F,0x38,0x00,0x20,0x1F,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xE0,0x07, // 240
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0xC0,0xFE,0x3F,0x00,0xE0,0x18,0x00,0x00,0x60,0x0C,0x00,0x00,0x60,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xE0,0x0E,0x00,0x00,0x60,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 241
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x20,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x80,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 242
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x80,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x20,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 243
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x80,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0x80,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 244
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0xC0,0x1C,0x1C,0x00,0xE0,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xE0,0x1C,0x1C,0x00,0x60,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 245
+ 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 246
+ 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xB6,0x01,0x00,0x00,0xB6,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 247
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x67,0x00,0x00,0xF8,0x7F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x3F,0x00,0x00,0x86,0x33,0x00,0x00,0xE6,0x31,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xFF,0x0F,0x00,0x00,0xF3,0x07, // 248
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x20,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 249
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x18,0x00,0x20,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 250
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x80,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0x80,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 251
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0xC0,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 252
+ 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x80,0x00,0xFE,0x03,0xE0,0x00,0xFC,0x00,0x60,0xC0,0x1F,0x00,0x20,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 253
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x00,0x1C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x03, // 254
+ 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0xC0,0xF0,0x01,0x06,0xC0,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0xC0,0xC0,0x1F,0x00,0xC0,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06 // 255
+};
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplayUi.cpp Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,471 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
+ * Copyright (c) 2018 by Fabrice Weinberg
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+#include "OLEDDisplayUi.h"
+
+void LoadingDrawDefault(OLEDDisplay *display, LoadingStage* stage, uint8_t progress) {
+ display->setTextAlignment(TEXT_ALIGN_CENTER);
+ display->setFont(ArialMT_Plain_10);
+ display->drawString(64, 18, stage->process);
+ display->drawProgressBar(4, 32, 120, 8, progress);
+};
+
+
+OLEDDisplayUi::OLEDDisplayUi(OLEDDisplay *display) {
+ this->display = display;
+
+ indicatorPosition = BOTTOM;
+ indicatorDirection = LEFT_RIGHT;
+ activeSymbol = ANIMATION_activeSymbol;
+ inactiveSymbol = ANIMATION_inactiveSymbol;
+ frameAnimationDirection = SLIDE_RIGHT;
+ lastTransitionDirection = 1;
+ ticksPerFrame = 151; // ~ 5000ms at 30 FPS
+ ticksPerTransition = 15; // ~ 500ms at 30 FPS
+ frameCount = 0;
+ nextFrameNumber = -1;
+ overlayCount = 0;
+ indicatorDrawState = 1;
+ loadingDrawFunction = LoadingDrawDefault;
+ updateInterval = 33;
+ state.lastUpdate = 0;
+ state.ticksSinceLastStateSwitch = 0;
+ state.frameState = FIXED;
+ state.currentFrame = 0;
+ state.frameTransitionDirection = 1;
+ state.isIndicatorDrawen = true;
+ state.manuelControll = false;
+ state.userData = NULL;
+ shouldDrawIndicators = true;
+ autoTransition = true;
+}
+
+void OLEDDisplayUi::init() {
+ this->display->init();
+}
+
+void OLEDDisplayUi::setTargetFPS(uint8_t fps){
+ float oldInterval = this->updateInterval;
+ this->updateInterval = ((float) 1.0 / (float) fps) * 1000;
+
+ // Calculate new ticksPerFrame
+ float changeRatio = oldInterval / (float) this->updateInterval;
+ this->ticksPerFrame *= changeRatio;
+ this->ticksPerTransition *= changeRatio;
+}
+
+// -/------ Automatic controll ------\-
+
+void OLEDDisplayUi::enableAutoTransition(){
+ this->autoTransition = true;
+}
+void OLEDDisplayUi::disableAutoTransition(){
+ this->autoTransition = false;
+}
+void OLEDDisplayUi::setAutoTransitionForwards(){
+ this->state.frameTransitionDirection = 1;
+ this->lastTransitionDirection = 1;
+}
+void OLEDDisplayUi::setAutoTransitionBackwards(){
+ this->state.frameTransitionDirection = -1;
+ this->lastTransitionDirection = -1;
+}
+void OLEDDisplayUi::setTimePerFrame(uint16_t time){
+ this->ticksPerFrame = (uint16_t) ( (float) time / (float) updateInterval);
+}
+void OLEDDisplayUi::setTimePerTransition(uint16_t time){
+ this->ticksPerTransition = (uint16_t) ( (float) time / (float) updateInterval);
+}
+
+// -/------ Customize indicator position and style -------\-
+void OLEDDisplayUi::enableIndicator(){
+ this->state.isIndicatorDrawen = true;
+}
+
+void OLEDDisplayUi::disableIndicator(){
+ this->state.isIndicatorDrawen = false;
+}
+
+void OLEDDisplayUi::enableAllIndicators(){
+ this->shouldDrawIndicators = true;
+}
+
+void OLEDDisplayUi::disableAllIndicators(){
+ this->shouldDrawIndicators = false;
+}
+
+void OLEDDisplayUi::setIndicatorPosition(IndicatorPosition pos) {
+ this->indicatorPosition = pos;
+}
+void OLEDDisplayUi::setIndicatorDirection(IndicatorDirection dir) {
+ this->indicatorDirection = dir;
+}
+void OLEDDisplayUi::setActiveSymbol(const uint8_t* symbol) {
+ this->activeSymbol = symbol;
+}
+void OLEDDisplayUi::setInactiveSymbol(const uint8_t* symbol) {
+ this->inactiveSymbol = symbol;
+}
+
+
+// -/----- Frame settings -----\-
+void OLEDDisplayUi::setFrameAnimation(AnimationDirection dir) {
+ this->frameAnimationDirection = dir;
+}
+void OLEDDisplayUi::setFrames(FrameCallback* frameFunctions, uint8_t frameCount) {
+ this->frameFunctions = frameFunctions;
+ this->frameCount = frameCount;
+ this->resetState();
+}
+
+// -/----- Overlays ------\-
+void OLEDDisplayUi::setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount){
+ this->overlayFunctions = overlayFunctions;
+ this->overlayCount = overlayCount;
+}
+
+// -/----- Loading Process -----\-
+
+void OLEDDisplayUi::setLoadingDrawFunction(LoadingDrawFunction loadingDrawFunction) {
+ this->loadingDrawFunction = loadingDrawFunction;
+}
+
+void OLEDDisplayUi::runLoadingProcess(LoadingStage* stages, uint8_t stagesCount) {
+ uint8_t progress = 0;
+ uint8_t increment = 100 / stagesCount;
+
+ for (uint8_t i = 0; i < stagesCount; i++) {
+ display->clear();
+ this->loadingDrawFunction(this->display, &stages[i], progress);
+ display->display();
+
+ stages[i].callback();
+
+ progress += increment;
+ yield();
+ }
+
+ display->clear();
+ this->loadingDrawFunction(this->display, &stages[stagesCount-1], progress);
+ display->display();
+
+ delay(150);
+}
+
+// -/----- Manuel control -----\-
+void OLEDDisplayUi::nextFrame() {
+ if (this->state.frameState != IN_TRANSITION) {
+ this->state.manuelControll = true;
+ this->state.frameState = IN_TRANSITION;
+ this->state.ticksSinceLastStateSwitch = 0;
+ this->lastTransitionDirection = this->state.frameTransitionDirection;
+ this->state.frameTransitionDirection = 1;
+ }
+}
+void OLEDDisplayUi::previousFrame() {
+ if (this->state.frameState != IN_TRANSITION) {
+ this->state.manuelControll = true;
+ this->state.frameState = IN_TRANSITION;
+ this->state.ticksSinceLastStateSwitch = 0;
+ this->lastTransitionDirection = this->state.frameTransitionDirection;
+ this->state.frameTransitionDirection = -1;
+ }
+}
+
+void OLEDDisplayUi::switchToFrame(uint8_t frame) {
+ if (frame >= this->frameCount) return;
+ this->state.ticksSinceLastStateSwitch = 0;
+ if (frame == this->state.currentFrame) return;
+ this->state.frameState = FIXED;
+ this->state.currentFrame = frame;
+ this->state.isIndicatorDrawen = true;
+}
+
+void OLEDDisplayUi::transitionToFrame(uint8_t frame) {
+ if (frame >= this->frameCount) return;
+ this->state.ticksSinceLastStateSwitch = 0;
+ if (frame == this->state.currentFrame) return;
+ this->nextFrameNumber = frame;
+ this->lastTransitionDirection = this->state.frameTransitionDirection;
+ this->state.manuelControll = true;
+ this->state.frameState = IN_TRANSITION;
+ this->state.frameTransitionDirection = frame < this->state.currentFrame ? -1 : 1;
+}
+
+
+// -/----- State information -----\-
+OLEDDisplayUiState* OLEDDisplayUi::getUiState(){
+ return &this->state;
+}
+
+
+int8_t OLEDDisplayUi::update(){
+#ifdef ARDUINO
+ unsigned long frameStart = millis();
+#elif __MBED__
+ Timer t;
+ t.start();
+ unsigned long frameStart = t.read_ms();
+#else
+#error "Unkown operating system"
+#endif
+ int8_t timeBudget = this->updateInterval - (frameStart - this->state.lastUpdate);
+ if ( timeBudget <= 0) {
+ // Implement frame skipping to ensure time budget is keept
+ if (this->autoTransition && this->state.lastUpdate != 0) this->state.ticksSinceLastStateSwitch += ceil((double)-timeBudget / (double)this->updateInterval);
+
+ this->state.lastUpdate = frameStart;
+ this->tick();
+ }
+#ifdef ARDUINO
+ return this->updateInterval - (millis() - frameStart);
+#elif __MBED__
+ return this->updateInterval - (t.read_ms() - frameStart);
+#else
+#error "Unkown operating system"
+#endif
+}
+
+
+void OLEDDisplayUi::tick() {
+ this->state.ticksSinceLastStateSwitch++;
+
+ switch (this->state.frameState) {
+ case IN_TRANSITION:
+ if (this->state.ticksSinceLastStateSwitch >= this->ticksPerTransition){
+ this->state.frameState = FIXED;
+ this->state.currentFrame = getNextFrameNumber();
+ this->state.ticksSinceLastStateSwitch = 0;
+ this->nextFrameNumber = -1;
+ }
+ break;
+ case FIXED:
+ // Revert manuelControll
+ if (this->state.manuelControll) {
+ this->state.frameTransitionDirection = this->lastTransitionDirection;
+ this->state.manuelControll = false;
+ }
+ if (this->state.ticksSinceLastStateSwitch >= this->ticksPerFrame){
+ if (this->autoTransition){
+ this->state.frameState = IN_TRANSITION;
+ }
+ this->state.ticksSinceLastStateSwitch = 0;
+ }
+ break;
+ }
+
+ this->display->clear();
+ this->drawFrame();
+ if (shouldDrawIndicators) {
+ this->drawIndicator();
+ }
+ this->drawOverlays();
+ this->display->display();
+}
+
+void OLEDDisplayUi::resetState() {
+ this->state.lastUpdate = 0;
+ this->state.ticksSinceLastStateSwitch = 0;
+ this->state.frameState = FIXED;
+ this->state.currentFrame = 0;
+ this->state.isIndicatorDrawen = true;
+}
+
+void OLEDDisplayUi::drawFrame(){
+ switch (this->state.frameState){
+ case IN_TRANSITION: {
+ float progress = (float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition;
+ int16_t x = 0, y = 0, x1 = 0, y1 = 0;
+ switch(this->frameAnimationDirection){
+ case SLIDE_LEFT:
+ x = -this->display->width() * progress;
+ y = 0;
+ x1 = x + this->display->width();
+ y1 = 0;
+ break;
+ case SLIDE_RIGHT:
+ x = this->display->width() * progress;
+ y = 0;
+ x1 = x - this->display->width();
+ y1 = 0;
+ break;
+ case SLIDE_UP:
+ x = 0;
+ y = -this->display->height() * progress;
+ x1 = 0;
+ y1 = y + this->display->height();
+ break;
+ case SLIDE_DOWN:
+ default:
+ x = 0;
+ y = this->display->height() * progress;
+ x1 = 0;
+ y1 = y - this->display->height();
+ break;
+ }
+
+ // Invert animation if direction is reversed.
+ int8_t dir = this->state.frameTransitionDirection >= 0 ? 1 : -1;
+ x *= dir; y *= dir; x1 *= dir; y1 *= dir;
+
+ bool drawenCurrentFrame;
+
+
+ // Prope each frameFunction for the indicator Drawen state
+ this->enableIndicator();
+ (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, x, y);
+ drawenCurrentFrame = this->state.isIndicatorDrawen;
+
+ this->enableIndicator();
+ (this->frameFunctions[this->getNextFrameNumber()])(this->display, &this->state, x1, y1);
+
+ // Build up the indicatorDrawState
+ if (drawenCurrentFrame && !this->state.isIndicatorDrawen) {
+ // Drawen now but not next
+ this->indicatorDrawState = 2;
+ } else if (!drawenCurrentFrame && this->state.isIndicatorDrawen) {
+ // Not drawen now but next
+ this->indicatorDrawState = 1;
+ } else if (!drawenCurrentFrame && !this->state.isIndicatorDrawen) {
+ // Not drawen in both frames
+ this->indicatorDrawState = 3;
+ }
+
+ // If the indicator isn't draw in the current frame
+ // reflect it in state.isIndicatorDrawen
+ if (!drawenCurrentFrame) this->state.isIndicatorDrawen = false;
+
+ break;
+ }
+ case FIXED:
+ // Always assume that the indicator is drawn!
+ // And set indicatorDrawState to "not known yet"
+ this->indicatorDrawState = 0;
+ this->enableIndicator();
+ (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, 0, 0);
+ break;
+ }
+}
+
+void OLEDDisplayUi::drawIndicator() {
+
+ // Only draw if the indicator is invisible
+ // for both frames or
+ // the indiactor is shown and we are IN_TRANSITION
+ if (this->indicatorDrawState == 3 || (!this->state.isIndicatorDrawen && this->state.frameState != IN_TRANSITION)) {
+ return;
+ }
+
+ uint8_t posOfHighlightFrame = 0;
+ float indicatorFadeProgress = 0;
+
+ // if the indicator needs to be slided in we want to
+ // highlight the next frame in the transition
+ uint8_t frameToHighlight = this->indicatorDrawState == 1 ? this->getNextFrameNumber() : this->state.currentFrame;
+
+ // Calculate the frame that needs to be highlighted
+ // based on the Direction the indiactor is drawn
+ switch (this->indicatorDirection){
+ case LEFT_RIGHT:
+ posOfHighlightFrame = frameToHighlight;
+ break;
+ case RIGHT_LEFT:
+ default:
+ posOfHighlightFrame = this->frameCount - frameToHighlight;
+ break;
+ }
+
+ switch (this->indicatorDrawState) {
+ case 1: // Indicator was not drawn in this frame but will be in next
+ // Slide IN
+ indicatorFadeProgress = 1 - ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition);
+ break;
+ case 2: // Indicator was drawn in this frame but not in next
+ // Slide OUT
+ indicatorFadeProgress = ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition);
+ break;
+ }
+
+ //Space between indicators - reduce for small screen sizes
+ uint16_t indicatorSpacing = 12;
+ if (this->display->getHeight() < 64 && (this->indicatorPosition == RIGHT || this->indicatorPosition == LEFT)) {
+ indicatorSpacing = 6;
+ }
+
+ uint16_t frameStartPos = (indicatorSpacing * frameCount / 2);
+ const uint8_t *image;
+
+ uint16_t x = 0,y = 0;
+
+
+ for (uint8_t i = 0; i < this->frameCount; i++) {
+
+ switch (this->indicatorPosition){
+ case TOP:
+ y = 0 - (8 * indicatorFadeProgress);
+ x = (this->display->width() / 2) - frameStartPos + 12 * i;
+ break;
+ case BOTTOM:
+ y = (this->display->height() - 8) + (8 * indicatorFadeProgress);
+ x = (this->display->width() / 2) - frameStartPos + 12 * i;
+ break;
+ case RIGHT:
+ x = (this->display->width() - 8) + (8 * indicatorFadeProgress);
+ y = (this->display->height() / 2) - frameStartPos + 2 + 12 * i;
+ break;
+ case LEFT:
+ default:
+ x = 0 - (8 * indicatorFadeProgress);
+ y = (this->display->height() / 2) - frameStartPos + 2 + indicatorSpacing * i;
+ break;
+ }
+
+ if (posOfHighlightFrame == i) {
+ image = this->activeSymbol;
+ } else {
+ image = this->inactiveSymbol;
+ }
+
+ this->display->drawFastImage(x, y, 8, 8, image);
+ }
+}
+
+void OLEDDisplayUi::drawOverlays() {
+ for (uint8_t i=0;i<this->overlayCount;i++){
+ (this->overlayFunctions[i])(this->display, &this->state);
+ }
+}
+
+uint8_t OLEDDisplayUi::getNextFrameNumber(){
+ if (this->nextFrameNumber != -1) return this->nextFrameNumber;
+ return (this->state.currentFrame + this->frameCount + this->state.frameTransitionDirection) % this->frameCount;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplayUi.h Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,313 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
+ * Copyright (c) 2018 by Fabrice Weinberg
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+#ifndef OLEDDISPLAYUI_h
+#define OLEDDISPLAYUI_h
+
+#ifdef ARDUINO
+#include <Arduino.h>
+#elif __MBED__
+#include <mbed.h>
+#else
+#error "Unkown operating system"
+#endif
+
+#include "OLEDDisplay.h"
+
+//#define DEBUG_OLEDDISPLAYUI(...) Serial.printf( __VA_ARGS__ )
+
+#ifndef DEBUG_OLEDDISPLAYUI
+#define DEBUG_OLEDDISPLAYUI(...)
+#endif
+
+enum AnimationDirection {
+ SLIDE_UP,
+ SLIDE_DOWN,
+ SLIDE_LEFT,
+ SLIDE_RIGHT
+};
+
+enum IndicatorPosition {
+ TOP,
+ RIGHT,
+ BOTTOM,
+ LEFT
+};
+
+enum IndicatorDirection {
+ LEFT_RIGHT,
+ RIGHT_LEFT
+};
+
+enum FrameState {
+ IN_TRANSITION,
+ FIXED
+};
+
+
+const uint8_t ANIMATION_activeSymbol[] PROGMEM = {
+ 0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00
+};
+
+const uint8_t ANIMATION_inactiveSymbol[] PROGMEM = {
+ 0x00, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x00
+};
+
+
+// Structure of the UiState
+struct OLEDDisplayUiState {
+ uint64_t lastUpdate;
+ uint16_t ticksSinceLastStateSwitch;
+
+ FrameState frameState;
+ uint8_t currentFrame;
+
+ bool isIndicatorDrawen;
+
+ // Normal = 1, Inverse = -1;
+ int8_t frameTransitionDirection;
+
+ bool manuelControll;
+
+ // Custom data that can be used by the user
+ void* userData;
+};
+
+struct LoadingStage {
+ const char* process;
+ void (*callback)();
+};
+
+typedef void (*FrameCallback)(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
+typedef void (*OverlayCallback)(OLEDDisplay *display, OLEDDisplayUiState* state);
+typedef void (*LoadingDrawFunction)(OLEDDisplay *display, LoadingStage* stage, uint8_t progress);
+
+class OLEDDisplayUi {
+ private:
+ OLEDDisplay *display;
+
+ // Symbols for the Indicator
+ IndicatorPosition indicatorPosition;
+ IndicatorDirection indicatorDirection;
+
+ const uint8_t* activeSymbol;
+ const uint8_t* inactiveSymbol;
+
+ bool shouldDrawIndicators;
+
+ // Values for the Frames
+ AnimationDirection frameAnimationDirection;
+
+ int8_t lastTransitionDirection;
+
+ uint16_t ticksPerFrame; // ~ 5000ms at 30 FPS
+ uint16_t ticksPerTransition; // ~ 500ms at 30 FPS
+
+ bool autoTransition;
+
+ FrameCallback* frameFunctions;
+ uint8_t frameCount;
+
+ // Internally used to transition to a specific frame
+ int8_t nextFrameNumber;
+
+ // Values for Overlays
+ OverlayCallback* overlayFunctions;
+ uint8_t overlayCount;
+
+ // Will the Indicator be drawen
+ // 3 Not drawn in both frames
+ // 2 Drawn this frame but not next
+ // 1 Not drown this frame but next
+ // 0 Not known yet
+ uint8_t indicatorDrawState;
+
+ // Loading screen
+ LoadingDrawFunction loadingDrawFunction;
+
+ // UI State
+ OLEDDisplayUiState state;
+
+ // Bookeeping for update
+ uint8_t updateInterval;
+
+ uint8_t getNextFrameNumber();
+ void drawIndicator();
+ void drawFrame();
+ void drawOverlays();
+ void tick();
+ void resetState();
+
+ public:
+
+ OLEDDisplayUi(OLEDDisplay *display);
+
+ /**
+ * Initialise the display
+ */
+ void init();
+
+ /**
+ * Configure the internal used target FPS
+ */
+ void setTargetFPS(uint8_t fps);
+
+ // Automatic Controll
+ /**
+ * Enable automatic transition to next frame after the some time can be configured with `setTimePerFrame` and `setTimePerTransition`.
+ */
+ void enableAutoTransition();
+
+ /**
+ * Disable automatic transition to next frame.
+ */
+ void disableAutoTransition();
+
+ /**
+ * Set the direction if the automatic transitioning
+ */
+ void setAutoTransitionForwards();
+ void setAutoTransitionBackwards();
+
+ /**
+ * Set the approx. time a frame is displayed
+ */
+ void setTimePerFrame(uint16_t time);
+
+ /**
+ * Set the approx. time a transition will take
+ */
+ void setTimePerTransition(uint16_t time);
+
+ // Customize indicator position and style
+
+ /**
+ * Draw the indicator.
+ * This is the defaut state for all frames if
+ * the indicator was hidden on the previous frame
+ * it will be slided in.
+ */
+ void enableIndicator();
+
+ /**
+ * Don't draw the indicator.
+ * This will slide out the indicator
+ * when transitioning to the next frame.
+ */
+ void disableIndicator();
+
+ /**
+ * Enable drawing of indicators
+ */
+ void enableAllIndicators();
+
+ /**
+ * Disable draw of indicators.
+ */
+ void disableAllIndicators();
+
+ /**
+ * Set the position of the indicator bar.
+ */
+ void setIndicatorPosition(IndicatorPosition pos);
+
+ /**
+ * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING
+ */
+ void setIndicatorDirection(IndicatorDirection dir);
+
+ /**
+ * Set the symbol to indicate an active frame in the indicator bar.
+ */
+ void setActiveSymbol(const uint8_t* symbol);
+
+ /**
+ * Set the symbol to indicate an inactive frame in the indicator bar.
+ */
+ void setInactiveSymbol(const uint8_t* symbol);
+
+
+ // Frame settings
+
+ /**
+ * Configure what animation is used to transition from one frame to another
+ */
+ void setFrameAnimation(AnimationDirection dir);
+
+ /**
+ * Add frame drawing functions
+ */
+ void setFrames(FrameCallback* frameFunctions, uint8_t frameCount);
+
+ // Overlay
+
+ /**
+ * Add overlays drawing functions that are draw independent of the Frames
+ */
+ void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount);
+
+
+ // Loading animation
+ /**
+ * Set the function that will draw each step
+ * in the loading animation
+ */
+ void setLoadingDrawFunction(LoadingDrawFunction loadingFunction);
+
+
+ /**
+ * Run the loading process
+ */
+ void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount);
+
+
+ // Manual Control
+ void nextFrame();
+ void previousFrame();
+
+ /**
+ * Switch without transition to frame `frame`.
+ */
+ void switchToFrame(uint8_t frame);
+
+ /**
+ * Transition to frame `frame`, when the `frame` number is bigger than the current
+ * frame the forward animation will be used, otherwise the backwards animation is used.
+ */
+ void transitionToFrame(uint8_t frame);
+
+ // State Info
+ OLEDDisplayUiState* getUiState();
+
+ int8_t update();
+};
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SSD1306I2C.h Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,154 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+#ifndef SSD1306I2C_h
+#define SSD1306I2C_h
+
+
+#ifdef __MBED__
+
+#include "OLEDDisplay.h"
+#include <mbed.h>
+
+#ifndef UINT8_MAX
+ #define UINT8_MAX 0xff
+#endif
+
+class SSD1306I2C : public OLEDDisplay {
+public:
+ SSD1306I2C(uint8_t _address, PinName _sda, PinName _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) {
+ setGeometry(g);
+
+ this->_address = _address << 1; // convert from 7 to 8 bit for mbed.
+ this->_sda = _sda;
+ this->_scl = _scl;
+ _i2c = new I2C(_sda, _scl);
+ }
+
+ bool connect() {
+ // mbed supports 100k and 400k some device maybe 1000k
+#ifdef TARGET_STM32L4
+ _i2c->frequency(1000000);
+#else
+ _i2c->frequency(400000);
+#endif
+ return true;
+ }
+
+ void display(void) {
+ const int x_offset = (128 - this->width()) / 2;
+#ifdef OLEDDISPLAY_DOUBLE_BUFFER
+ uint8_t minBoundY = UINT8_MAX;
+ uint8_t maxBoundY = 0;
+
+ uint8_t minBoundX = UINT8_MAX;
+ uint8_t maxBoundX = 0;
+ uint8_t x, y;
+
+ // Calculate the Y bounding box of changes
+ // and copy buffer[pos] to buffer_back[pos];
+ for (y = 0; y < (this->height() / 8); y++) {
+ for (x = 0; x < this->width(); x++) {
+ uint16_t pos = x + y * this->width();
+ if (buffer[pos] != buffer_back[pos]) {
+ minBoundY = std::min(minBoundY, y);
+ maxBoundY = std::max(maxBoundY, y);
+ minBoundX = std::min(minBoundX, x);
+ maxBoundX = std::max(maxBoundX, x);
+ }
+ buffer_back[pos] = buffer[pos];
+ }
+ yield();
+ }
+
+ // If the minBoundY wasn't updated
+ // we can savely assume that buffer_back[pos] == buffer[pos]
+ // holdes true for all values of pos
+
+ if (minBoundY == UINT8_MAX) return;
+
+ sendCommand(COLUMNADDR);
+ sendCommand(x_offset + minBoundX); // column start address (0 = reset)
+ sendCommand(x_offset + maxBoundX); // column end address (127 = reset)
+
+ sendCommand(PAGEADDR);
+ sendCommand(minBoundY); // page start address
+ sendCommand(maxBoundY); // page end address
+
+ for (y = minBoundY; y <= maxBoundY; y++) {
+ uint8_t *start = &buffer[(minBoundX + y * this->width())-1];
+ uint8_t save = *start;
+
+ *start = 0x40; // control
+ _i2c->write(_address, (char *)start, (maxBoundX-minBoundX) + 1 + 1);
+ *start = save;
+ }
+#else
+
+ sendCommand(COLUMNADDR);
+ sendCommand(x_offset); // column start address (0 = reset)
+ sendCommand(x_offset + (this->width() - 1));// column end address (127 = reset)
+
+ sendCommand(PAGEADDR);
+ sendCommand(0x0); // page start address (0 = reset)
+ sendCommand((this->height() / 8) - 1); // page end address 7
+
+ if (geometry == GEOMETRY_128_64) {
+ sendCommand(0x7);
+ } else if (geometry == GEOMETRY_128_32) {
+ sendCommand(0x3);
+ }
+
+ buffer[-1] = 0x40; // control
+ _i2c->write(_address, (char *)&buffer[-1], displayBufferSize + 1);
+#endif
+ }
+
+private:
+ int getBufferOffset(void) {
+ return 0;
+ }
+
+ inline void sendCommand(uint8_t command) __attribute__((always_inline)) {
+ char _data[2];
+ _data[0] = 0x80; // control
+ _data[1] = command;
+ _i2c->write(_address, _data, sizeof(_data));
+ }
+
+ uint8_t _address;
+ PinName _sda;
+ PinName _scl;
+ I2C *_i2c;
+};
+
+#endif
+
+#endif
+
Helmut Tschemernjak