diff --git a/MCUFRIEND_kbv.cpp b/MCUFRIEND_kbv.cpp index 5d65909..051c027 100644 --- a/MCUFRIEND_kbv.cpp +++ b/MCUFRIEND_kbv.cpp @@ -1,4 +1,4 @@ -#define SUPPORT_0139 //not working +238 bytes +//#define SUPPORT_0139 //S6D0139 +280 bytes #define SUPPORT_0154 //S6D0154 +320 bytes //#define SUPPORT_1289 //costs about 408 bytes //#define SUPPORT_1580 //R61580 Untested @@ -8,15 +8,15 @@ #define SUPPORT_68140 //RM68140 +52 bytes defaults to PIXFMT=0x55 #define SUPPORT_7781 //ST7781 +172 bytes //#define SUPPORT_8230 //UC8230 +118 bytes -//#define SUPPORT_8347D //HX8347-D, HX8347-G, HX8347-I +520 bytes, 0.27s +//#define SUPPORT_8347D //HX8347-D, HX8347-G, HX8347-I, HX8367-A +520 bytes, 0.27s //#define SUPPORT_8347A //HX8347-A +500 bytes, 0.27s //#define SUPPORT_8352A //HX8352A +486 bytes, 0.27s //#define SUPPORT_8352B //HX8352B //#define SUPPORT_8357D_GAMMA //monster 34 byte -#define SUPPORT_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226 +//#define SUPPORT_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226 +380 bytes //#define SUPPORT_9326_5420 //ILI9326, SPFD5420 +246 bytes //#define SUPPORT_9342 //costs +114 bytes -//#define SUPPORT_9806 +//#define SUPPORT_9806 //UNTESTED #define SUPPORT_9488_555 //costs +230 bytes, 0.03s / 0.19s #define SUPPORT_B509_7793 //R61509, ST7793 +244 bytes #define OFFSET_9327 32 //costs about 103 bytes, 0.08s @@ -54,17 +54,10 @@ #define USING_16BIT_BUS 0 #endif -#if defined USE_GFX_KBV -MCUFRIEND_kbv::MCUFRIEND_kbv():Adafruit_GFX(240, 320) -{ - // we can not access GPIO pins until AHB has been enabled. -} -#else MCUFRIEND_kbv::MCUFRIEND_kbv(int CS, int RS, int WR, int RD, int RST):Adafruit_GFX(240, 320) { // we can not access GPIO pins until AHB has been enabled. } -#endif static uint8_t done_reset, is8347, is555; static uint16_t color565_to_555(uint16_t color) { diff --git a/MCUFRIEND_kbv.h b/MCUFRIEND_kbv.h index b79e2ba..a33fa80 100644 --- a/MCUFRIEND_kbv.h +++ b/MCUFRIEND_kbv.h @@ -1,3 +1,9 @@ +/* + * MCUFRIEND_kbv class inherits from Adafruit_GFX class and the Arduino Print class. + * Any use of MCUFRIEND_kbv class and examples is dependent on Adafruit and Arduino licenses + * The license texts are in the accompanying license.txt file + */ + #ifndef MCUFRIEND_KBV_H_ #define MCUFRIEND_KBV_H_ 298 @@ -13,13 +19,8 @@ class MCUFRIEND_kbv : public Adafruit_GFX { public: -#if defined USE_GFX_KBV - MCUFRIEND_kbv(); -#elif defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_GENERIC_STM32F103V) || defined(ARDUINO_MAPLE_REV3) || defined(ARDUINO_MAPLE_MINI) || defined(ESP32) +// MCUFRIEND_kbv(int CS=A3, int RS=A2, int WR=A1, int RD=A0, int RST=A4); //shield wiring MCUFRIEND_kbv(int CS=0, int RS=0, int WR=0, int RD=0, int RST=0); //dummy arguments -#else - MCUFRIEND_kbv(int CS=A3, int RS=A2, int WR=A1, int RD=A0, int RST=A4); -#endif void reset(void); // you only need the constructor void begin(uint16_t ID = 0x9341); // you only need the constructor virtual void drawPixel(int16_t x, int16_t y, uint16_t color); // and these three @@ -52,4 +53,25 @@ class MCUFRIEND_kbv : public Adafruit_GFX { uint16_t _lcd_ID, _lcd_rev, _lcd_madctl, _lcd_drivOut, _MC, _MP, _MW, _SC, _EC, _SP, _EP; }; +// New color definitions. thanks to Bodmer +#define TFT_BLACK 0x0000 /* 0, 0, 0 */ +#define TFT_NAVY 0x000F /* 0, 0, 128 */ +#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define TFT_MAROON 0x7800 /* 128, 0, 0 */ +#define TFT_PURPLE 0x780F /* 128, 0, 128 */ +#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define TFT_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define TFT_BLUE 0x001F /* 0, 0, 255 */ +#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ +#define TFT_CYAN 0x07FF /* 0, 255, 255 */ +#define TFT_RED 0xF800 /* 255, 0, 0 */ +#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ +#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ +#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ +#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define TFT_PINK 0xFC9F + #endif diff --git a/examples/Font_simple/Font_simple.ino b/examples/Font_simple/Font_simple.ino new file mode 100644 index 0000000..335bc61 --- /dev/null +++ b/examples/Font_simple/Font_simple.ino @@ -0,0 +1,66 @@ +#include // Core graphics library +#include // Hardware-specific library +MCUFRIEND_kbv tft; + +#include +#include +#include + +#include + +#define BLACK 0x0000 +#define RED 0xF800 +#define GREEN 0x07E0 +#define WHITE 0xFFFF +#define GREY 0x8410 + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + if (ID == 0xD3) ID = 0x9481; + tft.begin(ID); + tft.setRotation(0); +} + +void loop(void) +{ + tft.fillScreen(BLACK); + showmsgXY(20, 10, 1, NULL, "System x1"); + showmsgXY(20, 24, 2, NULL, "System x2"); + showmsgXY(20, 60, 1, &FreeSans9pt7b, "FreeSans9pt7b"); + showmsgXY(20, 80, 1, &FreeSans12pt7b, "FreeSans12pt7b"); + showmsgXY(20, 100, 1, &FreeSerif12pt7b, "FreeSerif12pt7b"); + showmsgXY(20, 120, 1, &FreeSmallFont, "FreeSmallFont"); + showmsgXY(5, 180, 1, &FreeSevenSegNumFont, "01234"); + showmsgXY(5, 190, 1, NULL, "System Font is drawn from topline"); + tft.setTextColor(RED, GREY); + tft.setTextSize(2); + tft.setCursor(0, 220); + tft.print("7x5 can overwrite"); + delay(1000); + tft.setCursor(0, 220); + tft.print("if background set"); + delay(1000); + showmsgXY(5, 260, 1, &FreeSans9pt7b, "Free Fonts from baseline"); + showmsgXY(5, 285, 1, &FreeSans9pt7b, "Free Fonts transparent"); + delay(1000); + showmsgXY(5, 285, 1, &FreeSans9pt7b, "Free Fonts XXX"); + delay(1000); + showmsgXY(5, 310, 1, &FreeSans9pt7b, "erase backgnd with fillRect()"); + delay(10000); +} + +void showmsgXY(int x, int y, int sz, const GFXfont *f, const char *msg) +{ + int16_t x1, y1; + uint16_t wid, ht; + tft.drawFastHLine(0, y, tft.width(), WHITE); + tft.setFont(f); + tft.setCursor(x, y); + tft.setTextColor(GREEN); + tft.setTextSize(sz); + tft.print(msg); + delay(1000); +} + diff --git a/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino b/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino new file mode 100644 index 0000000..b09e53c --- /dev/null +++ b/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino @@ -0,0 +1,342 @@ +// UTFT_Demo_220x176 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 220x176 pixels. +// +// This program requires the UTFT library. +// + +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args + +// Declare which fonts we will be using +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB22,A5,A4,A3,A2); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(); + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[218]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 219, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 162, 219, 175); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("** Universal TFT Library **", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("> Rinky-Dink Electronics <", CENTER, 163); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 219, 161); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(109, 15, 109, 160); + myGLCD.drawLine(1, 88, 218, 88); + + for (int i=9; i<210; i+=10) + myGLCD.drawLine(i, 86, i, 90); + for (int i=19; i<155; i+=10) + myGLCD.drawLine(107, i, 111, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(sin(((i*1.65)*3.14)/180)*70)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(cos(((i*1.65)*3.14)/180)*70)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(tan(((i*1.65)*3.14)/180))); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(109, 15, 109, 160); + myGLCD.drawLine(1, 88, 218, 88); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(218*20); i++) + { + x++; + if (x==219) + x=1; + if (i>219) + { + if ((x==109)||(buf[x-1]==88)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=88+(sin(((i*1.6)*3.14)/180)*(65-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRect(44+(i*15), 23+(i*15), 88+(i*15), 63+(i*15)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled, rounded rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRoundRect(132-(i*15), 23+(i*15), 172-(i*15), 63+(i*15)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled circles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillCircle(64+(i*15),43+(i*15), 20); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<160; i+=5) + { + myGLCD.drawLine(1, i, (i*1.44)-10, 160); + } + myGLCD.setColor (255,0,0); + for (int i=160; i>15; i-=5) + { + myGLCD.drawLine(218, i, (i*1.44)-12, 15); + } + myGLCD.setColor (0,255,255); + for (int i=160; i>15; i-=5) + { + myGLCD.drawLine(1, i, 232-(i*1.44), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<160; i+=5) + { + myGLCD.drawLine(218, i, 231-(i*1.44), 160); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random circles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=22+random(176); + y=35+random(105); + r=random(20); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random rounded rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(216), 16+random(143)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(40, 57, 179, 119); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 62); + myGLCD.print("Restarting in a", CENTER, 88); + myGLCD.print("few seconds...", CENTER, 101); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 146); + myGLCD.printNumI(millis(), CENTER, 161); + + delay (10000); +} diff --git a/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino b/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino index caf04bb..7d06205 100644 --- a/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino +++ b/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino @@ -1,9 +1,6 @@ -// UTFT_Demo_320x240 (C)2012 uCtronics -// web: http://www.uctronics.com -// UTFT_Demo_320x240 is derived from -// UTFT_Demo_320x240 (C)2010 Henning Karlsen -// web: http://www.henningkarlsen.com/electronics -// to fit for our 3.2 inch TFT LCD shield for Arduino/Maple/Chipkit +// UTFT_Demo_320x240 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ // // This program is a demo of how to use most of the functions // of the library with a supported display modules. @@ -11,30 +8,39 @@ // This demo was made for modules with a screen resolution // of 320x240 pixels. // -// This program requires the UTFT library (8bit mode) -// and the code is compatible with both UNO and Mega board. -// No code modification required. +// This program requires the UTFT library. // -// if I want to use a GLUE class that implements the UTFT API -// with the Adafruit classes, I MUST include those headers -// because the Arduino Java does not look at nested includes ! +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ - -#include -#include // class methods are in here -UTFTGLUE myGLCD(0x0154,A2,A1,A3,A4,A0); +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args // Declare which fonts we will be using -#if !defined(SmallFont) -extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref -#endif +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB32S,38,39,40,41); void setup() { - randomSeed(analogRead(5)); //.kbv Due does not like A0 - pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0 - digitalWrite(A0, HIGH); + randomSeed(analogRead(0)); // Setup the LCD myGLCD.InitLCD(); @@ -60,7 +66,7 @@ void loop() myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1); myGLCD.setBackColor(64, 64, 64); myGLCD.setColor(255,255,0); - myGLCD.print("", CENTER, 227); + myGLCD.print("", CENTER, 227); myGLCD.setColor(0, 0, 255); myGLCD.drawRect(0, 14, 319, 225); @@ -244,7 +250,7 @@ void loop() delay(2000); myGLCD.setColor(0,0,0); - myGLCD.fillRect(1,15,318,225); + myGLCD.fillRect(1,15,318,224); // Draw some random circles for (int i=0; i<100; i++) @@ -333,4 +339,3 @@ void loop() delay (10000); } - diff --git a/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino b/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino index 3596ec7..e89af66 100644 --- a/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino +++ b/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino @@ -1,5 +1,6 @@ -// UTFT_Demo_400x240 (C)2012 Henning Karlsen -// web: http://www.henningkarlsen.com/electronics +// UTFT_Demo_400x240 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ // // This program is a demo of how to use most of the functions // of the library with a supported display modules. @@ -10,27 +11,36 @@ // This program requires the UTFT library. // -//#include -//#include -#include -#include -//UTFTGLUE myGLCD; // use for default shield -UTFTGLUE myGLCD(0x9327,A2,A1,A3,A4,A0); -extern uint8_t SmallFont[]; +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ -/* -#include +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args // Declare which fonts we will be using -#if !defined(SmallFont) -extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref -#endif +//extern uint8_t SmallFont[]; + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB32WD,38,39,40,41); void setup() { - randomSeed(analogRead(5)); //.kbv Due does not like A0 - pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0 - digitalWrite(A0, HIGH); + randomSeed(analogRead(0)); // Setup the LCD myGLCD.InitLCD(); @@ -56,7 +66,7 @@ void loop() myGLCD.print("*** Universal Color TFT Display Library ***", CENTER, 1); myGLCD.setBackColor(64, 64, 64); myGLCD.setColor(255,255,0); - myGLCD.print("< http://electronics.henningkarlsen.com >", CENTER, 227); + myGLCD.print("< http://www.RinkyDinkElectronics.com/ >", CENTER, 227); myGLCD.setColor(0, 0, 255); myGLCD.drawRect(0, 14, 399, 225); @@ -331,4 +341,3 @@ void loop() delay (10000); } - diff --git a/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino b/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino index 5533958..8ee943e 100644 --- a/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino +++ b/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino @@ -1,5 +1,6 @@ -// UTFT_Demo_480x320 (C)2013 Henning Karlsen -// web: http://www.henningkarlsen.com/electronics +// UTFT_Demo_480x320 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ // // This program is a demo of how to use most of the functions // of the library with a supported display modules. @@ -10,20 +11,36 @@ // This program requires the UTFT library. // -#include -#include -UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0); +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args // Declare which fonts we will be using -#if !defined(SmallFont) -extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref -#endif +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(CTE32HR,38,39,40,41); void setup() { - randomSeed(analogRead(5)); //.kbv Due does not like A0 - pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0 - digitalWrite(A0, HIGH); + randomSeed(analogRead(0)); // Setup the LCD myGLCD.InitLCD(); @@ -49,7 +66,7 @@ void loop() myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1); myGLCD.setBackColor(64, 64, 64); myGLCD.setColor(255,255,0); - myGLCD.print("", CENTER, 307); + myGLCD.print("", CENTER, 307); myGLCD.setColor(0, 0, 255); myGLCD.drawRect(0, 14, 479, 305); @@ -322,4 +339,3 @@ void loop() delay (10000); } - diff --git a/examples/LCD_ID_readnew/LCD_ID_readnew.ino b/examples/LCD_ID_readnew/LCD_ID_readnew.ino new file mode 100644 index 0000000..92b28ec --- /dev/null +++ b/examples/LCD_ID_readnew/LCD_ID_readnew.ino @@ -0,0 +1,734 @@ +// adapted from LCD_ID_Reader from http://misc.ws/lcd_information +// controllers either read as 16-bit or as a sequence of 8-bit values + +//-- Arduino UNO or Mega 2560 Plugged as shield +#define LCD_RST A4 //A1 +#define LCD_CS A3 +#define LCD_RS A2 +#define LCD_WR A1 +#define LCD_RD A0 + +#define LCD_D0 8 +#define LCD_D1 9 +#define LCD_D2 2 //10 +#define LCD_D3 3 //11 +#define LCD_D4 4 +#define LCD_D5 5 //13 +#define LCD_D6 6 +#define LCD_D7 7 + +uint8_t unlock_1520[] = { (0xB0), 2, 0x00, 0x00 }; +uint8_t unlock_1526[] = { (0xB0), 2, 0x3F, 0x3F }; +uint8_t unlock_8357[] = { (0xB9), 3, 0xFF, 0x83, 0x57}; +uint8_t unlock_5310[] = { (0xED), 2, 0x01, 0xFE}; +uint8_t d5310_0_in[] = { (0xEE), 2, 0xDE, 0x21}; //enter CMD3 8bit args +//uint8_t d5310_1[] = { (0x??), 2, 0xDE, 0x21}; +uint8_t d5310_1_in[] = { (0xBF), 1, 0xAA}; //enter page#1 16bit args +uint8_t d5310_1_out[] = { (0x00), 1, 0xAA}; //leave page#1 16bit args +uint8_t d1526nvm[] = { (0xE2), 1, 0x3F}; +uint8_t *unlock = NULL; +uint8_t *page_N = NULL; + +void setup() +{ + Serial.begin(9600); + while (!Serial) ; + Serial.println(F("Read Registers on MCUFRIEND UNO shield")); + Serial.println(F("controllers either read as single 16-bit")); + Serial.println(F("e.g. the ID is at readReg(0)")); + Serial.println(F("or as a sequence of 8-bit values")); + Serial.println(F("in special locations (first is dummy)")); + Serial.println(F("")); + lcdInit(); + lcdReset(); //ensures that controller is in default state + // unlock = unlock_1520; + // unlock = unlock_1526; + // unlock = unlock_8357; + // unlock = unlock_5310; + // page_N = d5310_1_in; + // for (uint16_t i = 0x00; i <= 0xFE; i++) readReg(i, 10, "f.k"); + read_regs("diagnose any controller"); + // read_xxxx("mystery"); + // read_5310_P0("NT35310 P0"); + // read_5310_P1("NT35310 P1"); + // read_61509("R61509 / ILI9326"); + // read_61526("R61520 / R61526"); + // read_8357("HX8357X"); + // read_9320("ILI9320"); + // read_9327("ILI9327"); + // read_9338("ILI9302 / ILI9329 / ILI9338 / ILI9341"); + // read_9481("ILI9481 / HX8357-B / R61581"); + // read_9486("ILI9486 / 1LI9488"); +} + +void loop() +{ + // put your main code here, to run repeatedly: + +} + +void printhex(uint8_t val) +{ + if (val < 0x10) Serial.print("0"); + Serial.print(val, HEX); +} + +void readReg(uint16_t reg, uint8_t n, const char *msg) +{ + uint8_t val8; + lcdReset(); + lcdSetWriteDir(); + if (unlock) pushCommand(unlock[0], unlock + 2, unlock[1]); + if (page_N) pushCommand(page_N[0], page_N + 2, page_N[1]); + Serial.print("reg(0x"); + printhex(reg >> 8); + printhex(reg); + Serial.print(")"); + lcdWriteCommand(reg); + lcdSetReadDir(); + while (n--) { + val8 = lcdReadData8(); + Serial.print(" "); + printhex(val8); + } + lcdSetWriteDir(); + digitalWrite(LCD_CS, HIGH); + + Serial.print("\t"); + Serial.println(msg); +} + +void lcdInit() +{ + pinMode(LCD_CS, OUTPUT); + digitalWrite(LCD_CS, HIGH); + pinMode(LCD_RS, OUTPUT); + digitalWrite(LCD_RS, HIGH); + pinMode(LCD_WR, OUTPUT); + digitalWrite(LCD_WR, HIGH); + pinMode(LCD_RD, OUTPUT); + digitalWrite(LCD_RD, HIGH); + pinMode(LCD_RST, OUTPUT); + digitalWrite(LCD_RST, HIGH); +} + +void lcdReset() +{ + digitalWrite(LCD_RST, LOW); + delay(2); + digitalWrite(LCD_RST, HIGH); + delay(10); //allow controller to re-start +} + +void lcdWrite8(uint16_t data) +{ + digitalWrite(LCD_D0, data & 1); + digitalWrite(LCD_D1, (data & 2) >> 1); + digitalWrite(LCD_D2, (data & 4) >> 2); + digitalWrite(LCD_D3, (data & 8) >> 3); + digitalWrite(LCD_D4, (data & 16) >> 4); + digitalWrite(LCD_D5, (data & 32) >> 5); + digitalWrite(LCD_D6, (data & 64) >> 6); + digitalWrite(LCD_D7, (data & 128) >> 7); +} + +uint16_t lcdRead8() +{ + uint16_t result = digitalRead(LCD_D7); + result <<= 1; + result |= digitalRead(LCD_D6); + result <<= 1; + result |= digitalRead(LCD_D5); + result <<= 1; + result |= digitalRead(LCD_D4); + result <<= 1; + result |= digitalRead(LCD_D3); + result <<= 1; + result |= digitalRead(LCD_D2); + result <<= 1; + result |= digitalRead(LCD_D1); + result <<= 1; + result |= digitalRead(LCD_D0); + + return result; +} + +void lcdSetWriteDir() +{ + uint8_t mode = OUTPUT; + pinMode(LCD_D0, mode); + pinMode(LCD_D1, mode); + pinMode(LCD_D2, mode); + pinMode(LCD_D3, mode); + pinMode(LCD_D4, mode); + pinMode(LCD_D5, mode); + pinMode(LCD_D6, mode); + pinMode(LCD_D7, mode); +} + + +void lcdSetReadDir() +{ + uint8_t mode = INPUT; + pinMode(LCD_D0, mode); + pinMode(LCD_D1, mode); + pinMode(LCD_D2, mode); + pinMode(LCD_D3, mode); + pinMode(LCD_D4, mode); + pinMode(LCD_D5, mode); + pinMode(LCD_D6, mode); + pinMode(LCD_D7, mode); +} + +void lcdWriteData(uint16_t data) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data >> 8); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_CS, HIGH); +} + +void lcdWriteCommand(uint16_t command) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, LOW); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command >> 8); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + // digitalWrite(LCD_CS, HIGH); +} + +uint8_t lcdReadData8() +{ + uint8_t result; + lcdSetReadDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_RD, LOW); + delayMicroseconds(10); + result = lcdRead8(); + digitalWrite(LCD_RD, HIGH); + + delayMicroseconds(10); + + return result; +} + + +uint16_t lcdReadData16() +{ + uint16_t result; + result = lcdReadData8() << 8; + result |= lcdReadData8(); + return result; +} + + +void lcdWriteRegister(uint16_t addr, uint16_t data) +{ + lcdWriteCommand(addr); + lcdWriteData(data); +} + +void pushCommand(uint8_t command, uint8_t *block, int8_t n) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, LOW); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + digitalWrite(LCD_RS, HIGH); + while (n--) { + lcdWrite8(*block++); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + } + digitalWrite(LCD_CS, HIGH); + +} + +// make all the functions static. +// the linker will discard unused anonymous strings. + +static void read_regs(char *title) +{ + Serial.println(title); + readReg(0x00, 2, "ID: ILI9320, ILI9325, ILI9335, ..."); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x30, 5, "PTLAR"); + readReg(0x33, 7, "VSCRLDEF"); + readReg(0x61, 2, "RDID1 HX8347-G"); + readReg(0x62, 2, "RDID2 HX8347-G"); + readReg(0x63, 2, "RDID3 HX8347-G"); + readReg(0x64, 2, "RDID1 HX8347-A"); + readReg(0x65, 2, "RDID2 HX8347-A"); + readReg(0x66, 2, "RDID3 HX8347-A"); + readReg(0x67, 2, "RDID Himax HX8347-A"); + readReg(0x70, 2, "Panel Himax HX8347-A"); + readReg(0xA1, 5, "RD_DDB SSD1963"); + readReg(0xB0, 2, "RGB Interface Signal Control"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xB6, 5, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xBF, 6, "ILI9481, HX8357-B"); + readReg(0xC0, 9, "Panel Control"); + readReg(0xC1, 4, "Display Timing"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 4, "ILI9341, ILI9488"); + readReg(0xD4, 4, "Novatek"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xEF, 6, "ILI9327"); + readReg(0xF2, 12, "Adjust Control 2"); + readReg(0xF6, 4, "Interface Control"); +} + +static void read_5310_P0(char *title) +{ + Serial.println(title); + readReg(0xB0, 2, "DISPLAY_CTRL"); + readReg(0xB1, 4, "PORCH_CTRL"); + readReg(0xB2, 4, "FRAME_CTRL"); + readReg(0xB3, 2, "SPI_RGB"); + readReg(0xB6, 7, "SOURCE_EQ"); + readReg(0xC0, 5, "PWR_CTRL1"); + readReg(0xC1, 3, "PWR_CTRL2"); + readReg(0xC2, 4, "PWR_CTRL3"); + readReg(0xC3, 2, "PWR_CTRL5"); + readReg(0xC4, 2, "PWR_CTRL6"); + readReg(0xC5, 5, "PWR_CTRL7"); + readReg(0xC6, 5, "PWR_CTRL8"); + readReg(0xD1, 2, "WRID"); + readReg(0xD2, 2, "WRID"); + readReg(0xD3, 2, "WRID"); + readReg(0xD4, 5, "RDID4"); + readReg(0xD5, 5, "WRDDB"); + readReg(0xDE, 4, "EPWR"); + readReg(0xFF, 2, "PAGE_STATUS"); +} + +static void read_5310_P1(char *title) +{ + Serial.println(title); + /* + readReg(0xB0, 19, "f.k"); + readReg(0xB1, 7, "f.k"); + readReg(0xB2, 7, "f.k"); + readReg(0xB3, 25, "f.k"); + readReg(0xB4, 7, "f.k"); + readReg(0xB5, 7, "f.k"); + readReg(0xB6, 3, "f.k"); + readReg(0xB7, 23, "f.k"); + readReg(0xB8, 7, "f.k"); + readReg(0xBA, 5, "f.k"); + readReg(0xC0, 19, "f.k"); + readReg(0xC1, 7, "f.k"); + readReg(0xC2, 5, "f.k"); + readReg(0xC3, 49, "f.k"); + readReg(0xC4, 27, "f.k"); + readReg(0xC5, 11, "f.k"); + readReg(0xC6, 7, "f.k"); + readReg(0xC7, 5, "f.k"); + readReg(0xC8, 5, "f.k"); + readReg(0xC9, 17, "f.k"); + */ + readReg(0xE0, 37, "GAMMA_RED_P"); + readReg(0xE1, 37, "GAMMA_RED_N"); + readReg(0xE2, 37, "GAMMA_GREEN_P"); + readReg(0xE3, 37, "GAMMA_GREEN_N"); + readReg(0xE4, 37, "GAMMA_BLUE_P"); + readReg(0xE5, 37, "GAMMA_BLUE_N"); + readReg(0xE6, 33, "CABC_RED"); + readReg(0xE7, 33, "CABC_GREEN"); + readReg(0xE8, 33, "CABC_BLUE"); + // readReg(0xE9, 5, "f.k."); + readReg(0xFF, 2, "PAGE_STATUS"); +} + +static void read_61509(char *title) +{ + Serial.println(title); + readReg(0x0000, 2, "Device Code Read"); + readReg(0x0001, 2, "Device Output Control"); + readReg(0x0002, 2, "LCD Waveform Control"); + readReg(0x0003, 2, "Entry Mode"); + readReg(0x0007, 2, "Display Control 1"); + readReg(0x0008, 2, "Display Control 2"); + readReg(0x0009, 2, "Display Control 3"); + readReg(0x0010, 2, "Panel Interface Control 1"); + readReg(0x0011, 2, "Panel Interface Control 2"); + readReg(0x0012, 2, "Panel Interface Control 3"); + readReg(0x0013, 2, "Panel Interface Control 4"); + readReg(0x0100, 2, "Power Control 1"); + readReg(0x0101, 2, "Power Control 2"); + readReg(0x0102, 2, "Power Control 3"); + readReg(0x0103, 2, "Power Control 4"); + readReg(0x0210, 2, "Horiz SA"); + readReg(0x0211, 2, "Horiz EA"); + readReg(0x0212, 2, "Vert SA"); + readReg(0x0213, 2, "Vert EA"); + readReg(0x0400, 2, "Base Image NL"); + readReg(0x0401, 2, "Base Image Control"); + readReg(0x0404, 2, "Base Image Scroll"); +} + +static void read_61526(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x0A, 2, "Get Power Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xB3, 6, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xC0, 9, "Panel Control"); + readReg(0xC1, 6, "Display Timing Normal"); + readReg(0xC3, 6, "Display Timing Idle"); + readReg(0xC4, 6, "Timing setting"); + readReg(0xC8, 23, "GAMMA"); + readReg(0xC9, 23, "GAMMA"); + readReg(0xCA, 23, "GAMMA"); + readReg(0xD0, 7, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xE0, 4, "NVM Access"); + readReg(0xE1, 2, "set_DDB"); + readReg(0xE2, 2, "NVM Load Control"); +} + +static void read_8357(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Power Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "SETOSC"); + readReg(0xB1, 8, "SETPOWER"); + readReg(0xB2, 6, "SETDISPLAY"); + readReg(0xB3, 5, "SETRGB"); + readReg(0xB4, 8, "SETCYC"); + readReg(0xB5, 4, "SETBGP"); + readReg(0xB6, 3, "SETVCOM"); + readReg(0xB7, 6, "SETOTP"); + readReg(0xB9, 4, "SETEXTC"); + readReg(0xC0, 7, "SETSTBA"); + readReg(0xC1, 11, "SETDGC"); + readReg(0xC3, 5, "SETID"); + readReg(0xC4, 5, "SETDDB"); + readReg(0xC9, 3, "SETCABC"); + readReg(0xCC, 2, "SETPANEL"); + readReg(0xD0, 4, "GETICID"); + readReg(0xE0, 35, "SETGAMMA"); + readReg(0xE9, 2, "SETIMAGEI"); + readReg(0xEA, 2, "SETMESSI"); +} + +static void read_fk(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xF0, 4, "f.k."); + readReg(0xF2, 18, "f.k."); + readReg(0xF3, 2, "f.k."); + readReg(0xF4, 14, "f.k."); + readReg(0xF5, 11, "f.k."); + readReg(0xF6, 10, "f.k."); + readReg(0xF7, 4, "f.k."); + readReg(0xF8, 2, "f.k."); + readReg(0xF9, 2, "f.k."); + readReg(0xFA, 12, "f.k."); + readReg(0xFB, 2, "f.k."); + readReg(0xFC, 2, "f.k."); + readReg(0xFD, 12, "f.k."); + readReg(0xFE, 2, "f.k."); +} + +static void read_xxxx(char *title) +{ + Serial.println(title); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xC6, 2, "f.k."); + readReg(0xD6, 4, "f.k."); + readReg(0xD7, 5, "f.k."); + readReg(0xD8, 5, "f.k."); + readReg(0xD9, 4, "f.k."); + readReg(0xE0, 2, "f.k."); + readReg(0xE1, 3, "f.k."); + readReg(0xF0, 2, "f.k."); + readReg(0xF1, 2, "f.k."); + readReg(0xF2, 12, "f.k."); + readReg(0xF3, 9, "f.k."); + readReg(0xF4, 6, "f.k."); + readReg(0xF5, 7, "f.k."); + readReg(0xF6, 5, "f.k."); + readReg(0xF7, 16, "f.k."); + readReg(0xFD, 4, "f.k."); + readReg(0xFE, 2, "f.k."); + readReg(0xFF, 2, "f.k."); +} + +static void read_9320(char *title) +{ + Serial.println(title); + readReg(0x0000, 2, "Device Code Read"); + readReg(0x0001, 2, "Drive Output Control"); + readReg(0x0002, 2, "LCD Waveform Control"); + readReg(0x0003, 2, "Entry Mode"); + readReg(0x0007, 2, "Display Control 1"); + readReg(0x0008, 2, "Display Control 2"); + readReg(0x0009, 2, "Display Control 3"); + readReg(0x000A, 2, "Display Control 4"); + readReg(0x0010, 2, "Power Control 1"); + readReg(0x0011, 2, "Power Control 2"); + readReg(0x0012, 2, "Power Control 3"); + readReg(0x0013, 2, "Power Control 4"); + readReg(0x0014, 2, "Power Control 5"); + readReg(0x0015, 2, "Power Control 6"); + readReg(0x0029, 2, "Power Control 7"); + readReg(0x002B, 2, "Frame Rate"); +} + +static void read_9327(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 2, "Command Access Protect"); + readReg(0xB1, 2, "Low Power Control"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xB5, 2, "Sub Panel Control"); + readReg(0xBF, 2, "Backlight Control"); + readReg(0xC0, 7, "Panel Control"); + readReg(0xC1, 4, "Display Timing Normal"); + readReg(0xC3, 4, "Display Timing Idle"); + readReg(0xC4, 2, "VCOM Timing"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC6, 2, "Interface Control"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xC9, 13, "GAMMA Red/Blue"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 3, "Power Partial"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xEF, 6, "Device Code Read"); +} + +static void read_9338(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + // readReg(0x05, 2, "DSI errors"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xB0, 2, "Interface Mode"); + readReg(0xB1, 3, "Frame Rate Normal"); + readReg(0xB2, 3, "Frame Rate Idle"); + readReg(0xB3, 3, "Frame Rate Partial"); + readReg(0xB4, 3, "Inversion Control"); + readReg(0xB5, 5, "Blanking Porch"); + readReg(0xB6, 4, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xC0, 2, "Power Control 1"); + readReg(0xC1, 2, "Power Control 2"); + readReg(0xC2, 2, "Power Control 3"); + readReg(0xC3, 2, "Power Control 4"); + readReg(0xC4, 2, "Power Control 5"); + readReg(0xC5, 3, "VCOM Control 1"); + readReg(0xC7, 2, "VCOM Control 2"); + /* + readReg(0xD0, 3, "NVM Write"); + readReg(0xD1, 4, "NVM key"); + */ + readReg(0xD2, 3, "NVM Status"); + readReg(0xD3, 4, "RDID4"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xF2, 2, "GAMMA-3G"); + readReg(0xF6, 4, "Interface Control"); +} + +static void read_9481(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 2, "Command Access Protect"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xBF, 6, "Device Code Read"); + readReg(0xC0, 6, "Panel Control"); + readReg(0xC1, 4, "Display Timing Normal"); + readReg(0xC2, 4, "Display Timing Partial"); + readReg(0xC3, 4, "Display Timing Idle"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC6, 2, "Interface Control"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 3, "Power Partial"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xE4, 4, "? SETCABC(HX) (f.k. ILI)"); + readReg(0xE9, 4, "? Set Panel Related(HX)"); + readReg(0xEE, 5, "? Set EQ Function(HX)"); + readReg(0xF0, 4, "f.k (ILI)"); + readReg(0xF1, 2, "f.k"); + readReg(0xF2, 4, "f.k"); + readReg(0xF3, 4, "f.k (ILI)"); + readReg(0xF4, 4, "f.k"); + readReg(0xF5, 2, "f.k"); + readReg(0xF6, 2, "f.k"); + readReg(0xF7, 4, "f.k"); + readReg(0xF8, 3, "f.k"); + readReg(0xF9, 2, "f.k"); +} + +static void read_9486(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x05, 2, "DSI errors"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xB0, 2, "Interface Mode"); + readReg(0xB1, 3, "Frame Rate Normal"); + readReg(0xB2, 3, "Frame Rate Idle"); + readReg(0xB3, 3, "Frame Rate Partial"); + readReg(0xB4, 2, "Inversion Control"); + readReg(0xB5, 5, "Blanking Porch"); + readReg(0xB6, 4, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xBF, 6, "NON-Ilitek Device Code Read"); + readReg(0xC0, 3, "Power Control 1"); + readReg(0xC1, 3, "Power Control 2"); + readReg(0xC2, 2, "Power Control 3"); + readReg(0xC3, 2, "Power Control 4"); + readReg(0xC4, 2, "Power Control 5"); + readReg(0xC5, 5, "VCOM Control 1"); + /* + readReg(0xC6, 3, "CABC Control 1"); + readReg(0xC8, 3, "CABC Control 2"); + readReg(0xC9, 2, "CABC Control 3"); + readReg(0xCA, 2, "CABC Control 4"); + readReg(0xCB, 2, "CABC Control 5"); + readReg(0xCC, 2, "CABC Control 6"); + readReg(0xCD, 2, "CABC Control 7"); + readReg(0xCE, 2, "CABC Control 8"); + readReg(0xCF, 2, "CABC Control 9"); + readReg(0xD0, 3, "NVM Write"); + readReg(0xD1, 4, "NVM key"); + readReg(0xD2, 5, "NVM Status"); + */ + readReg(0xD3, 4, "RDID4"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xF2, 10, "Adjust 2"); + readReg(0xF7, 5, "Adjust 3"); + readReg(0xF8, 3, "Adjust 4"); + readReg(0xF9, 3, "Adjust 5"); + readReg(0xFB, 2, "SPI Read"); + readReg(0xFC, 3, "Adjust 6"); +} + + diff --git a/examples/TouchScreen_Calibr_new/TouchScreen_Calibr_new.ino b/examples/TouchScreen_Calibr_new/TouchScreen_Calibr_new.ino deleted file mode 100644 index 6d7a00e..0000000 --- a/examples/TouchScreen_Calibr_new/TouchScreen_Calibr_new.ino +++ /dev/null @@ -1,455 +0,0 @@ -// .kbv: previous sketch wasted too much SRAM with const strings -// .kbv: replace all UTFT print const strings with F(string) -// .kbv: correct UTFTGLUE settextcursor() for String print - -// https://forum.arduino.cc/index.php?topic=473885.msg3245748#msg3245748 -// file attached 03 May 2017 21:15 BST - - -// TouchScreen_Calibr_kbv for MCUFRIEND UNO Display Shields -// adapted by David Prentice -// for Adafruit's Resistive Touch Screen Library -// from Henning Karlsen's original program. Many Thanks. - -// UTouch_Calibration (C)2013-2014 Henning Karlsen -// web: http://www.henningkarlsen.com/electronics -// -// This program can be used to calibrate the touchscreen -// of the display modules. -// -// It is assumed that the display module is connected to an -// appropriate shield or that you know how to change the pin -// numbers in the setup. -// -// Instructions will be given on the display. - -//#define TOUCH_ORIENTATION LANDSCAPE -#define TOUCH_ORIENTATION PORTRAIT -#define TITLE "TouchScreen.h Calibration" - -#include -#include //we are using UTFT display methods -UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0); - -// MCUFRIEND UNO shield shares pins with the TFT. Due does NOT work - -//int XP = 6, XM = A2, YP = A1, YM = 7; //most common configuration (dead Due) -int XP = 7, XM = A1, YP = A2, YM = 6; //most common configuration (WHITE Due) - -//#include "TouchScreen_kbv.h" //Local Library -//TouchScreen_kbv myTouch(XP, YP, XM, YM, 300); -#include //Global Library -TouchScreen myTouch(XP, YP, XM, YM, 300); -TSPoint tp; //Touchscreen_due branch uses Point - -void readResistiveTouch(void) -{ - tp = myTouch.getPoint(); - pinMode(YP, OUTPUT); //restore shared pins - pinMode(XM, OUTPUT); -} - -bool ISPRESSED(void) -{ - // .kbv this was too sensitive !! - // now touch has to be stable for 50ms - int count = 0; - bool state, oldstate; - while (count < 10) { - readResistiveTouch(); - state = tp.z > 180; // .kbv was >20 && < 1000 - if (state == oldstate) count++; - else count = 0; - oldstate = state; - delay(5); - } - return oldstate; -} - -void showpoint(void) -{ - Serial.print("\r\nx="); Serial.print(tp.x); - Serial.print(" y="); Serial.print(tp.y); - Serial.print(" z="); Serial.print(tp.z); -} - -// ************************************ -// DO NOT EDIT ANYTHING BELOW THIS LINE -// ************************************ - -// Declare which fonts we will be using -#if defined(SmallFont) //.kbv new GLUE defines FreeSmallFont -#undef SmallFont //.kbv lose it -#define SmallFont NULL //.kbv use System Font -#else -extern uint8_t SmallFont[]; //.kbv -#endif - -uint32_t cx, cy; -uint32_t rx[8], ry[8]; -int32_t clx, crx, cty, cby; -float px, py; -int dispx, dispy, text_y_center, swapxy; -uint32_t calx, caly, cals; -char buf[13]; - -void showpins(int A, int D, int value, const char *msg) -{ - char buf[40]; - sprintf(buf, "%s (A%d, D%d) = %d", msg, A - A0, D, value); - Serial.println(buf); -} - -boolean diagnose_pins() -{ - int i, j, value, Apins[2], Dpins[2], Values[2], found = 0; - // Serial.begin(9600); - Serial.println("Making all control and bus pins INPUT_PULLUP"); - Serial.println("Typical 30k Analog pullup with corresponding pin"); - Serial.println("would read low when digital is written LOW"); - Serial.println("e.g. reads ~25 for 300R X direction"); - Serial.println("e.g. reads ~30 for 500R Y direction"); - Serial.println(""); - for (i = A0; i < A5; i++) pinMode(i, INPUT_PULLUP); - for (i = 2; i < 10; i++) pinMode(i, INPUT_PULLUP); - for (i = A0; i < A4; i++) { - for (j = 5; j < 10; j++) { - pinMode(j, OUTPUT); - digitalWrite(j, LOW); - value = analogRead(i); // ignore first reading - value = analogRead(i); - if (value < 100) { - showpins(i, j, value, "Testing :"); - if (found < 2) { - Apins[found] = i; - Dpins[found] = j; - Values[found] = value; - found++; - } - } - pinMode(j, INPUT_PULLUP); - } - } - if (found == 2) { - Serial.println("Diagnosing as:-"); - int idx = Values[0] < Values[1]; - for (i = 0; i < 2; i++) { - showpins(Apins[i], Dpins[i], Values[i], - (Values[i] < Values[!i]) ? "XM,XP: " : "YP,YM: "); - } - XM = Apins[!idx]; XP = Dpins[!idx]; YP = Apins[idx]; YM = Dpins[idx]; -// myTouch = TouchScreen_kbv(XP, YP, XM, YM, 300); //Local library - myTouch = TouchScreen(XP, YP, XM, YM, 300); //Global library - return true; - } - Serial.println("BROKEN TOUCHSCREEN"); - return false; -} - -void setup() -{ - Serial.begin(9600); - Serial.println(TITLE); - bool ret = true; -#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega2560__) - ret = diagnose_pins(); -#else - Serial.println("Only AVR can diagnose Touch Pins"); - Serial.println("Other targets use default Pins"); - char buf[40]; - sprintf(buf, "Touch Pin Wiring XP=%d XM=A%d YP=A%d YM=%d", - XP, XM - A0, YP - A0, YM); - Serial.println(buf); -#endif - digitalWrite(A0, HIGH); - pinMode(A0, OUTPUT); - myGLCD.InitLCD(TOUCH_ORIENTATION); - myGLCD.clrScr(); - myGLCD.setFont(SmallFont); - dispx = myGLCD.getDisplayXSize(); - dispy = myGLCD.getDisplayYSize(); - text_y_center = (dispy / 2) - 6; - if (ret == false) { - myGLCD.print(F("BROKEN TOUCHSCREEN"), CENTER, dispy / 2); - while (1); - } -} - -void drawCrossHair(int x, int y) -{ - myGLCD.drawRect(x - 10, y - 10, x + 10, y + 10); - myGLCD.drawLine(x - 5, y, x + 5, y); - myGLCD.drawLine(x, y - 5, x, y + 5); -} - -void readCoordinates() -{ - int iter = 5000; - int failcount = 0; - int cnt = 0; - uint32_t tx = 0; - uint32_t ty = 0; - boolean OK = false; - - while (OK == false) - { - myGLCD.setColor(255, 255, 255); - myGLCD.print(F("* PRESS *"), CENTER, text_y_center); - while (ISPRESSED() == false) {} - myGLCD.print(F("* HOLD! *"), CENTER, text_y_center); - cnt = 0; - iter = 400; - do - { - readResistiveTouch(); - // showpoint(tp); - if (tp.z > 20 && tp.z < 1000) - { - tx += tp.x; - ty += tp.y; - cnt++; - } - else - failcount++; - } while ((cnt < iter) && (failcount < 10000)); - if (cnt >= iter) - { - OK = true; - } - else - { - tx = 0; - ty = 0; - cnt = 0; - } - if (failcount >= 10000) - fail(); - } - - cx = tx / iter; - cy = ty / iter; -} - -void calibrate(int x, int y, int i) -{ - myGLCD.setColor(255, 255, 255); - drawCrossHair(x, y); - myGLCD.setBackColor(255, 0, 0); - readCoordinates(); - myGLCD.setColor(255, 255, 255); - myGLCD.print(F("* RELEASE *"), CENTER, text_y_center); - myGLCD.setColor(80, 80, 80); - drawCrossHair(x, y); - rx[i] = cx; - ry[i] = cy; - Serial.print("\r\ncx="); Serial.print(cx); - Serial.print(" cy="); Serial.print(cy); - while (ISPRESSED() == true) {} -} - -void waitForTouch() -{ - while (ISPRESSED() == true) {} - while (ISPRESSED() == false) {} - while (ISPRESSED() == true) {} -} - -void toHex(uint32_t num) -{ - buf[0] = '0'; - buf[1] = 'x'; - buf[10] = 'U'; - buf[11] = 'L'; - buf[12] = 0; - for (int zz = 9; zz > 1; zz--) - { - if ((num & 0xF) > 9) - buf[zz] = (num & 0xF) + 55; - else - buf[zz] = (num & 0xF) + 48; - num = num >> 4; - } -} - -void startup() -{ - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print(TITLE, CENTER, 1); - myGLCD.setBackColor(0, 0, 0); - - myGLCD.print(F("#define NUMSAMPLES 3 in Library"), LEFT, 18); - myGLCD.print(F("Use a stylus or something"), LEFT, 30); - myGLCD.print(F("similar to touch as close"), LEFT, 42); - myGLCD.print(F("to the center of the"), LEFT, 54); - myGLCD.print(F("highlighted crosshair as"), LEFT, 66); - myGLCD.print(F("possible. Keep as still as"), LEFT, 78); - myGLCD.print(F("possible and keep holding"), LEFT, 90); - myGLCD.print(F("until the highlight is"), LEFT, 102); - myGLCD.print(F("removed. Repeat for all"), LEFT, 114); - myGLCD.print(F("crosshairs in sequence."), LEFT, 126); - myGLCD.print(F("Touch screen to continue"), CENTER, 162); - - waitForTouch(); -} - -void showNumI(char *msg, uint32_t val, int x, int y) -{ - myGLCD.print(msg, x, y); - myGLCD.printNumI(val, x + 50, y); -} - -void done() -{ - uint16_t TS_LEFT, TS_RT, TS_TOP, TS_BOT, TS_WID, TS_HT, TS_SWAP; - int16_t tmp; - char buf[60]; - myGLCD.clrScr(); - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print(TITLE, CENTER, 1); - myGLCD.setBackColor(0, 0, 0); - myGLCD.print(F("To use the new calibration"), LEFT, 30); - myGLCD.print(F("settings you must map the values"), LEFT, 42); - myGLCD.print(F("from Point p = ts.getPoint() e.g. "), LEFT, 54); - myGLCD.print(F("x = map(p.x, LEFT, RT, 0, tft.width());"), LEFT, 66); - myGLCD.print(F("y = map(p.y, TOP, BOT, 0, tft.height());"), LEFT, 78); - myGLCD.print(F("swap p.x and p.y if diff ORIENTATION"), LEFT, 90); - - //.kbv show human values - TS_LEFT = (calx >> 14) & 0x3FFF; - TS_RT = (calx >> 0) & 0x3FFF; - TS_TOP = (caly >> 14) & 0x3FFF; - TS_BOT = (caly >> 0) & 0x3FFF; - TS_WID = ((cals >> 12) & 0x0FFF) + 1; - TS_HT = ((cals >> 0) & 0x0FFF) + 1; - TS_SWAP = (cals >> 31); - int y = 120; - Serial.println(""); - sprintf(buf, "Sketch is %s %d x %d", - TOUCH_ORIENTATION ? "LANDSCAPE" : "PORTRAIT", TS_WID, TS_HT); - myGLCD.print(buf, 0, y); - Serial.println(buf); - if (TOUCH_ORIENTATION == LANDSCAPE) { //always show PORTRAIT first - tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; - tmp = TS_WID, TS_WID = TS_HT, TS_HT = tmp; - } - sprintf(buf, "PORTRAIT CALIBRATION %d x %d", TS_WID, TS_HT); - myGLCD.print(buf, 0, y += 24); - Serial.println(buf); - sprintf(buf, "x = map(p.x, LEFT=%d, RT=%d, 0, %d)", TS_LEFT, TS_RT, TS_WID); - myGLCD.print(buf, 0, y += 12); - Serial.println(buf); - sprintf(buf, "y = map(p.y, TOP=%d, BOT=%d, 0, %d)", TS_TOP, TS_BOT, TS_HT); - myGLCD.print(buf, 0, y += 12); - Serial.println(buf); - sprintf(buf, "Touch Pin Wiring XP=%d XM=A%d YP=A%d YM=%d", - XP, XM - A0, YP - A0, YM); - myGLCD.print(buf, 0, y += 24); - Serial.println(buf); - - tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; - tmp = TS_WID, TS_WID = TS_HT, TS_HT = tmp; - - sprintf(buf, "LANDSCAPE CALIBRATION %d x %d", TS_WID, TS_HT); - myGLCD.print(buf, 0, y += 24); - Serial.println(buf); - sprintf(buf, "x = map(p.y, LEFT=%d, RT=%d, 0, %d)", TS_LEFT, TS_RT, TS_WID); - myGLCD.print(buf, 0, y += 12); - Serial.println(buf); - sprintf(buf, "y = map(p.x, TOP=%d, BOT=%d, 0, %d)", TS_TOP, TS_BOT, TS_HT); - myGLCD.print(buf, 0, y += 12); - Serial.println(buf); -} - -void fail() -{ - myGLCD.clrScr(); - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print(F("Touch Calibration FAILED"), CENTER, 1); - myGLCD.setBackColor(0, 0, 0); - - myGLCD.print(F("Unable to read the position"), LEFT, 30); - myGLCD.print(F("of the press. This is a"), LEFT, 42); - myGLCD.print(F("hardware issue and can"), LEFT, 54); - myGLCD.print(F("not be corrected in"), LEFT, 66); - myGLCD.print(F("software."), LEFT, 78); - myGLCD.print(F("check XP, XM pins with a multimeter"), LEFT, 102); - myGLCD.print(F("check YP, YM pins with a multimeter"), LEFT, 114); - myGLCD.print(F("should be about 300 ohms"), LEFT, 126); - - while (true) {}; -} - -void loop() -{ - startup(); - - delay(100); - myGLCD.clrScr(); - myGLCD.setColor(80, 80, 80); - drawCrossHair(dispx - 11, 10); - drawCrossHair(dispx / 2, 10); - drawCrossHair(10, 10); - drawCrossHair(dispx - 11, dispy / 2); - drawCrossHair(10, dispy / 2); - drawCrossHair(dispx - 11, dispy - 11); - drawCrossHair(dispx / 2, dispy - 11); - drawCrossHair(10, dispy - 11); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.print(F("***********"), CENTER, text_y_center - 12); - myGLCD.print(F("***********"), CENTER, text_y_center + 12); - - calibrate(10, 10, 0); - calibrate(10, dispy / 2, 1); - calibrate(10, dispy - 11, 2); - calibrate(dispx / 2, 10, 3); - calibrate(dispx / 2, dispy - 11, 4); - calibrate(dispx - 11, 10, 5); - calibrate(dispx - 11, dispy / 2, 6); - calibrate(dispx - 11, dispy - 11, 7); - - cals = (long(dispx - 1) << 12) + (dispy - 1); - if (TOUCH_ORIENTATION == PORTRAIT) swapxy = rx[2] - rx[0]; - else swapxy = ry[2] - ry[0]; - swapxy = (swapxy < -500 || swapxy > 500); - if ((TOUCH_ORIENTATION == PORTRAIT) ^ (swapxy != 0)) { - clx = (rx[0] + rx[1] + rx[2]) / 3; - crx = (rx[5] + rx[6] + rx[7]) / 3; - cty = (ry[0] + ry[3] + ry[5]) / 3; - cby = (ry[2] + ry[4] + ry[7]) / 3; - } else { - clx = (ry[0] + ry[1] + ry[2]) / 3; - crx = (ry[5] + ry[6] + ry[7]) / 3; - cty = (rx[0] + rx[3] + rx[5]) / 3; - cby = (rx[2] + rx[4] + rx[7]) / 3; - } - px = float(crx - clx) / (dispx - 20); - py = float(cby - cty) / (dispy - 20); - // px = 0; - clx -= px * 10; - crx += px * 10; - cty -= py * 10; - cby += py * 10; - - calx = (long(clx) << 14) + long(crx); - caly = (long(cty) << 14) + long(cby); - if (swapxy) - cals |= (1L << 31); - - done(); - while (true) {} -} - - diff --git a/examples/Touch_shield_kbv/Touch_shield_kbv.ino b/examples/Touch_shield_new/Touch_shield_new.ino similarity index 51% rename from examples/Touch_shield_kbv/Touch_shield_kbv.ino rename to examples/Touch_shield_new/Touch_shield_new.ino index ee157f5..a160fd6 100644 --- a/examples/Touch_shield_kbv/Touch_shield_kbv.ino +++ b/examples/Touch_shield_new/Touch_shield_new.ino @@ -2,57 +2,25 @@ // different mcufriend shields have Touchscreen on different pins // and rotation. -// Run the UTouch_calibr_kbv sketch for calibration of your shield +// Run the TouchScreen_Calibr_native sketch for calibration of your shield -#include // Core graphics library -//#include // Hardware-specific library -//Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); #include MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include -#if defined(__SAM3X8E__) -#undef __FlashStringHelper::F(string_literal) -#define F(string_literal) string_literal -#endif +char *name = "Please Calibrate."; //edit name of shield +const int XP=6,XM=A2,YP=A1,YM=7; //ID=0x9341 +const int TS_LEFT=907,TS_RT=136,TS_TOP=942,TS_BOT=139; -// These are the pins for some typical shields! -// S6D0154: YP=A1, XM=A2, YM=7, XP=6 -// ST7783 : YP=A2, XM=A1, YM=6, XP=7 -// ILI9320: YP=A2, XM=A3, YM=8, XP=9 -// ILI9325: YP=A1, XM=A2, YM=7, XP=6 -// ILI9325BG: YP=A2, XM=A1, YM=6, XP=7 -// ILI9341: YP=A2, XM=A1, YM=7, XP=6 -// ILI9488: YP=A1, XM=A2, YM=7, XP=6 -// R65109V: YP=A2, XM=A1, YM=6, XP=7 - -// most mcufriend shields use these pins and Portrait mode: -uint8_t YP = A1; // must be an analog pin, use "An" notation! -uint8_t XM = A2; // must be an analog pin, use "An" notation! -uint8_t YM = 7; // can be a digital pin -uint8_t XP = 6; // can be a digital pin -uint8_t SwapXY = 0; - -uint16_t TS_LEFT = 920; -uint16_t TS_RT = 150; -uint16_t TS_TOP = 940; -uint16_t TS_BOT = 120; -char *name = "Unknown controller"; - -// For better pressure precision, we need to know the resistance -// between X+ and X- Use any multimeter to read it -// For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; -#define MINPRESSURE 20 +#define MINPRESSURE 200 #define MAXPRESSURE 1000 -#define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;} - int16_t BOXSIZE; -int16_t PENRADIUS = 3; -uint16_t identifier, oldcolor, currentcolor; +int16_t PENRADIUS = 1; +uint16_t ID, oldcolor, currentcolor; uint8_t Orientation = 0; //PORTRAIT // Assign human-readable names to some common 16-bit color values: @@ -67,17 +35,19 @@ uint8_t Orientation = 0; //PORTRAIT void show_Serial(void) { - Serial.print(F("Found ")); - Serial.print(name); - Serial.println(F(" LCD driver")); + Serial.println(F("Most Touch Screens use pins 6, 7, A1, A2")); + Serial.println(F("But they can be in ANY order")); + Serial.println(F("e.g. right to left or bottom to top")); + Serial.println(F("or wrong direction")); + Serial.println(F("Edit name and calibration statements\n")); + Serial.println(name); Serial.print(F("ID=0x")); - Serial.println(identifier, HEX); + Serial.println(ID, HEX); Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); Serial.println("Calibration is: "); Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); - Serial.print("Wiring is: "); - Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT"); + Serial.println("Wiring is always PORTRAIT"); Serial.println("YP=" + String(YP) + " XM=" + String(XM)); Serial.println("YM=" + String(YM) + " XP=" + String(XP)); } @@ -85,23 +55,18 @@ void show_Serial(void) void show_tft(void) { tft.setCursor(0, 0); - tft.setTextSize(2); - tft.print(F("Found ")); - tft.print(name); - tft.println(F(" LCD")); tft.setTextSize(1); tft.print(F("ID=0x")); - tft.println(identifier, HEX); + tft.println(ID, HEX); tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); - tft.println("Calibration is: "); + tft.println(""); + tft.setTextSize(2); + tft.println(name); + tft.setTextSize(1); + tft.println("PORTRAIT Values:"); tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); - tft.print("\nWiring is: "); - if (SwapXY) { - tft.setTextColor(CYAN); - tft.setTextSize(2); - } - tft.println(SwapXY ? "SWAPXY" : "PORTRAIT"); + tft.println("\nWiring is: "); tft.println("YP=" + String(YP) + " XM=" + String(XM)); tft.println("YM=" + String(YM) + " XP=" + String(XP)); tft.setTextSize(2); @@ -115,8 +80,6 @@ void show_tft(void) tp = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); - pinMode(XP, OUTPUT); - pinMode(YM, OUTPUT); if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; tft.setCursor(0, (tft.height() * 3) / 4); @@ -128,80 +91,11 @@ void show_tft(void) void setup(void) { uint16_t tmp; - Serial.begin(9600); tft.reset(); - identifier = tft.readID(); - // if (identifier == 0) identifier = 0x9341; - if (0) { - } else if (identifier == 0x0154) { - name = "S6D0154"; - TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208; - } else if (identifier == 0x5408) { //thanks gazialankus - name = "SPFD5408"; - TS_LEFT = 150; TS_RT = 960; TS_TOP = 155; TS_BOT = 925; - SwapXY = 1; - } else if (identifier == 0x7783) { - name = "ST7781"; - TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153; - SwapXY = 1; - } else if (identifier == 0x7789) { - name = "ST7789V"; - YP = A2; XM = A1; YM = 7; XP = 6; - TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919; - } else if (identifier == 0x9320) { - name = "ILI9320"; - YP = A3; XM = A2; YM = 9; XP = 8; - TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134; - } else if (identifier == 0x9325) { - name = "ILI9325"; - TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904; - } else if (identifier == 0x9325) { - name = "ILI9325 Green Dog"; - TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130; - } else if (identifier == 0x9327) { - name = "ILI9327"; - TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79; - SwapXY = 1; - } else if (identifier == 0x9329) { - name = "ILI9329"; - TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131; - SwapXY = 1; - } else if (identifier == 0x9341) { - name = "ILI9341 BLUE"; - TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150; - SwapXY = 0; - } else if (identifier == 0) { - name = "ILI9341 DealExtreme"; - TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135; - SwapXY = 1; - } else if (identifier == 0 || identifier == 0x9341) { - name = "ILI9341"; - TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908; - SwapXY = 1; - } else if (identifier == 0x9486) { - name = "ILI9486"; - TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; - } else if (identifier == 0x9488) { - name = "ILI9488"; - TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; - } else if (identifier == 0xB509) { - name = "R61509V"; - TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975; - SwapXY = 1; - } else { - name = "unknown"; - } - switch (Orientation) { // adjust for different aspects - case 0: break; //no change, calibrated for PORTRAIT - case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; - case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break; - case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; - } - + ID = tft.readID(); + tft.begin(ID); Serial.begin(9600); - ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values. - tft.begin(identifier); show_Serial(); tft.setRotation(Orientation); tft.fillScreen(BLACK); @@ -230,22 +124,34 @@ void loop() // if sharing pins, you'll need to fix the directions of the touchscreen pins pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); - pinMode(XP, OUTPUT); - pinMode(YM, OUTPUT); - // digitalWrite(XM, HIGH); - // digitalWrite(YP, HIGH); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { - // is controller wired for Landscape ? or are we oriented in Landscape? - if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y); - // scale from 0->1023 to tft.width i.e. left = 0, rt = width // most mcufriend have touch (with icons) that extends below the TFT // screens without icons need to reserve a space for "erase" // scale the ADC values from ts.getPoint() to screen values e.g. 0-239 - xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); - ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); + // + // Calibration is true for PORTRAIT. tp.y is always long dimension + // map to your current pixel orientation + switch (Orientation) { + case 0: + xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); + ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); + break; + case 1: + xpos = map(tp.y, TS_TOP, TS_BOT, 0, tft.width()); + ypos = map(tp.x, TS_RT, TS_LEFT, 0, tft.height()); + break; + case 2: + xpos = map(tp.x, TS_RT, TS_LEFT, 0, tft.width()); + ypos = map(tp.y, TS_BOT, TS_TOP, 0, tft.height()); + break; + case 3: + xpos = map(tp.y, TS_BOT, TS_TOP, 0, tft.width()); + ypos = map(tp.y, TS_LEFT, TS_RT, 0, tft.height()); + break; + } // are we in top color box area ? if (ypos < BOXSIZE) { //draw white border on selected color box @@ -285,6 +191,8 @@ void loop() tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); } // are we in erase area ? + // Plain Touch panels use bottom 10 pixels e.g. > h - 10 + // Touch panels with icon area e.g. > h - 0 if (ypos > tft.height() - 10) { // press the bottom of the screen to erase tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); diff --git a/examples/UTouch_Calibr_kbv/UTouch_Calibr_kbv.ino b/examples/UTouch_Calibr_kbv/UTouch_Calibr_kbv.ino deleted file mode 100644 index c9b3afe..0000000 --- a/examples/UTouch_Calibr_kbv/UTouch_Calibr_kbv.ino +++ /dev/null @@ -1,376 +0,0 @@ -// TouchScreen_Calibr_kbv for MCUFRIEND UNO Display Shields -// adapted by David Prentice -// for Adafruit's Resistive Touch Screen Library -// from Henning Karlsen's original program. Many Thanks. - -// UTouch_Calibration (C)2013-2014 Henning Karlsen -// web: http://www.henningkarlsen.com/electronics -// -// This program can be used to calibrate the touchscreen -// of the display modules. -// This program requires the UTFT library and a touch -// screen module that is compatible with UTFT. -// -// It is assumed that the display module is connected to an -// appropriate shield or that you know how to change the pin -// numbers in the setup. -// -// Instructions will be given on the display. - -#define TOUCH_ORIENTATION PORTRAIT -#define USE_UTOUCH 0 - -#if !(USE_UTOUCH) -#define TITLE "TouchScreen.h Calibration" -#include -#include //we are using UTFT display methods -UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0); - -#include - -// MCUFRIEND UNO shield shares pins with the TFT. Due does NOT work -#define YP A1 //A3 for ILI9320 -#define YM 7 //9 -#define XM A2 -#define XP 6 //8 - -TouchScreen myTouch(XP, YP, XM, YM, 300); -TSPoint tp; //Touchscreen_due branch uses Point - -void readResistiveTouch(void) -{ - tp = myTouch.getPoint(); - pinMode(YP, OUTPUT); //restore shared pins - pinMode(XM, OUTPUT); - digitalWrite(YP, HIGH); - digitalWrite(XM, HIGH); -} - -bool ISPRESSED(void) -{ - readResistiveTouch(); - return tp.z > 20 && tp.z < 1000; -} - -void showpoint(void) -{ - Serial.print("\r\nx="); Serial.print(tp.x); - Serial.print(" y="); Serial.print(tp.y); - Serial.print(" z="); Serial.print(tp.z); -} -#else -#define TITLE "UTouch.h Calibration" -#include -#include -#include -UTFT myGLCD(ILI9486, 38, 39, 40, 41); -UTouch myTouch( 6, 5, 4, 3, 2); - -#define ISPRESSED() myTouch.dataAvailable() -extern void fail(); - -#endif - -// ************************************ -// DO NOT EDIT ANYTHING BELOW THIS LINE -// ************************************ - -// Declare which fonts we will be using -extern uint8_t SmallFont[]; - -uint32_t cx, cy; -uint32_t rx[8], ry[8]; -int32_t clx, crx, cty, cby; -float px, py; -int dispx, dispy, text_y_center, swapxy; -uint32_t calx, caly, cals; -char buf[13]; - -void setup() -{ - Serial.begin(9600); - Serial.println("UTouch_Calibr_kbv"); - digitalWrite(A0, HIGH); - pinMode(A0, OUTPUT); - myGLCD.InitLCD(TOUCH_ORIENTATION); - myGLCD.clrScr(); - myGLCD.setFont(SmallFont); -#if (USE_UTOUCH) - myTouch.InitTouch(TOUCH_ORIENTATION); -#endif - dispx = myGLCD.getDisplayXSize(); - dispy = myGLCD.getDisplayYSize(); - text_y_center = (dispy / 2) - 6; -} - -void drawCrossHair(int x, int y) -{ - myGLCD.drawRect(x - 10, y - 10, x + 10, y + 10); - myGLCD.drawLine(x - 5, y, x + 5, y); - myGLCD.drawLine(x, y - 5, x, y + 5); -} - -void readCoordinates() -{ - int iter = 5000; - int failcount = 0; - int cnt = 0; - uint32_t tx = 0; - uint32_t ty = 0; - boolean OK = false; - - while (OK == false) - { - myGLCD.setColor(255, 255, 255); - myGLCD.print("* PRESS *", CENTER, text_y_center); - while (ISPRESSED() == false) {} - myGLCD.print("* HOLD! *", CENTER, text_y_center); -#if (USE_UTOUCH) - while ((ISPRESSED() == true) && (cnt < iter) && (failcount < 10000)) - { - myTouch.calibrateRead(); - if (!((myTouch.TP_X == 65535) || (myTouch.TP_Y == 65535))) - { - tx += myTouch.TP_X; - ty += myTouch.TP_Y; - cnt++; - } - else - failcount++; - } -#else - cnt = 0; - iter = 400; - do - { - readResistiveTouch(); - // showpoint(tp); - if (tp.z > 20 && tp.z < 1000) - { - tx += tp.x; - ty += tp.y; - cnt++; - } - else - failcount++; - } while ((cnt < iter) && (failcount < 10000)); -#endif - if (cnt >= iter) - { - OK = true; - } - else - { - tx = 0; - ty = 0; - cnt = 0; - } - if (failcount >= 10000) - fail(); - } - - cx = tx / iter; - cy = ty / iter; -} - -void calibrate(int x, int y, int i) -{ - myGLCD.setColor(255, 255, 255); - drawCrossHair(x, y); - myGLCD.setBackColor(255, 0, 0); - readCoordinates(); - myGLCD.setColor(255, 255, 255); - myGLCD.print("* RELEASE *", CENTER, text_y_center); - myGLCD.setColor(80, 80, 80); - drawCrossHair(x, y); - rx[i] = cx; - ry[i] = cy; - Serial.print("\r\ncx="); Serial.print(cx); - Serial.print(" cy="); Serial.print(cy); - while (ISPRESSED() == true) {} -} - -void waitForTouch() -{ - while (ISPRESSED() == true) {} - while (ISPRESSED() == false) {} - while (ISPRESSED() == true) {} -} - -void toHex(uint32_t num) -{ - buf[0] = '0'; - buf[1] = 'x'; - buf[10] = 'U'; - buf[11] = 'L'; - buf[12] = 0; - for (int zz = 9; zz > 1; zz--) - { - if ((num & 0xF) > 9) - buf[zz] = (num & 0xF) + 55; - else - buf[zz] = (num & 0xF) + 48; - num = num >> 4; - } -} - -void startup() -{ - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print(TITLE, CENTER, 1); - myGLCD.setBackColor(0, 0, 0); - - myGLCD.print("Use a stylus or something", LEFT, 30); - myGLCD.print("similar to touch as close", LEFT, 42); - myGLCD.print("to the center of the", LEFT, 54); - myGLCD.print("highlighted crosshair as", LEFT, 66); - myGLCD.print("possible. Keep as still as", LEFT, 78); - myGLCD.print("possible and keep holding", LEFT, 90); - myGLCD.print("until the highlight is", LEFT, 102); - myGLCD.print("removed. Repeat for all", LEFT, 114); - myGLCD.print("crosshairs in sequence.", LEFT, 126); - myGLCD.print("Touch screen to continue", CENTER, 162); - - waitForTouch(); - myGLCD.clrScr(); -} - -void showNumI(char *msg, uint32_t val, int x, int y) -{ - myGLCD.print(msg, x, y); - myGLCD.printNumI(val, x + 50, y); -} - -void done() -{ - myGLCD.clrScr(); - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print(TITLE, CENTER, 1); - myGLCD.setBackColor(0, 0, 0); -#if (USE_UTOUCH) - myGLCD.print("To use the new calibration", LEFT, 30); - myGLCD.print("settings you must edit the", LEFT, 42); - myGLCD.setColor(160, 160, 255); - myGLCD.print("UTouchCD.h", LEFT, 54); - myGLCD.setColor(255, 255, 255); - myGLCD.print("file and change", 88, 54); - myGLCD.print("the following values. The", LEFT, 66); - myGLCD.print("values are located right", LEFT, 78); - myGLCD.print("below the opening comment.", LEFT, 90); - myGLCD.print("CAL_X", LEFT, 110); - myGLCD.print("CAL_Y", LEFT, 122); - myGLCD.print("CAL_S", LEFT, 134); - toHex(calx); - myGLCD.print(buf, 75, 110); - toHex(caly); - myGLCD.print(buf, 75, 122); - toHex(cals); - myGLCD.print(buf, 75, 134); -#else - myGLCD.print("To use the new calibration", LEFT, 30); - myGLCD.print("settings you must map the values", LEFT, 42); - myGLCD.print("from Point p = ts.getPoint() e.g. ", LEFT, 54); - myGLCD.print("x = map(p.x, LEFT, RT, 0, tft.width());", LEFT, 66); - myGLCD.print("y = map(p.y, TOP, BOT, 0, tft.height());", LEFT, 78); - myGLCD.print("swap p.x and p.y if diff ORIENTATION", LEFT, 90); -#endif - //.kbv show human values - showNumI("LEFT ", (calx >> 14) & 0x3FFF, 0, 186); - showNumI("RT ", (calx) & 0x3FFF, 100, 186); - myGLCD.printNumF(px, 2, 200, 186); - showNumI("TOP ", (caly >> 14) & 0x3FFF, 0, 198); - showNumI("BOT ", (caly) & 0x3FFF, 100, 198); - myGLCD.printNumF(py, 2, 200, 198); - showNumI("WID ", (cals >> 12) & 0xFFF, 0, 210); - showNumI("HT ", (cals) & 0xFFF, 100, 210); - myGLCD.print("Touch Controller is ", 0, 222); - myGLCD.print((cals >> 31) ? "LANDSCAPE" : "PORTRAIT", 170, 222); - -} - -void fail() -{ - myGLCD.clrScr(); - myGLCD.setColor(255, 0, 0); - myGLCD.fillRect(0, 0, dispx - 1, 13); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.drawLine(0, 14, dispx - 1, 14); - myGLCD.print("Touch Calibration FAILED", CENTER, 1); - myGLCD.setBackColor(0, 0, 0); - - myGLCD.print("Unable to read the position", LEFT, 30); - myGLCD.print("of the press. This is a", LEFT, 42); - myGLCD.print("hardware issue and can", 88, 54); - myGLCD.print("not be corrected in", LEFT, 66); - myGLCD.print("software.", LEFT, 78); - - while (true) {}; -} - -void loop() -{ - startup(); - - myGLCD.setColor(80, 80, 80); - drawCrossHair(dispx - 11, 10); - drawCrossHair(dispx / 2, 10); - drawCrossHair(10, 10); - drawCrossHair(dispx - 11, dispy / 2); - drawCrossHair(10, dispy / 2); - drawCrossHair(dispx - 11, dispy - 11); - drawCrossHair(dispx / 2, dispy - 11); - drawCrossHair(10, dispy - 11); - myGLCD.setColor(255, 255, 255); - myGLCD.setBackColor(255, 0, 0); - myGLCD.print("***********", CENTER, text_y_center - 12); - myGLCD.print("***********", CENTER, text_y_center + 12); - - calibrate(10, 10, 0); - calibrate(10, dispy / 2, 1); - calibrate(10, dispy - 11, 2); - calibrate(dispx / 2, 10, 3); - calibrate(dispx / 2, dispy - 11, 4); - calibrate(dispx - 11, 10, 5); - calibrate(dispx - 11, dispy / 2, 6); - calibrate(dispx - 11, dispy - 11, 7); - - cals = (long(dispx - 1) << 12) + (dispy - 1); - if (TOUCH_ORIENTATION == PORTRAIT) swapxy = rx[2] - rx[0]; - else swapxy = ry[2] - ry[0]; - swapxy = (swapxy < -500 || swapxy > 500); - if ((TOUCH_ORIENTATION == PORTRAIT) ^ (swapxy != 0)) { - clx = (rx[0] + rx[1] + rx[2]) / 3; - crx = (rx[5] + rx[6] + rx[7]) / 3; - cty = (ry[0] + ry[3] + ry[5]) / 3; - cby = (ry[2] + ry[4] + ry[7]) / 3; - } else { - clx = (ry[0] + ry[1] + ry[2]) / 3; - crx = (ry[5] + ry[6] + ry[7]) / 3; - cty = (rx[0] + rx[3] + rx[5]) / 3; - cby = (rx[2] + rx[4] + rx[7]) / 3; - } - px = float(crx - clx) / (dispx - 20); - py = float(cby - cty) / (dispy - 20); - // px = 0; - clx -= px * 10; - crx += px * 10; - cty -= py * 10; - cby += py * 10; - - calx = (long(clx) << 14) + long(crx); - caly = (long(cty) << 14) + long(cby); - if (swapxy) - cals |= (1L << 31); - - done(); - while (true) {} -} diff --git a/examples/button_simple/button_list.ino b/examples/button_simple/button_list.ino new file mode 100644 index 0000000..95d7355 --- /dev/null +++ b/examples/button_simple/button_list.ino @@ -0,0 +1,116 @@ +/* an alternative approach. swap the #if 1 / 0 values to try it + * + */ +#if 0 + +#include +#include +MCUFRIEND_kbv tft; +#include +#define MINPRESSURE 200 +#define MAXPRESSURE 1000 + +// ALL Touch panels and wiring is DIFFERENT +// copy-paste results from TouchScreen_Calibr_native.ino +const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341 +const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139; + +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); + +Adafruit_GFX_Button on_btn, off_btn; + +int pixel_x, pixel_y; //Touch_getXY() updates global vars +bool Touch_getXY(void) +{ + TSPoint p = ts.getPoint(); + pinMode(YP, OUTPUT); //restore shared pins + pinMode(XM, OUTPUT); + digitalWrite(YP, HIGH); //because TFT control pins + digitalWrite(XM, HIGH); + bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE); + if (pressed) { + pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me + pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height()); + } + return pressed; +} + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + Serial.print("TFT ID = 0x"); + Serial.println(ID, HEX); + Serial.println("Calibrate for your Touch Panel"); + if (ID == 0xD3D3) ID = 0x9486; // write-only shield + tft.begin(ID); + tft.setRotation(0); //PORTRAIT + tft.fillScreen(BLACK); + on_btn.initButton(&tft, 60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2); + off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2); + on_btn.drawButton(false); + off_btn.drawButton(false); + tft.fillRect(40, 80, 160, 80, RED); +} + +/* + * updating multiple buttons from a list + * + * anything more than two buttons gets repetitive + * + * you can place button addresses in separate lists + * e.g. for separate menu screens + */ + +// Array of button addresses to behave like a list +Adafruit_GFX_Button *buttons[] = {&on_btn, &off_btn, NULL}; + +/* update the state of a button and redraw as reqd + * + * main program can use isPressed(), justPressed() etc + */ +bool update_button(Adafruit_GFX_Button *b, bool down) +{ + b->press(down && b->contains(pixel_x, pixel_y)); + if (b->justReleased()) + b->drawButton(false); + if (b->justPressed()) + b->drawButton(true); + return down; +} + +/* most screens have different sets of buttons + * life is easier if you process whole list in one go + */ +bool update_button_list(Adafruit_GFX_Button **pb) +{ + bool down = Touch_getXY(); + for (int i = 0 ; pb[i] != NULL; i++) { + update_button(pb[i], down); + } + return down; +} + +/* compare the simplicity of update_button_list() + */ +void loop(void) +{ + update_button_list(buttons); //use helper function + if (on_btn.justPressed()) { + tft.fillRect(40, 80, 160, 80, GREEN); + } + if (off_btn.justPressed()) { + tft.fillRect(40, 80, 160, 80, RED); + } +} +#endif + diff --git a/examples/button_simple/button_simple.ino b/examples/button_simple/button_simple.ino new file mode 100644 index 0000000..a944a85 --- /dev/null +++ b/examples/button_simple/button_simple.ino @@ -0,0 +1,84 @@ +#if 1 + +#include +#include +MCUFRIEND_kbv tft; +#include +#define MINPRESSURE 200 +#define MAXPRESSURE 1000 + +// ALL Touch panels and wiring is DIFFERENT +// copy-paste results from TouchScreen_Calibr_native.ino +const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341 +const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139; + +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); + +Adafruit_GFX_Button on_btn, off_btn; + +int pixel_x, pixel_y; //Touch_getXY() updates global vars +bool Touch_getXY(void) +{ + TSPoint p = ts.getPoint(); + pinMode(YP, OUTPUT); //restore shared pins + pinMode(XM, OUTPUT); + digitalWrite(YP, HIGH); //because TFT control pins + digitalWrite(XM, HIGH); + bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE); + if (pressed) { + pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me + pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height()); + } + return pressed; +} + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + Serial.print("TFT ID = 0x"); + Serial.println(ID, HEX); + Serial.println("Calibrate for your Touch Panel"); + if (ID == 0xD3D3) ID = 0x9486; // write-only shield + tft.begin(ID); + tft.setRotation(0); //PORTRAIT + tft.fillScreen(BLACK); + on_btn.initButton(&tft, 60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2); + off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2); + on_btn.drawButton(false); + off_btn.drawButton(false); + tft.fillRect(40, 80, 160, 80, RED); +} + +/* two buttons are quite simple + */ +void loop(void) +{ + bool down = Touch_getXY(); + on_btn.press(down && on_btn.contains(pixel_x, pixel_y)); + off_btn.press(down && off_btn.contains(pixel_x, pixel_y)); + if (on_btn.justReleased()) + on_btn.drawButton(); + if (off_btn.justReleased()) + off_btn.drawButton(); + if (on_btn.justPressed()) { + on_btn.drawButton(true); + tft.fillRect(40, 80, 160, 80, GREEN); + } + if (off_btn.justPressed()) { + off_btn.drawButton(true); + tft.fillRect(40, 80, 160, 80, RED); + } +} +#endif + + diff --git a/examples/drawBitmap_kbv/bitmap_RGB.h b/examples/drawBitmap_kbv/bitmap_RGB.h new file mode 100644 index 0000000..8865758 --- /dev/null +++ b/examples/drawBitmap_kbv/bitmap_RGB.h @@ -0,0 +1,668 @@ +// several programs can convert BMP, JPG, PNG images to C arrays of pixels +// these used the utility bundled with UTFT. +// Online tool at http://www.rinkydinkelectronics.com/t_imageconverter565.php + +// Generated by : ImageConverter 565 v2.3 +// Generated from: marilyn_64x64.bmp +// Time generated: 14-May-18 06:55:31 +// Dimensions : 64x64 pixels +// Size : 8,192 Bytes + +#include + +//const unsigned short marilyn_64x64[0x1000] PROGMEM ={ +// uint16_t is not ambiguous +const uint16_t marilyn_64x64[0x1000] PROGMEM ={ +0x98E5, 0x98E5, 0x98E5, 0x98E5, 0x98E5, 0x98E4, 0x90E4, 0x9905, 0x9905, 0x9104, 0x90E4, 0x9905, 0x9925, 0x9925, 0x9925, 0x9945, // 0x0010 (16) +0x9945, 0x9945, 0x9946, 0xA1A6, 0xAA07, 0xB289, 0xBB4B, 0xCC4F, 0xE5F5, 0xF6B8, 0xF6D9, 0xFEF9, 0xFED8, 0xF6D8, 0xF677, 0xEDD4, // 0x0020 (32) +0xD46F, 0xBAEA, 0xAA08, 0xA186, 0x9966, 0x9966, 0xA166, 0xA166, 0x9946, 0x9946, 0x9945, 0x9926, 0x9926, 0x9946, 0x9925, 0x9925, // 0x0030 (48) +0x9926, 0x9946, 0xA146, 0xA166, 0xA167, 0xA167, 0xA146, 0xA147, 0xA146, 0xA167, 0xA167, 0xA167, 0xA987, 0xA987, 0xA967, 0xA967, // 0x0040 (64) +0x98E5, 0x98E4, 0x98E4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x90E4, 0x9104, 0x9104, 0x9905, 0x9104, 0x9925, 0x9925, // 0x0050 (80) +0x9965, 0x9966, 0xA1C6, 0xBB0A, 0xC3ED, 0xD511, 0xE5B3, 0xE614, 0xEE34, 0xF6B7, 0xF6F8, 0xFF19, 0xF6D7, 0xEE76, 0xF6D8, 0xF6D8, // 0x0060 (96) +0xF697, 0xE5D5, 0xD4B0, 0xB2CA, 0x9986, 0x9966, 0x9966, 0x9966, 0x9946, 0x9945, 0x9925, 0x9925, 0x9925, 0x9946, 0x9925, 0x9925, // 0x0070 (112) +0x9925, 0x9946, 0x9946, 0xA146, 0xA146, 0xA146, 0x9946, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA967, 0xA967, 0xA967, 0xA967, // 0x0080 (128) +0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x9104, 0x9104, 0x9104, 0x9104, 0x9124, 0x9945, // 0x0090 (144) +0xAA48, 0xC38C, 0xDD73, 0xF677, 0xF71A, 0xFF3A, 0xF6D7, 0xEE75, 0xEE75, 0xF6B7, 0xF6D8, 0xEE75, 0xE5F3, 0xEE35, 0xF676, 0xF6D8, // 0x00A0 (160) +0xF6D8, 0xEE97, 0xEE77, 0xEE15, 0xCC0E, 0xAA28, 0xA1A6, 0xA186, 0x9945, 0x9945, 0x9945, 0x9925, 0x9945, 0x9945, 0x9925, 0x9925, // 0x00B0 (176) +0x9925, 0x9925, 0x9946, 0x9946, 0x9946, 0x9946, 0x9926, 0xA146, 0xA146, 0x9926, 0xA146, 0xA146, 0xA167, 0xA967, 0xA967, 0xA967, // 0x00C0 (192) +0x90C4, 0x90C4, 0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x9904, 0x9104, 0x9104, 0x9925, 0x9925, 0x9925, 0x9924, 0x9945, 0xAA47, // 0x00D0 (208) +0xD4AF, 0xEE15, 0xF6B7, 0xF697, 0xF697, 0xEE96, 0xF6B7, 0xF6B7, 0xF6D7, 0xF6B7, 0xEE55, 0xD571, 0xCCEF, 0xD530, 0xDD92, 0xE614, // 0x00E0 (224) +0xF6F8, 0xF6D8, 0xEE76, 0xE656, 0xEE35, 0xCC2E, 0xAA28, 0xA9C7, 0xA166, 0x9945, 0x9945, 0x9945, 0x9945, 0x9945, 0x9925, 0x9925, // 0x00F0 (240) +0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA967, 0xA967, 0xA967, // 0x0100 (256) +0x90C4, 0x90E4, 0x90E4, 0x98E4, 0x90E4, 0x9104, 0x9904, 0x9904, 0x9925, 0x9925, 0x9945, 0x9945, 0x9945, 0xA185, 0xB268, 0xD46E, // 0x0110 (272) +0xEE14, 0xEE96, 0xEE96, 0xDDB2, 0xCCEF, 0xBC6D, 0xC4CF, 0xD5B2, 0xE655, 0xEE55, 0xDDB2, 0xD530, 0xC4AE, 0xC46D, 0xD510, 0xD530, // 0x0120 (288) +0xE614, 0xEE55, 0xE676, 0xEE97, 0xEE76, 0xE5B4, 0xC34B, 0xA9E7, 0xA186, 0xA166, 0xA166, 0xA165, 0x9945, 0x9946, 0x9946, 0x9945, // 0x0130 (304) +0x9946, 0x9946, 0x9946, 0xA166, 0xA146, 0xA146, 0x9946, 0xA146, 0xA166, 0xA166, 0xA146, 0xA146, 0xA166, 0xA166, 0xA967, 0xA967, // 0x0140 (320) +0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9904, 0x9904, 0x9904, 0x9924, 0x9925, 0x9945, 0xA165, 0xA165, 0xA186, 0xAA27, 0xCC4E, 0xDDB2, // 0x0150 (336) +0xEE96, 0xF6D8, 0xE614, 0xC4CF, 0xABCB, 0x9B49, 0x8AE8, 0x9B8A, 0xBCAE, 0xD572, 0xD530, 0xCD0F, 0xC4AE, 0xB3EB, 0xCCAE, 0xD530, // 0x0160 (352) +0xDD91, 0xE5F3, 0xEE76, 0xEE97, 0xEE56, 0xEE77, 0xD48F, 0xB269, 0xA9C7, 0xA1A6, 0xA186, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, // 0x0170 (368) +0xA146, 0xA146, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, 0xA167, 0xA166, 0xA166, 0xA166, 0xA166, 0xA987, 0xA987, 0xA987, // 0x0180 (384) +0x90E4, 0x98E4, 0x9904, 0x9904, 0x9904, 0x9904, 0x9925, 0x9945, 0xA165, 0xA165, 0xA186, 0xA9E7, 0xB248, 0xC3CC, 0xD530, 0xE635, // 0x0190 (400) +0xE655, 0xD592, 0xC4F0, 0xAC0C, 0x9B49, 0x8AC8, 0x82A7, 0x7A66, 0x9B8A, 0xBC8E, 0xC4AE, 0xCD10, 0xD530, 0xC46D, 0xCCF0, 0xDD51, // 0x01A0 (416) +0xE5F3, 0xE5D3, 0xEE97, 0xF6D8, 0xEE56, 0xF6D8, 0xE573, 0xCB8C, 0xBAA9, 0xB1E7, 0xA9C7, 0xA1A6, 0xA186, 0xA186, 0xA187, 0xA186, // 0x01B0 (432) +0xA166, 0xA166, 0xA166, 0xA187, 0xA187, 0xA167, 0xA167, 0xA166, 0xA187, 0xA987, 0xA987, 0xA167, 0xA167, 0xA987, 0xA987, 0xA987, // 0x01C0 (448) +0x9904, 0x9904, 0x9905, 0x9925, 0x9925, 0x9925, 0x9925, 0xA166, 0xA186, 0xA1A6, 0xB248, 0xBB2A, 0xCBED, 0xCCCF, 0xDDD3, 0xE614, // 0x01D0 (464) +0xBC4D, 0xA36A, 0x92C8, 0x92E8, 0x9329, 0x8AC8, 0x8287, 0x7A26, 0x9329, 0xB44D, 0xC4CF, 0xDDB2, 0xE614, 0xDD92, 0xE5F4, 0xE615, // 0x01E0 (480) +0xF6B7, 0xEE55, 0xEE96, 0xEE77, 0xE635, 0xFEF9, 0xEE15, 0xDC4E, 0xCB8C, 0xB208, 0xB208, 0xA9C7, 0xA9C7, 0xA9C7, 0xA9A7, 0xA986, // 0x01F0 (496) +0xA186, 0xA186, 0xA9A7, 0xA9A7, 0xA987, 0xA987, 0xA187, 0xA187, 0xA9A7, 0xA9A7, 0xA987, 0xA987, 0xA987, 0xA987, 0xA9A7, 0xA9A7, // 0x0200 (512) +0x9905, 0x9925, 0x9925, 0x9925, 0x9925, 0x9945, 0x9945, 0xA186, 0xA1A6, 0xAA68, 0xBBCC, 0xDD93, 0xE5F4, 0xD592, 0xE635, 0xD591, // 0x0210 (528) +0xC48D, 0xB42C, 0x8AC8, 0x8AA7, 0x9309, 0x9309, 0x8AC8, 0x8AC8, 0xABEC, 0xCCEF, 0xDDD3, 0xEE55, 0xF696, 0xEE34, 0xEE55, 0xEE76, // 0x0220 (544) +0xFF3A, 0xF6F8, 0xE614, 0xDDD3, 0xE635, 0xF6D8, 0xF656, 0xDC8F, 0xDC4F, 0xBAA9, 0xB249, 0xB208, 0xB228, 0xBA69, 0xA9E7, 0xA9A7, // 0x0230 (560) +0xA9A7, 0xA9A7, 0xA9C7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA987, 0xA9A7, 0xA9A7, 0xA9A8, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A8, // 0x0240 (576) +0x9925, 0xA125, 0xA145, 0xA145, 0xA145, 0xA165, 0xA166, 0xAA07, 0xAA68, 0x9288, 0x9B4A, 0xCD11, 0xEE76, 0xE635, 0xE5F4, 0xE5F3, // 0x0250 (592) +0xDDB2, 0x9B6A, 0x69A5, 0x7A26, 0x8AE8, 0x9B6A, 0x8AE8, 0xA3CB, 0xC4AE, 0xE614, 0xF6B7, 0xEE76, 0xF6D7, 0xF6B7, 0xEE76, 0xE635, // 0x0260 (608) +0xFF19, 0xF6F8, 0xD571, 0xDDD3, 0xEE56, 0xF697, 0xEE35, 0xE552, 0xE4F0, 0xCBAC, 0xD3CD, 0xDCD1, 0xE573, 0xE552, 0xCBCD, 0xBA69, // 0x0270 (624) +0xB208, 0xB1E7, 0xA9C7, 0xA9C8, 0xA9C8, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9C8, 0xA9C8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, // 0x0280 (640) +0x9925, 0xA145, 0xA145, 0xA165, 0xA166, 0xA186, 0xA1C6, 0xAA68, 0xBB6B, 0x8AA8, 0xA38B, 0xCD31, 0xCD51, 0xD571, 0xD5B2, 0xEE76, // 0x0290 (656) +0xE635, 0x934A, 0x69C5, 0x7226, 0x9329, 0xA3CB, 0xA3AB, 0xB44E, 0xCD31, 0xEE96, 0xF6D8, 0xF6B7, 0xEE96, 0xF6B7, 0xEE56, 0xEE55, // 0x02A0 (672) +0xE634, 0xE5F4, 0xDDB3, 0xE635, 0xE655, 0xE635, 0xEE56, 0xE5D4, 0xEDF4, 0xEE35, 0xF656, 0xFED9, 0xF677, 0xEDF4, 0xED94, 0xD42E, // 0x02B0 (688) +0xBA69, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xB1C8, 0xA9C8, 0xB1C8, 0xB1C8, 0xB1C8, // 0x02C0 (704) +0xA145, 0xA145, 0xA166, 0xA166, 0xA186, 0xA9C7, 0xA9E7, 0xB2A9, 0xBB8B, 0x934A, 0x8AC8, 0x92C8, 0x9B8A, 0xAC0D, 0xC510, 0xDE14, // 0x02D0 (720) +0xD5B3, 0xA3AB, 0x7A68, 0x82E9, 0xA3CC, 0xB46E, 0xC4CF, 0xC4CF, 0xCD31, 0xDDF4, 0xDDF4, 0xDDD4, 0xD592, 0xE614, 0xE614, 0xE635, // 0x02E0 (736) +0xD572, 0xC4F0, 0xCD31, 0xDDB3, 0xCD10, 0xD592, 0xEE76, 0xEE56, 0xF6B7, 0xFEF9, 0xFF19, 0xFED8, 0xF697, 0xF636, 0xEDD4, 0xED52, // 0x02F0 (752) +0xD38C, 0xBA49, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1C8, 0xB1C8, 0xB1E8, 0xB1E8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, // 0x0300 (768) +0xA145, 0xA166, 0xA186, 0xA186, 0xA9A6, 0xA9E7, 0xB248, 0xBB6B, 0xC46E, 0x8AE8, 0x8287, 0x92C8, 0xA3AB, 0xB44D, 0xB46E, 0xCD51, // 0x0310 (784) +0xD572, 0xAC0D, 0x7268, 0x934A, 0xBC8E, 0xCCF0, 0xD510, 0xD510, 0xD510, 0xD571, 0xD531, 0xCCF0, 0xC4CF, 0xDD92, 0xCD10, 0xD552, // 0x0320 (800) +0xD551, 0xCCF0, 0xC4AF, 0xA3AB, 0x8AC9, 0xB44E, 0xEE56, 0xFF1A, 0xFF1A, 0xFF1A, 0xFEF9, 0xF696, 0xF6B7, 0xF6B8, 0xF677, 0xF615, // 0x0330 (816) +0xE4F1, 0xCB4C, 0xB228, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, // 0x0340 (832) +0xA166, 0xA186, 0xA986, 0xA9A6, 0xA9A6, 0xAA07, 0xB2A9, 0xCC8E, 0xCCF0, 0x9B4A, 0x9329, 0xABEC, 0xC4CF, 0xD551, 0xCCEF, 0xC4CF, // 0x0350 (848) +0xD571, 0xBCAF, 0x932A, 0xABCC, 0xDD31, 0xE5B2, 0xEDB2, 0xEDD3, 0xEDF4, 0xEDF4, 0xEDF4, 0xE592, 0xDD52, 0xDD51, 0xDD52, 0xE5B3, // 0x0360 (864) +0xE551, 0xDD31, 0xCCAF, 0xB3ED, 0xA3AB, 0xBC6E, 0xE615, 0xF6B7, 0xFF3A, 0xFF5A, 0xFF19, 0xF697, 0xF6B7, 0xF697, 0xFEF8, 0xFE97, // 0x0370 (880) +0xF5F5, 0xE4B0, 0xC2AA, 0xB229, 0xB208, 0xB1E8, 0xB1E8, 0xB209, 0xB209, 0xB209, 0xB209, 0xB1E9, 0xB209, 0xB209, 0xB209, 0xB1E8, // 0x0380 (896) +0xA986, 0xA986, 0xA9A7, 0xA9A7, 0xA9C7, 0xB207, 0xBAC9, 0xD510, 0xCD10, 0x8B09, 0x7A88, 0xAC2D, 0xE635, 0xE634, 0xC4AE, 0xAC0C, // 0x0390 (912) +0xC4CF, 0xC4CF, 0xB40C, 0xC46D, 0xE591, 0xEDF3, 0xF614, 0xF655, 0xF676, 0xF676, 0xF655, 0xF615, 0xEDF4, 0xF614, 0xF5F4, 0xF5F4, // 0x03A0 (928) +0xEDB3, 0xE572, 0xDD30, 0xCCAF, 0xC46E, 0xCCD0, 0xDDB3, 0xEE76, 0xF719, 0xF6D8, 0xF6B7, 0xEE76, 0xF696, 0xEE55, 0xF6B7, 0xFED8, // 0x03B0 (944) +0xF676, 0xEDB4, 0xD3CD, 0xBA49, 0xB229, 0xB229, 0xB209, 0xB209, 0xB229, 0xB229, 0xB209, 0xB209, 0xB209, 0xBA29, 0xBA09, 0xBA29, // 0x03C0 (960) +0xB1C7, 0xA9C7, 0xB1C7, 0xB1E7, 0xB1E7, 0xB228, 0xBAEA, 0xDD92, 0xCD30, 0x8AE8, 0x7A26, 0x92E8, 0xB42D, 0xC4CF, 0xC4CE, 0xB42D, // 0x03D0 (976) +0x9B8B, 0xBC8E, 0xBC4D, 0xCC8E, 0xE591, 0xF614, 0xF634, 0xFE75, 0xFE97, 0xFE97, 0xFE96, 0xF655, 0xF635, 0xFE56, 0xF655, 0xF655, // 0x03E0 (992) +0xF614, 0xEDD3, 0xE551, 0xD4EF, 0xCC8E, 0xC4AF, 0xCD10, 0xDDB3, 0xE655, 0xE635, 0xEE55, 0xF697, 0xF6B7, 0xEE77, 0xEE35, 0xF655, // 0x03F0 (1008) +0xFEB7, 0xF636, 0xE4F1, 0xBA8A, 0xBA49, 0xBA49, 0xBA29, 0xB229, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, // 0x0400 (1024) +0xB1C7, 0xB1E7, 0xB1E7, 0xB1E7, 0xB207, 0xBA68, 0xC32A, 0xD531, 0xCD51, 0xB42D, 0x9B8B, 0x9329, 0xA38A, 0xABEC, 0xABEB, 0xABCB, // 0x0410 (1040) +0x8AE8, 0x8AA7, 0x9B09, 0xAB8A, 0xD4CE, 0xEDF3, 0xF655, 0xFED7, 0xFED8, 0xFEB7, 0xFEB7, 0xFE96, 0xFE76, 0xFE76, 0xFE76, 0xFE76, // 0x0420 (1056) +0xF634, 0xEDF3, 0xE592, 0xDD30, 0xCCAF, 0xC46E, 0xBC6E, 0xCD31, 0xD592, 0xE635, 0xE614, 0xEE97, 0xF6B8, 0xEE76, 0xEE14, 0xEE34, // 0x0430 (1072) +0xFED8, 0xF636, 0xEDB4, 0xCAEB, 0xBA69, 0xBA69, 0xBA49, 0xBA29, 0xBA29, 0xBA49, 0xBA49, 0xBA29, 0xBA29, 0xBA49, 0xBA49, 0xBA29, // 0x0440 (1088) +0xB1E7, 0xB1E7, 0xB1E7, 0xB1E7, 0xB227, 0xBAA9, 0xC32A, 0xC4AE, 0xBCAF, 0xB44E, 0xAC2D, 0x9B6A, 0xA3EC, 0x9349, 0x8AE8, 0x8AE8, // 0x0450 (1104) +0x9309, 0x8246, 0x8A87, 0x9AC8, 0xC40C, 0xEE14, 0xFED7, 0xFF19, 0xFF19, 0xFEF8, 0xFED8, 0xFEB7, 0xFEB7, 0xFEB7, 0xFEB7, 0xFE76, // 0x0460 (1120) +0xF635, 0xF5F4, 0xEDB2, 0xDD51, 0xD4EF, 0xC46E, 0xB42D, 0xBCAF, 0xD572, 0xE656, 0xDDD3, 0xD571, 0xDDD3, 0xE5F4, 0xE614, 0xF696, // 0x0470 (1136) +0xFEF8, 0xF676, 0xEDD5, 0xCB2C, 0xC28A, 0xBA69, 0xBA69, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, // 0x0480 (1152) +0xB208, 0xB207, 0xB207, 0xB207, 0xBA48, 0xC2C9, 0xC32A, 0xB3CC, 0x9BAB, 0xAC4D, 0xA42D, 0x936A, 0xAC4D, 0xBCCF, 0xA3EC, 0xA3CC, // 0x0490 (1168) +0xBC6D, 0xBC0C, 0xB3AB, 0xC42C, 0xE5B2, 0xFEB7, 0xFEF8, 0xFF19, 0xFF39, 0xFF19, 0xFEF8, 0xFED8, 0xFED8, 0xFED8, 0xFED8, 0xFE97, // 0x04A0 (1184) +0xF634, 0xEDF3, 0xEDB2, 0xE551, 0xD4F0, 0xC46E, 0xB40D, 0xAC0D, 0xC4F0, 0xC531, 0xDDB3, 0xD551, 0xDD92, 0xE614, 0xEE76, 0xF6B7, // 0x04B0 (1200) +0xF6B7, 0xF697, 0xEDD4, 0xCB4C, 0xC2AA, 0xBA8A, 0xBA69, 0xBA49, 0xBA69, 0xBA69, 0xBA49, 0xBA49, 0xBA49, 0xBA69, 0xC269, 0xC249, // 0x04C0 (1216) +0xBA28, 0xBA28, 0xBA48, 0xBA47, 0xBA88, 0xC34A, 0xC3CC, 0xABAB, 0xA40C, 0xAC6E, 0xAC2D, 0x9BCC, 0xAC6E, 0xCD51, 0xCD31, 0xCD31, // 0x04D0 (1232) +0xD50F, 0xD50F, 0xDD30, 0xEDF3, 0xFEB6, 0xFED7, 0xFEF8, 0xFF39, 0xFF3A, 0xFF3A, 0xFF19, 0xFEF8, 0xFEF9, 0xFF19, 0xFEF9, 0xFEB7, // 0x04E0 (1248) +0xF655, 0xF5F4, 0xED92, 0xDD51, 0xD4F0, 0xC48E, 0xBC2E, 0xABCC, 0xB42D, 0xB48F, 0xD593, 0xDDF4, 0xD571, 0xDDB2, 0xDDD3, 0xEE34, // 0x04F0 (1264) +0xF635, 0xF676, 0xE532, 0xCB0B, 0xC2AA, 0xC28A, 0xBA69, 0xBA69, 0xBA69, 0xBA69, 0xC269, 0xC26A, 0xC269, 0xC26A, 0xC26A, 0xC269, // 0x0500 (1280) +0xBA48, 0xBA48, 0xBA48, 0xBA68, 0xC309, 0xC40C, 0xBC4C, 0xABEC, 0xB4AF, 0xBCCF, 0xAC4D, 0xA40C, 0xB4AF, 0xBCCF, 0xBCCF, 0xCD51, // 0x0510 (1296) +0xC4AE, 0xD4EF, 0xEDD2, 0xF675, 0xFE96, 0xFEB7, 0xFEF8, 0xFF3A, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF3A, 0xFF3A, 0xFF3A, 0xFF1A, 0xFEF9, // 0x0520 (1312) +0xFE96, 0xF635, 0xEDB2, 0xDD51, 0xD510, 0xCCAF, 0xC46E, 0xABED, 0xA3CC, 0xA3ED, 0xC511, 0xD572, 0xD551, 0xDDB2, 0xDD92, 0xE5F3, // 0x0530 (1328) +0xEE14, 0xF635, 0xE4D1, 0xCB0B, 0xC2CA, 0xC28A, 0xC28A, 0xC26A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, // 0x0540 (1344) +0xBA68, 0xBA68, 0xBA68, 0xC2A9, 0xC3CB, 0xC42C, 0xBC0C, 0xA3EC, 0xC531, 0xBCCF, 0xB46D, 0xB48E, 0xA42D, 0xB46E, 0x9BCB, 0xABCC, // 0x0550 (1360) +0xC46E, 0xDD30, 0xEDF3, 0xEDF4, 0xDD92, 0xE5B2, 0xEE35, 0xF677, 0xF71A, 0xFF5B, 0xFF5B, 0xFF5A, 0xFF5A, 0xFF1A, 0xFF19, 0xFEF8, // 0x0560 (1376) +0xF676, 0xEDF4, 0xDD31, 0xCCAF, 0xB40D, 0xABCC, 0xB40D, 0xB40D, 0xA3AC, 0x9B6B, 0xA3AC, 0xAC2D, 0xCD30, 0xDD92, 0xDD92, 0xE5F3, // 0x0570 (1392) +0xEE35, 0xF635, 0xE4F1, 0xD38C, 0xCAEB, 0xC2AA, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC2AA, 0xC28A, 0xC28A, // 0x0580 (1408) +0xBA68, 0xBA68, 0xC288, 0xC2E9, 0xCC8E, 0xCCCF, 0xB44C, 0xAC2D, 0xC510, 0xB48E, 0xBCCF, 0xC531, 0xAC2D, 0xA3CB, 0xA3EC, 0xBC4D, // 0x0590 (1424) +0xD4CF, 0xDD30, 0xDD51, 0xABCC, 0xA38B, 0xABAB, 0xABAB, 0xABCC, 0xBC6E, 0xD551, 0xEE15, 0xFF19, 0xFF3A, 0xFEF9, 0xFEB7, 0xF697, // 0x05A0 (1440) +0xE5B3, 0xBC4D, 0x930A, 0x8288, 0x7A47, 0x8288, 0x7A89, 0x936B, 0x9B8C, 0x8B0A, 0x9B6B, 0xA3AC, 0xC4CF, 0xE5F3, 0xE5D3, 0xE5F3, // 0x05B0 (1456) +0xEE14, 0xF614, 0xED72, 0xDC2E, 0xCB0B, 0xC2AA, 0xC2AA, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC2AA, 0xC2AA, 0xC28A, // 0x05C0 (1472) +0xC288, 0xC289, 0xC2A9, 0xC30A, 0xD4CF, 0xD550, 0xB44C, 0xA42D, 0xBCEF, 0xB48E, 0xDDD3, 0xE676, 0xBCEF, 0xA3EC, 0xABEC, 0xBC2D, // 0x05D0 (1488) +0xCC8E, 0xCC8E, 0xABAB, 0xCCAF, 0xE5B2, 0xE5D3, 0xDD51, 0xCCAE, 0xC44D, 0xC46E, 0xE592, 0xF697, 0xFEF8, 0xFEB8, 0xF635, 0xE592, // 0x05E0 (1504) +0xC42D, 0xA32A, 0x9B0A, 0xB3EC, 0xCC8E, 0xCC6E, 0xB3ED, 0x8B4B, 0x936C, 0x82A9, 0x8B0A, 0x9B4A, 0xC4CF, 0xE614, 0xEE14, 0xE5F3, // 0x05F0 (1520) +0xEE14, 0xEDD3, 0xEDD3, 0xED52, 0xD36C, 0xC2CB, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC28A, 0xC28A, 0xC2AA, 0xCACA, 0xC2AA, 0xC2AA, // 0x0600 (1536) +0xC288, 0xC2A9, 0xC2A9, 0xC309, 0xD4AE, 0xD571, 0xB44D, 0xA40D, 0xBCCF, 0xC530, 0xD592, 0xC531, 0xA42D, 0x9BAB, 0x9B8B, 0xB3EC, // 0x0610 (1552) +0xBC2D, 0xABCC, 0xC44D, 0xDD51, 0xEDB2, 0xEDD3, 0xEDB2, 0xDD51, 0xDD10, 0xD510, 0xE592, 0xF635, 0xFED8, 0xF697, 0xEDB3, 0xD4AF, // 0x0620 (1568) +0xAB8B, 0xA34A, 0xBC2D, 0xD4AF, 0xD4AF, 0xCC4D, 0xB3CC, 0xAC0E, 0x9BCD, 0x7A48, 0x930A, 0x9B6A, 0xC4AF, 0xE5F4, 0xEE13, 0xE5D2, // 0x0630 (1584) +0xEDF3, 0xEDB3, 0xED93, 0xF5F5, 0xD38C, 0xCACB, 0xC2CA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, // 0x0640 (1600) +0xC289, 0xC2A9, 0xC2A9, 0xC309, 0xC3AB, 0xBC6D, 0xB44D, 0x9C0C, 0xC530, 0xC530, 0xBCCF, 0xB48E, 0xA40C, 0x8B4A, 0x9B6A, 0xB3CC, // 0x0650 (1616) +0xB3CC, 0xABAB, 0xCC6E, 0xD4CF, 0xE551, 0xF656, 0xFEB7, 0xF676, 0xEE14, 0xE5B3, 0xDD51, 0xF614, 0xFEB8, 0xFEB8, 0xE572, 0xB3EC, // 0x0660 (1632) +0x9B2A, 0xD4F0, 0xF656, 0xF656, 0xE572, 0xBC0D, 0x9B0A, 0x9B4B, 0xAC4F, 0x7248, 0x9B4B, 0xA3AB, 0xCCCF, 0xDD92, 0xE5D2, 0xEDF3, // 0x0670 (1648) +0xEDF3, 0xF5F4, 0xF5B3, 0xF5D4, 0xD38D, 0xCAEA, 0xCACA, 0xC2AA, 0xC2AA, 0xCAAA, 0xC2AA, 0xC2AA, 0xCAAA, 0xCACB, 0xCACA, 0xCACA, // 0x0680 (1664) +0xC2A9, 0xC2C9, 0xC2C9, 0xC2E9, 0xC3AB, 0xAB8A, 0x9BAA, 0xA40D, 0xC531, 0xB46E, 0xB48E, 0xAC4D, 0x9BCB, 0x8309, 0x9B6B, 0xB3CC, // 0x0690 (1680) +0xB3CC, 0xB3AB, 0xBC2D, 0xCC8E, 0xDD51, 0xDDB3, 0xCD52, 0xC4D0, 0xD531, 0xE5B3, 0xE5B3, 0xEDD3, 0xFE97, 0xFED8, 0xDD31, 0x9B2A, // 0x06A0 (1696) +0xBC4F, 0xDD93, 0xC511, 0xAC2E, 0xABED, 0xABAC, 0x8AC9, 0x8AC9, 0xA40E, 0x7A68, 0x9B6B, 0xABEC, 0xC4AE, 0xDD71, 0xE5D3, 0xE5D2, // 0x06B0 (1712) +0xEDF3, 0xF614, 0xF635, 0xEDB3, 0xD38C, 0xCAEA, 0xCACA, 0xC2CA, 0xC2CA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACB, 0xCACA, 0xCACA, // 0x06C0 (1728) +0xC2C9, 0xC2E9, 0xCAE9, 0xC2E9, 0xC329, 0xB3AB, 0x9329, 0x8B6B, 0xAC6E, 0x8B4A, 0x9BCC, 0x9BCC, 0x936B, 0x8B09, 0x936A, 0xABCC, // 0x06D0 (1744) +0xB3EC, 0xB3CC, 0xA38B, 0x930A, 0x7247, 0x5144, 0x4103, 0x6207, 0x934A, 0xC48F, 0xEE15, 0xEDF4, 0xF635, 0xFE97, 0xDD31, 0xA36B, // 0x06E0 (1760) +0xC4B0, 0xA3ED, 0x7AEA, 0x4144, 0x38C2, 0x40E3, 0x59A6, 0x7268, 0xA3ED, 0x82C9, 0x936B, 0xABEC, 0xBC4C, 0xD530, 0xEE34, 0xEE34, // 0x06F0 (1776) +0xEDF3, 0xEDD3, 0xF676, 0xEDB3, 0xD38C, 0xCAEB, 0xCAEA, 0xC2CA, 0xC2CA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACB, 0xCACB, 0xCACB, // 0x0700 (1792) +0xC2C9, 0xCAE9, 0xCAEA, 0xCB0A, 0xCB0A, 0xBB09, 0x8A67, 0x7A88, 0x8B2A, 0x59A5, 0x7AC9, 0x9BEC, 0xA40C, 0x936A, 0x936B, 0xABEC, // 0x0710 (1808) +0xC46E, 0xCCAF, 0xBC4E, 0x7A88, 0x6A06, 0x8B2A, 0xB46E, 0xCCF0, 0xDDB3, 0xEE56, 0xF656, 0xEE14, 0xEE14, 0xF656, 0xDD52, 0xB40D, // 0x0720 (1824) +0xCCCF, 0xDD72, 0xDD72, 0xBC8F, 0xA3AC, 0x82C9, 0x6A07, 0x934B, 0xB44E, 0x938C, 0x934A, 0xAC0C, 0xBC4D, 0xC4AE, 0xDD51, 0xEE54, // 0x0730 (1840) +0xF676, 0xEDD3, 0xF614, 0xED32, 0xD38C, 0xCB0B, 0xCAEB, 0xCAEA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCAEB, 0xCAEB, 0xCACB, // 0x0740 (1856) +0xCAE9, 0xCAEA, 0xCB0A, 0xCB0A, 0xCB0A, 0xCB2A, 0xB32A, 0x7206, 0x7247, 0x61A5, 0x82E9, 0xAC0C, 0xAC4D, 0xA3CB, 0x9BAB, 0xBC4D, // 0x0750 (1872) +0xD4EF, 0xE592, 0xEDF3, 0xEE14, 0xE5F4, 0xEE35, 0xEDF4, 0xEE55, 0xF6B8, 0xF6B7, 0xF676, 0xEE14, 0xEDD3, 0xEDF4, 0xE572, 0xCCB0, // 0x0760 (1888) +0xC44E, 0xD510, 0xE592, 0xE592, 0xDD51, 0xDD51, 0xCCD0, 0xB40D, 0xBC6F, 0xB46F, 0x9BAB, 0xAC0C, 0xBC4D, 0xC4CF, 0xDD71, 0xE5F3, // 0x0770 (1904) +0xFED8, 0xEDB2, 0xED72, 0xE4B0, 0xD34B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEA, 0xCAEA, 0xCACA, 0xCACA, 0xCAEB, 0xCAEB, 0xCACB, 0xCAEB, // 0x0780 (1920) +0xC2C9, 0xCAE9, 0xCB0A, 0xCB09, 0xCB09, 0xCB4A, 0xC3AB, 0x8267, 0x7247, 0x69E6, 0x6164, 0x9B4A, 0xBCAF, 0xB42C, 0xABEC, 0xBC6E, // 0x0790 (1936) +0xDD51, 0xEDF3, 0xF676, 0xFEB7, 0xFEF8, 0xFED8, 0xFED8, 0xFEF8, 0xFEF8, 0xFEB7, 0xF656, 0xEDD3, 0xE571, 0xEDF4, 0xEDB3, 0xD511, // 0x07A0 (1952) +0xBC2D, 0xCCCF, 0xE551, 0xE5B3, 0xEDD3, 0xE5B2, 0xE572, 0xD510, 0xCD11, 0xCD73, 0xA3CC, 0xA3AB, 0xB40C, 0xC4CE, 0xE5F3, 0xEE34, // 0x07B0 (1968) +0xF696, 0xE530, 0xE4AF, 0xD3CD, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEA, 0xCAEB, 0xCACA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, // 0x07C0 (1984) +0xC2C9, 0xC2E9, 0xC2E9, 0xC2E9, 0xCB09, 0xCB4A, 0xBB6A, 0x8AC8, 0x82C8, 0x7226, 0x6984, 0x8247, 0xB44D, 0xBC6E, 0xB42D, 0xBC6E, // 0x07D0 (2000) +0xD530, 0xE5B3, 0xF675, 0xFEB7, 0xFEF8, 0xFEF8, 0xFEF8, 0xFEF7, 0xFEF8, 0xFEB7, 0xF634, 0xE551, 0xDD31, 0xF677, 0xF656, 0xD4F0, // 0x07E0 (2016) +0xBC6F, 0xCC8F, 0xE551, 0xE572, 0xED92, 0xE571, 0xDD31, 0xD4F0, 0xD552, 0xD593, 0xA3AB, 0xA38A, 0xB42D, 0xC4EF, 0xE614, 0xEE34, // 0x07F0 (2032) +0xE5B2, 0xDCAF, 0xD3ED, 0xCB2B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEA, 0xCAEA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCACB, // 0x0800 (2048) +0xC2E9, 0xCAE9, 0xCB09, 0xCB09, 0xCB2A, 0xB309, 0xBB8B, 0x82A8, 0x82C8, 0x82E8, 0x8267, 0xAB6A, 0xCCAE, 0xB3EC, 0xABCC, 0xB42D, // 0x0810 (2064) +0xCCAF, 0xDD51, 0xEDF3, 0xF655, 0xFEB7, 0xFEF8, 0xFF39, 0xFF19, 0xFEF8, 0xF696, 0xE5B2, 0xD4CF, 0xBBEC, 0xC42D, 0xBC2D, 0x8AA8, // 0x0820 (2080) +0x8AEA, 0xA3AC, 0xE551, 0xEDB2, 0xEDB2, 0xE572, 0xDCF0, 0xD4F0, 0xDDD4, 0xCD32, 0xA36B, 0xA3AB, 0xB42D, 0xCD30, 0xDD92, 0xE5F3, // 0x0830 (2096) +0xDD10, 0xD3CC, 0xD34B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0840 (2112) +0xCB09, 0xCB09, 0xCB09, 0xC309, 0xBAE9, 0xB2E9, 0xB36A, 0x7A46, 0x8287, 0x8AC8, 0xABCB, 0xC44D, 0xDD2F, 0xAB6A, 0xA36A, 0xABAB, // 0x0850 (2128) +0xB40D, 0xD4CF, 0xE571, 0xEDF3, 0xF655, 0xFEF8, 0xFF7B, 0xFF3A, 0xFED7, 0xF655, 0xDD10, 0xB38B, 0x7A06, 0x92C8, 0x71E6, 0x5103, // 0x0860 (2144) +0x5103, 0x71E6, 0xD4CF, 0xEDD3, 0xEDF4, 0xE592, 0xDCD0, 0xD4F0, 0xE636, 0xB46F, 0x8AA8, 0x9329, 0xBC8E, 0xDDD3, 0xDD92, 0xE5B2, // 0x0870 (2160) +0xE531, 0xD3CC, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEA, 0xCAEB, 0xCB0B, 0xCAEB, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0880 (2176) +0xCB09, 0xCB0A, 0xCB0A, 0xCB09, 0xC2E9, 0x9A46, 0x8266, 0x71E5, 0x82A7, 0xABEB, 0xD551, 0xD550, 0xD4EE, 0xBBCB, 0xBC0C, 0xA34A, // 0x0890 (2192) +0xA34A, 0xBC0C, 0xD4CF, 0xE530, 0xEDB2, 0xF696, 0xFF19, 0xFEF8, 0xF655, 0xF634, 0xE5B3, 0xC46E, 0xDD10, 0xD4D0, 0x9B2A, 0x8247, // 0x08A0 (2208) +0x69A5, 0x7A27, 0xCC8E, 0xEDD3, 0xEDF4, 0xE571, 0xD48E, 0xCCAF, 0xD593, 0xA3AC, 0x8227, 0x8247, 0xAC0D, 0xC4CF, 0xCCEF, 0xDD30, // 0x08B0 (2224) +0xE551, 0xD3ED, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x08C0 (2240) +0xCB09, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB2A, 0x9A67, 0x6184, 0x7226, 0x8AC8, 0xABEB, 0xD571, 0xD571, 0xC46D, 0xD50F, 0xCC8E, 0xA34A, // 0x08D0 (2256) +0x92E9, 0xAB8B, 0xC42C, 0xD4AE, 0xE530, 0xEDD3, 0xF675, 0xF675, 0xEE14, 0xF655, 0xF635, 0xF635, 0xF635, 0xEE14, 0xEDB3, 0xDD30, // 0x08E0 (2272) +0xC46E, 0xC46E, 0xCCAF, 0xE551, 0xE592, 0xD4F0, 0xC40D, 0xB3EC, 0xBC8F, 0x9B6B, 0x7A07, 0x7A06, 0x9309, 0xB40C, 0xCCAE, 0xDD31, // 0x08F0 (2288) +0xE531, 0xD3AC, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEB, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0900 (2304) +0xCB0A, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB2A, 0xB2C8, 0x8206, 0x8B29, 0x934A, 0xB48E, 0xCD30, 0xC4EE, 0xBC4C, 0xD4EF, 0xDD71, 0xB3CB, // 0x0910 (2320) +0x8AE9, 0x9B09, 0xB3CB, 0xC42C, 0xD4AE, 0xE550, 0xEDD2, 0xEE13, 0xEE14, 0xF635, 0xEE14, 0xED92, 0xEE14, 0xE551, 0xDCF0, 0xD44D, // 0x0920 (2336) +0xB32A, 0xBBAB, 0xBC2D, 0xCC8E, 0xD4CF, 0xC42D, 0xB3AB, 0x9B4A, 0xA3CC, 0x9B4B, 0x71C6, 0x61A5, 0x8AC8, 0xABEC, 0xCCCF, 0xE571, // 0x0930 (2352) +0xDCAF, 0xD36C, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCAEA, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, // 0x0940 (2368) +0xCB0A, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xBB09, 0x9AC8, 0x7A88, 0xA40C, 0xBCEF, 0xB44D, 0xABCA, 0xC44D, 0xDD30, 0xBC2C, // 0x0950 (2384) +0x9309, 0x9B2A, 0xB3AB, 0xC40C, 0xD48D, 0xDD2F, 0xE591, 0xEDD2, 0xEDF3, 0xDD51, 0xB2E9, 0xAA26, 0xAA87, 0xA226, 0x99C5, 0x9184, // 0x0960 (2400) +0x78C1, 0x70C1, 0x81E5, 0xABAB, 0xD4AF, 0xC44D, 0xAB8B, 0x930A, 0xA3CC, 0x8AEA, 0x4104, 0x5165, 0x92E9, 0xA38A, 0xBC0C, 0xCC6E, // 0x0970 (2416) +0xCB6C, 0xCB2B, 0xCB2B, 0xD34C, 0xD34B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, // 0x0980 (2432) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB6A, 0xD38B, 0xC329, 0x79A5, 0x69E5, 0x7AC8, 0x8B08, 0x9308, 0xAB69, 0xB40C, 0xAC0C, // 0x0990 (2448) +0x9B8B, 0x9B4A, 0xB3AB, 0xBC0B, 0xCC8D, 0xDD0F, 0xE571, 0xE571, 0xDD30, 0x9A05, 0x80E1, 0x9A47, 0xC490, 0xD594, 0xCD11, 0xBC8F, // 0x09A0 (2464) +0x8A67, 0x60C2, 0x5860, 0x9288, 0xCC8E, 0xC46D, 0xABAB, 0x934B, 0xAC0D, 0x6AA9, 0x3125, 0x4986, 0x7268, 0x9B2A, 0xB3CB, 0xD46E, // 0x09B0 (2480) +0xCB4B, 0xCB2B, 0xD34B, 0xD34C, 0xD34C, 0xD32B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, // 0x09C0 (2496) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xD36B, 0xCB6B, 0xBAE9, 0x81A5, 0x50E2, 0x5984, 0x5984, 0x6184, 0x8AC8, 0x7288, 0x41E7, // 0x09D0 (2512) +0x8B09, 0x934A, 0xABAB, 0xBC0C, 0xCC8D, 0xDD0F, 0xE571, 0xDD50, 0xC42C, 0x60A1, 0x6123, 0xA38C, 0xC4F1, 0xCD52, 0xCD52, 0xB44E, // 0x09E0 (2528) +0x8AE9, 0x6185, 0x58C2, 0xB36A, 0xCCAE, 0xC46E, 0xABCC, 0xA3AC, 0xAC4E, 0x4985, 0x28C4, 0x3105, 0x7ACA, 0xA36A, 0xB3AB, 0xD40D, // 0x09F0 (2544) +0xCB4B, 0xCB2B, 0xD34C, 0xD34C, 0xD34C, 0xD34B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, // 0x0A00 (2560) +0xCB4A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB4A, 0xD36A, 0xD36A, 0x8A06, 0x5923, 0x48E3, 0x5164, 0x5984, 0x5984, 0x49C6, 0x3965, 0x39C7, // 0x0A10 (2576) +0x59E6, 0x832A, 0xABAB, 0xBC0C, 0xCC8E, 0xDD30, 0xE591, 0xEDD2, 0xE591, 0xA267, 0x9AA8, 0xCC8F, 0xD532, 0xDDB4, 0xD594, 0xBBEC, // 0x0A20 (2592) +0x9206, 0x70E3, 0x91E5, 0xC44D, 0xCCAE, 0xC44D, 0xB3EC, 0xABEC, 0xB44E, 0x4186, 0x3146, 0x30C4, 0x8B2B, 0xB3CC, 0xCBCC, 0xD3AC, // 0x0A30 (2608) +0xD34B, 0xD34B, 0xD34C, 0xD36C, 0xD34C, 0xD34B, 0xCB2B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB2B, 0xD32B, 0xD32B, 0xCB0B, 0xCB0B, // 0x0A40 (2624) +0xCB4A, 0xCB4A, 0xD36A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0x79C5, 0x69C5, 0x7267, 0x61C5, 0x61A5, 0x5143, 0x2061, 0x3145, 0x20C3, // 0x0A50 (2640) +0x2125, 0x6ACA, 0xA38B, 0xBC0C, 0xCC6D, 0xDD0F, 0xE591, 0xEDF3, 0xEE13, 0xDCF0, 0xAA46, 0xAA26, 0xC36B, 0xC36B, 0xBB09, 0xA1C5, // 0x0A60 (2656) +0x88E2, 0x8984, 0xAB6A, 0xC44D, 0xC44D, 0xBC2D, 0xABED, 0xAC0D, 0x9BCD, 0x2041, 0x3925, 0x6228, 0xA36B, 0xCBAC, 0xD38C, 0xCB4B, // 0x0A70 (2672) +0xCB4B, 0xD34B, 0xD34C, 0xD36C, 0xD34C, 0xD34C, 0xD34C, 0xD34B, 0xD32B, 0xCB2B, 0xCB2B, 0xD32B, 0xD34B, 0xD32B, 0xD32B, 0xD32B, // 0x0A80 (2688) +0xCB4A, 0xCB4A, 0xD36A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB4A, 0x7184, 0x61A4, 0x7AA7, 0x6A26, 0x4902, 0x3061, 0x2925, 0x4208, 0x4A8A, // 0x0A90 (2704) +0x20E4, 0x4165, 0x8309, 0xABCB, 0xC44D, 0xD4CE, 0xDD50, 0xE5D2, 0xEE13, 0xEE14, 0xDCCF, 0xB2C8, 0xA1E5, 0xA226, 0xA1E5, 0x8984, // 0x0AA0 (2720) +0x9226, 0xAB4A, 0xBC0D, 0xBC0C, 0xBC0C, 0xB3EC, 0xABCC, 0xAC2D, 0x82EA, 0x4924, 0x5186, 0xAB6B, 0xCB8C, 0xCB6B, 0xD36B, 0xCB4B, // 0x0AB0 (2736) +0xCB4B, 0xD34C, 0xD36C, 0xD36C, 0xD36C, 0xD36C, 0xD34C, 0xD34B, 0xCB2B, 0xD32B, 0xD34B, 0xD36C, 0xD36C, 0xD36C, 0xD34B, 0xD34C, // 0x0AC0 (2752) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB4A, 0x7143, 0x6184, 0x8B49, 0x938B, 0x8309, 0x40E2, 0x3082, 0x28E3, 0x41E8, // 0x0AD0 (2768) +0x28E4, 0x30C2, 0x6A67, 0x936A, 0xB40C, 0xC46D, 0xD50F, 0xE591, 0xEDF3, 0xF634, 0xEE14, 0xEDD3, 0xE551, 0xDCF0, 0xD4AF, 0xD4AF, // 0x0AE0 (2784) +0xCC8E, 0xCC6E, 0xC46E, 0xBC2D, 0xB3EC, 0xA3AB, 0xA38B, 0xA3EC, 0xA3CC, 0x7A68, 0xA36B, 0xCBCC, 0xCB6C, 0xD36B, 0xD36B, 0xD34B, // 0x0AF0 (2800) +0xD34B, 0xD34C, 0xD36C, 0xD36C, 0xD38C, 0xDBEE, 0xE4B1, 0xE4D1, 0xDC6F, 0xDC6F, 0xE4B0, 0xE511, 0xED31, 0xE4F0, 0xE48F, 0xDC2E, // 0x0B00 (2816) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xAA87, 0x7184, 0x7226, 0x8B49, 0x936A, 0x7287, 0x48E2, 0x4144, 0x4164, // 0x0B10 (2832) +0x2861, 0x30C3, 0x7267, 0x7AC9, 0x934A, 0xBC4D, 0xCCCE, 0xDD30, 0xE5B2, 0xEE14, 0xF655, 0xF655, 0xF676, 0xF676, 0xF614, 0xEDB3, // 0x0B20 (2848) +0xDD10, 0xD4F0, 0xCC8E, 0xBC2D, 0xA3AB, 0x9B6B, 0x9B6B, 0x8B0A, 0xA3CC, 0x8B6B, 0x9B8C, 0xB3AD, 0xCBAC, 0xCB6B, 0xD36B, 0xD34B, // 0x0B30 (2864) +0xD36C, 0xD3AC, 0xDC0E, 0xE4D1, 0xEE16, 0xF6FA, 0xF6B8, 0xF6B7, 0xFEB7, 0xFEB7, 0xFED8, 0xFED8, 0xFED8, 0xFE96, 0xF614, 0xED92, // 0x0B40 (2880) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xB2C8, 0x71A5, 0x71E6, 0x8287, 0x82E8, 0x7AA7, 0x7267, 0x8309, 0x51A4, // 0x0B50 (2896) +0x38A1, 0x3881, 0x7AA8, 0x8B29, 0x6A47, 0x9B6A, 0xBC4C, 0xCCCE, 0xDD51, 0xEDD3, 0xF635, 0xF696, 0xFED8, 0xFEF9, 0xF655, 0xEDB3, // 0x0B60 (2912) +0xDCF0, 0xD4EF, 0xC46E, 0xABEC, 0x9B6B, 0x8B2A, 0x7A68, 0x6A27, 0x936B, 0x8B6C, 0x834C, 0x7B2B, 0x9BED, 0xB3CD, 0xB34B, 0xB36C, // 0x0B70 (2928) +0xC46F, 0xE5B5, 0xF71B, 0xFFDE, 0xFFDF, 0xF71A, 0xFF39, 0xFF3A, 0xFF3A, 0xFF39, 0xFF3A, 0xFF5A, 0xFF3A, 0xFF19, 0xFE97, 0xF634, // 0x0B80 (2944) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xD38B, 0xD38B, 0xC329, 0x81E5, 0x7226, 0x8B09, 0x8B08, 0x8AE8, 0x936A, 0x7AE9, 0x6A67, // 0x0B90 (2960) +0x6206, 0x4103, 0x7AC9, 0xAC0C, 0x82C8, 0x59E6, 0x82E9, 0xABEC, 0xC48E, 0xDD50, 0xEDD3, 0xF655, 0xF696, 0xEE55, 0xE5D3, 0xEDD3, // 0x0BA0 (2976) +0xDD30, 0xCC8E, 0xABCC, 0x934A, 0x82C9, 0x6A07, 0x5965, 0x5985, 0x6A07, 0x7B4B, 0x838D, 0x7B4C, 0x8BCD, 0x9C4F, 0xACB0, 0xAC90, // 0x0BB0 (2992) +0xD636, 0xF75C, 0xFFDF, 0xFFFF, 0xF73B, 0xFF5A, 0xFF7B, 0xFF5A, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF18, 0xFE96, // 0x0BC0 (3008) +0xCB4A, 0xCB4A, 0xCB4A, 0xD36A, 0xD36B, 0xD38B, 0xD3AB, 0xCB8B, 0x89E5, 0x5943, 0x7267, 0x8B09, 0x8B29, 0x8B6A, 0x8309, 0x9BEC, // 0x0BD0 (3024) +0x834A, 0x51C5, 0x6A88, 0xAC2D, 0xAC0C, 0x6A27, 0x4923, 0x6227, 0x934A, 0xB40D, 0xCCCF, 0xD551, 0xD551, 0xD510, 0xCCAF, 0xCCF0, // 0x0BE0 (3040) +0xB40D, 0x932A, 0x82C9, 0x7A88, 0x61E6, 0x5964, 0x5944, 0x5144, 0x5144, 0x49C6, 0x6289, 0x6ACA, 0x83AD, 0xBD74, 0xE6B9, 0xDE99, // 0x0BF0 (3056) +0xEF1B, 0xFFDE, 0xFFFF, 0xFFDF, 0xF71A, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF7B, 0xFF9B, 0xFF9B, 0xFF7B, 0xFF3A, 0xFED7, // 0x0C00 (3072) +0xCB4A, 0xCB4A, 0xD36A, 0xD36B, 0xD36A, 0xD38B, 0xD3AB, 0xD3AB, 0xAA67, 0x50E2, 0x5964, 0x69E5, 0x7AC8, 0x834A, 0xA44D, 0xB4F0, // 0x0C10 (3088) +0xC5B3, 0xA4B0, 0x8BAC, 0xAC2D, 0xC48E, 0xB42D, 0x7AA8, 0x4103, 0x4123, 0x6227, 0x7AA9, 0x8B2A, 0x8B09, 0x82A8, 0x7247, 0x7227, // 0x0C20 (3104) +0x69E6, 0x6A06, 0x61C6, 0x5985, 0x5144, 0x5144, 0x5124, 0x5103, 0x48E3, 0x2041, 0x1800, 0x1800, 0x1820, 0x3124, 0x83CF, 0xBDF7, // 0x0C30 (3120) +0xF77D, 0xFFDF, 0xFFFF, 0xF79D, 0xEED8, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF9B, 0xFF3A, 0xFEF8, // 0x0C40 (3136) +0xCB4A, 0xD34B, 0xD36B, 0xD38B, 0xD36B, 0xD38B, 0xD3AB, 0xD38B, 0xB2C9, 0x7985, 0x71A5, 0x8267, 0x8B09, 0x8B4A, 0xBD10, 0xDE97, // 0x0C50 (3152) +0xEF3B, 0xEF3B, 0xDE98, 0xBCF0, 0xC4AE, 0xC4CF, 0xB44D, 0x82A8, 0x5184, 0x4103, 0x4124, 0x4964, 0x5165, 0x5164, 0x5164, 0x5964, // 0x0C60 (3168) +0x5964, 0x5944, 0x5144, 0x5124, 0x5124, 0x5144, 0x5124, 0x5103, 0x40C3, 0x2041, 0x1800, 0x1800, 0x1821, 0x1842, 0x2083, 0x3146, // 0x0C70 (3184) +0x738E, 0xCE59, 0xF7BF, 0xE6B9, 0xEEB8, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7A, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF39, 0xFED8, // 0x0C80 (3200) +0xCB4A, 0xD34A, 0xD36B, 0xD36B, 0xCB6B, 0xD38B, 0xD3AB, 0xD38B, 0xC34A, 0x91E6, 0x8A26, 0x9AE9, 0x9B4A, 0x9BCB, 0xDE77, 0xEF1A, // 0x0C90 (3216) +0xF79D, 0xFFDE, 0xFFBE, 0xD615, 0xBCCE, 0xCCEF, 0xCD10, 0xC4AE, 0x9B8B, 0x6206, 0x4964, 0x4124, 0x4924, 0x4923, 0x5144, 0x5144, // 0x0CA0 (3232) +0x5124, 0x5944, 0x5944, 0x5124, 0x5124, 0x5144, 0x5944, 0x5124, 0x48E3, 0x2841, 0x1800, 0x1800, 0x1821, 0x1863, 0x1883, 0x1884, // 0x0CB0 (3248) +0x20A4, 0x2925, 0x736E, 0xA42E, 0xF6F9, 0xFF7C, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF9B, 0xFF9B, 0xFF7B, 0xFF19, 0xFED7, // 0x0CC0 (3264) +0xCB4A, 0xCB4B, 0xD36B, 0xD36B, 0xD36B, 0xD38B, 0xD3AB, 0xD3AC, 0xD3AB, 0xC34A, 0xB2E9, 0xBB4A, 0xC3EC, 0xDE36, 0xFFBE, 0xFFBE, // 0x0CD0 (3280) +0xFFBE, 0xFFFF, 0xFFDE, 0xEF1A, 0xC510, 0xCD0F, 0xCD30, 0xD550, 0xC4CF, 0x9BAB, 0x7267, 0x5185, 0x4944, 0x4944, 0x5144, 0x5144, // 0x0CE0 (3296) +0x5944, 0x5964, 0x5964, 0x5124, 0x5124, 0x5964, 0x5964, 0x5144, 0x4903, 0x3082, 0x1820, 0x1821, 0x1862, 0x1883, 0x1884, 0x1884, // 0x0CF0 (3312) +0x1883, 0x2084, 0x20C4, 0x6269, 0xEE97, 0xFF5B, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF19, 0xF6B6, // 0x0D00 (3328) +0xD36B, 0xD36B, 0xD36B, 0xD38B, 0xD38B, 0xD3AB, 0xD3AB, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD40D, 0xE5D5, 0xFFBE, 0xFFFF, 0xFFFF, // 0x0D10 (3344) +0xFFFF, 0xFFFF, 0xFFDE, 0xF79D, 0xD5D4, 0xC510, 0xCD30, 0xD571, 0xD571, 0xCCEF, 0xA3EC, 0x7AA8, 0x59A5, 0x5164, 0x5164, 0x5164, // 0x0D20 (3360) +0x5965, 0x5964, 0x5964, 0x5944, 0x5944, 0x5965, 0x5985, 0x5164, 0x5144, 0x4904, 0x4924, 0x30C3, 0x20A4, 0x20A4, 0x2084, 0x2084, // 0x0D30 (3376) +0x1884, 0x1884, 0x1883, 0x28E4, 0x732C, 0xDE57, 0xFF5A, 0xFF7B, 0xFF9B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5B, 0xFF3A, 0xFEF8, 0xF675, // 0x0D40 (3392) +0xD36B, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3ED, 0xDCB0, 0xF75C, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D50 (3408) +0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xDE77, 0xC510, 0xCD30, 0xD551, 0xD551, 0xD550, 0xC4CF, 0xABEC, 0x82C8, 0x61E6, 0x5985, 0x5985, // 0x0D60 (3424) +0x5985, 0x5985, 0x5965, 0x5964, 0x5985, 0x5985, 0x5985, 0x5985, 0x5965, 0x69E6, 0x934A, 0x936B, 0x3946, 0x28C5, 0x20A4, 0x2084, // 0x0D70 (3440) +0x1884, 0x1884, 0x1883, 0x1884, 0x20C4, 0x49E8, 0xACF2, 0xEEF9, 0xFF5B, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF3A, 0xFF18, 0xF6B6, 0xEE34, // 0x0D80 (3456) +0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3CC, 0xDC0D, 0xE4F1, 0xFF9D, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0D90 (3472) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xEF1A, 0xC530, 0xC50F, 0xD550, 0xD550, 0xD550, 0xCD30, 0xC4AE, 0xABEC, 0x8AE9, 0x7227, 0x69E6, // 0x0DA0 (3488) +0x61A5, 0x61A5, 0x61A5, 0x5985, 0x5985, 0x61A5, 0x61A5, 0x61C6, 0x61E6, 0x9309, 0xBC4D, 0xD510, 0x8B8C, 0x3105, 0x20C5, 0x20A4, // 0x0DB0 (3504) +0x2084, 0x1883, 0x1884, 0x1884, 0x1863, 0x20A4, 0x2905, 0x7B8D, 0xDE77, 0xFF39, 0xFF3A, 0xFF3A, 0xFF19, 0xFED7, 0xF696, 0xEE34, // 0x0DC0 (3520) +0xD36B, 0xD38B, 0xD3AB, 0xD38B, 0xD38B, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3EC, 0xDC0D, 0xDC6E, 0xF6D9, 0xF79D, 0xFFDF, 0xFFFF, // 0x0DD0 (3536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xBCEF, 0xBCCE, 0xCD30, 0xD571, 0xD571, 0xCD50, 0xCD10, 0xC4AE, 0xB42C, 0x9B4A, 0x82C8, // 0x0DE0 (3552) +0x7247, 0x6A06, 0x69E6, 0x61C6, 0x61A5, 0x61C5, 0x69E6, 0x7227, 0x82C8, 0xB40C, 0xCCEF, 0xDD92, 0xDD92, 0x832B, 0x28E5, 0x20A4, // 0x0DF0 (3568) +0x20A4, 0x1884, 0x1884, 0x1884, 0x1884, 0x1863, 0x18A4, 0x20C4, 0x41A7, 0xB512, 0xEEB7, 0xF6F8, 0xFEF8, 0xF6B7, 0xF675, 0xEE34, // 0x0E00 (3584) +0xCB6B, 0xD38B, 0xD3AB, 0xD3AB, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3CC, 0xD3EC, 0xD40D, 0xDC4D, 0xE572, 0xEF1A, 0xF79D, 0xFFDF, // 0x0E10 (3600) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC551, 0xB46D, 0xC50F, 0xCD70, 0xD571, 0xD550, 0xCD10, 0xCCEF, 0xC4CE, 0xB44D, 0xA3AB, // 0x0E20 (3616) +0x8B09, 0x82A8, 0x7A67, 0x7227, 0x6A06, 0x6A27, 0x7A88, 0x8AE9, 0xA3AB, 0xC4AE, 0xD551, 0xE5D3, 0xE614, 0xCD72, 0x41A7, 0x28E5, // 0x0E30 (3632) +0x20C5, 0x18A4, 0x1884, 0x18A4, 0x1884, 0x1863, 0x1883, 0x1884, 0x18A4, 0x3146, 0x940F, 0xEEB7, 0xF6D7, 0xF6B6, 0xEE75, 0xEE34, // 0x0E40 (3648) +0xCB6A, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xD40C, 0xDC2D, 0xDC4E, 0xDC8E, 0xE615, 0xEF5B, 0xF7BE, // 0x0E50 (3664) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF1A, 0xB48E, 0xBCAE, 0xCD30, 0xD571, 0xD571, 0xCD50, 0xCD2F, 0xCD0F, 0xC4CE, 0xBC6D, // 0x0E60 (3680) +0xA3EB, 0x9B6A, 0x9329, 0x8B09, 0x8B09, 0x936A, 0xA3CC, 0xB44D, 0xC4CE, 0xD550, 0xDDB2, 0xE613, 0xEE34, 0xEE55, 0xAC8F, 0x4187, // 0x0E70 (3696) +0x2905, 0x20C4, 0x18A4, 0x18A4, 0x18A4, 0x18A4, 0x1884, 0x1083, 0x1883, 0x18A4, 0x20E5, 0x6B0B, 0xD5D4, 0xEE75, 0xEE54, 0xE614, // 0x0E80 (3712) +0xCB6A, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xDC2D, 0xDC4D, 0xDC6E, 0xDC8E, 0xEDF4, 0xEF7C, 0xF7BD, // 0x0E90 (3728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xCDF5, 0xAC6D, 0xC50F, 0xCD70, 0xD571, 0xD571, 0xD550, 0xD550, 0xCD0F, 0xC4EE, // 0x0EA0 (3744) +0xBC6D, 0xB42C, 0xAC0C, 0xAC0C, 0xB42C, 0xBC8E, 0xC4CF, 0xCD0F, 0xD571, 0xDDD2, 0xE613, 0xEE54, 0xEE55, 0xEE75, 0xE635, 0x9C0E, // 0x0EB0 (3760) +0x3126, 0x20E5, 0x18C4, 0x18C5, 0x18C5, 0x18A4, 0x18A4, 0x18A4, 0x1084, 0x1883, 0x18A4, 0x20C4, 0x5229, 0xACD0, 0xDDF3, 0xE5F3, // 0x0EC0 (3776) +0xCB6B, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3EC, 0xD40C, 0xDC2D, 0xDC4D, 0xDC6E, 0xDC8E, 0xEE15, 0xF7BD, 0xF7DE, // 0x0ED0 (3792) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xB4F0, 0xC52F, 0xD570, 0xD591, 0xD591, 0xD570, 0xD570, 0xD570, 0xD550, // 0x0EE0 (3808) +0xCCEF, 0xC4CE, 0xC4AE, 0xC4CF, 0xCD10, 0xD571, 0xDDB2, 0xDDB2, 0xE5F2, 0xEE33, 0xEE54, 0xEE54, 0xEE75, 0xF695, 0xEE96, 0xE655, // 0x0EF0 (3824) +0x5208, 0x2905, 0x20C4, 0x18C4, 0x18C5, 0x18A5, 0x1083, 0x18A4, 0x18A4, 0x10A4, 0x1083, 0x18A4, 0x18C4, 0x2905, 0x8B8C, 0xD591, // 0x0F00 (3840) +0xCB4B, 0xCB6B, 0xD38B, 0xD38A, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xDC0C, 0xDC2D, 0xDC4D, 0xDC8E, 0xE635, 0xF7BE, 0xF7DE, // 0x0F10 (3856) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6B9, 0xD592, 0xE5F2, 0xE613, 0xE613, 0xDDD2, 0xDDB1, 0xDDB1, 0xDD91, // 0x0F20 (3872) +0xD570, 0xD570, 0xDD71, 0xDDB2, 0xE5F3, 0xE613, 0xEE34, 0xEE33, 0xEE34, 0xEE54, 0xEE54, 0xEE54, 0xF675, 0xF696, 0xF696, 0xEE96, // 0x0F30 (3888) +0xA46F, 0x3166, 0x20E5, 0x18C4, 0x18C5, 0x18A5, 0x1083, 0x18A4, 0x18A4, 0x1084, 0x1084, 0x1083, 0x1083, 0x18A4, 0x20E5, 0x5228, // 0x0F40 (3904) +0xCB4A, 0xCB4A, 0xCB6A, 0xD36A, 0xD38A, 0xD3AB, 0xD3AB, 0xD3CB, 0xD3EC, 0xD40C, 0xDC2D, 0xD46E, 0xD4EF, 0xE677, 0xF7BE, 0xFFFF, // 0x0F50 (3920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xE655, 0xEE74, 0xF675, 0xEE75, 0xEE54, 0xEE53, 0xE613, 0xE612, // 0x0F60 (3936) +0xE5F2, 0xE5F3, 0xE613, 0xEE34, 0xF675, 0xF695, 0xF675, 0xEE75, 0xF675, 0xEE75, 0xEE75, 0xEE75, 0xF695, 0xF696, 0xF696, 0xF6B6, // 0x0F70 (3952) +0xE635, 0x62CA, 0x2105, 0x18C4, 0x18A4, 0x18A5, 0x10A4, 0x1083, 0x18A4, 0x10A4, 0x1084, 0x1084, 0x1083, 0x1083, 0x1083, 0x1883, // 0x0F80 (3968) +0xCB2A, 0xCB4A, 0xCB6A, 0xCB6A, 0xCB6A, 0xD38B, 0xD3AB, 0xD3CB, 0xD3EC, 0xD42D, 0xD4CE, 0xD571, 0xDE34, 0xF77C, 0xFFDF, 0xFFFF, // 0x0F90 (3984) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB594, 0xE654, 0xF6B6, 0xF6D6, 0xF6B6, 0xF695, 0xF695, 0xF695, // 0x0FA0 (4000) +0xEE54, 0xEE54, 0xEE54, 0xF675, 0xF695, 0xF6B5, 0xF695, 0xF695, 0xF695, 0xEE75, 0xEE75, 0xEE75, 0xF695, 0xF696, 0xF6B6, 0xF6B7, // 0x0FB0 (4016) +0xEE96, 0xB4F1, 0x2926, 0x20C5, 0x18A4, 0x18C5, 0x18A5, 0x1083, 0x10A4, 0x10A4, 0x1084, 0x1084, 0x1084, 0x1083, 0x1063, 0x1063, // 0x0FC0 (4032) +0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xD38B, 0xD3AB, 0xD3CB, 0xD44D, 0xD52F, 0xDDD2, 0xE654, 0xF75B, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9E, 0x73AE, 0xACAF, 0xF6B6, 0xF6F7, 0xF6B6, 0xF6B6, 0xF6D6, 0xF6B6, // 0x0FE0 (4064) +0xF695, 0xF695, 0xF695, 0xF6B6, 0xF6B6, 0xF6D6, 0xF6D6, 0xF6B6, 0xF695, 0xF675, 0xF675, 0xEE75, 0xEE75, 0xF696, 0xF6B6, 0xF6B6, // 0x0FF0 (4080) +0xEE96, 0xDDF4, 0x4A08, 0x20E5, 0x18A4, 0x18C5, 0x18A5, 0x1083, 0x1084, 0x10A4, 0x10A4, 0x10A4, 0x1084, 0x1063, 0x1063, 0x1043, // 0x1000 (4096) +}; + +// Generated by : ImageConverter 565 v2.3 +// Generated from: tractor10.jpg +// Time generated: 11-May-18 09:27:27 +// Dimensions : 96x64 pixels +// Size : 12,288 Bytes + +#include + +const uint16_t tractor10_96x64[0x1800] PROGMEM ={ +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0050 (80) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0090 (144) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00B0 (176) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00D0 (208) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x9C71, 0x838D, 0x7B4C, 0x9410, 0xC5D6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0110 (272) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0150 (336) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9430, 0xA4B2, 0xF77D, 0xACF3, 0xC5D7, 0xB575, 0x942F, 0xC5F7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0170 (368) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0190 (400) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x83AE, 0xEF3C, 0xFFFF, 0xDEDB, 0xCE38, 0xFFFF, 0xEF5C, 0x9C92, 0xAD34, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01D0 (464) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD34, 0xCE59, 0xFFFF, 0xFFFF, 0xB595, 0xF7BE, 0xFFFF, 0xFFFF, 0xACF3, 0xA4F3, 0xFFFF, 0xFFFF, // 0x0220 (544) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0230 (560) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0250 (592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x0260 (608) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9E, 0xBD96, 0xFFDF, 0xFFFF, 0xC5B7, 0x83CF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8B8E, 0xCE18, 0xFFFF, // 0x0280 (640) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0290 (656) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, // 0x02C0 (704) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEDA, 0xDE38, 0xEFBE, 0xF77D, 0xF71B, 0xEE99, // 0x02D0 (720) +0xEDD5, 0xE512, 0xE4B0, 0xE42E, 0xDB49, 0xCA25, 0xD3AC, 0xC533, 0x9268, 0x6922, 0xB34B, 0xC574, 0xE75D, 0xD659, 0x8C30, 0xFFFF, // 0x02E0 (736) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0310 (784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, // 0x0320 (800) +0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF75D, 0xF6FB, 0xEE38, 0xE553, 0xE4B0, 0xE44E, 0xCA25, 0xB921, 0xD265, 0xDA23, 0xD1E2, 0xD1A1, // 0x0330 (816) +0xD160, 0xD920, 0xD920, 0xD920, 0xE180, 0xE180, 0xE1A0, 0xC161, 0x9901, 0xC982, 0xD940, 0xC900, 0xB2E9, 0xB574, 0x8451, 0xFFFF, // 0x0340 (832) +0xFFFF, 0xFF9E, 0xFF5D, 0xFF5C, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0350 (848) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0370 (880) +0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF77D, 0xF71B, 0xF699, 0xEDF6, 0xE532, // 0x0380 (896) +0xE48F, 0xE3ED, 0xE329, 0xDA85, 0xD9E3, 0xD9C2, 0xD980, 0xD920, 0xD920, 0xD920, 0xE160, 0xE180, 0xE160, 0xE180, 0xE9A0, 0xF1C1, // 0x0390 (912) +0xF243, 0xF264, 0xEA44, 0xF2A6, 0xEA86, 0xD204, 0xCA45, 0xAA04, 0x7142, 0x7963, 0x9163, 0xA961, 0xB141, 0x81E5, 0x9C30, 0xED93, // 0x03A0 (928) +0xE40D, 0xD286, 0xD1E3, 0xD9E3, 0xD245, 0xCBAC, 0xEEBA, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF9D, 0xFF7D, 0xFFFF, // 0x03B0 (944) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976) +0xFFFF, 0xFFFF, 0xFFFF, 0xF77C, 0xF71B, 0xEE78, 0xEDD5, 0xECF1, 0xE44F, 0xE3AB, 0xDAE7, 0xDA44, 0xE204, 0xE1C2, 0xE160, 0xE120, // 0x03E0 (992) +0xE140, 0xE160, 0xE160, 0xE160, 0xE160, 0xE980, 0xE981, 0xE1A1, 0xE9C2, 0xEA03, 0xEA65, 0xF2A6, 0xEAA5, 0xEAE8, 0xE2C7, 0xD265, // 0x03F0 (1008) +0xCA86, 0xBA45, 0xA1C3, 0x91A4, 0x8983, 0x6922, 0x6902, 0x7122, 0x7942, 0x7963, 0x7164, 0x5944, 0x5943, 0x8122, 0xD1A1, 0xE1A1, // 0x0400 (1024) +0xE9E2, 0xE1A1, 0xD980, 0xE1A0, 0xD161, 0x80C0, 0xAA06, 0xFF9D, 0xFFFF, 0xFFFF, 0xF73C, 0xBCF3, 0x8ACA, 0x69C5, 0x69A4, 0x7A68, // 0x0410 (1040) +0xA44F, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0420 (1056) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0430 (1072) +0xFED9, 0xD40E, 0xCAE8, 0xD224, 0xD9E2, 0xD9A1, 0xD960, 0xD940, 0xD940, 0xE140, 0xE180, 0xE180, 0xE181, 0xE980, 0xE980, 0xE9A0, // 0x0440 (1088) +0xE9A1, 0xE9C2, 0xE9E2, 0xF264, 0xEAC6, 0xF2C6, 0xF307, 0xF38A, 0xEB08, 0xD2C7, 0xCAE8, 0xC287, 0x99C4, 0x9183, 0x9182, 0x6901, // 0x0450 (1104) +0x6101, 0x68E1, 0x6102, 0x60E1, 0x7122, 0x8142, 0x8942, 0x9142, 0x9942, 0xB982, 0xB9A2, 0xA962, 0xD1A1, 0xE9C1, 0xE1A2, 0xD9A1, // 0x0460 (1120) +0xE1A1, 0xD162, 0xD182, 0xD182, 0xB982, 0x8100, 0xBB29, 0xFFFF, 0xFFDE, 0xAC70, 0x5944, 0x4080, 0x68C1, 0x8901, 0x9941, 0x9920, // 0x0470 (1136) +0x98E0, 0x8A27, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0480 (1152) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6DA, // 0x0490 (1168) +0xB182, 0xC900, 0xD981, 0xE180, 0xE181, 0xE981, 0xE9A1, 0xE1C1, 0xE1C1, 0xE9C1, 0xE9C1, 0xE9E2, 0xEA64, 0xF2C7, 0xF2C6, 0xFAE7, // 0x04A0 (1184) +0xFB69, 0xF3AB, 0xE2E8, 0xD308, 0xD2C8, 0xBA45, 0x99A4, 0x8983, 0x9142, 0x7102, 0x58E1, 0x68E1, 0x68E2, 0x48E2, 0x60E1, 0x8942, // 0x04B0 (1200) +0x8162, 0x8962, 0xA162, 0xB182, 0xB982, 0xC9C2, 0xD1C2, 0xD9A1, 0xC9C2, 0xB181, 0xC981, 0xE1C1, 0xD9A0, 0xD9A1, 0xD1A1, 0xD1A1, // 0x04C0 (1216) +0xD1A1, 0xC981, 0xC981, 0xB181, 0x9121, 0x91A5, 0xFF9E, 0xEEDB, 0x7227, 0x4840, 0x8901, 0xC182, 0xD9C2, 0xD1C2, 0xE9A1, 0xE981, // 0x04D0 (1232) +0xE181, 0xC0E0, 0xA267, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04E0 (1248) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD38C, // 0x04F0 (1264) +0x98E0, 0xE1C1, 0xE1A1, 0xE9C1, 0xF1C1, 0xE9E2, 0xEA02, 0xE9C1, 0xE9A1, 0xF1E2, 0xF3AA, 0xEBAA, 0xF34A, 0xEB4A, 0xCAC7, 0xCA44, // 0x0500 (1280) +0xB1C4, 0xA183, 0x8121, 0x70E1, 0xB121, 0x70E1, 0x7902, 0x70E2, 0x6902, 0x6901, 0x7922, 0x7901, 0x9AC9, 0xA4F2, 0x49C6, 0x99C3, // 0x0510 (1296) +0xD1A2, 0xD1A2, 0xD9C2, 0xD9C2, 0xD9C1, 0xD9A2, 0xD9C2, 0xE1A1, 0xC9A1, 0xA981, 0xB981, 0xD1A1, 0xE1C1, 0xE9C2, 0xE9C1, 0xE1A2, // 0x0520 (1312) +0xE9A1, 0xE9A1, 0xD182, 0xA141, 0x6102, 0xD617, 0xE6DA, 0x8184, 0x80C0, 0xC982, 0xD982, 0xD9A1, 0xD160, 0xE181, 0xD9C2, 0xA286, // 0x0530 (1328) +0xA225, 0x89C4, 0x6922, 0xA4B1, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0540 (1344) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FF, 0xDBED, // 0x0550 (1360) +0xB920, 0xE9E1, 0xE9C1, 0xE9C1, 0xE9A1, 0xEAC7, 0xEBAA, 0xE9C1, 0xE9E2, 0xE9E2, 0xEA03, 0xE9C2, 0xE1A0, 0xD981, 0x88E1, 0x8922, // 0x0560 (1376) +0x6902, 0x7102, 0x7122, 0x7122, 0x8902, 0x58C1, 0x48E1, 0x58E1, 0x58A1, 0x48A1, 0x8122, 0x9900, 0xB44E, 0xE6FA, 0x52CB, 0x48E1, // 0x0570 (1392) +0xD9A2, 0xD9A1, 0xE1C2, 0xD9A2, 0xD9A1, 0xD9C2, 0xD1C3, 0xD1E3, 0xB981, 0xB981, 0x7122, 0x7142, 0x7941, 0x9941, 0xB961, 0xB981, // 0x0580 (1408) +0xB982, 0xA142, 0x6921, 0x40E2, 0x6142, 0xBBAD, 0x81E5, 0xB100, 0xE1A2, 0xD9A1, 0xD981, 0xC182, 0xBAA8, 0xA941, 0x59E5, 0x52AA, // 0x0590 (1424) +0x52AA, 0x4248, 0x52EB, 0x41E7, 0x5269, 0xAD33, 0xF79D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05A0 (1440) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC36B, // 0x05B0 (1456) +0xB120, 0xE1C1, 0xE1C1, 0xD9A1, 0xE9C1, 0xF1C1, 0xE9C2, 0xD9C1, 0xC1A2, 0xC9A2, 0xD182, 0xD1A1, 0xD9A1, 0xC9A2, 0x8922, 0x7102, // 0x05C0 (1472) +0x58E1, 0x50C1, 0x48C2, 0x3082, 0x2061, 0x1861, 0x2041, 0xA9A4, 0xE284, 0xB962, 0x8921, 0xA921, 0x9BAC, 0xF75C, 0x52CB, 0x60E1, // 0x05D0 (1488) +0xEA22, 0xCA24, 0xC9E3, 0xD203, 0xCA03, 0xC9C3, 0xC1E2, 0xC9E2, 0xC182, 0xB961, 0x38E2, 0x5902, 0x6102, 0x40E2, 0x7102, 0x7143, // 0x05E0 (1504) +0x38C2, 0x40A1, 0x6922, 0x8122, 0xC181, 0x88C0, 0xC141, 0xD9A1, 0xD181, 0xE181, 0xE981, 0xA143, 0x6B2C, 0x6289, 0x4A89, 0x5269, // 0x05F0 (1520) +0x5248, 0x5289, 0x5269, 0x3185, 0x3185, 0x4227, 0x41E7, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0600 (1536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9A88, // 0x0610 (1552) +0x90E0, 0xC981, 0xC182, 0xC182, 0xC182, 0xD245, 0xD265, 0xC182, 0xB161, 0xA962, 0xA982, 0xB162, 0xC982, 0x8921, 0x2861, 0x2061, // 0x0620 (1568) +0x1861, 0x1881, 0x1061, 0x3061, 0x6102, 0x48A1, 0x3860, 0x6102, 0x8984, 0x5922, 0x7122, 0xE9A1, 0xB1C3, 0x7B8D, 0x3985, 0x40E2, // 0x0630 (1584) +0x91A3, 0xD203, 0xD1C2, 0xD9C2, 0xD9A2, 0xE1A1, 0xE9C1, 0x9141, 0x9141, 0xD182, 0x40C2, 0x38A2, 0x5902, 0x7923, 0x6921, 0xA942, // 0x0640 (1600) +0xA1C3, 0xA309, 0x9182, 0xD1A1, 0xA942, 0xB982, 0xE9A1, 0xD9A1, 0xCA03, 0x71C5, 0x91C4, 0x832A, 0x4A89, 0x5269, 0x5268, 0x5269, // 0x0650 (1616) +0x5249, 0x4208, 0x5269, 0x3165, 0x20E4, 0x4207, 0x2103, 0x2924, 0xB595, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0660 (1632) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAB4B, // 0x0670 (1648) +0x8102, 0x5902, 0x40A1, 0x48C1, 0x48A1, 0x5903, 0x5103, 0x50A1, 0xA962, 0xC1A2, 0xC9A2, 0xC9A2, 0xE1C2, 0x9941, 0x1841, 0x3881, // 0x0680 (1664) +0x7122, 0x9122, 0x8942, 0x8941, 0xB9C3, 0xDCF2, 0x9BAD, 0x48E2, 0xA143, 0x6122, 0xA962, 0xE1C2, 0xC9A2, 0x48C1, 0x38C3, 0x30C2, // 0x0690 (1680) +0x9162, 0xE1C1, 0xE1A1, 0xE1C1, 0xE1A1, 0xE9C1, 0xC9A2, 0x40C2, 0x8141, 0xD9C2, 0x9162, 0x38E2, 0x6102, 0x7922, 0x6902, 0x7902, // 0x06A0 (1696) +0xE182, 0x9AC8, 0xA9A4, 0xC181, 0x8942, 0xC962, 0xD981, 0xE160, 0xD2A7, 0x7BCF, 0x2986, 0x4A48, 0x5228, 0x734C, 0x8C0F, 0x5248, // 0x06B0 (1712) +0x20E3, 0x2924, 0x2924, 0x2924, 0x2103, 0x2124, 0x2104, 0x2904, 0x39A6, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06C0 (1728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB3EE, // 0x06D0 (1744) +0x8122, 0x5903, 0x2840, 0x3881, 0x4081, 0x40E2, 0x38C2, 0x4081, 0xB162, 0xC982, 0xC9A2, 0xD1A2, 0xE1C1, 0x9941, 0x2060, 0xA9A2, // 0x06E0 (1760) +0xD204, 0xB162, 0xB182, 0xA142, 0xA941, 0xCC90, 0xDE9A, 0x7207, 0xB1A2, 0xA142, 0xD1A2, 0xD1A2, 0xE9C2, 0xA962, 0x3902, 0x7142, // 0x06F0 (1776) +0xD981, 0xE1C2, 0xD9E2, 0xDA43, 0xD204, 0xD9A1, 0x9962, 0x38E2, 0x7122, 0xC9A1, 0xC161, 0x8142, 0x9982, 0xC161, 0x6122, 0x38E2, // 0x0700 (1792) +0xA141, 0xB982, 0x8142, 0xA941, 0x6122, 0xA161, 0xF1A1, 0xF181, 0xA1C4, 0x83EE, 0x39A6, 0x5AA9, 0x8C0F, 0xAD13, 0x9C91, 0x5AA9, // 0x0710 (1808) +0x3185, 0x20E3, 0x2104, 0x2104, 0x18E3, 0x18E3, 0x18C3, 0x2924, 0x18A2, 0x9491, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0720 (1824) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB470, // 0x0730 (1840) +0x7902, 0x6923, 0x3881, 0x4881, 0x48A0, 0x50E2, 0x48C2, 0x60C1, 0xC982, 0xC9A2, 0xD1A2, 0xD1A2, 0xE1C1, 0xA161, 0x30A1, 0xB983, // 0x0740 (1856) +0x9942, 0x8942, 0x8121, 0xB182, 0xC981, 0xA962, 0xCD34, 0x9C70, 0xBA04, 0xA121, 0xD1A2, 0xD1C2, 0xE1C2, 0xE1C2, 0xC9A3, 0xCA04, // 0x0750 (1872) +0xD203, 0xD244, 0xD204, 0xD204, 0xE1E2, 0xA142, 0x4102, 0x40E3, 0x5922, 0xB9C2, 0xB9A2, 0xA162, 0x9162, 0xB162, 0x5922, 0x38C2, // 0x0760 (1888) +0x5901, 0xC9A2, 0xA962, 0x8941, 0x38E3, 0x7102, 0x9942, 0x8162, 0x4164, 0x62EB, 0x736C, 0x6B2C, 0x7BAD, 0x5A69, 0x39A6, 0x2944, // 0x0770 (1904) +0x2104, 0x20E3, 0x20C3, 0x20C3, 0x18E3, 0x18C3, 0x18A2, 0x20E3, 0x18A2, 0x2945, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0780 (1920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC4F3, // 0x0790 (1936) +0x70E1, 0x6123, 0x4061, 0x48A1, 0x48A1, 0x48E2, 0x48C2, 0x68C1, 0xC9C1, 0xD1C2, 0xD1C1, 0xD9C2, 0xE1C1, 0xA922, 0x48E2, 0x4144, // 0x07A0 (1952) +0x28C2, 0x8942, 0xA182, 0x8121, 0x8963, 0x7901, 0x6A07, 0xC618, 0xA2C9, 0xB961, 0xC9C2, 0xD9E2, 0xDA85, 0xC9C3, 0xD9E2, 0xD9E2, // 0x07B0 (1968) +0xD9C2, 0xD9A1, 0xE1C2, 0xE9A1, 0xD182, 0x4902, 0x38E3, 0x38E3, 0x6123, 0xB9C3, 0xB9A2, 0x9942, 0x6143, 0x5122, 0x8922, 0x5902, // 0x07C0 (1984) +0x5902, 0x9983, 0x8942, 0x6921, 0x40C2, 0x5164, 0x4A68, 0x4248, 0x83AF, 0x5A69, 0x62EA, 0x6B0B, 0x5269, 0x3165, 0x2924, 0x20E3, // 0x07D0 (2000) +0x18C3, 0x18C2, 0x31A5, 0x4A28, 0x41E7, 0x20E3, 0x18A2, 0x20C3, 0x20C3, 0x18C2, 0x736D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07E0 (2016) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD595, // 0x07F0 (2032) +0x8101, 0x7164, 0x4881, 0x50A1, 0x4080, 0x40C2, 0x40A2, 0x70E2, 0xD1A2, 0xD9C2, 0xD9C2, 0xE1C2, 0xE9E2, 0xB161, 0x3922, 0x2965, // 0x0800 (2048) +0x2104, 0x2103, 0x30A2, 0x3081, 0xBA05, 0x68C1, 0x80E0, 0xDD53, 0xA4D2, 0xA1A2, 0x9942, 0xE1C2, 0xE1E2, 0xE9A1, 0xE9C1, 0xE9C1, // 0x0810 (2064) +0xE9C1, 0xE9E1, 0xE9C2, 0xE1C2, 0x7142, 0x30E3, 0x6143, 0x5922, 0x9962, 0xD9C3, 0xC9A2, 0xA182, 0x9162, 0x8122, 0x9142, 0x9162, // 0x0820 (2080) +0x9143, 0x4902, 0x6122, 0x7922, 0x48E2, 0x5185, 0x734C, 0x3986, 0x41E7, 0x6B0C, 0xBDB5, 0xD678, 0x8C30, 0x39A6, 0x2924, 0x18C3, // 0x0830 (2096) +0x2924, 0x632C, 0x736D, 0x7BAD, 0x83CF, 0x7B8E, 0x39A6, 0x1082, 0x18C3, 0x18A2, 0x9492, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0840 (2112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE37, // 0x0850 (2128) +0x98E1, 0x6122, 0x4081, 0x4861, 0x3860, 0x38C2, 0x30A1, 0x8101, 0xD9A1, 0xD9C2, 0xD9C2, 0xE1C2, 0xF1E1, 0xA982, 0x2165, 0x5248, // 0x0860 (2144) +0x4A48, 0x4208, 0x5185, 0xA142, 0xCA44, 0x8102, 0xD960, 0xD265, 0xC5F8, 0x830B, 0x78E1, 0xE1A1, 0xF1C1, 0xE9C1, 0xE1C2, 0xD1A2, // 0x0870 (2160) +0xC162, 0x9943, 0x8142, 0x6122, 0x30E3, 0x5903, 0xB1A3, 0xB182, 0xB9A2, 0xB1A3, 0xA182, 0x9963, 0x9183, 0xB9A3, 0xA982, 0x9942, // 0x0880 (2176) +0x8942, 0x9962, 0xA982, 0xC1C3, 0x6902, 0x38C2, 0x838D, 0x4A48, 0x5AAA, 0x9C90, 0xBD94, 0x9470, 0x4A08, 0x20E3, 0x18A2, 0x2904, // 0x0890 (2192) +0xB5F7, 0xB470, 0x80C0, 0x7207, 0x630B, 0x7B8D, 0x83CE, 0x2924, 0x18C3, 0x1081, 0x630B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08A0 (2208) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEFB, // 0x08B0 (2224) +0xA163, 0x6922, 0x40A1, 0x3881, 0x3060, 0x30A1, 0x3082, 0x9121, 0xE1C2, 0xE1C1, 0xE1C2, 0xE9E1, 0xF9E2, 0xB182, 0x18C3, 0x18E3, // 0x08C0 (2240) +0x18E3, 0x18E3, 0x18C2, 0x6101, 0xD203, 0x9122, 0xD181, 0xD940, 0xCC2D, 0x8C51, 0x5923, 0x9121, 0x8962, 0x7122, 0x50E2, 0x6164, // 0x08D0 (2256) +0x7964, 0x40E2, 0x6923, 0x7122, 0x7142, 0x8183, 0xA162, 0xB163, 0x9962, 0xA1C3, 0xD285, 0xDA44, 0xE265, 0xF223, 0xC9A2, 0xB183, // 0x08E0 (2272) +0xC9A2, 0xD182, 0xA162, 0xB962, 0x7122, 0x3924, 0x5A89, 0x5A89, 0x83AD, 0xAD13, 0x9450, 0x2945, 0x2104, 0x20E3, 0x18A2, 0xAD75, // 0x08F0 (2288) +0xFF5C, 0xD266, 0x8080, 0xC513, 0xB5D7, 0x62EB, 0x9450, 0x6B0B, 0x18A2, 0x18E3, 0x18C3, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0900 (2304) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77E, // 0x0910 (2320) +0xA1C5, 0x7922, 0x3881, 0x3081, 0x3081, 0x38C2, 0x3082, 0x9921, 0xE1A1, 0xE1C1, 0xE9C1, 0xE9C1, 0xF9E1, 0xB161, 0x18E3, 0x2924, // 0x0920 (2336) +0x2104, 0x2104, 0x28C2, 0x8123, 0xA9E3, 0x8941, 0xB9A2, 0xE9A1, 0xD1A1, 0xC595, 0xA32C, 0x68E0, 0x38E2, 0x58E3, 0x7942, 0x9205, // 0x0930 (2352) +0x6943, 0xD1A2, 0xC9C2, 0xC9A1, 0xC9C2, 0x8983, 0x9962, 0xE9C2, 0xC9A1, 0xC182, 0xE9A2, 0xF1C2, 0xE9A1, 0xE1C1, 0xA963, 0x9182, // 0x0940 (2368) +0xC9C2, 0xC9A2, 0xA962, 0x9182, 0x41C6, 0x3186, 0x41E7, 0x9450, 0x83CD, 0x5AAA, 0x41C6, 0x3986, 0x2924, 0x1061, 0x7BAE, 0xFFFF, // 0x0950 (2384) +0xE3CE, 0xC8C0, 0xA0C0, 0xCCD1, 0xFFFF, 0x8C30, 0x9471, 0x9C71, 0x2945, 0x20E3, 0x0861, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0960 (2400) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, // 0x0970 (2416) +0x91C6, 0x8101, 0x40A1, 0x3060, 0x3861, 0x38C2, 0x38A2, 0xA162, 0xE1C1, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9E1, 0xB161, 0x20A2, 0x40E2, // 0x0980 (2432) +0x48E1, 0x48E2, 0x60C1, 0xB1A2, 0xDA03, 0xB1C3, 0xB1C3, 0xC203, 0xF308, 0xC34A, 0xC5B4, 0xB9A3, 0x9100, 0xF1E2, 0xE203, 0x81C5, // 0x0990 (2448) +0x9982, 0xE1E2, 0xC161, 0xC9A2, 0xB1A3, 0x9942, 0xB1A2, 0xF1C2, 0xD1A2, 0x9962, 0xB982, 0xC9C2, 0xE9C2, 0xD982, 0xB181, 0xC1A3, // 0x09A0 (2464) +0xB9C3, 0xC9A3, 0xD182, 0xB204, 0x4A49, 0x5AAA, 0x8C0E, 0x5AA9, 0x736C, 0xC5D5, 0x83EF, 0x3165, 0x20E3, 0x2945, 0xD699, 0xD69A, // 0x09B0 (2480) +0x9183, 0xB1A3, 0xD940, 0xAA47, 0xFFFF, 0xCE38, 0xA4B1, 0xB554, 0x4207, 0x1061, 0x4208, 0xF79D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09C0 (2496) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x09D0 (2512) +0x9227, 0x88E1, 0x4081, 0x3861, 0x3881, 0x38E2, 0x38A2, 0xA941, 0xE1C1, 0xE9C1, 0xF1E1, 0xF1C1, 0xF9E1, 0xA161, 0x3081, 0xC9A2, // 0x09E0 (2528) +0xD9C1, 0xE1C2, 0xE1C2, 0xC204, 0xAA05, 0x6142, 0x60E1, 0xB2C8, 0xDC0D, 0x98E0, 0xB4D2, 0xCDB4, 0x9A46, 0xE160, 0xB1E4, 0x7163, // 0x09F0 (2544) +0xD9C3, 0xB1C2, 0xB9C3, 0xB1A3, 0xB9A3, 0xD1E2, 0xD9A2, 0xE9C1, 0xD1A1, 0xA142, 0x5922, 0x9962, 0xF1C1, 0xE9A1, 0xE1A1, 0xEA24, // 0x0A00 (2560) +0xE1E3, 0xC9A2, 0xB982, 0x7963, 0x6AEA, 0x41E8, 0x5248, 0x6B2B, 0xC5B5, 0xCE16, 0x62CB, 0x20C3, 0x10C3, 0x6A48, 0xB266, 0x8142, // 0x0A10 (2576) +0x9921, 0xD9C3, 0xE9A1, 0xA100, 0xD639, 0xF79D, 0xAD13, 0xCDF6, 0x6B0B, 0x0821, 0x5269, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A20 (2592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A30 (2608) +0xAAC9, 0x80C1, 0x48A1, 0x2880, 0x3861, 0x40E2, 0x48C2, 0xB961, 0xE9C1, 0xE9C1, 0xF1E1, 0xF1C1, 0xF9E1, 0xB161, 0x7101, 0xE1C2, // 0x0A40 (2624) +0xE9E2, 0xE1C1, 0xE1E2, 0xC1A2, 0x8121, 0xA141, 0x8100, 0xCB6B, 0xEC4E, 0x90E0, 0x8142, 0x8B6D, 0xC5F6, 0xD3ED, 0x7122, 0xB960, // 0x0A50 (2640) +0xF9E2, 0xB9A2, 0xD1C2, 0xCA03, 0xA982, 0xB9A2, 0xA162, 0xA982, 0xA982, 0xA962, 0x9962, 0xC182, 0xF1C1, 0xD9A2, 0xE1A1, 0xE1E3, // 0x0A60 (2656) +0xD1A2, 0xE9A2, 0xA982, 0x38A1, 0x730A, 0x5269, 0x41C7, 0x62CA, 0x83CE, 0x6B0B, 0x3165, 0x20C4, 0x2966, 0xAA46, 0xF140, 0xE160, // 0x0A70 (2672) +0xF1A1, 0xC182, 0xC1A2, 0xD0E0, 0xB3EE, 0xF7FF, 0xB574, 0xD678, 0x83CE, 0x1082, 0x18C3, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A80 (2688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A90 (2704) +0xBBAD, 0x88C1, 0x48C2, 0x2861, 0x3840, 0x40C2, 0x48E2, 0xC182, 0xE1E2, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9C1, 0xC1C3, 0xAA66, 0xA942, // 0x0AA0 (2720) +0xF1C1, 0xC1C3, 0xA162, 0xF1C2, 0xF1C2, 0xF9E1, 0xC141, 0xB2A7, 0xAB4A, 0x78E1, 0xA961, 0x9900, 0x7A06, 0xAD74, 0xBCB1, 0xE224, // 0x0AB0 (2736) +0xC961, 0x9101, 0xB962, 0xC9E2, 0x8121, 0x50A2, 0x7142, 0x8142, 0xA982, 0xA183, 0xC982, 0x8941, 0xB162, 0xD9E2, 0xC981, 0xC182, // 0x0AC0 (2752) +0xA962, 0xE1C1, 0x9162, 0x4123, 0x5228, 0x732C, 0x3985, 0x5269, 0x734C, 0x39A6, 0x2924, 0x20C4, 0x31A6, 0x9983, 0xE9A1, 0xE9A1, // 0x0AD0 (2768) +0xE9A1, 0xD161, 0xC182, 0xB921, 0x9205, 0xD638, 0xCDF7, 0xE6D9, 0x8C2F, 0x18C3, 0x1061, 0x840F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AE0 (2784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AF0 (2800) +0xBC51, 0x90C0, 0x50C1, 0x2881, 0x2840, 0x30E2, 0x40E2, 0xC982, 0xD9E2, 0xE9E1, 0xF1C1, 0xF1C1, 0xF1E1, 0xBA24, 0x89E5, 0xA163, // 0x0B00 (2816) +0xF9E2, 0xC1E3, 0xC1A2, 0xE9C1, 0xE9C1, 0xE9C1, 0xF1E1, 0xE181, 0xA100, 0xA162, 0xC182, 0xC182, 0xB141, 0x7903, 0x93CE, 0xC574, // 0x0B10 (2832) +0x9B0B, 0x92EA, 0xB205, 0xB920, 0x8247, 0x8AEA, 0x90E0, 0x9921, 0xB182, 0xB982, 0xB9A2, 0x7122, 0xA162, 0xC9A1, 0xC181, 0xC9A2, // 0x0B20 (2848) +0xB181, 0xC9A2, 0x8962, 0x31C6, 0x31A6, 0x3165, 0x5AAA, 0x6B0B, 0x62CA, 0x4A28, 0x3165, 0x18C3, 0x62A9, 0x6963, 0xB961, 0xE9A1, // 0x0B30 (2864) +0xE9A1, 0xE9E3, 0xA162, 0x8122, 0x9101, 0x8121, 0xCD74, 0xF75B, 0x8C0F, 0x18A3, 0x10A2, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B40 (2880) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B50 (2896) +0xBCD2, 0x98A0, 0xB981, 0xA161, 0xA142, 0x99C4, 0xA1A3, 0xD9A2, 0xD9A2, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9E1, 0xA9E3, 0x71C5, 0xA1A2, // 0x0B60 (2912) +0xE9C2, 0xE1A1, 0xE9C1, 0xF1E1, 0xF1E1, 0xF1C1, 0xF1C1, 0xD9A1, 0xD1A2, 0xB182, 0xB9A1, 0xA983, 0x9941, 0x6080, 0x938E, 0xBD54, // 0x0B70 (2928) +0xB513, 0xE6DB, 0xE658, 0xCC50, 0xF75D, 0xF71B, 0xC533, 0xAC70, 0xB1E4, 0x9920, 0xA183, 0xD1C2, 0xE1A1, 0xE1C1, 0xE1C1, 0xE181, // 0x0B80 (2944) +0xD1A2, 0xB142, 0x6963, 0x4207, 0x4A28, 0x5269, 0x5249, 0x5A89, 0xA4D2, 0x5269, 0x2103, 0x18C2, 0xB554, 0x8A48, 0x88E1, 0xE9A1, // 0x0B90 (2960) +0xE9A1, 0xDA24, 0xA941, 0xB961, 0xB942, 0x932B, 0xEED9, 0xEF3B, 0x734C, 0x0841, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BA0 (2976) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BB0 (2992) +0xDD74, 0xA0E0, 0xD1A2, 0xF1C1, 0xF9C1, 0xF9E2, 0xF1E2, 0xD9A1, 0xD9A2, 0xE9C1, 0xF1E2, 0xF1E2, 0xF9E1, 0xA962, 0x8944, 0xA182, // 0x0BC0 (3008) +0xD9C2, 0xD9C1, 0xC9A1, 0xD1A2, 0xD9C2, 0xB9A2, 0x9942, 0x7102, 0x5101, 0x5901, 0xA163, 0x58C1, 0x38E3, 0x5164, 0xE6B9, 0xFFFF, // 0x0BD0 (3024) +0xCDD7, 0xA491, 0xCDB6, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD40E, 0x90C0, 0x9142, 0x9101, 0x9962, 0xB162, 0x8942, 0x7A26, // 0x0BE0 (3040) +0x89C4, 0x7268, 0x49C7, 0x5A48, 0x4A29, 0x5269, 0x39A6, 0x62CB, 0x6B2C, 0x39A6, 0x2924, 0x20E3, 0xBDB6, 0xAA46, 0x9901, 0xD9A1, // 0x0BF0 (3056) +0xD181, 0xA920, 0xB141, 0xA982, 0xA122, 0xD4B0, 0xF79C, 0xE6FA, 0x5269, 0x0820, 0x9CB2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C10 (3088) +0xEE37, 0xB941, 0xC982, 0xE1C1, 0xE9C1, 0xE9C1, 0xE9C1, 0xD9A1, 0xD1A1, 0xE9C1, 0xF1C1, 0xF1E1, 0xD9A2, 0xB961, 0xB1A2, 0xA9A3, // 0x0C20 (3104) +0xB182, 0xD9E3, 0xB982, 0x7942, 0x5122, 0x4103, 0x40A1, 0x38A1, 0x50C1, 0x7942, 0x6123, 0x4902, 0xD679, 0xF79D, 0xFFFF, 0xFFFF, // 0x0C30 (3120) +0xFFFF, 0xEF1C, 0xB513, 0xB533, 0xDE78, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7BF, 0xCE17, 0xBC2F, 0xC42F, 0xA450, 0x8A47, 0xB575, 0xD6FB, // 0x0C40 (3136) +0xBAE9, 0xB3CD, 0xD679, 0x9CD3, 0x2924, 0x3165, 0x3986, 0x41C7, 0x41C7, 0x41E7, 0x2924, 0x2145, 0xB34B, 0xE181, 0xC961, 0xB962, // 0x0C50 (3152) +0xB181, 0x8901, 0x78E2, 0x78C0, 0x8247, 0xE657, 0xF77C, 0xD678, 0x3986, 0x1061, 0x4A28, 0xFFDE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C60 (3168) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xA4D3, // 0x0C70 (3184) +0x7ACA, 0xC9A2, 0xC981, 0xE1C2, 0xE9E1, 0xE9C1, 0xE9C1, 0xD1A1, 0xD1C1, 0xE9C1, 0xF1C1, 0xF1C1, 0xB982, 0xCA03, 0xC1E2, 0x8961, // 0x0C80 (3200) +0x6903, 0x8142, 0x7121, 0x48C2, 0x60A1, 0xA100, 0xCB4A, 0xD5D5, 0xA1A3, 0x8921, 0x6060, 0x8B6D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0C90 (3216) +0xFFFF, 0xFFFF, 0xFFFF, 0xD659, 0xB4F3, 0xCD96, 0xEEFB, 0xEF3C, 0xDE79, 0xC595, 0xACD2, 0xB5B6, 0xD554, 0xC32A, 0xC5F7, 0xA4D1, // 0x0CA0 (3232) +0x91A3, 0xA309, 0xCE18, 0x5AEB, 0x39A6, 0x2924, 0x3144, 0x41E7, 0x41E7, 0x2104, 0x20E3, 0x2186, 0xA9A3, 0xC9A2, 0xE1A2, 0xD961, // 0x0CB0 (3248) +0xD181, 0xB161, 0x70A0, 0x81C6, 0xEF5C, 0xF75C, 0xF77B, 0xB553, 0x2924, 0x1082, 0x630C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD6, 0x6B4C, 0x71E6, // 0x0CD0 (3280) +0x7183, 0xB9C2, 0xD1C2, 0xE9E1, 0xF1C1, 0xF223, 0xEA03, 0xD9C1, 0xD9C1, 0xF1C1, 0xE9E2, 0xC9A2, 0xD1A1, 0xDA03, 0xB1A2, 0x8123, // 0x0CE0 (3296) +0x8963, 0xB1E3, 0x7983, 0x79E4, 0xC287, 0xB2C8, 0xC533, 0xDD54, 0xA962, 0xA100, 0xA205, 0xE69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CF0 (3312) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF3C, 0xB554, 0x9C71, 0xACF3, 0xC596, 0xCDF7, 0xAC91, 0xB4D2, 0x8AA9, 0x9A26, 0xB40F, 0xC450, // 0x0D00 (3328) +0xD574, 0xFF1C, 0xB535, 0x18C3, 0x3165, 0x2924, 0x3986, 0x4A08, 0x3986, 0x2945, 0x2924, 0x2966, 0x89C4, 0xD980, 0xE140, 0xD181, // 0x0D10 (3344) +0xB161, 0xB161, 0xA121, 0xDE17, 0xF7BD, 0xEF1A, 0xEF5A, 0x738C, 0x1081, 0x8410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D20 (3360) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD34, 0x5A89, 0x41E7, 0x69E6, // 0x0D30 (3376) +0x9162, 0x8942, 0x9962, 0xC1A2, 0xB961, 0xC285, 0xC224, 0xB961, 0xB982, 0xB182, 0x8142, 0x9962, 0xD9C2, 0x8942, 0x3060, 0x78C1, // 0x0D40 (3392) +0x79E4, 0x930A, 0x8A68, 0x8ACA, 0x93CD, 0x93CF, 0xABEE, 0xD4B0, 0xCD74, 0x91E5, 0xBC2F, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D50 (3408) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xEF5C, 0xFFDF, 0xFFFF, 0xFF9D, 0xDDD6, 0xDDB6, 0xF6FA, 0xFFBE, 0xFFFF, // 0x0D60 (3424) +0xFFFF, 0xFFFF, 0xD6DB, 0x39C7, 0x2924, 0x3165, 0x39A6, 0x2945, 0x41C7, 0x3165, 0x2945, 0x2165, 0x71A4, 0xB901, 0xBA87, 0x91A4, // 0x0D70 (3440) +0x9141, 0xC900, 0xC3AC, 0xF7DF, 0xE6D9, 0xEF3B, 0xCE17, 0x39A6, 0x18C2, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D80 (3456) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD54, 0x4A48, 0x4A07, 0x5269, 0x2965, // 0x0D90 (3472) +0x3904, 0x7A06, 0x7983, 0xA162, 0x9942, 0x91C4, 0x9183, 0x9142, 0x8141, 0x8142, 0x8162, 0xA9A2, 0x8942, 0x6184, 0x9BAE, 0x92C8, // 0x0DA0 (3488) +0x99C4, 0xC4F2, 0xE6FA, 0xFFBE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD75, 0xC3CC, 0xF6FC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DB0 (3504) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520) +0xFFFF, 0xFFFF, 0xFFFF, 0x7BAE, 0x3165, 0x2945, 0x2104, 0x3165, 0x39A6, 0x4208, 0x3986, 0x20E4, 0x6ACA, 0xE6BA, 0xF7FF, 0xB4D2, // 0x0DD0 (3536) +0x98E0, 0xA182, 0xD638, 0xEF3B, 0xE6D9, 0xEF1A, 0x83CF, 0x2904, 0x0840, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DE0 (3552) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDA, 0x5248, 0x3986, 0x5289, 0x39A6, 0x3A08, // 0x0DF0 (3568) +0x934C, 0x9B4B, 0x9A47, 0x8921, 0xA961, 0x9962, 0xB181, 0xD9C2, 0xB981, 0xA162, 0xB181, 0xC182, 0x99C3, 0xE6BA, 0xFFFF, 0xFFFF, // 0x0E00 (3584) +0xE5F6, 0xC3ED, 0xCC0E, 0xE658, 0xFFFF, 0xFFFF, 0xEF5C, 0xB3CD, 0xB36B, 0xF77D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E10 (3600) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E20 (3616) +0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x2124, 0x2103, 0x2924, 0x2924, 0x39A6, 0x41C7, 0x2924, 0x2924, 0x5ACA, 0xFFDF, 0xFFFF, 0xF7BE, // 0x0E30 (3632) +0xB1E5, 0x8901, 0xC554, 0xE6FA, 0xE6FA, 0xB574, 0x41E7, 0x20C3, 0x18C2, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C30, 0x3985, 0x41E7, 0x41E7, 0x39E8, 0xAC2F, // 0x0E50 (3664) +0xDA03, 0xB141, 0xA961, 0xAA46, 0xB3AD, 0xC981, 0x9121, 0x8121, 0x7142, 0x60C0, 0xA100, 0xD9A1, 0xD1E1, 0xEB69, 0xEDD5, 0xFFFF, // 0x0E60 (3680) +0xFFFF, 0xFFFF, 0xDE58, 0x9A27, 0xA30A, 0xCCF2, 0xA246, 0x99C4, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E70 (3696) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712) +0xFFFF, 0xFFFF, 0xFFFF, 0x9CB2, 0x18C3, 0x3186, 0x2924, 0x2924, 0x3186, 0x2104, 0x2904, 0x3165, 0x39C6, 0x9CB2, 0xE71C, 0xDEFB, // 0x0E90 (3728) +0xBD13, 0xA36B, 0xD616, 0xE6FA, 0xC5D6, 0x5ACA, 0x20E3, 0x5269, 0xDEDA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EA0 (3744) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x4A49, 0x3165, 0x39A6, 0x2924, 0x8C0F, 0xE265, // 0x0EB0 (3760) +0xE1A1, 0x9162, 0xC181, 0x9942, 0x8C30, 0xC1E3, 0x81A4, 0x4944, 0x50C1, 0xA3AC, 0xCBED, 0xB161, 0xD140, 0xE980, 0xEA65, 0xE349, // 0x0EC0 (3776) +0xD46F, 0xF79C, 0xEF7C, 0xC267, 0x7880, 0x8983, 0x81A3, 0x8944, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0ED0 (3792) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EE0 (3808) +0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x3186, 0x2103, 0x3145, 0x3165, 0x2945, 0x2904, 0x2904, 0x3145, 0x39C6, 0x5A8A, 0xB554, 0xCE17, // 0x0EF0 (3824) +0xCE57, 0xD658, 0xDE79, 0xBD75, 0x734C, 0x3986, 0x20C3, 0xD699, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, 0x2904, 0x2944, 0x20E3, 0x4A28, 0xB40F, 0xB941, // 0x0F10 (3856) +0xB981, 0xA9C3, 0xB1A2, 0x80E1, 0x6269, 0xBCF2, 0xC553, 0x4207, 0x0841, 0xB5B6, 0xFFFF, 0xE679, 0xAB4B, 0xA942, 0xD1C3, 0xEB07, // 0x0F20 (3872) +0xCA04, 0xBA67, 0xA1C4, 0xB961, 0x9206, 0xDEBA, 0xEF3B, 0xDDB5, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F30 (3888) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F40 (3904) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x1882, 0x3165, 0x2924, 0x20E3, 0x2924, 0x3186, 0x2924, 0x3165, 0x4A28, 0x6B2B, 0xA4F2, // 0x0F50 (3920) +0xBDB5, 0xB553, 0x9471, 0x732C, 0x41C7, 0x18A2, 0x1082, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F60 (3936) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BCE, 0x1062, 0x20C3, 0x1081, 0x738E, 0xD329, 0xB940, // 0x0F70 (3952) +0xA982, 0xB9C2, 0xB9A3, 0x70E1, 0x6227, 0xE6FA, 0xE6F9, 0x41A6, 0x1061, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE78, 0xAB6A, 0xB141, // 0x0F80 (3968) +0x9982, 0xA9E4, 0xB224, 0xC9A1, 0xB30A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FA0 (4000) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x18A2, 0x20E3, 0x20E3, 0x3165, 0x3186, 0x20E3, 0x2924, 0x39A6, 0x5269, 0x6B2B, // 0x0FB0 (4016) +0x7BAD, 0x736C, 0x62CA, 0x39A6, 0x1882, 0x5269, 0x8430, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0821, 0x18A2, 0x1082, 0x8430, 0xDB49, 0xD960, // 0x0FD0 (4048) +0x9962, 0x8142, 0xC182, 0x68E1, 0x7902, 0xEDF5, 0xD678, 0x3144, 0x20E3, 0xD699, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE679, // 0x0FE0 (4064) +0xA288, 0x8901, 0xBA04, 0xCAA6, 0x8AA8, 0xA4B1, 0x8C10, 0x9451, 0xAD34, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FF0 (4080) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x20C3, 0x20C3, 0x2904, 0x2924, 0x20E3, 0x20E3, 0x2945, 0x2924, 0x3145, 0x41E7, // 0x1010 (4112) +0x4A28, 0x41A6, 0x2924, 0x18A2, 0x41C7, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1020 (4128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x83EF, 0x0820, 0x18C3, 0x1082, 0x7C0F, 0xDB8B, 0xB100, // 0x1030 (4144) +0x9983, 0x8942, 0x80A0, 0x71C5, 0xC574, 0xF73A, 0xACF2, 0x18A2, 0x41C7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1040 (4160) +0xED94, 0x9942, 0x8AC9, 0x9C2F, 0x8BEF, 0x62A9, 0x41C6, 0x41C6, 0x3145, 0x4A07, 0xA4F3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1050 (4176) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1060 (4192) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CB3, 0x1882, 0x20E3, 0x28E3, 0x20C3, 0x2924, 0x3165, 0x20E3, 0x2924, 0x2944, // 0x1070 (4208) +0x2904, 0x20E3, 0x1882, 0x18A2, 0x5249, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1080 (4224) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB575, 0x1021, 0x18C3, 0x1081, 0x4A28, 0x9A88, 0x8183, // 0x1090 (4240) +0xA941, 0xC1C3, 0xB32A, 0xD5D6, 0xE75B, 0xE6FA, 0x5AAA, 0x0820, 0x8C30, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10A0 (4256) +0xC5F7, 0x93CD, 0x9C90, 0x7BAE, 0x39E6, 0x3164, 0x3145, 0x2924, 0x2924, 0x2104, 0x18A2, 0x7BCF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10B0 (4272) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10C0 (4288) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDB6, 0x3145, 0x1041, 0x18A2, 0x2924, 0x2104, 0x18C3, 0x3165, 0x18C3, // 0x10D0 (4304) +0x1882, 0x18C2, 0x8C71, 0xCE58, 0xBDB6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10E0 (4320) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x2924, 0x1082, 0x18C3, 0x2904, 0x736D, 0xC5B6, // 0x10F0 (4336) +0xD594, 0xD658, 0xE73C, 0xE73B, 0xEEFA, 0x8C2F, 0x2104, 0x2945, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC5F7, // 0x1100 (4352) +0x7BAD, 0x83CE, 0x630B, 0x3986, 0x2924, 0x2124, 0x18A3, 0x18C2, 0x18A2, 0x18C3, 0x2924, 0x1882, 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1110 (4368) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1120 (4384) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x7BCF, 0x3165, 0x18A2, 0x20E3, 0x2904, 0x1061, 0x6B2C, // 0x1130 (4400) +0x94B2, 0x39E7, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1140 (4416) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C30, 0x0000, 0x18C3, 0x18C3, 0x39C6, 0x9491, // 0x1150 (4432) +0xCE78, 0xD678, 0xD657, 0xCE16, 0x8C0F, 0x39A6, 0x1061, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x62CA, // 0x1160 (4448) +0x6B0B, 0x5A89, 0x3185, 0x2944, 0x20E3, 0x39A6, 0x736D, 0x8C2F, 0x83CE, 0x39A7, 0x18C3, 0x20E3, 0x39C7, 0xEF7D, 0xFFFF, 0xFFFF, // 0x1170 (4464) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1180 (4480) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0xB575, 0xB596, 0xB596, 0x630C, 0xE75D, // 0x1190 (4496) +0xFFFF, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11A0 (4512) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x5249, 0x0000, 0x20C3, 0x2924, 0x4A08, // 0x11B0 (4528) +0x736D, 0x8BCE, 0x83AE, 0x5AAA, 0x2924, 0x0861, 0x9CD2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x738E, 0x41E7, // 0x11C0 (4544) +0x4A48, 0x39A6, 0x2945, 0x20E3, 0x6B8D, 0xD6DA, 0xEF9E, 0xEF7D, 0xD658, 0xC5D6, 0x4A28, 0x18A2, 0x18A2, 0xAD75, 0xFFFF, 0xFFFF, // 0x11D0 (4560) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11E0 (4576) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11F0 (4592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1200 (4608) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x528A, 0x0861, 0x0841, 0x1882, // 0x1210 (4624) +0x20E3, 0x2904, 0x18C3, 0x0841, 0x3186, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x3185, 0x41E7, // 0x1220 (4640) +0x39C7, 0x2924, 0x2904, 0x7C0F, 0xBCB1, 0xE3AA, 0xDAE8, 0xE4F2, 0xD679, 0xDEB9, 0xBD94, 0x2903, 0x18A2, 0x8410, 0xFFFF, 0xFFFF, // 0x1230 (4656) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1240 (4672) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1250 (4688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1260 (4704) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x6B4D, 0x4A28, // 0x1270 (4720) +0x39C6, 0x4207, 0x5ACA, 0x9CD3, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x630C, 0x2924, 0x3986, // 0x1280 (4736) +0x2945, 0x20C3, 0x630B, 0xB554, 0x936C, 0xD100, 0xF1A1, 0xE120, 0xDBCC, 0xDF3C, 0xE6B9, 0x5AAA, 0x1061, 0x62EC, 0xFFFF, 0xFFFF, // 0x1290 (4752) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12A0 (4768) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12B0 (4784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12C0 (4800) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x12D0 (4816) +0xF7BE, 0xFFDE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x3165, 0x2944, 0x3165, // 0x12E0 (4832) +0x20E3, 0x4A8A, 0xD554, 0xC9C4, 0xB203, 0xDA02, 0xE1E1, 0xE9A2, 0xD9E3, 0xCD53, 0xCE58, 0x7BAD, 0x0841, 0x528A, 0xFFFF, 0xFFFF, // 0x12F0 (4848) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1300 (4864) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1310 (4880) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1320 (4896) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1330 (4912) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CD3, 0x18C2, 0x3145, 0x2924, // 0x1340 (4928) +0x1882, 0x94D3, 0xFC4D, 0xF140, 0xF2A6, 0xE4CF, 0xCA66, 0xC982, 0xE1E3, 0xA3CD, 0xC637, 0x8C0F, 0x0820, 0x528A, 0xFFFF, 0xFFFF, // 0x1350 (4944) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1360 (4960) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1370 (4976) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1380 (4992) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1390 (5008) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6B4C, 0x1082, 0x2924, 0x20E3, // 0x13A0 (5024) +0x2945, 0xC5D6, 0xEA44, 0xF1A1, 0xE224, 0xE285, 0xE2C7, 0xB1C3, 0xB163, 0xB4F1, 0xDED9, 0x7B8D, 0x1041, 0x738E, 0xFFFF, 0xFFFF, // 0x13B0 (5040) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13C0 (5056) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13D0 (5072) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13E0 (5088) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x13F0 (5104) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x1082, 0x2924, 0x20E3, // 0x1400 (5120) +0x41E7, 0xDE99, 0xDA24, 0xF1E1, 0xD9A2, 0xB962, 0xDA86, 0xA9C4, 0x99E5, 0xFF9D, 0xF77C, 0x4A48, 0x0841, 0xA514, 0xFFFF, 0xFFFF, // 0x1410 (5136) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1420 (5152) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1430 (5168) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1440 (5184) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1450 (5200) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x1082, 0x2124, 0x18C3, // 0x1460 (5216) +0x41E8, 0xDE99, 0xD246, 0xF1E2, 0xE9E2, 0xB9A3, 0x9162, 0x88C0, 0xCC90, 0xFFFF, 0xCE17, 0x2944, 0x2103, 0xD69A, 0xFFFF, 0xFFFF, // 0x1470 (5232) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1480 (5248) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1490 (5264) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14A0 (5280) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x14B0 (5296) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x1081, 0x2124, 0x18C2, // 0x14C0 (5312) +0x31A6, 0xD69A, 0xD328, 0xF180, 0xF1C1, 0xF202, 0xD141, 0xCB8B, 0xEFBD, 0xFFDD, 0x7BAD, 0x1081, 0x5ACB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14D0 (5328) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14E0 (5344) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14F0 (5360) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1500 (5376) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1510 (5392) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9492, 0x0861, 0x2104, 0x20E3, // 0x1520 (5408) +0x2924, 0xBE18, 0xE595, 0xC9E3, 0xCA44, 0xD182, 0xCB6A, 0xE75B, 0xFFFE, 0xBDD5, 0x3165, 0x18A2, 0xC5F7, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1530 (5424) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1540 (5440) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1550 (5456) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1560 (5472) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1570 (5488) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x10A2, 0x20E3, 0x2104, // 0x1580 (5504) +0x20E3, 0x7BCE, 0xDE58, 0xB40E, 0x83EF, 0xB513, 0xDF1A, 0xFFBD, 0xCE57, 0x4A48, 0x1061, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1590 (5520) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15A0 (5536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15B0 (5552) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15C0 (5568) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15D0 (5584) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A49, 0x1081, 0x2103, // 0x15E0 (5600) +0x20E3, 0x3165, 0x9CB1, 0xBDB5, 0xAD14, 0xE71B, 0xE6FA, 0xB553, 0x5A89, 0x18A2, 0x39A6, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15F0 (5616) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1600 (5632) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1610 (5648) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1620 (5664) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1630 (5680) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE38, 0x1082, 0x18A2, // 0x1640 (5696) +0x20E3, 0x2124, 0x39A6, 0x7B6D, 0x9450, 0x9450, 0x7B8E, 0x4207, 0x20C3, 0x2104, 0xD679, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1650 (5712) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1660 (5728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1670 (5744) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1680 (5760) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1690 (5776) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x18C3, // 0x16A0 (5792) +0x1082, 0x18C2, 0x2104, 0x3165, 0x39A6, 0x39A6, 0x2944, 0x1061, 0x3165, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16B0 (5808) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16C0 (5824) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16D0 (5840) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16E0 (5856) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16F0 (5872) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xB5B6, // 0x1700 (5888) +0x4A28, 0x2104, 0x1061, 0x0820, 0x0820, 0x1061, 0x2944, 0x7BAE, 0xEF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1710 (5904) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1720 (5920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1730 (5936) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1740 (5952) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1750 (5968) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1760 (5984) +0xFFDF, 0xD6BA, 0xB596, 0x9CD3, 0x9CD3, 0xB596, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1770 (6000) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1780 (6016) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1790 (6032) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17A0 (6048) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17B0 (6064) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17C0 (6080) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17D0 (6096) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17E0 (6112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17F0 (6128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1800 (6144) +}; + diff --git a/examples/drawBitmap_kbv/bitmap_mono.h b/examples/drawBitmap_kbv/bitmap_mono.h new file mode 100644 index 0000000..938aef0 --- /dev/null +++ b/examples/drawBitmap_kbv/bitmap_mono.h @@ -0,0 +1,343 @@ +// http://skaarhoj.com/FreeStuff/GraphicDisplayImageConverter.php + +// width x height = 64,64 +static const uint8_t magnify_inv_64x64[] PROGMEM = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xfc,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xe0,0x00,0x7f,0xff,0xff,0xff, + 0xff,0xff,0x80,0x00,0x1f,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xff, + 0xff,0xfc,0x00,0x00,0x03,0xff,0xff,0xff, + 0xff,0xf8,0x00,0x00,0x01,0xff,0xff,0xff, + 0xff,0xf0,0x00,0x40,0x01,0xff,0xff,0xff, + 0xff,0xf0,0x07,0xfe,0x00,0xff,0xff,0xff, + 0xff,0xe0,0x0f,0xff,0x00,0x7f,0xff,0xff, + 0xff,0xc0,0x3f,0xff,0xc0,0x7f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xc0,0x3f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0xc0,0x3f,0xff,0xc0,0x7f,0xff,0xff, + 0xff,0xe0,0x1f,0xff,0x00,0x7f,0xff,0xff, + 0xff,0xf0,0x07,0xfe,0x00,0x7f,0xff,0xff, + 0xff,0xf0,0x00,0xf0,0x00,0x7f,0xff,0xff, + 0xff,0xf8,0x00,0x00,0x00,0x3f,0xff,0xff, + 0xff,0xfc,0x00,0x00,0x00,0x1f,0xff,0xff, + 0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff, + 0xff,0xff,0x80,0x00,0x10,0x07,0xff,0xff, + 0xff,0xff,0xe0,0x00,0x78,0x03,0xff,0xff, + 0xff,0xff,0xfc,0x03,0xfc,0x01,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfe,0x00,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0x00,0x7f,0xff, + 0xff,0xff,0xff,0xff,0xff,0x80,0x3f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xc0,0x1f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xe0,0x0f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff, + 0xff,0xff,0xff,0xff,0xff,0xf8,0x03,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfc,0x01,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x7f, + 0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x3f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x7f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +}; + +// width x height = 64,64 +static const uint8_t magnify_64x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x03,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1f,0xff,0x80,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xff,0xe0,0x00,0x00,0x00, + 0x00,0x00,0xff,0xff,0xf0,0x00,0x00,0x00, + 0x00,0x03,0xff,0xff,0xfc,0x00,0x00,0x00, + 0x00,0x07,0xff,0xff,0xfe,0x00,0x00,0x00, + 0x00,0x0f,0xff,0xbf,0xfe,0x00,0x00,0x00, + 0x00,0x0f,0xf8,0x01,0xff,0x00,0x00,0x00, + 0x00,0x1f,0xf0,0x00,0xff,0x80,0x00,0x00, + 0x00,0x3f,0xc0,0x00,0x3f,0x80,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x3f,0xc0,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x3f,0xc0,0x00,0x3f,0x80,0x00,0x00, + 0x00,0x1f,0xe0,0x00,0xff,0x80,0x00,0x00, + 0x00,0x0f,0xf8,0x01,0xff,0x80,0x00,0x00, + 0x00,0x0f,0xff,0x0f,0xff,0x80,0x00,0x00, + 0x00,0x07,0xff,0xff,0xff,0xc0,0x00,0x00, + 0x00,0x03,0xff,0xff,0xff,0xe0,0x00,0x00, + 0x00,0x01,0xff,0xff,0xff,0xf0,0x00,0x00, + 0x00,0x00,0x7f,0xff,0xef,0xf8,0x00,0x00, + 0x00,0x00,0x1f,0xff,0x87,0xfc,0x00,0x00, + 0x00,0x00,0x03,0xfc,0x03,0xfe,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0xff,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xff,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0x7f,0xc0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x1f,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x00, + 0x00,0x00,0x00,0x00,0x00,0x07,0xfc,0x00, + 0x00,0x00,0x00,0x00,0x00,0x03,0xfe,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xc0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +// width x height = 96,64 (768 bytes) +static const uint8_t camera_96x64[] PROGMEM = { + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x01,0xff,0x00,0x0f,0xff, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x0f,0xff, + 0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x7f,0x00,0x0f,0xff, + 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0xc0,0x03,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x7f,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xc0,0x1f,0xf8,0x03,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x3f,0xfc,0x01,0xff,0xff,0xff,0xc0, + 0x01,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x80, + 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x07,0xff,0xff,0xe0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x07,0xff,0xff,0xe0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x03,0xff,0xff,0xc0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x03,0xff,0xff,0xc0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x01,0xff,0xff,0x80,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x7f,0xfe,0x01,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x1f,0xf8,0x01,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xc0,0x03,0xc0,0x03,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0x80,0x01,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +// width x height = 96,64 +static const uint8_t camera_inv_96x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xfe,0x00,0xff,0xf0,0x00, + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xf0,0x00, + 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0x80,0xff,0xf0,0x00, + 0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x01,0xff,0xff,0xff,0xff, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0x3f,0xfc,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0x80,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x3f,0xe0,0x07,0xfc,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0xc0,0x03,0xfe,0x00,0x00,0x00,0x3f, + 0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x7f, + 0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf8,0x00,0x00,0x1f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xf8,0x00,0x00,0x1f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xfc,0x00,0x00,0x3f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xfc,0x00,0x00,0x3f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0xfe,0x00,0x00,0x7f,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0x80,0x01,0xfe,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0xe0,0x07,0xfe,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x3f,0xfc,0x3f,0xfc,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +}; + +// width x height = 128,64 (1024 bytes) +static const uint8_t tractor_128x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x31,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x28,0x70,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x24,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x23,0x38,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x23,0xec,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x1f,0x84,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x03,0xf8,0x7c,0x00,0x00,0x00,0x1b,0x84,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0f,0xff,0xff,0xfc,0x00,0x00,0x0e,0x44,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x80,0x00,0x1f,0xff,0xfc,0x06,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x39,0x00,0x00,0x00,0x30,0x1e,0x6f,0x9f,0xc0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x01,0xfc,0xff,0xe0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x79,0x00,0x09,0x00,0x08,0x00,0xf8,0xff,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf9,0x80,0xf0,0x12,0x4a,0x22,0xf1,0xfe,0x07,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7c,0x04,0x28,0x00,0x08,0x00,0xf3,0xf3,0xfd,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7f,0xf2,0x09,0xff,0xc8,0x00,0xf3,0xf0,0x0c,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7c,0x01,0x2f,0xff,0xef,0xff,0x67,0xeb,0xe4,0x78,0x00,0x00,0x00,0x00, + 0x00,0x01,0xff,0xfd,0xbf,0xff,0xc0,0x00,0x7f,0x0f,0xe0,0x38,0x00,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xfd,0x7f,0xff,0xcf,0xff,0xff,0x90,0x20,0x1c,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3c,0x01,0x3f,0xff,0xef,0xff,0xff,0x81,0x00,0x0e,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfd,0x3c,0x03,0xef,0xff,0xff,0x67,0x0f,0xce,0x00,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xfc,0x3f,0xff,0xef,0xf0,0xfc,0x5f,0x9f,0xe6,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x3f,0xff,0xef,0xc1,0x3c,0x70,0x3f,0xe7,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0x3f,0xff,0xff,0x87,0xbe,0xc0,0x70,0x73,0x80,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0xbf,0xff,0xff,0x87,0xde,0x00,0x67,0xb3,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x9b,0x80,0xe0,0x07,0xdc,0x0e,0xef,0xdf,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x83,0x80,0xe0,0x07,0x59,0xbc,0xdf,0xef,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0x93,0xc0,0xe0,0x77,0x50,0x70,0xe1,0xef,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x9f,0xff,0xe0,0x77,0xd8,0xe0,0x80,0xdf,0x80,0x00,0x00,0x00, + 0x00,0x00,0x5f,0xe0,0x9f,0xff,0xe0,0x7a,0xd9,0x80,0x80,0xd7,0xc0,0x00,0x00,0x00, + 0x00,0x01,0xbf,0xfc,0x9f,0xff,0xe0,0xfa,0xbd,0x08,0x80,0xd7,0x80,0x00,0x00,0x00, + 0x00,0x02,0xfc,0x00,0x1f,0xe0,0xf3,0xfc,0x7c,0x1c,0x80,0x77,0x80,0x00,0x00,0x00, + 0x00,0x05,0x3f,0xff,0xdf,0xb0,0x37,0xff,0xf2,0xb8,0x00,0x7f,0x80,0x00,0x00,0x00, + 0x00,0x0a,0x7c,0x00,0x03,0x40,0x1f,0xff,0xf1,0xf0,0x04,0x6f,0x80,0x00,0x00,0x00, + 0x00,0x14,0xfe,0x00,0x06,0x90,0x0f,0xff,0xf1,0x60,0x06,0x6f,0x80,0x00,0x00,0x00, + 0x00,0x15,0xff,0x00,0x0d,0x07,0x8f,0xfe,0xf0,0xc0,0x04,0x63,0xc0,0x00,0x00,0x00, + 0x00,0x2b,0xff,0xff,0xfc,0x4f,0xc7,0xf9,0xf9,0x80,0x04,0x77,0xc0,0x00,0x00,0x00, + 0x00,0x2b,0x9f,0xff,0xfa,0x98,0x67,0xc7,0xfd,0x0c,0x40,0x77,0x80,0x00,0x00,0x00, + 0x00,0x27,0x1f,0xff,0xfa,0xb7,0x34,0x3f,0xfe,0x1c,0x00,0xf7,0x80,0x00,0x00,0x00, + 0x00,0x37,0x01,0xff,0xf8,0x2f,0xb3,0xff,0xfa,0x3c,0x00,0xd7,0x80,0x00,0x00,0x00, + 0x00,0x37,0x00,0xff,0x9c,0x39,0xdb,0xff,0xf9,0x3c,0x00,0xc7,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1c,0xff,0x9c,0x20,0xdb,0xff,0xfc,0x78,0x21,0xaf,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1e,0x3f,0x9c,0x40,0xdb,0xff,0xfe,0xf0,0x13,0x0f,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1f,0xff,0x9c,0x42,0x5b,0xff,0xe6,0xf2,0x1e,0x5f,0x00,0x00,0x00,0x00, + 0x00,0x36,0x1f,0xff,0xfc,0x41,0x5b,0xff,0xc3,0x67,0x00,0x1e,0x00,0x00,0x00,0x00, + 0x00,0x26,0x1f,0xff,0xfc,0x0f,0x5b,0xff,0xc7,0xee,0x00,0x37,0x00,0x00,0x00,0x00, + 0x00,0x27,0x02,0xff,0xfd,0x0e,0x5b,0xff,0xc3,0xfe,0x07,0xe7,0x00,0x00,0x00,0x00, + 0x00,0x37,0x44,0xe0,0x1d,0x00,0xd7,0xff,0x81,0xfc,0xc3,0xc6,0x00,0x00,0x00,0x00, + 0x00,0x1b,0x38,0xe0,0x19,0x00,0x97,0xff,0x80,0xfc,0xc0,0x0c,0x00,0x00,0x00,0x00, + 0x00,0x13,0x81,0xe0,0x1b,0x20,0xb7,0xff,0x00,0xfd,0x80,0x18,0x00,0x00,0x00,0x00, + 0x00,0x1b,0xc3,0xc0,0x0a,0x33,0x27,0xff,0xfc,0xff,0x90,0x3f,0xe0,0x00,0x00,0x00, + 0x00,0x0f,0xff,0xc0,0x0e,0x1e,0x6f,0xff,0xff,0xff,0xb8,0xff,0xe0,0x00,0x00,0x00, + 0x00,0x3f,0xff,0x80,0x0d,0x98,0xcf,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00, + 0x03,0xff,0xff,0xff,0xfd,0x8f,0x9f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x7f,0xff,0xff,0xff,0xff,0xc0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0xff,0xff,0x83,0xff,0xc0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xe0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + + diff --git a/examples/drawBitmap_kbv/drawBitmap_kbv.ino b/examples/drawBitmap_kbv/drawBitmap_kbv.ino new file mode 100644 index 0000000..a40ae6c --- /dev/null +++ b/examples/drawBitmap_kbv/drawBitmap_kbv.ino @@ -0,0 +1,160 @@ +#include "MCUFRIEND_kbv.h" +MCUFRIEND_kbv tft; + +#define LOWFLASH (defined(__AVR_ATmega328P__) && defined(MCUFRIEND_KBV_H_)) + +#include "bitmap_mono.h" +#include "bitmap_RGB.h" + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF +#define GREY 0x8410 +#define ORANGE 0xE880 + +void setup() +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + + Serial.print(F("ID = 0x")); + Serial.println(ID, HEX); + + Serial.println(F("GFX drawBitmap() plots one mono pixel at a time")); + Serial.println(F("it defaults to transparent plotting")); + Serial.println(F("unless you specify foreground and background colours")); + Serial.println(F("it can plot a monochrome bitmap from Flash or SRAM")); + + Serial.println(F("")); + Serial.println(F("GFX drawGrayscaleBitmap() is not relevant for OLED, TFT")); + Serial.println(F("GFX drawRGBBitmap() plots one colour pixel at a time")); + Serial.println(F("from Flash or SRAM and with a monochrome transparent bitmask")); + Serial.println(F("")); + Serial.println(F("Using the hardware pushColors() methods is faster")); + Serial.println(F("pushColors() expects uint16 array in SRAM")); + Serial.println(F("for any runtime generated images")); + Serial.println(F("but it expects uint8_t array of serialised bytes in Flash")); + Serial.println(F("")); + + Serial.println(F("Colour TFTs are natively big-endian")); + Serial.println(F("Many microcontrollers and Tools are little-endian")); + Serial.println(F("you can use the optional argument to select big-end")); + tft.begin(ID); + // invertmap(betty_1_bmp + 62, 8960); + // while (1); +} + +// GFX drawBitmap() expects each row to be on 8-bit boundary. i.e. pad = 7 +// Mono BMP rows are on 32-bit boundary. i.e. pad = 31, rows are in RVS order. +// FreeFont bitmaps have no padding. i.e. pad = 0. e.g. 5x4 bitmap is in 3 bytes +void showbgd(int x, int y, const uint8_t *bmp, int w, int h, uint16_t color, uint16_t bg, uint8_t pad = 7) +{ + int yy, xx; + uint8_t first = 1, RVS = pad & 0x80; + uint16_t pixel; + pad &= 31; + uint16_t wid = (w + pad) & ~pad; //bits per row + tft.setAddrWindow(x, y, x + w - 1, y + h - 1); // + for (yy = 0; yy < h; yy++) { + uint32_t ofs = (RVS ? (h - yy - 1) : yy) * wid; //bit offset + const uint8_t *p = bmp + (ofs >> 3); //flash address + uint8_t mask = 0x80 >> (ofs & 7); //bit mask + uint8_t c = pgm_read_byte(p++); + for (xx = 0; xx < w; xx++) { + if (mask == 0) { + c = pgm_read_byte(p++); + mask = 0x80; + } + pixel = (c & mask) ? color : bg; + tft.pushColors(&pixel, 1, first); + first = 0; + mask >>= 1; + } + } + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); +} + +void msg_time(int x, int y, String msg, uint32_t t) +{ + t = millis() - t; + tft.setCursor(x, y); + tft.print(msg); + tft.print(t); + tft.print(F("ms")); +} + +void loop(void) +{ + int x = 5, y, w = 128, h = 64; + uint32_t t; + const int SZ = w * h / 8; + uint8_t sram[SZ]; + memcpy_P(sram, tractor_128x64, SZ); + + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawBitmap(x, y, tractor_128x64, 128, 64, BLUE); + msg_time(0, y + 66, F("drawBitmap() transparent flash "), t); + y = 80; t = millis(); + tft.drawBitmap(x, y, tractor_128x64, 128, 64, RED, YELLOW); + msg_time(0, y + 66, F("drawBitmap() background flash "), t); + y = 160; t = millis(); + tft.fillRect(x, y, w, h, GREY); + tft.drawBitmap(x, y, sram, 128, 64, GREEN); + msg_time(0, y + 66, F("drawBitmap() fill bgd SRAM "), t); + y = 240; t = millis(); + showbgd(x, y, tractor_128x64, 128, 64, MAGENTA, YELLOW); + msg_time(0, y + 66, F("pushColors() background flash "), t); + delay(5000); + + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawRGBBitmap(x, y, marilyn_64x64, 64, 64); + msg_time(0, y + 66, "drawRGBBitmap() flash ", t); + y = 80; t = millis(); + tft.setAddrWindow(x, y, x + 64 - 1, y + 64 - 1); + tft.pushColors((const uint8_t*)marilyn_64x64, 64 * 64, 1, false); + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); + msg_time(0, y + 66, F("pushColors() flash "), t); + y = 160; t = millis(); + w = 64; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, marilyn_64x64, magnify_64x64, 64, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + y = 240; t = millis(); + w = 64; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, marilyn_64x64, magnify_inv_64x64, 64, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + delay(5000); + +#if !LOWFLASH + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawRGBBitmap(x, y, tractor10_96x64, 96, 64); + msg_time(0, y + 66, "drawRGBBitmap() flash ", t); + y = 80; t = millis(); + tft.setAddrWindow(x, y, x + 96 - 1, y + 64 - 1); + tft.pushColors((const uint8_t*)tractor10_96x64, 96 * 64, 1, false); + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); + msg_time(0, y + 66, F("pushColors() flash "), t); + y = 160; t = millis(); + w = 96; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, tractor10_96x64, camera_96x64, 96, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + y = 240; t = millis(); + w = 96; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, tractor10_96x64, camera_inv_96x64, 96, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + delay(5000); +#endif +} + + diff --git a/extras/mcufriend_how_to.txt b/extras/mcufriend_how_to.txt index 0bb54a7..af7f937 100644 --- a/extras/mcufriend_how_to.txt +++ b/extras/mcufriend_how_to.txt @@ -17,6 +17,14 @@ 9. Any Adafruit sketch should work with the MCUFRIEND_kbv constructor() but should allow extra ID values An Adafruit constructor(cs, rs, wr, rd, rst) IGNORES any arguments. i.e. it only uses the shield control pins +MCUFRIEND_kbv inherits all the methods from +the Adafruit_GFX class: https://learn.adafruit.com/adafruit-gfx-graphics-library/overview +and Print class: https://www.arduino.cc/en/Serial/Print + +The only "new" methods are hardware related: +vertScroll(), readGRAM(), readPixel(), setAddrWindow(), pushColors(), readID(), begin() +readReg(), pushCommand(), WriteCmdData() access the controller registers + 10. It currently supports UNO shields with "mcufriend.com" pcbs with controllers: HX8347-A 240x320 ID=0x8347 #define SUPPORT_8347A *** Untested *** HX8347-D 240x320 ID=0x4747 #define SUPPORT_8347D @@ -60,7 +68,7 @@ R61580 240x320 ID=0x1580 #define SUPPORT_1580 *** Untested *** R61581 320x480 ID=0x1581 RM68090 240x320 ID=0x6809 RM68140 320x480 ID=0x6814 #define SUPPORT_68140 -S6D0139 240x320 ID=0x0139 #define SUPPORT_0139 *** Untested *** +S6D0139 240x320 ID=0x0139 #define SUPPORT_0139 (no Band Scroll) S6D0154 240x320 ID=0x0154 #define SUPPORT_0154 SPFD5408 240x320 ID=0x5408 SPFD5420 240x400 ID=0x5420 #define SUPPORT_9326_5420 @@ -109,4 +117,9 @@ It also runs on NUCLEO-F103 and TEENSY3.2 with Sparkfun Adapter 18. Please run LCD_ID_readreg.ino to verify your non-standard wiring. Paste the defines to a Forum message. +19. OPEN-SMART Shields have different wiring to regular Uno Shields: + Edit mcufriend_shield.h: #define USE_SPECIAL + Edit mcufriend_special.h: #define USE_OPENSMART_SHIELD_PINOUT + Edit MCUFRIEND_kbv.cpp: #define SUPPORT_8352B + CHANGE HISTORY: is now in "mcufriend_history.txt" diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..c90cc54 --- /dev/null +++ b/license.txt @@ -0,0 +1,85 @@ +/* + * MCUFRIEND_kbv class inherits from Adafruit_GFX class and the Arduino Print class. + * Any use of MCUFRIEND_kbv class and examples is dependent on Adafruit and Arduino licenses + * The license texts are in the accompanying license.txt file + */ + + +ADAFRUIT: Adafruit_GFX library + +Software License Agreement (BSD License) + +Copyright (c) 2012 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +ARDUINO: Print class +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +Software License Agreement (FreeBSD License) + +Copyright (c) 2018 David Prentice (https://github.com/prenticedavid/MCUFRIEND_kbv/) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^End^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/utility/mcufriend_keil.h b/utility/mcufriend_keil.h index 5e46c9d..5ce3884 100644 --- a/utility/mcufriend_keil.h +++ b/utility/mcufriend_keil.h @@ -41,7 +41,7 @@ #define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns #if defined(TEENSY) || defined(__ARM_ARCH_7EM__) // -O2: F411@100MHz = 1.44s -#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } +#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } #define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } #elif defined(__ARM_ARCH_7M__) // -O2: F103@72MHz = 2.68s #define WRITE_DELAY { } @@ -51,9 +51,9 @@ #define READ_DELAY { } #endif -#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; WR_IDLE; } #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } -#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } // read 250ns after RD_ACTIVE goes low +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; RD_IDLE; } // read 250ns after RD_ACTIVE goes low #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } #define CTL_INIT() { RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } diff --git a/utility/mcufriend_shield.h b/utility/mcufriend_shield.h index 568e9ce..f2fec7c 100644 --- a/utility/mcufriend_shield.h +++ b/utility/mcufriend_shield.h @@ -345,7 +345,8 @@ void write_8(uint8_t x) || defined(ARDUINO_NUCLEO_F030R8) || defined(ARDUINO_NUCLEO_F091RC) \ || defined(ARDUINO_NUCLEO_F103RB) || defined(ARDUINO_NUCLEO_F303RE) \ || defined(ARDUINO_NUCLEO_F401RE) || defined(ARDUINO_NUCLEO_F411RE) \ - || defined(ARDUINO_NUCLEO_L053R8) || defined(ARDUINO_NUCLEO_L476RG) \ + || defined(ARDUINO_NUCLEO_F446RE) || defined(ARDUINO_NUCLEO_L053R8) \ + || defined(ARDUINO_NUCLEO_L152RE) || defined(ARDUINO_NUCLEO_L476RG) \ ) // F1xx, F4xx, L4xx have different registers and styles. General Macros #if defined(__STM32F1__) //weird Maple Core @@ -402,13 +403,19 @@ void write_8(uint8_t x) #elif defined(STM32F401xE) #define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } -#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } #define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } #define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) #elif defined(STM32F411xE) #define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } -#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F446xx) +#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } #define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } #define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) @@ -418,9 +425,15 @@ void write_8(uint8_t x) #define GPIO_INIT() { RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN; } #define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) +#elif defined(STM32L152xE) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + #elif defined(STM32L476xx) #define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } -#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } #define GPIO_INIT() { RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOBEN | RCC_AHB2ENR_GPIOCEN; } #define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) @@ -543,9 +556,9 @@ void write_8(uint8_t x) #error REGS group #endif -#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; WR_IDLE; } #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } -#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; RD_IDLE; } #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } //################################### ESP32 ############################## diff --git a/utility/pin_shield_1.h b/utility/pin_shield_1.h index 22f61d9..dd496dd 100644 --- a/utility/pin_shield_1.h +++ b/utility/pin_shield_1.h @@ -182,7 +182,7 @@ #define PIN_INPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x4); else PIN_MODE4((port)->CRL, pin, 0x4); } //input -#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) +#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F446RE) #define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) #if __MBED__ #warning MBED knows everything @@ -196,7 +196,7 @@ #endif #elif defined(STM32L476xx) #include -#elif defined(STM32F401xE) || defined(STM32F411xE) +#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) #include #endif #define D0_PORT GPIOA diff --git a/utility/pin_shield_8.h b/utility/pin_shield_8.h index 6ffd826..c90e423 100644 --- a/utility/pin_shield_8.h +++ b/utility/pin_shield_8.h @@ -83,7 +83,7 @@ #define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFF); GP_OUT(GPIOA, CRL, 0xFF); GP_OUT(GPIOB, CRL, 0xFFF00000); } #define setReadDir() {GP_INP(GPIOA, CRH, 0xFFF); GP_INP(GPIOA, CRL, 0xFF); GP_INP(GPIOB, CRL, 0xFFF00000); } -#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) +#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F446RE) #if __MBED__ #warning MBED knows everything #elif defined(STM32F072xB) @@ -96,7 +96,7 @@ #endif #elif defined(STM32L476xx) #include -#elif defined(STM32F401xE) || defined(STM32F411xE) +#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) #include #endif // configure macros for the data pins. -00=10.06, -O1=7.85, -O1t=7.21, -O2=7.87, -O3=7.45, -O3t=7.03