diff --git a/libraries/DigitalIO/DigitalIO.h b/libraries/DigitalIO/DigitalIO.h
new file mode 100644
index 0000000..8f47bf1
--- /dev/null
+++ b/libraries/DigitalIO/DigitalIO.h
@@ -0,0 +1,36 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Fast Digital I/O functions
+ *
+ */
+#ifndef DigitalIO_h
+#define DigitalIO_h 1
+//------------------------------------------------------------------------------
+/** DigitalPin version YYYYMMDD */
+#define DIGITAL_IO_VERSION 20140217
+//------------------------------------------------------------------------------
+#include
+#include
+#include
+#include
+#include
+#endif // DigitalIO_h
\ No newline at end of file
diff --git a/libraries/DigitalIO/DigitalPin.h b/libraries/DigitalIO/DigitalPin.h
new file mode 100644
index 0000000..2c41f38
--- /dev/null
+++ b/libraries/DigitalIO/DigitalPin.h
@@ -0,0 +1,597 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Fast Digital Pin functions
+ *
+ * @defgroup digitalPin Fast Pin I/O
+ * @details Fast Digital I/O functions and template class.
+ * @{
+ */
+#ifndef DigitalPin_h
+#define DigitalPin_h
+#include
+#include
+#include
+//------------------------------------------------------------------------------
+/**
+ * @class pin_map_t
+ * @brief struct for mapping digital pins
+ */
+struct pin_map_t {
+ volatile uint8_t* ddr; /**< address of DDR for this pin */
+ volatile uint8_t* pin; /**< address of PIN for this pin */
+ volatile uint8_t* port; /**< address of PORT for this pin */
+ uint8_t bit; /**< bit number for this pin */
+};
+//------------------------------------------------------------------------------
+#if defined(__AVR_ATmega168__)\
+||defined(__AVR_ATmega168P__)\
+||defined(__AVR_ATmega328P__)
+// 168 and 328 Arduinos
+const static pin_map_t pinMap[] = {
+ {&DDRD, &PIND, &PORTD, 0}, // D0 0
+ {&DDRD, &PIND, &PORTD, 1}, // D1 1
+ {&DDRD, &PIND, &PORTD, 2}, // D2 2
+ {&DDRD, &PIND, &PORTD, 3}, // D3 3
+ {&DDRD, &PIND, &PORTD, 4}, // D4 4
+ {&DDRD, &PIND, &PORTD, 5}, // D5 5
+ {&DDRD, &PIND, &PORTD, 6}, // D6 6
+ {&DDRD, &PIND, &PORTD, 7}, // D7 7
+ {&DDRB, &PINB, &PORTB, 0}, // B0 8
+ {&DDRB, &PINB, &PORTB, 1}, // B1 9
+ {&DDRB, &PINB, &PORTB, 2}, // B2 10
+ {&DDRB, &PINB, &PORTB, 3}, // B3 11
+ {&DDRB, &PINB, &PORTB, 4}, // B4 12
+ {&DDRB, &PINB, &PORTB, 5}, // B5 13
+ {&DDRC, &PINC, &PORTC, 0}, // C0 14
+ {&DDRC, &PINC, &PORTC, 1}, // C1 15
+ {&DDRC, &PINC, &PORTC, 2}, // C2 16
+ {&DDRC, &PINC, &PORTC, 3}, // C3 17
+ {&DDRC, &PINC, &PORTC, 4}, // C4 18
+ {&DDRC, &PINC, &PORTC, 5} // C5 19
+};
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega1280__)\
+|| defined(__AVR_ATmega2560__)
+// Mega
+static const pin_map_t pinMap[] = {
+ {&DDRE, &PINE, &PORTE, 0}, // E0 0
+ {&DDRE, &PINE, &PORTE, 1}, // E1 1
+ {&DDRE, &PINE, &PORTE, 4}, // E4 2
+ {&DDRE, &PINE, &PORTE, 5}, // E5 3
+ {&DDRG, &PING, &PORTG, 5}, // G5 4
+ {&DDRE, &PINE, &PORTE, 3}, // E3 5
+ {&DDRH, &PINH, &PORTH, 3}, // H3 6
+ {&DDRH, &PINH, &PORTH, 4}, // H4 7
+ {&DDRH, &PINH, &PORTH, 5}, // H5 8
+ {&DDRH, &PINH, &PORTH, 6}, // H6 9
+ {&DDRB, &PINB, &PORTB, 4}, // B4 10
+ {&DDRB, &PINB, &PORTB, 5}, // B5 11
+ {&DDRB, &PINB, &PORTB, 6}, // B6 12
+ {&DDRB, &PINB, &PORTB, 7}, // B7 13
+ {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14
+ {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15
+ {&DDRH, &PINH, &PORTH, 1}, // H1 16
+ {&DDRH, &PINH, &PORTH, 0}, // H0 17
+ {&DDRD, &PIND, &PORTD, 3}, // D3 18
+ {&DDRD, &PIND, &PORTD, 2}, // D2 19
+ {&DDRD, &PIND, &PORTD, 1}, // D1 20
+ {&DDRD, &PIND, &PORTD, 0}, // D0 21
+ {&DDRA, &PINA, &PORTA, 0}, // A0 22
+ {&DDRA, &PINA, &PORTA, 1}, // A1 23
+ {&DDRA, &PINA, &PORTA, 2}, // A2 24
+ {&DDRA, &PINA, &PORTA, 3}, // A3 25
+ {&DDRA, &PINA, &PORTA, 4}, // A4 26
+ {&DDRA, &PINA, &PORTA, 5}, // A5 27
+ {&DDRA, &PINA, &PORTA, 6}, // A6 28
+ {&DDRA, &PINA, &PORTA, 7}, // A7 29
+ {&DDRC, &PINC, &PORTC, 7}, // C7 30
+ {&DDRC, &PINC, &PORTC, 6}, // C6 31
+ {&DDRC, &PINC, &PORTC, 5}, // C5 32
+ {&DDRC, &PINC, &PORTC, 4}, // C4 33
+ {&DDRC, &PINC, &PORTC, 3}, // C3 34
+ {&DDRC, &PINC, &PORTC, 2}, // C2 35
+ {&DDRC, &PINC, &PORTC, 1}, // C1 36
+ {&DDRC, &PINC, &PORTC, 0}, // C0 37
+ {&DDRD, &PIND, &PORTD, 7}, // D7 38
+ {&DDRG, &PING, &PORTG, 2}, // G2 39
+ {&DDRG, &PING, &PORTG, 1}, // G1 40
+ {&DDRG, &PING, &PORTG, 0}, // G0 41
+ {&DDRL, &PINL, &PORTL, 7}, // L7 42
+ {&DDRL, &PINL, &PORTL, 6}, // L6 43
+ {&DDRL, &PINL, &PORTL, 5}, // L5 44
+ {&DDRL, &PINL, &PORTL, 4}, // L4 45
+ {&DDRL, &PINL, &PORTL, 3}, // L3 46
+ {&DDRL, &PINL, &PORTL, 2}, // L2 47
+ {&DDRL, &PINL, &PORTL, 1}, // L1 48
+ {&DDRL, &PINL, &PORTL, 0}, // L0 49
+ {&DDRB, &PINB, &PORTB, 3}, // B3 50
+ {&DDRB, &PINB, &PORTB, 2}, // B2 51
+ {&DDRB, &PINB, &PORTB, 1}, // B1 52
+ {&DDRB, &PINB, &PORTB, 0}, // B0 53
+ {&DDRF, &PINF, &PORTF, 0}, // F0 54
+ {&DDRF, &PINF, &PORTF, 1}, // F1 55
+ {&DDRF, &PINF, &PORTF, 2}, // F2 56
+ {&DDRF, &PINF, &PORTF, 3}, // F3 57
+ {&DDRF, &PINF, &PORTF, 4}, // F4 58
+ {&DDRF, &PINF, &PORTF, 5}, // F5 59
+ {&DDRF, &PINF, &PORTF, 6}, // F6 60
+ {&DDRF, &PINF, &PORTF, 7}, // F7 61
+ {&DDRK, &PINK, &PORTK, 0}, // K0 62
+ {&DDRK, &PINK, &PORTK, 1}, // K1 63
+ {&DDRK, &PINK, &PORTK, 2}, // K2 64
+ {&DDRK, &PINK, &PORTK, 3}, // K3 65
+ {&DDRK, &PINK, &PORTK, 4}, // K4 66
+ {&DDRK, &PINK, &PORTK, 5}, // K5 67
+ {&DDRK, &PINK, &PORTK, 6}, // K6 68
+ {&DDRK, &PINK, &PORTK, 7} // K7 69
+};
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega1284P__)\
+|| defined(__AVR_ATmega1284__)\
+|| defined(__AVR_ATmega644P__)\
+|| defined(__AVR_ATmega644__)\
+|| defined(__AVR_ATmega64__)\
+|| defined(__AVR_ATmega32__)\
+|| defined(__AVR_ATmega324__)\
+|| defined(__AVR_ATmega16__)
+
+#ifdef defined(VARIANT_MIGHTY)
+// Mighty Layout
+static const pin_map_t pinMap[] = {
+ {&DDRB, &PINB, &PORTB, 0}, // B0 0
+ {&DDRB, &PINB, &PORTB, 1}, // B1 1
+ {&DDRB, &PINB, &PORTB, 2}, // B2 2
+ {&DDRB, &PINB, &PORTB, 3}, // B3 3
+ {&DDRB, &PINB, &PORTB, 4}, // B4 4
+ {&DDRB, &PINB, &PORTB, 5}, // B5 5
+ {&DDRB, &PINB, &PORTB, 6}, // B6 6
+ {&DDRB, &PINB, &PORTB, 7}, // B7 7
+ {&DDRD, &PIND, &PORTD, 0}, // D0 8
+ {&DDRD, &PIND, &PORTD, 1}, // D1 9
+ {&DDRD, &PIND, &PORTD, 2}, // D2 10
+ {&DDRD, &PIND, &PORTD, 3}, // D3 11
+ {&DDRD, &PIND, &PORTD, 4}, // D4 12
+ {&DDRD, &PIND, &PORTD, 5}, // D5 13
+ {&DDRD, &PIND, &PORTD, 6}, // D6 14
+ {&DDRD, &PIND, &PORTD, 7}, // D7 15
+ {&DDRC, &PINC, &PORTC, 0}, // C0 16
+ {&DDRC, &PINC, &PORTC, 1}, // C1 17
+ {&DDRC, &PINC, &PORTC, 2}, // C2 18
+ {&DDRC, &PINC, &PORTC, 3}, // C3 19
+ {&DDRC, &PINC, &PORTC, 4}, // C4 20
+ {&DDRC, &PINC, &PORTC, 5}, // C5 21
+ {&DDRC, &PINC, &PORTC, 6}, // C6 22
+ {&DDRC, &PINC, &PORTC, 7}, // C7 23
+ {&DDRA, &PINA, &PORTA, 0}, // A0 24
+ {&DDRA, &PINA, &PORTA, 1}, // A1 25
+ {&DDRA, &PINA, &PORTA, 2}, // A2 26
+ {&DDRA, &PINA, &PORTA, 3}, // A3 27
+ {&DDRA, &PINA, &PORTA, 4}, // A4 28
+ {&DDRA, &PINA, &PORTA, 5}, // A5 29
+ {&DDRA, &PINA, &PORTA, 6}, // A6 30
+ {&DDRA, &PINA, &PORTA, 7} // A7 31
+};
+#elif defined(VARIANT_BOBUINO)
+// Bobuino Layout
+static const pin_map_t pinMap[] = {
+ {&DDRD, &PIND, &PORTD, 0}, // D0 0
+ {&DDRD, &PIND, &PORTD, 1}, // D1 1
+ {&DDRD, &PIND, &PORTD, 2}, // D2 2
+ {&DDRD, &PIND, &PORTD, 3}, // D3 3
+ {&DDRB, &PINB, &PORTB, 0}, // B0 4
+ {&DDRB, &PINB, &PORTB, 1}, // B1 5
+ {&DDRB, &PINB, &PORTB, 2}, // B2 6
+ {&DDRB, &PINB, &PORTB, 3}, // B3 7
+ {&DDRD, &PIND, &PORTD, 5}, // D5 8
+ {&DDRD, &PIND, &PORTD, 6}, // D6 9
+ {&DDRB, &PINB, &PORTB, 4}, // B4 10
+ {&DDRB, &PINB, &PORTB, 5}, // B5 11
+ {&DDRB, &PINB, &PORTB, 6}, // B6 12
+ {&DDRB, &PINB, &PORTB, 7}, // B7 13
+ {&DDRA, &PINA, &PORTA, 7}, // A7 14
+ {&DDRA, &PINA, &PORTA, 6}, // A6 15
+ {&DDRA, &PINA, &PORTA, 5}, // A5 16
+ {&DDRA, &PINA, &PORTA, 4}, // A4 17
+ {&DDRA, &PINA, &PORTA, 3}, // A3 18
+ {&DDRA, &PINA, &PORTA, 2}, // A2 19
+ {&DDRA, &PINA, &PORTA, 1}, // A1 20
+ {&DDRA, &PINA, &PORTA, 0}, // A0 21
+ {&DDRC, &PINC, &PORTC, 0}, // C0 22
+ {&DDRC, &PINC, &PORTC, 1}, // C1 23
+ {&DDRC, &PINC, &PORTC, 2}, // C2 24
+ {&DDRC, &PINC, &PORTC, 3}, // C3 25
+ {&DDRC, &PINC, &PORTC, 4}, // C4 26
+ {&DDRC, &PINC, &PORTC, 5}, // C5 27
+ {&DDRC, &PINC, &PORTC, 6}, // C6 28
+ {&DDRC, &PINC, &PORTC, 7}, // C7 29
+ {&DDRD, &PIND, &PORTD, 4}, // D4 30
+ {&DDRD, &PIND, &PORTD, 7} // D7 31
+};
+#elif defined(VARIANT_STANDARD)
+// Standard Layout
+static const pin_map_t pinMap[] = {
+ {&DDRB, &PINB, &PORTB, 0}, // B0 0
+ {&DDRB, &PINB, &PORTB, 1}, // B1 1
+ {&DDRB, &PINB, &PORTB, 2}, // B2 2
+ {&DDRB, &PINB, &PORTB, 3}, // B3 3
+ {&DDRB, &PINB, &PORTB, 4}, // B4 4
+ {&DDRB, &PINB, &PORTB, 5}, // B5 5
+ {&DDRB, &PINB, &PORTB, 6}, // B6 6
+ {&DDRB, &PINB, &PORTB, 7}, // B7 7
+ {&DDRD, &PIND, &PORTD, 0}, // D0 8
+ {&DDRD, &PIND, &PORTD, 1}, // D1 9
+ {&DDRD, &PIND, &PORTD, 2}, // D2 10
+ {&DDRD, &PIND, &PORTD, 3}, // D3 11
+ {&DDRD, &PIND, &PORTD, 4}, // D4 12
+ {&DDRD, &PIND, &PORTD, 5}, // D5 13
+ {&DDRD, &PIND, &PORTD, 6}, // D6 14
+ {&DDRD, &PIND, &PORTD, 7}, // D7 15
+ {&DDRC, &PINC, &PORTC, 0}, // C0 16
+ {&DDRC, &PINC, &PORTC, 1}, // C1 17
+ {&DDRC, &PINC, &PORTC, 2}, // C2 18
+ {&DDRC, &PINC, &PORTC, 3}, // C3 19
+ {&DDRC, &PINC, &PORTC, 4}, // C4 20
+ {&DDRC, &PINC, &PORTC, 5}, // C5 21
+ {&DDRC, &PINC, &PORTC, 6}, // C6 22
+ {&DDRC, &PINC, &PORTC, 7}, // C7 23
+ {&DDRA, &PINA, &PORTA, 7}, // A7 24
+ {&DDRA, &PINA, &PORTA, 6}, // A6 25
+ {&DDRA, &PINA, &PORTA, 5}, // A5 26
+ {&DDRA, &PINA, &PORTA, 4}, // A4 27
+ {&DDRA, &PINA, &PORTA, 3}, // A3 28
+ {&DDRA, &PINA, &PORTA, 2}, // A2 29
+ {&DDRA, &PINA, &PORTA, 1}, // A1 30
+ {&DDRA, &PINA, &PORTA, 0} // A0 31
+};
+#else // VARIANT_MIGHTY
+#error Undefined variant 1284, 644, 324, 64, 32
+#endif // VARIANT_MIGHTY
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega32U4__)
+#ifdef CORE_TEENSY
+// Teensy 2.0
+static const pin_map_t pinMap[] = {
+ {&DDRB, &PINB, &PORTB, 0}, // B0 0
+ {&DDRB, &PINB, &PORTB, 1}, // B1 1
+ {&DDRB, &PINB, &PORTB, 2}, // B2 2
+ {&DDRB, &PINB, &PORTB, 3}, // B3 3
+ {&DDRB, &PINB, &PORTB, 7}, // B7 4
+ {&DDRD, &PIND, &PORTD, 0}, // D0 5
+ {&DDRD, &PIND, &PORTD, 1}, // D1 6
+ {&DDRD, &PIND, &PORTD, 2}, // D2 7
+ {&DDRD, &PIND, &PORTD, 3}, // D3 8
+ {&DDRC, &PINC, &PORTC, 6}, // C6 9
+ {&DDRC, &PINC, &PORTC, 7}, // C7 10
+ {&DDRD, &PIND, &PORTD, 6}, // D6 11
+ {&DDRD, &PIND, &PORTD, 7}, // D7 12
+ {&DDRB, &PINB, &PORTB, 4}, // B4 13
+ {&DDRB, &PINB, &PORTB, 5}, // B5 14
+ {&DDRB, &PINB, &PORTB, 6}, // B6 15
+ {&DDRF, &PINF, &PORTF, 7}, // F7 16
+ {&DDRF, &PINF, &PORTF, 6}, // F6 17
+ {&DDRF, &PINF, &PORTF, 5}, // F5 18
+ {&DDRF, &PINF, &PORTF, 4}, // F4 19
+ {&DDRF, &PINF, &PORTF, 1}, // F1 20
+ {&DDRF, &PINF, &PORTF, 0}, // F0 21
+ {&DDRD, &PIND, &PORTD, 4}, // D4 22
+ {&DDRD, &PIND, &PORTD, 5}, // D5 23
+ {&DDRE, &PINE, &PORTE, 6} // E6 24
+};
+//------------------------------------------------------------------------------
+#else // CORE_TEENSY
+// Leonardo
+static const pin_map_t pinMap[] = {
+ {&DDRD, &PIND, &PORTD, 2}, // D2 0
+ {&DDRD, &PIND, &PORTD, 3}, // D3 1
+ {&DDRD, &PIND, &PORTD, 1}, // D1 2
+ {&DDRD, &PIND, &PORTD, 0}, // D0 3
+ {&DDRD, &PIND, &PORTD, 4}, // D4 4
+ {&DDRC, &PINC, &PORTC, 6}, // C6 5
+ {&DDRD, &PIND, &PORTD, 7}, // D7 6
+ {&DDRE, &PINE, &PORTE, 6}, // E6 7
+ {&DDRB, &PINB, &PORTB, 4}, // B4 8
+ {&DDRB, &PINB, &PORTB, 5}, // B5 9
+ {&DDRB, &PINB, &PORTB, 6}, // B6 10
+ {&DDRB, &PINB, &PORTB, 7}, // B7 11
+ {&DDRD, &PIND, &PORTD, 6}, // D6 12
+ {&DDRC, &PINC, &PORTC, 7}, // C7 13
+ {&DDRB, &PINB, &PORTB, 3}, // B3 14
+ {&DDRB, &PINB, &PORTB, 1}, // B1 15
+ {&DDRB, &PINB, &PORTB, 2}, // B2 16
+ {&DDRB, &PINB, &PORTB, 0}, // B0 17
+ {&DDRF, &PINF, &PORTF, 7}, // F7 18
+ {&DDRF, &PINF, &PORTF, 6}, // F6 19
+ {&DDRF, &PINF, &PORTF, 5}, // F5 20
+ {&DDRF, &PINF, &PORTF, 4}, // F4 21
+ {&DDRF, &PINF, &PORTF, 1}, // F1 22
+ {&DDRF, &PINF, &PORTF, 0}, // F0 23
+ {&DDRD, &PIND, &PORTD, 4}, // D4 24
+ {&DDRD, &PIND, &PORTD, 7}, // D7 25
+ {&DDRB, &PINB, &PORTB, 4}, // B4 26
+ {&DDRB, &PINB, &PORTB, 5}, // B5 27
+ {&DDRB, &PINB, &PORTB, 6}, // B6 28
+ {&DDRD, &PIND, &PORTD, 6} // D6 29
+};
+#endif // CORE_TEENSY
+//------------------------------------------------------------------------------
+#elif defined(__AVR_AT90USB646__)\
+|| defined(__AVR_AT90USB1286__)
+// Teensy++ 1.0 & 2.0
+static const pin_map_t pinMap[] = {
+ {&DDRD, &PIND, &PORTD, 0}, // D0 0
+ {&DDRD, &PIND, &PORTD, 1}, // D1 1
+ {&DDRD, &PIND, &PORTD, 2}, // D2 2
+ {&DDRD, &PIND, &PORTD, 3}, // D3 3
+ {&DDRD, &PIND, &PORTD, 4}, // D4 4
+ {&DDRD, &PIND, &PORTD, 5}, // D5 5
+ {&DDRD, &PIND, &PORTD, 6}, // D6 6
+ {&DDRD, &PIND, &PORTD, 7}, // D7 7
+ {&DDRE, &PINE, &PORTE, 0}, // E0 8
+ {&DDRE, &PINE, &PORTE, 1}, // E1 9
+ {&DDRC, &PINC, &PORTC, 0}, // C0 10
+ {&DDRC, &PINC, &PORTC, 1}, // C1 11
+ {&DDRC, &PINC, &PORTC, 2}, // C2 12
+ {&DDRC, &PINC, &PORTC, 3}, // C3 13
+ {&DDRC, &PINC, &PORTC, 4}, // C4 14
+ {&DDRC, &PINC, &PORTC, 5}, // C5 15
+ {&DDRC, &PINC, &PORTC, 6}, // C6 16
+ {&DDRC, &PINC, &PORTC, 7}, // C7 17
+ {&DDRE, &PINE, &PORTE, 6}, // E6 18
+ {&DDRE, &PINE, &PORTE, 7}, // E7 19
+ {&DDRB, &PINB, &PORTB, 0}, // B0 20
+ {&DDRB, &PINB, &PORTB, 1}, // B1 21
+ {&DDRB, &PINB, &PORTB, 2}, // B2 22
+ {&DDRB, &PINB, &PORTB, 3}, // B3 23
+ {&DDRB, &PINB, &PORTB, 4}, // B4 24
+ {&DDRB, &PINB, &PORTB, 5}, // B5 25
+ {&DDRB, &PINB, &PORTB, 6}, // B6 26
+ {&DDRB, &PINB, &PORTB, 7}, // B7 27
+ {&DDRA, &PINA, &PORTA, 0}, // A0 28
+ {&DDRA, &PINA, &PORTA, 1}, // A1 29
+ {&DDRA, &PINA, &PORTA, 2}, // A2 30
+ {&DDRA, &PINA, &PORTA, 3}, // A3 31
+ {&DDRA, &PINA, &PORTA, 4}, // A4 32
+ {&DDRA, &PINA, &PORTA, 5}, // A5 33
+ {&DDRA, &PINA, &PORTA, 6}, // A6 34
+ {&DDRA, &PINA, &PORTA, 7}, // A7 35
+ {&DDRE, &PINE, &PORTE, 4}, // E4 36
+ {&DDRE, &PINE, &PORTE, 5}, // E5 37
+ {&DDRF, &PINF, &PORTF, 0}, // F0 38
+ {&DDRF, &PINF, &PORTF, 1}, // F1 39
+ {&DDRF, &PINF, &PORTF, 2}, // F2 40
+ {&DDRF, &PINF, &PORTF, 3}, // F3 41
+ {&DDRF, &PINF, &PORTF, 4}, // F4 42
+ {&DDRF, &PINF, &PORTF, 5}, // F5 43
+ {&DDRF, &PINF, &PORTF, 6}, // F6 44
+ {&DDRF, &PINF, &PORTF, 7} // F7 45
+};
+//------------------------------------------------------------------------------
+#else // CPU type
+#error unknown CPU type
+#endif // CPU type
+//------------------------------------------------------------------------------
+/** count of pins */
+static const uint8_t digitalPinCount = sizeof(pinMap)/sizeof(pin_map_t);
+//==============================================================================
+/** generate bad pin number error */
+void badPinNumber(void)
+ __attribute__((error("Pin number is too large or not a constant")));
+//------------------------------------------------------------------------------
+/** Check for valid pin number
+ * @param[in] pin Number of pin to be checked.
+ */
+static inline __attribute__((always_inline))
+void badPinCheck(uint8_t pin) {
+ if (!__builtin_constant_p(pin) || pin >= digitalPinCount) {
+ badPinNumber();
+ }
+}
+//------------------------------------------------------------------------------
+/** fast write helper
+ * @param[in] address I/O register address
+ * @param[in] bit bit number to write
+ * @param[in] level value for bit
+ */
+static inline __attribute__((always_inline))
+void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) {
+ uint8_t oldSREG;
+ if (address > (uint8_t*)0X5F) {
+ oldSREG = SREG;
+ cli();
+ }
+ if (level) {
+ *address |= 1 << bit;
+ } else {
+ *address &= ~(1 << bit);
+ }
+ if (address > (uint8_t*)0X5F) {
+ SREG = oldSREG;
+ }
+}
+//------------------------------------------------------------------------------
+/** read pin value
+ * @param[in] pin Arduino pin number
+ * @return value read
+ */
+static inline __attribute__((always_inline))
+bool fastDigitalRead(uint8_t pin) {
+ badPinCheck(pin);
+ return (*pinMap[pin].pin >> pinMap[pin].bit) & 1;
+}
+//------------------------------------------------------------------------------
+/** toggle a pin
+ * @param[in] pin Arduino pin number
+ *
+ * If the pin is in output mode toggle the pin level.
+ * If the pin is in input mode toggle the state of the 20K pullup.
+ */
+static inline __attribute__((always_inline))
+void fastDigitalToggle(uint8_t pin) {
+ badPinCheck(pin);
+ if (pinMap[pin].pin > (uint8_t*)0X5F) {
+ // must write bit to high address port
+ *pinMap[pin].pin = 1 << pinMap[pin].bit;
+ } else {
+ // will compile to sbi and PIN register will not be read.
+ *pinMap[pin].pin |= 1 << pinMap[pin].bit;
+ }
+}
+//------------------------------------------------------------------------------
+/** Set pin value
+ * @param[in] pin Arduino pin number
+ * @param[in] level value to write
+ */
+static inline __attribute__((always_inline))
+void fastDigitalWrite(uint8_t pin, bool level) {
+ badPinCheck(pin);
+ fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level);
+}
+//------------------------------------------------------------------------------
+/** set pin mode
+ * @param[in] pin Arduino pin number
+ * @param[in] mode if true set output mode else input mode
+ *
+ * fastPinMode does not enable or disable the 20K pullup for input mode.
+ */
+static inline __attribute__((always_inline))
+void fastPinMode(uint8_t pin, bool mode) {
+ badPinCheck(pin);
+ fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode);
+}
+//------------------------------------------------------------------------------
+/** set pin configuration
+ * @param[in] pin Arduino pin number
+ * @param[in] mode If true set output mode else input mode
+ * @param[in] level If mode is output, set level high/low.
+ * If mode is input, enable or disable the pin's 20K pullup.
+ */
+static inline __attribute__((always_inline))
+void fastPinConfig(uint8_t pin, bool mode, bool level) {
+ fastPinMode(pin, mode);
+ fastDigitalWrite(pin, level);
+}
+//==============================================================================
+/**
+ * @class DigitalPin
+ * @brief Fast AVR digital port I/O
+ */
+template
+class DigitalPin {
+ public:
+ //----------------------------------------------------------------------------
+ /** Constructor */
+ DigitalPin() {}
+ //----------------------------------------------------------------------------
+ /** Constructor
+ * @param[in] pinMode if true set output mode else input mode.
+ */
+ explicit DigitalPin(bool pinMode) {
+ mode(pinMode);
+ }
+ //----------------------------------------------------------------------------
+ /** Constructor
+ * @param[in] mode If true set output mode else input mode
+ * @param[in] level If mode is output, set level high/low.
+ * If mode is input, enable or disable the pin's 20K pullup.
+ */
+ DigitalPin(bool mode, bool level) {
+ config(mode, level);
+ }
+ //----------------------------------------------------------------------------
+ /** Asignment operator
+ * @param[in] value If true set the pin's level high else set the
+ * pin's level low.
+ *
+ * @return This DigitalPin instance.
+ */
+ inline DigitalPin & operator = (bool value) __attribute__((always_inline)) {
+ write(value);
+ return *this;
+ }
+ //----------------------------------------------------------------------------
+ /** Parenthesis operator
+ * @return Pin's level
+ */
+ inline operator bool () const __attribute__((always_inline)) {
+ return read();
+ }
+ //----------------------------------------------------------------------------
+ /** set pin configuration
+ * @param[in] mode If true set output mode else input mode
+ * @param[in] level If mode is output, set level high/low.
+ * If mode is input, enable or disable the pin's 20K pullup.
+ */
+ inline __attribute__((always_inline))
+ void config(bool mode, bool level) {
+ fastPinConfig(PinNumber, mode, level);
+ }
+ //----------------------------------------------------------------------------
+ /**
+ * Set pin level high if output mode or enable 20K pullup if input mode.
+ */
+ inline __attribute__((always_inline))
+ void high() {write(true);}
+ //----------------------------------------------------------------------------
+ /**
+ * Set pin level low if output mode or disable 20K pullup if input mode.
+ */
+ inline __attribute__((always_inline))
+ void low() {write(false);}
+ //----------------------------------------------------------------------------
+ /**
+ * Set pin mode
+ * @param[in] pinMode if true set output mode else input mode.
+ *
+ * mode() does not enable or disable the 20K pullup for input mode.
+ */
+ inline __attribute__((always_inline))
+ void mode(bool pinMode) {
+ fastPinMode(PinNumber, pinMode);
+ }
+ //----------------------------------------------------------------------------
+ /** @return Pin's level */
+ inline __attribute__((always_inline))
+ bool read() const {
+ return fastDigitalRead(PinNumber);
+ }
+ //----------------------------------------------------------------------------
+ /** toggle a pin
+ *
+ * If the pin is in output mode toggle the pin's level.
+ * If the pin is in input mode toggle the state of the 20K pullup.
+ */
+ inline __attribute__((always_inline))
+ void toggle() {
+ fastDigitalToggle(PinNumber);
+ }
+ //----------------------------------------------------------------------------
+ /** Write the pin's level.
+ * @param[in] value If true set the pin's level high else set the
+ * pin's level low.
+ */
+ inline __attribute__((always_inline))
+ void write(bool value) {
+ fastDigitalWrite(PinNumber, value);
+ }
+};
+#endif // DigitalPin_h
+/** @} */
\ No newline at end of file
diff --git a/libraries/DigitalIO/I2cConstants.h b/libraries/DigitalIO/I2cConstants.h
new file mode 100644
index 0000000..7b2c749
--- /dev/null
+++ b/libraries/DigitalIO/I2cConstants.h
@@ -0,0 +1,62 @@
+/* Arduino I2C Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino I2C Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino I2C Library. If not, see
+ * .
+ */
+/**
+ * @file I2cConstants.h
+ * @brief Two Wire Interface constants.
+ *
+ * @defgroup twoWire I2C constants
+ * @details Two Wire Interface library.
+ * @{
+ */
+#ifndef I2cConstants_h
+#define I2cConstants_h
+#include
+
+/** Option argument for transfer() of transferContinue() to continue a
+ an I2C operation. */
+const uint8_t I2C_CONTINUE = 0;
+
+/** Option argument for transfer() of transferContinue() to end a
+ transfer with a STOP condition */
+const uint8_t I2C_STOP = 1;
+
+/** Option argument for transfer() of transferContinue() to end a
+ transfer with a repeated START condition */
+const uint8_t I2C_REP_START = 2;
+
+/** Set I2C bus speed to 100 kHz. Used by TwiMaster class. */
+const uint8_t I2C_100KHZ = 0;
+
+/** Set I2C bus speed to 400 kHz. Used by TwiMaster class. */
+const uint8_t I2C_400KHZ = 1;
+
+/** Bit to OR with address for a read operation. */
+const uint8_t I2C_READ = 1;
+
+/** Bit to OR with address for write operation. */
+const uint8_t I2C_WRITE = 0;
+
+/** Disable internal pull-ups on SDA and SCL. Used by TwiMaster class. */
+const uint8_t I2C_NO_PULLUPS = 0;
+
+/** Enable internal pull-ups on SDA and SCL. Used by TwiMaster class. */
+const uint8_t I2C_INTERNAL_PULLUPS = 1;
+#endif // I2cConstants_h
+/** @} */
\ No newline at end of file
diff --git a/libraries/DigitalIO/PinIO.cpp b/libraries/DigitalIO/PinIO.cpp
new file mode 100644
index 0000000..b0367b7
--- /dev/null
+++ b/libraries/DigitalIO/PinIO.cpp
@@ -0,0 +1,68 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Digital AVR port I/O with runtime pin number.
+ *
+ * @defgroup runtimeDigital Runtime Pin I/O
+ * @details Two Wire Interface library.
+ * @{
+ */
+#include
+#include
+#include
+//==============================================================================
+/** Constructor
+ * @param[in] pin Pin assigned to this object.
+ */
+PinIO::PinIO(uint8_t pin) {
+ begin(pin);
+}
+//------------------------------------------------------------------------------
+/** Initialize pin bit mask and port address.
+ * @param[in] pin Arduino board pin number.
+ * @return true for success or false if invalid pin number.
+ */
+bool PinIO::begin(uint8_t pin) {
+ if (pin >= NUM_DIGITAL_PINS) return false;
+ uint8_t port = digitalPinToPort(pin);
+ pinReg_ = portInputRegister(port);
+ bit_ = digitalPinToBitMask(pin);
+ mask_ = ~bit_;
+ portReg_ = pinReg_ + 2;
+ return true;
+}
+//------------------------------------------------------------------------------
+/** Configure the pin
+ *
+ * @param[in] mode Configure as output mode if true else input mode.
+ * @param[in] data For output mode set pin high if true else low.
+ * For input mode enable 20K pullup if true else Hi-Z.
+ *
+ * This function may be used with interrupts enabled or disabled.
+ * The previous interrupt state will be restored.
+ */
+void PinIO::config(bool mode, bool data) {
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ modeI(mode);
+ writeI(data);
+ }
+}
+/** @} */
\ No newline at end of file
diff --git a/libraries/DigitalIO/PinIO.h b/libraries/DigitalIO/PinIO.h
new file mode 100644
index 0000000..96fe492
--- /dev/null
+++ b/libraries/DigitalIO/PinIO.h
@@ -0,0 +1,145 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Digital AVR port I/O with runtime pin number.
+ *
+ * @defgroup runtimeDigital Runtime Pin I/O
+ * @details Two Wire Interface library.
+ * @{
+ */
+#ifndef PinIO_h
+#define PinIO_h
+#include
+#include
+//------------------------------------------------------------------------------
+/**
+ * @class PinIO
+ * @brief AVR port I/O with runtime pin numbers.
+ */
+class PinIO {
+ public:
+ /** Create a PinIO object with no assigned pin. */
+ PinIO() : bit_(0), mask_(0XFF) {}
+ explicit PinIO(uint8_t pin);
+ bool begin(uint8_t pin);
+ void config(bool mode, bool data);
+ //----------------------------------------------------------------------------
+ /** @return Pin's level */
+ inline __attribute__((always_inline))
+ bool read() {return *pinReg_ & bit_;}
+ //----------------------------------------------------------------------------
+ /** toggle a pin
+ *
+ * If the pin is in output mode toggle the pin's level.
+ * If the pin is in input mode toggle the state of the 20K pullup.
+ */
+ inline __attribute__((always_inline))
+ void toggle() {*pinReg_ = bit_;}
+ //============================================================================
+ /**
+ * Set pin high if output mode or enable 20K pullup if input mode.
+ *
+ * This function must be called with interrupts disabled.
+ * This function will not change the interrupt state.
+ */
+ inline __attribute__((always_inline))
+ void highI() {writeI(1);}
+ /**
+ * Set pin low if output mode or disable 20K pullup if input mode.
+ *
+ * This function must be called with interrupts disabled.
+ * This function will not change the interrupt state.
+ */
+ inline __attribute__((always_inline))
+ void lowI() {writeI(0);}
+ /**
+ * Set pin mode
+ * @param[in] mode if true set output mode else input mode.
+ *
+ * mode() does not enable or disable the 20K pullup for input mode.
+ *
+ * This function must be called with interrupts disabled.
+ * This function will not change the interrupt state.
+ */
+ inline __attribute__((always_inline))
+ void modeI(bool mode) {
+ volatile uint8_t* ddrReg = pinReg_ + 1;
+ *ddrReg = mode ? *ddrReg | bit_ : *ddrReg & mask_;
+ }
+ /** Write pin.
+ *
+ * @param[in] level If output mode set pin high if true else low.
+ * If input mode enable 20K pullup if true else disable pullup.
+ *
+ * This function must be called with interrupts disabled.
+ * This function will not change the interrupt state.
+ */
+ inline __attribute__((always_inline))
+ void writeI(bool level) {
+ *portReg_ = level ? *portReg_ | bit_ : *portReg_ & mask_;
+ }
+ //============================================================================
+ /**
+ * Set pin level high if output mode or enable 20K pullup if input mode.
+ *
+ * This function will enable interrupts. This function should not be
+ * called in an ISR or where interrupts are disabled.
+ */
+ inline __attribute__((always_inline))
+ void high() {ATOMIC_BLOCK(ATOMIC_FORCEON) {highI();}}
+ /**
+ * Set pin level low if output mode or disable 20K pullup if input mode.
+ *
+ * This function will enable interrupts. This function should not be
+ * called in an ISR or where interrupts are disabled.
+ */
+ inline __attribute__((always_inline))
+ void low() {ATOMIC_BLOCK(ATOMIC_FORCEON) {lowI();}}
+ /**
+ * Set pin mode
+ * @param[in] pinMode if true set output mode else input mode.
+ *
+ * mode() does not enable or disable the 20K pullup for input mode.
+ *
+ * This function will enable interrupts. This function should not be
+ * called in an ISR or where interrupts are disabled.
+ */
+ inline __attribute__((always_inline))
+ void mode(bool pinMode) {ATOMIC_BLOCK(ATOMIC_FORCEON) {modeI(pinMode);}}
+ /** Write pin.
+ *
+ * @param[in] level If output mode set pin high if true else low.
+ * If input mode enable 20K pullup if true else disable pullup.
+ *
+ * This function will enable interrupts. This function should not be
+ * called in an ISR or where interrupts are disabled.
+ */
+ inline __attribute__((always_inline))
+ void write(bool level) {ATOMIC_BLOCK(ATOMIC_FORCEON) {writeI(level);}}
+ //----------------------------------------------------------------------------
+ private:
+ uint8_t bit_;
+ uint8_t mask_;
+ volatile uint8_t* pinReg_;
+ volatile uint8_t* portReg_;
+};
+#endif // PinIO_h
+/** @} */
\ No newline at end of file
diff --git a/libraries/DigitalIO/SoftI2cMaster.cpp b/libraries/DigitalIO/SoftI2cMaster.cpp
new file mode 100644
index 0000000..efc338a
--- /dev/null
+++ b/libraries/DigitalIO/SoftI2cMaster.cpp
@@ -0,0 +1,240 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Software I2C library
+ *
+ * @defgroup softI2C Software I2C
+ * @details Software Two Wire Interface library.
+ * @{
+ */
+#include
+//------------------------------------------------------------------------------
+/**
+ * Start an I2C transfer with possible continuation.
+ *
+ * @param[in] addrRW I2C slave address plus R/W bit.
+ * The I2C slave address is in the high seven bits
+ * and is ORed with on of the following:
+ * - I2C_READ for a read transfer.
+ * - I2C_WRITE for a write transfer.
+ * .
+ * @param[in,out] buf Source or destination for transfer.
+ * @param[in] nbytes Number of bytes to transfer (may be zero).
+ * @param[in] option Option for ending the transfer, one of:
+ * - I2C_STOP end the transfer with an I2C stop
+ * condition.
+ * - I2C_REP_START end the transfer with an I2C
+ * repeated start condition.
+ * - I2C_CONTINUE allow additional transferContinue()
+ * calls.
+ * .
+ * @return true for success else false.
+ */
+bool I2cMasterBase::transfer(uint8_t addrRW,
+ void *buf, size_t nbytes, uint8_t option) {
+ uint8_t* p = reinterpret_cast(buf);
+ if (_state != STATE_REP_START) {
+ start();
+ }
+ if (!write(addrRW)) {
+ _state = addrRW & I2C_READ ? STATE_RX_ADDR_NACK : STATE_TX_ADDR_NACK;
+ return false;
+ }
+ _state = addrRW & I2C_READ ? STATE_RX_DATA : STATE_TX_DATA;
+ return transferContinue(buf, nbytes, option);
+}
+//------------------------------------------------------------------------------
+/**
+ * Continue an I2C transfer.
+ *
+ * @param[in,out] buf Source or destination for transfer.
+ * @param[in] nbytes Number of bytes to transfer (may be zero).
+ * @param[in] option Option for ending the transfer, one of:
+ * - I2C_STOP end the transfer with an I2C stop
+ * condition.
+ * - I2C_REP_START end the transfer with an I2C
+ * repeated start condition.
+ * - I2C_CONTINUE allow additional transferContinue()
+ * calls.
+ * .
+ * @return true for success else false.
+ */
+bool I2cMasterBase::transferContinue(void *buf, size_t nbytes, uint8_t option) {
+ uint8_t* p = reinterpret_cast(buf);
+ if (_state == STATE_RX_DATA) {
+ for (size_t i = 0; i < nbytes; i++) {
+ p[i] = read(i == (nbytes - 1) && option != I2C_CONTINUE);
+ }
+ } else if (_state == STATE_TX_DATA) {
+ for (size_t i = 0; i < nbytes; i++) {
+ if (!write(p[i])) {
+ _state = STATE_TX_DATA_NACK;
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ if (option == I2C_STOP) {
+ stop();
+ _state = STATE_STOP;
+ } else if (option == I2C_REP_START) {
+ start();
+ _state = STATE_STOP;
+ }
+ return true;
+}
+//==============================================================================
+// WARNING don't change SoftI2cMaster unless you verify the change with a scope
+//------------------------------------------------------------------------------
+/**
+ * Constructor, initialize SCL/SDA pins and set the bus high.
+ *
+ * @param[in] sdaPin The software SDA pin number.
+ *
+ * @param[in] sclPin The software SCL pin number.
+ */
+SoftI2cMaster::SoftI2cMaster(uint8_t sclPin, uint8_t sdaPin) {
+ begin(sclPin, sdaPin);
+}
+//------------------------------------------------------------------------------
+/**
+ * Initialize SCL/SDA pins and set the bus high.
+ *
+ * @param[in] sdaPin The software SDA pin number.
+ *
+ * @param[in] sclPin The software SCL pin number.
+ */
+void SoftI2cMaster::begin(uint8_t sclPin, uint8_t sdaPin) {
+ uint8_t port;
+
+ // Get bit mask and address of scl registers.
+ _sclBit = digitalPinToBitMask(sclPin);
+ port = digitalPinToPort(sclPin);
+ _sclDDR = portModeRegister(port);
+ volatile uint8_t* sclOutReg = portOutputRegister(port);
+
+ // Get bit mask and address of sda registers.
+ _sdaBit = digitalPinToBitMask(sdaPin);
+ port = digitalPinToPort(sdaPin);
+ _sdaDDR = portModeRegister(port);
+ _sdaInReg = portInputRegister(port);
+ volatile uint8_t* sdaOutReg = portOutputRegister(port);
+
+ // Clear PORT bit for scl and sda.
+ uint8_t s = SREG;
+ noInterrupts();
+ *sclOutReg &= ~_sclBit;
+ *sdaOutReg &= ~_sdaBit;
+ SREG = s;
+
+ // Set scl and sda high.
+ writeScl(HIGH);
+ writeSda(HIGH);
+}
+//------------------------------------------------------------------------------
+/* Read a byte and send ACK if more reads follow else NACK to terminate read.
+ *
+ * @param[in] last Set true to terminate the read else false.
+ *
+ * @return The byte read from the I2C bus.
+ */
+uint8_t SoftI2cMaster::read(uint8_t last) {
+ uint8_t b = 0;
+
+ // Set sda to high Z mode for read.
+ writeSda(HIGH);
+ // Read a byte.
+ for (uint8_t i = 0; i < 8; i++) {
+ // Don't change this loop unless you verify the change with a scope.
+ b <<= 1;
+ sclDelay(16);
+ writeScl(HIGH);
+ sclDelay(12);
+ if (readSda()) b |= 1;
+ writeScl(LOW);
+ }
+ // send ACK or NACK
+ writeSda(last);
+ sclDelay(12);
+ writeScl(HIGH);
+ sclDelay(18);
+ writeScl(LOW);
+ writeSda(LOW);
+ return b;
+}
+//------------------------------------------------------------------------------
+/* Issue a start condition. */
+void SoftI2cMaster::start() {
+ if (!readSda()) {
+ writeSda(HIGH);
+ writeScl(HIGH);
+ sclDelay(20);
+ }
+ writeSda(LOW);
+ sclDelay(20);
+ writeScl(LOW);
+}
+//------------------------------------------------------------------------------
+ /* Issue a stop condition. */
+void SoftI2cMaster::stop(void) {
+ writeSda(LOW);
+ sclDelay(20);
+ writeScl(HIGH);
+ sclDelay(20);
+ writeSda(HIGH);
+ sclDelay(20);
+}
+//------------------------------------------------------------------------------
+/*
+ * Write a byte.
+ *
+ * @param[in] data The byte to send.
+ *
+ * @return The value true, 1, if the slave returned an ACK or false for NACK.
+ */
+bool SoftI2cMaster::write(uint8_t data) {
+ // write byte
+ for (uint8_t m = 0X80; m != 0; m >>= 1) {
+ // don't change this loop unless you verify the change with a scope
+ writeSda(m & data);
+ sclDelay(8);
+ writeScl(HIGH);
+ sclDelay(18);
+ writeScl(LOW);
+ }
+ sclDelay(8);
+ // Go to sda high Z mode for input.
+ writeSda(HIGH);
+ writeScl(HIGH);
+ sclDelay(16);
+
+ // Get ACK or NACK.
+ uint8_t rtn = readSda();
+
+ // pull scl low.
+ writeScl(LOW);
+
+ // Pull sda low.
+ writeSda(LOW);
+ return rtn == 0;
+}
+/** @} */
diff --git a/libraries/DigitalIO/SoftI2cMaster.h b/libraries/DigitalIO/SoftI2cMaster.h
new file mode 100644
index 0000000..e2d559a
--- /dev/null
+++ b/libraries/DigitalIO/SoftI2cMaster.h
@@ -0,0 +1,284 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+#ifndef SOFT_I2C_MASTER_H
+#define SOFT_I2C_MASTER_H
+/**
+ * @file
+ * @brief Software I2C library
+ *
+ * @defgroup softI2C Software I2C
+ * @details Software Two Wire Interface library.
+ * @{
+ */
+#if ARDUINO < 100
+#error Requires Arduino 1.0 or greater.
+#else // ARDUINO
+#include
+#endif // ARDUINO
+#include
+#include
+#include
+//------------------------------------------------------------------------------
+// State codes.
+
+/** Stop condition transmitted. */
+const uint8_t STATE_STOP = 0;
+
+/** Repeated start condition transmitted. */
+const uint8_t STATE_REP_START = 1;
+
+/** Read data transfer active. */
+const uint8_t STATE_RX_DATA = 2;
+
+/** Write data transfer active. */
+const uint8_t STATE_TX_DATA = 3;
+
+/** Slave address plus read bit transmitted, NACK received. */
+const uint8_t STATE_RX_ADDR_NACK = 4;
+
+/** Slave address plus write bit transmitted, NACK received. */
+const uint8_t STATE_TX_ADDR_NACK = 5;
+/** Data byte transmitted, NACK received. */
+const uint8_t STATE_TX_DATA_NACK = 6;
+//==============================================================================
+/**
+ * @class I2cMasterBase
+ * @brief Base class for FastI2cMaster, SoftI2cMaster
+ */
+class I2cMasterBase {
+ public:
+ I2cMasterBase() : _state(STATE_STOP) {}
+ /** Read a byte
+ *
+ * @note This function should only be used by experts. Data should be
+ * accessed by calling transfer() and transferContinue()
+ *
+ * @param[in] last send a NACK to terminate read if last is true else
+ * send an ACK to continue the read.
+ *
+ * @return byte read from I2C bus
+ */
+ virtual uint8_t read(uint8_t last) = 0;
+
+ /** Issue a start condition
+ *
+ * @note This function should only be used by experts. Data should be
+ * accessed by calling transfer() and transferContinue()
+ */
+ virtual void start() = 0;
+ /** Issue a stop condition.
+ *
+ * @note This function should only be used by experts. Data should be
+ * accessed by calling transfer() and transferContinue()
+ */
+ virtual void stop() = 0;
+
+ bool transfer(uint8_t addressRW, void *buf,
+ size_t nbyte, uint8_t option = I2C_STOP);
+
+ bool transferContinue(void *buf, size_t nbyte, uint8_t option = I2C_STOP);
+ /** Write a byte
+ *
+ * @note This function should only be used by experts. Data should be
+ * accessed by calling transfer() and transferContinue()
+ *
+ * @param[in] data byte to write
+ * @return true for ACK or false for NACK */
+ virtual bool write(uint8_t data) = 0;
+
+ private:
+ uint8_t _state;
+};
+//==============================================================================
+/**
+ * @class SoftI2cMaster
+ * @brief Software I2C master class
+ */
+class SoftI2cMaster : public I2cMasterBase {
+ public:
+ SoftI2cMaster() {}
+ SoftI2cMaster(uint8_t sclPin, uint8_t sdaPin);
+ void begin(uint8_t sclPin, uint8_t sdaPin);
+ uint8_t read(uint8_t last);
+ void start();
+ void stop(void);
+ bool write(uint8_t b);
+
+ private:
+ uint8_t _sclBit;
+ uint8_t _sdaBit;
+ volatile uint8_t* _sclDDR;
+ volatile uint8_t* _sdaDDR;
+ volatile uint8_t* _sdaInReg;
+ //----------------------------------------------------------------------------
+ bool readSda() {return *_sdaInReg & _sdaBit;}
+ //----------------------------------------------------------------------------
+ void sclDelay(uint8_t n) {_delay_loop_1(n);}
+ //----------------------------------------------------------------------------
+ bool writeScl(bool value) {
+ uint8_t s = SREG;
+ noInterrupts();
+ if (value == LOW) {
+ // Pull scl low.
+ *_sclDDR |= _sclBit;
+ } else {
+ // Put scl in high Z input mode.
+ *_sclDDR &= ~_sclBit;
+ }
+ SREG = s;
+ }
+ //----------------------------------------------------------------------------
+ bool writeSda(bool value) {
+ uint8_t s = SREG;
+ noInterrupts();
+ if (value == LOW) {
+ // Pull sda low.
+ *_sdaDDR |= _sdaBit;
+ } else {
+ // Put sda in high Z input mode.
+ *_sdaDDR &= ~_sdaBit;
+ }
+ SREG = s;
+ }
+};
+//==============================================================================
+// Template based fast software I2C
+//------------------------------------------------------------------------------
+/**
+ * @class FastI2cMaster
+ * @brief Fast software I2C master class.
+ */
+template
+class FastI2cMaster : public I2cMasterBase {
+ public:
+ //----------------------------------------------------------------------------
+ FastI2cMaster() {
+ begin();
+ }
+ //----------------------------------------------------------------------------
+ /** Initialize I2C bus pins. */
+ void begin() {
+ fastDigitalWrite(sclPin, LOW);
+ fastDigitalWrite(sdaPin, LOW);
+
+ sclWrite(HIGH);
+ sdaWrite(HIGH);
+ }
+ //----------------------------------------------------------------------------
+ uint8_t read(uint8_t last) {
+ uint8_t data = 0;
+ sdaWrite(HIGH);
+
+ readBit(7, &data);
+ readBit(6, &data);
+ readBit(5, &data);
+ readBit(4, &data);
+ readBit(3, &data);
+ readBit(2, &data);
+ readBit(1, &data);
+ readBit(0, &data);
+
+ // send ACK or NACK
+ sdaWrite(last);
+ sclDelay(4);
+ sclWrite(HIGH);
+ sclDelay(6);
+ sclWrite(LOW);
+ sdaWrite(LOW);
+ return data;
+ }
+ //----------------------------------------------------------------------------
+ void start() {
+ if (!fastDigitalRead(sdaPin)) {
+ // It's a repeat start.
+ sdaWrite(HIGH);
+ sclDelay(8);
+ sclWrite(HIGH);
+ sclDelay(8);
+ }
+ sdaWrite(LOW);
+ sclDelay(8);
+ sclWrite(LOW);
+ sclDelay(8);
+ }
+ //----------------------------------------------------------------------------
+ void stop(void) {
+ sdaWrite(LOW);
+ sclDelay(8);
+ sclWrite(HIGH);
+ sclDelay(8);
+ sdaWrite(HIGH);
+ sclDelay(8);
+ }
+ //----------------------------------------------------------------------------
+ bool write(uint8_t data) {
+ // write byte
+ writeBit(7, data);
+ writeBit(6, data);
+ writeBit(5, data);
+ writeBit(4, data);
+ writeBit(3, data);
+ writeBit(2, data);
+ writeBit(1, data);
+ writeBit(0, data);
+
+ // get ACK or NACK
+ sdaWrite(HIGH);
+
+ sclWrite(HIGH);
+ sclDelay(5);
+ bool rtn = fastDigitalRead(sdaPin);
+ sclWrite(LOW);
+ sdaWrite(LOW);
+ return rtn == 0;
+ }
+
+ private:
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void sclWrite(bool value) {fastPinMode(sclPin, !value);}
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void sdaWrite(bool value) {fastPinMode(sdaPin, !value);}
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void readBit(uint8_t bit, uint8_t* data) {
+ sclWrite(HIGH);
+ sclDelay(5);
+ if (fastDigitalRead(sdaPin)) *data |= 1 << bit;
+ sclWrite(LOW);
+ if (bit) sclDelay(6);
+ }
+ //----------------------------------------------------------------------------
+ void sclDelay(uint8_t n) {_delay_loop_1(n);}
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void writeBit(uint8_t bit, uint8_t data) {
+ uint8_t mask = 1 << bit;
+ sdaWrite(data & mask);
+ sclWrite(HIGH);
+ sclDelay(5);
+ sclWrite(LOW);
+ sclDelay(5);
+ }
+};
+#endif // SOFT_I2C_MASTER_H
+/** @} */
+
diff --git a/libraries/DigitalIO/SoftSPI.h b/libraries/DigitalIO/SoftSPI.h
new file mode 100644
index 0000000..036fad6
--- /dev/null
+++ b/libraries/DigitalIO/SoftSPI.h
@@ -0,0 +1,162 @@
+/* Arduino DigitalIO Library
+ * Copyright (C) 2013 by William Greiman
+ *
+ * This file is part of the Arduino DigitalIO Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino DigitalIO Library. If not, see
+ * .
+ */
+/**
+ * @file
+ * @brief Software SPI.
+ *
+ * @defgroup softSPI Software SPI
+ * @details Software SPI Template Class.
+ * @{
+ */
+
+#ifndef SoftSPI_h
+#define SoftSPI_h
+#include
+//------------------------------------------------------------------------------
+/** Nop for timing. */
+#define nop asm volatile ("nop\n\t")
+//------------------------------------------------------------------------------
+/** Pin Mode for MISO is input.*/
+const bool MISO_MODE = false;
+/** Pullups disabled for MISO are disabled. */
+const bool MISO_LEVEL = false;
+/** Pin Mode for MOSI is output.*/
+const bool MOSI_MODE = true;
+/** Pin Mode for SCK is output. */
+const bool SCK_MODE = true;
+//------------------------------------------------------------------------------
+/**
+ * @class SoftSPI
+ * @brief Fast software SPI.
+ */
+template
+class SoftSPI {
+ public:
+ //----------------------------------------------------------------------------
+ /** Initialize SoftSPI pins. */
+ void begin() {
+ fastPinConfig(MisoPin, MISO_MODE, MISO_LEVEL);
+ fastPinConfig(MosiPin, MOSI_MODE, !MODE_CPHA(Mode));
+ fastPinConfig(SckPin, SCK_MODE, MODE_CPOL(Mode));
+ }
+ //----------------------------------------------------------------------------
+ /** Soft SPI receive byte.
+ * @return Data byte received.
+ */
+ inline __attribute__((always_inline))
+ uint8_t receive() {
+ uint8_t data = 0;
+ receiveBit(7, &data);
+ receiveBit(6, &data);
+ receiveBit(5, &data);
+ receiveBit(4, &data);
+ receiveBit(3, &data);
+ receiveBit(2, &data);
+ receiveBit(1, &data);
+ receiveBit(0, &data);
+ return data;
+ }
+ //----------------------------------------------------------------------------
+ /** Soft SPI send byte.
+ * @param[in] data Data byte to send.
+ */
+ inline __attribute__((always_inline))
+ void send(uint8_t data) {
+ sendBit(7, data);
+ sendBit(6, data);
+ sendBit(5, data);
+ sendBit(4, data);
+ sendBit(3, data);
+ sendBit(2, data);
+ sendBit(1, data);
+ sendBit(0, data);
+ }
+ //----------------------------------------------------------------------------
+ /** Soft SPI transfer byte.
+ * @param[in] txData Data byte to send.
+ * @return Data byte received.
+ */
+ inline __attribute__((always_inline))
+ uint8_t transfer(uint8_t txData) {
+ uint8_t rxData = 0;
+ transferBit(7, &rxData, txData);
+ transferBit(6, &rxData, txData);
+ transferBit(5, &rxData, txData);
+ transferBit(4, &rxData, txData);
+ transferBit(3, &rxData, txData);
+ transferBit(2, &rxData, txData);
+ transferBit(1, &rxData, txData);
+ transferBit(0, &rxData, txData);
+ return rxData;
+ }
+
+ private:
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ bool MODE_CPHA(uint8_t mode) {return (mode & 1) != 0;}
+ inline __attribute__((always_inline))
+ bool MODE_CPOL(uint8_t mode) {return (mode & 2) != 0;}
+ inline __attribute__((always_inline))
+ void receiveBit(uint8_t bit, uint8_t* data) {
+ if (MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, !MODE_CPOL(Mode));
+ }
+ nop;
+ nop;
+ fastDigitalWrite(SckPin,
+ MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode));
+ if (fastDigitalRead(MisoPin)) *data |= 1 << bit;
+ if (!MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, MODE_CPOL(Mode));
+ }
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void sendBit(uint8_t bit, uint8_t data) {
+ if (MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, !MODE_CPOL(Mode));
+ }
+ fastDigitalWrite(MosiPin, data & (1 << bit));
+ fastDigitalWrite(SckPin,
+ MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode));
+ nop;
+ nop;
+ if (!MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, MODE_CPOL(Mode));
+ }
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) {
+ if (MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, !MODE_CPOL(Mode));
+ }
+ fastDigitalWrite(MosiPin, txData & (1 << bit));
+ fastDigitalWrite(SckPin,
+ MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode));
+ if (fastDigitalRead(MisoPin)) *rxData |= 1 << bit;
+ if (!MODE_CPHA(Mode)) {
+ fastDigitalWrite(SckPin, MODE_CPOL(Mode));
+ }
+ }
+ //----------------------------------------------------------------------------
+};
+#endif // SoftSPI_h
+/** @} */
diff --git a/libraries/DigitalIO/attic/ADS7818.h b/libraries/DigitalIO/attic/ADS7818.h
new file mode 100644
index 0000000..c416acc
--- /dev/null
+++ b/libraries/DigitalIO/attic/ADS7818.h
@@ -0,0 +1,120 @@
+#ifndef ADS7818_h
+#define ADS7871_h
+//------------------------------------------------------------------------------
+/** nop to tune soft SPI timing */
+#define nop asm volatile ("nop\n\t")
+//------------------------------------------------------------------------------
+/** doxygen can't handle __attribute__ very well */
+#define STATIC_ALWAYS_INLINE static inline __attribute__((always_inline))
+//------------------------------------------------------------------------------
+template
+class ADS7818 {
+ public:
+ void begin() {
+ fastPinMode(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+ fastPinMode(ConvPin, 1);
+ fastDigitalWrite(ConvPin, 1);
+ fastPinMode(DataPin, 0);
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ uint16_t read() {
+ uint16_t v = 0;
+ fastDigitalWrite(ConvPin, 0);
+ fastDigitalWrite(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+ fastDigitalWrite(ConvPin, 1);
+ fastDigitalWrite(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+
+ readBitFast16(v, 11);
+ readBitFast16(v, 10);
+ readBitFast16(v, 9);
+ readBitFast16(v, 8);
+ readBitFast16(v, 7);
+ readBitFast16(v, 6);
+ readBitFast16(v, 5);
+ readBitFast16(v, 4);
+ readBitFast16(v, 3);
+ readBitFast16(v, 2);
+ readBitFast16(v, 1);
+ readBitFast16(v, 0);
+ return v;
+ }
+ private:
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void readBitFast16(uint16_t &v, uint8_t b) {
+ fastDigitalWrite(ClkPin, 1);
+ if (fastDigitalRead(DataPin)) v |= (1 << b);
+ fastDigitalWrite(ClkPin, 0);
+ }
+};
+#if 0
+/** initialize I/O ports */
+STATIC_ALWAYS_INLINE void adcBegin() {
+ fastPinMode(ADC_CLK_PIN, 1);
+ fastDigitalWrite(ADC_CLK_PIN, 0);
+ fastPinMode(ADC_CONV_PIN, 1);
+ fastDigitalWrite(ADC_CONV_PIN, 1);
+ fastPinMode(ADC_DATA_PIN, 0);
+}
+//------------------------------------------------------------------------------
+/** clock for don't care bits
+ *\param[in] delayBefore if true, delay before raising clock*/
+STATIC_ALWAYS_INLINE void fastDummy(bool first) {
+ if (!first) nop;
+ fastDigitalWrite(ADC_CLK_PIN, 1);
+ nop;
+ fastDigitalWrite(ADC_CLK_PIN, 0);
+}
+//------------------------------------------------------------------------------
+/** read next bit fast as possible
+ * \param[in] v word to receive bit
+ * \param[in] b bit number to be set. v |= (1 << b) if next bit is high.
+ */
+STATIC_ALWAYS_INLINE void readBitFast16(uint16_t &v, uint8_t b) {
+ fastDigitalWrite(ADC_CLK_PIN, 1);
+ if (fastDigitalRead(ADC_DATA_PIN)) v |= (1 << b);
+ fastDigitalWrite(ADC_CLK_PIN, 0);
+}
+//------------------------------------------------------------------------------
+/** Read AD7680 16-bit ADC in less than 8 microseconds
+ * cs is chip select pin
+ */
+STATIC_ALWAYS_INLINE uint16_t adcRead(bool centered = false) {
+ uint16_t v = 0;
+ fastDigitalWrite(ADC_CONV_PIN, 0);
+ fastDigitalWrite(ADC_CLK_PIN, 1);
+ fastDigitalWrite(ADC_CLK_PIN, 0);
+ fastDigitalWrite(ADC_CONV_PIN, 1);
+ fastDigitalWrite(ADC_CLK_PIN, 1);
+ fastDigitalWrite(ADC_CLK_PIN, 0);
+// uint16_t v = 0;
+
+// fastDummy(1);
+// fastDummy(0);
+// fastDummy(0);
+ // fastDummy(0);
+
+// readBitFast16(v, 15);
+// readBitFast16(v, 14);
+// readBitFast16(v, 13);
+// readBitFast16(v, 12);
+ readBitFast16(v, 11);
+ readBitFast16(v, 10);
+ readBitFast16(v, 9);
+ readBitFast16(v, 8);
+ readBitFast16(v, 7);
+ readBitFast16(v, 6);
+ readBitFast16(v, 5);
+ readBitFast16(v, 4);
+ readBitFast16(v, 3);
+ readBitFast16(v, 2);
+ readBitFast16(v, 1);
+ readBitFast16(v, 0);
+ return centered ? v ^ 0X8000 : v;
+}
+#endif // 0
+#endif // ADS7818_h
\ No newline at end of file
diff --git a/libraries/DigitalIO/attic/MCP320X.h b/libraries/DigitalIO/attic/MCP320X.h
new file mode 100644
index 0000000..e4d1b81
--- /dev/null
+++ b/libraries/DigitalIO/attic/MCP320X.h
@@ -0,0 +1,259 @@
+#ifndef MCP320X_h
+#define MCP320X_h
+#include
+//==============================================================================
+template
+class MCP3201 {
+ public:
+ //----------------------------------------------------------------------------
+ /** Set pin modes and initial levels. */
+ void begin() {
+ fastPinMode(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+ fastPinMode(CsPin, 1);
+ fastDigitalWrite(CsPin, 1);
+ fastPinMode(DoutPin, 0);
+ }
+ //----------------------------------------------------------------------------
+ /** Read MCP3201 12-bit ADC
+ * \return 16-bit value read.
+ */
+ inline __attribute__((always_inline))
+ uint16_t read() {
+ fastDigitalWrite(CsPin, 0);
+ // Start sample.
+ mcpAdcDummy(3);
+ // Extra sample time.
+ if (UsecDelay){
+ delayMicroseconds(UsecDelay);
+ }
+ // End sample.
+ mcpAdcDummy(3);
+ // Null bit.
+ mcpAdcDummy(3);
+ uint16_t v = 0;
+ readBit(v, 11);
+ readBit(v, 10);
+ readBit(v, 9);
+ readBit(v, 8);
+ readBit(v, 7);
+ readBit(v, 6);
+ readBit(v, 5);
+ readBit(v, 4);
+ readBit(v, 3);
+ readBit(v, 2);
+ readBit(v, 1);
+ readBit(v, 0);
+ fastDigitalWrite(CsPin, 1);
+ return v;
+ }
+ private:
+ //----------------------------------------------------------------------------
+ /** delay n nops
+ * \param[in] n nops to delay, must be a constant so compiler optimizes if().
+ */
+ inline __attribute__((always_inline))
+ void delayCycles(uint8_t n) {
+ if (n & 1) asm volatile("nop\n\t");
+ if (n & 2) asm volatile("nop\n\t" "nop\n\t");
+ if (n & 4) asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t");
+ }
+ //----------------------------------------------------------------------------
+ /** clock for don't care bits
+ *\param[in] delayBefore if true, delay before raising clock*/
+ inline __attribute__((always_inline))
+ void mcpAdcDummy(uint8_t delayBefore) {
+ delayCycles(delayBefore);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(3);
+ fastDigitalWrite(ClkPin, 0);
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void readBit(uint16_t &v, uint8_t b, uint8_t delayRead = 2) {
+ delayCycles(3);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(delayRead);
+ if (fastDigitalRead(DoutPin)) v |= (1 << b);
+ fastDigitalWrite(ClkPin, 0);
+ }
+};
+//==============================================================================
+template
+class MCP3202 {
+ public:
+ //----------------------------------------------------------------------------
+ /** Set pin modes and initial levels. */
+ void begin() {
+ fastPinMode(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+ fastPinMode(CsPin, 1);
+ fastDigitalWrite(CsPin, 1);
+ fastPinMode(DoutPin, 0);
+ fastPinMode(DinPin, 1);
+ }
+ //----------------------------------------------------------------------------
+ /** Read MCP3202 12-bit ADC
+ * \return 16-bit value read.
+ */
+ inline __attribute__((always_inline))
+ uint16_t read(uint8_t config) {
+ uint16_t v = 0;
+ fastDigitalWrite(CsPin, 0);
+ // Start bit.
+ writeBit(true);
+ // Mode bit.
+ writeBit(config & 2);
+ // Channel Selection and start sample.
+ writeBit(config & 1);
+ // Extra sample time.
+ if (UsecDelay){
+ delayMicroseconds(UsecDelay);
+ }
+ // MSB first format and end sample.
+ writeBit(true);
+ // Null bit.
+ writeBit(true);
+ // Data bits.
+ readBit(v, 11);
+ readBit(v, 10);
+ readBit(v, 9);
+ readBit(v, 8);
+ readBit(v, 7);
+ readBit(v, 6);
+ readBit(v, 5);
+ readBit(v, 4);
+ readBit(v, 3);
+ readBit(v, 2);
+ readBit(v, 1);
+ readBit(v, 0);
+ fastDigitalWrite(CsPin, 1);
+ return v;
+ }
+ private:
+ //----------------------------------------------------------------------------
+ /** delay n nops
+ * \param[in] n nops to delay, must be a constant so compiler optimizes if().
+ */
+ inline __attribute__((always_inline))
+ void delayCycles(uint8_t n) {
+ if (n & 1) asm volatile("nop\n\t");
+ if (n & 2) asm volatile("nop\n\t" "nop\n\t");
+ if (n & 4) asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t");
+ }
+ //----------------------------------------------------------------------------
+ /** clock for don't care bits
+ *\param[in] delayBefore if true, delay before raising clock*/
+ inline __attribute__((always_inline))
+ void writeBit(bool value) {
+ fastDigitalWrite(DinPin, value);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(2);
+ fastDigitalWrite(ClkPin, 0);
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void readBit(uint16_t &v, uint8_t b, uint8_t delayRead = 1) {
+ delayCycles(2);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(delayRead);
+ if (fastDigitalRead(DoutPin)) v |= (1 << b);
+ fastDigitalWrite(ClkPin, 0);
+ }
+};
+//==============================================================================
+template
+class MCP3204 {
+ public:
+ //----------------------------------------------------------------------------
+ /** Set pin modes and initial levels. */
+ void begin() {
+ fastPinMode(ClkPin, 1);
+ fastDigitalWrite(ClkPin, 0);
+ fastPinMode(CsPin, 1);
+ fastDigitalWrite(CsPin, 1);
+ fastPinMode(DoutPin, 0);
+ fastPinMode(DinPin, 1);
+ }
+ //----------------------------------------------------------------------------
+ /** Read MCP3204 12-bit ADC
+ * \return 16-bit value read.
+ */
+ inline __attribute__((always_inline))
+ uint16_t read(uint8_t config) {
+ uint16_t v = 0;
+ fastDigitalWrite(CsPin, 0);
+ // Start bit.
+ writeBit(true);
+ // Mode bit.
+ writeBit(config & 8);
+ // D2 channel bit.
+ writeBit(config & 4);
+ // D1 channel bit.
+ writeBit(config & 2);
+ // D0 channel bit and start sample.
+ writeBit(config & 1);
+ // Extra sample time.
+ if (UsecDelay){
+ delayMicroseconds(UsecDelay);
+ }
+ // End sample cycle.
+ writeBit(true);
+ // Null bit.
+ writeBit(true);
+ // Data bits.
+ readBit(v, 11);
+ readBit(v, 10);
+ readBit(v, 9);
+ readBit(v, 8);
+ readBit(v, 7);
+ readBit(v, 6);
+ readBit(v, 5);
+ readBit(v, 4);
+ readBit(v, 3);
+ readBit(v, 2);
+ readBit(v, 1);
+ readBit(v, 0);
+ fastDigitalWrite(CsPin, 1);
+ return v;
+ }
+ private:
+ //----------------------------------------------------------------------------
+ /** delay n nops
+ * \param[in] n nops to delay, must be a constant so compiler optimizes if().
+ */
+ inline __attribute__((always_inline))
+ void delayCycles(uint8_t n) {
+ if (n & 1) asm volatile("nop\n\t");
+ if (n & 2) asm volatile("nop\n\t" "nop\n\t");
+ if (n & 4) asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t");
+ }
+ //----------------------------------------------------------------------------
+ /** clock for don't care bits
+ *\param[in] delayBefore if true, delay before raising clock*/
+ inline __attribute__((always_inline))
+ void writeBit(bool value) {
+ fastDigitalWrite(DinPin, value);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(2);
+ fastDigitalWrite(ClkPin, 0);
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ void readBit(uint16_t &v, uint8_t b, uint8_t delayRead = 1) {
+ delayCycles(2);
+ fastDigitalWrite(ClkPin, 1);
+ delayCycles(delayRead);
+ if (fastDigitalRead(DoutPin)) v |= (1 << b);
+ fastDigitalWrite(ClkPin, 0);
+ }
+};
+//==============================================================================
+// MCP3204 and MCP3208 use the same code.
+template
+class MCP3208 : public MCP3204 {
+};
+#endif // MCP320X_h
\ No newline at end of file
diff --git a/libraries/DigitalIO/attic/MCP355X.h b/libraries/DigitalIO/attic/MCP355X.h
new file mode 100644
index 0000000..0cde640
--- /dev/null
+++ b/libraries/DigitalIO/attic/MCP355X.h
@@ -0,0 +1,126 @@
+#ifndef MCP355X_h
+#define MCP355X_h
+#include
+// Overflow values.
+const int32_t MCP355X_OVH = 2097152L;
+const int32_t MCP355X_OVL = -2097153L;
+const int32_t MCP355X_ERR = 0X80000000;
+const uint8_t MCP355X_TO_MS = 100;
+//==============================================================================
+template
+class MCP355X {
+ public:
+ //----------------------------------------------------------------------------
+ /** Set pin modes and initial levels. */
+ void begin(bool singleMode = true) {
+ m_singleMode = singleMode;
+ fastPinMode(SdoPin, 0);
+ fastPinMode(SckPin, 1);
+ fastDigitalWrite(SckPin, 1);
+ fastPinMode(CsPin, 1);
+ fastDigitalWrite(CsPin, 1);
+ if (!m_singleMode) {
+ // Wait for conversion to complete.
+ delay(100);
+ // Start continuous conversion mode.
+ fastDigitalWrite(CsPin, 0);
+ }
+ }
+ //----------------------------------------------------------------------------
+ /** Read MCP355X 22-bit ADC
+ * \return 22-bit value.
+ */
+ inline __attribute__((always_inline))
+ int32_t read() {
+ uint8_t t = 0;
+ uint8_t v3 = 0;
+ if (m_singleMode) {
+ // Start conversion.
+ fastDigitalWrite(CsPin, 0);
+ // Delay at least 10 usec to avoid RDY glitch on exit from Shutdown.
+ delay(1);
+ // Toggle CsPin to indicate single conversion mode.
+ fastDigitalWrite(CsPin, 1);
+ // Wait for conversion to complete.
+ while (1) {
+ delay(1);
+ fastDigitalWrite(CsPin, 0);
+ // Delay while RDY settles.
+ delayCycles(4);
+ if (!fastDigitalRead(SdoPin)) break;
+ fastDigitalWrite(CsPin, 1);
+ if (t++ > MCP355X_TO_MS) return MCP355X_ERR;
+ }
+ } else {
+ while (1) {
+ if (!fastDigitalRead(SdoPin)) break;
+ delay(1);
+ if (t++ > MCP355X_TO_MS) return MCP355X_ERR;
+ }
+ }
+ uint8_t v2 = readByte();
+ uint8_t v1 = readByte();
+ uint8_t v0 = readByte();
+
+ // The 25th falling edge of SCK changes SDO/RDY from Data mode to RDY mode.
+ uint8_t dummy = 0;
+ readBit(dummy, 0);
+
+ if (m_singleMode) {
+ fastDigitalWrite(CsPin, 1);
+ }
+ if ((v2 & 0XE0) == 0X20) {
+ // Negative in range so extend sign bit.
+ v2 |= 0XC0;
+ v3 = 0XFF;
+ } else if (v2 & 0X40) {
+ // Overflow high. Cause value to be >= MCP355X_OVH.
+ if (v2 & 0X20) v2 &= 0X3F;
+ } else if (v2 & 0X80) {
+ // Overflow low. Cause value to be <= MCP355X_OVH.
+ if ((v2 & 0X20) == 0) v2 |= 0X40;
+ v3 = 0XFF;
+ }
+ uint16_t v_high = (v3 << 8) | v2;
+ uint16_t v_low = (v1 << 8) | v0;
+ return ((uint32_t)v_high << 16) | v_low;
+ }
+ private:
+ //----------------------------------------------------------------------------
+ /** delay n nops
+ * \param[in] n nops to delay, must be a constant so compiler optimizes if().
+ */
+ inline __attribute__((always_inline))
+ void delayCycles(uint8_t n) {
+ if (n & 1) asm volatile("nop\n\t");
+ if (n & 2) asm volatile("nop\n\t" "nop\n\t");
+ if (n & 4) asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t");
+ }
+ //----------------------------------------------------------------------------
+ // Default delay yields about 2 MHz clock.
+ inline __attribute__((always_inline))
+ void readBit(uint8_t &v, uint8_t b, uint8_t delayRead = 0) {
+ fastDigitalWrite(SckPin, 0);
+ delayCycles(2 + delayRead);
+ fastDigitalWrite(SckPin, 1);
+ if (fastDigitalRead(SdoPin)) v |= (1 << b);
+ delayCycles(delayRead);
+ }
+ //----------------------------------------------------------------------------
+ inline __attribute__((always_inline))
+ uint8_t readByte() {
+ uint8_t v = 0;
+ readBit(v, 7);
+ readBit(v, 6);
+ readBit(v, 5);
+ readBit(v, 4);
+ readBit(v, 3);
+ readBit(v, 2);
+ readBit(v, 1);
+ readBit(v, 0);
+ return v;
+ }
+ //----------------------------------------------------------------------------
+ bool m_singleMode;
+};
+#endif // MCP355X_h
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/DigitalPinBlink/DigitalPinBlink.ino b/libraries/DigitalIO/examples/DigitalPinBlink/DigitalPinBlink.ino
new file mode 100644
index 0000000..4a698ba
--- /dev/null
+++ b/libraries/DigitalIO/examples/DigitalPinBlink/DigitalPinBlink.ino
@@ -0,0 +1,12 @@
+#include
+// Create object for pin 13 in output mode and demo toggle().
+DigitalPin<13> pin13(OUTPUT);
+
+void setup() {}
+
+void loop() {
+ // toggle is a two byte instruction that executes
+ // in two cycles or 125 ns on a 16 MHz CPU
+ pin13.toggle();
+ delay(250);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/DigitalPinConfigToggle/DigitalPinConfigToggle.ino b/libraries/DigitalIO/examples/DigitalPinConfigToggle/DigitalPinConfigToggle.ino
new file mode 100644
index 0000000..06ad860
--- /dev/null
+++ b/libraries/DigitalIO/examples/DigitalPinConfigToggle/DigitalPinConfigToggle.ino
@@ -0,0 +1,18 @@
+// Demo of config() and fast toggle() function.
+#include
+
+// Class with compile time pin number.
+DigitalPin<13> pin13;
+
+void setup() {
+ // Set mode to OUTPUT and level LOW.
+ pin13.config(OUTPUT, LOW);
+}
+void loop() {
+ // toggle is a two byte instruction that executes
+ // in two cycles or 125 ns on a 16 MHz CPU
+ pin13.toggle();
+ delay(100);
+ pin13.toggle();
+ delay(400);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/DigitalPinReadWrite/DigitalPinReadWrite.ino b/libraries/DigitalIO/examples/DigitalPinReadWrite/DigitalPinReadWrite.ino
new file mode 100644
index 0000000..57be1fa
--- /dev/null
+++ b/libraries/DigitalIO/examples/DigitalPinReadWrite/DigitalPinReadWrite.ino
@@ -0,0 +1,11 @@
+// Read pin 12 and write value to pin 13.
+#include
+
+DigitalPin<12> pin12(INPUT);
+DigitalPin<13> pin13(OUTPUT);
+
+void setup() {}
+
+void loop() {
+ pin13 = pin12;
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/DigitalPinShiftOut/DigitalPinShiftOut.ino b/libraries/DigitalIO/examples/DigitalPinShiftOut/DigitalPinShiftOut.ino
new file mode 100644
index 0000000..98682bb
--- /dev/null
+++ b/libraries/DigitalIO/examples/DigitalPinShiftOut/DigitalPinShiftOut.ino
@@ -0,0 +1,39 @@
+// Scope test for fast shiftOut function.
+#include
+
+// Create clockPin in output mode with inital level LOW.
+DigitalPin<12> clockPin(OUTPUT, LOW);
+
+// Create dataPin in output mode with inital level HIGH.
+DigitalPin<13> dataPin(OUTPUT, HIGH);
+
+//------------------------------------------------------------------------------
+// Time to send one bit is ten cycles or 625 ns for 16 MHz CPU.
+inline __attribute__((always_inline))
+void sendBit(uint8_t bit, uint8_t data) {
+ dataPin = data & (1 << bit);
+ clockPin = 1;
+ // may want a nop here - clock pulse is 125 ns wide
+ clockPin = 0;
+}
+//------------------------------------------------------------------------------
+// Time to send one byte is 5 usec.
+void shiftOut(uint8_t bits) {
+ sendBit(7, bits);
+ sendBit(6, bits);
+ sendBit(5, bits);
+ sendBit(4, bits);
+ sendBit(3, bits);
+ sendBit(2, bits);
+ sendBit(1, bits);
+ sendBit(0, bits);
+}
+//------------------------------------------------------------------------------
+void setup() {
+ // Not used.
+}
+//------------------------------------------------------------------------------
+void loop() {
+ shiftOut(0X55);
+ delay(2);
+}
diff --git a/libraries/DigitalIO/examples/PinIOBegin/PinIOBegin.ino b/libraries/DigitalIO/examples/PinIOBegin/PinIOBegin.ino
new file mode 100644
index 0000000..5f7e124
--- /dev/null
+++ b/libraries/DigitalIO/examples/PinIOBegin/PinIOBegin.ino
@@ -0,0 +1,24 @@
+// Use begin to assign pin numbers.
+// Read pin 12 and write the value to pin 13.
+#include
+
+// Declare the PinIO instances.
+PinIO readPin;
+PinIO writePin;
+//------------------------------------------------------------------------------
+void setup() {
+ // Assign pin 12 to readPin.
+ readPin.begin(12);
+
+ // input mode with pull-ups disabled
+ readPin.config(INPUT, LOW);
+
+ // Assign pin 13 to writePin and set mode to output.
+ writePin.begin(13);
+ writePin.mode(OUTPUT);
+}
+//------------------------------------------------------------------------------
+void loop() {
+ // Copy the value read from readPin to writePin.
+ writePin.write(readPin.read());
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/PinIOConfigToggle/PinIOConfigToggle.ino b/libraries/DigitalIO/examples/PinIOConfigToggle/PinIOConfigToggle.ino
new file mode 100644
index 0000000..3bf3e00
--- /dev/null
+++ b/libraries/DigitalIO/examples/PinIOConfigToggle/PinIOConfigToggle.ino
@@ -0,0 +1,16 @@
+// Test the config() and toggle() functions.
+#include
+
+// Set runtime pin number.
+PinIO pin13(13);
+
+void setup() {
+ // set mode to OUTPUT and level LOW
+ pin13.config(OUTPUT, LOW);
+}
+void loop() {
+ pin13.toggle();
+ delay(100);
+ pin13.toggle();
+ delay(400);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/PinIOReadWrite/PinIOReadWrite.ino b/libraries/DigitalIO/examples/PinIOReadWrite/PinIOReadWrite.ino
new file mode 100644
index 0000000..8b225d5
--- /dev/null
+++ b/libraries/DigitalIO/examples/PinIOReadWrite/PinIOReadWrite.ino
@@ -0,0 +1,16 @@
+// Read pin 12 and write the value to pin 13.
+#include
+
+PinIO readPin(12);
+PinIO writePin(13);
+
+void setup() {
+ // Set input mode and disable pull-up.
+ readPin.config(INPUT, LOW);
+
+ // set output mode
+ writePin.mode(OUTPUT);
+}
+void loop() {
+ writePin.write(readPin.read());
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/ScanI2cBus/ScanI2cBus.ino b/libraries/DigitalIO/examples/ScanI2cBus/ScanI2cBus.ino
new file mode 100644
index 0000000..6132a3f
--- /dev/null
+++ b/libraries/DigitalIO/examples/ScanI2cBus/ScanI2cBus.ino
@@ -0,0 +1,78 @@
+/* Scan I2C bus for devices.
+ *
+ * For I2C write addresses: the scanner sends a start,
+ * the write address, looks for an ACK, then sends a stop.
+ *
+ * For I2C read addresses: the scanner sends a start, the
+ * read address, looks for an ACK. If there is an ACK, it
+ * reads a byte and NACKs it. Finally it sends a stop.
+ *
+ * When the I2C chip responds to the read address, it
+ * outputs data and will miss a stop condition sent
+ * immediately after the read address (bus contention).
+ *
+ * If the I2C chip misses the stop condition, the
+ * address scanner will see ghost addresses until the
+ * read ends randomly. By reading a byte after any read
+ * address that ACKs, there is a chance to NACK the read
+ * and properly end the I2C transaction.
+ */
+#include
+
+// Set pin numbers for your configuration.
+const uint8_t SDA_PIN = A4;
+const uint8_t SCL_PIN = A5;
+
+SoftI2cMaster i2c(SCL_PIN, SDA_PIN);
+//FastI2cMaster i2c;
+//------------------------------------------------------------------------------
+void setup() {
+
+ Serial.begin(9600);
+ while (!Serial);
+
+ if (!digitalRead(SDA_PIN) && !digitalRead(SCL_PIN)) {
+ Serial.println("External pull-up resistors appear to be missing.");
+ Serial.println("Many false responses may be detected.");
+ Serial.println("Type any character to continue.");
+
+ while (!Serial.available());
+ Serial.println();
+
+ }
+ uint8_t add = 0;
+ bool found = false;
+ do {
+ bool wr = i2c.transfer(add | I2C_WRITE, 0, 0);
+ bool rd = i2c.transfer(add | I2C_READ, 0, 0, I2C_CONTINUE);
+ if (rd) {
+ uint8_t dummy;
+ // Must read byte, send NACK, and issue STOP.
+ i2c.transferContinue(&dummy, 1);
+ }
+ if (rd || wr) {
+ found = true;
+ Serial.print("Device at address: 0X");
+ Serial.print(add, HEX);
+ Serial.print(" responds to ");
+ if (rd) Serial.print("Read");
+ if (rd && wr) Serial.print(" and ");
+ if (wr) Serial.print("Write");
+ Serial.println('.');
+ }
+ add += 2;
+ }
+ while (add);
+
+ if (!found) {
+ Serial.println("No devices found.");
+ }
+ Serial.println("Done");
+}
+//------------------------------------------------------------------------------
+void loop() {
+ // Not used.
+}
+
+
+
diff --git a/libraries/DigitalIO/examples/SoftDS1307Utility/SoftDS1307Utility.ino b/libraries/DigitalIO/examples/SoftDS1307Utility/SoftDS1307Utility.ino
new file mode 100644
index 0000000..3747b96
--- /dev/null
+++ b/libraries/DigitalIO/examples/SoftDS1307Utility/SoftDS1307Utility.ino
@@ -0,0 +1,324 @@
+// Utility sketch to explore DS1307 and demonstrate software I2C Master.
+//
+
+#include
+
+// Set pin numbers for your configuration.
+const uint8_t SDA_PIN = A4;
+const uint8_t SCL_PIN = A5;
+
+//SoftI2cMaster rtc(SCL_PIN, SDA_PIN);
+FastI2cMaster rtc;
+
+// i2c 8-bit address for DS1307. low bit is read/write
+#define DS1307ADDR 0XD0
+//------------------------------------------------------------------------------
+/*
+ * Read 'count' bytes from the DS1307 starting at 'address'.
+ */
+uint8_t readDS1307(uint8_t address, uint8_t *buf, uint8_t count) {
+
+ // Send address of data.
+ if (!rtc.transfer(DS1307ADDR | I2C_WRITE, &address, 1)) return false;
+
+ // Read data.
+ return rtc.transfer(DS1307ADDR | I2C_READ, buf, count);
+}
+//------------------------------------------------------------------------------
+/*
+ * write 'count' bytes to DS1307 starting at 'address'.
+ */
+uint8_t writeDS1307(uint8_t address, uint8_t *buf, uint8_t count) {
+
+ // Write address and continue transfer for write of data.
+ if (!rtc.transfer(DS1307ADDR | I2C_WRITE, &address, 1, I2C_CONTINUE)) {
+ return false;
+ }
+ // Write data.
+ return rtc.transferContinue(buf, count);
+}
+//------------------------------------------------------------------------------
+void setup(void) {
+ Serial.begin(9600);
+}
+//------------------------------------------------------------------------------
+/** Store and print a string in flash memory.*/
+#define PgmPrint(x) Serial.print(F(x))
+/** Store and print a string in flash memory followed by a CR/LF.*/
+#define PgmPrintln(x) Serial.println(F(x))
+//-------------------------------------------------------------------------------
+// Day of week U.S. convention.
+char *Ddd[] = {"Bad", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+//------------------------------------------------------------------------------
+void hexPrint(uint8_t v) {
+ Serial.print(v >> 4, HEX);
+ Serial.print(v & 0XF, HEX);
+}
+//------------------------------------------------------------------------------
+void hexPrintln(uint8_t v) {
+ hexPrint(v);
+ Serial.println();
+}
+//------------------------------------------------------------------------------
+// read hex input
+uint8_t hexRead(uint16_t* v) {
+ bool valid = false;
+ uint16_t n = 0;
+ while (!Serial.available());
+ while (Serial.available()) {
+ uint8_t c = Serial.read();
+ // Exit if end-of-line.
+ if (c == '\n' || c == '\r') {
+ delay(10);
+ // If CR/LF.
+ Serial.read();
+ break;
+ }
+ n <<= 4;
+ if ('a' <= c && c <= 'f') {
+ n += c - ('a' - 10);
+ }
+ else if ('A' <= c && c <= 'F') {
+ n += c - ('A' - 10);
+ }
+ else if ('0' <= c && c <= '9') {
+ n += c - '0';
+ }
+ else {
+ valid = false;
+ break;
+ }
+ delay(10);
+ valid = true;
+ }
+ if (!valid) {
+ PgmPrintln("Invalid entry");
+ return false;
+ }
+ *v = n;
+ return true;
+}
+//------------------------------------------------------------------------------
+uint8_t bcdRead(uint8_t min, uint8_t max, uint8_t* n) {
+ uint16_t v;
+ if (!hexRead(&v)) return false;
+ uint8_t d = 10 * (v >> 4) + (v & 0XF);
+ if ((v >> 4) > 9 || (v & 0XF) > 9 || d < min || d > max) {
+ PgmPrintln("Invalid");
+ return false;
+ }
+ *n = v;
+ return true;
+}
+//------------------------------------------------------------------------------
+void displayTime(void) {
+ uint8_t r[8];
+ if (!readDS1307(0, r, 8)) {
+ PgmPrintln("Read Failed for display time");
+ return;
+ }
+ PgmPrint("The current time is 20");
+ // year
+ hexPrint(r[6]);
+ Serial.write('-');
+
+ // month
+ hexPrint(r[5]);
+ Serial.write('-');
+
+ // day
+ hexPrint(r[4]);
+ Serial.write(' ');
+
+ Serial.print(Ddd[r[3] < 8 ? r[3] : 0]);
+ Serial.write(' ');
+
+ // hour
+ hexPrint(r[2]);
+ Serial.write(':');
+
+ // minute
+ hexPrint(r[1]);
+ Serial.write(':');
+
+ // second
+ hexPrintln(r[0]);
+
+ // Control register.
+ PgmPrint("Control Register: ");
+ hexPrintln(r[7]);
+}
+//------------------------------------------------------------------------------
+// dump registers and 56 bytes of RAM
+void dumpAll(void) {
+ uint8_t buf[8];
+ for (uint8_t a = 0; a < 64; a += 8) {
+ hexPrint(a);
+ Serial.write(' ');
+ if (!readDS1307(a, buf, 8)) {
+ PgmPrint("read failed for dumpAll");
+ return;
+ }
+ for (uint8_t i = 0; i < 8; i++) {
+ Serial.write(' ');
+ hexPrint(buf[i]);
+ }
+ Serial.println();
+ }
+}
+//------------------------------------------------------------------------------
+void fillNvRam(void) {
+ uint8_t buf[8];
+ PgmPrint("Enter HEX value for all NV RAM locations (00-FF): ");
+ uint16_t v;
+ if (!hexRead(&v)) return;
+ hexPrint(v);
+ for (uint8_t a = 8; a < 64; a ++) {
+ if (!writeDS1307(a, (uint8_t *)&v, 1)) {
+ PgmPrintln("write failed for fillNvRam");
+ }
+ }
+}
+//------------------------------------------------------------------------------
+// set control register
+/*
+The DS1307 control register is used to control the operation of the SQW/OUT pin.
++-----------------------------------------------+
+|BIT 7|BIT 6|BIT 5|BIT 4|BIT 3|BIT 2|BIT 1|BIT 0|
++-----------------------------------------------+
+|OUT | 0 | 0 |SQWE | 0 | 0 | RS1 | RS0 |
++-----------------------------------------------+
+
+OUT (Output control): This bit controls the output level of the SQW/OUT pin
+when the square wave output is disabled. If SQWE = 0, the logic level on the
+SQW/OUT pin is 1 if OUT = 1 and is 0 if OUT = 0.
+
+SQWE (Square Wave Enable): This bit, when set to a logic 1, will enable the
+oscillator output. The frequency of the square wave output depends upon the
+value of the RS0 and RS1 bits. With the square wave output set to 1Hz, the
+clock registers update on the falling edge of the square wave.
+
+Square wave Output Frequency for SQWE = 1.
+RS1 RS0 FREQUENCY
+ 0 0 1Hz
+ 0 1 4.096kHz
+ 1 0 8.192kHz
+ 1 1 32.768kHz
+*/
+void setControl(void) {
+ PgmPrintln("SQW/OUT pin: ");
+ PgmPrintln("(00) Low");
+ PgmPrintln("(10) 1Hz");
+ PgmPrintln("(11) 4.096kHz");
+ PgmPrintln("(12) 8.192kHz");
+ PgmPrintln("(13) 32.768kHz");
+ PgmPrintln("(80) High");
+ PgmPrint("Enter control: ");
+ uint16_t r;
+ if (!hexRead(&r)) return;
+ hexPrintln(r);
+ if (!writeDS1307(7, (uint8_t *)&r, 1)) {
+ PgmPrint("Write Failed for setControl");
+ }
+}
+//------------------------------------------------------------------------------
+void setDate(void) {
+ uint8_t r[4];
+ PgmPrint("Enter year (00-99): ");
+ if (!bcdRead(0, 99, &r[3])) return;
+ hexPrintln(r[3]);
+ PgmPrint("Enter month (01-12): ");
+ if (!bcdRead(1, 12, &r[2])) return;
+ hexPrintln(r[2]);
+ PgmPrint("Enter day (01-31): ");
+ if (!bcdRead(1, 31, &r[1])) return;
+ hexPrintln(r[1]);
+ PgmPrint("Enter day of week (01-07, Sun-Sat): ");
+ if (!bcdRead(1, 7, &r[0])) return;
+ hexPrintln(r[0]);
+
+ if (!writeDS1307(3, r, 4)) {
+ PgmPrintln("Write failed for setDate");
+ }
+}
+//------------------------------------------------------------------------------
+void setNvRam() {
+ uint8_t u;
+ uint16_t a, v;
+ while (true) {
+ PgmPrint("Enter zero to quit or Hex address (8-3F):");
+ if (!hexRead(&a) || a == 0) return;
+ if (a < 8 || a > 0X3F) {
+ PgmPrintln("Invalid address");
+ return;
+ }
+ hexPrintln(a);
+ if (!readDS1307(a, &u, 1)) {
+ PgmPrintln("Read failed");
+ return;
+ }
+ PgmPrint("Current value: ");
+ hexPrintln(u);
+ PgmPrint("Enter new HEX value (00-FF): ");
+ if (!hexRead(&v)) return;
+ hexPrintln(v);
+ if (!writeDS1307(a, (uint8_t *)&v, 1)) {
+ PgmPrint("Write Failed");
+ return;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void setTime(void) {
+ uint8_t r[3];
+ PgmPrint("Enter hours (00-23): ");
+ if (!bcdRead(0, 23, &r[2])) return;
+ hexPrintln(r[2]);
+ PgmPrint("Enter minutes (00-59): ");
+ if (!bcdRead(0, 59, &r[1])) return;
+ hexPrintln(r[1]);
+ PgmPrint("Enter seconds (00-59): ");
+ if (!bcdRead(0, 59, &r[0])) return;
+ hexPrintln(r[0]);
+
+ if (!writeDS1307(0, r, 3)) {
+ PgmPrintln("write failed in setTime");
+ return;
+ }
+}
+//------------------------------------------------------------------------------
+void loop(void) {
+ Serial.println();
+ displayTime();
+ while (Serial.read() >= 0) {}
+ PgmPrintln("\nOptions are:");
+ PgmPrintln("(0) Display date and time");
+ PgmPrintln("(1) Set time");
+ PgmPrintln("(2) Set date");
+ PgmPrintln("(3) Set Control");
+ PgmPrintln("(4) Dump all");
+ PgmPrintln("(5) Fill NV RAM");
+ PgmPrintln("(6) Set NV RAM value");
+ PgmPrint("Enter option: ");
+
+ uint16_t n;
+ if (!hexRead(&n)) return;
+ Serial.println(n, DEC);
+ if (n == 0) return;
+ Serial.println();
+ if (n == 1) {
+ setTime();
+ } else if (n == 2) {
+ setDate();
+ } else if (n == 3) {
+ setControl();
+ } else if (n == 4) {
+ dumpAll();
+ } else if (n == 5) {
+ fillNvRam();
+ } else if (n == 6) {
+ setNvRam();
+ } else {
+ PgmPrintln("Invalid option");
+ }
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/testArduino/testArduino.ino b/libraries/DigitalIO/examples/testArduino/testArduino.ino
new file mode 100644
index 0000000..13afe04
--- /dev/null
+++ b/libraries/DigitalIO/examples/testArduino/testArduino.ino
@@ -0,0 +1,14 @@
+// Scope test for write timing with Arduino digitaWrite().
+const uint8_t PIN13 = 13;
+
+void setup() {
+ // Set mode to OUTPUT.
+ pinMode(PIN13, OUTPUT);
+}
+void loop() {
+ digitalWrite(PIN13, HIGH);
+ digitalWrite(PIN13, LOW);
+ digitalWrite(PIN13, HIGH);
+ digitalWrite(PIN13, LOW);
+ delay(1);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/testDigitalPin/testDigitalPin.ino b/libraries/DigitalIO/examples/testDigitalPin/testDigitalPin.ino
new file mode 100644
index 0000000..1ac0c02
--- /dev/null
+++ b/libraries/DigitalIO/examples/testDigitalPin/testDigitalPin.ino
@@ -0,0 +1,19 @@
+// Scope test for write timing of DigitalPin functions.
+#include
+
+// Class with compile time pin number.
+DigitalPin<13> pin13;
+
+void setup() {
+ // set mode to OUTPUT
+ pin13.mode(OUTPUT);
+}
+void loop() {
+ pin13.high();
+ pin13.low();
+ pin13.write(1);
+ pin13.write(0);
+ pin13.toggle();
+ pin13.toggle();
+ delay(1);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/testFastDigital/testFastDigital.ino b/libraries/DigitalIO/examples/testFastDigital/testFastDigital.ino
new file mode 100644
index 0000000..03f38d5
--- /dev/null
+++ b/libraries/DigitalIO/examples/testFastDigital/testFastDigital.ino
@@ -0,0 +1,13 @@
+// Test fastDigital function timing with a scope.
+#include
+const uint8_t PIN = 13;
+void setup() {
+ fastPinMode(PIN, OUTPUT);
+}
+void loop() {
+ fastDigitalWrite(PIN, HIGH);
+ fastDigitalWrite(PIN, LOW);
+ fastDigitalToggle(PIN);
+ fastDigitalToggle(PIN);
+ delay(1);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/testPinIO/testPinIO.ino b/libraries/DigitalIO/examples/testPinIO/testPinIO.ino
new file mode 100644
index 0000000..4f72823
--- /dev/null
+++ b/libraries/DigitalIO/examples/testPinIO/testPinIO.ino
@@ -0,0 +1,19 @@
+// Scope test for PinIO class write timing.
+#include
+
+// Class with runtime pin numbers.
+PinIO pin(13);
+
+void setup() {
+ // Set mode to OUTPUT.
+ pin.mode(OUTPUT);
+}
+void loop() {
+ pin.high();
+ pin.low();
+ pin.write(1);
+ pin.write(0);
+ pin.toggle();
+ pin.toggle();
+ delay(1);
+}
\ No newline at end of file
diff --git a/libraries/DigitalIO/examples/testSoftSPI/testSoftSPI.ino b/libraries/DigitalIO/examples/testSoftSPI/testSoftSPI.ino
new file mode 100644
index 0000000..7b9544f
--- /dev/null
+++ b/libraries/DigitalIO/examples/testSoftSPI/testSoftSPI.ino
@@ -0,0 +1,37 @@
+// Scope test for development - assumes 328 processor.
+#include
+
+const uint8_t SOFT_SPI_MISO_PIN = 7;
+const uint8_t SOFT_SPI_MOSI_PIN = 8;
+const uint8_t SOFT_SPI_SCK_PIN = 9;
+const uint8_t SPI_MODE = 0;
+
+SoftSPI spi;
+
+int test;
+void setup() {
+ Serial.begin(9600);
+ spi.begin();
+ while(1) {
+ Serial.println("Enter:");
+ Serial.println("R - Receive");
+ Serial.println("S - Send");
+ Serial.println("T - Transfer");
+ while ((test = Serial.read()) <= 0) {}
+ test = toupper(test);
+ if (strchr("RST", test)) break;
+ Serial.println("Invalid entry");
+ };
+ Serial.print("Starting test ");
+ Serial.println((char)test);
+}
+void loop() {
+ if (test == 'S') spi.send(0X55);
+ if (test == 'R') {
+ Serial.println(spi.receive(), HEX);
+ }
+ if (test == 'T') {
+ Serial.println(spi.transfer(0XAA), HEX);
+ }
+ delay(10);
+}
\ No newline at end of file
diff --git a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino
index df3b935..a6537e7 100644
--- a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino
+++ b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino
@@ -14,11 +14,15 @@
*
* The GW code is designed for Arduino 328p / 16MHz. ATmega168 does not have enough memory to run this program.
*
- * COMPILING
- * You must make sure to disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch won't fit in program space when downloading.
- * For UIPEthernet(ENC28J60) usage: Note that I had to disable UDP and DHCP support in uipethernet-conf.h to reduce space. (which meas you ave to choose a static IP)
- * For WizNET usage: Do *not* install the provided UIPEthernet-library. Remove UIPEthernet-include below and uncomment the Ethernet.h.
+ * COMPILING ENC28J60
+ * > Use Arduino IDE 1.5.7 (or later)
+ * > Disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch will probably not fit in program space when downloading.
+ * > Remove Ethernet.h include below and inlcude UIPEthernet.h
+ * COMPILING WizNET (W5100)
+ * > Remove UIPEthernet include below and include Ethernet.h.
*
+ * Note that I had to disable UDP and DHCP support in uipethernet-conf.h to reduce space. (which meas you ave to choose a static IP for that module)
+
* VERA CONFIGURATION:
* Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin.
* E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
@@ -50,10 +54,10 @@
#include
// Use this if you have attached a Ethernet ENC28J60 shields
-//#include
+#include
// Use this fo WizNET module and Arduino Ethernet Shield
-#include
+//#include
#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled
@@ -66,7 +70,7 @@
#define RADIO_TX_LED_PIN 9 // the PCB, on board LED
#define IP_PORT 5003 // The port you want to open
-IPAddress myIp (192, 168, 178, 66); // Configure your static ip-address here
+IPAddress myIp (192, 168, 178, 66); // Configure your static ip-address here COMPILE ERROR HERE? Use Arduino IDE 1.5.7 or later!
// The MAC address can be anything you want but should be unique on your network.
// Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use.
diff --git a/libraries/MySensors/examples/RelayWithButtonActuator/RelayWithButtonActuator.ino b/libraries/MySensors/examples/RelayWithButtonActuator/RelayWithButtonActuator.ino
index 77b5f8d..7cc2a77 100644
--- a/libraries/MySensors/examples/RelayWithButtonActuator/RelayWithButtonActuator.ino
+++ b/libraries/MySensors/examples/RelayWithButtonActuator/RelayWithButtonActuator.ino
@@ -70,7 +70,7 @@ void incomingMessage(const MyMessage &message) {
Serial.println("This is an ack from gateway");
}
- if (message.type == V_LIGHT && strlen(msg.getString()) != 0) {
+ if (message.type == V_LIGHT) {
// Change relay state
state = message.getBool();
digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
diff --git a/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/ArialNumFontPlus.c b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/ArialNumFontPlus.c
new file mode 100644
index 0000000..bbe7fd1
--- /dev/null
+++ b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/ArialNumFontPlus.c
@@ -0,0 +1,22 @@
+// SevenSegNumFontPlus.c
+// Font type : Special (SubSet)
+// Font size : 32x50 pixels
+// Memory usage : 2204 bytes
+
+#include
+
+const uint8_t ArialNumFontPlus[2204] PROGMEM={
+0x20,0x32,0x30,0x0B,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x1F,0xF8,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x00,0x03,0xF8,0x1F,0x80,0x03,0xF0,0x0F,0xC0,0x07,0xE0,0x07,0xC0,0x07,0xC0,0x03,0xE0,0x0F,0xC0,0x03,0xE0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x1F,0x80,0x01,0xF0,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFC,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x07,0xC0,0x03,0xE0,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x07,0xC0,0x03,0xF0,0x0F,0xC0,0x01,0xF8,0x1F,0x80,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xF0,0x00,0x00,0x1F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x7F,0xF0,0x00,0x01,0xFF,0xF0,0x00,0x03,0xFD,0xF0,0x00,0x0F,0xF1,0xF0,0x00,0x0F,0xE1,0xF0,0x00,0x0F,0x81,0xF0,0x00,0x0F,0x01,0xF0,0x00,0x0C,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //1 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x7F,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x07,0xE0,0x0F,0xF0,0x0F,0xC0,0x03,0xF0,0x0F,0x80,0x01,0xF0,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x3E,0x00,0x00,0xF8,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xF0,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x80,0x00,0x00,0x7F,0x00,0x00,0x00,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x80,0x00,0x00,0x7F,0x00,0x00,0x00,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x1F,0x80,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x3F,0xFC,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x03,0xE0,0x1F,0xC0,0x07,0xC0,0x0F,0xC0,0x07,0x80,0x07,0xE0,0x0F,0x80,0x03,0xE0,0x0F,0x00,0x03,0xE0,0x0F,0x00,0x03,0xF0,0x0F,0x00,0x01,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x80,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x80,0x00,0x00,0x1F,0xC0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x01,0xF8,0x0F,0x80,0x01,0xF8,0x0F,0x80,0x03,0xF0,0x0F,0xC0,0x07,0xF0,0x07,0xE0,0x0F,0xE0,0x03,0xFC,0x3F,0xC0,0x01,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x00,0x00,0x7F,0xFC,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x03,0xFF,0x00,0x00,0x07,0xDF,0x00,0x00,0x07,0xDF,0x00,0x00,0x0F,0x9F,0x00,0x00,0x0F,0x9F,0x00,0x00,0x1F,0x1F,0x00,0x00,0x3E,0x1F,0x00,0x00,0x7E,0x1F,0x00,0x00,0x7C,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x01,0xF0,0x1F,0x00,0x03,0xE0,0x1F,0x00,0x03,0xE0,0x1F,0x00,0x07,0xC0,0x1F,0x00,0x07,0xC0,0x1F,0x00,0x0F,0x80,0x1F,0x00,0x1F,0x80,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x3E,0x00,0x1F,0x00,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00, //4 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0xF0,0x00,0x0F,0x8F,0xFE,0x00,0x0F,0xBF,0xFF,0x80,0x0F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xE0,0x1F,0xFF,0x07,0xF0,0x1F,0xE0,0x03,0xF0,0x1F,0xC0,0x01,0xF8,0x1F,0x00,0x00,0xF8,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x3F,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF0,0x1F,0x00,0x01,0xF0,0x1F,0x80,0x03,0xE0,0x0F,0xC0,0x07,0xE0,0x07,0xE0,0x1F,0xC0,0x03,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0x00,0x01,0xFF,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x3F,0xFE,0x00,0x00,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xC0,0x07,0xE0,0x07,0xE0,0x07,0xC0,0x03,0xF0,0x0F,0xC0,0x01,0xF0,0x0F,0x80,0x00,0xF8,0x1F,0x80,0x00,0xF8,0x1F,0x80,0x00,0xF8,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x03,0xF0,0x00,0x3F,0x1F,0xFC,0x00,0x3F,0x7F,0xFE,0x00,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xC0,0x3F,0xF8,0x0F,0xE0,0x3F,0xE0,0x03,0xF0,0x3F,0xE0,0x03,0xF0,0x3F,0xC0,0x01,0xF8,0x3F,0x80,0x00,0xF8,0x3F,0x80,0x00,0xF8,0x3F,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x3F,0x00,0x00,0x7C,0x1F,0x00,0x00,0x7C,0x1F,0x80,0x00,0x78,0x1F,0x80,0x00,0xF8,0x1F,0x80,0x00,0xF8,0x0F,0x80,0x00,0xF8,0x0F,0xC0,0x01,0xF0,0x07,0xF0,0x03,0xF0,0x03,0xF8,0x0F,0xE0,0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0x80,0x00,0x7F,0xFF,0x00,0x00,0x1F,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x80,0x03,0xF8,0x1F,0xC0,0x07,0xE0,0x07,0xE0,0x07,0xC0,0x03,0xE0,0x0F,0xC0,0x03,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x01,0xF0,0x07,0xC0,0x03,0xE0,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x07,0xC0,0x01,0xF0,0x07,0x80,0x00,0xFC,0x3F,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xC0,0x07,0xF0,0x0F,0xE0,0x0F,0xC0,0x03,0xF0,0x0F,0x80,0x01,0xF0,0x1F,0x80,0x01,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x3E,0x00,0x00,0x7C,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x0F,0x80,0x01,0xF0,0x0F,0x80,0x03,0xF0,0x07,0xC0,0x07,0xE0,0x03,0xF0,0x0F,0xC0,0x01,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8 neu
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x3F,0xFC,0x00,0x00,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xC0,0x03,0xF8,0x1F,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xF0,0x0F,0xC0,0x03,0xF0,0x0F,0xC0,0x03,0xF8,0x1F,0x80,0x01,0xF8,0x1F,0x80,0x01,0xF8,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x80,0x01,0xFC,0x1F,0x80,0x01,0xFC,0x0F,0xC0,0x03,0xFC,0x0F,0xC0,0x03,0xFC,0x07,0xE0,0x07,0xFC,0x07,0xE0,0x07,0xFC,0x03,0xF8,0x1F,0xFC,0x01,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFC,0x00,0xFF,0xFE,0xFC,0x00,0x7F,0xF8,0xFC,0x00,0x1F,0xE0,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF0,0x1F,0x00,0x03,0xF0,0x1F,0x80,0x07,0xE0,0x0F,0xC0,0x0F,0xE0,0x0F,0xE0,0x3F,0xC0,0x07,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0x00,0x01,0xFF,0xFE,0x00,0x00,0xFF,0xF8,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9 neu
+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,0xE0,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xF8,0x00,0x00,0x03,0xF8,0x00,0x00,0x03,0xF8,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0xE0,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,0xE0,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xF8,0x00,0x00,0x03,0xF8,0x00,0x00,0x03,0xF8,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0xE0,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, // :
+};
diff --git a/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/TouchDisplaySceneControllerSensor.ino b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/TouchDisplaySceneControllerSensor.ino
new file mode 100644
index 0000000..37ebf29
--- /dev/null
+++ b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/TouchDisplaySceneControllerSensor.ino
@@ -0,0 +1,174 @@
+
+/*
+ * Touch Display Scene Controller build using a touch enabled tft display
+ * attached to a ATMega 2560. This example fetches time from controller and sends
+ * in scene commands to the controller.
+ * Short press sends V_SCENE_ON and long press (>0.5sec) sends V_SCENE_OFF.
+ *
+ * Henrik Ekblad
+ *
+ * This example uses:
+ * UTFT library: http://www.henningkarlsen.com/electronics/library.php?id=51
+ * Convert your own images here: http://www.henningkarlsen.com/electronics/t_imageconverter565.php
+ *
+ * The 3v3 output on the ATMega2560 is especially bad. I had to use a step down
+ * on the 5V output to get solid transmissions.
+ *
+ * The shield does not seem like sharing SPI with RF24 so you'll have to
+ * activate SOFTSPI-define in MySenors/util/RF24_config.h
+ *
+ * Connect radio
+ * ----------------------------------
+ * Radio Arduino Pin
+ * ----------------------------------
+ * GND GND
+ * 5V -> Step down -> 3V3 (see buying guide for help finding step-down)
+ * SCK 14
+ * MOSI 15
+ * MISO 16
+ * CE 17
+ * CSN 18
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "arial_bold.c"
+#include "ArialNumFontPlus.c"
+#include "logo.c"
+
+#define CHILD_ID 1
+
+int LONG_PRESS = 500; // Number of millisecons to trinnger scene off for button push
+int RESEND_DEBOUNCE = 2000; // Number of millisecons interval between sending of same
+ // scene number again.
+ // This is used to avoid unwanted re-trigger when using
+ // a sensetive touch diplay.
+
+// Add your buttons here. Max is 5 if you still want time at the top.
+char *buttons[] = {
+ "Good Morning",
+ "Clean Up!",
+ "All Lights Off",
+ "Music On/Off"
+ };
+
+const int buttonCount = sizeof(buttons)/sizeof(char *);
+const int padding = 10;
+const int topBarHeight = 60;
+
+MySensor gw(17,18);
+MyMessage on(CHILD_ID, V_SCENE_ON);
+MyMessage off(CHILD_ID, V_SCENE_OFF);
+
+UTFT myGLCD(ITDB32S,38,39,40,41);
+UTouch myTouch( 6, 5, 4, 3, 2);
+UTFT_Buttons myButtons(&myGLCD, &myTouch);
+boolean timeReceived = false;
+unsigned long lastTimeUpdate=0, lastRequest=0;
+char timeBuf[20];
+
+
+void setup()
+{
+ gw.begin(NULL, AUTO, false, 0);
+
+ myGLCD.InitLCD();
+ myGLCD.clrScr();
+ myGLCD.setFont((uint8_t*)ArialNumFontPlus);
+ myGLCD.setColor(100, 255, 100);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawBitmap (0, 0, 60, 60, (unsigned int*)logo);
+
+ myTouch.InitTouch();
+ myTouch.setPrecision(PREC_MEDIUM);
+
+ myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_WHITE, VGA_RED, VGA_BLUE);
+ myButtons.setTextFont((uint8_t*)arial_bold);
+ int height = (myGLCD.getDisplayYSize()-topBarHeight-(padding*(buttonCount+2)))/buttonCount;
+
+ // Add buttons
+ for (int i=0; i=0) {
+ bool longPress = millis()-now>LONG_PRESS;
+
+ if (pressedButton != lastPressedButton || now-lastPressedButtonTime > RESEND_DEBOUNCE) {
+ if (longPress) {
+ gw.send(off.set(pressedButton));
+ Serial.print("Long pressed: ");
+ } else {
+ gw.send(on.set(pressedButton));
+ Serial.print("Pressed: ");
+ }
+ Serial.println(pressedButton);
+ lastPressedButton = pressedButton;
+ lastPressedButtonTime=now;
+ }
+ }
+ }
+
+ // If no time has been received yet, request it every 10 second from controller
+ // When time has been received, request update every hour
+ if ((!timeReceived && now-lastRequest > 10*1000)
+ || (timeReceived && now-lastRequest > 60*1000*60)) {
+ // Request time from controller.
+ Serial.println("requesting time");
+ gw.requestTime(receiveTime);
+ lastRequest = now;
+ }
+
+ // Update time every second
+ if (timeReceived && now-lastTimeUpdate > 1000) {
+ printTime();
+ lastTimeUpdate = now;
+ }
+}
+
+
+
+// This is called when a new time value was received
+void receiveTime(unsigned long time) {
+ // Ok, set incoming time
+ setTime(time);
+ timeReceived = true;
+}
+
+void printTime() {
+ sprintf(timeBuf, "%02d:%02d:%02d", hour(), minute(), second());
+ myGLCD.print(timeBuf, 60,7);
+}
+
+
diff --git a/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/Ubuntu.c b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/Ubuntu.c
new file mode 100644
index 0000000..4d7ce1c
--- /dev/null
+++ b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/Ubuntu.c
@@ -0,0 +1,110 @@
+// Ubuntu.c
+// Font type : Full (95 characters)
+// Font size : 24x32 pixels
+// Memory usage : 9124 bytes
+
+#include
+
+const uint8_t Ubuntu[9124] PROGMEM={
+0x18,0x20,0x20,0x5F,
+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,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,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x1C,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,0x01,0xC0,0xE0,0x03,0xE1,0xF0,0x03,0xE1,0xF0,0x03,0xE1,0xF0,0x01,0xE0,0xF0,0x00,0xE0,0x70,0x01,0xC0,0xE0,0x03,0xC1,0xE0,0x0F,0x87,0xC0,0x0E,0x07,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,0x38,0x70,0x00,0x38,0x70,0x00,0x70,0xE0,0x00,0x70,0xE0,0x00,0x70,0xE0,0x00,0x70,0xE0,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0xE1,0xC0,0x00,0xE1,0xC0,0x00,0xE1,0xC0,0x01,0xC3,0x80,0x01,0xC3,0x80,0x01,0xC3,0x80,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x03,0x87,0x00,0x03,0x87,0x00,0x03,0x87,0x00,0x03,0x87,0x00,0x07,0x0E,0x00,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // #
+0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x7F,0x00,0x01,0xFF,0xC0,0x03,0xFF,0xC0,0x07,0x80,0x80,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x03,0xF8,0x00,0x01,0xFE,0x00,0x00,0x7F,0x80,0x00,0x0F,0xC0,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x02,0x01,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0x80,0x01,0xFE,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00, // $
+0x00,0x00,0x00,0x07,0x80,0x70,0x0F,0xC0,0xE0,0x0C,0xC0,0xE0,0x18,0x61,0xC0,0x18,0x63,0x80,0x18,0x63,0x80,0x18,0x67,0x00,0x18,0x67,0x00,0x18,0x6E,0x00,0x0C,0xDC,0x00,0x0F,0xDC,0x00,0x07,0xB8,0x00,0x00,0x3B,0xC0,0x00,0x77,0xE0,0x00,0x76,0x60,0x00,0xEC,0x30,0x01,0xCC,0x30,0x01,0xCC,0x30,0x03,0x8C,0x30,0x03,0x8C,0x30,0x07,0x0C,0x30,0x0E,0x06,0x60,0x0E,0x07,0xE0,0x1C,0x03,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,0x7C,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x03,0xC7,0x80,0x03,0x83,0x80,0x03,0x83,0x80,0x03,0x83,0x80,0x03,0x87,0x00,0x01,0xCF,0x00,0x01,0xFE,0x00,0x00,0xFC,0x00,0x01,0xF0,0x70,0x03,0xF8,0x70,0x03,0xBC,0x70,0x07,0x1E,0x60,0x0E,0x0F,0xE0,0x0E,0x07,0xE0,0x0E,0x03,0xC0,0x0E,0x01,0xC0,0x0F,0x03,0xE0,0x07,0x8F,0xE0,0x07,0xFF,0x70,0x03,0xFE,0x70,0x00,0xF8,0x38,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,0x18,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x02,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,0x00,0x00, // '
+0x00,0x07,0x00,0x00,0x0F,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0x00,0x00,0x01,0x00, // (
+0x00,0x60,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x00,0x60,0x00,0x00,0x40,0x00, // )
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x02,0x1C,0x20,0x03,0xC9,0xE0,0x07,0xFF,0xF0,0x01,0xFF,0xC0,0x00,0x1C,0x00,0x00,0x36,0x00,0x00,0x77,0x00,0x00,0xF3,0x80,0x01,0xE3,0xC0,0x00,0xE3,0x80,0x00,0x41,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,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x1F,0x00,0x00,0x1F,0x00,0x00,0x1F,0x00,0x00,0x0F,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x78,0x00,0x00,0x70,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,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,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,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,0x1C,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .
+0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00, // /
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x03,0xC7,0x80,0x07,0x83,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x30,0xE0,0x0E,0x78,0xE0,0x0E,0x78,0xE0,0x0E,0x78,0xE0,0x0E,0x30,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0xC7,0x80,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x7C,0x00,0x00,0xFC,0x00,0x03,0xFC,0x00,0x07,0x9C,0x00,0x02,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x03,0xFF,0xC0,0x03,0xFF,0xC0,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x03,0xFF,0x00,0x07,0xFF,0x80,0x07,0x87,0xC0,0x02,0x03,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x0F,0xFF,0x00,0x0F,0xFF,0x80,0x06,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x80,0x00,0x07,0xC0,0x00,0x01,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x01,0xE0,0x04,0x03,0xC0,0x0F,0xFF,0x80,0x0F,0xFF,0x00,0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x0F,0x80,0x00,0x1F,0x80,0x00,0x3F,0x80,0x00,0x3B,0x80,0x00,0x73,0x80,0x00,0xF3,0x80,0x01,0xE3,0x80,0x01,0xC3,0x80,0x03,0x83,0x80,0x03,0x83,0x80,0x07,0x03,0x80,0x0F,0x03,0x80,0x0E,0x03,0x80,0x1E,0x03,0x80,0x1F,0xFF,0xF0,0x1F,0xFF,0xF0,0x1F,0xFF,0xF0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4
+0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x80,0x03,0xFF,0x80,0x03,0xFF,0x80,0x03,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xF0,0x00,0x07,0xFE,0x00,0x07,0xFF,0x00,0x00,0x1F,0x80,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x0C,0x07,0x80,0x0F,0xFF,0x00,0x0F,0xFE,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x1F,0xC0,0x00,0x7F,0xC0,0x00,0xFC,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x06,0x7E,0x00,0x0F,0xFF,0x80,0x0F,0xFF,0xC0,0x0F,0x03,0xC0,0x0E,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x00,0xE0,0x07,0x01,0xC0,0x07,0xC3,0xC0,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x03,0xC7,0xC0,0x07,0x03,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x81,0xC0,0x03,0xC3,0x80,0x03,0xF7,0x00,0x01,0xFE,0x00,0x01,0xFF,0x80,0x03,0xCF,0xC0,0x07,0x03,0xC0,0x06,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x83,0xC0,0x07,0xFF,0xC0,0x03,0xFF,0x80,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x07,0x87,0xC0,0x07,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x00,0xE0,0x07,0x81,0xE0,0x07,0xFF,0xE0,0x03,0xFF,0xE0,0x00,0xFE,0xE0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x7E,0x00,0x07,0xFC,0x00,0x07,0xF8,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9
+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,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x38,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,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x3C,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x01,0xE0,0x00,0x01,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,0x40,0x00,0x01,0xE0,0x00,0x0F,0xE0,0x00,0x3F,0xC0,0x00,0xFE,0x00,0x03,0xF8,0x00,0x0F,0xC0,0x00,0x0F,0x00,0x00,0x0F,0xC0,0x00,0x07,0xF8,0x00,0x00,0xFE,0x00,0x00,0x3F,0xC0,0x00,0x0F,0xE0,0x00,0x01,0xE0,0x00,0x00,0x40,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,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,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,0x04,0x00,0x00,0x0F,0x00,0x00,0x0F,0xE0,0x00,0x07,0xF8,0x00,0x00,0xFE,0x00,0x00,0x3F,0x80,0x00,0x07,0xE0,0x00,0x01,0xE0,0x00,0x07,0xE0,0x00,0x3F,0xC0,0x00,0xFE,0x00,0x07,0xF8,0x00,0x0F,0xE0,0x00,0x0F,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,0xFE,0x00,0x03,0xFF,0x80,0x03,0xFF,0xC0,0x01,0x03,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x38,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,0x3F,0x00,0x00,0xFF,0x80,0x01,0xFF,0xC0,0x01,0xE1,0xE0,0x03,0x80,0xE0,0x03,0x80,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x07,0xF0,0x0E,0x1F,0xF0,0x0E,0x3F,0xF0,0x0E,0x3C,0x70,0x0E,0x78,0x70,0x0E,0x70,0x70,0x0E,0x70,0x70,0x0E,0x70,0x70,0x0E,0x70,0x70,0x0E,0x78,0x70,0x0E,0x38,0x70,0x07,0x3F,0xF0,0x07,0x1F,0xF0,0x07,0x07,0xE0,0x07,0x80,0x00,0x03,0xC0,0x00,0x03,0xC0,0x00,0x01,0xF0,0x00,0x00,0xFF,0xC0,0x00,0x7F,0xC0,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // @
+0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x00,0xF7,0x00,0x00,0xE7,0x00,0x00,0xE7,0x00,0x01,0xE7,0x80,0x01,0xC3,0x80,0x01,0xC3,0x80,0x03,0xC3,0xC0,0x03,0xC1,0xC0,0x03,0x81,0xC0,0x03,0x81,0xC0,0x07,0x81,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x0F,0x00,0xF0,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x1E,0x00,0x78,0x1C,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // A
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x0F,0xFF,0x00,0x0F,0xFF,0x80,0x0E,0x07,0xC0,0x0E,0x03,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x03,0x80,0x0E,0x07,0x80,0x0F,0xFF,0x00,0x0F,0xFF,0x00,0x0F,0xFF,0x80,0x0E,0x03,0xC0,0x0E,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x01,0xE0,0x0E,0x07,0xC0,0x0F,0xFF,0xC0,0x0F,0xFF,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // B
+0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x7F,0xE0,0x01,0xFF,0xE0,0x03,0xE0,0x40,0x03,0xC0,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0F,0x00,0x00,0x07,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x03,0xE0,0x40,0x01,0xFF,0xE0,0x00,0xFF,0xE0,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // C
+0x00,0x00,0x00,0x0F,0xF0,0x00,0x0F,0xFE,0x00,0x0F,0xFF,0x00,0x0E,0x0F,0x80,0x0E,0x03,0x80,0x0E,0x03,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x01,0xE0,0x0E,0x01,0xC0,0x0E,0x03,0xC0,0x0E,0x03,0x80,0x0E,0x0F,0x80,0x0F,0xFF,0x00,0x0F,0xFE,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // D
+0x00,0x00,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xFF,0x80,0x07,0xFF,0x80,0x07,0xFF,0x80,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // E
+0x00,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // F
+0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0xFF,0xC0,0x01,0xFF,0xE0,0x03,0xE0,0xC0,0x03,0xC0,0x40,0x07,0x80,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x00,0xE0,0x07,0x00,0xE0,0x07,0x80,0xE0,0x03,0xC0,0xE0,0x03,0xE0,0xE0,0x01,0xFF,0xE0,0x00,0xFF,0xE0,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // G
+0x00,0x00,0x00,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // H
+0x00,0x00,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // I
+0x00,0x00,0x00,0x01,0xFF,0xC0,0x01,0xFF,0xC0,0x01,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x04,0x03,0xC0,0x07,0x07,0x80,0x0F,0xFF,0x00,0x07,0xFE,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // J
+0x00,0x00,0x00,0x0E,0x01,0xE0,0x0E,0x03,0xC0,0x0E,0x03,0x80,0x0E,0x07,0x80,0x0E,0x0F,0x00,0x0E,0x0E,0x00,0x0E,0x1C,0x00,0x0E,0x3C,0x00,0x0E,0x78,0x00,0x0E,0xF0,0x00,0x0F,0xE0,0x00,0x0F,0xE0,0x00,0x0F,0xF0,0x00,0x0E,0xF8,0x00,0x0E,0x7C,0x00,0x0E,0x3E,0x00,0x0E,0x1E,0x00,0x0E,0x0F,0x00,0x0E,0x07,0x80,0x0E,0x03,0xC0,0x0E,0x03,0xC0,0x0E,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // K
+0x00,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // L
+0x00,0x00,0x00,0x03,0x00,0x60,0x03,0x80,0xF0,0x07,0x80,0xF0,0x07,0x80,0xF0,0x06,0xC1,0xB0,0x06,0xC1,0xB0,0x06,0xE3,0xB0,0x06,0x63,0x30,0x06,0x63,0x30,0x06,0x77,0x30,0x06,0x36,0x30,0x06,0x36,0x30,0x06,0x3E,0x30,0x06,0x1C,0x38,0x0E,0x1C,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x0E,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // M
+0x00,0x00,0x00,0x07,0x80,0x70,0x07,0xC0,0x70,0x07,0xC0,0x70,0x07,0xE0,0x70,0x07,0xE0,0x70,0x07,0xF0,0x70,0x07,0x70,0x70,0x07,0x70,0x70,0x07,0x38,0x70,0x07,0x38,0x70,0x07,0x1C,0x70,0x07,0x1C,0x70,0x07,0x0E,0x70,0x07,0x0E,0x70,0x07,0x06,0x70,0x07,0x07,0x70,0x07,0x07,0x70,0x07,0x03,0xF0,0x07,0x03,0xF0,0x07,0x01,0xF0,0x07,0x01,0xF0,0x07,0x00,0xF0,0x07,0x00,0xF0,0x07,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // N
+0x00,0x00,0x00,0x00,0x7C,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x07,0x83,0xC0,0x0F,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x1C,0x00,0xF0,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0xF0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x83,0xC0,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // O
+
+0x00,0x00,0x00,0x07,0xFC,0x00,0x07,0xFF,0x00,0x07,0xFF,0x80,0x07,0x03,0xC0,0x07,0x01,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x01,0xE0,0x07,0x03,0xC0,0x07,0xFF,0x80,0x07,0xFF,0x00,0x07,0xFC,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // P
+0x00,0x00,0x00,0x00,0x7C,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x07,0x83,0xC0,0x0F,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x1C,0x00,0xF0,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0xF0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x83,0xC0,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0xFE,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1F,0x00,0x00,0x0F,0xE0,0x00,0x07,0xE0,0x00,0x00,0xC0,0x00,0x00,0x00, // Q
+0x00,0x00,0x00,0x0F,0xF8,0x00,0x0F,0xFE,0x00,0x0F,0xFF,0x00,0x0E,0x07,0x80,0x0E,0x03,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x03,0x80,0x0E,0x07,0x80,0x0F,0xFF,0x00,0x0F,0xFE,0x00,0x0F,0xFC,0x00,0x0E,0x1E,0x00,0x0E,0x0E,0x00,0x0E,0x07,0x00,0x0E,0x07,0x00,0x0E,0x03,0x80,0x0E,0x03,0x80,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // R
+0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0xFF,0xC0,0x03,0xFF,0xC0,0x03,0xC0,0x80,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x80,0x00,0x03,0xE0,0x00,0x01,0xF8,0x00,0x00,0xFE,0x00,0x00,0x3F,0x80,0x00,0x0F,0xC0,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x04,0x01,0xE0,0x0F,0x03,0xC0,0x0F,0xFF,0xC0,0x07,0xFF,0x80,0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // S
+0x00,0x00,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // T
+0x00,0x00,0x00,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // U
+0x00,0x00,0x00,0x1C,0x00,0x70,0x1C,0x00,0x70,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x03,0x83,0x80,0x03,0x83,0x80,0x03,0x83,0x80,0x03,0x87,0x80,0x01,0xC7,0x00,0x01,0xC7,0x00,0x01,0xC7,0x00,0x00,0xEE,0x00,0x00,0xEE,0x00,0x00,0xEE,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // V
+0x00,0x00,0x00,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x38,0xE0,0x0E,0x38,0xE0,0x0E,0x38,0xE0,0x0E,0x6C,0xE0,0x0E,0x6C,0xE0,0x0E,0x6C,0xE0,0x0E,0xC6,0xE0,0x0E,0xC6,0xE0,0x0E,0xC6,0xE0,0x0F,0x83,0xE0,0x0F,0x83,0xE0,0x0F,0x83,0xE0,0x0F,0x01,0xE0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // W
+0x00,0x00,0x00,0x1E,0x00,0xF0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x01,0xC0,0x03,0x83,0x80,0x03,0x83,0x80,0x01,0xC7,0x00,0x01,0xEF,0x00,0x00,0xEE,0x00,0x00,0xFE,0x00,0x00,0x7C,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0xFE,0x00,0x00,0xEE,0x00,0x01,0xC7,0x00,0x03,0xC7,0x80,0x03,0x83,0x80,0x07,0x83,0xC0,0x07,0x01,0xC0,0x0F,0x01,0xE0,0x0E,0x00,0xE0,0x1E,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // X
+0x00,0x00,0x00,0x1C,0x00,0x70,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0x83,0x80,0x03,0xC3,0x80,0x01,0xC7,0x00,0x01,0xEF,0x00,0x00,0xEE,0x00,0x00,0xFE,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Y
+0x00,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Z
+0x01,0xFF,0x00,0x01,0xFF,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xFF,0x00,0x01,0xFF,0x00, // [
+0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0xE0, //
+0x00,0xFF,0x80,0x00,0xFF,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0xFF,0x80,0x00,0xFF,0x80, // ]
+0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0xEE,0x00,0x00,0xEE,0x00,0x01,0xC7,0x00,0x01,0xC7,0x00,0x03,0xC7,0x80,0x03,0x83,0x80,0x07,0x83,0xC0,0x07,0x01,0xC0,0x0F,0x01,0xE0,0x02,0x00,0x80,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,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,0x3F,0xFF,0xF8,0x3F,0xFF,0xF8,0x3F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // _
+
+0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0xFE,0x00,0x01,0xC7,0x00,0x01,0x83,0x00,0x01,0x83,0x00,0x01,0x83,0x00,0x01,0xC7,0x00,0x00,0xFE,0x00,0x00,0x7C,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x01,0xFF,0x80,0x01,0xFF,0xC0,0x01,0x83,0xE0,0x00,0x01,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x7F,0xE0,0x01,0xFF,0xE0,0x03,0xFF,0xE0,0x07,0xC0,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x80,0xE0,0x03,0xFF,0xE0,0x01,0xFF,0xE0,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // a
+0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x7E,0x00,0x07,0xFF,0x00,0x07,0xFF,0x80,0x07,0x83,0xC0,0x07,0x01,0xC0,0x07,0x01,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x01,0xE0,0x07,0x01,0xC0,0x07,0x07,0xC0,0x07,0xFF,0x80,0x07,0xFF,0x00,0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // b
+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,0x3F,0xC0,0x00,0xFF,0xE0,0x03,0xFF,0xE0,0x03,0xE0,0x40,0x07,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x07,0x80,0x00,0x03,0xE0,0x60,0x03,0xFF,0xE0,0x00,0xFF,0xE0,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // c
+0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x7E,0xE0,0x00,0xFF,0xE0,0x01,0xFF,0xE0,0x03,0xC1,0xE0,0x03,0x80,0xE0,0x07,0x80,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x80,0xE0,0x03,0x80,0xE0,0x03,0xE0,0xE0,0x01,0xFF,0xE0,0x00,0xFF,0xE0,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // d
+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,0x7E,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x07,0xC3,0xC0,0x07,0x01,0xC0,0x07,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xC0,0xC0,0x03,0xFF,0xC0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // e
+0x00,0x0F,0xC0,0x00,0x3F,0xF0,0x00,0x7F,0xF0,0x00,0x78,0x30,0x00,0xF0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xC0,0x0F,0xFF,0xC0,0x0F,0xFF,0xC0,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // f
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0xFF,0xC0,0x03,0xFF,0xC0,0x07,0x81,0xC0,0x07,0x01,0xC0,0x0F,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x0E,0x01,0xC0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0xFF,0xC0,0x01,0xFF,0xC0,0x00,0xFD,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x06,0x07,0x80,0x07,0xFF,0x80,0x07,0xFF,0x00,0x03,0xFC,0x00,0x00,0x00,0x00, // g
+0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xFC,0x00,0x07,0xFF,0x00,0x07,0xFF,0x80,0x07,0x07,0x80,0x07,0x03,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // h
+0x00,0x00,0x00,0x00,0x60,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x0F,0xF0,0x00,0x0F,0xF0,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x78,0x20,0x00,0x3F,0xE0,0x00,0x3F,0xE0,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // i
+0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x80,0x03,0xFF,0x80,0x03,0xFF,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x06,0x0F,0x00,0x0F,0xFF,0x00,0x0F,0xFE,0x00,0x03,0xF8,0x00, // j
+0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x01,0xE0,0x07,0x03,0xC0,0x07,0x07,0x80,0x07,0x0F,0x00,0x07,0x1E,0x00,0x07,0x3C,0x00,0x07,0x78,0x00,0x07,0xF0,0x00,0x07,0xE0,0x00,0x07,0xF0,0x00,0x07,0x78,0x00,0x07,0x1C,0x00,0x07,0x0F,0x00,0x07,0x07,0x00,0x07,0x03,0x80,0x07,0x03,0xC0,0x07,0x01,0xE0,0x07,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // k
+0x07,0xF8,0x00,0x07,0xF8,0x00,0x07,0xF8,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x3C,0x10,0x00,0x1F,0xF0,0x00,0x1F,0xF0,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // l
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE3,0xC0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0E,0x3C,0xF0,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x1C,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x0E,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // m
+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,0xFE,0x00,0x03,0xFF,0x80,0x03,0xFF,0xC0,0x03,0x83,0xC0,0x03,0x81,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // n
+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,0x7C,0x00,0x01,0xFF,0x00,0x03,0xFF,0x80,0x07,0x83,0xC0,0x07,0x01,0xC0,0x0F,0x01,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x01,0xE0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0xFF,0x80,0x01,0xFF,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // o
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x07,0xFF,0x00,0x07,0xFF,0x80,0x07,0x07,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x01,0xE0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x07,0xFF,0x80,0x07,0xFF,0x00,0x07,0x7C,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00, // p
+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,0x3F,0x80,0x00,0xFF,0xE0,0x01,0xFF,0xE0,0x03,0xE0,0xE0,0x03,0x80,0xE0,0x03,0x80,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x80,0xE0,0x03,0x80,0xE0,0x03,0xC1,0xE0,0x01,0xFF,0xE0,0x00,0xFF,0xE0,0x00,0x3E,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0, // q
+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,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0x80,0x80,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // r
+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,0xFF,0x00,0x01,0xFF,0x80,0x03,0xFF,0x80,0x07,0x81,0x80,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0xC0,0x00,0x03,0xF0,0x00,0x01,0xFE,0x00,0x00,0x7F,0x00,0x00,0x1F,0x80,0x00,0x03,0xC0,0x00,0x01,0xC0,0x00,0x01,0xC0,0x06,0x03,0xC0,0x07,0xFF,0x80,0x07,0xFF,0x80,0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // s
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x0F,0xFF,0xE0,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x20,0x00,0x7F,0xE0,0x00,0x7F,0xE0,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // t
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x81,0xC0,0x03,0xC1,0xC0,0x03,0xFF,0xC0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // u
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x70,0x1E,0x00,0xF0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0F,0x01,0xE0,0x07,0x01,0xC0,0x07,0x01,0xC0,0x07,0x83,0xC0,0x03,0x83,0x80,0x03,0x83,0x80,0x03,0xC7,0x00,0x01,0xC7,0x00,0x01,0xEF,0x00,0x00,0xEE,0x00,0x00,0xFE,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // v
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x00,0x70,0x1C,0x10,0x70,0x0C,0x38,0xE0,0x0E,0x38,0xE0,0x0E,0x38,0xE0,0x0E,0x28,0xE0,0x0E,0x6C,0xE0,0x0E,0x6C,0xE0,0x06,0x44,0xC0,0x06,0xC6,0xC0,0x06,0xC7,0xC0,0x07,0x87,0xC0,0x07,0x83,0xC0,0x07,0x83,0x80,0x03,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // w
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x01,0xE0,0x0F,0x03,0xC0,0x07,0x03,0x80,0x03,0x87,0x80,0x03,0xCF,0x00,0x01,0xEE,0x00,0x00,0xFC,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0x7C,0x00,0x00,0xFE,0x00,0x01,0xEE,0x00,0x01,0xC7,0x00,0x03,0xC3,0x80,0x07,0x83,0xC0,0x0F,0x01,0xC0,0x0E,0x01,0xE0,0x1E,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // x
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x70,0x0F,0x00,0xF0,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x80,0xE0,0x03,0x81,0xE0,0x03,0x81,0xC0,0x03,0xC1,0xC0,0x01,0xC3,0xC0,0x01,0xC3,0x80,0x01,0xE3,0x80,0x00,0xE7,0x80,0x00,0xF7,0x80,0x00,0x77,0x00,0x00,0x7F,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x0F,0xF0,0x00,0x0F,0xF0,0x00,0x0F,0xC0,0x00, // y
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // z
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x0F,0x80,0x00,0x0F,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x7F,0x80,0x00,0x1F,0x80, // {
+0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00, // |
+0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0xFF,0x00,0x00,0xFC,0x00, // }
+0x00,0x00,0x00,0x01,0xE0,0x20,0x03,0xF0,0x30,0x07,0xFC,0x70,0x0E,0x3F,0xE0,0x0C,0x0F,0xC0,0x04,0x07,0x80,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,0x00, // ~
+};
diff --git a/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/arial_bold.c b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/arial_bold.c
new file mode 100644
index 0000000..e8107e9
--- /dev/null
+++ b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/arial_bold.c
@@ -0,0 +1,111 @@
+// arial_bold.c
+// Font type : Full (95 characters)
+// Font size : 16x16 pixels
+// Memory usage : 3044 bytes
+// Submitted by : MBWK
+
+#include
+
+const uint8_t arial_bold[3044] PROGMEM={
+0x10,0x10,0x20,0x5F,
+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,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, // !
+0x00,0x00,0x00,0x00,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,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,0x60,0x03,0x60,0x06,0xC0,0x3F,0xF0,0x3F,0xF0,0x06,0xC0,0x0D,0x80,0x3F,0xF0,0x3F,0xF0,0x0D,0x80,0x1B,0x00,0x1B,0x00,0x00,0x00,0x00,0x00, // #
+0x00,0x00,0x01,0x00,0x03,0x80,0x07,0xC0,0x0D,0x60,0x0D,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x0D,0x60,0x0D,0x60,0x07,0xC0,0x03,0x80,0x01,0x00,0x00,0x00, // $
+0x00,0x00,0x00,0x00,0x3C,0x18,0x66,0x30,0x66,0x30,0x66,0x60,0x66,0xC0,0x3C,0xC0,0x01,0x9E,0x01,0xB3,0x03,0x33,0x03,0x33,0x06,0x33,0x0C,0x1E,0x00,0x00,0x00,0x00, // %
+0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x0C,0x60,0x0C,0x60,0x07,0xC0,0x07,0x80,0x0D,0x90,0x19,0xD8,0x18,0xF0,0x18,0x78,0x0F,0xFC,0x07,0x88,0x00,0x00,0x00,0x00, // &
+0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
+0x00,0x00,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x00,0x00,0x00,0x00, // (
+0x00,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00, // )
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x33,0x98,0x3F,0xF8,0x07,0xC0,0x07,0xC0,0x0E,0xE0,0x1C,0x70,0x04,0x40,0x00,0x00,0x00,0x00,0x00,0x00, // *
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x07,0xF8,0x07,0xF8,0x00,0xC0,0x00,0xC0,0x00,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,0x03,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x00,0x00, // ,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xE0,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,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .
+0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, // /
+
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // 0
+0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x07,0x80,0x0D,0x80,0x09,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00, // 1
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x30,0x0C,0x30,0x00,0x30,0x00,0x60,0x00,0xE0,0x01,0xC0,0x03,0x80,0x06,0x00,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00, // 2
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x0E,0x30,0x00,0x30,0x01,0xE0,0x01,0xE0,0x00,0x70,0x00,0x30,0x0C,0x30,0x0E,0x70,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // 3
+0x00,0x00,0x00,0x00,0x00,0x60,0x00,0xE0,0x00,0xE0,0x01,0xE0,0x03,0x60,0x03,0x60,0x06,0x60,0x0C,0x60,0x0F,0xF0,0x0F,0xF0,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00, // 4
+0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x06,0x00,0x0C,0x00,0x0F,0xC0,0x0F,0xE0,0x0C,0x70,0x00,0x30,0x0C,0x30,0x0E,0x70,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // 5
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x06,0x30,0x0C,0x00,0x0D,0xC0,0x0F,0xE0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x06,0x30,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // 6
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x0F,0xF0,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, // 7
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x07,0xE0,0x07,0xE0,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // 8
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0C,0x60,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x07,0xF0,0x03,0xB0,0x00,0x30,0x0C,0x60,0x0F,0xE0,0x07,0xC0,0x00,0x00,0x00,0x00, // 9
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // :
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x00,0x00, // ;
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xE0,0x03,0xC0,0x0F,0x00,0x1C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xE0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // <
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x1F,0xF0,0x00,0x00,0x00,0x00,0x1F,0xF0,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // =
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x07,0x80,0x01,0xE0,0x00,0x70,0x01,0xE0,0x07,0x80,0x0E,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // >
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x30,0x0C,0x30,0x00,0x70,0x00,0xE0,0x01,0xC0,0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00, // ?
+
+0x00,0x00,0x07,0xC0,0x0C,0x30,0x13,0x78,0x17,0xE8,0x2C,0xC8,0x2C,0xC8,0x2C,0xC8,0x2F,0xD0,0x26,0xE0,0x10,0x08,0x08,0x10,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, // @
+0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x06,0xC0,0x06,0xC0,0x06,0xC0,0x0C,0x60,0x0C,0x60,0x0F,0xE0,0x1F,0xF0,0x18,0x30,0x18,0x30,0x30,0x18,0x00,0x00,0x00,0x00, // A
+0x00,0x00,0x00,0x00,0x1F,0xE0,0x1F,0xF0,0x18,0x30,0x18,0x30,0x18,0x30,0x1F,0xE0,0x1F,0xF0,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF0,0x1F,0xE0,0x00,0x00,0x00,0x00, // B
+0x00,0x00,0x00,0x00,0x03,0xE0,0x0F,0xF0,0x0C,0x38,0x1C,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1C,0x10,0x0C,0x38,0x0F,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00, // C
+0x00,0x00,0x00,0x00,0x1F,0xC0,0x1F,0xF0,0x18,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x30,0x1F,0xF0,0x1F,0xC0,0x00,0x00,0x00,0x00, // D
+0x00,0x00,0x00,0x00,0x0F,0xF8,0x0F,0xF8,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0F,0xF8,0x0F,0xF8,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0F,0xF8,0x0F,0xF8,0x00,0x00,0x00,0x00, // E
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x0F,0xF0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0F,0xE0,0x0F,0xE0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // F
+0x00,0x00,0x00,0x00,0x07,0xE0,0x1F,0xF0,0x18,0x38,0x38,0x10,0x30,0x00,0x30,0x00,0x30,0xF8,0x30,0xF8,0x38,0x18,0x18,0x38,0x1F,0xF8,0x07,0xE0,0x00,0x00,0x00,0x00, // G
+0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, // H
+0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00, // I
+0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x0C,0x30,0x0E,0x70,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00, // J
+0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0xC0,0x19,0x80,0x1B,0xC0,0x1E,0xC0,0x1C,0x60,0x18,0x70,0x18,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, // K
+0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00, // L
+0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x3C,0x78,0x3C,0x78,0x34,0x58,0x36,0xD8,0x36,0xD8,0x36,0xD8,0x33,0x98,0x33,0x98,0x33,0x98,0x31,0x18,0x00,0x00,0x00,0x00, // M
+0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0x18,0x1E,0x18,0x1E,0x18,0x1B,0x18,0x19,0x98,0x19,0x98,0x18,0xD8,0x18,0x78,0x18,0x78,0x18,0x38,0x18,0x18,0x00,0x00,0x00,0x00, // N
+0x00,0x00,0x00,0x00,0x07,0xC0,0x1F,0xF0,0x18,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x30,0x1F,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00, // O
+
+0x00,0x00,0x00,0x00,0x0F,0xE0,0x0F,0xF0,0x0C,0x38,0x0C,0x18,0x0C,0x38,0x0F,0xF0,0x0F,0xE0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // P
+0x00,0x00,0x00,0x00,0x07,0xC0,0x1F,0xF0,0x18,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x31,0xB8,0x18,0xF0,0x1F,0xF0,0x07,0xB0,0x00,0x18,0x00,0x00, // Q
+0x00,0x00,0x00,0x00,0x1F,0xE0,0x1F,0xF0,0x18,0x38,0x18,0x18,0x18,0x38,0x1F,0xF0,0x1F,0xC0,0x18,0xE0,0x18,0x70,0x18,0x30,0x18,0x38,0x18,0x1C,0x00,0x00,0x00,0x00, // R
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x0E,0x38,0x0C,0x18,0x0F,0x00,0x07,0xE0,0x01,0xF0,0x00,0x38,0x0C,0x18,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00, // S
+0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00, // T
+0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00, // U
+0x00,0x00,0x00,0x00,0x30,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x0E,0xE0,0x06,0xC0,0x06,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00, // V
+0x00,0x00,0x00,0x00,0x31,0xC6,0x31,0xC6,0x31,0xC6,0x1B,0x6C,0x1B,0x6C,0x1B,0x6C,0x1B,0x6C,0x1B,0x6C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x00,0x00,0x00,0x00, // W
+0x00,0x00,0x00,0x00,0x18,0x30,0x1C,0x70,0x0C,0x60,0x06,0xC0,0x07,0xC0,0x03,0x80,0x03,0x80,0x07,0xC0,0x06,0xC0,0x0C,0x60,0x1C,0x70,0x18,0x30,0x00,0x00,0x00,0x00, // X
+0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0x38,0x0C,0x30,0x06,0x60,0x06,0x60,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00, // Y
+0x00,0x00,0x00,0x00,0x07,0xF8,0x07,0xF8,0x00,0x30,0x00,0x60,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x06,0x00,0x0F,0xF8,0x0F,0xF8,0x00,0x00,0x00,0x00, // Z
+0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x03,0xC0,0x00,0x00, // [
+0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00, //
+0x00,0x00,0x03,0xC0,0x03,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x00,0x00, // ]
+0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x30,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,0xFF,0xFF,0xFF,0xFF,0x00,0x00, // _
+
+0x00,0x00,0x00,0x00,0x01,0x80,0x00,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,0x07,0xC0,0x0F,0xE0,0x0C,0x60,0x01,0xE0,0x07,0xE0,0x0E,0x60,0x0C,0x60,0x0F,0xE0,0x07,0xB0,0x00,0x00,0x00,0x00,0x00,0x00, // a
+0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0D,0xC0,0x0F,0xE0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x0F,0xE0,0x0D,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // b
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x60,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x60,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // c
+0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x30,0x03,0xB0,0x07,0xF0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x07,0xF0,0x03,0xB0,0x00,0x00,0x00,0x00,0x00,0x00, // d
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x07,0xC0,0x0C,0x60,0x0F,0xE0,0x0F,0xE0,0x0C,0x00,0x0E,0x60,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00, // e
+0x00,0x00,0x03,0xC0,0x07,0xC0,0x06,0x00,0x0F,0x80,0x0F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // f
+0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x0F,0xE0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x18,0x60,0x1C,0xE0,0x0F,0xE0,0x07,0x60,0x18,0x60,0x1F,0xE0,0x0F,0xC0,0x00,0x00, // g
+0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0D,0xE0,0x0F,0xF0,0x0E,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, // h
+0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, // i
+0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0x80,0x07,0x00, // j
+0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x60,0x0C,0xC0,0x0D,0x80,0x0F,0x80,0x0F,0xC0,0x0E,0xC0,0x0C,0xC0,0x0C,0x60,0x0C,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // k
+0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, // l
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x38,0x3F,0xFC,0x39,0xCC,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x00,0x00,0x00,0x00,0x00,0x00, // m
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xE0,0x0F,0xF0,0x0E,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, // n
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x07,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // o
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xC0,0x0F,0xE0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x0F,0xE0,0x0D,0xC0,0x0C,0x00,0x0C,0x00,0x0C,0x00, // p
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xB0,0x07,0xF0,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x07,0xF0,0x03,0xB0,0x00,0x30,0x00,0x30,0x00,0x30, // q
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x70,0x03,0xF0,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // r
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x0C,0x60,0x0F,0x00,0x07,0xC0,0x00,0xE0,0x0C,0x60,0x0F,0xE0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // s
+0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x07,0xC0,0x07,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // t
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x70,0x0F,0xF0,0x07,0xB0,0x00,0x00,0x00,0x00,0x00,0x00, // u
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x06,0x30,0x06,0x30,0x03,0x60,0x03,0x60,0x03,0x60,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, // v
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xC6,0x31,0xC6,0x19,0xCC,0x1B,0x6C,0x1B,0x6C,0x1B,0x6C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x00,0x00,0x00,0x00,0x00,0x00, // w
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x07,0x70,0x03,0x60,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x03,0x60,0x07,0x70,0x06,0x30,0x00,0x00,0x00,0x00,0x00,0x00, // x
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x18,0x0C,0x18,0x06,0x30,0x06,0x30,0x03,0x60,0x03,0x60,0x03,0xE0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x07,0x80,0x07,0x00, // y
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x03,0xF8,0x00,0x30,0x00,0x70,0x00,0xE0,0x01,0xC0,0x01,0x80,0x03,0xF8,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, // z
+0x01,0xC0,0x03,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0E,0x00,0x0E,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x01,0xC0,0x00,0x00, // {
+0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80, // |
+0x03,0x80,0x03,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x70,0x00,0x70,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x03,0xC0,0x03,0x80,0x00,0x00, // }
+0x00,0x00,0x00,0x00,0x07,0x88,0x0F,0xF8,0x08,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+};
diff --git a/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/logo.c b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/logo.c
new file mode 100644
index 0000000..116321b
--- /dev/null
+++ b/libraries/MySensors/examples/TouchDisplaySceneControllerSensor/logo.c
@@ -0,0 +1,235 @@
+// Generated by : ImageConverter 565 Online
+// Generated from : top.png
+// Time generated : Tue, 30 Sep 14 23:16:51 +0200 (Server timezone: CET)
+// Image Size : 60x60 pixels
+// Memory usage : 7200 bytes
+
+#include
+
+const unsigned short logo[3600] PROGMEM={
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels
+0x08E4, 0x28A3, 0x89A7, 0x71C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0050 (80) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0x18C3, 0x0082, 0x4944, 0x5A08, 0x8147, 0xBB0D, 0x5A69, // 0x0060 (96) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0070 (112) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52A0, 0x3180, 0x0000, 0x52AA, 0x2945, // 0x0090 (144) pixels
+0x2965, 0x0000, 0x0000, 0x0000, 0x18E3, 0x0021, 0x4144, 0x69C6, 0x6924, 0xAA49, 0xB3AD, 0x00E2, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00B0 (176) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x0861, 0x2924, 0x0000, 0x0000, 0x00C2, // 0x00D0 (208) pixels
+0x1862, 0x4924, 0x4924, 0x9965, 0xCB4A, 0xE48D, 0x9329, 0x0004, 0x6A69, 0x51A5, 0x2125, 0x0000, 0x5000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0100 (256) pixels
+0x0000, 0x1002, 0x1924, 0x41A4, 0x3124, 0x0000, 0x0000, 0x4A69, 0x2924, 0x0000, 0x0000, 0x4125, 0x38E4, 0x5983, 0x9A46, 0xE40A, // 0x0110 (272) pixels
+0xFCCD, 0xF4CE, 0x50E5, 0x6226, 0xBBAC, 0xAAEB, 0x4904, 0x0000, 0x4104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0x10C3, 0x0000, 0x0000, 0x2800, 0x41A5, 0x9309, // 0x0140 (320) pixels
+0x8288, 0x00E5, 0x4A49, 0x73AE, 0x31A6, 0x1800, 0x59C7, 0x71E7, 0x2100, 0x8266, 0xE40B, 0xFCAC, 0xFC8C, 0xDC8F, 0x5187, 0xA387, // 0x0150 (336) pixels
+0xABA9, 0x9249, 0x58C0, 0x0000, 0x0000, 0x8410, 0x2104, 0x10A2, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0160 (352) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0170 (368) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0944, 0x2062, 0x5165, 0x5903, 0x00A4, 0x0165, 0x8A67, 0xAB28, 0x7267, 0x29E8, 0x7B0C, // 0x0180 (384) pixels
+0x6185, 0x8207, 0xC3AC, 0x6A04, 0x0140, 0xC36A, 0xFDEC, 0xF5AC, 0xFD30, 0xCC51, 0x70C5, 0xC469, 0xEC8D, 0x89E9, 0x0000, 0x5269, // 0x0190 (400) pixels
+0x20C3, 0x0861, 0x0841, 0x18A2, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01A0 (416) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels
+0x5000, 0x0000, 0x71A5, 0x9A88, 0xAAA8, 0xC2C9, 0xA248, 0x9A26, 0xCA87, 0xCAC8, 0x58C0, 0x69C5, 0xC30B, 0xD3AC, 0xDC4A, 0x51A2, // 0x01C0 (448) pixels
+0x5A65, 0xEC6B, 0xFDCB, 0xFE0E, 0xFD0F, 0xEBF1, 0xB3EB, 0xED6E, 0xEC10, 0x61C7, 0x0123, 0x0021, 0x0082, 0x10C3, 0x3186, 0x0000, // 0x01D0 (464) pixels
+0x0000, 0x6180, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0xFFF0, 0x5943, // 0x01F0 (496) pixels
+0xA226, 0xD369, 0xEB4A, 0xE289, 0xE26A, 0xEB0E, 0x9AAA, 0x5042, 0xDBAC, 0xEC8C, 0xDC29, 0x7A45, 0xCC4A, 0xFB4C, 0xFD8D, 0xFDF0, // 0x0200 (512) pixels
+0xF510, 0xFD8F, 0xF5CF, 0xFE31, 0xCC31, 0x0000, 0x3801, 0x4143, 0x59A6, 0x4165, 0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0041, 0x9986, 0xC2E8, 0xDB88, 0xF44A, // 0x0230 (560) pixels
+0xDBCB, 0xEBCD, 0xD44D, 0x41C5, 0xB308, 0xEC0B, 0xF46C, 0xE40D, 0xD38A, 0xEC2D, 0xFEAE, 0xFEF2, 0xFDD2, 0xFE51, 0xFD52, 0xFCB1, // 0x0240 (576) pixels
+0xEC50, 0xCBEE, 0xB42A, 0xA2C6, 0x8985, 0x79A6, 0x89A6, 0xB1E6, 0xA1C6, 0x5924, 0x4986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0250 (592) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0260 (608) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x6125, 0xE3A9, 0xF4EB, 0xF5AC, 0xDD49, 0xE5CB, 0xFE6E, 0xC44E, // 0x0270 (624) pixels
+0x9B8A, 0xE4CD, 0xFD70, 0xFDB1, 0xCCCE, 0xF62E, 0xFE8D, 0xFE50, 0xFE56, 0xFD97, 0xF4B6, 0xF3F0, 0xFD2F, 0xFE50, 0xF5D1, 0xDC10, // 0x0280 (640) pixels
+0xB289, 0xC269, 0xCA68, 0xEB6C, 0xDC2F, 0xA2C9, 0x2062, 0x1945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0290 (656) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02A0 (672) pixels
+0x0000, 0x0000, 0x0000, 0x00E3, 0x3904, 0xB1C6, 0xE34C, 0xEC2C, 0xE4AB, 0xCD2B, 0xF64C, 0xFE70, 0xFE4F, 0xEE4E, 0xFED2, 0xFED2, // 0x02B0 (688) pixels
+0xFEB2, 0xFE33, 0xFDD3, 0xFE74, 0xF535, 0xCB11, 0xEB32, 0xFCF2, 0xFDF1, 0xF574, 0xFE13, 0xFE52, 0xBC4B, 0x8226, 0x6945, 0x6A28, // 0x02C0 (704) pixels
+0x3228, 0x2124, 0x1904, 0x51C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02D0 (720) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, // 0x02E0 (736) pixels
+0x0861, 0x91C5, 0xDA4A, 0xEAAB, 0xF3D1, 0xED12, 0xD591, 0xC50D, 0xA3E9, 0xB50C, 0xEE92, 0xB4EE, 0x7329, 0x82E8, 0xC572, 0xEDF3, // 0x02F0 (752) pixels
+0xB3ED, 0x3800, 0xA3CF, 0xFEF6, 0xFED0, 0xFEB4, 0xFEF3, 0xF6CF, 0xEEAE, 0xBD2A, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0300 (768) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0310 (784) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x39C7, 0x8227, 0xE2AA, 0xDB0C, // 0x0320 (800) pixels
+0xE4B3, 0xCD11, 0x83EA, 0x5286, 0x52AA, 0x7BEF, 0x2940, 0x3A2A, 0x5AEB, 0x73CF, 0x52AA, 0x3945, 0x1184, 0x6B2B, 0xACF1, 0xB54F, // 0x0330 (816) pixels
+0xF733, 0xFF51, 0xFF32, 0xFF55, 0xFF33, 0xF696, 0xCC93, 0x624A, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0340 (832) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0350 (848) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6248, 0x9249, 0xCB2A, 0xABEC, 0x8C2B, 0x5AE6, 0x10C3, 0x5269, // 0x0360 (864) pixels
+0xA4F3, 0xD637, 0x9C90, 0xAD33, 0xAD12, 0xE6FA, 0xC5B5, 0x6AC9, 0x83CE, 0xBD53, 0xCDD5, 0x9450, 0x6B47, 0xCD91, 0xFEB4, 0xEED4, // 0x0370 (880) pixels
+0x9490, 0x736E, 0xCCD5, 0xCC94, 0x7B2D, 0x0000, 0xFC10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0390 (912) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x6A8A, 0x8B0A, 0x9C2B, 0x7BCA, 0x3163, 0x526B, 0x1904, 0x736C, 0xE698, 0xD658, 0xD658, 0xD616, // 0x03A0 (928) pixels
+0xF719, 0xFF5B, 0xF71A, 0xEED8, 0xD5F5, 0xEEFA, 0xE6B8, 0xA4F3, 0x29A8, 0x0000, 0xAC31, 0xEE36, 0x9C2E, 0x0000, 0x4145, 0xAB70, // 0x03B0 (944) pixels
+0xC4B4, 0x93F0, 0x0000, 0x0000, 0x4008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03D0 (976) pixels
+0x8B6B, 0x7B6A, 0x1124, 0x0000, 0x0000, 0x41E6, 0x0002, 0xB512, 0xFF7B, 0xFF9C, 0xFF9C, 0xFFDD, 0xFF9C, 0xFFBD, 0xFFFF, 0xFF9C, // 0x03E0 (992) pixels
+0xFF5B, 0xFFBD, 0xFF9C, 0xF71A, 0x9CB1, 0x0000, 0x0000, 0xACB2, 0xE6B6, 0x4A68, 0x0000, 0x0144, 0x738E, 0x6B4D, 0x0000, 0x0000, // 0x03F0 (1008) pixels
+0x500A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2145, 0x3144, 0x0002, 0x0000, 0x0000, // 0x0410 (1040) pixels
+0x0000, 0x39C7, 0x0083, 0xC594, 0xEED9, 0xEEB8, 0xEEFA, 0xC5F7, 0xEEFA, 0xFFDD, 0xDEFB, 0xA4F2, 0xEE97, 0xF6D8, 0xEEF9, 0xFF7B, // 0x0420 (1056) pixels
+0xDE56, 0x41C6, 0x0000, 0x0000, 0x9491, 0x7BCE, 0x0000, 0x6209, 0x0000, 0x0000, 0x6A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0430 (1072) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0440 (1088) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0x0000, 0xAD12, // 0x0450 (1104) pixels
+0xCE17, 0x534E, 0x02B0, 0x7472, 0xF73A, 0xFF7B, 0xF71A, 0xA4F2, 0x02AE, 0x4B6F, 0x9C91, 0xFF5B, 0xF6D9, 0x838C, 0x0000, 0x0000, // 0x0460 (1120) pixels
+0x0000, 0x0001, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0470 (1136) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0480 (1152) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x5000, 0x8410, 0x0000, 0xB4D3, 0x2965, 0x3985, 0xA4D1, 0xFFDF, 0xCEDC, 0x4413, 0xDEFA, // 0x0490 (1168) pixels
+0xFF9C, 0xEED9, 0xFF5A, 0xFF5A, 0x8D36, 0xBE59, 0xFFDE, 0xFF7B, 0xFF19, 0x8BEE, 0x0000, 0x0000, 0x0000, 0x632C, 0x0005, 0x0000, // 0x04A0 (1184) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04B0 (1200) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04C0 (1216) pixels
+0x0000, 0x0000, 0x8410, 0x0000, 0x7BCF, 0x2966, 0x5247, 0xBD95, 0xFFDE, 0xFF9C, 0xF73A, 0xFF7B, 0xF719, 0xCE17, 0xF75C, 0xFFDE, // 0x04D0 (1232) pixels
+0xFF7C, 0xFF5A, 0xFFDE, 0xFF3A, 0xFF5A, 0xACF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04E0 (1248) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04F0 (1264) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x0000, // 0x0500 (1280) pixels
+0x8C51, 0x2966, 0x62A9, 0x9CB2, 0xE6B9, 0xEEB8, 0xFF5B, 0xFF9C, 0xEEB8, 0xD637, 0xFF9C, 0xFFBD, 0xFF7B, 0xFF5B, 0xFF5B, 0xFF19, // 0x0510 (1296) pixels
+0xFF5A, 0xC574, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0520 (1312) pixels
+0x0000, 0x0000, 0x5000, 0x52AA, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0530 (1328) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x0000, 0xACF3, 0x3186, 0x5AA9, 0x940E, // 0x0540 (1344) pixels
+0x9C90, 0xD616, 0xEEF9, 0xFF7B, 0xDE78, 0xB533, 0xE697, 0xFF39, 0xFF5A, 0xFF5B, 0xFF3A, 0xFF5B, 0xFF5A, 0xC593, 0x0000, 0x0000, // 0x0550 (1360) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0560 (1376) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0570 (1392) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2125, 0x5248, 0xA490, 0xC5B5, 0xEED9, 0xF73A, 0xF71A, // 0x0580 (1408) pixels
+0xACF2, 0xBD74, 0xB533, 0xF71A, 0xFF9C, 0xFF3B, 0xFF7C, 0xFF9C, 0xFF9C, 0xB512, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0590 (1424) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x05A0 (1440) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x05B0 (1456) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2125, 0x41E7, 0xA4B1, 0xBD95, 0xE698, 0xF71A, 0xFF7B, 0xEEB8, 0xFF3A, 0xF6F9, 0xFFBD, // 0x05C0 (1472) pixels
+0xEEB9, 0xAC2F, 0xE71B, 0xFFBD, 0xFF9C, 0xB532, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x05D0 (1488) pixels
+0x0000, 0x0000, 0x0000, 0x4208, 0x2965, 0x5248, 0xB512, 0xE676, 0xA46F, 0x0000, 0xFFF0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x05E0 (1504) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x05F0 (1520) pixels
+0x0000, 0x4208, 0x0000, 0xA490, 0xFF7C, 0xAD54, 0x91E6, 0xFF3B, 0xFFBC, 0xFF5A, 0xFF7B, 0xFFDD, 0xDC90, 0xB450, 0xF75B, 0xFF3A, // 0x0600 (1536) pixels
+0xFF9B, 0xA4D1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0610 (1552) pixels
+0x4A28, 0xC573, 0xFF7B, 0xFF5A, 0x7B4B, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x0000, // 0x0620 (1568) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x52AA, 0x1904, 0x62C9, // 0x0630 (1584) pixels
+0xFF5B, 0xE6BA, 0x5800, 0xDC0E, 0xFF1B, 0xFF7B, 0xFFBD, 0xF617, 0xB940, 0xD617, 0xFF5A, 0xFF19, 0xFF7B, 0x7B6C, 0x0000, 0x0000, // 0x0640 (1600) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x0000, 0x08C4, 0x6B0A, 0x942F, 0xF6F9, 0xFF7A, 0xC574, // 0x0650 (1616) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0660 (1632) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x0000, 0x738E, 0x4A49, 0x08A3, 0xCDB4, 0xFF7B, 0x9CB1, 0x9000, // 0x0670 (1648) pixels
+0xC267, 0xA3AD, 0xB34C, 0xA8E0, 0xBD14, 0xF71A, 0xFF39, 0xFF9B, 0xE698, 0x0000, 0x0000, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0680 (1664) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x0000, 0x1904, 0x6AEA, 0x83AC, 0xC573, 0x8BEE, 0x0000, 0x52AA, 0x0000, 0x0000, 0x0000, // 0x0690 (1680) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x4229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x06A0 (1696) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x5AAA, 0x2146, 0x83CD, 0xFF19, 0xFF19, 0xBD53, 0x9BEE, 0x9BAD, 0xACD3, 0xC658, // 0x06B0 (1712) pixels
+0xF73B, 0xFF5A, 0xFF5A, 0xF73A, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x06C0 (1728) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A7, // 0x06D0 (1744) pixels
+0x4A28, 0x4A48, 0x428B, 0x0000, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x06E0 (1760) pixels
+0x0000, 0x0000, 0x0000, 0x4228, 0x3186, 0xCDF6, 0xFF7B, 0xFF7B, 0xF71A, 0xF73A, 0xFF9C, 0xFF7C, 0xFF3A, 0xFF3A, 0xFF9C, 0x9471, // 0x06F0 (1776) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, // 0x0700 (1792) pixels
+0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x0000, 0xACD1, 0xE677, 0x836C, 0x0000, // 0x0710 (1808) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x0000, 0x8C51, // 0x0720 (1824) pixels
+0x2945, 0x39C6, 0x9C90, 0xE6B9, 0xFF9C, 0xFF5A, 0xFF19, 0xFF3A, 0xFF7B, 0xFFDD, 0xB5B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0730 (1840) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0x18C3, 0x3186, 0x0000, 0x0000, 0x0000, // 0x0740 (1856) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFF0, 0x10E4, 0xB512, 0xFF9B, 0xE6B8, 0x0002, 0x0000, 0x8410, 0x0000, 0x0000, // 0x0750 (1872) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x52AA, 0x10E3, 0x0000, 0x83AD, // 0x0760 (1888) pixels
+0xE698, 0xFF19, 0xFF39, 0xEED8, 0xD658, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0770 (1904) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0780 (1920) pixels
+0x0000, 0x0000, 0xAD55, 0x2145, 0x9C4F, 0xBD32, 0x9450, 0x31A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0790 (1936) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x0000, 0x8C31, 0xB576, 0x41E7, 0x5AA9, 0x5A68, 0x8C0F, 0x8C0F, 0x5ACA, // 0x07A0 (1952) pixels
+0x4A6A, 0xB532, 0x8BCD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x07B0 (1968) pixels
+0x0000, 0x0000, 0x18C3, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, // 0x07C0 (1984) pixels
+0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x07D0 (2000) pixels
+0x0000, 0x52AA, 0x0000, 0x1003, 0xCE1A, 0xEF1D, 0x62EC, 0x7B8C, 0xA4B1, 0x9C70, 0xB512, 0xB532, 0xD616, 0xF6D8, 0x6B0B, 0x0000, // 0x07E0 (2016) pixels
+0x3165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0x18E3, 0x0000, // 0x07F0 (2032) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA451, 0x2945, 0x18E3, // 0x0800 (2048) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9E73, 0x0000, // 0x0810 (2064) pixels
+0x9493, 0xF77E, 0xCE39, 0x4A48, 0xCDF6, 0xC5B5, 0xEED9, 0xE6B8, 0xFF3A, 0x942F, 0x73AE, 0x8430, 0x39C7, 0x0000, 0x0000, 0x0000, // 0x0820 (2080) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0x18E3, 0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0830 (2096) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x18E3, 0x18E3, 0x4A69, 0x0000, 0x0000, // 0x0840 (2112) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x0000, 0x4268, 0x5A8C, 0x0003, 0xB557, 0xFFDF, 0xA555, // 0x0850 (2128) pixels
+0xA4B1, 0xDE57, 0xEEB8, 0xFFBC, 0xB554, 0xA534, 0xB595, 0xB576, 0x7BD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0860 (2144) pixels
+0x0000, 0x0000, 0x4208, 0x18C3, 0x18E3, 0x31A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0870 (2160) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x0000, 0x2124, 0x18C3, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0880 (2176) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x4A68, 0x526B, 0x7B50, 0x62AD, 0xDEBC, 0xFFFF, 0x8430, 0xB554, 0xFF7B, 0xE6B9, // 0x0890 (2192) pixels
+0x636E, 0xF7BE, 0x8C71, 0xDE9B, 0xCE1A, 0x1063, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0x18E3, 0x18E3, 0x2104, // 0x08A0 (2208) pixels
+0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x08B0 (2224) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0x18C3, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x08C0 (2240) pixels
+0x4208, 0x0000, 0x4A49, 0x4A0A, 0xACF7, 0x7B70, 0xA514, 0xFFFF, 0xF79E, 0x9491, 0xE6B8, 0x83EF, 0xDEDB, 0xE71C, 0x8410, 0xFFFF, // 0x08D0 (2256) pixels
+0xF77E, 0xA4D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0x2104, 0x18E3, 0x18E3, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x08E0 (2272) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x08F0 (2288) pixels
+0x0000, 0x0000, 0x0000, 0x18C3, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31C6, 0x734E, // 0x0900 (2304) pixels
+0xB537, 0xACB6, 0x5AAB, 0xE71C, 0xFFFF, 0xCE59, 0x0000, 0x9CD3, 0xFFFF, 0xA535, 0xBDF7, 0xFFFF, 0xF79E, 0xE6DD, 0xC5D8, 0x4228, // 0x0910 (2320) pixels
+0x0000, 0x3186, 0x18E3, 0x2104, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0920 (2336) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, // 0x0930 (2352) pixels
+0x10A2, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3166, 0x9453, 0xBD58, 0xB518, 0x83B1, 0xAD75, // 0x0940 (2368) pixels
+0xD6BA, 0x2125, 0x3186, 0x736E, 0xB596, 0x7BF0, 0xE73C, 0xFFFF, 0xF77E, 0xF79E, 0xF79E, 0xC5F8, 0x10A1, 0x1082, 0x8410, 0x0000, // 0x0950 (2384) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0960 (2400) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x18E3, 0x10A2, 0x18C3, // 0x0970 (2416) pixels
+0x18C3, 0x0861, 0x0861, 0x0000, 0x0000, 0x2985, 0x41E8, 0xA4D5, 0xACF7, 0xC5D9, 0xE6DC, 0x6B4D, 0x62ED, 0xA4D4, 0x9452, 0xC5B9, // 0x0980 (2432) pixels
+0x522A, 0x8430, 0xFFFF, 0xFFBF, 0xF77E, 0xF7BE, 0xF77E, 0xE6DD, 0x9CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0990 (2448) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x09A0 (2464) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x18E3, 0x18E3, 0x18C3, 0x18C3, 0x2945, // 0x09B0 (2480) pixels
+0x39C7, 0x3186, 0x62CC, 0x9C54, 0x9C35, 0xD63A, 0xF75E, 0xA534, 0x83D0, 0xC5D8, 0x9CD3, 0xE6DD, 0x7B70, 0xB5B6, 0xFFFF, 0xEF5E, // 0x09C0 (2496) pixels
+0xF77E, 0xFFBF, 0xF77E, 0xE6FD, 0xBD98, 0x39A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x09D0 (2512) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x09E0 (2528) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0x5AAC, 0x8392, // 0x09F0 (2544) pixels
+0xB537, 0xCE1A, 0xE6FC, 0xF7BE, 0xDEDB, 0xD69A, 0x8C71, 0xFFFF, 0xEF7D, 0xEF7D, 0xFFFF, 0xEF5E, 0xF77E, 0xFFDF, 0xF79E, 0xF77E, // 0x0A00 (2560) pixels
+0xD65B, 0x7B70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A10 (2576) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A20 (2592) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x5A4B, 0xA495, 0xD67B, 0xC599, 0xDEBC, 0xFFFF, // 0x0A30 (2608) pixels
+0xFFBF, 0xE71C, 0x8C71, 0xE73C, 0xB5B6, 0xEF7D, 0xFFFF, 0xEF5E, 0xF77E, 0xFFFF, 0xFFDF, 0xF79E, 0xEF5E, 0xC5B9, 0x4A49, 0x0000, // 0x0A40 (2624) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A50 (2640) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A60 (2656) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0x4A2A, 0xACF6, 0xE6FC, 0xD63A, 0xE71D, 0xFFFF, 0xF79E, 0xEF3D, 0x9CD3, 0xD69A, // 0x0A70 (2672) pixels
+0xBDF7, 0xFFDE, 0xFFDF, 0xF77E, 0xF79E, 0xFFDF, 0xFFFF, 0xFFBF, 0xF7BF, 0xEF1D, 0xAD15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A80 (2688) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0A90 (2704) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0AA0 (2720) pixels
+0x0000, 0x2965, 0x62CC, 0xACD6, 0xEF3D, 0xE6DC, 0xE71D, 0xFFFF, 0xF7BF, 0xF75E, 0x9CF3, 0xDEDB, 0xFFDF, 0xE73C, 0xFFDF, 0xF7BE, // 0x0AB0 (2736) pixels
+0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5E, 0xD65A, 0x41E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0AC0 (2752) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0AD0 (2768) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1922, 0x734F, 0xB4F7, // 0x0AE0 (2784) pixels
+0xEF5E, 0xE6FC, 0xEF3D, 0xEF5D, 0xF79E, 0xF79E, 0xB5B6, 0xBDF7, 0xC638, 0xC638, 0xFFFF, 0xFFDF, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AF0 (2800) pixels
+0xFFFF, 0xFFDF, 0xEF1D, 0x9452, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B00 (2816) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B10 (2832) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2144, 0x736F, 0xBD78, 0xEF5E, 0xDEBC, 0xEF3D, 0xE6FC, // 0x0B20 (2848) pixels
+0xF7BF, 0xF79E, 0xD69A, 0x9492, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79F, 0xC5D9, // 0x0B30 (2864) pixels
+0x2144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B40 (2880) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B50 (2896) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A6, 0x7B8F, 0xB537, 0xE6DC, 0xE71D, 0xF79E, 0xE6FD, 0xFFDF, 0xFFFF, 0xEF7D, 0x9492, // 0x0B60 (2912) pixels
+0xE71C, 0x738E, 0xEF7D, 0xFFDF, 0xFFBF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xD67B, 0x62ED, 0x0000, 0x8410, 0x0000, // 0x0B70 (2928) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B80 (2944) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B90 (2960) pixels
+0x0000, 0x39C7, 0x83F0, 0xACF7, 0xD65B, 0xF79E, 0xFFDF, 0xE6FC, 0xFFDF, 0xFFFF, 0xFFDF, 0x8C71, 0xE71C, 0xE71C, 0xFFFF, 0xFFDF, // 0x0BA0 (2976) pixels
+0xFFBF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE7B, 0x8BD2, 0x0000, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0BB0 (2992) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0BC0 (3008) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0x8C31, 0xACD6, // 0x0BD0 (3024) pixels
+0xD65B, 0xF79E, 0xFFDF, 0xE6FD, 0xFFDF, 0xEF5E, 0xEF1D, 0x83F0, 0xE73C, 0xFFFF, 0xEF5D, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BE0 (3040) pixels
+0xFFFF, 0xFFFF, 0xDE9C, 0xD65B, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0BF0 (3056) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0C00 (3072) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x31A6, 0x8C31, 0x9C74, 0xDE9B, 0xFFDF, 0xFFDF, 0xEF1D, // 0x0C10 (3088) pixels
+0xF79E, 0xEF5E, 0xE6FD, 0x9493, 0xCE79, 0xD6BA, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77E, 0xBD78, 0x9472, // 0x0C20 (3104) pixels
+0x4A4C, 0x524B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0C30 (3120) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0C40 (3136) pixels
+0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x3166, 0x73AE, 0x9C74, 0xE6DC, 0xFFDF, 0xF79E, 0xF79E, 0xF79E, 0xF79E, 0xE6DC, 0xC618, // 0x0C50 (3152) pixels
+0x9492, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF3D, 0xDE9C, 0xACD6, 0x6ACD, 0x3ACF, 0x9D9A, 0x7C94, 0x0000, 0x0000, // 0x0C60 (3168) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0C70 (3184) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0C80 (3200) pixels
+0x0000, 0x2945, 0x4A8B, 0xA4F5, 0xF77E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBF, 0xFFDF, 0x8C51, 0xBDD8, 0xC5DA, 0xBDB9, // 0x0C90 (3216) pixels
+0xCE3A, 0xC5F9, 0x9C74, 0x622D, 0x3806, 0x2106, 0x3BF4, 0x7DBB, 0xAEBE, 0x8578, 0x0000, 0x0000, 0x4208, 0x0000, 0x0000, 0x0000, // 0x0CA0 (3232) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0CB0 (3248) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x420A, 0x11CB, 0x632F, // 0x0CC0 (3264) pixels
+0x9CB5, 0xB597, 0xCE79, 0xD6BA, 0xD6BB, 0xAD77, 0xB5B7, 0xAD96, 0x6B30, 0x0809, 0x300C, 0x280C, 0x3009, 0x0003, 0x0000, 0x00A3, // 0x0CD0 (3280) pixels
+0x332F, 0x7D99, 0x8E1C, 0x8E1B, 0x9E7D, 0x95FB, 0x2986, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0CE0 (3296) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0CF0 (3312) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001F, 0x0000, 0x82B5, 0x398D, 0x18CC, 0x0170, 0x00B0, 0x000C, 0x100A, // 0x0D00 (3328) pixels
+0x180B, 0x000A, 0x0009, 0x0009, 0x380B, 0x518D, 0x48CC, 0x484B, 0x49AD, 0x3BF5, 0x5CF8, 0x6539, 0x7DDC, 0xBEDD, 0xCF1D, 0x759B, // 0x0D10 (3344) pixels
+0x9E7C, 0xA67D, 0x3AAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D20 (3360) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D30 (3376) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x000A, 0x0000, 0x398C, 0x314B, 0x3A32, 0x53B7, 0x53B6, 0x42D4, 0x4314, 0x5375, 0x63B5, 0x6395, // 0x0D40 (3392) pixels
+0x4252, 0x496E, 0x4AF2, 0x5436, 0x5CD9, 0x5D5B, 0x8DFC, 0x9E7D, 0xAE9D, 0xBEDD, 0xCEFD, 0x5D5A, 0xA67C, 0xA69D, 0x5390, 0x0000, // 0x0D50 (3408) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D60 (3424) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D70 (3440) pixels
+0x4208, 0x0000, 0x318A, 0x292A, 0x30ED, 0x52F4, 0x53B7, 0x4BF7, 0x5438, 0x5458, 0x5C17, 0x5376, 0x4B36, 0x6CD9, 0x5D5A, 0x75DB, // 0x0D80 (3456) pixels
+0x85FC, 0x963C, 0xA67C, 0xA67C, 0x9E5C, 0xA67C, 0x8DFB, 0x5D5A, 0xA67C, 0xBEFE, 0x74B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D90 (3472) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0DA0 (3488) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02AA, 0x0000, 0x31C9, 0x292A, // 0x0DB0 (3504) pixels
+0x394D, 0x4212, 0x4315, 0x43B6, 0x5CB9, 0x4B96, 0x5BB6, 0x7458, 0x6C58, 0x755A, 0x5D5A, 0x85DB, 0xAE9D, 0x9E5C, 0xBEDD, 0xAE9D, // 0x0DC0 (3520) pixels
+0x963C, 0x9E5C, 0x75BB, 0x657B, 0xBEBD, 0xB6DE, 0x74F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0DD0 (3536) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0DE0 (3552) pixels
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2108, 0x396E, 0x41D0, 0x42D4, 0x3356, // 0x0DF0 (3568) pixels
+0x3BF7, 0x43B7, 0x53D7, 0x5C99, 0x5417, 0x651A, 0x5D5A, 0x7DBB, 0x85FB, 0x8E1C, 0x9E5C, 0x8E1C, 0x85FB, 0x963C, 0x961C, 0x7DDB, // 0x0E00 (3584) pixels
+0xD73E, 0xAEBD, 0x8517, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0E10 (3600) pixels
+};
diff --git a/libraries/MySensors/utility/RF24.cpp b/libraries/MySensors/utility/RF24.cpp
index 38053ab..5f5329d 100755
--- a/libraries/MySensors/utility/RF24.cpp
+++ b/libraries/MySensors/utility/RF24.cpp
@@ -19,15 +19,30 @@ void RF24::csn(bool mode)
// divider of 4 is the minimum we want.
// CLK:BUS 8Mhz:2Mhz, 16Mhz:4Mhz, or 20Mhz:5Mhz
#ifdef ARDUINO
- #if !defined( __AVR_ATtiny85__ ) && !defined( __AVR_ATtiny84__) && !defined (__arm__)
- SPI.setBitOrder(MSBFIRST);
- SPI.setDataMode(SPI_MODE0);
- SPI.setClockDivider(SPI_CLOCK_DIV2);
+ #if ( !defined(RF24_TINY) && !defined (__arm__) && !defined (SOFTSPI)) || defined (CORE_TEENSY)
+ _SPI.setBitOrder(MSBFIRST);
+ _SPI.setDataMode(SPI_MODE0);
+ _SPI.setClockDivider(SPI_CLOCK_DIV2);
#endif
#endif
-#ifndef __arm__
- digitalWrite(csn_pin,mode);
+
+#if defined (RF24_TINY)
+ if (ce_pin != csn_pin) {
+ digitalWrite(csn_pin,mode);
+ }
+ else {
+ if (mode == HIGH) {
+ PORTB |= (1<CSN HIGH
+ delayMicroseconds(100); // allow csn to settle.
+ }
+ else {
+ PORTB &= ~(1<CSN LOW
+ delayMicroseconds(11); // allow csn to settle
+ }
+ }
+#else if !defined (__arm__) || defined (CORE_TEENSY)
+ digitalWrite(csn_pin,mode);
#endif
}
@@ -36,7 +51,8 @@ void RF24::csn(bool mode)
void RF24::ce(bool level)
{
- digitalWrite(ce_pin,level);
+ //Allow for 3-pin use on ATTiny
+ if (ce_pin != csn_pin) digitalWrite(ce_pin,level);
}
/****************************************************************************/
@@ -45,18 +61,18 @@ uint8_t RF24::read_register(uint8_t reg, uint8_t* buf, uint8_t len)
{
uint8_t status;
-#if defined (__arm__)
- status = SPI.transfer(csn_pin, R_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE );
+#if defined (__arm__) && !defined ( CORE_TEENSY )
+ status = _SPI.transfer(csn_pin, R_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE );
while ( len-- > 1 ){
- *buf++ = SPI.transfer(csn_pin,0xff, SPI_CONTINUE);
+ *buf++ = _SPI.transfer(csn_pin,0xff, SPI_CONTINUE);
}
- *buf++ = SPI.transfer(csn_pin,0xff);
+ *buf++ = _SPI.transfer(csn_pin,0xff);
#else
csn(LOW);
- status = SPI.transfer( R_REGISTER | ( REGISTER_MASK & reg ) );
+ status = _SPI.transfer( R_REGISTER | ( REGISTER_MASK & reg ) );
while ( len-- ){
- *buf++ = SPI.transfer(0xff);
+ *buf++ = _SPI.transfer(0xff);
}
csn(HIGH);
@@ -70,13 +86,13 @@ uint8_t RF24::read_register(uint8_t reg, uint8_t* buf, uint8_t len)
uint8_t RF24::read_register(uint8_t reg)
{
- #if defined (__arm__)
- SPI.transfer(csn_pin, R_REGISTER | ( REGISTER_MASK & reg ) , SPI_CONTINUE);
- uint8_t result = SPI.transfer(csn_pin,0xff);
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
+ _SPI.transfer(csn_pin, R_REGISTER | ( REGISTER_MASK & reg ) , SPI_CONTINUE);
+ uint8_t result = _SPI.transfer(csn_pin,0xff);
#else
csn(LOW);
- SPI.transfer( R_REGISTER | ( REGISTER_MASK & reg ) );
- uint8_t result = SPI.transfer(0xff);
+ _SPI.transfer( R_REGISTER | ( REGISTER_MASK & reg ) );
+ uint8_t result = _SPI.transfer(0xff);
csn(HIGH);
#endif
@@ -90,18 +106,18 @@ uint8_t RF24::write_register(uint8_t reg, const uint8_t* buf, uint8_t len)
{
uint8_t status;
- #if defined (__arm__)
- status = SPI.transfer(csn_pin, W_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE );
- while ( len-- > 1){
- SPI.transfer(csn_pin,*buf++, SPI_CONTINUE);
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
+ status = _SPI.transfer(csn_pin, W_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE );
+ while ( --len){
+ _SPI.transfer(csn_pin,*buf++, SPI_CONTINUE);
}
- SPI.transfer(csn_pin,*buf++);
+ _SPI.transfer(csn_pin,*buf++);
#else
csn(LOW);
- status = SPI.transfer( W_REGISTER | ( REGISTER_MASK & reg ) );
+ status = _SPI.transfer( W_REGISTER | ( REGISTER_MASK & reg ) );
while ( len-- )
- SPI.transfer(*buf++);
+ _SPI.transfer(*buf++);
csn(HIGH);
@@ -118,14 +134,14 @@ uint8_t RF24::write_register(uint8_t reg, uint8_t value)
IF_SERIAL_DEBUG(printf_P(PSTR("write_register(%02x,%02x)\r\n"),reg,value));
- #if defined (__arm__)
- status = SPI.transfer(csn_pin, W_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE);
- SPI.transfer(csn_pin,value);
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
+ status = _SPI.transfer(csn_pin, W_REGISTER | ( REGISTER_MASK & reg ), SPI_CONTINUE);
+ _SPI.transfer(csn_pin,value);
#else
csn(LOW);
- status = SPI.transfer( W_REGISTER | ( REGISTER_MASK & reg ) );
- SPI.transfer(value);
+ status = _SPI.transfer( W_REGISTER | ( REGISTER_MASK & reg ) );
+ _SPI.transfer(value);
csn(HIGH);
#endif
@@ -140,39 +156,39 @@ uint8_t RF24::write_payload(const void* buf, uint8_t data_len, const uint8_t wri
uint8_t status;
const uint8_t* current = reinterpret_cast(buf);
- if(data_len > payload_size) data_len = payload_size;
- uint8_t blank_len = dynamic_payloads_enabled ? 0 : payload_size - data_len;
-
+ data_len = min(data_len, payload_size);
+ uint8_t blank_len = dynamic_payloads_enabled ? 0 : payload_size - data_len;
+
//printf("[Writing %u bytes %u blanks]",data_len,blank_len);
- #if defined (__arm__)
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
- status = SPI.transfer(csn_pin, writeType , SPI_CONTINUE);
+ status = _SPI.transfer(csn_pin, writeType , SPI_CONTINUE);
if(blank_len){
while ( data_len--){
- SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
+ _SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
}
while ( --blank_len ){
- SPI.transfer(csn_pin,0, SPI_CONTINUE);
+ _SPI.transfer(csn_pin,0, SPI_CONTINUE);
}
- SPI.transfer(csn_pin,0);
+ _SPI.transfer(csn_pin,0);
}else{
while( --data_len ){
- SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
+ _SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
}
- SPI.transfer(csn_pin,*current);
+ _SPI.transfer(csn_pin,*current);
}
#else
csn(LOW);
- status = SPI.transfer( writeType );
+ status = _SPI.transfer( writeType );
while ( data_len-- ) {
- SPI.transfer(*current++);
+ _SPI.transfer(*current++);
}
while ( blank_len-- ) {
- SPI.transfer(0);
+ _SPI.transfer(0);
}
csn(HIGH);
@@ -190,39 +206,39 @@ uint8_t RF24::read_payload(void* buf, uint8_t data_len)
if(data_len > payload_size) data_len = payload_size;
uint8_t blank_len = dynamic_payloads_enabled ? 0 : payload_size - data_len;
-
+
//printf("[Reading %u bytes %u blanks]",data_len,blank_len);
- #if defined (__arm__)
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
- status = SPI.transfer(csn_pin, R_RX_PAYLOAD, SPI_CONTINUE );
+ status = _SPI.transfer(csn_pin, R_RX_PAYLOAD, SPI_CONTINUE );
if( blank_len ){
-
while ( data_len-- ){
- *current++ = SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
+ *current++ = _SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
}
+
while ( --blank_len ){
- SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
+ _SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
}
- SPI.transfer(csn_pin,0xFF);
+ _SPI.transfer(csn_pin,0xFF);
}else{
while ( --data_len ){
- *current++ = SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
+ *current++ = _SPI.transfer(csn_pin,0xFF, SPI_CONTINUE);
}
- *current = SPI.transfer(csn_pin,0xFF);
+ *current = _SPI.transfer(csn_pin,0xFF);
}
#else
csn(LOW);
- status = SPI.transfer( R_RX_PAYLOAD );
+ status = _SPI.transfer( R_RX_PAYLOAD );
while ( data_len-- ) {
- *current++ = SPI.transfer(0xFF);
+ *current++ = _SPI.transfer(0xFF);
}
while ( blank_len-- ) {
- SPI.transfer(0xff);
+ _SPI.transfer(0xff);
}
csn(HIGH);
@@ -250,12 +266,12 @@ uint8_t RF24::flush_tx(void)
uint8_t RF24::spiTrans(uint8_t cmd){
uint8_t status;
- #if defined (__arm__)
- status = SPI.transfer(csn_pin, cmd );
+ #if defined (__arm__) && !defined ( CORE_TEENSY )
+ status = _SPI.transfer(csn_pin, cmd );
#else
csn(LOW);
- status = SPI.transfer( cmd );
+ status = _SPI.transfer( cmd );
csn(HIGH);
#endif
return status;
@@ -271,7 +287,6 @@ uint8_t RF24::get_status(void)
/****************************************************************************/
#if !defined (MINIMAL)
-
void RF24::print_status(uint8_t status)
{
printf_P(PSTR("STATUS\t\t = 0x%02x RX_DR=%x TX_DS=%x MAX_RT=%x RX_P_NO=%x TX_FULL=%x\r\n"),
@@ -315,7 +330,7 @@ void RF24::print_address_register(const char* name, uint8_t reg, uint8_t qty)
while (qty--)
{
- uint8_t buffer[5];
+ uint8_t buffer[addr_width];
read_register(reg++,buffer,sizeof buffer);
printf_P(PSTR(" 0x"));
@@ -330,9 +345,8 @@ void RF24::print_address_register(const char* name, uint8_t reg, uint8_t qty)
/****************************************************************************/
RF24::RF24(uint8_t _cepin, uint8_t _cspin):
- ce_pin(_cepin), csn_pin(_cspin), wide_band(false), p_variant(false),
- payload_size(32), dynamic_payloads_enabled(false),
- pipe0_reading_address(0)
+ ce_pin(_cepin), csn_pin(_cspin), p_variant(false),
+ payload_size(32), dynamic_payloads_enabled(false), addr_width(5)//,pipe0_reading_address(0)
{
}
@@ -340,9 +354,6 @@ RF24::RF24(uint8_t _cepin, uint8_t _cspin):
void RF24::setChannel(uint8_t channel)
{
- // TODO: This method could take advantage of the 'wide_band' calculation
- // done in setChannel() to require certain channel spacing.
-
const uint8_t max_channel = 127;
write_register(RF_CH,min(channel,max_channel));
}
@@ -425,6 +436,7 @@ void RF24::printDetails(void)
printf_P(PSTR("CRC Length\t = %S\r\n"),pgm_read_word(&rf24_crclength_e_str_P[getCRCLength()]));
printf_P(PSTR("PA Power\t = %S\r\n"),pgm_read_word(&rf24_pa_dbm_e_str_P[getPALevel()]));
#endif
+
}
#endif
@@ -433,18 +445,18 @@ void RF24::printDetails(void)
void RF24::begin(void)
{
// Initialize pins
- pinMode(ce_pin,OUTPUT);
+ if (ce_pin != csn_pin) pinMode(ce_pin,OUTPUT);
- #if defined(__arm__)
- SPI.begin(csn_pin); // Using the extended SPI features of the DUE
- SPI.setClockDivider(csn_pin, 9); // Set the bus speed to 8.4mhz on Due
- SPI.setBitOrder(csn_pin,MSBFIRST); // Set the bit order and mode specific to this device
- SPI.setDataMode(csn_pin,SPI_MODE0);
+ #if defined(__arm__) && ! defined( CORE_TEENSY )
+ _SPI.begin(csn_pin); // Using the extended SPI features of the DUE
+ _SPI.setClockDivider(csn_pin, 9); // Set the bus speed to 8.4mhz on Due
+ _SPI.setBitOrder(csn_pin,MSBFIRST); // Set the bit order and mode specific to this device
+ _SPI.setDataMode(csn_pin,SPI_MODE0);
ce(LOW);
//csn(HIGH);
#else
- pinMode(csn_pin,OUTPUT);
- SPI.begin();
+ if (ce_pin != csn_pin) pinMode(csn_pin,OUTPUT);
+ _SPI.begin();
ce(LOW);
csn(HIGH);
#endif
@@ -503,39 +515,66 @@ void RF24::begin(void)
// PTX should use only 22uA of power
write_register(CONFIG, ( read_register(CONFIG) ) & ~_BV(PRIM_RX) );
-
}
/****************************************************************************/
void RF24::startListening(void)
{
+ #if !defined (RF24_TINY)
powerUp();
+ #endif
write_register(CONFIG, read_register(CONFIG) | _BV(PRIM_RX));
write_register(STATUS, _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT) );
// Restore the pipe0 adddress, if exists
- if (pipe0_reading_address){
- write_register(RX_ADDR_P0, reinterpret_cast(&pipe0_reading_address), 5);
+ if (pipe0_reading_address[0] > 0){
+ write_register(RX_ADDR_P0, pipe0_reading_address, addr_width);
+ }else{
+ closeReadingPipe(0);
}
// Flush buffers
- flush_rx();
- flush_tx();
+ //flush_rx();
+ if(read_register(FEATURE) & _BV(EN_ACK_PAY)){
+ flush_tx();
+ }
// Go!
ce(HIGH);
-
+
}
/****************************************************************************/
+static const uint8_t child_pipe_enable[] PROGMEM =
+{
+ ERX_P0, ERX_P1, ERX_P2, ERX_P3, ERX_P4, ERX_P5
+};
void RF24::stopListening(void)
{
+
ce(LOW);
- flush_tx();
- flush_rx();
+ #if defined(__arm__)
+ delayMicroseconds(300);
+ #endif
+ delayMicroseconds(130);
+ if(read_register(FEATURE) & _BV(EN_ACK_PAY)){
+ flush_tx();
+ }
+ //flush_rx();
write_register(CONFIG, ( read_register(CONFIG) ) & ~_BV(PRIM_RX) );
+
+ #if defined (RF24_TINY)
+ // for 3 pins solution TX mode is only left with additonal powerDown/powerUp cycle
+ if (ce_pin == csn_pin) {
+ powerDown();
+ powerUp();
+ }
+ #endif
+ write_register(EN_RXADDR,read_register(EN_RXADDR) | _BV(pgm_read_byte(&child_pipe_enable[0]))); // Enable RX on pipe0
+
+ delayMicroseconds(100);
}
@@ -566,18 +605,36 @@ void RF24::powerUp(void)
}
}
+/******************************************************************/
+#if defined (FAILURE_HANDLING)
+void RF24::errNotify(){
+ IF_SERIAL_DEBUG(printf_P(PSTR("HARDWARE FAIL\r\n")));
+ failureDetected = 1;
+}
+#endif
/******************************************************************/
//Similar to the previous write, clears the interrupt flags
bool RF24::write( const void* buf, uint8_t len, const bool multicast )
{
//Start Writing
- startWrite(buf,len,multicast);
+ startFastWrite(buf,len,multicast);
//Wait until complete or failed
- //ACK payloads that are handled improperly will cause this to hang
- //If autoAck is ON, a payload has to be written prior to reading a payload, else write after reading a payload
- while( ! ( get_status() & ( _BV(TX_DS) | _BV(MAX_RT) ))) { }
+ #if defined (FAILURE_HANDLING)
+ uint32_t timer = millis();
+ #endif
+
+ while( ! ( get_status() & ( _BV(TX_DS) | _BV(MAX_RT) ))) {
+ #if defined (FAILURE_HANDLING)
+ if(millis() - timer > 75){
+ errNotify();
+ return 0;
+ }
+ #endif
+ }
+
+ ce(LOW);
uint8_t status = write_register(STATUS,_BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT) );
@@ -611,6 +668,12 @@ bool RF24::writeBlocking( const void* buf, uint8_t len, uint32_t timeout )
reUseTX(); //Set re-transmit and clear the MAX_RT interrupt flag
if(millis() - timer > timeout){ return 0; } //If this payload has exceeded the user-defined timeout, exit and return 0
}
+ #if defined (FAILURE_HANDLING)
+ if(millis() - timer > (timeout+75) ){
+ errNotify();
+ return 0;
+ }
+ #endif
}
@@ -638,6 +701,10 @@ bool RF24::writeFast( const void* buf, uint8_t len, const bool multicast )
//Return 0 so the user can control the retrys and set a timer or failure counter if required
//The radio will auto-clear everything in the FIFO as long as CE remains high
+ #if defined (FAILURE_HANDLING)
+ uint32_t timer = millis();
+ #endif
+
while( ( get_status() & ( _BV(TX_FULL) ))) { //Blocking only if FIFO is full. This will loop and block until TX is successful or fail
if( get_status() & _BV(MAX_RT)){
@@ -646,7 +713,12 @@ bool RF24::writeFast( const void* buf, uint8_t len, const bool multicast )
return 0; //Return 0. The previous payload has been retransmitted
//From the user perspective, if you get a 0, just keep trying to send the same payload
}
-
+ #if defined (FAILURE_HANDLING)
+ if(millis() - timer > 75 ){
+ errNotify();
+ return 0;
+ }
+ #endif
}
//Start Writing
startFastWrite(buf,len,multicast);
@@ -673,6 +745,7 @@ void RF24::startFastWrite( const void* buf, uint8_t len, const bool multicast){
}
+/****************************************************************************/
//Added the original startWrite back in so users can still use interrupts, ack payloads, etc
//Allows the library to pass all tests
@@ -681,16 +754,27 @@ void RF24::startWrite( const void* buf, uint8_t len, const bool multicast ){
// Send the payload
//write_payload( buf, len );
- write_payload( buf, len, multicast?static_cast(W_TX_PAYLOAD_NO_ACK):static_cast(W_TX_PAYLOAD)) ;
-
+ write_payload( buf, len,multicast? W_TX_PAYLOAD_NO_ACK : W_TX_PAYLOAD ) ;
ce(HIGH);
- ce(LOW);
+ #if defined(CORE_TEENSY) || !defined(ARDUINO)
+ delayMicroseconds(10);
+ #endif
+ ce(LOW);
}
-bool RF24::txStandBy(){
+/****************************************************************************/
+bool RF24::rxFifoFull(){
+ return read_register(FIFO_STATUS) & _BV(RX_FULL);
+}
+/****************************************************************************/
+
+bool RF24::txStandBy(){
+ #if defined (FAILURE_HANDLING)
+ uint32_t timeout = millis();
+ #endif
while( ! (read_register(FIFO_STATUS) & _BV(TX_EMPTY)) ){
if( get_status() & _BV(MAX_RT)){
write_register(STATUS,_BV(MAX_RT) );
@@ -698,12 +782,20 @@ bool RF24::txStandBy(){
flush_tx(); //Non blocking, flush the data
return 0;
}
+ #if defined (FAILURE_HANDLING)
+ if( millis() - timeout > 75){
+ errNotify();
+ return 0;
+ }
+ #endif
}
ce(LOW); //Set STANDBY-I mode
return 1;
}
+/****************************************************************************/
+
bool RF24::txStandBy(uint32_t timeout){
uint32_t start = millis();
@@ -717,7 +809,15 @@ bool RF24::txStandBy(uint32_t timeout){
ce(LOW); flush_tx(); return 0;
}
}
+ #if defined (FAILURE_HANDLING)
+ if( millis() - start > (timeout+75)){
+ errNotify();
+ return 0;
+ }
+ #endif
}
+
+
ce(LOW); //Set STANDBY-I mode
return 1;
@@ -735,18 +835,18 @@ uint8_t RF24::getDynamicPayloadSize(void)
{
uint8_t result = 0;
- #if defined (__arm__)
- SPI.transfer(csn_pin, R_RX_PL_WID, SPI_CONTINUE );
- result = SPI.transfer(csn_pin,0xff);
+ #if defined (__arm__) && ! defined( CORE_TEENSY )
+ _SPI.transfer(csn_pin, R_RX_PL_WID, SPI_CONTINUE );
+ result = _SPI.transfer(csn_pin,0xff);
#else
csn(LOW);
- SPI.transfer( R_RX_PL_WID );
- result = SPI.transfer(0xff);
+ _SPI.transfer( R_RX_PL_WID );
+ result = _SPI.transfer(0xff);
csn(HIGH);
#endif
- if(result > 32) { flush_rx(); return 0; }
+ if(result > 32) { flush_rx(); delay(2); return 0; }
return result;
}
@@ -761,9 +861,12 @@ bool RF24::available(void)
bool RF24::available(uint8_t* pipe_num)
{
-
- //Check the FIFO buffer to see if data is waitng to be read
-
+ //Check the FIFO buffer to see if data is waiting to be read
+ if(listeningStarted){
+ while(micros() - lastAvailableCheck < 800 && listeningStarted){};
+ lastAvailableCheck = micros();
+ listeningStarted = 0;
+ }
if (!( read_register(FIFO_STATUS) & _BV(RX_EMPTY) )){
// If the caller wants the pipe number, include that
@@ -774,8 +877,8 @@ bool RF24::available(uint8_t* pipe_num)
return 1;
}
- return 0;
+ return 0;
}
@@ -813,8 +916,23 @@ void RF24::openWritingPipe(uint64_t value)
// Note that AVR 8-bit uC's store this LSB first, and the NRF24L01(+)
// expects it LSB first too, so we're good.
- write_register(RX_ADDR_P0, reinterpret_cast(&value), 5);
- write_register(TX_ADDR, reinterpret_cast(&value), 5);
+ write_register(RX_ADDR_P0, reinterpret_cast(&value), addr_width);
+ write_register(TX_ADDR, reinterpret_cast(&value), addr_width);
+
+
+ //const uint8_t max_payload_size = 32;
+ //write_register(RX_PW_P0,min(payload_size,max_payload_size));
+ write_register(RX_PW_P0,payload_size);
+}
+
+/****************************************************************************/
+void RF24::openWritingPipe(const uint8_t *address)
+{
+ // Note that AVR 8-bit uC's store this LSB first, and the NRF24L01(+)
+ // expects it LSB first too, so we're good.
+
+ write_register(RX_ADDR_P0,address, addr_width);
+ write_register(TX_ADDR, address, addr_width);
//const uint8_t max_payload_size = 32;
//write_register(RX_PW_P0,min(payload_size,max_payload_size));
@@ -822,7 +940,6 @@ void RF24::openWritingPipe(uint64_t value)
}
/****************************************************************************/
-
static const uint8_t child_pipe[] PROGMEM =
{
RX_ADDR_P0, RX_ADDR_P1, RX_ADDR_P2, RX_ADDR_P3, RX_ADDR_P4, RX_ADDR_P5
@@ -831,24 +948,22 @@ static const uint8_t child_payload_size[] PROGMEM =
{
RX_PW_P0, RX_PW_P1, RX_PW_P2, RX_PW_P3, RX_PW_P4, RX_PW_P5
};
-static const uint8_t child_pipe_enable[] PROGMEM =
-{
- ERX_P0, ERX_P1, ERX_P2, ERX_P3, ERX_P4, ERX_P5
-};
+
void RF24::openReadingPipe(uint8_t child, uint64_t address)
{
// If this is pipe 0, cache the address. This is needed because
// openWritingPipe() will overwrite the pipe 0 address, so
// startListening() will have to restore it.
- if (child == 0)
- pipe0_reading_address = address;
+ if (child == 0){
+ memcpy(pipe0_reading_address,&address,addr_width);
+ }
if (child <= 6)
{
// For pipes 2-5, only write the LSB
if ( child < 2 )
- write_register(pgm_read_byte(&child_pipe[child]), reinterpret_cast(&address), 5);
+ write_register(pgm_read_byte(&child_pipe[child]), reinterpret_cast(&address), addr_width);
else
write_register(pgm_read_byte(&child_pipe[child]), reinterpret_cast(&address), 1);
@@ -861,6 +976,44 @@ void RF24::openReadingPipe(uint8_t child, uint64_t address)
}
}
+/****************************************************************************/
+void RF24::setAddressWidth(uint8_t a_width){
+
+ if(a_width -= 2){
+ write_register(SETUP_AW,a_width%4);
+ addr_width = (a_width%4) + 2;
+ }
+
+}
+
+/****************************************************************************/
+
+void RF24::openReadingPipe(uint8_t child, const uint8_t *address)
+{
+ // If this is pipe 0, cache the address. This is needed because
+ // openWritingPipe() will overwrite the pipe 0 address, so
+ // startListening() will have to restore it.
+ if (child == 0){
+ memcpy(pipe0_reading_address,address,addr_width);
+ }
+ if (child <= 6)
+ {
+ // For pipes 2-5, only write the LSB
+ if ( child < 2 ){
+ write_register(pgm_read_byte(&child_pipe[child]), address, addr_width);
+ }else{
+ write_register(pgm_read_byte(&child_pipe[child]), address, 1);
+ }
+ write_register(pgm_read_byte(&child_payload_size[child]),payload_size);
+
+ // Note it would be more efficient to set all of the bits for all open
+ // pipes at once. However, I thought it would make the calling code
+ // more simple to do it this way.
+ write_register(EN_RXADDR,read_register(EN_RXADDR) | _BV(pgm_read_byte(&child_pipe_enable[child])));
+
+ }
+}
+
/****************************************************************************/
void RF24::closeReadingPipe( uint8_t pipe )
@@ -868,19 +1021,18 @@ void RF24::closeReadingPipe( uint8_t pipe )
write_register(EN_RXADDR,read_register(EN_RXADDR) & ~_BV(pgm_read_byte(&child_pipe_enable[pipe])));
}
-
/****************************************************************************/
void RF24::toggle_features(void)
{
- #if defined (__arm__)
- SPI.transfer(csn_pin, ACTIVATE, SPI_CONTINUE );
- SPI.transfer(csn_pin, 0x73 );
+ #if defined (__arm__) && ! defined( CORE_TEENSY )
+ _SPI.transfer(csn_pin, ACTIVATE, SPI_CONTINUE );
+ _SPI.transfer(csn_pin, 0x73 );
#else
csn(LOW);
- SPI.transfer( ACTIVATE );
- SPI.transfer( 0x73 );
+ _SPI.transfer( ACTIVATE );
+ _SPI.transfer( 0x73 );
csn(HIGH);
#endif
}
@@ -924,6 +1076,7 @@ void RF24::enableAckPayload(void)
//
write_register(DYNPD,read_register(DYNPD) | _BV(DPL_P1) | _BV(DPL_P0));
+ dynamic_payloads_enabled = true;
}
/****************************************************************************/
@@ -948,19 +1101,19 @@ void RF24::writeAckPayload(uint8_t pipe, const void* buf, uint8_t len)
uint8_t data_len = min(len,32);
- #if defined (__arm__)
- SPI.transfer(csn_pin, W_ACK_PAYLOAD | ( pipe & B111 ), SPI_CONTINUE);
+ #if defined (__arm__) && ! defined( CORE_TEENSY )
+ _SPI.transfer(csn_pin, W_ACK_PAYLOAD | ( pipe & B111 ), SPI_CONTINUE);
while ( data_len-- > 1 ){
- SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
+ _SPI.transfer(csn_pin,*current++, SPI_CONTINUE);
}
- SPI.transfer(csn_pin,*current++);
+ _SPI.transfer(csn_pin,*current++);
#else
csn(LOW);
- SPI.transfer(W_ACK_PAYLOAD | ( pipe & B111 ) );
+ _SPI.transfer(W_ACK_PAYLOAD | ( pipe & B111 ) );
while ( data_len-- )
- SPI.transfer(*current++);
+ _SPI.transfer(*current++);
csn(HIGH);
@@ -1032,7 +1185,7 @@ void RF24::setPALevel(uint8_t level)
uint8_t setup = read_register(RF_SETUP) & 0b11111000;
if(level > 3){ // If invalid level, go to max PA
- level = RF24_PA_MAX << 1 + 1; // +1 to support the SI24R1 chip extra bit
+ level = (RF24_PA_MAX << 1) + 1; // +1 to support the SI24R1 chip extra bit
}else{
level = (level << 1) + 1; // Else set level as requested
}
@@ -1057,13 +1210,11 @@ bool RF24::setDataRate(rf24_datarate_e speed)
uint8_t setup = read_register(RF_SETUP) ;
// HIGH and LOW '00' is 1Mbs - our default
- wide_band = false ;
setup &= ~(_BV(RF_DR_LOW) | _BV(RF_DR_HIGH)) ;
if( speed == RF24_250KBPS )
{
// Must set the RF_DR_LOW to 1; RF_DR_HIGH (used to be RF_DR) is already 0
// Making it '10'.
- wide_band = false ;
setup |= _BV( RF_DR_LOW ) ;
}
else
@@ -1072,14 +1223,8 @@ bool RF24::setDataRate(rf24_datarate_e speed)
// Making it '01'
if ( speed == RF24_2MBPS )
{
- wide_band = true ;
setup |= _BV(RF_DR_HIGH);
}
- else
- {
- // 1Mbs
- wide_band = false ;
- }
}
write_register(RF_SETUP,setup);
@@ -1088,10 +1233,6 @@ bool RF24::setDataRate(rf24_datarate_e speed)
{
result = true;
}
- else
- {
- wide_band = false;
- }
return result;
}
@@ -1151,9 +1292,11 @@ void RF24::setCRCLength(rf24_crclength_e length)
rf24_crclength_e RF24::getCRCLength(void)
{
rf24_crclength_e result = RF24_CRC_DISABLED;
+
uint8_t config = read_register(CONFIG) & ( _BV(CRCO) | _BV(EN_CRC)) ;
-
- if ( config & _BV(EN_CRC ) )
+ uint8_t AA = read_register(EN_AA);
+
+ if ( config & _BV(EN_CRC ) || AA)
{
if ( config & _BV(CRCO) )
result = RF24_CRC_16;
@@ -1196,7 +1339,7 @@ void RF24::setRetries(uint8_t delay, uint8_t count)
# define SS 3 // PA7
#endif
-#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
+#if defined(RF24_TINY)
void SPIClass::begin() {
diff --git a/libraries/MySensors/utility/RF24.h b/libraries/MySensors/utility/RF24.h
index 89ed231..4934a0a 100755
--- a/libraries/MySensors/utility/RF24.h
+++ b/libraries/MySensors/utility/RF24.h
@@ -15,7 +15,10 @@
#ifndef __RF24_H__
#define __RF24_H__
-
+#include
+#if defined SOFTSPI
+#include
+#endif
/**
* Power Amplifier level.
*
@@ -44,14 +47,22 @@ typedef enum { RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16 } rf24_crclength_e
class RF24
{
private:
+#ifdef SOFTSPI
+ SoftSPI spi;
+#elif defined (SPI_UART)
+ SPIUARTClass uspi;
+#endif
+
uint8_t ce_pin; /**< "Chip Enable" pin, activates the RX or TX role */
- uint8_t csn_pin; /**< SPI Chip select */
- bool wide_band; /* 2Mbs data rate in use? */
+ uint8_t csn_pin; /**< SPI Chip select */
bool p_variant; /* False for RF24L01 and true for RF24L01P */
uint8_t payload_size; /**< Fixed size of payloads */
bool dynamic_payloads_enabled; /**< Whether dynamic payloads are enabled. */
- uint64_t pipe0_reading_address; /**< Last address set on pipe 0 for reading. */
-
+ uint8_t pipe0_reading_address[5]; /**< Last address set on pipe 0 for reading. */
+ uint8_t addr_width; /**< The address width to use - 3,4 or 5 bytes. */
+ uint32_t lastAvailableCheck; /**< Limits the amount of time between reading data, only when switching between modes */
+ boolean listeningStarted; /**< Var for delaying available() after start listening */
+
public:
/**
@@ -76,9 +87,6 @@ public:
* Begin operation of the chip
*
* Call this in setup(), before calling any other methods.
- *
- * @note Optimization: The radio is partially configured in PTX mode
- * when begin is called to make the transition to PTX mode simpler.
*/
void begin(void);
@@ -87,7 +95,7 @@ public:
*
* Be sure to call openReadingPipe() first. Do not call write() while
* in this mode, without first calling stopListening(). Call
- * isAvailable() to check for incoming traffic, and read() to get it.
+ * Available() to check for incoming traffic, and read() to get it.
*/
void startListening(void);
@@ -95,27 +103,12 @@ public:
* Stop listening for incoming messages
*
* Do this before calling write().
- *
- * @note Optimization: The radio will be taken out of PRX mode as soon
- * as listening is stopped. Enables quicker and simpler engaging of
- * primary transmitter (PTX) mode.
*/
void stopListening(void);
/**
* Test whether there are bytes available to be read
*
- * @note Optimization: The available functino now checks the FIFO
- * buffers directly for data instead of relying of interrupt flags.
- *
- * @note Interrupt flags will not be cleared until a payload is
- * actually read from the FIFO
- *
- * @see txStandBy()
- * @see startWrite()
- * @see write()
- * @see writeFast()
- *
* @return True if there is a payload available, false if none is
*/
bool available(void);
@@ -128,9 +121,9 @@ public:
* @note I specifically chose 'void*' as a data type to make it easier
* for beginners to use. No casting needed.
*
- * @note Optimization: No longer boolean. Use available to
- * determine if packets are available. Interrupt flags are now cleared
- * during reads instead of when calling available().
+ * @note No longer boolean. Use available to determine if packets are
+ * available. Interrupt flags are now cleared during reads instead of
+ * when calling available().
*
* @param buf Pointer to a buffer where the data should be written
* @param len Maximum number of bytes to read into the buffer
@@ -139,15 +132,12 @@ public:
void read( void* buf, uint8_t len );
/**
- * @note Optimization: Improved performance slightly
- * Write to the open writing pipe
- *
* Be sure to call openWritingPipe() first to set the destination
* of where to write to.
*
* This blocks until the message is successfully acknowledged by
* the receiver or the timeout/retransmit maxima are reached. In
- * the current configuration, the max delay here is 60ms.
+ * the current configuration, the max delay here is 60-70ms.
*
* The maximum size of data written is the fixed payload size, see
* getPayloadSize(). However, you can write less, and the remainder
@@ -162,24 +152,27 @@ public:
bool write( const void* buf, uint8_t len );
/**
- * Open a pipe for writing
+ * New: Open a pipe for writing via byte array. Old addressing format retained
+ * for compatibility.
*
- * Only one pipe can be open at once, but you can change the pipe
- * you'll listen to. Do not call this while actively listening.
- * Remember to stopListening() first.
+ * Only one writing pipe can be open at once, but you can change the address
+ * you'll write to. Call stopListening() first.
*
- * Addresses are 40-bit hex values, e.g.:
+ * Addresses are assigned via a byte array, default is 5 byte address length
+ *
+ * Usage is exactly the same as before, except for declaring the array
*
* @code
- * openWritingPipe(0xF0F0F0F0F0);
+ * uint8_t addresses[][6] = {"1Node","2Node"};
+ * openWritingPipe(addresses[0]);
* @endcode
+ * @see setAddressWidth
*
- * @param address The 40-bit address of the pipe to open. This can be
- * any value whatsoever, as long as you are the only one writing to it
- * and only one other radio is listening to it. Coordinate these pipe
+ * @param address The address of the pipe to open. Coordinate these pipe
* addresses amongst nodes on the network.
*/
- void openWritingPipe(uint64_t address);
+
+ void openWritingPipe(const uint8_t *address);
/**
* Open a pipe for reading
@@ -188,35 +181,27 @@ public:
* reading pipes, and then call startListening().
*
* @see openWritingPipe
+ * @see setAddressWidth
*
- * @warning Pipes 1-5 should share the first 32 bits.
- * Only the least significant byte should be unique, e.g.
+ * @warning Pipes 1-5 should share the same address, except the first byte.
+ * Only the first byte in the array should be unique, e.g.
* @code
- * openReadingPipe(1,0xF0F0F0F0AA);
- * openReadingPipe(2,0xF0F0F0F066);
+ * uint8_t addresses[][6] = {"1Node","2Node"};
+ * openReadingPipe(1,addresses[0]);
+ * openReadingPipe(2,addresses[1]);
* @endcode
*
* @warning Pipe 0 is also used by the writing pipe. So if you open
* pipe 0 for reading, and then startListening(), it will overwrite the
* writing pipe. Ergo, do an openWritingPipe() again before write().
*
- * @todo Enforce the restriction that pipes 1-5 must share the top 32 bits
- *
* @param number Which pipe# to open, 0-5.
- * @param address The 40-bit address of the pipe to open.
+ * @param address The 24, 32 or 40 bit address of the pipe to open.
*/
- void openReadingPipe(uint8_t number, uint64_t address);
+ void openReadingPipe(uint8_t number, const uint8_t *address);
-
- /**
- * Close a pipe after it has been previously opened.
- * Can be safely called without having previously opened a pipe.
- * @param pipe Which pipe # to close, 0-5.
- */
- void closeReadingPipe( uint8_t pipe ) ;
-
- /**@}*/
+ /**@}*/
/**
* @name Advanced Operation
*
@@ -236,34 +221,41 @@ public:
* FIFO buffers. This optimized version does not rely on interrupt
* flags, but checks the actual FIFO buffers.
*
- * @note Optimization: Interrupt flags are no longer cleared when available is called,
- * but will be reset only when the data is read from the FIFO buffers.
- *
* @param[out] pipe_num Which pipe has the payload available
* @return True if there is a payload available, false if none is
*/
bool available(uint8_t* pipe_num);
+ /**
+ * Check if the radio needs to be read. Can be used to prevent data loss
+ * @@return True if all three 32-byte radio buffers are full
+ */
+ bool rxFifoFull();
+
/**
* Enter low-power mode
*
* To return to normal power mode, either write() some data or
* startListening, or powerUp().
*
- * @note Optimization: The radio will never enter power down unless instructed
- * by the MCU via this command.
+ * @note After calling startListening(), a basic radio will consume about 13.5mA
+ * at max PA level.
+ * During active transmission, the radio will consume about 11.5mA, but this will
+ * be reduced to 26uA (.026mA) between sending.
+ * In full powerDown mode, the radio will consume approximately 900nA (.0009mA)
*/
void powerDown(void);
/**
- * Leave low-power mode - making radio more responsive
- *
+ * Leave low-power mode - required for normal radio operation after calling powerDown()
+ *
* To return to low power mode, call powerDown().
+ * @note This will take up to 5ms for maximum compatibility
*/
void powerUp(void) ;
/**
- * Write for single NOACK writes. Disables acknowledgements/autoretries for a single write.
+ * Write for single NOACK writes. Optionally disables acknowledgements/autoretries for a single write.
*
* @note enableDynamicAck() must be called to enable this feature
*
@@ -279,13 +271,12 @@ public:
bool write( const void* buf, uint8_t len, const bool multicast );
/**
- * @note Optimization: New Command *
* This will not block until the 3 FIFO buffers are filled with data.
* Once the FIFOs are full, writeFast will simply wait for success or
* timeout, and return 1 or 0 respectively. From a user perspective, just
* keep trying to send the same data. The library will keep auto retrying
* the current payload using the built in functionality.
- * @warning It is important to never keep the nRF24L01 in TX mode for more than 4ms at a time. If the auto
+ * @warning It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto
* retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
* to clear by issuing txStandBy() or ensure appropriate time between transmissions.
*
@@ -325,12 +316,11 @@ public:
bool writeFast( const void* buf, uint8_t len, const bool multicast );
/**
- * @note Optimization: New Command
* This function extends the auto-retry mechanism to any specified duration.
* It will not block until the 3 FIFO buffers are filled with data.
* If so the library will auto retry until a new payload is written
* or the user specified timeout period is reached.
- * @warning It is important to never keep the nRF24L01 in TX mode for more than 4ms at a time. If the auto
+ * @warning It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto
* retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
* to clear by issuing txStandBy() or ensure appropriate time between transmissions.
*
@@ -355,7 +345,6 @@ public:
bool writeBlocking( const void* buf, uint8_t len, uint32_t timeout );
/**
- * @note Optimization: New Command
* This function should be called as soon as transmission is finished to
* drop the radio back to STANDBY-I mode. If not issued, the radio will
* remain in STANDBY-II mode which, per the data sheet, is not a recommended
@@ -383,8 +372,6 @@ public:
bool txStandBy();
/**
- * @note Optimization: New Command
- *
* This function allows extended blocking and auto-retries per a user defined timeout
* @code
* Fully Blocking Example:
@@ -408,8 +395,7 @@ public:
* The next time a message is received on @p pipe, the data in @p buf will
* be sent back in the acknowledgement.
*
- * @warning According to the data sheet, only three of these can be pending
- * at any time as there are only 3 FIFO buffers.
+ * @warning Only three of these can be pending at any time as there are only 3 FIFO buffers.
*
* @param pipe Which pipe# (typically 1-5) will get this response.
* @param buf Pointer to data that is sent
@@ -434,14 +420,10 @@ public:
/**
* Determine if an ack payload was received in the most recent call to
- * write().
+ * write(). The regular available() can also be used.
*
* Call read() to retrieve the ack payload.
*
- * @note Optimization: Calling this function NO LONGER clears the interrupt
- * flag. The new functionality checks the RX FIFO buffer for an ACK payload
- * instead of relying on interrupt flags.Reading the payload will clear the flags.
- *
* @return True if an ack payload is available.
*/
bool isAckPayloadAvailable(void);
@@ -464,7 +446,7 @@ public:
* @note Optimization: This function now leaves the CE pin high, so the radio
* will remain in TX or STANDBY-II Mode until a txStandBy() command is issued.
* This allows the chip to be used to its full potential in TX mode.
- * @warning It is important to never keep the nRF24L01 in TX mode for more than 4ms at a time. If the auto
+ * @warning It is important to never keep the nRF24L01 in TX mode with FIFO full for more than 4ms at a time. If the auto
* retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
* to clear by issuing txStandBy() or ensure appropriate time between transmissions.
*
@@ -490,10 +472,6 @@ public:
* Just like write(), but it returns immediately. To find out what happened
* to the send, catch the IRQ and then call whatHappened().
*
- * @note Optimization: This function again behaves as it did previously for backwards-compatibility.
- * with user code. The library uses startFastWrite() internally.
- * This is mainly used for single-payload transactions.
- *
* @see write()
* @see writeFast()
* @see startFastWrite()
@@ -511,8 +489,6 @@ public:
void startWrite( const void* buf, uint8_t len, const bool multicast );
/**
- * Optimization: New Command
- *
* This function is mainly used internally to take advantage of the auto payload
* re-use functionality of the chip, but can be beneficial to users as well.
*
@@ -584,7 +560,23 @@ public:
* @param rx_ready Mask payload received interrupts
*/
void maskIRQ(bool tx_ok,bool tx_fail,bool rx_ready);
+
+ /**
+ * Set the address width from 3 to 5 bytes (24, 32 or 40 bit)
+ *
+ * @param a_width The address width to use: 3,4 or 5
+ */
+ void setAddressWidth(uint8_t a_width);
+
+
+ /**
+ * Close a pipe after it has been previously opened.
+ * Can be safely called without having previously opened a pipe.
+ * @param pipe Which pipe # to close, 0-5.
+ */
+ void closeReadingPipe( uint8_t pipe ) ;
+
/**@}*/
/**@}*/
@@ -642,7 +634,7 @@ public:
* For dynamic payloads, this pulls the size of the payload off
* the chip
*
- * @note Optimization: Corrupt packets are now detected and flushed per the
+ * @note Corrupt packets are now detected and flushed per the
* manufacturer.
*
* @return Payload length of last-received dynamic payload
@@ -655,7 +647,7 @@ public:
* Ack payloads are a handy way to return data back to senders without
* manually changing the radio modes on both units.
*
- * @see examples/pingpair_pl/pingpair_pl.pde
+ * @see examples/GettingStarted_CallResponse/GettingStarted_CallResponse.ino
*/
void enableAckPayload(void);
@@ -759,6 +751,73 @@ public:
*
*/
void disableCRC( void ) ;
+
+ /**
+ * Enable error detection by un-commenting #define FAILURE_HANDLING in RF24_config.h
+ * If a failure has been detected, it usually indicates a hardware issue. By default the library
+ * will cease operation when a failure is detected.
+ * This should allow advanced users to detect and resolve intermittent hardware issues.
+ *
+ * In most cases, the radio must be re-enabled via radio.begin(); and the appropriate settings
+ * applied after a failure occurs, if wanting to re-enable the device immediately.
+ *
+ * Usage: (Failure handling must be enabled per above)
+ * @code
+ * if(radio.failureDetected){
+ * radio.begin(); // Attempt to re-configure the radio with defaults
+ * radio.failureDetected = 0; // Reset the detection value
+ * radio.openWritingPipe(addresses[1]); // Re-configure pipe addresses
+ * radio.openReadingPipe(1,addresses[0]);
+ * report_failure(); // Blink leds, send a message, etc. to indicate failure
+ * }
+ * @endcode
+ */
+ //#if defined (FAILURE_HANDLING)
+ bool failureDetected;
+ //#endif
+
+
+ /**@}*/
+ /**
+ * @name Deprecated
+ *
+ * Methods provided for backwards compabibility.
+ */
+ /**@{*/
+
+
+ /**
+ * Open a pipe for reading
+ * @note For compatibility with old code only, see new function
+ *
+ * @warning Pipes 1-5 should share the first 32 bits.
+ * Only the least significant byte should be unique, e.g.
+ * @code
+ * openReadingPipe(1,0xF0F0F0F0AA);
+ * openReadingPipe(2,0xF0F0F0F066);
+ * @endcode
+ *
+ * @warning Pipe 0 is also used by the writing pipe. So if you open
+ * pipe 0 for reading, and then startListening(), it will overwrite the
+ * writing pipe. Ergo, do an openWritingPipe() again before write().
+ *
+ * @param number Which pipe# to open, 0-5.
+ * @param address The 40-bit address of the pipe to open.
+ */
+ void openReadingPipe(uint8_t number, uint64_t address);
+
+ /**
+ * Open a pipe for writing
+ * @note For compatibility with old code only, see new function
+ * Addresses are 40-bit hex values, e.g.:
+ *
+ * @code
+ * openWritingPipe(0xF0F0F0F0F0);
+ * @endcode
+ *
+ * @param address The 40-bit address of the pipe to open.
+ */
+ void openWritingPipe(uint64_t address);
private:
@@ -863,7 +922,8 @@ private:
* @return Current value of status register
*/
uint8_t get_status(void);
-#if !defined (MINIMAL)
+
+ #if !defined (MINIMAL)
/**
* Decode and print the given status to stdout
*
@@ -921,6 +981,11 @@ private:
*/
uint8_t spiTrans(uint8_t cmd);
+
+ #if defined (FAILURE_HANDLING)
+ void errNotify(void);
+ #endif
+
/**@}*/
};
@@ -1014,6 +1079,18 @@ private:
* ping/pong cycle, and the receiver sleeps between payloads.
*/
+ /**
+ * @example rf24ping85.ino
+ * New: Contributed by https://github.com/tong67
+ * This is an example of how to use the RF24 class to communicate with ATtiny85 and other node.
+ */
+
+ /**
+ * @example timingSearch3pin.ino
+ * New: Contributed by https://github.com/tong67
+ * This is an example of how to determine the correct timing for ATtiny when using only 3-pins
+ */
+
/**
* @example pingpair_dyn.ino
*
@@ -1071,7 +1148,7 @@ private:
*
* This library fork is designed to be...
* @li More compliant with the manufacturer specified operation of the chip, while allowing advanced users
- * to work outside the reccommended operation.
+ * to work outside the recommended operation.
* @li Utilize the capabilities of the radio to their full potential via Arduino
* @li More reliable, responsive and feature rich
* @li Easy for beginners to use, with well documented examples and features
@@ -1079,25 +1156,30 @@ private:
*
* @section News News
*
- * April 2014: Official Release: Still some work to do, but most benefits have been realized
+ * Main changes:
* - The library has been tweaked to allow full use of the FIFO buffers for maximum transfer speeds
+ * - Many issues and bugs have been resolved
* - Changes to read() and available () functionality have increased reliability and response
* - Extended timeout periods have been added to aid in noisy or otherwise unreliable environments
* - Delays have been removed where possible to ensure maximum efficiency
* - Full Due support with extended SPI functions
- * - ATTiny 24/44/84 25/45/85 now supported.
+ * - ATTiny now supported.
+ * - Raspberry Pi now supported
* - More! See the links below and class documentation for more info.
*
- * If issues are discovered with the documentation, please report them here: here
+ * If issues are discovered with the documentation, please report them here
* @section Useful Useful References
*
* Please refer to:
*
* @li Documentation Main Page
* @li RF24 Class Documentation
+ * @li My Blog: RF24 Optimization Overview
* @li Source Code
- * @li Downloads Page
+ * @li Download
* @li Chip Datasheet
+ * @li RF24Network: Easily create a home or long-range RF24 sensor network
+ * @li My Blog: RF24 Wireless Audio
* @li Original Library
*
* This chip uses the SPI bus, plus two chip control pins. Remember that pin 10 must still remain an output, or
@@ -1108,13 +1190,13 @@ private:
* Most standard Arduino based boards are supported:
* - ATMega 328 based boards (Uno, Nano, etc)
* - Mega Boards (1280, 2560, etc)
- * - ARM based boards (Arduino Due) Note: Do not include printf.h or use printf begin. This functionality is already present. Must use one of the
- * hardware SS/CSN pins as extended SPI methods are used.
+ * - Arduino Due: Must use one of the hardware SS/CSN pins as extended SPI methods are used.
* Initial Due support taken from https://github.com/mcrosson/RF24/tree/due
- * - ATTiny board support added from https://github.com/jscrane/RF24
+ * - ATTiny board support initially added from https://github.com/jscrane/RF24
* Note: ATTiny support is built into the library. Do not include SPI.h.
- * ATTiny 85: D0(pin 5): MISO, D1(pin6) MOSI, D2(pin7) SCK, D3(pin2):CSN/SS, D4(pin3): CE
- * ATTiny 84: PA6:MISO, PA5:MOSI, PA4:SCK, PA7:CSN/SS, CE as desired
+ * See the included examples for more info on using ATTiny with RF24
+ * See https://github.com/TCWORLD/ATTinyCore/tree/master/PCREL%20Patch%20for%20GCC for ATTiny patch
+ * - Raspberry Pi Support: See the readme at https://github.com/TMRh20/RF24/tree/master/RPi/RF24
*
* @section More More Information
*
@@ -1122,7 +1204,7 @@ private:
*
* @li Project blog:
* @li TMRh20.blogspot.com
- * @li RF24 Wireless Audio Library (Coming Soon)
+ * @li RF24 Wireless Audio Library
* @li Optimized RF24 Network Layer
* @li ManiacBug on GitHub (Original Library Author)
*/
diff --git a/libraries/MySensors/utility/RF24_config.h b/libraries/MySensors/utility/RF24_config.h
index 55962f1..7ee69e3 100755
--- a/libraries/MySensors/utility/RF24_config.h
+++ b/libraries/MySensors/utility/RF24_config.h
@@ -20,27 +20,65 @@
#include
- //TMRh20:
- #define MINIMAL // saves 432 bytes!
-
+ /*** USER DEFINES: ***/
+ //#define FAILURE_HANDLING
+ //#define SERIAL_DEBUG
+ //#define MINIMAL
+ //#define SPI_UART // Requires library from https://github.com/TMRh20/Sketches/tree/master/SPI_UART
+ //#define SOFTSPI // Requires library from https://github.com/greiman/DigitalIO
+ /**********************/
+
// Define _BV for non-Arduino platforms and for Arduino DUE
-#if defined (ARDUINO)
- #include
+#if defined (ARDUINO) && !defined (__arm__)
+ #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
+ #define RF24_TINY
+ #define _SPI SPI
+ #else
+ #if defined SPI_UART
+ #include
+ #define _SPI uspi
+ #elif defined SOFTSPI
+ // change these pins to your liking
+ //
+ const uint8_t SOFT_SPI_MISO_PIN = 16;
+ const uint8_t SOFT_SPI_MOSI_PIN = 15;
+ const uint8_t SOFT_SPI_SCK_PIN = 14;
+ const uint8_t SPI_MODE = 0;
+ #define _SPI spi
+
+ #else
+ #include
+ #define _SPI SPI
+ #endif
+ #endif
#else
- #include
- #include
- #include
- extern HardwareSPI SPI;
- #define _BV(x) (1<<(x))
- #endif
+ #include
+ #include
+ #include
- #undef SERIAL_DEBUG
+ #if defined(__arm__) || defined (CORE_TEENSY)
+ #include
+ #endif
+
+ #if !defined(CORE_TEENSY)
+ #define _BV(x) (1<<(x))
+ #if !defined(__arm__)
+ extern HardwareSPI SPI;
+ #endif
+ #else
+ #define printf Serial.printf
+ #endif
+
+ #define _SPI SPI
+#endif
+
+
#ifdef SERIAL_DEBUG
#define IF_SERIAL_DEBUG(x) ({x;})
#else
#define IF_SERIAL_DEBUG(x)
- #if defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny85__)
+ #if defined(RF24_TINY)
#define printf_P(...)
#endif
#endif
@@ -48,7 +86,7 @@
// Avoid spurious warnings
// Arduino DUE is arm and uses traditional PROGMEM constructs
#if 1
-#if ! defined( NATIVE ) && defined( ARDUINO ) && ! defined(__arm__)
+#if ! defined( NATIVE ) && defined( ARDUINO ) && ! defined(__arm__) && ! defined( CORE_TEENSY3 )
#undef PROGMEM
#define PROGMEM __attribute__(( section(".progmem.data") ))
#undef PSTR
@@ -68,20 +106,25 @@
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
#endif
+
+#if !defined ( CORE_TEENSY )
typedef uint16_t prog_uint16_t;
#define PSTR(x) (x)
#define printf_P printf
#define strlen_P strlen
#define PROGMEM
#define pgm_read_word(p) (*(p))
+#endif
+
#define PRIPSTR "%s"
+
#endif
// ATTiny support code is from https://github.com/jscrane/RF24
-#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
+#if defined(RF24_TINY)
#include
#include
#include
diff --git a/libraries/UIPEthernet/README b/libraries/UIPEthernet/README
index 0fb5d67..ec51f2d 100644
--- a/libraries/UIPEthernet/README
+++ b/libraries/UIPEthernet/README
@@ -1,4 +1,4 @@
-This is UIPEthernet version 1.01
+This is UIPEthernet version 1.07
An plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS.
Just include 'UIPEthernet.h' instead of 'Ethernet.h' and use all your code written for the stock Arduino Ethernet lib!
@@ -26,7 +26,9 @@ On a Mac, you will want to create a folder named "libraries" in in the "Document
$ cd ~/Documents/Arduino/libraries
$ git clone https://github.com/ntruchsess/arduino_uip UIPEthernet
-Or you download the zipped version of the library from https://github.com/ntruchsess/arduino_uip/archive/master.zip, create a directory [path to Arduino distribution]\libraries\UIPEthernet and put the contents of the zip-file there.
+Or you download the zipped version of the library from https://github.com/ntruchsess/arduino_uip/releases, and copy the contained directory UIPEthernet to [path to Arduino distribution]\libraries\UIPEthernet.
+
+If you are running Arduino-IDE 1.5.x use release-version 1.57 or checkout branch 'Arduino_1.5.5'
Additional information can be found on the Arduino website: http://www.arduino.cc/en/Hacking/Libraries
diff --git a/libraries/UIPEthernet/UIPClient.cpp b/libraries/UIPEthernet/UIPClient.cpp
index 73daaba..ffbb3e1 100644
--- a/libraries/UIPEthernet/UIPClient.cpp
+++ b/libraries/UIPEthernet/UIPClient.cpp
@@ -49,19 +49,22 @@ UIPClient::UIPClient(uip_userdata_t* conn_data) :
int
UIPClient::connect(IPAddress ip, uint16_t port)
{
+ stop();
uip_ipaddr_t ipaddr;
uip_ip_addr(ipaddr, ip);
struct uip_conn* conn = uip_connect(&ipaddr, htons(port));
if (conn)
{
+#if UIP_CONNECT_TIMEOUT > 0
+ int32_t timeout = millis() + 1000 * UIP_CONNECT_TIMEOUT;
+#endif
while((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED)
{
data = (uip_userdata_t*) conn->appstate;
#ifdef UIPETHERNET_DEBUG_CLIENT
-
Serial.print(F("connected, state: "));
Serial.print(data->state);
Serial.print(F(", first packet in: "));
@@ -69,6 +72,13 @@ UIPClient::connect(IPAddress ip, uint16_t port)
#endif
return 1;
}
+#if UIP_CONNECT_TIMEOUT > 0
+ if (((int32_t)(millis() - timeout)) > 0)
+ {
+ conn->tcpstateflags = UIP_CLOSED;
+ break;
+ }
+#endif
}
}
return 0;
@@ -83,7 +93,7 @@ UIPClient::connect(const char *host, uint16_t port)
DNSClient dns;
IPAddress remote_addr;
- dns.begin(UIPEthernet.dnsServerIP());
+ dns.begin(UIPEthernetClass::_dnsServerAddress);
ret = dns.getHostByName(host, remote_addr);
if (ret == 1) {
return connect(remote_addr, port);
@@ -95,10 +105,14 @@ UIPClient::connect(const char *host, uint16_t port)
void
UIPClient::stop()
{
- if (data)
+ if (data && data->state)
{
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ Serial.println(F("before stop(), with data"));
+ _dumpAllData();
+#endif
_flushBlocks(&data->packets_in[0]);
- if (data->state & UIP_CLIENT_CLOSED)
+ if (data->state & UIP_CLIENT_REMOTECLOSED)
{
data->state = 0;
}
@@ -106,9 +120,19 @@ UIPClient::stop()
{
data->state |= UIP_CLIENT_CLOSE;
}
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ Serial.println(F("after stop()"));
+ _dumpAllData();
+#endif
}
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ else
+ {
+ Serial.println(F("stop(), data: NULL"));
+ }
+#endif
data = NULL;
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
}
uint8_t
@@ -125,8 +149,8 @@ UIPClient::operator==(const UIPClient& rhs)
UIPClient::operator bool()
{
- UIPEthernet.tick();
- return data && (!(data->state & UIP_CLIENT_CLOSED) || data->packets_in[0] != NOBLOCK);
+ UIPEthernetClass::tick();
+ return data && (!(data->state & UIP_CLIENT_REMOTECLOSED) || data->packets_in[0] != NOBLOCK);
}
size_t
@@ -150,15 +174,15 @@ UIPClient::_write(uip_userdata_t* u, const uint8_t *buf, size_t size)
uint16_t attempts = UIP_ATTEMPTS_ON_WRITE;
#endif
repeat:
- UIPEthernet.tick();
- if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
+ UIPEthernetClass::tick();
+ if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
{
- memhandle* p = _currentBlock(&u->packets_out[0]);
- if (*p == NOBLOCK)
+ uint8_t p = _currentBlock(&u->packets_out[0]);
+ if (u->packets_out[p] == NOBLOCK)
{
newpacket:
- *p = UIPEthernet.network.allocBlock(UIP_SOCKET_DATALEN);
- if (*p == NOBLOCK)
+ u->packets_out[p] = Enc28J60Network::allocBlock(UIP_SOCKET_DATALEN);
+ if (u->packets_out[p] == NOBLOCK)
{
#if UIP_ATTEMPTS_ON_WRITE > 0
if ((--attempts)>0)
@@ -172,7 +196,7 @@ newpacket:
}
#ifdef UIPETHERNET_DEBUG_CLIENT
Serial.print(F("UIPClient.write: writePacket("));
- Serial.print(*p);
+ Serial.print(u->packets_out[p]);
Serial.print(F(") pos: "));
Serial.print(u->out_pos);
Serial.print(F(", buf["));
@@ -183,12 +207,12 @@ newpacket:
Serial.write((uint8_t*)buf+size-remain,remain);
Serial.println(F("'"));
#endif
- written = UIPEthernet.network.writePacket(*p,u->out_pos,(uint8_t*)buf+size-remain,remain);
+ written = Enc28J60Network::writePacket(u->packets_out[p],u->out_pos,(uint8_t*)buf+size-remain,remain);
remain -= written;
u->out_pos+=written;
if (remain > 0)
{
- if (p==&u->packets_out[UIP_SOCKET_NUMPACKETS-1])
+ if (p == UIP_SOCKET_NUMPACKETS-1)
{
#if UIP_ATTEMPTS_ON_WRITE > 0
if ((--attempts)>0)
@@ -218,15 +242,10 @@ UIPClient::available()
int
UIPClient::_available(uip_userdata_t *u)
{
- memhandle* p = &u->packets_in[0];
- if (*p == NOBLOCK)
- return 0;
int len = 0;
- for(memhandle* end = p+UIP_SOCKET_NUMPACKETS; p < end; p++)
+ for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
{
- if(*p == NOBLOCK)
- break;
- len += UIPEthernet.network.blockSize(*p);
+ len += Enc28J60Network::blockSize(u->packets_in[i]);
}
return len;
}
@@ -236,23 +255,22 @@ UIPClient::read(uint8_t *buf, size_t size)
{
if (*this)
{
- int remain = size;
- memhandle* p = &data->packets_in[0];
- if (*p == NOBLOCK)
+ uint16_t remain = size;
+ if (data->packets_in[0] == NOBLOCK)
return 0;
- int read;
+ uint16_t read;
do
{
- read = UIPEthernet.network.readPacket(*p,0,buf+size-remain,remain);
- if (read == UIPEthernet.network.blockSize(*p))
+ read = Enc28J60Network::readPacket(data->packets_in[0],0,buf+size-remain,remain);
+ if (read == Enc28J60Network::blockSize(data->packets_in[0]))
{
remain -= read;
- _eatBlock(p);
- if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
+ _eatBlock(&data->packets_in[0]);
+ if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
data->state |= UIP_CLIENT_RESTART;
- if (*p == NOBLOCK)
+ if (data->packets_in[0] == NOBLOCK)
{
- if (data->state & UIP_CLIENT_CLOSED)
+ if (data->state & UIP_CLIENT_REMOTECLOSED)
{
data->state = 0;
data = NULL;
@@ -262,7 +280,7 @@ UIPClient::read(uint8_t *buf, size_t size)
}
else
{
- UIPEthernet.network.resizeBlock(*p,read);
+ Enc28J60Network::resizeBlock(data->packets_in[0],read);
break;
}
}
@@ -286,11 +304,10 @@ UIPClient::peek()
{
if (*this)
{
- memhandle p = data->packets_in[0];
- if (p != NOBLOCK)
+ if (data->packets_in[0] != NOBLOCK)
{
uint8_t c;
- UIPEthernet.network.readPacket(p,0,&c,1);
+ Enc28J60Network::readPacket(data->packets_in[0],0,&c,1);
return c;
}
}
@@ -308,26 +325,21 @@ UIPClient::flush()
void
uipclient_appcall(void)
-{
- UIPClient::uip_callback();
-}
-
-void
-UIPClient::uip_callback()
{
uip_userdata_t *u = (uip_userdata_t*)uip_conn->appstate;
if (!u && uip_connected())
{
#ifdef UIPETHERNET_DEBUG_CLIENT
Serial.println(F("UIPClient uip_connected"));
+ UIPClient::_dumpAllData();
#endif
- u = (uip_userdata_t*) _allocateData();
+ u = (uip_userdata_t*) UIPClient::_allocateData();
if (u)
{
uip_conn->appstate = u;
#ifdef UIPETHERNET_DEBUG_CLIENT
Serial.print(F("UIPClient allocated state: "));
- Serial.println(u->state);
+ Serial.println(u->state,BIN);
#endif
}
#ifdef UIPETHERNET_DEBUG_CLIENT
@@ -343,33 +355,24 @@ UIPClient::uip_callback()
Serial.print(F("UIPClient uip_newdata, uip_len:"));
Serial.println(uip_len);
#endif
- if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
+ if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
{
- memhandle newPacket = UIPEthernet.network.allocBlock(uip_len);
+ memhandle newPacket = Enc28J60Network::allocBlock(uip_len);
if (newPacket != NOBLOCK)
{
- memhandle* p = _currentBlock(&u->packets_in[0]);
- //if it's not the first packet
- if (*p != NOBLOCK)
+ for (uint8_t i=0; i < UIP_SOCKET_NUMPACKETS; i++)
{
- uint8_t slot = p - &u->packets_in[0];
- if (slot < UIP_SOCKET_NUMPACKETS-1)
- p++;
- //if this is the last slot stop this connection
- if (slot >= UIP_SOCKET_NUMPACKETS-2)
+ if (u->packets_in[i] == NOBLOCK)
{
- uip_stop();
- //if there's no free slot left omit loosing this packet and (again) stop this connection
- if (slot == UIP_SOCKET_NUMPACKETS-1)
- goto reject_newdata;
+ if (i == UIP_SOCKET_NUMPACKETS-1)
+ uip_stop();
+ Enc28J60Network::copyPacket(newPacket,0,UIPEthernetClass::in_packet,((uint8_t*)uip_appdata)-uip_buf,uip_len);
+ u->packets_in[i] = newPacket;
+ goto finish_newdata;
}
}
- UIPEthernet.network.copyPacket(newPacket,0,UIPEthernet.in_packet,((uint8_t*)uip_appdata)-uip_buf,uip_len);
- *p = newPacket;
- goto finish_newdata;
}
-reject_newdata:
- UIPEthernet.packetstate &= ~UIPETHERNET_FREEPACKET;
+ UIPEthernetClass::packetstate &= ~UIPETHERNET_FREEPACKET;
uip_stop();
}
}
@@ -384,17 +387,22 @@ finish_newdata:
{
#ifdef UIPETHERNET_DEBUG_CLIENT
Serial.println(F("UIPClient uip_closed"));
+ UIPClient::_dumpAllData();
#endif
// drop outgoing packets not sent yet:
- _flushBlocks(&u->packets_out[0]);
+ UIPClient::_flushBlocks(&u->packets_out[0]);
if (u->packets_in[0] != NOBLOCK)
{
((uip_userdata_closed_t *)u)->lport = uip_conn->lport;
- u->state |= UIP_CLIENT_CLOSED;
+ u->state |= UIP_CLIENT_REMOTECLOSED;
}
else
u->state = 0;
// disassociate appdata.
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ Serial.println(F("after UIPClient uip_closed"));
+ UIPClient::_dumpAllData();
+#endif
uip_conn->appstate = NULL;
goto nodata;
}
@@ -403,34 +411,33 @@ finish_newdata:
#ifdef UIPETHERNET_DEBUG_CLIENT
Serial.println(F("UIPClient uip_acked"));
#endif
- _eatBlock(&u->packets_out[0]);
+ UIPClient::_eatBlock(&u->packets_out[0]);
}
if (uip_poll() || uip_rexmit())
{
#ifdef UIPETHERNET_DEBUG_CLIENT
//Serial.println(F("UIPClient uip_poll"));
#endif
- memhandle p = u->packets_out[0];
- if (p != NOBLOCK)
+ if (u->packets_out[0] != NOBLOCK)
{
if (u->packets_out[1] == NOBLOCK)
{
uip_len = u->out_pos;
if (uip_len > 0)
{
- UIPEthernet.network.resizeBlock(p,0,uip_len);
+ Enc28J60Network::resizeBlock(u->packets_out[0],0,uip_len);
}
}
else
- uip_len = UIPEthernet.network.blockSize(p);
+ uip_len = Enc28J60Network::blockSize(u->packets_out[0]);
if (uip_len > 0)
{
- UIPEthernet.uip_hdrlen = ((uint8_t*)uip_appdata)-uip_buf;
- UIPEthernet.uip_packet = UIPEthernet.network.allocBlock(UIPEthernet.uip_hdrlen+uip_len);
- if (UIPEthernet.uip_packet != NOBLOCK)
+ UIPEthernetClass::uip_hdrlen = ((uint8_t*)uip_appdata)-uip_buf;
+ UIPEthernetClass::uip_packet = Enc28J60Network::allocBlock(UIPEthernetClass::uip_hdrlen+uip_len);
+ if (UIPEthernetClass::uip_packet != NOBLOCK)
{
- UIPEthernet.network.copyPacket(UIPEthernet.uip_packet,UIPEthernet.uip_hdrlen,p,0,uip_len);
- UIPEthernet.packetstate |= UIPETHERNET_SENDPACKET;
+ Enc28J60Network::copyPacket(UIPEthernetClass::uip_packet,UIPEthernetClass::uip_hdrlen,u->packets_out[0],0,uip_len);
+ UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET;
uip_send(uip_appdata,uip_len);
}
return;
@@ -441,23 +448,30 @@ finish_newdata:
if (u->state & UIP_CLIENT_CLOSE)
{
#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient state UIP_CLIENT_CLOSE"));
+ Serial.println(F("UIPClient state UIP_CLIENT_CLOSE"));
+ UIPClient::_dumpAllData();
#endif
if (u->packets_out[0] == NOBLOCK)
{
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient state UIP_CLIENT_CLOSE -> free userdata"));
-#endif
u->state = 0;
uip_conn->appstate = NULL;
uip_close();
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ Serial.println(F("no blocks out -> free userdata"));
+ UIPClient::_dumpAllData();
+#endif
}
else
- uip_stop();
+ {
+ uip_stop();
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ Serial.println(F("blocks outstanding transfer -> uip_stop()"));
+#endif
+ }
}
}
nodata:
- UIPEthernet.uip_packet = NOBLOCK;
+ UIPEthernetClass::uip_packet = NOBLOCK;
uip_len=0;
}
@@ -477,13 +491,15 @@ UIPClient::_allocateData()
return NULL;
}
-memhandle*
+uint8_t
UIPClient::_currentBlock(memhandle* block)
{
- for(memhandle* end = block+UIP_SOCKET_NUMPACKETS-1; block < end; block++)
- if(*(block+1) == NOBLOCK)
- break;
- return block;
+ for (uint8_t i = 1; i < UIP_SOCKET_NUMPACKETS; i++)
+ {
+ if (block[i] == NOBLOCK)
+ return i-1;
+ }
+ return UIP_SOCKET_NUMPACKETS-1;
}
void
@@ -493,19 +509,20 @@ UIPClient::_eatBlock(memhandle* block)
memhandle* start = block;
Serial.print(F("eatblock("));
Serial.print(*block);
- Serial.print("): ");
+ Serial.print(F("): "));
for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
{
Serial.print(start[i]);
- Serial.print(" ");
+ Serial.print(F(" "));
}
- Serial.print("-> ");
+ Serial.print(F("-> "));
#endif
- memhandle* end = block+(UIP_SOCKET_NUMPACKETS-1);
- UIPEthernet.network.freeBlock(*block);
- while(block < end)
- *block = *((block++)+1);
- *end = NOBLOCK;
+ Enc28J60Network::freeBlock(block[0]);
+ for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS-1; i++)
+ {
+ block[i] = block[i+1];
+ }
+ block[UIP_SOCKET_NUMPACKETS-1] = NOBLOCK;
#ifdef UIPETHERNET_DEBUG_CLIENT
for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
{
@@ -519,15 +536,46 @@ UIPClient::_eatBlock(memhandle* block)
void
UIPClient::_flushBlocks(memhandle* block)
{
- for(memhandle* end = block+UIP_SOCKET_NUMPACKETS; block < end; block++)
+ for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
{
- if(*block != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(*block);
- *block = NOBLOCK;
- }
- else
- break;
+ Enc28J60Network::freeBlock(block[i]);
+ block[i] = NOBLOCK;
}
}
+#ifdef UIPETHERNET_DEBUG_CLIENT
+void
+UIPClient::_dumpAllData() {
+ for (uint8_t i=0; i < UIP_CONNS; i++)
+ {
+ Serial.print(F("UIPClient::all_data["));
+ Serial.print(i);
+ Serial.print(F("], state:"));
+ Serial.println(all_data[i].state, BIN);
+ Serial.print(F("packets_in: "));
+ for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++)
+ {
+ Serial.print(all_data[i].packets_in[j]);
+ Serial.print(F(" "));
+ }
+ Serial.println();
+ if (all_data[i].state & UIP_CLIENT_REMOTECLOSED)
+ {
+ Serial.print(F("state remote closed, local port: "));
+ Serial.println(htons(((uip_userdata_closed_t *)(&all_data[i]))->lport));
+ }
+ else
+ {
+ Serial.print(F("packets_out: "));
+ for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++)
+ {
+ Serial.print(all_data[i].packets_out[j]);
+ Serial.print(F(" "));
+ }
+ Serial.println();
+ Serial.print(F("out_pos: "));
+ Serial.println(all_data[i].out_pos);
+ }
+ }
+}
+#endif
diff --git a/libraries/UIPEthernet/UIPClient.h b/libraries/UIPEthernet/UIPClient.h
index 0d8beab..ac601da 100644
--- a/libraries/UIPEthernet/UIPClient.h
+++ b/libraries/UIPEthernet/UIPClient.h
@@ -21,6 +21,7 @@
#define UIPCLIENT_H
#include "ethernet_comp.h"
+#include "Print.h"
#import "Client.h"
#import "utility/mempool.h"
@@ -36,9 +37,9 @@ extern "C" {
#define UIP_CLIENT_CONNECTED 0x10
#define UIP_CLIENT_CLOSE 0x20
-#define UIP_CLIENT_CLOSED 0x40
+#define UIP_CLIENT_REMOTECLOSED 0x40
#define UIP_CLIENT_RESTART 0x80
-#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED | UIP_CLIENT_RESTART)
+#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED | UIP_CLIENT_RESTART)
#define UIP_CLIENT_SOCKETS ~UIP_CLIENT_STATEFLAGS
typedef uint8_t uip_socket_ptr;
@@ -76,6 +77,8 @@ public:
int peek();
void flush();
+ using Print::write;
+
private:
UIPClient(struct uip_conn *_conn);
UIPClient(uip_userdata_t* conn_data);
@@ -84,21 +87,23 @@ private:
static uip_userdata_t all_data[UIP_CONNS];
static uip_userdata_t* _allocateData();
- static uip_userdata_t* _getData(struct uip_conn * conn);
-
+
static size_t _write(uip_userdata_t *,const uint8_t *buf, size_t size);
static int _available(uip_userdata_t *);
- static memhandle * _currentBlock(memhandle* blocks);
+ static uint8_t _currentBlock(memhandle* blocks);
static void _eatBlock(memhandle* blocks);
static void _flushBlocks(memhandle* blocks);
+#ifdef UIPETHERNET_DEBUG_CLIENT
+ static void _dumpAllData();
+#endif
+
friend class UIPEthernetClass;
friend class UIPServer;
friend void uipclient_appcall(void);
- static void uip_callback();
};
#endif
diff --git a/libraries/UIPEthernet/UIPEthernet.cpp b/libraries/UIPEthernet/UIPEthernet.cpp
index ca59e93..ea02c97 100644
--- a/libraries/UIPEthernet/UIPEthernet.cpp
+++ b/libraries/UIPEthernet/UIPEthernet.cpp
@@ -25,6 +25,8 @@
#include "HardwareSerial.h"
#endif
+#include "UIPUdp.h"
+
extern "C"
{
#include "utility/uip-conf.h"
@@ -35,18 +37,24 @@ extern "C"
#define ETH_HDR ((struct uip_eth_hdr *)&uip_buf[0])
+memhandle UIPEthernetClass::in_packet(NOBLOCK);
+memhandle UIPEthernetClass::uip_packet(NOBLOCK);
+uint8_t UIPEthernetClass::uip_hdrlen(0);
+uint8_t UIPEthernetClass::packetstate(0);
+
+IPAddress UIPEthernetClass::_dnsServerAddress;
+DhcpClass* UIPEthernetClass::_dhcp(NULL);
+
+struct uip_timer UIPEthernetClass::periodic_timer;
+
// Because uIP isn't encapsulated within a class we have to use global
// variables, so we can only have one TCP/IP stack per program.
-UIPEthernetClass::UIPEthernetClass() :
- in_packet(NOBLOCK),
- uip_packet(NOBLOCK),
- uip_hdrlen(0),
- packetstate(0),
- _dhcp(NULL)
+UIPEthernetClass::UIPEthernetClass()
{
}
+#if UIP_UDP
int
UIPEthernetClass::begin(const uint8_t* mac)
{
@@ -66,6 +74,7 @@ UIPEthernetClass::begin(const uint8_t* mac)
}
return ret;
}
+#endif
void
UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip)
@@ -100,6 +109,7 @@ UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddre
int UIPEthernetClass::maintain(){
tick();
int rc = DHCP_CHECK_NONE;
+#if UIP_UDP
if(_dhcp != NULL){
//we have a pointer to dhcp, use it
rc = _dhcp->checkLease();
@@ -118,6 +128,7 @@ int UIPEthernetClass::maintain(){
}
}
return rc;
+#endif
}
IPAddress UIPEthernetClass::localIP()
@@ -154,7 +165,7 @@ UIPEthernetClass::tick()
{
if (in_packet == NOBLOCK)
{
- in_packet = network.receivePacket();
+ in_packet = Enc28J60Network::receivePacket();
#ifdef UIPETHERNET_DEBUG
if (in_packet != NOBLOCK)
{
@@ -166,10 +177,10 @@ UIPEthernetClass::tick()
if (in_packet != NOBLOCK)
{
packetstate = UIPETHERNET_FREEPACKET;
- uip_len = network.blockSize(in_packet);
+ uip_len = Enc28J60Network::blockSize(in_packet);
if (uip_len > 0)
{
- network.readPacket(in_packet,0,(uint8_t*)uip_buf,UIP_BUFSIZE);
+ Enc28J60Network::readPacket(in_packet,0,(uint8_t*)uip_buf,UIP_BUFSIZE);
if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_IP))
{
uip_packet = in_packet;
@@ -204,7 +215,7 @@ UIPEthernetClass::tick()
Serial.print(F("freeing packet: "));
Serial.println(in_packet);
#endif
- network.freePacket();
+ Enc28J60Network::freePacket();
in_packet = NOBLOCK;
}
}
@@ -216,7 +227,7 @@ UIPEthernetClass::tick()
{
uip_periodic(i);
// If the above function invocation resulted in data that
- // should be sent out on the network, the global variable
+ // should be sent out on the Enc28J60Network, the global variable
// uip_len is set to a value > 0.
if (uip_len > 0)
{
@@ -230,11 +241,11 @@ UIPEthernetClass::tick()
{
uip_udp_periodic(i);
// If the above function invocation resulted in data that
- // should be sent out on the network, the global variable
+ // should be sent out on the Enc28J60Network, the global variable
// uip_len is set to a value > 0. */
if (uip_len > 0)
{
- network_send();
+ UIPUDP::_send((uip_udp_userdata_t *)(uip_udp_conns[i].appstate));
}
}
#endif /* UIP_UDP */
@@ -246,41 +257,42 @@ boolean UIPEthernetClass::network_send()
if (packetstate & UIPETHERNET_SENDPACKET)
{
#ifdef UIPETHERNET_DEBUG
- Serial.print(F("network_send uip_packet: "));
+ Serial.print(F("Enc28J60Network_send uip_packet: "));
Serial.print(uip_packet);
Serial.print(F(", hdrlen: "));
Serial.println(uip_hdrlen);
#endif
- network.writePacket(uip_packet,0,uip_buf,uip_hdrlen);
+ Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_hdrlen);
goto sendandfree;
}
- uip_packet = network.allocBlock(uip_len);
+ uip_packet = Enc28J60Network::allocBlock(uip_len);
if (uip_packet != NOBLOCK)
{
#ifdef UIPETHERNET_DEBUG
- Serial.print(F("network_send uip_buf (uip_len): "));
+ Serial.print(F("Enc28J60Network_send uip_buf (uip_len): "));
Serial.print(uip_len);
Serial.print(F(", packet: "));
Serial.println(uip_packet);
#endif
- network.writePacket(uip_packet,0,uip_buf,uip_len);
+ Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_len);
goto sendandfree;
}
return false;
sendandfree:
- network.sendPacket(uip_packet);
- network.freeBlock(uip_packet);
+ Enc28J60Network::sendPacket(uip_packet);
+ Enc28J60Network::freeBlock(uip_packet);
uip_packet = NOBLOCK;
return true;
}
void UIPEthernetClass::init(const uint8_t* mac) {
- uip_timer_set(&this->periodic_timer, CLOCK_SECOND / 4);
+ uip_timer_set(&periodic_timer, CLOCK_SECOND / 4);
- network.init((uint8_t*)mac);
+ Enc28J60Network::init((uint8_t*)mac);
uip_seteth_addr(mac);
uip_init();
+ uip_arp_init();
}
void UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) {
@@ -345,7 +357,11 @@ UIPEthernetClass::ipchksum(void)
/*---------------------------------------------------------------------------*/
uint16_t
+#if UIP_UDP
UIPEthernetClass::upper_layer_chksum(uint8_t proto)
+#else
+uip_tcpchksum(void)
+#endif
{
uint16_t upper_layer_len;
uint16_t sum;
@@ -359,27 +375,34 @@ UIPEthernetClass::upper_layer_chksum(uint8_t proto)
/* First sum pseudoheader. */
/* IP protocol and length fields. This addition cannot carry. */
+#if UIP_UDP
sum = upper_layer_len + proto;
+#else
+ sum = upper_layer_len + UIP_PROTO_TCP;
+#endif
/* Sum IP source and destination addresses. */
- sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
+ sum = UIPEthernetClass::chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
uint8_t upper_layer_memlen;
+#if UIP_UDP
switch(proto)
{
- case UIP_PROTO_ICMP:
- case UIP_PROTO_ICMP6:
- upper_layer_memlen = upper_layer_len;
- break;
- case UIP_PROTO_TCP:
- upper_layer_memlen = (BUF->tcpoffset >> 4) << 2;
- break;
-#if UIP_UDP
- case UIP_PROTO_UDP:
+// case UIP_PROTO_ICMP:
+// case UIP_PROTO_ICMP6:
+// upper_layer_memlen = upper_layer_len;
+// break;
+ case UIP_PROTO_UDP:
upper_layer_memlen = UIP_UDPH_LEN;
break;
+ default:
+// case UIP_PROTO_TCP:
#endif
+ upper_layer_memlen = (BUF->tcpoffset >> 4) << 2;
+#if UIP_UDP
+ break;
}
- sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen);
+#endif
+ sum = UIPEthernetClass::chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen);
#ifdef UIPETHERNET_DEBUG_CHKSUM
Serial.print(F("chksum uip_buf["));
Serial.print(UIP_IPH_LEN + UIP_LLH_LEN);
@@ -390,9 +413,9 @@ UIPEthernetClass::upper_layer_chksum(uint8_t proto)
#endif
if (upper_layer_memlen < upper_layer_len)
{
- sum = network.chksum(
+ sum = Enc28J60Network::chksum(
sum,
- uip_packet,
+ UIPEthernetClass::uip_packet,
UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen,
upper_layer_len - upper_layer_memlen
);
@@ -403,7 +426,7 @@ UIPEthernetClass::upper_layer_chksum(uint8_t proto)
Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
Serial.print(F("-"));
Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_len);
- Serial.print(F"]: "));
+ Serial.print(F("]: "));
Serial.println(htons(sum),HEX);
#endif
}
@@ -416,6 +439,7 @@ uip_ipchksum(void)
return UIPEthernet.ipchksum();
}
+#if UIP_UDP
uint16_t
uip_tcpchksum(void)
{
@@ -423,7 +447,6 @@ uip_tcpchksum(void)
return sum;
}
-#if UIP_UDP
uint16_t
uip_udpchksum(void)
{
diff --git a/libraries/UIPEthernet/UIPEthernet.h b/libraries/UIPEthernet/UIPEthernet.h
index 94502f1..3bb18d4 100644
--- a/libraries/UIPEthernet/UIPEthernet.h
+++ b/libraries/UIPEthernet/UIPEthernet.h
@@ -20,6 +20,11 @@
#ifndef UIPETHERNET_H
#define UIPETHERNET_H
+//#define UIPETHERNET_DEBUG
+//#define UIPETHERNET_DEBUG_CHKSUM
+//#define UIPETHERNET_DEBUG_UDP
+//#define UIPETHERNET_DEBUG_CLIENT
+
#include "ethernet_comp.h"
#include
#include "Dhcp.h"
@@ -35,11 +40,6 @@ extern "C"
#include "utility/uip.h"
}
-//#define UIPETHERNET_DEBUG
-//#define UIPETHERNET_DEBUG_CHKSUM
-//#define UIPETHERNET_DEBUG_UDP
-//#define UIPETHERNET_DEBUG_CLIENT
-
#define UIPETHERNET_FREEPACKET 1
#define UIPETHERNET_SENDPACKET 2
#define UIPETHERNET_BUFFERREAD 4
@@ -82,24 +82,22 @@ public:
IPAddress dnsServerIP();
private:
- IPAddress _dnsServerAddress;
- DhcpClass* _dhcp;
+ static memhandle in_packet;
+ static memhandle uip_packet;
+ static uint8_t uip_hdrlen;
+ static uint8_t packetstate;
+
+ static IPAddress _dnsServerAddress;
+ static DhcpClass* _dhcp;
- struct uip_timer periodic_timer;
+ static struct uip_timer periodic_timer;
- memhandle in_packet;
- memhandle uip_packet;
- uint8_t uip_hdrlen;
- uint8_t packetstate;
+ static void init(const uint8_t* mac);
+ static void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
- Enc28J60Network network;
+ static void tick();
- void init(const uint8_t* mac);
- void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
-
- void tick();
-
- boolean network_send();
+ static boolean network_send();
friend class UIPServer;
@@ -109,12 +107,16 @@ private:
static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len);
static uint16_t ipchksum(void);
- uint16_t upper_layer_chksum(uint8_t proto);
-
+#if UIP_UDP
+ static uint16_t upper_layer_chksum(uint8_t proto);
+#endif
friend uint16_t uip_ipchksum(void);
friend uint16_t uip_tcpchksum(void);
friend uint16_t uip_udpchksum(void);
+ friend void uipclient_appcall(void);
+ friend void uipudp_appcall(void);
+
#if UIP_CONF_IPV6
uint16_t uip_icmp6chksum(void);
#endif /* UIP_CONF_IPV6 */
diff --git a/libraries/UIPEthernet/UIPServer.cpp b/libraries/UIPEthernet/UIPServer.cpp
index 12ff72f..21c7ef5 100644
--- a/libraries/UIPEthernet/UIPServer.cpp
+++ b/libraries/UIPEthernet/UIPServer.cpp
@@ -28,12 +28,12 @@ UIPServer::UIPServer(uint16_t port) : _port(htons(port))
UIPClient UIPServer::available()
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
for ( uip_userdata_t* data = &UIPClient::all_data[0]; data < &UIPClient::all_data[UIP_CONNS]; data++ )
{
if (data->packets_in[0] != NOBLOCK
&& (((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport ==_port)
- || ((data->state & UIP_CLIENT_CLOSED) && ((uip_userdata_closed_t *)data)->lport == _port)))
+ || ((data->state & UIP_CLIENT_REMOTECLOSED) && ((uip_userdata_closed_t *)data)->lport == _port)))
return UIPClient(data);
}
return UIPClient();
@@ -42,7 +42,7 @@ UIPClient UIPServer::available()
void UIPServer::begin()
{
uip_listen(_port);
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
}
size_t UIPServer::write(uint8_t c)
diff --git a/libraries/UIPEthernet/UIPServer.h b/libraries/UIPEthernet/UIPServer.h
index 64bdade..0cc0619 100644
--- a/libraries/UIPEthernet/UIPServer.h
+++ b/libraries/UIPEthernet/UIPServer.h
@@ -23,7 +23,7 @@
#import "Server.h"
#import "UIPClient.h"
-class UIPServer : Server {
+class UIPServer : public Server {
public:
UIPServer(uint16_t);
diff --git a/libraries/UIPEthernet/UIPUdp.cpp b/libraries/UIPEthernet/UIPUdp.cpp
index d1cb7b1..3deb2c4 100644
--- a/libraries/UIPEthernet/UIPUdp.cpp
+++ b/libraries/UIPEthernet/UIPUdp.cpp
@@ -65,28 +65,13 @@ UIPUDP::stop()
{
if (_uip_udp_conn)
{
- flush();
uip_udp_remove(_uip_udp_conn);
_uip_udp_conn->appstate = NULL;
_uip_udp_conn=NULL;
- if (appdata.packet_in != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_in);
- appdata.packet_in = NOBLOCK;
- }
- uint8_t i = 0;
- memhandle* packet = &appdata.packets_in[0];
- while (*packet != NOBLOCK && i < UIP_UDP_NUMPACKETS)
- {
- UIPEthernet.network.freeBlock(*packet);
- *packet++ = NOBLOCK;
- i++;
- }
- if (appdata.packet_out != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_out);
- appdata.packet_out = NOBLOCK;
- }
+ Enc28J60Network::freeBlock(appdata.packet_in);
+ Enc28J60Network::freeBlock(appdata.packet_next);
+ Enc28J60Network::freeBlock(appdata.packet_out);
+ memset(&appdata,0,sizeof(appdata));
}
}
@@ -97,7 +82,7 @@ UIPUDP::stop()
int
UIPUDP::beginPacket(IPAddress ip, uint16_t port)
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
if (ip && port)
{
uip_ipaddr_t ripaddr;
@@ -139,7 +124,7 @@ UIPUDP::beginPacket(IPAddress ip, uint16_t port)
{
if (appdata.packet_out == NOBLOCK)
{
- appdata.packet_out = UIPEthernet.network.allocBlock(UIP_UDP_MAXPACKETSIZE);
+ appdata.packet_out = Enc28J60Network::allocBlock(UIP_UDP_MAXPACKETSIZE);
appdata.out_pos = UIP_UDP_PHYH_LEN;
if (appdata.packet_out != NOBLOCK)
return 1;
@@ -183,11 +168,11 @@ UIPUDP::endPacket()
if (_uip_udp_conn && appdata.packet_out != NOBLOCK)
{
appdata.send = true;
- UIPEthernet.network.resizeBlock(appdata.packet_out,0,appdata.out_pos);
+ Enc28J60Network::resizeBlock(appdata.packet_out,0,appdata.out_pos);
uip_udp_periodic_conn(_uip_udp_conn);
if (uip_len > 0)
{
- UIPEthernet.network_send();
+ _send(&appdata);
return 1;
}
}
@@ -207,7 +192,7 @@ UIPUDP::write(const uint8_t *buffer, size_t size)
{
if (appdata.packet_out != NOBLOCK)
{
- size_t ret = UIPEthernet.network.writePacket(appdata.packet_out,appdata.out_pos,(uint8_t*)buffer,size);
+ size_t ret = Enc28J60Network::writePacket(appdata.packet_out,appdata.out_pos,(uint8_t*)buffer,size);
appdata.out_pos += ret;
return ret;
}
@@ -219,61 +204,43 @@ UIPUDP::write(const uint8_t *buffer, size_t size)
int
UIPUDP::parsePacket()
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
+#ifdef UIPETHERNET_DEBUG_UDP
if (appdata.packet_in != NOBLOCK)
{
-#ifdef UIPETHERNET_DEBUG_UDP
Serial.print(F("udp parsePacket freeing previous packet: "));
Serial.println(appdata.packet_in);
-#endif;
- UIPEthernet.network.freeBlock(appdata.packet_in);
}
- memhandle *packet = &appdata.packets_in[0];
- appdata.packet_in = *packet;
+#endif
+ Enc28J60Network::freeBlock(appdata.packet_in);
+
+ appdata.packet_in = appdata.packet_next;
+ appdata.packet_next = NOBLOCK;
+
+#ifdef UIPETHERNET_DEBUG_UDP
if (appdata.packet_in != NOBLOCK)
{
-#ifdef UIPETHERNET_DEBUG_UDP
Serial.print(F("udp parsePacket received packet: "));
Serial.print(appdata.packet_in);
+ }
#endif
- if (UIP_UDP_NUMPACKETS > 1)
- {
- uint8_t i = 1;
- memhandle* p = packet+1;
-freeloop:
- *packet = *p;
- if (*packet == NOBLOCK)
- goto freeready;
- packet++;
- if (i < UIP_UDP_NUMPACKETS-1)
- {
- i++;
- p++;
- goto freeloop;
- }
- }
- *packet = NOBLOCK;
-freeready:
- int size = UIPEthernet.network.blockSize(appdata.packet_in);
+ int size = Enc28J60Network::blockSize(appdata.packet_in);
#ifdef UIPETHERNET_DEBUG_UDP
+ if (appdata.packet_in != NOBLOCK)
+ {
Serial.print(F(", size: "));
Serial.println(size);
-#endif
- return size;
}
- return 0;
+#endif
+ return size;
}
// Number of bytes remaining in the current packet
int
UIPUDP::available()
{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- return UIPEthernet.network.blockSize(appdata.packet_in);
- }
- return 0;
+ UIPEthernetClass::tick();
+ return Enc28J60Network::blockSize(appdata.packet_in);
}
// Read a single byte from the current packet
@@ -293,11 +260,17 @@ UIPUDP::read()
int
UIPUDP::read(unsigned char* buffer, size_t len)
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
if (appdata.packet_in != NOBLOCK)
{
- int read = UIPEthernet.network.readPacket(appdata.packet_in,0,buffer,len);
- UIPEthernet.network.resizeBlock(appdata.packet_in,read);
+ memaddress read = Enc28J60Network::readPacket(appdata.packet_in,0,buffer,len);
+ if (read == Enc28J60Network::blockSize(appdata.packet_in))
+ {
+ Enc28J60Network::freeBlock(appdata.packet_in);
+ appdata.packet_in = NOBLOCK;
+ }
+ else
+ Enc28J60Network::resizeBlock(appdata.packet_in,read);
return read;
}
return 0;
@@ -307,11 +280,11 @@ UIPUDP::read(unsigned char* buffer, size_t len)
int
UIPUDP::peek()
{
- UIPEthernet.tick();
+ UIPEthernetClass::tick();
if (appdata.packet_in != NOBLOCK)
{
unsigned char c;
- if (UIPEthernet.network.readPacket(appdata.packet_in,0,&c,1) == 1)
+ if (Enc28J60Network::readPacket(appdata.packet_in,0,&c,1) == 1)
return c;
}
return -1;
@@ -321,12 +294,9 @@ UIPUDP::peek()
void
UIPUDP::flush()
{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_in);
- appdata.packet_in = NOBLOCK;
- }
+ UIPEthernetClass::tick();
+ Enc28J60Network::freeBlock(appdata.packet_in);
+ appdata.packet_in = NOBLOCK;
}
// Return the IP address of the host who sent the current incoming packet
@@ -347,44 +317,28 @@ UIPUDP::remotePort()
void
uipudp_appcall(void) {
- UIPUDP::uip_callback();
-}
-
-void
-UIPUDP::uip_callback() {
- if (appdata_t *data = (appdata_t *)(uip_udp_conn->appstate))
+ if (uip_udp_userdata_t *data = (uip_udp_userdata_t *)(uip_udp_conn->appstate))
{
if (uip_newdata())
{
- uip_udp_conn->rport = UDPBUF->srcport;
- uip_ipaddr_copy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr);
- memhandle *packet = &data->packets_in[0];
- uint8_t i = 0;
- do
+ if (data->packet_next == NOBLOCK)
{
- if (*packet == NOBLOCK)
- {
- *packet = UIPEthernet.network.allocBlock(ntohs(UDPBUF->udplen)-UIP_UDPH_LEN);
+ uip_udp_conn->rport = UDPBUF->srcport;
+ uip_ipaddr_copy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr);
+ data->packet_next = Enc28J60Network::allocBlock(ntohs(UDPBUF->udplen)-UIP_UDPH_LEN);
//if we are unable to allocate memory the packet is dropped. udp doesn't guarantee packet delivery
- if (*packet != NOBLOCK)
- {
- //discard Linklevel and IP and udp-header and any trailing bytes:
- UIPEthernet.network.copyPacket(*packet,0,UIPEthernet.in_packet,UIP_UDP_PHYH_LEN,UIPEthernet.network.blockSize(*packet));
+ if (data->packet_next != NOBLOCK)
+ {
+ //discard Linklevel and IP and udp-header and any trailing bytes:
+ Enc28J60Network::copyPacket(data->packet_next,0,UIPEthernetClass::in_packet,UIP_UDP_PHYH_LEN,Enc28J60Network::blockSize(data->packet_next));
#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp, uip_newdata received packet: "));
- Serial.print(*packet);
- Serial.print(F(", slot: "));
- Serial.print(i);
- Serial.print(F(", size: "));
- Serial.println(UIPEthernet.network.blockSize(*packet));
+ Serial.print(F("udp, uip_newdata received packet: "));
+ Serial.print(data->packet_next);
+ Serial.print(F(", size: "));
+ Serial.println(Enc28J60Network::blockSize(data->packet_next));
#endif
- break;
- }
}
- packet++;
- i++;
}
- while (i < UIP_UDP_NUMPACKETS);
}
if (uip_poll() && data->send)
{
@@ -393,32 +347,37 @@ UIPUDP::uip_callback() {
Serial.print(F("udp, uip_poll preparing packet to send: "));
Serial.print(data->packet_out);
Serial.print(F(", size: "));
- Serial.println(UIPEthernet.network.blockSize(data->packet_out));
+ Serial.println(Enc28J60Network::blockSize(data->packet_out));
#endif
- UIPEthernet.uip_packet = data->packet_out;
- data->packet_out = NOBLOCK;
- UIPEthernet.uip_hdrlen = UIP_UDP_PHYH_LEN;
- UIPEthernet.packetstate |= UIPETHERNET_SENDPACKET;
+ UIPEthernetClass::uip_packet = data->packet_out;
+ UIPEthernetClass::uip_hdrlen = UIP_UDP_PHYH_LEN;
uip_udp_send(data->out_pos - (UIP_UDP_PHYH_LEN));
- uip_process(UIP_UDP_SEND_CONN); //generate udp + ip headers
- uip_arp_out(); //add arp
- if (uip_len == UIP_ARPHDRSIZE)
- {
- UIPEthernet.packetstate &= ~UIPETHERNET_SENDPACKET;
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.println(F("udp, uip_poll results in ARP-packet"));
-#endif
- }
- else
- //arp found ethaddr for ip (otherwise packet is replaced by arp-request)
- {
- data->send = false;
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp, uip_packet to send: "));
- Serial.println(UIPEthernet.uip_packet);
-#endif
- }
}
}
}
+
+void
+UIPUDP::_send(uip_udp_userdata_t *data) {
+ uip_arp_out(); //add arp
+ if (uip_len == UIP_ARPHDRSIZE)
+ {
+ UIPEthernetClass::uip_packet = NOBLOCK;
+ UIPEthernetClass::packetstate &= ~UIPETHERNET_SENDPACKET;
+#ifdef UIPETHERNET_DEBUG_UDP
+ Serial.println(F("udp, uip_poll results in ARP-packet"));
+#endif
+ }
+ else
+ //arp found ethaddr for ip (otherwise packet is replaced by arp-request)
+ {
+ data->send = false;
+ data->packet_out = NOBLOCK;
+ UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET;
+#ifdef UIPETHERNET_DEBUG_UDP
+ Serial.print(F("udp, uip_packet to send: "));
+ Serial.println(UIPEthernetClass::uip_packet);
+#endif
+ }
+ UIPEthernetClass::network_send();
+}
#endif
diff --git a/libraries/UIPEthernet/UIPUdp.h b/libraries/UIPEthernet/UIPUdp.h
index c965ffa..b007a3c 100644
--- a/libraries/UIPEthernet/UIPUdp.h
+++ b/libraries/UIPEthernet/UIPUdp.h
@@ -25,15 +25,20 @@
#include
#include "utility/mempool.h"
extern "C" {
- #include "utility/uip.h";
+ #include "utility/uip.h"
}
#define UIP_UDP_MAXDATALEN 1500
#define UIP_UDP_PHYH_LEN UIP_LLH_LEN+UIP_IPUDPH_LEN
#define UIP_UDP_MAXPACKETSIZE UIP_UDP_MAXDATALEN+UIP_UDP_PHYH_LEN
-#ifndef UIP_UDP_NUMPACKETS
-#define UIP_UDP_NUMPACKETS 5
-#endif
+
+typedef struct {
+ memaddress out_pos;
+ memhandle packet_next;
+ memhandle packet_in;
+ memhandle packet_out;
+ boolean send;
+} uip_udp_userdata_t;
class UIPUDP : public UDP
{
@@ -41,14 +46,7 @@ class UIPUDP : public UDP
private:
struct uip_udp_conn *_uip_udp_conn;
- struct appdata_t
- {
- memaddress out_pos;
- memhandle packets_in[UIP_UDP_NUMPACKETS];
- memhandle packet_in;
- memhandle packet_out;
- boolean send;
- } appdata;
+ uip_udp_userdata_t appdata;
public:
UIPUDP(); // Constructor
@@ -120,7 +118,9 @@ private:
friend void uipudp_appcall(void);
- static void uip_callback();
+ friend class UIPEthernetClass;
+ static void _send(uip_udp_userdata_t *data);
+
};
#endif
diff --git a/libraries/UIPEthernet/ethernet_comp.h b/libraries/UIPEthernet/ethernet_comp.h
index 97a1ad7..4cec2ab 100644
--- a/libraries/UIPEthernet/ethernet_comp.h
+++ b/libraries/UIPEthernet/ethernet_comp.h
@@ -4,6 +4,6 @@
#define Ethernet UIPEthernet
#define EthernetClient UIPClient
#define EthernetServer UIPServer
-//#define EthernetUDP UIPUDP
+#define EthernetUDP UIPUDP
#endif
diff --git a/libraries/UIPEthernet/src/Dhcp.cpp b/libraries/UIPEthernet/src/Dhcp.cpp
deleted file mode 100644
index d34e8e2..0000000
--- a/libraries/UIPEthernet/src/Dhcp.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// DHCP Library v0.3 - April 25, 2009
-// Author: Jordan Terrell - blog.jordanterrell.com
-
-#include
-#include
-#include "Dhcp.h"
-#include "Arduino.h"
-#include "utility/util.h"
-
-int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout)
-{
- _dhcpLeaseTime=0;
- _dhcpT1=0;
- _dhcpT2=0;
- _lastCheck=0;
- _timeout = timeout;
- _responseTimeout = responseTimeout;
-
- // zero out _dhcpMacAddr
- memset(_dhcpMacAddr, 0, 6);
- reset_DHCP_lease();
-
- memcpy((void*)_dhcpMacAddr, (void*)mac, 6);
- _dhcp_state = STATE_DHCP_START;
- return request_DHCP_lease();
-}
-
-void DhcpClass::reset_DHCP_lease(){
- // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp
- memset(_dhcpLocalIp, 0, 20);
-}
-
-//return:0 on error, 1 if request is sent and response is received
-int DhcpClass::request_DHCP_lease(){
-
- uint8_t messageType = 0;
-
-
-
- // Pick an initial transaction ID
- _dhcpTransactionId = random(1UL, 2000UL);
- _dhcpInitialTransactionId = _dhcpTransactionId;
-
- _dhcpUdpSocket.stop();
- if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0)
- {
- // Couldn't get a socket
- return 0;
- }
-
- presend_DHCP();
-
- int result = 0;
-
- unsigned long startTime = millis();
-
- while(_dhcp_state != STATE_DHCP_LEASED)
- {
- if(_dhcp_state == STATE_DHCP_START)
- {
- _dhcpTransactionId++;
-
- send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000));
- _dhcp_state = STATE_DHCP_DISCOVER;
- }
- else if(_dhcp_state == STATE_DHCP_REREQUEST){
- _dhcpTransactionId++;
- send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000));
- _dhcp_state = STATE_DHCP_REQUEST;
- }
- else if(_dhcp_state == STATE_DHCP_DISCOVER)
- {
- uint32_t respId;
- messageType = parseDHCPResponse(_responseTimeout, respId);
- if(messageType == DHCP_OFFER)
- {
- // We'll use the transaction ID that the offer came with,
- // rather than the one we were up to
- _dhcpTransactionId = respId;
- send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000));
- _dhcp_state = STATE_DHCP_REQUEST;
- }
- }
- else if(_dhcp_state == STATE_DHCP_REQUEST)
- {
- uint32_t respId;
- messageType = parseDHCPResponse(_responseTimeout, respId);
- if(messageType == DHCP_ACK)
- {
- _dhcp_state = STATE_DHCP_LEASED;
- result = 1;
- //use default lease time if we didn't get it
- if(_dhcpLeaseTime == 0){
- _dhcpLeaseTime = DEFAULT_LEASE;
- }
- //calculate T1 & T2 if we didn't get it
- if(_dhcpT1 == 0){
- //T1 should be 50% of _dhcpLeaseTime
- _dhcpT1 = _dhcpLeaseTime >> 1;
- }
- if(_dhcpT2 == 0){
- //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime
- _dhcpT2 = _dhcpT1 << 1;
- }
- _renewInSec = _dhcpT1;
- _rebindInSec = _dhcpT2;
- }
- else if(messageType == DHCP_NAK)
- _dhcp_state = STATE_DHCP_START;
- }
-
- if(messageType == 255)
- {
- messageType = 0;
- _dhcp_state = STATE_DHCP_START;
- }
-
- if(result != 1 && ((millis() - startTime) > _timeout))
- break;
- }
-
- // We're done with the socket now
- _dhcpUdpSocket.stop();
- _dhcpTransactionId++;
-
- return result;
-}
-
-void DhcpClass::presend_DHCP()
-{
-}
-
-void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed)
-{
- uint8_t buffer[32];
- memset(buffer, 0, 32);
- IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address
-
- if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT))
- {
- // FIXME Need to return errors
- return;
- }
-
- buffer[0] = DHCP_BOOTREQUEST; // op
- buffer[1] = DHCP_HTYPE10MB; // htype
- buffer[2] = DHCP_HLENETHERNET; // hlen
- buffer[3] = DHCP_HOPS; // hops
-
- // xid
- unsigned long xid = htonl(_dhcpTransactionId);
- memcpy(buffer + 4, &(xid), 4);
-
- // 8, 9 - seconds elapsed
- buffer[8] = ((secondsElapsed & 0xff00) >> 8);
- buffer[9] = (secondsElapsed & 0x00ff);
-
- // flags
- unsigned short flags = htons(DHCP_FLAGSBROADCAST);
- memcpy(buffer + 10, &(flags), 2);
-
- // ciaddr: already zeroed
- // yiaddr: already zeroed
- // siaddr: already zeroed
- // giaddr: already zeroed
-
- //put data in W5100 transmit buffer
- _dhcpUdpSocket.write(buffer, 28);
-
- memset(buffer, 0, 32); // clear local buffer
-
- memcpy(buffer, _dhcpMacAddr, 6); // chaddr
-
- //put data in W5100 transmit buffer
- _dhcpUdpSocket.write(buffer, 16);
-
- memset(buffer, 0, 32); // clear local buffer
-
- // leave zeroed out for sname && file
- // put in W5100 transmit buffer x 6 (192 bytes)
-
- for(int i = 0; i < 6; i++) {
- _dhcpUdpSocket.write(buffer, 32);
- }
-
- // OPT - Magic Cookie
- buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF);
- buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF);
- buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF);
- buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF);
-
- // OPT - message type
- buffer[4] = dhcpMessageType;
- buffer[5] = 0x01;
- buffer[6] = messageType; //DHCP_REQUEST;
-
- // OPT - client identifier
- buffer[7] = dhcpClientIdentifier;
- buffer[8] = 0x07;
- buffer[9] = 0x01;
- memcpy(buffer + 10, _dhcpMacAddr, 6);
-
- // OPT - host name
- buffer[16] = hostName;
- buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address
- strcpy((char*)&(buffer[18]), HOST_NAME);
-
- printByte((char*)&(buffer[24]), _dhcpMacAddr[3]);
- printByte((char*)&(buffer[26]), _dhcpMacAddr[4]);
- printByte((char*)&(buffer[28]), _dhcpMacAddr[5]);
-
- //put data in W5100 transmit buffer
- _dhcpUdpSocket.write(buffer, 30);
-
- if(messageType == DHCP_REQUEST)
- {
- buffer[0] = dhcpRequestedIPaddr;
- buffer[1] = 0x04;
- buffer[2] = _dhcpLocalIp[0];
- buffer[3] = _dhcpLocalIp[1];
- buffer[4] = _dhcpLocalIp[2];
- buffer[5] = _dhcpLocalIp[3];
-
- buffer[6] = dhcpServerIdentifier;
- buffer[7] = 0x04;
- buffer[8] = _dhcpDhcpServerIp[0];
- buffer[9] = _dhcpDhcpServerIp[1];
- buffer[10] = _dhcpDhcpServerIp[2];
- buffer[11] = _dhcpDhcpServerIp[3];
-
- //put data in W5100 transmit buffer
- _dhcpUdpSocket.write(buffer, 12);
- }
-
- buffer[0] = dhcpParamRequest;
- buffer[1] = 0x06;
- buffer[2] = subnetMask;
- buffer[3] = routersOnSubnet;
- buffer[4] = dns;
- buffer[5] = domainName;
- buffer[6] = dhcpT1value;
- buffer[7] = dhcpT2value;
- buffer[8] = endOption;
-
- //put data in W5100 transmit buffer
- _dhcpUdpSocket.write(buffer, 9);
-
- _dhcpUdpSocket.endPacket();
-}
-
-uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId)
-{
- uint8_t type = 0;
- uint8_t opt_len = 0;
-
- unsigned long startTime = millis();
-
- while(_dhcpUdpSocket.parsePacket() <= 0)
- {
- if((millis() - startTime) > responseTimeout)
- {
- return 255;
- }
- delay(50);
- }
- // start reading in the packet
- RIP_MSG_FIXED fixedMsg;
- _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED));
-
- if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT)
- {
- transactionId = ntohl(fixedMsg.xid);
- if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId))
- {
- // Need to read the rest of the packet here regardless
- _dhcpUdpSocket.flush();
- return 0;
- }
-
- memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4);
-
- // Skip to the option part
- // Doing this a byte at a time so we don't have to put a big buffer
- // on the stack (as we don't have lots of memory lying around)
- for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++)
- {
- _dhcpUdpSocket.read(); // we don't care about the returned byte
- }
-
- while (_dhcpUdpSocket.available() > 0)
- {
- switch (_dhcpUdpSocket.read())
- {
- case endOption :
- break;
-
- case padOption :
- break;
-
- case dhcpMessageType :
- opt_len = _dhcpUdpSocket.read();
- type = _dhcpUdpSocket.read();
- break;
-
- case subnetMask :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read(_dhcpSubnetMask, 4);
- break;
-
- case routersOnSubnet :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read(_dhcpGatewayIp, 4);
- for (int i = 0; i < opt_len-4; i++)
- {
- _dhcpUdpSocket.read();
- }
- break;
-
- case dns :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read(_dhcpDnsServerIp, 4);
- for (int i = 0; i < opt_len-4; i++)
- {
- _dhcpUdpSocket.read();
- }
- break;
-
- case dhcpServerIdentifier :
- opt_len = _dhcpUdpSocket.read();
- if( *((uint32_t*)_dhcpDhcpServerIp) == 0 ||
- IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() )
- {
- _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp));
- }
- else
- {
- // Skip over the rest of this option
- while (opt_len--)
- {
- _dhcpUdpSocket.read();
- }
- }
- break;
-
- case dhcpT1value :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1));
- _dhcpT1 = ntohl(_dhcpT1);
- break;
-
- case dhcpT2value :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2));
- _dhcpT2 = ntohl(_dhcpT2);
- break;
-
- case dhcpIPaddrLeaseTime :
- opt_len = _dhcpUdpSocket.read();
- _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime));
- _dhcpLeaseTime = ntohl(_dhcpLeaseTime);
- _renewInSec = _dhcpLeaseTime;
- break;
-
- default :
- opt_len = _dhcpUdpSocket.read();
- // Skip over the rest of this option
- while (opt_len--)
- {
- _dhcpUdpSocket.read();
- }
- break;
- }
- }
- }
-
- // Need to skip to end of the packet regardless here
- _dhcpUdpSocket.flush();
-
- return type;
-}
-
-
-/*
- returns:
- 0/DHCP_CHECK_NONE: nothing happened
- 1/DHCP_CHECK_RENEW_FAIL: renew failed
- 2/DHCP_CHECK_RENEW_OK: renew success
- 3/DHCP_CHECK_REBIND_FAIL: rebind fail
- 4/DHCP_CHECK_REBIND_OK: rebind success
-*/
-int DhcpClass::checkLease(){
- //this uses a signed / unsigned trick to deal with millis overflow
- unsigned long now = millis();
- signed long snow = (long)now;
- int rc=DHCP_CHECK_NONE;
- if (_lastCheck != 0){
- signed long factor;
- //calc how many ms past the timeout we are
- factor = snow - (long)_secTimeout;
- //if on or passed the timeout, reduce the counters
- if ( factor >= 0 ){
- //next timeout should be now plus 1000 ms minus parts of second in factor
- _secTimeout = snow + 1000 - factor % 1000;
- //how many seconds late are we, minimum 1
- factor = factor / 1000 +1;
-
- //reduce the counters by that mouch
- //if we can assume that the cycle time (factor) is fairly constant
- //and if the remainder is less than cycle time * 2
- //do it early instead of late
- if(_renewInSec < factor*2 )
- _renewInSec = 0;
- else
- _renewInSec -= factor;
-
- if(_rebindInSec < factor*2 )
- _rebindInSec = 0;
- else
- _rebindInSec -= factor;
- }
-
- //if we have a lease but should renew, do it
- if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){
- _dhcp_state = STATE_DHCP_REREQUEST;
- rc = 1 + request_DHCP_lease();
- }
-
- //if we have a lease or is renewing but should bind, do it
- if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){
- //this should basically restart completely
- _dhcp_state = STATE_DHCP_START;
- reset_DHCP_lease();
- rc = 3 + request_DHCP_lease();
- }
- }
- else{
- _secTimeout = snow + 1000;
- }
-
- _lastCheck = now;
- return rc;
-}
-
-IPAddress DhcpClass::getLocalIp()
-{
- return IPAddress(_dhcpLocalIp);
-}
-
-IPAddress DhcpClass::getSubnetMask()
-{
- return IPAddress(_dhcpSubnetMask);
-}
-
-IPAddress DhcpClass::getGatewayIp()
-{
- return IPAddress(_dhcpGatewayIp);
-}
-
-IPAddress DhcpClass::getDhcpServerIp()
-{
- return IPAddress(_dhcpDhcpServerIp);
-}
-
-IPAddress DhcpClass::getDnsServerIp()
-{
- return IPAddress(_dhcpDnsServerIp);
-}
-
-void DhcpClass::printByte(char * buf, uint8_t n ) {
- char *str = &buf[1];
- buf[0]='0';
- do {
- unsigned long m = n;
- n /= 16;
- char c = m - 16 * n;
- *str-- = c < 10 ? c + '0' : c + 'A' - 10;
- } while(n);
-}
diff --git a/libraries/UIPEthernet/src/Dhcp.h b/libraries/UIPEthernet/src/Dhcp.h
deleted file mode 100644
index 01405d7..0000000
--- a/libraries/UIPEthernet/src/Dhcp.h
+++ /dev/null
@@ -1,178 +0,0 @@
-// DHCP Library v0.3 - April 25, 2009
-// Author: Jordan Terrell - blog.jordanterrell.com
-
-#ifndef Dhcp_h
-#define Dhcp_h
-
-#include "UIPUdp.h"
-
-/* DHCP state machine. */
-#define STATE_DHCP_START 0
-#define STATE_DHCP_DISCOVER 1
-#define STATE_DHCP_REQUEST 2
-#define STATE_DHCP_LEASED 3
-#define STATE_DHCP_REREQUEST 4
-#define STATE_DHCP_RELEASE 5
-
-#define DHCP_FLAGSBROADCAST 0x8000
-
-/* UDP port numbers for DHCP */
-#define DHCP_SERVER_PORT 67 /* from server to client */
-#define DHCP_CLIENT_PORT 68 /* from client to server */
-
-/* DHCP message OP code */
-#define DHCP_BOOTREQUEST 1
-#define DHCP_BOOTREPLY 2
-
-/* DHCP message type */
-#define DHCP_DISCOVER 1
-#define DHCP_OFFER 2
-#define DHCP_REQUEST 3
-#define DHCP_DECLINE 4
-#define DHCP_ACK 5
-#define DHCP_NAK 6
-#define DHCP_RELEASE 7
-#define DHCP_INFORM 8
-
-#define DHCP_HTYPE10MB 1
-#define DHCP_HTYPE100MB 2
-
-#define DHCP_HLENETHERNET 6
-#define DHCP_HOPS 0
-#define DHCP_SECS 0
-
-#define MAGIC_COOKIE 0x63825363
-#define MAX_DHCP_OPT 16
-
-#define HOST_NAME "ENC28J"
-#define DEFAULT_LEASE (900) //default lease time in seconds
-
-#define DHCP_CHECK_NONE (0)
-#define DHCP_CHECK_RENEW_FAIL (1)
-#define DHCP_CHECK_RENEW_OK (2)
-#define DHCP_CHECK_REBIND_FAIL (3)
-#define DHCP_CHECK_REBIND_OK (4)
-
-enum
-{
- padOption = 0,
- subnetMask = 1,
- timerOffset = 2,
- routersOnSubnet = 3,
- /* timeServer = 4,
- nameServer = 5,*/
- dns = 6,
- /*logServer = 7,
- cookieServer = 8,
- lprServer = 9,
- impressServer = 10,
- resourceLocationServer = 11,*/
- hostName = 12,
- /*bootFileSize = 13,
- meritDumpFile = 14,*/
- domainName = 15,
- /*swapServer = 16,
- rootPath = 17,
- extentionsPath = 18,
- IPforwarding = 19,
- nonLocalSourceRouting = 20,
- policyFilter = 21,
- maxDgramReasmSize = 22,
- defaultIPTTL = 23,
- pathMTUagingTimeout = 24,
- pathMTUplateauTable = 25,
- ifMTU = 26,
- allSubnetsLocal = 27,
- broadcastAddr = 28,
- performMaskDiscovery = 29,
- maskSupplier = 30,
- performRouterDiscovery = 31,
- routerSolicitationAddr = 32,
- staticRoute = 33,
- trailerEncapsulation = 34,
- arpCacheTimeout = 35,
- ethernetEncapsulation = 36,
- tcpDefaultTTL = 37,
- tcpKeepaliveInterval = 38,
- tcpKeepaliveGarbage = 39,
- nisDomainName = 40,
- nisServers = 41,
- ntpServers = 42,
- vendorSpecificInfo = 43,
- netBIOSnameServer = 44,
- netBIOSdgramDistServer = 45,
- netBIOSnodeType = 46,
- netBIOSscope = 47,
- xFontServer = 48,
- xDisplayManager = 49,*/
- dhcpRequestedIPaddr = 50,
- dhcpIPaddrLeaseTime = 51,
- /*dhcpOptionOverload = 52,*/
- dhcpMessageType = 53,
- dhcpServerIdentifier = 54,
- dhcpParamRequest = 55,
- /*dhcpMsg = 56,
- dhcpMaxMsgSize = 57,*/
- dhcpT1value = 58,
- dhcpT2value = 59,
- /*dhcpClassIdentifier = 60,*/
- dhcpClientIdentifier = 61,
- endOption = 255
-};
-
-typedef struct _RIP_MSG_FIXED
-{
- uint8_t op;
- uint8_t htype;
- uint8_t hlen;
- uint8_t hops;
- uint32_t xid;
- uint16_t secs;
- uint16_t flags;
- uint8_t ciaddr[4];
- uint8_t yiaddr[4];
- uint8_t siaddr[4];
- uint8_t giaddr[4];
- uint8_t chaddr[6];
-}RIP_MSG_FIXED;
-
-class DhcpClass {
-private:
- uint32_t _dhcpInitialTransactionId;
- uint32_t _dhcpTransactionId;
- uint8_t _dhcpMacAddr[6];
- uint8_t _dhcpLocalIp[4];
- uint8_t _dhcpSubnetMask[4];
- uint8_t _dhcpGatewayIp[4];
- uint8_t _dhcpDhcpServerIp[4];
- uint8_t _dhcpDnsServerIp[4];
- uint32_t _dhcpLeaseTime;
- uint32_t _dhcpT1, _dhcpT2;
- signed long _renewInSec;
- signed long _rebindInSec;
- signed long _lastCheck;
- unsigned long _timeout;
- unsigned long _responseTimeout;
- unsigned long _secTimeout;
- uint8_t _dhcp_state;
- UIPUDP _dhcpUdpSocket;
-
- int request_DHCP_lease();
- void reset_DHCP_lease();
- void presend_DHCP();
- void send_DHCP_MESSAGE(uint8_t, uint16_t);
- void printByte(char *, uint8_t);
-
- uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId);
-public:
- IPAddress getLocalIp();
- IPAddress getSubnetMask();
- IPAddress getGatewayIp();
- IPAddress getDhcpServerIp();
- IPAddress getDnsServerIp();
-
- int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000);
- int checkLease();
-};
-
-#endif
diff --git a/libraries/UIPEthernet/src/Dns.cpp b/libraries/UIPEthernet/src/Dns.cpp
deleted file mode 100644
index 2b97fb7..0000000
--- a/libraries/UIPEthernet/src/Dns.cpp
+++ /dev/null
@@ -1,422 +0,0 @@
-// Arduino DNS client for Enc28J60-based Ethernet shield
-// (c) Copyright 2009-2010 MCQN Ltd.
-// Released under Apache License, version 2.0
-
-#include "Udp.h"
-#include "utility/util.h"
-
-#include "Dns.h"
-#include
-//#include
-#include "Arduino.h"
-
-
-#define SOCKET_NONE 255
-// Various flags and header field values for a DNS message
-#define UDP_HEADER_SIZE 8
-#define DNS_HEADER_SIZE 12
-#define TTL_SIZE 4
-#define QUERY_FLAG (0)
-#define RESPONSE_FLAG (1<<15)
-#define QUERY_RESPONSE_MASK (1<<15)
-#define OPCODE_STANDARD_QUERY (0)
-#define OPCODE_INVERSE_QUERY (1<<11)
-#define OPCODE_STATUS_REQUEST (2<<11)
-#define OPCODE_MASK (15<<11)
-#define AUTHORITATIVE_FLAG (1<<10)
-#define TRUNCATION_FLAG (1<<9)
-#define RECURSION_DESIRED_FLAG (1<<8)
-#define RECURSION_AVAILABLE_FLAG (1<<7)
-#define RESP_NO_ERROR (0)
-#define RESP_FORMAT_ERROR (1)
-#define RESP_SERVER_FAILURE (2)
-#define RESP_NAME_ERROR (3)
-#define RESP_NOT_IMPLEMENTED (4)
-#define RESP_REFUSED (5)
-#define RESP_MASK (15)
-#define TYPE_A (0x0001)
-#define CLASS_IN (0x0001)
-#define LABEL_COMPRESSION_MASK (0xC0)
-// Port number that DNS servers listen on
-#define DNS_PORT 53
-
-// Possible return codes from ProcessResponse
-#define SUCCESS 1
-#define TIMED_OUT -1
-#define INVALID_SERVER -2
-#define TRUNCATED -3
-#define INVALID_RESPONSE -4
-
-void DNSClient::begin(const IPAddress& aDNSServer)
-{
- iDNSServer = aDNSServer;
- iRequestId = 0;
-}
-
-
-int DNSClient::inet_aton(const char* aIPAddrString, IPAddress& aResult)
-{
- // See if we've been given a valid IP address
- const char* p =aIPAddrString;
- while (*p &&
- ( (*p == '.') || (*p >= '0') || (*p <= '9') ))
- {
- p++;
- }
-
- if (*p == '\0')
- {
- // It's looking promising, we haven't found any invalid characters
- p = aIPAddrString;
- int segment =0;
- int segmentValue =0;
- while (*p && (segment < 4))
- {
- if (*p == '.')
- {
- // We've reached the end of a segment
- if (segmentValue > 255)
- {
- // You can't have IP address segments that don't fit in a byte
- return 0;
- }
- else
- {
- aResult[segment] = (byte)segmentValue;
- segment++;
- segmentValue = 0;
- }
- }
- else
- {
- // Next digit
- segmentValue = (segmentValue*10)+(*p - '0');
- }
- p++;
- }
- // We've reached the end of address, but there'll still be the last
- // segment to deal with
- if ((segmentValue > 255) || (segment > 3))
- {
- // You can't have IP address segments that don't fit in a byte,
- // or more than four segments
- return 0;
- }
- else
- {
- aResult[segment] = (byte)segmentValue;
- return 1;
- }
- }
- else
- {
- return 0;
- }
-}
-
-int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult)
-{
- int ret =0;
-
- // See if it's a numeric IP address
- if (inet_aton(aHostname, aResult))
- {
- // It is, our work here is done
- return 1;
- }
-
- // Check we've got a valid DNS server to use
- if (iDNSServer == INADDR_NONE)
- {
- return INVALID_SERVER;
- }
-
- // Find a socket to use
- if (iUdp.begin(1024+(millis() & 0xF)) == 1)
- {
- // Try up to three times
- int retries = 0;
-// while ((retries < 3) && (ret <= 0))
- {
- // Send DNS request
- ret = iUdp.beginPacket(iDNSServer, DNS_PORT);
- if (ret != 0)
- {
- // Now output the request data
- ret = BuildRequest(aHostname);
- if (ret != 0)
- {
- // And finally send the request
- ret = iUdp.endPacket();
- if (ret != 0)
- {
- // Now wait for a response
- int wait_retries = 0;
- ret = TIMED_OUT;
- while ((wait_retries < 3) && (ret == TIMED_OUT))
- {
- ret = ProcessResponse(5000, aResult);
- wait_retries++;
- }
- }
- }
- }
- retries++;
- }
-
- // We're done with the socket now
- iUdp.stop();
- }
-
- return ret;
-}
-
-uint16_t DNSClient::BuildRequest(const char* aName)
-{
- // Build header
- // 1 1 1 1 1 1
- // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // | ID |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // | QDCOUNT |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // | ANCOUNT |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // | NSCOUNT |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // | ARCOUNT |
- // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- // As we only support one request at a time at present, we can simplify
- // some of this header
- iRequestId = millis(); // generate a random ID
- uint16_t twoByteBuffer;
-
- // FIXME We should also check that there's enough space available to write to, rather
- // FIXME than assume there's enough space (as the code does at present)
- iUdp.write((uint8_t*)&iRequestId, sizeof(iRequestId));
-
- twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG);
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
-
- twoByteBuffer = htons(1); // One question record
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
-
- twoByteBuffer = 0; // Zero answer records
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
-
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
- // and zero additional records
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
-
- // Build question
- const char* start =aName;
- const char* end =start;
- uint8_t len;
- // Run through the name being requested
- while (*end)
- {
- // Find out how long this section of the name is
- end = start;
- while (*end && (*end != '.') )
- {
- end++;
- }
-
- if (end-start > 0)
- {
- // Write out the size of this section
- len = end-start;
- iUdp.write(&len, sizeof(len));
- // And then write out the section
- iUdp.write((uint8_t*)start, end-start);
- }
- start = end+1;
- }
-
- // We've got to the end of the question name, so
- // terminate it with a zero-length section
- len = 0;
- iUdp.write(&len, sizeof(len));
- // Finally the type and class of question
- twoByteBuffer = htons(TYPE_A);
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
-
- twoByteBuffer = htons(CLASS_IN); // Internet class of question
- iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer));
- // Success! Everything buffered okay
- return 1;
-}
-
-
-uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress)
-{
- uint32_t startTime = millis();
-
- // Wait for a response packet
- while(iUdp.parsePacket() <= 0)
- {
- if((millis() - startTime) > aTimeout)
- return TIMED_OUT;
- delay(50);
- }
-
- // We've had a reply!
- // Read the UDP header
- uint8_t header[DNS_HEADER_SIZE]; // Enough space to reuse for the DNS header
- // Check that it's a response from the right server and the right port
- if ( (iDNSServer != iUdp.remoteIP()) ||
- (iUdp.remotePort() != DNS_PORT) )
- {
- // It's not from who we expected
- return INVALID_SERVER;
- }
-
- // Read through the rest of the response
- if (iUdp.available() < DNS_HEADER_SIZE)
- {
- return TRUNCATED;
- }
- iUdp.read(header, DNS_HEADER_SIZE);
-
- uint16_t header_flags = htons(*((uint16_t*)&header[2]));
- // Check that it's a response to this request
- if ( ( iRequestId != (*((uint16_t*)&header[0])) ) ||
- ((header_flags & QUERY_RESPONSE_MASK) != (uint16_t)RESPONSE_FLAG) )
- {
- // Mark the entire packet as read
- iUdp.flush();
- return INVALID_RESPONSE;
- }
- // Check for any errors in the response (or in our request)
- // although we don't do anything to get round these
- if ( (header_flags & TRUNCATION_FLAG) || (header_flags & RESP_MASK) )
- {
- // Mark the entire packet as read
- iUdp.flush();
- return -5; //INVALID_RESPONSE;
- }
-
- // And make sure we've got (at least) one answer
- uint16_t answerCount = htons(*((uint16_t*)&header[6]));
- if (answerCount == 0 )
- {
- // Mark the entire packet as read
- iUdp.flush();
- return -6; //INVALID_RESPONSE;
- }
-
- // Skip over any questions
- for (uint16_t i =0; i < htons(*((uint16_t*)&header[4])); i++)
- {
- // Skip over the name
- uint8_t len;
- do
- {
- iUdp.read(&len, sizeof(len));
- if (len > 0)
- {
- // Don't need to actually read the data out for the string, just
- // advance ptr to beyond it
- while(len--)
- {
- iUdp.read(); // we don't care about the returned byte
- }
- }
- } while (len != 0);
-
- // Now jump over the type and class
- for (int i =0; i < 4; i++)
- {
- iUdp.read(); // we don't care about the returned byte
- }
- }
-
- // Now we're up to the bit we're interested in, the answer
- // There might be more than one answer (although we'll just use the first
- // type A answer) and some authority and additional resource records but
- // we're going to ignore all of them.
-
- for (uint16_t i =0; i < answerCount; i++)
- {
- // Skip the name
- uint8_t len;
- do
- {
- iUdp.read(&len, sizeof(len));
- if ((len & LABEL_COMPRESSION_MASK) == 0)
- {
- // It's just a normal label
- if (len > 0)
- {
- // And it's got a length
- // Don't need to actually read the data out for the string,
- // just advance ptr to beyond it
- while(len--)
- {
- iUdp.read(); // we don't care about the returned byte
- }
- }
- }
- else
- {
- // This is a pointer to a somewhere else in the message for the
- // rest of the name. We don't care about the name, and RFC1035
- // says that a name is either a sequence of labels ended with a
- // 0 length octet or a pointer or a sequence of labels ending in
- // a pointer. Either way, when we get here we're at the end of
- // the name
- // Skip over the pointer
- iUdp.read(); // we don't care about the returned byte
- // And set len so that we drop out of the name loop
- len = 0;
- }
- } while (len != 0);
-
- // Check the type and class
- uint16_t answerType;
- uint16_t answerClass;
- iUdp.read((uint8_t*)&answerType, sizeof(answerType));
- iUdp.read((uint8_t*)&answerClass, sizeof(answerClass));
-
- // Ignore the Time-To-Live as we don't do any caching
- for (int i =0; i < TTL_SIZE; i++)
- {
- iUdp.read(); // we don't care about the returned byte
- }
-
- // And read out the length of this answer
- // Don't need header_flags anymore, so we can reuse it here
- iUdp.read((uint8_t*)&header_flags, sizeof(header_flags));
-
- if ( (htons(answerType) == TYPE_A) && (htons(answerClass) == CLASS_IN) )
- {
- if (htons(header_flags) != 4)
- {
- // It's a weird size
- // Mark the entire packet as read
- iUdp.flush();
- return -9;//INVALID_RESPONSE;
- }
- iUdp.read(aAddress.raw_address(), 4);
- return SUCCESS;
- }
- else
- {
- // This isn't an answer type we're after, move onto the next one
- for (uint16_t i =0; i < htons(header_flags); i++)
- {
- iUdp.read(); // we don't care about the returned byte
- }
- }
- }
-
- // Mark the entire packet as read
- iUdp.flush();
-
- // If we get here then we haven't found an answer
- return -10;//INVALID_RESPONSE;
-}
-
diff --git a/libraries/UIPEthernet/src/Dns.h b/libraries/UIPEthernet/src/Dns.h
deleted file mode 100644
index 4913ca8..0000000
--- a/libraries/UIPEthernet/src/Dns.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Arduino DNS client for Enc28J60-based Ethernet shield
-// (c) Copyright 2009-2010 MCQN Ltd.
-// Released under Apache License, version 2.0
-
-#ifndef DNSClient_h
-#define DNSClient_h
-
-#include
-
-class DNSClient
-{
-public:
- // ctor
- void begin(const IPAddress& aDNSServer);
-
- /** Convert a numeric IP address string into a four-byte IP address.
- @param aIPAddrString IP address to convert
- @param aResult IPAddress structure to store the returned IP address
- @result 1 if aIPAddrString was successfully converted to an IP address,
- else error code
- */
- int inet_aton(const char *aIPAddrString, IPAddress& aResult);
-
- /** Resolve the given hostname to an IP address.
- @param aHostname Name to be resolved
- @param aResult IPAddress structure to store the returned IP address
- @result 1 if aIPAddrString was successfully converted to an IP address,
- else error code
- */
- int getHostByName(const char* aHostname, IPAddress& aResult);
-
-protected:
- uint16_t BuildRequest(const char* aName);
- uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress);
-
- IPAddress iDNSServer;
- uint16_t iRequestId;
- UIPUDP iUdp;
-};
-
-#endif
diff --git a/libraries/UIPEthernet/src/UIPClient.cpp b/libraries/UIPEthernet/src/UIPClient.cpp
deleted file mode 100644
index 73daaba..0000000
--- a/libraries/UIPEthernet/src/UIPClient.cpp
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- UIPClient.cpp - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-extern "C"
-{
-#import "utility/uip-conf.h"
-#import "utility/uip.h"
-#import "utility/uip_arp.h"
-#import "string.h"
-}
-#include "UIPEthernet.h"
-#include "UIPClient.h"
-#include "Dns.h"
-
-#ifdef UIPETHERNET_DEBUG_CLIENT
-#include "HardwareSerial.h"
-#endif
-
-#define UIP_TCP_PHYH_LEN UIP_LLH_LEN+UIP_IPTCPH_LEN
-
-uip_userdata_t UIPClient::all_data[UIP_CONNS];
-
-UIPClient::UIPClient() :
- data(NULL)
-{
-}
-
-UIPClient::UIPClient(uip_userdata_t* conn_data) :
- data(conn_data)
-{
-}
-
-int
-UIPClient::connect(IPAddress ip, uint16_t port)
-{
- uip_ipaddr_t ipaddr;
- uip_ip_addr(ipaddr, ip);
- struct uip_conn* conn = uip_connect(&ipaddr, htons(port));
- if (conn)
- {
- while((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
- {
- UIPEthernet.tick();
- if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED)
- {
- data = (uip_userdata_t*) conn->appstate;
-#ifdef UIPETHERNET_DEBUG_CLIENT
-
- Serial.print(F("connected, state: "));
- Serial.print(data->state);
- Serial.print(F(", first packet in: "));
- Serial.println(data->packets_in[0]);
-#endif
- return 1;
- }
- }
- }
- return 0;
-}
-
-int
-UIPClient::connect(const char *host, uint16_t port)
-{
- // Look up the host first
- int ret = 0;
-#if UIP_UDP
- DNSClient dns;
- IPAddress remote_addr;
-
- dns.begin(UIPEthernet.dnsServerIP());
- ret = dns.getHostByName(host, remote_addr);
- if (ret == 1) {
- return connect(remote_addr, port);
- }
-#endif
- return ret;
-}
-
-void
-UIPClient::stop()
-{
- if (data)
- {
- _flushBlocks(&data->packets_in[0]);
- if (data->state & UIP_CLIENT_CLOSED)
- {
- data->state = 0;
- }
- else
- {
- data->state |= UIP_CLIENT_CLOSE;
- }
- }
- data = NULL;
- UIPEthernet.tick();
-}
-
-uint8_t
-UIPClient::connected()
-{
- return (data && (data->packets_in[0] != NOBLOCK || (data->state & UIP_CLIENT_CONNECTED))) ? 1 : 0;
-}
-
-bool
-UIPClient::operator==(const UIPClient& rhs)
-{
- return data && rhs.data && (data == rhs.data);
-}
-
-UIPClient::operator bool()
-{
- UIPEthernet.tick();
- return data && (!(data->state & UIP_CLIENT_CLOSED) || data->packets_in[0] != NOBLOCK);
-}
-
-size_t
-UIPClient::write(uint8_t c)
-{
- return _write(data, &c, 1);
-}
-
-size_t
-UIPClient::write(const uint8_t *buf, size_t size)
-{
- return _write(data, buf, size);
-}
-
-size_t
-UIPClient::_write(uip_userdata_t* u, const uint8_t *buf, size_t size)
-{
- int remain = size;
- uint16_t written;
-#if UIP_ATTEMPTS_ON_WRITE > 0
- uint16_t attempts = UIP_ATTEMPTS_ON_WRITE;
-#endif
- repeat:
- UIPEthernet.tick();
- if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
- {
- memhandle* p = _currentBlock(&u->packets_out[0]);
- if (*p == NOBLOCK)
- {
-newpacket:
- *p = UIPEthernet.network.allocBlock(UIP_SOCKET_DATALEN);
- if (*p == NOBLOCK)
- {
-#if UIP_ATTEMPTS_ON_WRITE > 0
- if ((--attempts)>0)
-#endif
-#if UIP_ATTEMPTS_ON_WRITE != 0
- goto repeat;
-#endif
- goto ready;
- }
- u->out_pos = 0;
- }
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient.write: writePacket("));
- Serial.print(*p);
- Serial.print(F(") pos: "));
- Serial.print(u->out_pos);
- Serial.print(F(", buf["));
- Serial.print(size-remain);
- Serial.print(F("-"));
- Serial.print(remain);
- Serial.print(F("]: '"));
- Serial.write((uint8_t*)buf+size-remain,remain);
- Serial.println(F("'"));
-#endif
- written = UIPEthernet.network.writePacket(*p,u->out_pos,(uint8_t*)buf+size-remain,remain);
- remain -= written;
- u->out_pos+=written;
- if (remain > 0)
- {
- if (p==&u->packets_out[UIP_SOCKET_NUMPACKETS-1])
- {
-#if UIP_ATTEMPTS_ON_WRITE > 0
- if ((--attempts)>0)
-#endif
-#if UIP_ATTEMPTS_ON_WRITE != 0
- goto repeat;
-#endif
- goto ready;
- }
- p++;
- goto newpacket;
- }
-ready:
- return size-remain;
- }
- return -1;
-}
-
-int
-UIPClient::available()
-{
- if (*this)
- return _available(data);
- return 0;
-}
-
-int
-UIPClient::_available(uip_userdata_t *u)
-{
- memhandle* p = &u->packets_in[0];
- if (*p == NOBLOCK)
- return 0;
- int len = 0;
- for(memhandle* end = p+UIP_SOCKET_NUMPACKETS; p < end; p++)
- {
- if(*p == NOBLOCK)
- break;
- len += UIPEthernet.network.blockSize(*p);
- }
- return len;
-}
-
-int
-UIPClient::read(uint8_t *buf, size_t size)
-{
- if (*this)
- {
- int remain = size;
- memhandle* p = &data->packets_in[0];
- if (*p == NOBLOCK)
- return 0;
- int read;
- do
- {
- read = UIPEthernet.network.readPacket(*p,0,buf+size-remain,remain);
- if (read == UIPEthernet.network.blockSize(*p))
- {
- remain -= read;
- _eatBlock(p);
- if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
- data->state |= UIP_CLIENT_RESTART;
- if (*p == NOBLOCK)
- {
- if (data->state & UIP_CLIENT_CLOSED)
- {
- data->state = 0;
- data = NULL;
- }
- return size-remain;
- }
- }
- else
- {
- UIPEthernet.network.resizeBlock(*p,read);
- break;
- }
- }
- while(remain > 0);
- return size;
- }
- return -1;
-}
-
-int
-UIPClient::read()
-{
- uint8_t c;
- if (read(&c,1) < 0)
- return -1;
- return c;
-}
-
-int
-UIPClient::peek()
-{
- if (*this)
- {
- memhandle p = data->packets_in[0];
- if (p != NOBLOCK)
- {
- uint8_t c;
- UIPEthernet.network.readPacket(p,0,&c,1);
- return c;
- }
- }
- return -1;
-}
-
-void
-UIPClient::flush()
-{
- if (*this)
- {
- _flushBlocks(&data->packets_in[0]);
- }
-}
-
-void
-uipclient_appcall(void)
-{
- UIPClient::uip_callback();
-}
-
-void
-UIPClient::uip_callback()
-{
- uip_userdata_t *u = (uip_userdata_t*)uip_conn->appstate;
- if (!u && uip_connected())
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.println(F("UIPClient uip_connected"));
-#endif
- u = (uip_userdata_t*) _allocateData();
- if (u)
- {
- uip_conn->appstate = u;
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient allocated state: "));
- Serial.println(u->state);
-#endif
- }
-#ifdef UIPETHERNET_DEBUG_CLIENT
- else
- Serial.println(F("UIPClient allocation failed"));
-#endif
- }
- if (u)
- {
- if (uip_newdata())
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient uip_newdata, uip_len:"));
- Serial.println(uip_len);
-#endif
- if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED)))
- {
- memhandle newPacket = UIPEthernet.network.allocBlock(uip_len);
- if (newPacket != NOBLOCK)
- {
- memhandle* p = _currentBlock(&u->packets_in[0]);
- //if it's not the first packet
- if (*p != NOBLOCK)
- {
- uint8_t slot = p - &u->packets_in[0];
- if (slot < UIP_SOCKET_NUMPACKETS-1)
- p++;
- //if this is the last slot stop this connection
- if (slot >= UIP_SOCKET_NUMPACKETS-2)
- {
- uip_stop();
- //if there's no free slot left omit loosing this packet and (again) stop this connection
- if (slot == UIP_SOCKET_NUMPACKETS-1)
- goto reject_newdata;
- }
- }
- UIPEthernet.network.copyPacket(newPacket,0,UIPEthernet.in_packet,((uint8_t*)uip_appdata)-uip_buf,uip_len);
- *p = newPacket;
- goto finish_newdata;
- }
-reject_newdata:
- UIPEthernet.packetstate &= ~UIPETHERNET_FREEPACKET;
- uip_stop();
- }
- }
-finish_newdata:
- if (u->state & UIP_CLIENT_RESTART)
- {
- u->state &= ~UIP_CLIENT_RESTART;
- uip_restart();
- }
- // If the connection has been closed, save received but unread data.
- if (uip_closed() || uip_timedout())
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.println(F("UIPClient uip_closed"));
-#endif
- // drop outgoing packets not sent yet:
- _flushBlocks(&u->packets_out[0]);
- if (u->packets_in[0] != NOBLOCK)
- {
- ((uip_userdata_closed_t *)u)->lport = uip_conn->lport;
- u->state |= UIP_CLIENT_CLOSED;
- }
- else
- u->state = 0;
- // disassociate appdata.
- uip_conn->appstate = NULL;
- goto nodata;
- }
- if (uip_acked())
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.println(F("UIPClient uip_acked"));
-#endif
- _eatBlock(&u->packets_out[0]);
- }
- if (uip_poll() || uip_rexmit())
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- //Serial.println(F("UIPClient uip_poll"));
-#endif
- memhandle p = u->packets_out[0];
- if (p != NOBLOCK)
- {
- if (u->packets_out[1] == NOBLOCK)
- {
- uip_len = u->out_pos;
- if (uip_len > 0)
- {
- UIPEthernet.network.resizeBlock(p,0,uip_len);
- }
- }
- else
- uip_len = UIPEthernet.network.blockSize(p);
- if (uip_len > 0)
- {
- UIPEthernet.uip_hdrlen = ((uint8_t*)uip_appdata)-uip_buf;
- UIPEthernet.uip_packet = UIPEthernet.network.allocBlock(UIPEthernet.uip_hdrlen+uip_len);
- if (UIPEthernet.uip_packet != NOBLOCK)
- {
- UIPEthernet.network.copyPacket(UIPEthernet.uip_packet,UIPEthernet.uip_hdrlen,p,0,uip_len);
- UIPEthernet.packetstate |= UIPETHERNET_SENDPACKET;
- uip_send(uip_appdata,uip_len);
- }
- return;
- }
- }
- }
- // don't close connection unless all outgoing packets are sent
- if (u->state & UIP_CLIENT_CLOSE)
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient state UIP_CLIENT_CLOSE"));
-#endif
- if (u->packets_out[0] == NOBLOCK)
- {
-#ifdef UIPETHERNET_DEBUG_CLIENT
- Serial.print(F("UIPClient state UIP_CLIENT_CLOSE -> free userdata"));
-#endif
- u->state = 0;
- uip_conn->appstate = NULL;
- uip_close();
- }
- else
- uip_stop();
- }
- }
-nodata:
- UIPEthernet.uip_packet = NOBLOCK;
- uip_len=0;
-}
-
-uip_userdata_t *
-UIPClient::_allocateData()
-{
- for ( uint8_t sock = 0; sock < UIP_CONNS; sock++ )
- {
- uip_userdata_t* data = &UIPClient::all_data[sock];
- if (!data->state)
- {
- data->state = sock | UIP_CLIENT_CONNECTED;
- memset(&data->packets_in[0],0,sizeof(uip_userdata_t)-sizeof(data->state));
- return data;
- }
- }
- return NULL;
-}
-
-memhandle*
-UIPClient::_currentBlock(memhandle* block)
-{
- for(memhandle* end = block+UIP_SOCKET_NUMPACKETS-1; block < end; block++)
- if(*(block+1) == NOBLOCK)
- break;
- return block;
-}
-
-void
-UIPClient::_eatBlock(memhandle* block)
-{
-#ifdef UIPETHERNET_DEBUG_CLIENT
- memhandle* start = block;
- Serial.print(F("eatblock("));
- Serial.print(*block);
- Serial.print("): ");
- for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
- {
- Serial.print(start[i]);
- Serial.print(" ");
- }
- Serial.print("-> ");
-#endif
- memhandle* end = block+(UIP_SOCKET_NUMPACKETS-1);
- UIPEthernet.network.freeBlock(*block);
- while(block < end)
- *block = *((block++)+1);
- *end = NOBLOCK;
-#ifdef UIPETHERNET_DEBUG_CLIENT
- for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
- {
- Serial.print(start[i]);
- Serial.print(F(" "));
- }
- Serial.println();
-#endif
-}
-
-void
-UIPClient::_flushBlocks(memhandle* block)
-{
- for(memhandle* end = block+UIP_SOCKET_NUMPACKETS; block < end; block++)
- {
- if(*block != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(*block);
- *block = NOBLOCK;
- }
- else
- break;
- }
-}
-
diff --git a/libraries/UIPEthernet/src/UIPClient.h b/libraries/UIPEthernet/src/UIPClient.h
deleted file mode 100644
index 0d8beab..0000000
--- a/libraries/UIPEthernet/src/UIPClient.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- UIPClient.h - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#ifndef UIPCLIENT_H
-#define UIPCLIENT_H
-
-#include "ethernet_comp.h"
-#import "Client.h"
-#import "utility/mempool.h"
-
-extern "C" {
- #import "utility/uip.h"
-}
-
-#define UIP_SOCKET_DATALEN UIP_TCP_MSS
-//#define UIP_SOCKET_NUMPACKETS UIP_RECEIVE_WINDOW/UIP_TCP_MSS+1
-#ifndef UIP_SOCKET_NUMPACKETS
-#define UIP_SOCKET_NUMPACKETS 5
-#endif
-
-#define UIP_CLIENT_CONNECTED 0x10
-#define UIP_CLIENT_CLOSE 0x20
-#define UIP_CLIENT_CLOSED 0x40
-#define UIP_CLIENT_RESTART 0x80
-#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_CLOSED | UIP_CLIENT_RESTART)
-#define UIP_CLIENT_SOCKETS ~UIP_CLIENT_STATEFLAGS
-
-typedef uint8_t uip_socket_ptr;
-
-typedef struct {
- uint8_t state;
- memhandle packets_in[UIP_SOCKET_NUMPACKETS];
- uint16_t lport; /**< The local TCP port, in network byte order. */
-} uip_userdata_closed_t;
-
-typedef struct {
- uint8_t state;
- memhandle packets_in[UIP_SOCKET_NUMPACKETS];
- memhandle packets_out[UIP_SOCKET_NUMPACKETS];
- memaddress out_pos;
-} uip_userdata_t;
-
-class UIPClient : public Client {
-
-public:
- UIPClient();
- int connect(IPAddress ip, uint16_t port);
- int connect(const char *host, uint16_t port);
- int read(uint8_t *buf, size_t size);
- void stop();
- uint8_t connected();
- operator bool();
- virtual bool operator==(const EthernetClient&);
- virtual bool operator!=(const EthernetClient& rhs) { return !this->operator==(rhs); };
-
- size_t write(uint8_t);
- size_t write(const uint8_t *buf, size_t size);
- int available();
- int read();
- int peek();
- void flush();
-
-private:
- UIPClient(struct uip_conn *_conn);
- UIPClient(uip_userdata_t* conn_data);
-
- uip_userdata_t* data;
-
- static uip_userdata_t all_data[UIP_CONNS];
- static uip_userdata_t* _allocateData();
- static uip_userdata_t* _getData(struct uip_conn * conn);
-
- static size_t _write(uip_userdata_t *,const uint8_t *buf, size_t size);
- static int _available(uip_userdata_t *);
-
- static memhandle * _currentBlock(memhandle* blocks);
- static void _eatBlock(memhandle* blocks);
- static void _flushBlocks(memhandle* blocks);
-
- friend class UIPEthernetClass;
- friend class UIPServer;
-
- friend void uipclient_appcall(void);
-
- static void uip_callback();
-};
-
-#endif
diff --git a/libraries/UIPEthernet/src/UIPEthernet.cpp b/libraries/UIPEthernet/src/UIPEthernet.cpp
deleted file mode 100644
index ca59e93..0000000
--- a/libraries/UIPEthernet/src/UIPEthernet.cpp
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- UIPEthernet.cpp - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#include
-#include "UIPEthernet.h"
-#include "utility/Enc28J60Network.h"
-
-#if(defined UIPETHERNET_DEBUG || defined UIPETHERNET_DEBUG_CHKSUM)
-#include "HardwareSerial.h"
-#endif
-
-extern "C"
-{
-#include "utility/uip-conf.h"
-#include "utility/uip.h"
-#include "utility/uip_arp.h"
-#include "utility/uip_timer.h"
-}
-
-#define ETH_HDR ((struct uip_eth_hdr *)&uip_buf[0])
-
-// Because uIP isn't encapsulated within a class we have to use global
-// variables, so we can only have one TCP/IP stack per program.
-
-UIPEthernetClass::UIPEthernetClass() :
- in_packet(NOBLOCK),
- uip_packet(NOBLOCK),
- uip_hdrlen(0),
- packetstate(0),
- _dhcp(NULL)
-{
-}
-
-int
-UIPEthernetClass::begin(const uint8_t* mac)
-{
- static DhcpClass s_dhcp;
- _dhcp = &s_dhcp;
-
- // Initialise the basic info
- init(mac);
-
- // Now try to get our config info from a DHCP server
- int ret = _dhcp->beginWithDHCP((uint8_t*)mac);
- if(ret == 1)
- {
- // We've successfully found a DHCP server and got our configuration info, so set things
- // accordingly
- configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask());
- }
- return ret;
-}
-
-void
-UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip)
-{
- IPAddress dns = ip;
- dns[3] = 1;
- begin(mac, ip, dns);
-}
-
-void
-UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns)
-{
- IPAddress gateway = ip;
- gateway[3] = 1;
- begin(mac, ip, dns, gateway);
-}
-
-void
-UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway)
-{
- IPAddress subnet(255, 255, 255, 0);
- begin(mac, ip, dns, gateway, subnet);
-}
-
-void
-UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
-{
- init(mac);
- configure(ip,dns,gateway,subnet);
-}
-
-int UIPEthernetClass::maintain(){
- tick();
- int rc = DHCP_CHECK_NONE;
- if(_dhcp != NULL){
- //we have a pointer to dhcp, use it
- rc = _dhcp->checkLease();
- switch ( rc ){
- case DHCP_CHECK_NONE:
- //nothing done
- break;
- case DHCP_CHECK_RENEW_OK:
- case DHCP_CHECK_REBIND_OK:
- //we might have got a new IP.
- configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask());
- break;
- default:
- //this is actually a error, it will retry though
- break;
- }
- }
- return rc;
-}
-
-IPAddress UIPEthernetClass::localIP()
-{
- IPAddress ret;
- uip_ipaddr_t a;
- uip_gethostaddr(a);
- return ip_addr_uip(a);
-}
-
-IPAddress UIPEthernetClass::subnetMask()
-{
- IPAddress ret;
- uip_ipaddr_t a;
- uip_getnetmask(a);
- return ip_addr_uip(a);
-}
-
-IPAddress UIPEthernetClass::gatewayIP()
-{
- IPAddress ret;
- uip_ipaddr_t a;
- uip_getdraddr(a);
- return ip_addr_uip(a);
-}
-
-IPAddress UIPEthernetClass::dnsServerIP()
-{
- return _dnsServerAddress;
-}
-
-void
-UIPEthernetClass::tick()
-{
- if (in_packet == NOBLOCK)
- {
- in_packet = network.receivePacket();
-#ifdef UIPETHERNET_DEBUG
- if (in_packet != NOBLOCK)
- {
- Serial.print(F("--------------\nreceivePacket: "));
- Serial.println(in_packet);
- }
-#endif
- }
- if (in_packet != NOBLOCK)
- {
- packetstate = UIPETHERNET_FREEPACKET;
- uip_len = network.blockSize(in_packet);
- if (uip_len > 0)
- {
- network.readPacket(in_packet,0,(uint8_t*)uip_buf,UIP_BUFSIZE);
- if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_IP))
- {
- uip_packet = in_packet;
-#ifdef UIPETHERNET_DEBUG
- Serial.print(F("readPacket type IP, uip_len: "));
- Serial.println(uip_len);
-#endif
- uip_arp_ipin();
- uip_input();
- if (uip_len > 0)
- {
- uip_arp_out();
- network_send();
- }
- }
- else if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_ARP))
- {
-#ifdef UIPETHERNET_DEBUG
- Serial.print(F("readPacket type ARP, uip_len: "));
- Serial.println(uip_len);
-#endif
- uip_arp_arpin();
- if (uip_len > 0)
- {
- network_send();
- }
- }
- }
- if (in_packet != NOBLOCK && (packetstate & UIPETHERNET_FREEPACKET))
- {
-#ifdef UIPETHERNET_DEBUG
- Serial.print(F("freeing packet: "));
- Serial.println(in_packet);
-#endif
- network.freePacket();
- in_packet = NOBLOCK;
- }
- }
-
- if (uip_timer_expired(&periodic_timer))
- {
- uip_timer_restart(&periodic_timer);
- for (int i = 0; i < UIP_CONNS; i++)
- {
- uip_periodic(i);
- // If the above function invocation resulted in data that
- // should be sent out on the network, the global variable
- // uip_len is set to a value > 0.
- if (uip_len > 0)
- {
- uip_arp_out();
- network_send();
- }
- }
-
-#if UIP_UDP
- for (int i = 0; i < UIP_UDP_CONNS; i++)
- {
- uip_udp_periodic(i);
- // If the above function invocation resulted in data that
- // should be sent out on the network, the global variable
- // uip_len is set to a value > 0. */
- if (uip_len > 0)
- {
- network_send();
- }
- }
-#endif /* UIP_UDP */
- }
-}
-
-boolean UIPEthernetClass::network_send()
-{
- if (packetstate & UIPETHERNET_SENDPACKET)
- {
-#ifdef UIPETHERNET_DEBUG
- Serial.print(F("network_send uip_packet: "));
- Serial.print(uip_packet);
- Serial.print(F(", hdrlen: "));
- Serial.println(uip_hdrlen);
-#endif
- network.writePacket(uip_packet,0,uip_buf,uip_hdrlen);
- goto sendandfree;
- }
- uip_packet = network.allocBlock(uip_len);
- if (uip_packet != NOBLOCK)
- {
-#ifdef UIPETHERNET_DEBUG
- Serial.print(F("network_send uip_buf (uip_len): "));
- Serial.print(uip_len);
- Serial.print(F(", packet: "));
- Serial.println(uip_packet);
-#endif
- network.writePacket(uip_packet,0,uip_buf,uip_len);
- goto sendandfree;
- }
- return false;
-sendandfree:
- network.sendPacket(uip_packet);
- network.freeBlock(uip_packet);
- uip_packet = NOBLOCK;
- return true;
-}
-
-void UIPEthernetClass::init(const uint8_t* mac) {
- uip_timer_set(&this->periodic_timer, CLOCK_SECOND / 4);
-
- network.init((uint8_t*)mac);
- uip_seteth_addr(mac);
-
- uip_init();
-}
-
-void UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) {
- uip_ipaddr_t ipaddr;
-
- uip_ip_addr(ipaddr, ip);
- uip_sethostaddr(ipaddr);
-
- uip_ip_addr(ipaddr, gateway);
- uip_setdraddr(ipaddr);
-
- uip_ip_addr(ipaddr, subnet);
- uip_setnetmask(ipaddr);
-
- _dnsServerAddress = dns;
-}
-
-UIPEthernetClass UIPEthernet;
-
-/*---------------------------------------------------------------------------*/
-uint16_t
-UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len)
-{
- uint16_t t;
- const uint8_t *dataptr;
- const uint8_t *last_byte;
-
- dataptr = data;
- last_byte = data + len - 1;
-
- while(dataptr < last_byte) { /* At least two more bytes */
- t = (dataptr[0] << 8) + dataptr[1];
- sum += t;
- if(sum < t) {
- sum++; /* carry */
- }
- dataptr += 2;
- }
-
- if(dataptr == last_byte) {
- t = (dataptr[0] << 8) + 0;
- sum += t;
- if(sum < t) {
- sum++; /* carry */
- }
- }
-
- /* Return sum in host byte order. */
- return sum;
-}
-
-/*---------------------------------------------------------------------------*/
-
-uint16_t
-UIPEthernetClass::ipchksum(void)
-{
- uint16_t sum;
-
- sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
- return (sum == 0) ? 0xffff : htons(sum);
-}
-
-/*---------------------------------------------------------------------------*/
-uint16_t
-UIPEthernetClass::upper_layer_chksum(uint8_t proto)
-{
- uint16_t upper_layer_len;
- uint16_t sum;
-
-#if UIP_CONF_IPV6
- upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
-#else /* UIP_CONF_IPV6 */
- upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
-#endif /* UIP_CONF_IPV6 */
-
- /* First sum pseudoheader. */
-
- /* IP protocol and length fields. This addition cannot carry. */
- sum = upper_layer_len + proto;
- /* Sum IP source and destination addresses. */
- sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
-
- uint8_t upper_layer_memlen;
- switch(proto)
- {
- case UIP_PROTO_ICMP:
- case UIP_PROTO_ICMP6:
- upper_layer_memlen = upper_layer_len;
- break;
- case UIP_PROTO_TCP:
- upper_layer_memlen = (BUF->tcpoffset >> 4) << 2;
- break;
-#if UIP_UDP
- case UIP_PROTO_UDP:
- upper_layer_memlen = UIP_UDPH_LEN;
- break;
-#endif
- }
- sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen);
-#ifdef UIPETHERNET_DEBUG_CHKSUM
- Serial.print(F("chksum uip_buf["));
- Serial.print(UIP_IPH_LEN + UIP_LLH_LEN);
- Serial.print(F("-"));
- Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
- Serial.print(F("]: "));
- Serial.println(htons(sum),HEX);
-#endif
- if (upper_layer_memlen < upper_layer_len)
- {
- sum = network.chksum(
- sum,
- uip_packet,
- UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen,
- upper_layer_len - upper_layer_memlen
- );
-#ifdef UIPETHERNET_DEBUG_CHKSUM
- Serial.print(F("chksum uip_packet("));
- Serial.print(uip_packet);
- Serial.print(F(")["));
- Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
- Serial.print(F("-"));
- Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_len);
- Serial.print(F"]: "));
- Serial.println(htons(sum),HEX);
-#endif
- }
- return (sum == 0) ? 0xffff : htons(sum);
-}
-
-uint16_t
-uip_ipchksum(void)
-{
- return UIPEthernet.ipchksum();
-}
-
-uint16_t
-uip_tcpchksum(void)
-{
- uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_TCP);
- return sum;
-}
-
-#if UIP_UDP
-uint16_t
-uip_udpchksum(void)
-{
- uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_UDP);
- return sum;
-}
-#endif
diff --git a/libraries/UIPEthernet/src/UIPEthernet.h b/libraries/UIPEthernet/src/UIPEthernet.h
deleted file mode 100644
index 94502f1..0000000
--- a/libraries/UIPEthernet/src/UIPEthernet.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- UIPEthernet.h - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#ifndef UIPETHERNET_H
-#define UIPETHERNET_H
-
-#include "ethernet_comp.h"
-#include
-#include "Dhcp.h"
-#include "IPAddress.h"
-#include "utility/Enc28J60Network.h"
-#include "UIPClient.h"
-#include "UIPServer.h"
-#include "UIPUdp.h"
-
-extern "C"
-{
-#include "utility/uip_timer.h"
-#include "utility/uip.h"
-}
-
-//#define UIPETHERNET_DEBUG
-//#define UIPETHERNET_DEBUG_CHKSUM
-//#define UIPETHERNET_DEBUG_UDP
-//#define UIPETHERNET_DEBUG_CLIENT
-
-#define UIPETHERNET_FREEPACKET 1
-#define UIPETHERNET_SENDPACKET 2
-#define UIPETHERNET_BUFFERREAD 4
-
-#define uip_ip_addr(addr, ip) do { \
- ((u16_t *)(addr))[0] = HTONS(((ip[0]) << 8) | (ip[1])); \
- ((u16_t *)(addr))[1] = HTONS(((ip[2]) << 8) | (ip[3])); \
- } while(0)
-
-#define ip_addr_uip(a) IPAddress(a[0] & 0xFF, a[0] >> 8 , a[1] & 0xFF, a[1] >> 8) //TODO this is not IPV6 capable
-
-#define uip_seteth_addr(eaddr) do {uip_ethaddr.addr[0] = eaddr[0]; \
- uip_ethaddr.addr[1] = eaddr[1];\
- uip_ethaddr.addr[2] = eaddr[2];\
- uip_ethaddr.addr[3] = eaddr[3];\
- uip_ethaddr.addr[4] = eaddr[4];\
- uip_ethaddr.addr[5] = eaddr[5];} while(0)
-
-#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
-
-class UIPEthernetClass
-{
-public:
- UIPEthernetClass();
-
- int begin(const uint8_t* mac);
- void begin(const uint8_t* mac, IPAddress ip);
- void begin(const uint8_t* mac, IPAddress ip, IPAddress dns);
- void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway);
- void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
-
- // maintain() must be called at regular intervals to process the incoming serial
- // data and issue IP events to the sketch. It does not return until all IP
- // events have been processed. Renews dhcp-lease if required.
- int maintain();
-
- IPAddress localIP();
- IPAddress subnetMask();
- IPAddress gatewayIP();
- IPAddress dnsServerIP();
-
-private:
- IPAddress _dnsServerAddress;
- DhcpClass* _dhcp;
-
- struct uip_timer periodic_timer;
-
- memhandle in_packet;
- memhandle uip_packet;
- uint8_t uip_hdrlen;
- uint8_t packetstate;
-
- Enc28J60Network network;
-
- void init(const uint8_t* mac);
- void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
-
- void tick();
-
- boolean network_send();
-
- friend class UIPServer;
-
- friend class UIPClient;
-
- friend class UIPUDP;
-
- static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len);
- static uint16_t ipchksum(void);
- uint16_t upper_layer_chksum(uint8_t proto);
-
- friend uint16_t uip_ipchksum(void);
- friend uint16_t uip_tcpchksum(void);
- friend uint16_t uip_udpchksum(void);
-
-#if UIP_CONF_IPV6
- uint16_t uip_icmp6chksum(void);
-#endif /* UIP_CONF_IPV6 */
-};
-
-extern UIPEthernetClass UIPEthernet;
-
-#endif
diff --git a/libraries/UIPEthernet/src/UIPServer.cpp b/libraries/UIPEthernet/src/UIPServer.cpp
deleted file mode 100644
index 12ff72f..0000000
--- a/libraries/UIPEthernet/src/UIPServer.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- UIPServer.cpp - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-#include "UIPEthernet.h"
-#include "UIPServer.h"
-extern "C" {
- #include "utility/uip-conf.h"
-}
-
-UIPServer::UIPServer(uint16_t port) : _port(htons(port))
-{
-}
-
-UIPClient UIPServer::available()
-{
- UIPEthernet.tick();
- for ( uip_userdata_t* data = &UIPClient::all_data[0]; data < &UIPClient::all_data[UIP_CONNS]; data++ )
- {
- if (data->packets_in[0] != NOBLOCK
- && (((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport ==_port)
- || ((data->state & UIP_CLIENT_CLOSED) && ((uip_userdata_closed_t *)data)->lport == _port)))
- return UIPClient(data);
- }
- return UIPClient();
-}
-
-void UIPServer::begin()
-{
- uip_listen(_port);
- UIPEthernet.tick();
-}
-
-size_t UIPServer::write(uint8_t c)
-{
- return write(&c,1);
-}
-
-size_t UIPServer::write(const uint8_t *buf, size_t size)
-{
- size_t ret = 0;
- for ( uip_userdata_t* data = &UIPClient::all_data[0]; data < &UIPClient::all_data[UIP_CONNS]; data++ )
- {
- if ((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport ==_port)
- ret += UIPClient::_write(data,buf,size);
- }
- return ret;
-}
-
diff --git a/libraries/UIPEthernet/src/UIPServer.h b/libraries/UIPEthernet/src/UIPServer.h
deleted file mode 100644
index 64bdade..0000000
--- a/libraries/UIPEthernet/src/UIPServer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- UIPServer.h - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-#ifndef UIPSERVER_H
-#define UIPSERVER_H
-
-#include "ethernet_comp.h"
-#import "Server.h"
-#import "UIPClient.h"
-
-class UIPServer : Server {
-
-public:
- UIPServer(uint16_t);
- UIPClient available();
- void begin();
- size_t write(uint8_t);
- size_t write(const uint8_t *buf, size_t size);
- using Print::write;
-
-private:
- uint16_t _port;
-};
-
-#endif
diff --git a/libraries/UIPEthernet/src/UIPUdp.cpp b/libraries/UIPEthernet/src/UIPUdp.cpp
deleted file mode 100644
index d1cb7b1..0000000
--- a/libraries/UIPEthernet/src/UIPUdp.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- UIPUdp.cpp - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#include "UIPEthernet.h"
-#include "UIPUdp.h"
-#include "Dns.h"
-
-#ifdef UIPETHERNET_DEBUG_UDP
-#include "HardwareSerial.h"
-#endif
-
-extern "C" {
-#include "utility/uip-conf.h"
-#include "utility/uip.h"
-#include "utility/uip_arp.h"
-}
-
-#if UIP_UDP
-#define UIP_ARPHDRSIZE 42
-#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
-
-// Constructor
-UIPUDP::UIPUDP() :
- _uip_udp_conn(NULL)
-{
- memset(&appdata,0,sizeof(appdata));
-}
-
-// initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
-uint8_t
-UIPUDP::begin(uint16_t port)
-{
- if (!_uip_udp_conn)
- {
- _uip_udp_conn = uip_udp_new(NULL, 0);
- }
- if (_uip_udp_conn)
- {
- uip_udp_bind(_uip_udp_conn,htons(port));
- _uip_udp_conn->appstate = &appdata;
- return 1;
- }
- return 0;
-}
-
-// Finish with the UDP socket
-void
-UIPUDP::stop()
-{
- if (_uip_udp_conn)
- {
- flush();
- uip_udp_remove(_uip_udp_conn);
- _uip_udp_conn->appstate = NULL;
- _uip_udp_conn=NULL;
- if (appdata.packet_in != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_in);
- appdata.packet_in = NOBLOCK;
- }
- uint8_t i = 0;
- memhandle* packet = &appdata.packets_in[0];
- while (*packet != NOBLOCK && i < UIP_UDP_NUMPACKETS)
- {
- UIPEthernet.network.freeBlock(*packet);
- *packet++ = NOBLOCK;
- i++;
- }
- if (appdata.packet_out != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_out);
- appdata.packet_out = NOBLOCK;
- }
- }
-}
-
-// Sending UDP packets
-
-// Start building up a packet to send to the remote host specific in ip and port
-// Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
-int
-UIPUDP::beginPacket(IPAddress ip, uint16_t port)
-{
- UIPEthernet.tick();
- if (ip && port)
- {
- uip_ipaddr_t ripaddr;
- uip_ip_addr(&ripaddr, ip);
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp beginPacket, "));
-#endif
- if (_uip_udp_conn)
- {
- _uip_udp_conn->rport = htons(port);
- uip_ipaddr_copy(_uip_udp_conn->ripaddr, &ripaddr);
- }
- else
- {
- _uip_udp_conn = uip_udp_new(&ripaddr,htons(port));
- if (_uip_udp_conn)
- {
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("new connection, "));
-#endif
- _uip_udp_conn->appstate = &appdata;
- }
- else
- {
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.println(F("failed to allocate new connection"));
-#endif
- return 0;
- }
- }
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("rip: "));
- Serial.print(ip);
- Serial.print(F(", port: "));
- Serial.println(port);
-#endif
- }
- if (_uip_udp_conn)
- {
- if (appdata.packet_out == NOBLOCK)
- {
- appdata.packet_out = UIPEthernet.network.allocBlock(UIP_UDP_MAXPACKETSIZE);
- appdata.out_pos = UIP_UDP_PHYH_LEN;
- if (appdata.packet_out != NOBLOCK)
- return 1;
-#ifdef UIPETHERNET_DEBUG_UDP
- else
- Serial.println(F("failed to allocate memory for packet"));
-#endif
- }
-#ifdef UIPETHERNET_DEBUG_UDP
- else
- Serial.println(F("previous packet on that connection not sent yet"));
-#endif
- }
- return 0;
-}
-
-// Start building up a packet to send to the remote host specific in host and port
-// Returns 1 if successful, 0 if there was a problem resolving the hostname or port
-int
-UIPUDP::beginPacket(const char *host, uint16_t port)
-{
- // Look up the host first
- int ret = 0;
- DNSClient dns;
- IPAddress remote_addr;
-
- dns.begin(UIPEthernet.dnsServerIP());
- ret = dns.getHostByName(host, remote_addr);
- if (ret == 1) {
- return beginPacket(remote_addr, port);
- } else {
- return ret;
- }
-}
-
-// Finish off this packet and send it
-// Returns 1 if the packet was sent successfully, 0 if there was an error
-int
-UIPUDP::endPacket()
-{
- if (_uip_udp_conn && appdata.packet_out != NOBLOCK)
- {
- appdata.send = true;
- UIPEthernet.network.resizeBlock(appdata.packet_out,0,appdata.out_pos);
- uip_udp_periodic_conn(_uip_udp_conn);
- if (uip_len > 0)
- {
- UIPEthernet.network_send();
- return 1;
- }
- }
- return 0;
-}
-
-// Write a single byte into the packet
-size_t
-UIPUDP::write(uint8_t c)
-{
- return write(&c,1);
-}
-
-// Write size bytes from buffer into the packet
-size_t
-UIPUDP::write(const uint8_t *buffer, size_t size)
-{
- if (appdata.packet_out != NOBLOCK)
- {
- size_t ret = UIPEthernet.network.writePacket(appdata.packet_out,appdata.out_pos,(uint8_t*)buffer,size);
- appdata.out_pos += ret;
- return ret;
- }
- return 0;
-}
-
-// Start processing the next available incoming packet
-// Returns the size of the packet in bytes, or 0 if no packets are available
-int
-UIPUDP::parsePacket()
-{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp parsePacket freeing previous packet: "));
- Serial.println(appdata.packet_in);
-#endif;
- UIPEthernet.network.freeBlock(appdata.packet_in);
- }
- memhandle *packet = &appdata.packets_in[0];
- appdata.packet_in = *packet;
- if (appdata.packet_in != NOBLOCK)
- {
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp parsePacket received packet: "));
- Serial.print(appdata.packet_in);
-#endif
- if (UIP_UDP_NUMPACKETS > 1)
- {
- uint8_t i = 1;
- memhandle* p = packet+1;
-freeloop:
- *packet = *p;
- if (*packet == NOBLOCK)
- goto freeready;
- packet++;
- if (i < UIP_UDP_NUMPACKETS-1)
- {
- i++;
- p++;
- goto freeloop;
- }
- }
- *packet = NOBLOCK;
-freeready:
- int size = UIPEthernet.network.blockSize(appdata.packet_in);
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F(", size: "));
- Serial.println(size);
-#endif
- return size;
- }
- return 0;
-}
-
-// Number of bytes remaining in the current packet
-int
-UIPUDP::available()
-{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- return UIPEthernet.network.blockSize(appdata.packet_in);
- }
- return 0;
-}
-
-// Read a single byte from the current packet
-int
-UIPUDP::read()
-{
- unsigned char c;
- if (read(&c,1) > 0)
- {
- return c;
- }
- return -1;
-}
-
-// Read up to len bytes from the current packet and place them into buffer
-// Returns the number of bytes read, or 0 if none are available
-int
-UIPUDP::read(unsigned char* buffer, size_t len)
-{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- int read = UIPEthernet.network.readPacket(appdata.packet_in,0,buffer,len);
- UIPEthernet.network.resizeBlock(appdata.packet_in,read);
- return read;
- }
- return 0;
-}
-
-// Return the next byte from the current packet without moving on to the next byte
-int
-UIPUDP::peek()
-{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- unsigned char c;
- if (UIPEthernet.network.readPacket(appdata.packet_in,0,&c,1) == 1)
- return c;
- }
- return -1;
-}
-
-// Finish reading the current packet
-void
-UIPUDP::flush()
-{
- UIPEthernet.tick();
- if (appdata.packet_in != NOBLOCK)
- {
- UIPEthernet.network.freeBlock(appdata.packet_in);
- appdata.packet_in = NOBLOCK;
- }
-}
-
-// Return the IP address of the host who sent the current incoming packet
-IPAddress
-UIPUDP::remoteIP()
-{
- return _uip_udp_conn ? ip_addr_uip(_uip_udp_conn->ripaddr) : IPAddress();
-}
-
-// Return the port of the host who sent the current incoming packet
-uint16_t
-UIPUDP::remotePort()
-{
- return _uip_udp_conn ? ntohs(_uip_udp_conn->rport) : 0;
-}
-
-// uIP callback function
-
-void
-uipudp_appcall(void) {
- UIPUDP::uip_callback();
-}
-
-void
-UIPUDP::uip_callback() {
- if (appdata_t *data = (appdata_t *)(uip_udp_conn->appstate))
- {
- if (uip_newdata())
- {
- uip_udp_conn->rport = UDPBUF->srcport;
- uip_ipaddr_copy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr);
- memhandle *packet = &data->packets_in[0];
- uint8_t i = 0;
- do
- {
- if (*packet == NOBLOCK)
- {
- *packet = UIPEthernet.network.allocBlock(ntohs(UDPBUF->udplen)-UIP_UDPH_LEN);
- //if we are unable to allocate memory the packet is dropped. udp doesn't guarantee packet delivery
- if (*packet != NOBLOCK)
- {
- //discard Linklevel and IP and udp-header and any trailing bytes:
- UIPEthernet.network.copyPacket(*packet,0,UIPEthernet.in_packet,UIP_UDP_PHYH_LEN,UIPEthernet.network.blockSize(*packet));
- #ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp, uip_newdata received packet: "));
- Serial.print(*packet);
- Serial.print(F(", slot: "));
- Serial.print(i);
- Serial.print(F(", size: "));
- Serial.println(UIPEthernet.network.blockSize(*packet));
- #endif
- break;
- }
- }
- packet++;
- i++;
- }
- while (i < UIP_UDP_NUMPACKETS);
- }
- if (uip_poll() && data->send)
- {
- //set uip_slen (uip private) by calling uip_udp_send
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp, uip_poll preparing packet to send: "));
- Serial.print(data->packet_out);
- Serial.print(F(", size: "));
- Serial.println(UIPEthernet.network.blockSize(data->packet_out));
-#endif
- UIPEthernet.uip_packet = data->packet_out;
- data->packet_out = NOBLOCK;
- UIPEthernet.uip_hdrlen = UIP_UDP_PHYH_LEN;
- UIPEthernet.packetstate |= UIPETHERNET_SENDPACKET;
- uip_udp_send(data->out_pos - (UIP_UDP_PHYH_LEN));
- uip_process(UIP_UDP_SEND_CONN); //generate udp + ip headers
- uip_arp_out(); //add arp
- if (uip_len == UIP_ARPHDRSIZE)
- {
- UIPEthernet.packetstate &= ~UIPETHERNET_SENDPACKET;
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.println(F("udp, uip_poll results in ARP-packet"));
-#endif
- }
- else
- //arp found ethaddr for ip (otherwise packet is replaced by arp-request)
- {
- data->send = false;
-#ifdef UIPETHERNET_DEBUG_UDP
- Serial.print(F("udp, uip_packet to send: "));
- Serial.println(UIPEthernet.uip_packet);
-#endif
- }
- }
- }
-}
-#endif
diff --git a/libraries/UIPEthernet/src/UIPUdp.h b/libraries/UIPEthernet/src/UIPUdp.h
deleted file mode 100644
index c965ffa..0000000
--- a/libraries/UIPEthernet/src/UIPUdp.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- UIPUdp.h - Arduino implementation of a uIP wrapper class.
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#ifndef UIPUDP_H
-#define UIPUDP_H
-
-#include "ethernet_comp.h"
-#include "Arduino.h"
-#include
-#include "utility/mempool.h"
-extern "C" {
- #include "utility/uip.h";
-}
-
-#define UIP_UDP_MAXDATALEN 1500
-#define UIP_UDP_PHYH_LEN UIP_LLH_LEN+UIP_IPUDPH_LEN
-#define UIP_UDP_MAXPACKETSIZE UIP_UDP_MAXDATALEN+UIP_UDP_PHYH_LEN
-#ifndef UIP_UDP_NUMPACKETS
-#define UIP_UDP_NUMPACKETS 5
-#endif
-
-class UIPUDP : public UDP
-{
-
-private:
- struct uip_udp_conn *_uip_udp_conn;
-
- struct appdata_t
- {
- memaddress out_pos;
- memhandle packets_in[UIP_UDP_NUMPACKETS];
- memhandle packet_in;
- memhandle packet_out;
- boolean send;
- } appdata;
-
-public:
- UIPUDP(); // Constructor
- uint8_t
- begin(uint16_t);// initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
- void
- stop(); // Finish with the UDP socket
-
- // Sending UDP packets
-
- // Start building up a packet to send to the remote host specific in ip and port
- // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
- int
- beginPacket(IPAddress ip, uint16_t port);
- // Start building up a packet to send to the remote host specific in host and port
- // Returns 1 if successful, 0 if there was a problem resolving the hostname or port
- int
- beginPacket(const char *host, uint16_t port);
- // Finish off this packet and send it
- // Returns 1 if the packet was sent successfully, 0 if there was an error
- int
- endPacket();
- // Write a single byte into the packet
- size_t
- write(uint8_t);
- // Write size bytes from buffer into the packet
- size_t
- write(const uint8_t *buffer, size_t size);
-
- using Print::write;
-
- // Start processing the next available incoming packet
- // Returns the size of the packet in bytes, or 0 if no packets are available
- int
- parsePacket();
- // Number of bytes remaining in the current packet
- int
- available();
- // Read a single byte from the current packet
- int
- read();
- // Read up to len bytes from the current packet and place them into buffer
- // Returns the number of bytes read, or 0 if none are available
- int
- read(unsigned char* buffer, size_t len);
- // Read up to len characters from the current packet and place them into buffer
- // Returns the number of characters read, or 0 if none are available
- int
- read(char* buffer, size_t len)
- {
- return read((unsigned char*) buffer, len);
- }
- ;
- // Return the next byte from the current packet without moving on to the next byte
- int
- peek();
- void
- flush(); // Finish reading the current packet
-
- // Return the IP address of the host who sent the current incoming packet
- IPAddress
- remoteIP();
-
- // Return the port of the host who sent the current incoming packet
- uint16_t
- remotePort();
-
-private:
-
- friend void uipudp_appcall(void);
-
- static void uip_callback();
-};
-
-#endif
diff --git a/libraries/UIPEthernet/src/ethernet_comp.h b/libraries/UIPEthernet/src/ethernet_comp.h
deleted file mode 100644
index 4cec2ab..0000000
--- a/libraries/UIPEthernet/src/ethernet_comp.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef ETHERNET_COMP_H
-#define ETHERNET_COMP_H
-
-#define Ethernet UIPEthernet
-#define EthernetClient UIPClient
-#define EthernetServer UIPServer
-#define EthernetUDP UIPUDP
-
-#endif
diff --git a/libraries/UIPEthernet/src/utility/Enc28J60Network.h b/libraries/UIPEthernet/src/utility/Enc28J60Network.h
deleted file mode 100644
index 461ec59..0000000
--- a/libraries/UIPEthernet/src/utility/Enc28J60Network.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- Enc28J60Network.h
- UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface.
-
- Copyright (c) 2013 Norbert Truchsess
- All rights reserved.
-
- inspired by enc28j60.c file from the AVRlib library by Pascal Stang.
- For AVRlib See http://www.procyonengineering.com/
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-
-#ifndef ENC28J60NETWORK_H_
-#define ENC28J60NETWORK_H_
-
-#include "mempool.h"
-
-#define ENC28J60_CONTROL_CS SS // this is pin 10 on Uno and pin 53 on Mega256
-
-#if defined(ARDUINO_ARCH_AVR)
-// AVR-specific code
-#define SPI_MOSI MOSI
-#define SPI_MISO MISO
-#define SPI_SCK SCK
-#define SPI_SS SS
-#define ENC28J60_USE_SPILIB 0
-#elif defined(ARDUINO_ARCH_SAM)
-#define ENC28J60_USE_SPILIB 1
-#endif
-
-#define UIP_RECEIVEBUFFERHANDLE 0xff
-
-//#define ENC28J60DEBUG
-
-/*
- * Empfangen von ip-header, arp etc...
- * wenn tcp/udp -> tcp/udp-callback -> assign new packet to connection
- */
-
-class Enc28J60Network : public MemoryPool
-{
-
-private:
- uint16_t nextPacketPtr;
- uint8_t bank;
-
- struct memblock receivePkt;
-
- uint8_t readOp(uint8_t op, uint8_t address);
- void writeOp(uint8_t op, uint8_t address, uint8_t data);
- uint16_t setReadPtr(memhandle handle, memaddress position, uint16_t len);
- void setERXRDPT();
- void readBuffer(uint16_t len, uint8_t* data);
- void writeBuffer(uint16_t len, uint8_t* data);
- uint8_t readByte(uint16_t addr);
- void writeByte(uint16_t addr, uint8_t data);
- void setBank(uint8_t address);
- uint8_t readReg(uint8_t address);
- void writeReg(uint8_t address, uint8_t data);
- void writeRegPair(uint8_t address, uint16_t data);
- void phyWrite(uint8_t address, uint16_t data);
- void clkout(uint8_t clk);
- uint8_t getrev(void);
-
-protected:
- void memblock_mv_cb(memaddress dest, memaddress src, memaddress size);
-
-public:
- Enc28J60Network();
- void init(uint8_t* macaddr);
- memhandle receivePacket();
- void freePacket();
- memaddress blockSize(memhandle handle);
- void sendPacket(memhandle handle);
- uint16_t readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len);
- uint16_t writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len);
- void copyPacket(memhandle dest, memaddress dest_pos, memhandle src, memaddress src_pos, uint16_t len);
- uint16_t chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len);
-};
-
-#endif /* ENC28J60NETWORK_H_ */
diff --git a/libraries/UIPEthernet/src/utility/mempool_conf.h b/libraries/UIPEthernet/src/utility/mempool_conf.h
deleted file mode 100644
index bd5a726..0000000
--- a/libraries/UIPEthernet/src/utility/mempool_conf.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef MEMPOOLCONF_H
-#define MEMPOOLCONF_H
-#include "uipethernet-conf.h"
-extern "C" {
- #include "uipopt.h"
-}
-#include
-
-typedef uint16_t memaddress;
-typedef uint8_t memhandle;
-
-#if UIP_SOCKET_NUMPACKETS and UIP_CONNS
-#define NUM_TCP_MEMBLOCKS (UIP_SOCKET_NUMPACKETS*2)*UIP_CONNS
-#else
-#define NUM_TCP_MEMBLOCKS 0
-#endif
-
-#if UIP_UDP and UIP_UDP_NUMPACKETS and UIP_UDP_CONNS
-#define NUM_UDP_MEMBLOCKS (UIP_UDP_NUMPACKETS+1)*UIP_UDP_CONNS
-#else
-#define NUM_UDP_MEMBLOCKS 0
-#endif
-
-#define NUM_MEMBLOCKS (NUM_TCP_MEMBLOCKS+NUM_UDP_MEMBLOCKS)
-
-#define MEMBLOCK_MV
-
-#endif
diff --git a/libraries/UIPEthernet/src/utility/uip-neighbor.c b/libraries/UIPEthernet/src/utility/uip-neighbor.c
deleted file mode 100644
index 739c03e..0000000
--- a/libraries/UIPEthernet/src/utility/uip-neighbor.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2006, Swedish Institute of Computer Science.
- * 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.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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.
- *
- * This file is part of the uIP TCP/IP stack
- *
- * $Id: uip-neighbor.c,v 1.2 2006/06/12 08:00:30 adam Exp $
- */
-
-/**
- * \file
- * Database of link-local neighbors, used by IPv6 code and
- * to be used by a future ARP code rewrite.
- * \author
- * Adam Dunkels
- */
-
-#include "uip-neighbor.h"
-
-#include
-
-#define MAX_TIME 128
-
-#ifdef UIP_NEIGHBOR_CONF_ENTRIES
-#define ENTRIES UIP_NEIGHBOR_CONF_ENTRIES
-#else /* UIP_NEIGHBOR_CONF_ENTRIES */
-#define ENTRIES 8
-#endif /* UIP_NEIGHBOR_CONF_ENTRIES */
-
-struct neighbor_entry {
- uip_ipaddr_t ipaddr;
- struct uip_neighbor_addr addr;
- u8_t time;
-};
-static struct neighbor_entry entries[ENTRIES];
-
-/*---------------------------------------------------------------------------*/
-void
-uip_neighbor_init(void)
-{
- int i;
-
- for(i = 0; i < ENTRIES; ++i) {
- entries[i].time = MAX_TIME;
- }
-}
-/*---------------------------------------------------------------------------*/
-void
-uip_neighbor_periodic(void)
-{
- int i;
-
- for(i = 0; i < ENTRIES; ++i) {
- if(entries[i].time < MAX_TIME) {
- entries[i].time++;
- }
- }
-}
-/*---------------------------------------------------------------------------*/
-void
-uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr)
-{
- int i, oldest;
- u8_t oldest_time;
-
- printf("Adding neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
- addr->addr.addr[0], addr->addr.addr[1], addr->addr.addr[2], addr->addr.addr[3],
- addr->addr.addr[4], addr->addr.addr[5]);
-
- /* Find the first unused entry or the oldest used entry. */
- oldest_time = 0;
- oldest = 0;
- for(i = 0; i < ENTRIES; ++i) {
- if(entries[i].time == MAX_TIME) {
- oldest = i;
- break;
- }
- if(uip_ipaddr_cmp(entries[i].ipaddr, addr)) {
- oldest = i;
- break;
- }
- if(entries[i].time > oldest_time) {
- oldest = i;
- oldest_time = entries[i].time;
- }
- }
-
- /* Use the oldest or first free entry (either pointed to by the
- "oldest" variable). */
- entries[oldest].time = 0;
- uip_ipaddr_copy(entries[oldest].ipaddr, ipaddr);
- memcpy(&entries[oldest].addr, addr, sizeof(struct uip_neighbor_addr));
-}
-/*---------------------------------------------------------------------------*/
-static struct neighbor_entry *
-find_entry(uip_ipaddr_t ipaddr)
-{
- int i;
-
- for(i = 0; i < ENTRIES; ++i) {
- if(uip_ipaddr_cmp(entries[i].ipaddr, ipaddr)) {
- return &entries[i];
- }
- }
- return NULL;
-}
-/*---------------------------------------------------------------------------*/
-void
-uip_neighbor_update(uip_ipaddr_t ipaddr)
-{
- struct neighbor_entry *e;
-
- e = find_entry(ipaddr);
- if(e != NULL) {
- e->time = 0;
- }
-}
-/*---------------------------------------------------------------------------*/
-struct uip_neighbor_addr *
-uip_neighbor_lookup(uip_ipaddr_t ipaddr)
-{
- struct neighbor_entry *e;
-
- e = find_entry(ipaddr);
- if(e != NULL) {
- /* printf("Lookup neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
- e->addr.addr.addr[0], e->addr.addr.addr[1], e->addr.addr.addr[2], e->addr.addr.addr[3],
- e->addr.addr.addr[4], e->addr.addr.addr[5]);*/
-
- return &e->addr;
- }
- return NULL;
-}
-/*---------------------------------------------------------------------------*/
diff --git a/libraries/UIPEthernet/src/utility/uip-neighbor.h b/libraries/UIPEthernet/src/utility/uip-neighbor.h
deleted file mode 100644
index d3b351c..0000000
--- a/libraries/UIPEthernet/src/utility/uip-neighbor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2006, Swedish Institute of Computer Science.
- * 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.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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.
- *
- * This file is part of the uIP TCP/IP stack
- *
- * $Id: uip-neighbor.h,v 1.2 2006/06/12 08:00:30 adam Exp $
- */
-
-/**
- * \file
- * Header file for database of link-local neighbors, used by
- * IPv6 code and to be used by future ARP code.
- * \author
- * Adam Dunkels
- */
-
-#ifndef __UIP_NEIGHBOR_H__
-#define __UIP_NEIGHBOR_H__
-
-#include "uip.h"
-
-struct uip_neighbor_addr {
-#if UIP_NEIGHBOR_CONF_ADDRTYPE
- UIP_NEIGHBOR_CONF_ADDRTYPE addr;
-#else
- struct uip_eth_addr addr;
-#endif
-};
-
-void uip_neighbor_init(void);
-void uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr);
-void uip_neighbor_update(uip_ipaddr_t ipaddr);
-struct uip_neighbor_addr *uip_neighbor_lookup(uip_ipaddr_t ipaddr);
-void uip_neighbor_periodic(void);
-
-#endif /* __UIP-NEIGHBOR_H__ */
diff --git a/libraries/UIPEthernet/src/utility/uipethernet-conf.h b/libraries/UIPEthernet/src/utility/uipethernet-conf.h
deleted file mode 100644
index 733e26e..0000000
--- a/libraries/UIPEthernet/src/utility/uipethernet-conf.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef UIPETHERNET_CONF_H
-#define UIPETHERNET_CONF_H
-
-/* for TCP */
-#define UIP_SOCKET_NUMPACKETS 5
-#define UIP_CONF_MAX_CONNECTIONS 4
-
-/* for UDP */
-#define UIP_CONF_UDP 0//1
-#define UIP_CONF_BROADCAST 0//1
-#define UIP_CONF_UDP_CONNS 0//4
-#define UIP_UDP_NUMPACKETS 0//5
-
-/* number of attempts on write before returning number of bytes sent so far
- * set to -1 to block until connection is closed by timeout */
-#define UIP_ATTEMPTS_ON_WRITE -1
-
-#endif
diff --git a/libraries/UIPEthernet/src/utility/Enc28J60Network.cpp b/libraries/UIPEthernet/utility/Enc28J60Network.cpp
similarity index 80%
rename from libraries/UIPEthernet/src/utility/Enc28J60Network.cpp
rename to libraries/UIPEthernet/utility/Enc28J60Network.cpp
index 2670a6f..fbef88d 100644
--- a/libraries/UIPEthernet/src/utility/Enc28J60Network.cpp
+++ b/libraries/UIPEthernet/utility/Enc28J60Network.cpp
@@ -1,5 +1,5 @@
/*
- Enc28J60Network.h
+ Enc28J60NetworkClass.h
UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface.
Copyright (c) 2013 Norbert Truchsess
@@ -25,19 +25,8 @@
#include "Enc28J60Network.h"
#include "Arduino.h"
-#if ENC28J60_USE_SPILIB
-#include
-#endif
-
extern "C" {
- #if defined(ARDUINO_ARCH_AVR)
- // AVR-specific code
- #include
- #elif defined(ARDUINO_ARCH_SAM)
- // SAM-specific code
- #else
- // generic, non-platform specific code
- #endif
+#include
#include "enc28j60.h"
#include "uip.h"
}
@@ -51,57 +40,40 @@ extern "C" {
// set CS to 1 = passive
#define CSPASSIVE digitalWrite(ENC28J60_CONTROL_CS, HIGH)
//
-#if defined(ARDUINO_ARCH_AVR)
#define waitspi() while(!(SPSR&(1<begin+dest_pos,src->begin+src_pos,len);
+ enc28J60_mempool_block_move_callback(dest->begin+dest_pos,src->begin+src_pos,len);
// Move the RX read pointer to the start of the next received packet
// This frees the memory we just read out
setERXRDPT();
}
void
-Enc28J60Network::memblock_mv_cb(uint16_t dest, uint16_t src, uint16_t len)
+enc28J60_mempool_block_move_callback(memaddress dest, memaddress src, memaddress len)
{
+//void
+//Enc28J60Network::memblock_mv_cb(uint16_t dest, uint16_t src, uint16_t len)
+//{
//as ENC28J60 DMA is unable to copy single bytes:
if (len == 1)
{
- writeByte(dest,readByte(src));
+ Enc28J60Network::writeByte(dest,Enc28J60Network::readByte(src));
}
else
{
@@ -390,11 +349,11 @@ Enc28J60Network::memblock_mv_cb(uint16_t dest, uint16_t src, uint16_t len)
prevent a never ending DMA operation which
would overwrite the entire 8-Kbyte buffer.
*/
- writeRegPair(EDMASTL, src);
- writeRegPair(EDMADSTL, dest);
+ Enc28J60Network::writeRegPair(EDMASTL, src);
+ Enc28J60Network::writeRegPair(EDMADSTL, dest);
if ((src <= RXSTOP_INIT)&& (len > RXSTOP_INIT))len -= (RXSTOP_INIT-RXSTART_INIT);
- writeRegPair(EDMANDL, len);
+ Enc28J60Network::writeRegPair(EDMANDL, len);
/*
2. If an interrupt at the end of the copy process is
@@ -402,13 +361,13 @@ Enc28J60Network::memblock_mv_cb(uint16_t dest, uint16_t src, uint16_t len)
clear EIR.DMAIF.
3. Verify that ECON1.CSUMEN is clear. */
- writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_CSUMEN);
+ Enc28J60Network::writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_CSUMEN);
/* 4. Start the DMA copy by setting ECON1.DMAST. */
- writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_DMAST);
+ Enc28J60Network::writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_DMAST);
// wait until runnig DMA is completed
- while (readOp(ENC28J60_READ_CTRL_REG, ECON1) & ECON1_DMAST);
+ while (Enc28J60Network::readOp(ENC28J60_READ_CTRL_REG, ECON1) & ECON1_DMAST);
}
}
@@ -423,20 +382,6 @@ Enc28J60Network::readOp(uint8_t op, uint8_t address)
{
CSACTIVE;
// issue read command
-#if ENC28J60_USE_SPILIB
- SPI.transfer(op | (address & ADDR_MASK));
- // read data
- if(address & 0x80)
- {
- // do dummy read if needed (for mac and mii, see datasheet page 29)
- SPI.transfer(0x00);
- }
- uint8_t c = SPI.transfer(0x00);
- // release CS
- CSPASSIVE;
- return(c);
-#else
- // issue read command
SPDR = op | (address & ADDR_MASK);
waitspi();
// read data
@@ -451,7 +396,6 @@ Enc28J60Network::readOp(uint8_t op, uint8_t address)
// release CS
CSPASSIVE;
return(SPDR);
-#endif
}
void
@@ -459,18 +403,11 @@ Enc28J60Network::writeOp(uint8_t op, uint8_t address, uint8_t data)
{
CSACTIVE;
// issue write command
-#if ENC28J60_USE_SPILIB
- SPI.transfer(op | (address & ADDR_MASK));
- // write data
- SPI.transfer(data);
-#else
- // issue write command
SPDR = op | (address & ADDR_MASK);
waitspi();
// write data
SPDR = data;
waitspi();
-#endif
CSPASSIVE;
}
@@ -479,23 +416,15 @@ Enc28J60Network::readBuffer(uint16_t len, uint8_t* data)
{
CSACTIVE;
// issue read command
-#if ENC28J60_USE_SPILIB
- SPI.transfer(ENC28J60_READ_BUF_MEM);
-#else
SPDR = ENC28J60_READ_BUF_MEM;
waitspi();
-#endif
while(len)
{
len--;
// read data
-#if ENC28J60_USE_SPILIB
- *data = SPI.transfer(0x00);
-#else
SPDR = 0x00;
waitspi();
*data = SPDR;
-#endif
data++;
}
//*data='\0';
@@ -507,24 +436,15 @@ Enc28J60Network::writeBuffer(uint16_t len, uint8_t* data)
{
CSACTIVE;
// issue write command
-#if ENC28J60_USE_SPILIB
- SPI.transfer(ENC28J60_WRITE_BUF_MEM);
-#else
SPDR = ENC28J60_WRITE_BUF_MEM;
waitspi();
-#endif
while(len)
{
len--;
// write data
-#if ENC28J60_USE_SPILIB
- SPI.transfer(*data);
- data++;
-#else
SPDR = *data;
data++;
waitspi();
-#endif
}
CSPASSIVE;
}
@@ -583,6 +503,19 @@ Enc28J60Network::phyWrite(uint8_t address, uint16_t data)
}
}
+uint16_t
+Enc28J60Network::phyRead(uint8_t address)
+{
+ writeReg(MIREGADR,address);
+ writeReg(MICMD, MICMD_MIIRD);
+ // wait until the PHY read completes
+ while(readReg(MISTAT) & MISTAT_BUSY){
+ delayMicroseconds(15);
+ } //and MIRDH
+ writeReg(MICMD, 0);
+ return (readReg(MIRDL) | readReg(MIRDH) << 8);
+}
+
void
Enc28J60Network::clkout(uint8_t clk)
{
@@ -604,40 +537,27 @@ Enc28J60Network::chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t
len = setReadPtr(handle, pos, len)-1;
CSACTIVE;
// issue read command
-#if ENC28J60_USE_SPILIB
- SPI.transfer(ENC28J60_READ_BUF_MEM);
-#else
SPDR = ENC28J60_READ_BUF_MEM;
waitspi();
-#endif
uint16_t i;
for (i = 0; i < len; i+=2)
{
// read data
-#if ENC28J60_USE_SPILIB
- t = SPI.transfer(0x00) << 8;
- t += SPI.transfer(0x00);
-#else
SPDR = 0x00;
waitspi();
t = SPDR << 8;
SPDR = 0x00;
waitspi();
t += SPDR;
-#endif
sum += t;
if(sum < t) {
sum++; /* carry */
}
}
if(i == len) {
-#if ENC28J60_USE_SPILIB
- t = (SPI.transfer(0x00) << 8) + 0;
-#else
SPDR = 0x00;
waitspi();
t = (SPDR << 8) + 0;
-#endif
sum += t;
if(sum < t) {
sum++; /* carry */
@@ -648,3 +568,30 @@ Enc28J60Network::chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t
/* Return sum in host byte order. */
return sum;
}
+
+void
+Enc28J60Network::powerOff()
+{
+ writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_RXEN);
+ delay(50);
+ writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_VRPS);
+ delay(50);
+ writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PWRSV);
+}
+
+void
+Enc28J60Network::powerOn()
+{
+ writeOp(ENC28J60_BIT_FIELD_CLR, ECON2, ECON2_PWRSV);
+ delay(50);
+ writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
+ delay(50);
+}
+
+bool
+Enc28J60Network::linkStatus()
+{
+ return (phyRead(PHSTAT2) & 0x0400) > 0;
+}
+
+Enc28J60Network Enc28J60;
diff --git a/libraries/UIPEthernet/utility/Enc28J60Network.h b/libraries/UIPEthernet/utility/Enc28J60Network.h
new file mode 100644
index 0000000..7346e47
--- /dev/null
+++ b/libraries/UIPEthernet/utility/Enc28J60Network.h
@@ -0,0 +1,91 @@
+/*
+ Enc28J60NetworkClass.h
+ UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface.
+
+ Copyright (c) 2013 Norbert Truchsess
+ All rights reserved.
+
+ inspired by enc28j60.c file from the AVRlib library by Pascal Stang.
+ For AVRlib See http://www.procyonengineering.com/
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ */
+
+#ifndef Enc28J60Network_H_
+#define Enc28J60Network_H_
+
+#include "mempool.h"
+
+#define ENC28J60_CONTROL_CS SS
+#define SPI_MOSI MOSI
+#define SPI_MISO MISO
+#define SPI_SCK SCK
+#define SPI_SS SS
+
+#define UIP_RECEIVEBUFFERHANDLE 0xff
+
+//#define ENC28J60DEBUG
+
+/*
+ * Empfangen von ip-header, arp etc...
+ * wenn tcp/udp -> tcp/udp-callback -> assign new packet to connection
+ */
+
+class Enc28J60Network : public MemoryPool
+{
+
+private:
+ static uint16_t nextPacketPtr;
+ static uint8_t bank;
+
+ static struct memblock receivePkt;
+
+ static uint8_t readOp(uint8_t op, uint8_t address);
+ static void writeOp(uint8_t op, uint8_t address, uint8_t data);
+ static uint16_t setReadPtr(memhandle handle, memaddress position, uint16_t len);
+ static void setERXRDPT();
+ static void readBuffer(uint16_t len, uint8_t* data);
+ static void writeBuffer(uint16_t len, uint8_t* data);
+ static uint8_t readByte(uint16_t addr);
+ static void writeByte(uint16_t addr, uint8_t data);
+ static void setBank(uint8_t address);
+ static uint8_t readReg(uint8_t address);
+ static void writeReg(uint8_t address, uint8_t data);
+ static void writeRegPair(uint8_t address, uint16_t data);
+ static void phyWrite(uint8_t address, uint16_t data);
+ static uint16_t phyRead(uint8_t address);
+ static void clkout(uint8_t clk);
+
+ friend void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress);
+
+public:
+
+ uint8_t getrev(void);
+ void powerOn();
+ void powerOff();
+ bool linkStatus();
+
+ static void init(uint8_t* macaddr);
+ static memhandle receivePacket();
+ static void freePacket();
+ static memaddress blockSize(memhandle handle);
+ static void sendPacket(memhandle handle);
+ static uint16_t readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len);
+ static uint16_t writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len);
+ static void copyPacket(memhandle dest, memaddress dest_pos, memhandle src, memaddress src_pos, uint16_t len);
+ static uint16_t chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len);
+};
+
+extern Enc28J60Network Enc28J60;
+#endif /* Enc28J60NetworkClass_H_ */
diff --git a/libraries/UIPEthernet/src/utility/clock-arch.c b/libraries/UIPEthernet/utility/clock-arch.c
similarity index 100%
rename from libraries/UIPEthernet/src/utility/clock-arch.c
rename to libraries/UIPEthernet/utility/clock-arch.c
diff --git a/libraries/UIPEthernet/src/utility/clock-arch.h b/libraries/UIPEthernet/utility/clock-arch.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/clock-arch.h
rename to libraries/UIPEthernet/utility/clock-arch.h
diff --git a/libraries/UIPEthernet/src/utility/enc28j60.h b/libraries/UIPEthernet/utility/enc28j60.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/enc28j60.h
rename to libraries/UIPEthernet/utility/enc28j60.h
diff --git a/libraries/UIPEthernet/src/utility/mempool.cpp b/libraries/UIPEthernet/utility/mempool.cpp
similarity index 86%
rename from libraries/UIPEthernet/src/utility/mempool.cpp
rename to libraries/UIPEthernet/utility/mempool.cpp
index 01f17fb..c2f7abf 100644
--- a/libraries/UIPEthernet/src/utility/mempool.cpp
+++ b/libraries/UIPEthernet/utility/mempool.cpp
@@ -22,13 +22,15 @@
#define POOLOFFSET 1
-MemoryPool::MemoryPool(memaddress start, memaddress size)
+struct memblock MemoryPool::blocks[MEMPOOL_NUM_MEMBLOCKS+1];
+
+void
+MemoryPool::init()
{
memset(&blocks[0], 0, sizeof(blocks));
- blocks[POOLSTART].begin = start;
+ blocks[POOLSTART].begin = MEMPOOL_STARTADDRESS;
blocks[POOLSTART].size = 0;
blocks[POOLSTART].nextblock = NOBLOCK;
- poolsize = size;
}
memhandle
@@ -37,12 +39,12 @@ MemoryPool::allocBlock(memaddress size)
memblock* best = NULL;
memhandle cur = POOLSTART;
memblock* block = &blocks[POOLSTART];
- memaddress bestsize = poolsize + 1;
+ memaddress bestsize = MEMPOOL_SIZE + 1;
do
{
memhandle next = block->nextblock;
- memaddress freesize = ( next == NOBLOCK ? blocks[POOLSTART].begin + poolsize : blocks[next].begin) - block->begin - block->size;
+ memaddress freesize = ( next == NOBLOCK ? blocks[POOLSTART].begin + MEMPOOL_SIZE : blocks[next].begin) - block->begin - block->size;
if (freesize == size)
{
best = &blocks[cur];
@@ -77,14 +79,14 @@ MemoryPool::allocBlock(memaddress size)
memaddress* src = &nextblock->begin;
if (dest != *src)
{
-#ifdef MEMBLOCK_MV
- memblock_mv_cb(dest,*src,nextblock->size);
+#ifdef MEMPOOL_MEMBLOCK_MV
+ MEMPOOL_MEMBLOCK_MV(dest,*src,nextblock->size);
#endif
*src = dest;
}
block = nextblock;
}
- if (blocks[POOLSTART].begin + poolsize - block->begin - block->size >= size)
+ if (blocks[POOLSTART].begin + MEMPOOL_SIZE - block->begin - block->size >= size)
best = block;
else
goto notfound;
@@ -93,7 +95,7 @@ MemoryPool::allocBlock(memaddress size)
found:
{
block = &blocks[POOLOFFSET];
- for (cur = POOLOFFSET; cur < NUM_MEMBLOCKS + POOLOFFSET; cur++)
+ for (cur = POOLOFFSET; cur < MEMPOOL_NUM_MEMBLOCKS + POOLOFFSET; cur++)
{
if (block->size)
{
@@ -118,6 +120,8 @@ MemoryPool::allocBlock(memaddress size)
void
MemoryPool::freeBlock(memhandle handle)
{
+ if (handle == NOBLOCK)
+ return;
memblock *b = &blocks[POOLSTART];
do
diff --git a/libraries/UIPEthernet/src/utility/mempool.h b/libraries/UIPEthernet/utility/mempool.h
similarity index 59%
rename from libraries/UIPEthernet/src/utility/mempool.h
rename to libraries/UIPEthernet/utility/mempool.h
index ea79473..2a1db21 100644
--- a/libraries/UIPEthernet/src/utility/mempool.h
+++ b/libraries/UIPEthernet/utility/mempool.h
@@ -27,18 +27,6 @@
#include "mempool_conf.h"
-//#ifdef MEMBLOCK_MV
-//#define memblock_mv_cb(dest,src,size) MEMBLOCK_MV(dest,src,size)
-//#endif
-
-#ifdef MEMBLOCK_ALLOC
-#define memblock_alloc_cb(address,size) MEMBLOCK_ALLOC(address,size)
-#endif
-
-#ifdef MEMBLOCK_FREE
-#define memblock_free_cb(address,size) MEMBLOCK_FREE(address,size)
-#endif
-
struct memblock
{
memaddress begin;
@@ -53,19 +41,14 @@ class MemoryPool
#endif
protected:
- memaddress poolsize;
- struct memblock blocks[NUM_MEMBLOCKS+1];
-#ifdef MEMBLOCK_MV
- virtual void memblock_mv_cb(memaddress dest, memaddress src, memaddress size) = 0;
-#endif
+ static struct memblock blocks[MEMPOOL_NUM_MEMBLOCKS+1];
public:
- MemoryPool(memaddress start, memaddress size);
- memhandle
- allocBlock(memaddress);
- void freeBlock(memhandle);
- void resizeBlock(memhandle handle, memaddress position);
- void resizeBlock(memhandle handle, memaddress position, memaddress size);
- memaddress blockSize(memhandle);
+ static void init();
+ static memhandle allocBlock(memaddress);
+ static void freeBlock(memhandle);
+ static void resizeBlock(memhandle handle, memaddress position);
+ static void resizeBlock(memhandle handle, memaddress position, memaddress size);
+ static memaddress blockSize(memhandle);
};
#endif
diff --git a/libraries/UIPEthernet/utility/mempool_conf.h b/libraries/UIPEthernet/utility/mempool_conf.h
new file mode 100644
index 0000000..9615f92
--- /dev/null
+++ b/libraries/UIPEthernet/utility/mempool_conf.h
@@ -0,0 +1,34 @@
+#ifndef MEMPOOLCONF_H
+#define MEMPOOLCONF_H
+#include "uipethernet-conf.h"
+extern "C" {
+ #include "uipopt.h"
+ #include "enc28j60.h"
+}
+#include
+
+typedef uint16_t memaddress;
+typedef uint8_t memhandle;
+
+#if UIP_SOCKET_NUMPACKETS and UIP_CONNS
+#define NUM_TCP_MEMBLOCKS (UIP_SOCKET_NUMPACKETS*2)*UIP_CONNS
+#else
+#define NUM_TCP_MEMBLOCKS 0
+#endif
+
+#if UIP_UDP and UIP_UDP_CONNS
+#define NUM_UDP_MEMBLOCKS 3*UIP_UDP_CONNS
+#else
+#define NUM_UDP_MEMBLOCKS 0
+#endif
+
+#define MEMPOOL_NUM_MEMBLOCKS (NUM_TCP_MEMBLOCKS+NUM_UDP_MEMBLOCKS)
+
+#define MEMPOOL_STARTADDRESS TXSTART_INIT+1
+#define MEMPOOL_SIZE TXSTOP_INIT-TXSTART_INIT
+
+void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress);
+
+#define MEMPOOL_MEMBLOCK_MV(dest,src,size) enc28J60_mempool_block_move_callback(dest,src,size)
+
+#endif
diff --git a/libraries/UIPEthernet/src/utility/uip-conf.h b/libraries/UIPEthernet/utility/uip-conf.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip-conf.h
rename to libraries/UIPEthernet/utility/uip-conf.h
diff --git a/libraries/UIPEthernet/src/utility/uip.c b/libraries/UIPEthernet/utility/uip.c
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip.c
rename to libraries/UIPEthernet/utility/uip.c
diff --git a/libraries/UIPEthernet/src/utility/uip.h b/libraries/UIPEthernet/utility/uip.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip.h
rename to libraries/UIPEthernet/utility/uip.h
diff --git a/libraries/UIPEthernet/src/utility/uip_arch.h b/libraries/UIPEthernet/utility/uip_arch.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_arch.h
rename to libraries/UIPEthernet/utility/uip_arch.h
diff --git a/libraries/UIPEthernet/src/utility/uip_arp.c b/libraries/UIPEthernet/utility/uip_arp.c
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_arp.c
rename to libraries/UIPEthernet/utility/uip_arp.c
diff --git a/libraries/UIPEthernet/src/utility/uip_arp.h b/libraries/UIPEthernet/utility/uip_arp.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_arp.h
rename to libraries/UIPEthernet/utility/uip_arp.h
diff --git a/libraries/UIPEthernet/src/utility/uip_clock.h b/libraries/UIPEthernet/utility/uip_clock.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_clock.h
rename to libraries/UIPEthernet/utility/uip_clock.h
diff --git a/libraries/UIPEthernet/src/utility/uip_debug.cpp b/libraries/UIPEthernet/utility/uip_debug.cpp
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_debug.cpp
rename to libraries/UIPEthernet/utility/uip_debug.cpp
diff --git a/libraries/UIPEthernet/src/utility/uip_debug.h b/libraries/UIPEthernet/utility/uip_debug.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_debug.h
rename to libraries/UIPEthernet/utility/uip_debug.h
diff --git a/libraries/UIPEthernet/src/utility/uip_timer.c b/libraries/UIPEthernet/utility/uip_timer.c
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_timer.c
rename to libraries/UIPEthernet/utility/uip_timer.c
diff --git a/libraries/UIPEthernet/src/utility/uip_timer.h b/libraries/UIPEthernet/utility/uip_timer.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uip_timer.h
rename to libraries/UIPEthernet/utility/uip_timer.h
diff --git a/libraries/UIPEthernet/utility/uipethernet-conf.h b/libraries/UIPEthernet/utility/uipethernet-conf.h
new file mode 100644
index 0000000..016e0e3
--- /dev/null
+++ b/libraries/UIPEthernet/utility/uipethernet-conf.h
@@ -0,0 +1,21 @@
+#ifndef UIPETHERNET_CONF_H
+#define UIPETHERNET_CONF_H
+
+/* for TCP */
+#define UIP_SOCKET_NUMPACKETS 5
+#define UIP_CONF_MAX_CONNECTIONS 4
+
+/* for UDP */
+#define UIP_CONF_UDP 0
+#define UIP_CONF_BROADCAST 1
+#define UIP_CONF_UDP_CONNS 4
+
+/* number of attempts on write before returning number of bytes sent so far
+ * set to -1 to block until connection is closed by timeout */
+#define UIP_ATTEMPTS_ON_WRITE -1
+
+/* timeout after which UIPClient::connect gives up. The timeout is specified in seconds.
+ * if set to a number <= 0 connect will timeout when uIP does (which might be longer than you expect...) */
+#define UIP_CONNECT_TIMEOUT -1
+
+#endif
diff --git a/libraries/UIPEthernet/src/utility/uipopt.h b/libraries/UIPEthernet/utility/uipopt.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/uipopt.h
rename to libraries/UIPEthernet/utility/uipopt.h
diff --git a/libraries/UIPEthernet/src/utility/util.h b/libraries/UIPEthernet/utility/util.h
similarity index 100%
rename from libraries/UIPEthernet/src/utility/util.h
rename to libraries/UIPEthernet/utility/util.h
diff --git a/libraries/UTFT/DefaultFonts.c b/libraries/UTFT/DefaultFonts.c
new file mode 100644
index 0000000..bc11d95
--- /dev/null
+++ b/libraries/UTFT/DefaultFonts.c
@@ -0,0 +1,246 @@
+// DO NOT ADD YOUR OWN FONTS TO THIS FILE
+// If you want to use your own fonts you should just drop the font .c file into your sketch folder.
+// ------------------------------------------------------------------------------------------------
+
+#if defined(__AVR__)
+ #include
+ #define fontdatatype const uint8_t
+#elif defined(__PIC32MX__)
+ #define PROGMEM
+ #define fontdatatype const unsigned char
+#elif defined(__arm__)
+ #define PROGMEM
+ #define fontdatatype const unsigned char
+#endif
+
+// SmallFont.c
+// Font Size : 8x12
+// Memory usage : 1144 bytes
+// # characters : 95
+
+fontdatatype SmallFont[1144] PROGMEM={
+0x08,0x0C,0x20,0x5F,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
+0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, // !
+0x00,0x28,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // "
+0x00,0x00,0x28,0x28,0xFC,0x28,0x50,0xFC,0x50,0x50,0x00,0x00, // #
+0x00,0x20,0x78,0xA8,0xA0,0x60,0x30,0x28,0xA8,0xF0,0x20,0x00, // $
+0x00,0x00,0x48,0xA8,0xB0,0x50,0x28,0x34,0x54,0x48,0x00,0x00, // %
+0x00,0x00,0x20,0x50,0x50,0x78,0xA8,0xA8,0x90,0x6C,0x00,0x00, // &
+0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
+0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x00, // (
+0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00, // )
+0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00, // *
+0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00,0x00, // +
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, // ,
+0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, // -
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, // .
+0x00,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, // /
+0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // 0
+0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // 1
+0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00, // 2
+0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00, // 3
+0x00,0x00,0x10,0x30,0x50,0x50,0x90,0x78,0x10,0x18,0x00,0x00, // 4
+0x00,0x00,0xF8,0x80,0x80,0xF0,0x08,0x08,0x88,0x70,0x00,0x00, // 5
+0x00,0x00,0x70,0x90,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00, // 6
+0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x20,0x20,0x20,0x00,0x00, // 7
+0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, // 8
+0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x48,0x70,0x00,0x00, // 9
+0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0x00, // :
+0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00, // ;
+0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, // <
+0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, // =
+0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, // >
+0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, // ?
+0x00,0x00,0x70,0x88,0x98,0xA8,0xA8,0xB8,0x80,0x78,0x00,0x00, // @
+0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00, // A
+0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00, // B
+0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00, // C
+0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00, // D
+0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00, // E
+0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00, // F
+0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00, // G
+0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00, // H
+0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // I
+0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0,0x00, // J
+0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x50,0x48,0xEC,0x00,0x00, // K
+0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00, // L
+0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // M
+0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00, // N
+0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // O
+0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00, // P
+0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00, // Q
+0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00, // R
+0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00, // S
+0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // T
+0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00, // U
+0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00, // V
+0x00,0x00,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x50,0x00,0x00, // W
+0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00, // X
+0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // Y
+0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00, // Z
+0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, // [
+0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x00,0x00, //
+0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, // ]
+0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, // _
+0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
+0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00, // a
+0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, // b
+0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x40,0x38,0x00,0x00, // c
+0x00,0x00,0x18,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00, // d
+0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, // e
+0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00, // f
+0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x78,0x44,0x38, // g
+0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00, // h
+0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00, // i
+0x00,0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0, // j
+0x00,0x00,0xC0,0x40,0x40,0x5C,0x50,0x70,0x48,0xEC,0x00,0x00, // k
+0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // l
+0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // m
+0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00, // n
+0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, // o
+0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0, // p
+0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C, // q
+0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00, // r
+0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00, // s
+0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x18,0x00,0x00, // t
+0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00, // u
+0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x00,0x00, // v
+0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00, // w
+0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00, // x
+0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x20,0xC0, // y
+0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00, // z
+0x00,0x18,0x10,0x10,0x10,0x20,0x10,0x10,0x10,0x10,0x18,0x00, // {
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, // |
+0x00,0x60,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00, // }
+0x40,0xA4,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+};
+
+// BigFont.c (C)2010 by Henning Karlsen
+// Font Size : 16x16
+// Memory usage : 3044 bytes
+// # characters : 95
+
+fontdatatype BigFont[3044] PROGMEM={
+0x10,0x10,0x20,0x5F,
+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,0x07,0x00,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00, // !
+0x00,0x00,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x06,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // "
+0x00,0x00,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x7F,0xFE,0x7F,0xFE,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x7F,0xFE,0x7F,0xFE,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00, // #
+0x00,0x00,0x02,0x40,0x02,0x40,0x0F,0xF8,0x1F,0xF8,0x1A,0x40,0x1A,0x40,0x1F,0xF0,0x0F,0xF8,0x02,0x58,0x02,0x58,0x1F,0xF8,0x1F,0xF0,0x02,0x40,0x02,0x40,0x00,0x00, // $
+0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x10,0x0E,0x30,0x0E,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x70,0x0C,0x70,0x08,0x70,0x00,0x00,0x00,0x00,0x00,0x00, // %
+0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x08,0x0F,0x98,0x19,0xF8,0x18,0xF0,0x18,0xE0,0x19,0xF0,0x0F,0x98,0x00,0x00,0x00,0x00, // &
+0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x0E,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,0xF0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xF0,0x00,0x00,0x00,0x00, // (
+0x00,0x00,0x00,0x00,0x0F,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x0F,0x00,0x00,0x00,0x00,0x00, // )
+0x00,0x00,0x00,0x00,0x01,0x80,0x11,0x88,0x09,0x90,0x07,0xE0,0x07,0xE0,0x3F,0xFC,0x3F,0xFC,0x07,0xE0,0x07,0xE0,0x09,0x90,0x11,0x88,0x01,0x80,0x00,0x00,0x00,0x00, // *
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,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,0x07,0x00,0x07,0x00,0x07,0x00,0x0E,0x00,0x00,0x00, // ,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,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,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00, // ,
+0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, // /
+
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x78,0x1C,0xF8,0x1C,0xF8,0x1D,0xB8,0x1D,0xB8,0x1F,0x38,0x1F,0x38,0x1E,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 0
+0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x80,0x1F,0x80,0x1F,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x1F,0xF0,0x00,0x00,0x00,0x00, // 1
+0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x38,0x1C,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // 2
+0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x38,0x00,0x38,0x00,0x70,0x03,0xC0,0x03,0xC0,0x00,0x70,0x00,0x38,0x1C,0x38,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // 3
+0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0xE0,0x03,0xE0,0x06,0xE0,0x0C,0xE0,0x18,0xE0,0x1F,0xF8,0x1F,0xF8,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x03,0xF8,0x00,0x00,0x00,0x00, // 4
+0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xE0,0x1F,0xF0,0x00,0x78,0x00,0x38,0x1C,0x38,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // 5
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xF0,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 6
+0x00,0x00,0x00,0x00,0x1F,0xFC,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00, // 7
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0x38,0x07,0xE0,0x07,0xE0,0x1C,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 8
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0xF8,0x0F,0xF8,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x07,0xC0,0x00,0x00,0x00,0x00, // 9
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // :
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ;
+0x00,0x00,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x00, // <
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // =
+0x00,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00, // >
+0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1E,0x78,0x18,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00, // ?
+
+0x00,0x00,0x0F,0xF8,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0xFC,0x1C,0xFC,0x1C,0xFC,0x1C,0xFC,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xF0,0x07,0xF8,0x00,0x00, // @
+0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00, // A
+0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1F,0xF0,0x00,0x00,0x00,0x00, // B
+0x00,0x00,0x00,0x00,0x07,0xF0,0x0E,0x38,0x1C,0x38,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x38,0x0E,0x38,0x07,0xF0,0x00,0x00,0x00,0x00, // C
+0x00,0x00,0x00,0x00,0x1F,0xE0,0x0E,0x70,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x70,0x1F,0xE0,0x00,0x00,0x00,0x00, // D
+0x00,0x00,0x00,0x00,0x1F,0xF8,0x0E,0x18,0x0E,0x08,0x0E,0x00,0x0E,0x30,0x0F,0xF0,0x0F,0xF0,0x0E,0x30,0x0E,0x00,0x0E,0x08,0x0E,0x18,0x1F,0xF8,0x00,0x00,0x00,0x00, // E
+0x00,0x00,0x00,0x00,0x1F,0xF8,0x0E,0x18,0x0E,0x08,0x0E,0x00,0x0E,0x30,0x0F,0xF0,0x0F,0xF0,0x0E,0x30,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // F
+0x00,0x00,0x00,0x00,0x07,0xF0,0x0E,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0xF8,0x1C,0x38,0x1C,0x38,0x0E,0x38,0x07,0xF8,0x00,0x00,0x00,0x00, // G
+0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1F,0xF0,0x1F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // H
+0x00,0x00,0x00,0x00,0x0F,0xE0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x0F,0xE0,0x00,0x00,0x00,0x00, // I
+0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x38,0x70,0x38,0x70,0x38,0x70,0x38,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // J
+0x00,0x00,0x00,0x00,0x1E,0x38,0x0E,0x38,0x0E,0x70,0x0E,0xE0,0x0F,0xC0,0x0F,0x80,0x0F,0x80,0x0F,0xC0,0x0E,0xE0,0x0E,0x70,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // K
+0x00,0x00,0x00,0x00,0x1F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x08,0x0E,0x18,0x0E,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // L
+0x00,0x00,0x00,0x00,0x1C,0x1C,0x1E,0x3C,0x1F,0x7C,0x1F,0xFC,0x1F,0xFC,0x1D,0xDC,0x1C,0x9C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00, // M
+0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1E,0x1C,0x1F,0x1C,0x1F,0x9C,0x1D,0xDC,0x1C,0xFC,0x1C,0x7C,0x1C,0x3C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00, // N
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00, // O
+
+0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // P
+0x00,0x00,0x00,0x00,0x03,0xE0,0x0F,0x78,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x7C,0x1C,0xFC,0x0F,0xF8,0x0F,0xF8,0x00,0x38,0x00,0xFC,0x00,0x00, // Q
+0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x70,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // R
+0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x00,0x0F,0xE0,0x07,0xF0,0x00,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // S
+0x00,0x00,0x00,0x00,0x1F,0xFC,0x19,0xCC,0x11,0xC4,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x07,0xF0,0x00,0x00,0x00,0x00, // T
+0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // U
+0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00, // V
+0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x0F,0xF8,0x0F,0xF8,0x07,0x70,0x07,0x70,0x00,0x00,0x00,0x00, // W
+0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x03,0x80,0x07,0xC0,0x0E,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // X
+0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x0F,0xE0,0x00,0x00,0x00,0x00, // Y
+0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x38,0x18,0x38,0x10,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x08,0x1C,0x18,0x1C,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // Z
+0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0xF0,0x00,0x00,0x00,0x00, // [
+0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x07,0x00,0x00,0x00,0x00, //
+0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x07,0xF0,0x00,0x00,0x00,0x00, // ]
+0x00,0x00,0x01,0x80,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x38,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,0x7F,0xFF,0x7F,0xFF, // _
+
+0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x07,0x00,0x07,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,0x0F,0xE0,0x00,0x70,0x00,0x70,0x0F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // a
+0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1B,0xF0,0x00,0x00,0x00,0x00, // b
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x00,0x1C,0x00,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // c
+0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x70,0x00,0x70,0x00,0x70,0x0F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // d
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1F,0xF0,0x1C,0x00,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // e
+0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0x70,0x07,0x70,0x07,0x00,0x07,0x00,0x1F,0xE0,0x1F,0xE0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00, // f
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xD8,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xF0,0x07,0xF0,0x00,0x70,0x1C,0x70,0x0F,0xE0, // g
+0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0xF0,0x0F,0x38,0x0F,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // h
+0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x0F,0xF8,0x00,0x00,0x00,0x00, // i
+0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x03,0xF0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x1C,0x70,0x0C,0xF0,0x07,0xE0, // j
+0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x38,0x0E,0x70,0x0E,0xE0,0x0F,0xC0,0x0E,0xE0,0x0E,0x70,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // k
+0x00,0x00,0x00,0x00,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x0F,0xF8,0x00,0x00,0x00,0x00, // l
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x00,0x00,0x00,0x00, // m
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // n
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // o
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0E,0x00,0x0E,0x00,0x1F,0x00, // p
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xB0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x1F,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xF0, // q
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xF0,0x0F,0xF8,0x0F,0x38,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // r
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x30,0x1C,0x30,0x0F,0x80,0x03,0xE0,0x18,0x70,0x18,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // s
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x1F,0xF0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x70,0x07,0x70,0x03,0xE0,0x00,0x00,0x00,0x00, // t
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // u
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00, // v
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x9C,0x1C,0x9C,0x0F,0xF8,0x07,0x70,0x07,0x70,0x00,0x00,0x00,0x00, // w
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xE0,0x1C,0xE0,0x0F,0xC0,0x07,0x80,0x07,0x80,0x0F,0xC0,0x1C,0xE0,0x1C,0xE0,0x00,0x00,0x00,0x00, // x
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0xE0,0x01,0xC0,0x1F,0x80, // y
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x18,0xE0,0x11,0xC0,0x03,0x80,0x07,0x00,0x0E,0x20,0x1C,0x60,0x1F,0xE0,0x00,0x00,0x00,0x00, // z
+0x00,0x00,0x00,0x00,0x01,0xF8,0x03,0x80,0x03,0x80,0x03,0x80,0x07,0x00,0x1C,0x00,0x1C,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0xF8,0x00,0x00,0x00,0x00, // {
+0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00, // |
+0x00,0x00,0x00,0x00,0x1F,0x80,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x38,0x00,0x38,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00, // }
+0x00,0x00,0x00,0x00,0x1F,0x1C,0x3B,0x9C,0x39,0xDC,0x38,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // ~
+};
+
+// SevenSegNumFont.c
+// Font Size : 32x50
+// Memory usage : 2004 bytes
+// # characters : 10
+
+fontdatatype SevenSegNumFont[2004] PROGMEM={
+0x20,0x32,0x30,0x0A,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x38,0x00,0x00,0x18,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x00,0x3E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0C,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x00,0x00,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9
+};
diff --git a/libraries/UTFT/License - CC BY-NC-SA 3.0 - Legal.pdf b/libraries/UTFT/License - CC BY-NC-SA 3.0 - Legal.pdf
new file mode 100644
index 0000000..ed326c9
Binary files /dev/null and b/libraries/UTFT/License - CC BY-NC-SA 3.0 - Legal.pdf differ
diff --git a/libraries/UTFT/License - CC BY-NC-SA 3.0 - Summary.pdf b/libraries/UTFT/License - CC BY-NC-SA 3.0 - Summary.pdf
new file mode 100644
index 0000000..b35e677
Binary files /dev/null and b/libraries/UTFT/License - CC BY-NC-SA 3.0 - Summary.pdf differ
diff --git a/libraries/UTFT/Tools/ImageConverter565.exe b/libraries/UTFT/Tools/ImageConverter565.exe
new file mode 100644
index 0000000..cca5c39
Binary files /dev/null and b/libraries/UTFT/Tools/ImageConverter565.exe differ
diff --git a/libraries/UTFT/Tools/ImgConv.exe b/libraries/UTFT/Tools/ImgConv.exe
new file mode 100644
index 0000000..229ae8b
Binary files /dev/null and b/libraries/UTFT/Tools/ImgConv.exe differ
diff --git a/libraries/UTFT/Tools/Online-tool - ImageConverter 565.url b/libraries/UTFT/Tools/Online-tool - ImageConverter 565.url
new file mode 100644
index 0000000..e41696b
--- /dev/null
+++ b/libraries/UTFT/Tools/Online-tool - ImageConverter 565.url
@@ -0,0 +1,7 @@
+[InternetShortcut]
+URL=http://www.henningkarlsen.com/electronics/t_imageconverter565.php
+IDList=
+IconFile=http://www.henningkarlsen.com/favicon.ico
+IconIndex=1
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,2
diff --git a/libraries/UTFT/Tools/UTFT Image Converters.pdf b/libraries/UTFT/Tools/UTFT Image Converters.pdf
new file mode 100644
index 0000000..43a8df6
Binary files /dev/null and b/libraries/UTFT/Tools/UTFT Image Converters.pdf differ
diff --git a/libraries/UTFT/UTFT.cpp b/libraries/UTFT/UTFT.cpp
new file mode 100644
index 0000000..5bfd21d
--- /dev/null
+++ b/libraries/UTFT/UTFT.cpp
@@ -0,0 +1,1335 @@
+/*
+ UTFT.cpp - Arduino/chipKit library support for Color TFT LCD Boards
+ Copyright (C)2010-2014 Henning Karlsen. All right reserved
+
+ This library is the continuation of my ITDB02_Graph, ITDB02_Graph16
+ and RGB_GLCD libraries for Arduino and chipKit. As the number of
+ supported display modules and controllers started to increase I felt
+ it was time to make a single, universal library as it will be much
+ easier to maintain in the future.
+
+ Basic functionality of this library was origianlly based on the
+ demo-code provided by ITead studio (for the ITDB02 modules) and
+ NKC Electronics (for the RGB GLCD module/shield).
+
+ This library supports a number of 8bit, 16bit and serial graphic
+ displays, and will work with both Arduino and chipKit boards. For a
+ full list of tested display modules and controllers, see the
+ document UTFT_Supported_display_modules_&_controllers.pdf.
+
+ When using 8bit and 16bit display modules there are some
+ requirements you must adhere to. These requirements can be found
+ in the document UTFT_Requirements.pdf.
+ There are no special requirements when using serial displays.
+
+ You can always find the latest version of the library at
+ http://electronics.henningkarlsen.com/
+
+ If you make any modifications or improvements to the code, I would
+ appreciate that you share the code with me so that I might include
+ it in the next release. I can be contacted through
+ http://electronics.henningkarlsen.com/contact.php.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the CC BY-NC-SA 3.0 license.
+ Please see the included documents for further information.
+
+ Commercial use of this library requires you to buy a license that
+ will allow commercial use. This includes using the library,
+ modified or not, as a tool to sell products.
+
+ The license applies to all part of the library including the
+ examples and tools supplied with the library.
+*/
+
+#include "UTFT.h"
+#include
+
+// Include hardware-specific functions for the correct MCU
+#if defined(__AVR__)
+ #include
+ #include "hardware/avr/HW_AVR.h"
+ #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
+ #include "hardware/avr/HW_ATmega1280.h"
+ #elif defined(__AVR_ATmega328P__)
+ #include "hardware/avr/HW_ATmega328P.h"
+ #elif defined(__AVR_ATmega32U4__)
+ #include "hardware/avr/HW_ATmega32U4.h"
+ #elif defined(__AVR_ATmega168__)
+ #error "ATmega168 MCUs are not supported because they have too little flash memory!"
+ #elif defined(__AVR_ATmega1284P__)
+ #include "hardware/avr/HW_ATmega1284P.h"
+ #else
+ #error "Unsupported AVR MCU!"
+ #endif
+#elif defined(__PIC32MX__)
+ #include "hardware/pic32/HW_PIC32.h"
+ #if defined(__32MX320F128H__)
+ #pragma message("Compiling for chipKIT UNO32 (PIC32MX320F128H)")
+ #include "hardware/pic32/HW_PIC32MX320F128H.h"
+ #elif defined(__32MX340F512H__)
+ #pragma message("Compiling for chipKIT uC32 (PIC32MX340F512H)")
+ #include "hardware/pic32/HW_PIC32MX340F512H.h"
+ #elif defined(__32MX795F512L__)
+ #pragma message("Compiling for chipKIT MAX32 (PIC32MX795F512L)")
+ #include "hardware/pic32/HW_PIC32MX795F512L.h"
+ #else
+ #error "Unsupported PIC32 MCU!"
+ #endif
+#elif defined(__arm__)
+ #include "hardware/arm/HW_ARM.h"
+ #if defined(__SAM3X8E__)
+ #pragma message("Compiling for Arduino Due (AT91SAM3X8E)...")
+ #include "hardware/arm/HW_SAM3X8E.h"
+ #elif defined(__MK20DX128__) || defined(__MK20DX256__)
+ #pragma message("Compiling for Teensy 3.x (MK20DX128VLH7 / MK20DX256VLH7)...")
+ #include "hardware/arm/HW_MX20DX256.h"
+ #else
+ #error "Unsupported ARM MCU!"
+ #endif
+#endif
+#include "memorysaver.h"
+
+UTFT::UTFT()
+{
+}
+
+UTFT::UTFT(byte model, int RS, int WR, int CS, int RST, int SER)
+{
+ word dsx[] = {239, 239, 239, 239, 239, 239, 175, 175, 239, 127, 127, 239, 271, 479, 239, 239, 239, 239, 239, 239, 479, 319, 239, 175, 127, 239, 239, 319, 319, 799, 127};
+ word dsy[] = {319, 399, 319, 319, 319, 319, 219, 219, 399, 159, 127, 319, 479, 799, 319, 319, 319, 319, 319, 319, 799, 479, 319, 219, 159, 319, 319, 479, 479, 479, 159};
+ byte dtm[] = {16, 16, 16, 8, 8, 16, 8, SERIAL_4PIN, 16, SERIAL_5PIN, SERIAL_5PIN, 16, 16, 16, 8, 16, LATCHED_16, 8, 16, 8, 16, 16, 16, 8, SERIAL_5PIN, SERIAL_5PIN, SERIAL_4PIN, 16, 16, 16, SERIAL_5PIN};
+
+ disp_x_size = dsx[model];
+ disp_y_size = dsy[model];
+ display_transfer_mode = dtm[model];
+ display_model = model;
+
+ __p1 = RS;
+ __p2 = WR;
+ __p3 = CS;
+ __p4 = RST;
+ __p5 = SER;
+
+ if (display_transfer_mode == SERIAL_4PIN)
+ {
+ display_transfer_mode=1;
+ display_serial_mode=SERIAL_4PIN;
+ }
+ if (display_transfer_mode == SERIAL_5PIN)
+ {
+ display_transfer_mode=1;
+ display_serial_mode=SERIAL_5PIN;
+ }
+
+ if (display_transfer_mode!=1)
+ {
+ _set_direction_registers(display_transfer_mode);
+ P_RS = portOutputRegister(digitalPinToPort(RS));
+ B_RS = digitalPinToBitMask(RS);
+ P_WR = portOutputRegister(digitalPinToPort(WR));
+ B_WR = digitalPinToBitMask(WR);
+ P_CS = portOutputRegister(digitalPinToPort(CS));
+ B_CS = digitalPinToBitMask(CS);
+ P_RST = portOutputRegister(digitalPinToPort(RST));
+ B_RST = digitalPinToBitMask(RST);
+ if (display_transfer_mode==LATCHED_16)
+ {
+ P_ALE = portOutputRegister(digitalPinToPort(SER));
+ B_ALE = digitalPinToBitMask(SER);
+ cbi(P_ALE, B_ALE);
+ pinMode(8,OUTPUT);
+ digitalWrite(8, LOW);
+ }
+ }
+ else
+ {
+ P_SDA = portOutputRegister(digitalPinToPort(RS));
+ B_SDA = digitalPinToBitMask(RS);
+ P_SCL = portOutputRegister(digitalPinToPort(WR));
+ B_SCL = digitalPinToBitMask(WR);
+ P_CS = portOutputRegister(digitalPinToPort(CS));
+ B_CS = digitalPinToBitMask(CS);
+ if (RST != NOTINUSE)
+ {
+ P_RST = portOutputRegister(digitalPinToPort(RST));
+ B_RST = digitalPinToBitMask(RST);
+ }
+ if (display_serial_mode!=SERIAL_4PIN)
+ {
+ P_RS = portOutputRegister(digitalPinToPort(SER));
+ B_RS = digitalPinToBitMask(SER);
+ }
+ }
+}
+
+void UTFT::LCD_Write_COM(char VL)
+{
+ if (display_transfer_mode!=1)
+ {
+ cbi(P_RS, B_RS);
+ LCD_Writ_Bus(0x00,VL,display_transfer_mode);
+ }
+ else
+ LCD_Writ_Bus(0x00,VL,display_transfer_mode);
+}
+
+void UTFT::LCD_Write_DATA(char VH,char VL)
+{
+ if (display_transfer_mode!=1)
+ {
+ sbi(P_RS, B_RS);
+ LCD_Writ_Bus(VH,VL,display_transfer_mode);
+ }
+ else
+ {
+ LCD_Writ_Bus(0x01,VH,display_transfer_mode);
+ LCD_Writ_Bus(0x01,VL,display_transfer_mode);
+ }
+}
+
+void UTFT::LCD_Write_DATA(char VL)
+{
+ if (display_transfer_mode!=1)
+ {
+ sbi(P_RS, B_RS);
+ LCD_Writ_Bus(0x00,VL,display_transfer_mode);
+ }
+ else
+ LCD_Writ_Bus(0x01,VL,display_transfer_mode);
+}
+
+void UTFT::LCD_Write_COM_DATA(char com1,int dat1)
+{
+ LCD_Write_COM(com1);
+ LCD_Write_DATA(dat1>>8,dat1);
+}
+
+void UTFT::InitLCD(byte orientation)
+{
+ orient=orientation;
+ _hw_special_init();
+
+ pinMode(__p1,OUTPUT);
+ pinMode(__p2,OUTPUT);
+ pinMode(__p3,OUTPUT);
+ if (__p4 != NOTINUSE)
+ pinMode(__p4,OUTPUT);
+ if ((display_transfer_mode==LATCHED_16) or ((display_transfer_mode==1) and (display_serial_mode==SERIAL_5PIN)))
+ pinMode(__p5,OUTPUT);
+ if (display_transfer_mode!=1)
+ _set_direction_registers(display_transfer_mode);
+
+ sbi(P_RST, B_RST);
+ delay(5);
+ cbi(P_RST, B_RST);
+ delay(15);
+ sbi(P_RST, B_RST);
+ delay(15);
+
+ cbi(P_CS, B_CS);
+
+ switch(display_model)
+ {
+#ifndef DISABLE_HX8347A
+ #include "tft_drivers/hx8347a/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9327
+ #include "tft_drivers/ili9327/initlcd.h"
+#endif
+#ifndef DISABLE_SSD1289
+ #include "tft_drivers/ssd1289/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9325C
+ #include "tft_drivers/ili9325c/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9325D
+ #include "tft_drivers/ili9325d/default/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9325D_ALT
+ #include "tft_drivers/ili9325d/alt/initlcd.h"
+#endif
+#ifndef DISABLE_HX8340B_8
+ #include "tft_drivers/hx8340b/8/initlcd.h"
+#endif
+#ifndef DISABLE_HX8340B_S
+ #include "tft_drivers/hx8340b/s/initlcd.h"
+#endif
+#ifndef DISABLE_ST7735
+ #include "tft_drivers/st7735/initlcd.h"
+#endif
+#ifndef DISABLE_PCF8833
+ #include "tft_drivers/pcf8833/initlcd.h"
+#endif
+#ifndef DISABLE_S1D19122
+ #include "tft_drivers/s1d19122/initlcd.h"
+#endif
+#ifndef DISABLE_HX8352A
+ #include "tft_drivers/hx8352a/initlcd.h"
+#endif
+#ifndef DISABLE_SSD1963_480
+ #include "tft_drivers/ssd1963/480/initlcd.h"
+#endif
+#ifndef DISABLE_SSD1963_800
+ #include "tft_drivers/ssd1963/800/initlcd.h"
+#endif
+#ifndef DISABLE_SSD1963_800_ALT
+ #include "tft_drivers/ssd1963/800alt/initlcd.h"
+#endif
+#ifndef DISABLE_S6D1121
+ #include "tft_drivers/s6d1121/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9320
+ #include "tft_drivers/ili9320/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9481
+ #include "tft_drivers/ili9481/initlcd.h"
+#endif
+#ifndef DISABLE_S6D0164
+ #include "tft_drivers/s6d0164/initlcd.h"
+#endif
+#ifndef DISABLE_ST7735S
+ #include "tft_drivers/st7735s/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9341_S4P
+ #include "tft_drivers/ili9341/s4p/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9341_S5P
+ #include "tft_drivers/ili9341/s5p/initlcd.h"
+#endif
+#ifndef DISABLE_R61581
+ #include "tft_drivers/r61581/initlcd.h"
+#endif
+#ifndef DISABLE_ILI9486
+ #include "tft_drivers/ili9486/initlcd.h"
+#endif
+#ifndef DISABLE_CPLD
+ #include "tft_drivers/cpld/initlcd.h"
+#endif
+#ifndef DISABLE_HX8353C
+ #include "tft_drivers/hx8353c/initlcd.h"
+#endif
+ }
+
+ sbi (P_CS, B_CS);
+
+ setColor(255, 255, 255);
+ setBackColor(0, 0, 0);
+ cfont.font=0;
+ _transparent = false;
+}
+
+void UTFT::setXY(word x1, word y1, word x2, word y2)
+{
+ if (orient==LANDSCAPE)
+ {
+ swap(word, x1, y1);
+ swap(word, x2, y2)
+ y1=disp_y_size-y1;
+ y2=disp_y_size-y2;
+ swap(word, y1, y2)
+ }
+
+ switch(display_model)
+ {
+#ifndef DISABLE_HX8347A
+ #include "tft_drivers/hx8347a/setxy.h"
+#endif
+#ifndef DISABLE_HX8352A
+ #include "tft_drivers/hx8352a/setxy.h"
+#endif
+#ifndef DISABLE_ILI9327
+ #include "tft_drivers/ili9327/setxy.h"
+#endif
+#ifndef DISABLE_SSD1289
+ #include "tft_drivers/ssd1289/setxy.h"
+#endif
+#ifndef DISABLE_ILI9325C
+ #include "tft_drivers/ili9325c/setxy.h"
+#endif
+#ifndef DISABLE_ILI9325D
+ #include "tft_drivers/ili9325d/default/setxy.h"
+#endif
+#ifndef DISABLE_ILI9325D_ALT
+ #include "tft_drivers/ili9325d/alt/setxy.h"
+#endif
+#ifndef DISABLE_HX8340B_8
+ #include "tft_drivers/hx8340b/8/setxy.h"
+#endif
+#ifndef DISABLE_HX8340B_S
+ #include "tft_drivers/hx8340b/s/setxy.h"
+#endif
+#ifndef DISABLE_ST7735
+ #include "tft_drivers/st7735/setxy.h"
+#endif
+#ifndef DISABLE_S1D19122
+ #include "tft_drivers/s1d19122/setxy.h"
+#endif
+#ifndef DISABLE_PCF8833
+ #include "tft_drivers/pcf8833/setxy.h"
+#endif
+#ifndef DISABLE_SSD1963_480
+ #include "tft_drivers/ssd1963/480/setxy.h"
+#endif
+#ifndef DISABLE_SSD1963_800
+ #include "tft_drivers/ssd1963/800/setxy.h"
+#endif
+#ifndef DISABLE_SSD1963_800_ALT
+ #include "tft_drivers/ssd1963/800alt/setxy.h"
+#endif
+#ifndef DISABLE_S6D1121
+ #include "tft_drivers/s6d1121/setxy.h"
+#endif
+#ifndef DISABLE_ILI9320
+ #include "tft_drivers/ili9320/setxy.h"
+#endif
+#ifndef DISABLE_ILI9481
+ #include "tft_drivers/ili9481/setxy.h"
+#endif
+#ifndef DISABLE_S6D0164
+ #include "tft_drivers/s6d0164/setxy.h"
+#endif
+#ifndef DISABLE_ST7735S
+ #include "tft_drivers/st7735s/setxy.h"
+#endif
+#ifndef DISABLE_ILI9341_S4P
+ #include "tft_drivers/ili9341/s4p/setxy.h"
+#endif
+#ifndef DISABLE_ILI9341_S5P
+ #include "tft_drivers/ili9341/s5p/setxy.h"
+#endif
+#ifndef DISABLE_R61581
+ #include "tft_drivers/r61581/setxy.h"
+#endif
+#ifndef DISABLE_ILI9486
+ #include "tft_drivers/ili9486/setxy.h"
+#endif
+#ifndef DISABLE_CPLD
+ #include "tft_drivers/cpld/setxy.h"
+#endif
+#ifndef DISABLE_HX8353C
+ #include "tft_drivers/hx8353c/setxy.h"
+#endif
+ }
+}
+
+void UTFT::clrXY()
+{
+ if (orient==PORTRAIT)
+ setXY(0,0,disp_x_size,disp_y_size);
+ else
+ setXY(0,0,disp_y_size,disp_x_size);
+}
+
+void UTFT::drawRect(int x1, int y1, int x2, int y2)
+{
+ if (x1>x2)
+ {
+ swap(int, x1, x2);
+ }
+ if (y1>y2)
+ {
+ swap(int, y1, y2);
+ }
+
+ drawHLine(x1, y1, x2-x1);
+ drawHLine(x1, y2, x2-x1);
+ drawVLine(x1, y1, y2-y1);
+ drawVLine(x2, y1, y2-y1);
+}
+
+void UTFT::drawRoundRect(int x1, int y1, int x2, int y2)
+{
+ if (x1>x2)
+ {
+ swap(int, x1, x2);
+ }
+ if (y1>y2)
+ {
+ swap(int, y1, y2);
+ }
+ if ((x2-x1)>4 && (y2-y1)>4)
+ {
+ drawPixel(x1+1,y1+1);
+ drawPixel(x2-1,y1+1);
+ drawPixel(x1+1,y2-1);
+ drawPixel(x2-1,y2-1);
+ drawHLine(x1+2, y1, x2-x1-4);
+ drawHLine(x1+2, y2, x2-x1-4);
+ drawVLine(x1, y1+2, y2-y1-4);
+ drawVLine(x2, y1+2, y2-y1-4);
+ }
+}
+
+void UTFT::fillRect(int x1, int y1, int x2, int y2)
+{
+ if (x1>x2)
+ {
+ swap(int, x1, x2);
+ }
+ if (y1>y2)
+ {
+ swap(int, y1, y2);
+ }
+ if (display_transfer_mode==16)
+ {
+ cbi(P_CS, B_CS);
+ setXY(x1, y1, x2, y2);
+ sbi(P_RS, B_RS);
+ _fast_fill_16(fch,fcl,((long(x2-x1)+1)*(long(y2-y1)+1)));
+ sbi(P_CS, B_CS);
+ }
+ else if ((display_transfer_mode==8) and (fch==fcl))
+ {
+ cbi(P_CS, B_CS);
+ setXY(x1, y1, x2, y2);
+ sbi(P_RS, B_RS);
+ _fast_fill_8(fch,((long(x2-x1)+1)*(long(y2-y1)+1)));
+ sbi(P_CS, B_CS);
+ }
+ else
+ {
+ if (orient==PORTRAIT)
+ {
+ for (int i=0; i<((y2-y1)/2)+1; i++)
+ {
+ drawHLine(x1, y1+i, x2-x1);
+ drawHLine(x1, y2-i, x2-x1);
+ }
+ }
+ else
+ {
+ for (int i=0; i<((x2-x1)/2)+1; i++)
+ {
+ drawVLine(x1+i, y1, y2-y1);
+ drawVLine(x2-i, y1, y2-y1);
+ }
+ }
+ }
+}
+
+void UTFT::fillRoundRect(int x1, int y1, int x2, int y2)
+{
+ if (x1>x2)
+ {
+ swap(int, x1, x2);
+ }
+ if (y1>y2)
+ {
+ swap(int, y1, y2);
+ }
+
+ if ((x2-x1)>4 && (y2-y1)>4)
+ {
+ for (int i=0; i<((y2-y1)/2)+1; i++)
+ {
+ switch(i)
+ {
+ case 0:
+ drawHLine(x1+2, y1+i, x2-x1-4);
+ drawHLine(x1+2, y2-i, x2-x1-4);
+ break;
+ case 1:
+ drawHLine(x1+1, y1+i, x2-x1-2);
+ drawHLine(x1+1, y2-i, x2-x1-2);
+ break;
+ default:
+ drawHLine(x1, y1+i, x2-x1);
+ drawHLine(x1, y2-i, x2-x1);
+ }
+ }
+ }
+}
+
+void UTFT::drawCircle(int x, int y, int radius)
+{
+ int f = 1 - radius;
+ int ddF_x = 1;
+ int ddF_y = -2 * radius;
+ int x1 = 0;
+ int y1 = radius;
+
+ cbi(P_CS, B_CS);
+ setXY(x, y + radius, x, y + radius);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x, y - radius, x, y - radius);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x + radius, y, x + radius, y);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x - radius, y, x - radius, y);
+ LCD_Write_DATA(fch,fcl);
+
+ while(x1 < y1)
+ {
+ if(f >= 0)
+ {
+ y1--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x1++;
+ ddF_x += 2;
+ f += ddF_x;
+ setXY(x + x1, y + y1, x + x1, y + y1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x - x1, y + y1, x - x1, y + y1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x + x1, y - y1, x + x1, y - y1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x - x1, y - y1, x - x1, y - y1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x + y1, y + x1, x + y1, y + x1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x - y1, y + x1, x - y1, y + x1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x + y1, y - x1, x + y1, y - x1);
+ LCD_Write_DATA(fch,fcl);
+ setXY(x - y1, y - x1, x - y1, y - x1);
+ LCD_Write_DATA(fch,fcl);
+ }
+ sbi(P_CS, B_CS);
+ clrXY();
+}
+
+void UTFT::fillCircle(int x, int y, int radius)
+{
+ for(int y1=-radius; y1<=0; y1++)
+ for(int x1=-radius; x1<=0; x1++)
+ if(x1*x1+y1*y1 <= radius*radius)
+ {
+ drawHLine(x+x1, y+y1, 2*(-x1));
+ drawHLine(x+x1, y-y1, 2*(-x1));
+ break;
+ }
+}
+
+void UTFT::clrScr()
+{
+ long i;
+
+ cbi(P_CS, B_CS);
+ clrXY();
+ if (display_transfer_mode!=1)
+ sbi(P_RS, B_RS);
+ if (display_transfer_mode==16)
+ _fast_fill_16(0,0,((disp_x_size+1)*(disp_y_size+1)));
+ else if (display_transfer_mode==8)
+ _fast_fill_8(0,((disp_x_size+1)*(disp_y_size+1)));
+ else
+ {
+ for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++)
+ {
+ if (display_transfer_mode!=1)
+ LCD_Writ_Bus(0,0,display_transfer_mode);
+ else
+ {
+ LCD_Writ_Bus(1,0,display_transfer_mode);
+ LCD_Writ_Bus(1,0,display_transfer_mode);
+ }
+ }
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::fillScr(byte r, byte g, byte b)
+{
+ word color = ((r&248)<<8 | (g&252)<<3 | (b&248)>>3);
+ fillScr(color);
+}
+
+void UTFT::fillScr(word color)
+{
+ long i;
+ char ch, cl;
+
+ ch=byte(color>>8);
+ cl=byte(color & 0xFF);
+
+ cbi(P_CS, B_CS);
+ clrXY();
+ if (display_transfer_mode!=1)
+ sbi(P_RS, B_RS);
+ if (display_transfer_mode==16)
+ _fast_fill_16(ch,cl,((disp_x_size+1)*(disp_y_size+1)));
+ else if ((display_transfer_mode==8) and (ch==cl))
+ _fast_fill_8(ch,((disp_x_size+1)*(disp_y_size+1)));
+ else
+ {
+ for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++)
+ {
+ if (display_transfer_mode!=1)
+ LCD_Writ_Bus(ch,cl,display_transfer_mode);
+ else
+ {
+ LCD_Writ_Bus(1,ch,display_transfer_mode);
+ LCD_Writ_Bus(1,cl,display_transfer_mode);
+ }
+ }
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::setColor(byte r, byte g, byte b)
+{
+ fch=((r&248)|g>>5);
+ fcl=((g&28)<<3|b>>3);
+}
+
+void UTFT::setColor(word color)
+{
+ fch=byte(color>>8);
+ fcl=byte(color & 0xFF);
+}
+
+word UTFT::getColor()
+{
+ return (fch<<8) | fcl;
+}
+
+void UTFT::setBackColor(byte r, byte g, byte b)
+{
+ bch=((r&248)|g>>5);
+ bcl=((g&28)<<3|b>>3);
+ _transparent=false;
+}
+
+void UTFT::setBackColor(uint32_t color)
+{
+ if (color==VGA_TRANSPARENT)
+ _transparent=true;
+ else
+ {
+ bch=byte(color>>8);
+ bcl=byte(color & 0xFF);
+ _transparent=false;
+ }
+}
+
+word UTFT::getBackColor()
+{
+ return (bch<<8) | bcl;
+}
+
+void UTFT::setPixel(word color)
+{
+ LCD_Write_DATA((color>>8),(color&0xFF)); // rrrrrggggggbbbbb
+}
+
+void UTFT::drawPixel(int x, int y)
+{
+ cbi(P_CS, B_CS);
+ setXY(x, y, x, y);
+ setPixel((fch<<8)|fcl);
+ sbi(P_CS, B_CS);
+ clrXY();
+}
+
+void UTFT::drawLine(int x1, int y1, int x2, int y2)
+{
+ if (y1==y2)
+ drawHLine(x1, y1, x2-x1);
+ else if (x1==x2)
+ drawVLine(x1, y1, y2-y1);
+ else
+ {
+ unsigned int dx = (x2 > x1 ? x2 - x1 : x1 - x2);
+ short xstep = x2 > x1 ? 1 : -1;
+ unsigned int dy = (y2 > y1 ? y2 - y1 : y1 - y2);
+ short ystep = y2 > y1 ? 1 : -1;
+ int col = x1, row = y1;
+
+ cbi(P_CS, B_CS);
+ if (dx < dy)
+ {
+ int t = - (dy >> 1);
+ while (true)
+ {
+ setXY (col, row, col, row);
+ LCD_Write_DATA (fch, fcl);
+ if (row == y2)
+ return;
+ row += ystep;
+ t += dx;
+ if (t >= 0)
+ {
+ col += xstep;
+ t -= dy;
+ }
+ }
+ }
+ else
+ {
+ int t = - (dx >> 1);
+ while (true)
+ {
+ setXY (col, row, col, row);
+ LCD_Write_DATA (fch, fcl);
+ if (col == x2)
+ return;
+ col += xstep;
+ t += dy;
+ if (t >= 0)
+ {
+ row += ystep;
+ t -= dx;
+ }
+ }
+ }
+ sbi(P_CS, B_CS);
+ }
+ clrXY();
+}
+
+void UTFT::drawHLine(int x, int y, int l)
+{
+ if (l<0)
+ {
+ l = -l;
+ x -= l;
+ }
+ cbi(P_CS, B_CS);
+ setXY(x, y, x+l, y);
+ if (display_transfer_mode == 16)
+ {
+ sbi(P_RS, B_RS);
+ _fast_fill_16(fch,fcl,l);
+ }
+ else if ((display_transfer_mode==8) and (fch==fcl))
+ {
+ sbi(P_RS, B_RS);
+ _fast_fill_8(fch,l);
+ }
+ else
+ {
+ for (int i=0; i=0; zz--)
+ {
+ ch=pgm_read_byte(&cfont.font[temp+zz]);
+ for(i=0;i<8;i++)
+ {
+ if((ch&(1<0)
+ {
+ buf[c]=48+(num % 10);
+ c++;
+ num=(num-(num % 10))/10;
+ }
+ buf[c]=0;
+
+ if (neg)
+ {
+ st[0]=45;
+ }
+
+ if (length>(c+neg))
+ {
+ for (int i=0; i<(length-c-neg); i++)
+ {
+ st[i+neg]=filler;
+ f++;
+ }
+ }
+
+ for (int i=0; i5)
+ dec=5;
+
+ if (num<0)
+ neg = true;
+
+ _convert_float(st, num, length, dec);
+
+ if (divider != '.')
+ {
+ for (int i=0; i>8,col & 0xff);
+ }
+ sbi(P_CS, B_CS);
+ }
+ else
+ {
+ cbi(P_CS, B_CS);
+ for (ty=0; ty=0; tx--)
+ {
+ col=pgm_read_word(&data[(ty*sx)+tx]);
+ LCD_Write_DATA(col>>8,col & 0xff);
+ }
+ }
+ sbi(P_CS, B_CS);
+ }
+ }
+ else
+ {
+ if (orient==PORTRAIT)
+ {
+ cbi(P_CS, B_CS);
+ for (ty=0; ty>8,col & 0xff);
+ }
+ }
+ sbi(P_CS, B_CS);
+ }
+ else
+ {
+ cbi(P_CS, B_CS);
+ for (ty=0; ty=0; tx--)
+ {
+ col=pgm_read_word(&data[(ty*sx)+tx]);
+ for (tsx=0; tsx>8,col & 0xff);
+ }
+ }
+ }
+ sbi(P_CS, B_CS);
+ }
+ }
+ clrXY();
+}
+
+void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy)
+{
+ unsigned int col;
+ int tx, ty, newx, newy;
+ double radian;
+ radian=deg*0.0175;
+
+ if (deg==0)
+ drawBitmap(x, y, sx, sy, data);
+ else
+ {
+ cbi(P_CS, B_CS);
+ for (ty=0; ty>8,col & 0xff);
+ }
+ sbi(P_CS, B_CS);
+ }
+ clrXY();
+}
+
+void UTFT::lcdOff()
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case PCF8833:
+ LCD_Write_COM(0x28);
+ break;
+ case CPLD:
+ LCD_Write_COM_DATA(0x01,0x0000);
+ LCD_Write_COM(0x0F);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::lcdOn()
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case PCF8833:
+ LCD_Write_COM(0x29);
+ break;
+ case CPLD:
+ LCD_Write_COM_DATA(0x01,0x0010);
+ LCD_Write_COM(0x0F);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::setContrast(char c)
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case PCF8833:
+ if (c>64) c=64;
+ LCD_Write_COM(0x25);
+ LCD_Write_DATA(c);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
+
+int UTFT::getDisplayXSize()
+{
+ if (orient==PORTRAIT)
+ return disp_x_size+1;
+ else
+ return disp_y_size+1;
+}
+
+int UTFT::getDisplayYSize()
+{
+ if (orient==PORTRAIT)
+ return disp_y_size+1;
+ else
+ return disp_x_size+1;
+}
+
+void UTFT::setBrightness(byte br)
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case CPLD:
+ if (br>16) br=16;
+ LCD_Write_COM_DATA(0x01,br);
+ LCD_Write_COM(0x0F);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::setDisplayPage(byte page)
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case CPLD:
+ if (page>7) page=7;
+ LCD_Write_COM_DATA(0x04,page);
+ LCD_Write_COM(0x0F);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
+
+void UTFT::setWritePage(byte page)
+{
+ cbi(P_CS, B_CS);
+ switch (display_model)
+ {
+ case CPLD:
+ if (page>7) page=7;
+ LCD_Write_COM_DATA(0x05,page);
+ LCD_Write_COM(0x0F);
+ break;
+ }
+ sbi(P_CS, B_CS);
+}
diff --git a/libraries/UTFT/UTFT.h b/libraries/UTFT/UTFT.h
new file mode 100644
index 0000000..c863311
--- /dev/null
+++ b/libraries/UTFT/UTFT.h
@@ -0,0 +1,275 @@
+/*
+ UTFT.h - Arduino/chipKit library support for Color TFT LCD Boards
+ Copyright (C)2010-2014 Henning Karlsen. All right reserved
+
+ This library is the continuation of my ITDB02_Graph, ITDB02_Graph16
+ and RGB_GLCD libraries for Arduino and chipKit. As the number of
+ supported display modules and controllers started to increase I felt
+ it was time to make a single, universal library as it will be much
+ easier to maintain in the future.
+
+ Basic functionality of this library was origianlly based on the
+ demo-code provided by ITead studio (for the ITDB02 modules) and
+ NKC Electronics (for the RGB GLCD module/shield).
+
+ This library supports a number of 8bit, 16bit and serial graphic
+ displays, and will work with both Arduino and chipKit boards. For a
+ full list of tested display modules and controllers, see the
+ document UTFT_Supported_display_modules_&_controllers.pdf.
+
+ When using 8bit and 16bit display modules there are some
+ requirements you must adhere to. These requirements can be found
+ in the document UTFT_Requirements.pdf.
+ There are no special requirements when using serial displays.
+
+ You can always find the latest version of the library at
+ http://electronics.henningkarlsen.com/
+
+ If you make any modifications or improvements to the code, I would
+ appreciate that you share the code with me so that I might include
+ it in the next release. I can be contacted through
+ http://electronics.henningkarlsen.com/contact.php.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the CC BY-NC-SA 3.0 license.
+ Please see the included documents for further information.
+
+ Commercial use of this library requires you to buy a license that
+ will allow commercial use. This includes using the library,
+ modified or not, as a tool to sell products.
+
+ The license applies to all part of the library including the
+ examples and tools supplied with the library.
+*/
+
+#ifndef UTFT_h
+#define UTFT_h
+
+#define UTFT_VERSION 278
+
+#define LEFT 0
+#define RIGHT 9999
+#define CENTER 9998
+
+#define PORTRAIT 0
+#define LANDSCAPE 1
+
+#define HX8347A 0
+#define ILI9327 1
+#define SSD1289 2
+#define ILI9325C 3
+#define ILI9325D_8 4
+#define ILI9325D_16 5
+#define HX8340B_8 6
+#define HX8340B_S 7
+#define HX8352A 8
+#define ST7735 9
+#define PCF8833 10
+#define S1D19122 11
+#define SSD1963_480 12
+#define SSD1963_800 13
+#define S6D1121_8 14
+#define S6D1121_16 15
+#define SSD1289LATCHED 16
+#define ILI9320_8 17
+#define ILI9320_16 18
+#define SSD1289_8 19
+#define SSD1963_800ALT 20
+#define ILI9481 21
+#define ILI9325D_16ALT 22
+#define S6D0164 23
+#define ST7735S 24
+#define ILI9341_S5P 25
+#define ILI9341_S4P 26
+#define R61581 27
+#define ILI9486 28
+#define CPLD 29
+#define HX8353C 30
+
+#define ITDB32 0 // HX8347-A (16bit)
+#define ITDB32WC 1 // ILI9327 (16bit)
+#define TFT01_32W 1 // ILI9327 (16bit)
+#define ITDB32S 2 // SSD1289 (16bit)
+#define TFT01_32 2 // SSD1289 (16bit)
+#define CTE32 2 // SSD1289 (16bit)
+#define GEEE32 2 // SSD1289 (16bit)
+#define ITDB24 3 // ILI9325C (8bit)
+#define ITDB24D 4 // ILI9325D (8bit)
+#define ITDB24DWOT 4 // ILI9325D (8bit)
+#define ITDB28 4 // ILI9325D (8bit)
+#define TFT01_24_8 4 // ILI9325D (8bit)
+#define DMTFT24104 4 // ILI9325D (8bit)
+#define DMTFT28103 4 // ILI9325D (8bit)
+#define TFT01_24_16 5 // ILI9325D (16bit)
+#define ITDB22 6 // HX8340-B (8bit)
+#define GEEE22 6 // HX8340-B (8bit)
+#define ITDB22SP 7 // HX8340-B (Serial 4Pin)
+#define ITDB32WD 8 // HX8352-A (16bit)
+#define TFT01_32WD 8 // HX8352-A (16bit)
+#define CTE32W 8 // HX8352-A (16bit)
+#define ITDB18SP 9 // ST7735 (Serial 5Pin)
+#define LPH9135 10 // PCF8833 (Serial 5Pin)
+#define ITDB25H 11 // S1D19122 (16bit)
+#define ITDB43 12 // SSD1963 (16bit) 480x272
+#define TFT01_43 12 // SSD1963 (16bit) 480x272
+#define ITDB50 13 // SSD1963 (16bit) 800x480
+#define TFT01_50 13 // SSD1963 (16bit) 800x480
+#define CTE50 13 // SSD1963 (16bit) 800x480
+#define EHOUSE50 13 // SSD1963 (16bit) 800x480
+#define ITDB24E_8 14 // S6D1121 (8bit)
+#define TFT01_24R2 14 // S6D1121 (8bit)
+#define ITDB24E_16 15 // S6D1121 (16bit)
+#define INFINIT32 16 // SSD1289 (Latched 16bit) -- Legacy, will be removed later
+#define ELEE32_REVA 16 // SSD1289 (Latched 16bit)
+#define GEEE24 17 // ILI9320 (8bit)
+#define GEEE28 18 // ILI9320 (16bit)
+#define ELEE32_REVB 19 // SSD1289 (8bit)
+#define TFT01_70 20 // SSD1963 (16bit) 800x480 Alternative Init
+#define CTE70 20 // SSD1963 (16bit) 800x480 Alternative Init
+#define EHOUSE70 20 // SSD1963 (16bit) 800x480 Alternative Init
+#define CTE32HR 21 // ILI9481 (16bit)
+#define CTE28 22 // ILI9325D (16bit) Alternative Init
+#define TFT01_28 22 // ILI9325D (16bit) Alternative Init
+#define CTE22 23 // S6D0164 (8bit)
+#define TFT01_22 23 // S6D0164 (8bit)
+#define DMTFT22102 23 // S6D0164 (8bit)
+#define TFT01_18SP 24 // ST7735S (Serial 5Pin)
+#define TFT01_22SP 25 // ILI9341 (Serial 5Pin)
+#define DMTFT28105 25 // ILI9341 (Serial 5Pin)
+#define MI0283QT9 26 // ILI9341 (Serial 4Pin)
+#define CTE35IPS 27 // R61581 (16bit)
+#define CTE40 28 // ILI9486 (16bit)
+#define EHOUSE50CPLD 29 // CPLD (16bit)
+#define CTE50CPLD 29 // CPLD (16bit)
+#define CTE70CPLD 29 // CPLD (16bit)
+#define DMTFT18101 30 // HX8353C (Serial 5Pin)
+
+
+#define SERIAL_4PIN 4
+#define SERIAL_5PIN 5
+#define LATCHED_16 17
+
+#define NOTINUSE 255
+
+//*********************************
+// COLORS
+//*********************************
+// VGA color palette
+#define VGA_BLACK 0x0000
+#define VGA_WHITE 0xFFFF
+#define VGA_RED 0xF800
+#define VGA_GREEN 0x0400
+#define VGA_BLUE 0x001F
+#define VGA_SILVER 0xC618
+#define VGA_GRAY 0x8410
+#define VGA_MAROON 0x8000
+#define VGA_YELLOW 0xFFE0
+#define VGA_OLIVE 0x8400
+#define VGA_LIME 0x07E0
+#define VGA_AQUA 0x07FF
+#define VGA_TEAL 0x0410
+#define VGA_NAVY 0x0010
+#define VGA_FUCHSIA 0xF81F
+#define VGA_PURPLE 0x8010
+#define VGA_TRANSPARENT 0xFFFFFFFF
+
+#if defined(__AVR__)
+ #include "Arduino.h"
+ #include "hardware/avr/HW_AVR_defines.h"
+#elif defined(__PIC32MX__)
+ #include "WProgram.h"
+ #include "hardware/pic32/HW_PIC32_defines.h"
+#elif defined(__arm__)
+ #include "Arduino.h"
+ #include "hardware/arm/HW_ARM_defines.h"
+#endif
+
+struct _current_font
+{
+ uint8_t* font;
+ uint8_t x_size;
+ uint8_t y_size;
+ uint8_t offset;
+ uint8_t numchars;
+};
+
+class UTFT
+{
+ public:
+ UTFT();
+ UTFT(byte model, int RS, int WR, int CS, int RST, int SER=0);
+ void InitLCD(byte orientation=LANDSCAPE);
+ void clrScr();
+ void drawPixel(int x, int y);
+ void drawLine(int x1, int y1, int x2, int y2);
+ void fillScr(byte r, byte g, byte b);
+ void fillScr(word color);
+ void drawRect(int x1, int y1, int x2, int y2);
+ void drawRoundRect(int x1, int y1, int x2, int y2);
+ void fillRect(int x1, int y1, int x2, int y2);
+ void fillRoundRect(int x1, int y1, int x2, int y2);
+ void drawCircle(int x, int y, int radius);
+ void fillCircle(int x, int y, int radius);
+ void setColor(byte r, byte g, byte b);
+ void setColor(word color);
+ word getColor();
+ void setBackColor(byte r, byte g, byte b);
+ void setBackColor(uint32_t color);
+ word getBackColor();
+ void print(char *st, int x, int y, int deg=0);
+ void print(String st, int x, int y, int deg=0);
+ void printNumI(long num, int x, int y, int length=0, char filler=' ');
+ void printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ');
+ void setFont(uint8_t* font);
+ uint8_t* getFont();
+ uint8_t getFontXsize();
+ uint8_t getFontYsize();
+ void drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int scale=1);
+ void drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy);
+ void lcdOff();
+ void lcdOn();
+ void setContrast(char c);
+ int getDisplayXSize();
+ int getDisplayYSize();
+ void setBrightness(byte br);
+ void setDisplayPage(byte page);
+ void setWritePage(byte page);
+
+/*
+ The functions and variables below should not normally be used.
+ They have been left publicly available for use in add-on libraries
+ that might need access to the lower level functions of UTFT.
+
+ Please note that these functions and variables are not documented
+ and I do not provide support on how to use them.
+*/
+ byte fch, fcl, bch, bcl;
+ byte orient;
+ long disp_x_size, disp_y_size;
+ byte display_model, display_transfer_mode, display_serial_mode;
+ regtype *P_RS, *P_WR, *P_CS, *P_RST, *P_SDA, *P_SCL, *P_ALE;
+ regsize B_RS, B_WR, B_CS, B_RST, B_SDA, B_SCL, B_ALE;
+ byte __p1, __p2, __p3, __p4, __p5;
+ _current_font cfont;
+ boolean _transparent;
+
+ void LCD_Writ_Bus(char VH,char VL, byte mode);
+ void LCD_Write_COM(char VL);
+ void LCD_Write_DATA(char VH,char VL);
+ void LCD_Write_DATA(char VL);
+ void LCD_Write_COM_DATA(char com1,int dat1);
+ void _hw_special_init();
+ void setPixel(word color);
+ void drawHLine(int x, int y, int l);
+ void drawVLine(int x, int y, int l);
+ void printChar(byte c, int x, int y);
+ void setXY(word x1, word y1, word x2, word y2);
+ void clrXY();
+ void rotateChar(byte c, int x, int y, int pos, int deg);
+ void _set_direction_registers(byte mode);
+ void _fast_fill_16(int ch, int cl, long pix);
+ void _fast_fill_8(int ch, long pix);
+ void _convert_float(char *buf, double num, int width, byte prec);
+};
+
+#endif
\ No newline at end of file
diff --git a/libraries/UTFT/UTFT.pdf b/libraries/UTFT/UTFT.pdf
new file mode 100644
index 0000000..dc580fd
Binary files /dev/null and b/libraries/UTFT/UTFT.pdf differ
diff --git a/libraries/UTFT/UTFT_Requirements.pdf b/libraries/UTFT/UTFT_Requirements.pdf
new file mode 100644
index 0000000..c21d73c
Binary files /dev/null and b/libraries/UTFT/UTFT_Requirements.pdf differ
diff --git a/libraries/UTFT/UTFT_Supported_display_modules_&_controllers.pdf b/libraries/UTFT/UTFT_Supported_display_modules_&_controllers.pdf
new file mode 100644
index 0000000..9bb7cac
Binary files /dev/null and b/libraries/UTFT/UTFT_Supported_display_modules_&_controllers.pdf differ
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/UTFT_Bitmap.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/UTFT_Bitmap.ino
new file mode 100644
index 0000000..1f3ef33
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/UTFT_Bitmap.ino
@@ -0,0 +1,66 @@
+// UTFT_Bitmap (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the drawBitmap()-function.
+//
+// This demo was made to work on the 320x240 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32S,38,39,40,41);
+
+extern unsigned short info[0x400];
+extern unsigned short icon[0x400];
+extern unsigned short tux[0x400];
+
+void setup()
+{
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.print(" *** A 10 by 7 grid of a 32x32 icon *** ", CENTER, 228);
+ for (int x=0; x<10; x++)
+ for (int y=0; y<7; y++)
+ myGLCD.drawBitmap (x*32, y*32, 32, 32, info);
+
+ delay(5000);
+
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.print(" Two different icons in scale 1 to 4 ", CENTER, 228);
+ int x=0;
+ for (int s=0; s<4; s++)
+ {
+ x+=(s*32);
+ myGLCD.drawBitmap (x, 0, 32, 32, tux, s+1);
+ }
+ x=0;
+ for (int s=4; s>0; s--)
+ {
+ myGLCD.drawBitmap (x, 224-(s*32), 32, 32, icon, s);
+ x+=(s*32);
+ }
+
+ delay(5000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/icon.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/icon.c
new file mode 100644
index 0000000..9cb97a1
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/icon.c
@@ -0,0 +1,71 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: taskmgr.png
+// Time generated: 11.10.2010 22:51:23
+// Size : 2Â 048 Bytes
+
+const unsigned short icon[0x400] ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE79, 0xBDD7, 0xAD75, // 0x0010 (16)
+0xAD55, 0xAD75, 0xBDF7, 0xD6BA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x9492, 0x8C51, 0x9492, 0xA514, 0xA534, // 0x0030 (48)
+0xA534, 0xA534, 0x9CF3, 0x8C71, 0x8430, 0x9CD3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x8410, 0x9492, 0xB5B6, 0xC618, 0xBDD7, 0xAD75, 0xA514, // 0x0050 (80)
+0xA514, 0xA4F4, 0xAD55, 0xB5B6, 0xBDD7, 0xAD55, 0x8430, 0x8C71, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9CD3, 0x8430, 0xBDF7, 0xC618, 0xAD75, 0x94F2, 0x8CF1, 0x84B0, 0x8CD1, // 0x0070 (112)
+0x9612, 0x8CB1, 0x7C6F, 0x7C8F, 0x8490, 0xA533, 0xBDF7, 0xB596, 0x7BEF, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8430, 0x9CF3, 0xCE39, 0xA514, 0x94B2, 0x9E93, 0x94F2, 0x8CD1, 0x8CB1, 0x9D12, // 0x0090 (144)
+0x9F74, 0x9D52, 0x8450, 0x7C8F, 0x73AE, 0x740E, 0x73CE, 0x9CD3, 0xC638, 0x8C51, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x8430, 0xA534, 0xBDF7, 0x8CB1, 0x8C31, 0x9DB3, 0xA735, 0x9D13, 0x8CB1, 0x8C71, 0x9D13, // 0x00B0 (176)
+0xB756, 0xA5D4, 0x8C71, 0x8490, 0x8390, 0x7C70, 0x73EE, 0x6B4D, 0x8450, 0xBDF7, 0x8C71, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x94B2, 0x9CF3, 0xBDD7, 0x8490, 0x8CF1, 0x9D72, 0xA694, 0xAE94, 0x9DD3, 0xA593, 0xA553, 0x9592, // 0x00D0 (208)
+0x9672, 0x75CE, 0x5BAA, 0x64EB, 0x5D8C, 0x5BCA, 0x4B69, 0x634C, 0x748D, 0x7C4F, 0xBE18, 0x8430, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x8410, 0xBDF7, 0x8410, 0x83F0, 0x94F2, 0x9613, 0x9D13, 0xAE55, 0x9D12, 0x750E, 0x55CB, 0x4BC8, // 0x00F0 (240)
+0x4447, 0x3BC6, 0x4B67, 0x44E8, 0x3CE8, 0x3325, 0x20E2, 0x2B45, 0x43E7, 0x3946, 0x732D, 0xC5F8, 0x7BCF, 0xE71C, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xF7BE, 0x7BEF, 0xBDB6, 0x9533, 0x8D71, 0x9552, 0x9E73, 0x9DD3, 0x94B2, 0x6D6D, 0x4BA8, 0x44A8, 0x55EA, 0x5D2A, // 0x0110 (272)
+0x43E7, 0x4327, 0x46CA, 0x4B87, 0x42C6, 0x4E0A, 0x4D09, 0x4468, 0x4548, 0x3386, 0x2B25, 0x7C6F, 0xAD35, 0x9492, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFDF, 0xFFFF, 0xBDD7, 0x8C71, 0xAD75, 0x8CF0, 0x8D71, 0x8D51, 0x9DF3, 0x740E, 0x21C4, 0x33E5, 0x558A, 0x554A, 0x650A, 0x566B, // 0x0130 (304)
+0x43E7, 0x21C3, 0x3345, 0x2283, 0x1962, 0x3C87, 0x3386, 0x2163, 0x3345, 0x3346, 0x33A6, 0x32C6, 0x9CB3, 0x7BEF, 0xDEDB, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0x8430, 0xAD75, 0x8C31, 0x7C0F, 0x7BCF, 0x83F0, 0x636B, 0x0000, 0x0000, 0x4387, 0x462A, 0x4B27, 0x4B88, 0x4E8B, // 0x0150 (336)
+0x42E6, 0x0000, 0x0020, 0x0100, 0x0000, 0x1121, 0x0040, 0x0000, 0x0941, 0x0000, 0x0020, 0x00E0, 0x5AAB, 0x94B2, 0x9CD3, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xE71C, 0x8410, 0xB596, 0x7BEF, 0x7C6F, 0x84B0, 0x5B6B, 0x09E1, 0x0901, 0x1161, 0x3C06, 0x3D89, 0x32C5, 0x43E7, 0x470B, // 0x0170 (368)
+0x4BC7, 0x0961, 0x11E2, 0x1282, 0x0961, 0x1262, 0x09E2, 0x0961, 0x12A2, 0x0961, 0x09C2, 0x0A01, 0x29E5, 0xA514, 0x7BEF, 0xFFDF, // 0x0180 (384)
+0xFFFF, 0xBDD7, 0x9472, 0xA514, 0x6B4D, 0x7C6F, 0x634C, 0x0040, 0x0981, 0x0060, 0x00E0, 0x11E2, 0x10A1, 0x09C1, 0x19E3, 0x2B25, // 0x0190 (400)
+0x22A3, 0x0060, 0x0120, 0x09E1, 0x0060, 0x09E1, 0x0120, 0x0060, 0x0A21, 0x0060, 0x0100, 0x01A0, 0x0040, 0x9CD3, 0x7BEF, 0xDEDB, // 0x01A0 (416)
+0xFFFF, 0xA514, 0x9CF3, 0xB596, 0x73AE, 0x7C0F, 0x2945, 0x10A2, 0x2184, 0x18C3, 0x1923, 0x2184, 0x18C3, 0x21A4, 0x2964, 0x2905, // 0x01B0 (432)
+0x2A25, 0x2104, 0x2965, 0x2A05, 0x2104, 0x2A05, 0x2985, 0x2104, 0x2A25, 0x2104, 0x2164, 0x29C4, 0x3166, 0xB5B6, 0x8410, 0xC618, // 0x01C0 (448)
+0xFFFF, 0x9492, 0xA514, 0xDEDB, 0xC618, 0xA514, 0x8C51, 0x94B2, 0x9CB3, 0x9CF3, 0xA514, 0xA534, 0xAD75, 0xAD75, 0xB596, 0xB5D6, // 0x01D0 (464)
+0xBDB7, 0xBDF7, 0xBDF7, 0xBDF7, 0xC618, 0xC5F8, 0xC5F8, 0xBDF7, 0xBDD7, 0xBDD7, 0xB5B6, 0xB596, 0xC638, 0xDEFB, 0x8430, 0xB596, // 0x01E0 (480)
+0xFFFF, 0x8C51, 0x9CF3, 0xE73C, 0xDEFB, 0xD69A, 0xD6BA, 0xD6BA, 0xDEDB, 0xDEDB, 0xDEFB, 0xDF1B, 0xE71C, 0xE73C, 0xE73C, 0xE73C, // 0x01F0 (496)
+0xEF5D, 0xEF5D, 0xEF5D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xDEFB, 0xE71C, 0x8C51, 0xAD75, // 0x0200 (512)
+0xFFFF, 0x8C71, 0x9CD3, 0xDEFB, 0xAD75, 0x9492, 0x9CD3, 0xA4F3, 0xA514, 0xAD55, 0xAD75, 0xB596, 0xBDB6, 0xBDD7, 0xC5F7, 0xC618, // 0x0210 (528)
+0xC638, 0xCE59, 0xCE59, 0xCE79, 0xD679, 0xD679, 0xCE79, 0xCE59, 0xCE59, 0xC638, 0xC618, 0xBDF7, 0xCE79, 0xE71C, 0x8C51, 0xB596, // 0x0220 (544)
+0xFFFF, 0x9CD3, 0x9492, 0xAD55, 0x2965, 0x2104, 0x2124, 0x2145, 0x1945, 0x2165, 0x2165, 0x2186, 0x2186, 0x29A6, 0x29A6, 0x31C7, // 0x0230 (560)
+0x39C7, 0x31E7, 0x31E7, 0x31E7, 0x3208, 0x3208, 0x31E7, 0x31E7, 0x29E7, 0x31C7, 0x39C7, 0x31A6, 0x4A49, 0xBDF7, 0x8C51, 0xBDF7, // 0x0240 (576)
+0xFFFF, 0xB5B6, 0x8430, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x2000, // 0x0250 (592)
+0x0000, 0x3000, 0x3800, 0x3000, 0x3800, 0x3800, 0x3800, 0x3000, 0x3800, 0x0800, 0x0000, 0x0000, 0x0000, 0xA514, 0x8430, 0xD6BA, // 0x0260 (608)
+0xFFFF, 0xDEDB, 0x7BCF, 0x8430, 0x0020, 0x0000, 0x0000, 0x8000, 0xC800, 0xC000, 0xC800, 0xC820, 0xC820, 0xC820, 0xD020, 0x9800, // 0x0270 (624)
+0x0000, 0xB820, 0xD020, 0xD020, 0xD020, 0xD020, 0xD020, 0xC820, 0xD020, 0x4800, 0x0000, 0x0000, 0x2144, 0xAD75, 0x8410, 0xF7BE, // 0x0280 (640)
+0xFFFF, 0xFFFF, 0x7BEF, 0x8C71, 0x2945, 0x0000, 0x0000, 0x6800, 0xA800, 0xA800, 0xA800, 0xA800, 0xA800, 0xA800, 0xB000, 0x8000, // 0x0290 (656)
+0x0000, 0x9800, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0x4000, 0x0000, 0x0000, 0x632C, 0xA534, 0x94B2, 0xFFFF, // 0x02A0 (672)
+0xFFDF, 0xFFFF, 0xAD75, 0x73AE, 0x632C, 0x0000, 0x0000, 0x6920, 0xA9E0, 0xA1C0, 0xA9E0, 0xA9E0, 0xA9E0, 0xA9E0, 0xA9E0, 0x7960, // 0x02B0 (688)
+0x0000, 0x99C0, 0xB200, 0xA9E0, 0xB200, 0xB200, 0xB1E0, 0xA9E0, 0xB200, 0x40C0, 0x0000, 0x1082, 0xAD75, 0x8410, 0xD69A, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xF79E, 0x630C, 0x8C51, 0x2965, 0x0000, 0x7400, 0xB620, 0xAE00, 0xB620, 0xB640, 0xB640, 0xB620, 0xB660, 0x84A0, // 0x02D0 (720)
+0x0000, 0xA5A0, 0xBE60, 0xB660, 0xBE60, 0xBE60, 0xB660, 0xB640, 0xBE80, 0x4260, 0x0000, 0x6B6D, 0xAD75, 0x8430, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFDF, 0xFFFF, 0xB5B6, 0x632C, 0x8410, 0x0021, 0x7360, 0xBD40, 0xB520, 0xBD40, 0xBD60, 0xBD60, 0xBD40, 0xC580, 0x8C00, // 0x02F0 (752)
+0x0000, 0xACE0, 0xC580, 0xC580, 0xC580, 0xC580, 0xC580, 0xBD60, 0xC5A0, 0x39C0, 0x2126, 0xBDF7, 0x73AE, 0xD6BA, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x7BEF, 0x630D, 0x4AE1, 0x6D21, 0x6D01, 0x6D21, 0x6D41, 0x6D41, 0x6D41, 0x6D61, 0x53E1, // 0x0310 (784)
+0x0000, 0x64C1, 0x7562, 0x6D62, 0x6D62, 0x6D62, 0x6D62, 0x6D42, 0x6D41, 0x4263, 0xA515, 0x8C51, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x6B4D, 0x8410, 0x636E, 0x04A6, 0x05E5, 0x05C5, 0x0585, 0x0585, 0x0586, 0x05A6, 0x0424, // 0x0330 (816)
+0x0000, 0x0505, 0x05C6, 0x05A6, 0x05A6, 0x05C7, 0x0606, 0x0606, 0x1CE9, 0xA535, 0x9492, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x6B4D, 0x83EF, 0x9411, 0x3A47, 0x0403, 0x0584, 0x05A4, 0x0585, 0x0585, 0x0404, // 0x0350 (848)
+0x0000, 0x04E5, 0x05A5, 0x05A5, 0x05C5, 0x0584, 0x1405, 0x634B, 0xBD76, 0x8C51, 0x8C51, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8410, 0x6B6D, 0x9CB3, 0x7C6F, 0x3CA9, 0x0BE4, 0x0443, 0x0504, 0x03C2, // 0x0370 (880)
+0x0000, 0x0483, 0x0504, 0x0444, 0x1426, 0x552D, 0xA554, 0xB576, 0x73CE, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x6B4D, 0x7BAF, 0x9432, 0x8BD1, 0x6BCE, 0x4C6B, 0x3C09, // 0x0390 (912)
+0x3186, 0x3C8A, 0x5C8C, 0x8430, 0xA493, 0xACD4, 0x8410, 0x7BEF, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xAD75, 0x7BEF, 0x73AE, 0x83F0, 0x8C11, 0x9431, // 0x03B0 (944)
+0x9492, 0x9452, 0x9432, 0x8430, 0x7BEF, 0x8450, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xBDD7, 0xA534, 0x94D3, // 0x03D0 (976)
+0x94B2, 0x9CF3, 0xA554, 0xC618, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/info.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/info.c
new file mode 100644
index 0000000..312bee1
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/info.c
@@ -0,0 +1,71 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: info.png
+// Time generated: 11.10.2010 22:27:55
+// Size : 2Â 048 Bytes
+
+const unsigned short info[0x400] ={
+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, 0xEF9F, 0xC69D, 0x95BB, 0x7D1A, 0x6CB9, // 0x0030 (48)
+0x6499, 0x74F9, 0x8D7A, 0xB63C, 0xE73E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAE1C, 0x4C18, 0x2B56, 0x3397, 0x4C38, 0x64B9, 0x751A, // 0x0050 (80)
+0x7D3A, 0x6CD9, 0x5458, 0x3BD7, 0x2B56, 0x3BB7, 0x855A, 0xE77E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA5FB, 0x2B56, 0x2B77, 0x751A, 0xB67C, 0xD73E, 0xE75E, 0xE77E, 0xE77E, // 0x0070 (112)
+0xE77E, 0xE77E, 0xE75E, 0xDF3E, 0xC6DD, 0x8D9B, 0x43D7, 0x1B16, 0x74D9, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9F, 0x4C18, 0x1AF6, 0x855A, 0xCEFE, 0xD71E, 0xCEFD, 0xC6DD, 0xC6BD, 0xC6BD, 0xBEBD, // 0x0090 (144)
+0xC6BD, 0xBEBD, 0xC6BD, 0xC6DD, 0xC6DD, 0xD71E, 0xD71E, 0xA61C, 0x33B7, 0x2316, 0xBE7C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF3E, 0x2336, 0x3BD7, 0xBE9D, 0xC6DD, 0xBE9D, 0xBE9D, 0xBE9D, 0xBEBD, 0xBE9D, 0xCEFD, 0xEF9F, // 0x00B0 (176)
+0xEF9F, 0xD73E, 0xBE9D, 0xBEBD, 0xBE9D, 0xBE9D, 0xB69D, 0xC6BD, 0xCEDD, 0x6CFA, 0x0295, 0x9DBB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xE75E, 0x1AF6, 0x4C58, 0xBEBD, 0xB67D, 0xAE5C, 0xB67D, 0xB67D, 0xB69D, 0xB67D, 0xBEBD, 0xF7DF, 0xFFFF, // 0x00D0 (208)
+0xFFFF, 0xFFFF, 0xCF1E, 0xB67D, 0xB67D, 0xB67D, 0xB67D, 0xAE5C, 0xAE5C, 0xC6BD, 0x857B, 0x0295, 0xA5DB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFDF, 0x3BB7, 0x33D8, 0xB67D, 0xA63C, 0xA63C, 0xAE5C, 0xAE5D, 0xAE5D, 0xAE7D, 0xA65D, 0xC6DD, 0xFFFF, 0xFFFF, // 0x00F0 (240)
+0xFFDF, 0xFFFF, 0xDF5E, 0xA65D, 0xAE7D, 0xAE5D, 0xAE5D, 0xAE5C, 0xA63C, 0xA61C, 0xB67D, 0x753A, 0x0295, 0xCEBC, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xF7DF, 0xFFFF, 0x957A, 0x12F6, 0x9E1C, 0x9E1C, 0x9E1C, 0x9E1C, 0xA63C, 0xA63C, 0xA63D, 0xA63D, 0xA65D, 0x9DFC, 0xDF3E, 0xFFFF, // 0x0110 (272)
+0xFFFF, 0xFFDF, 0xA61C, 0xA65D, 0xA65D, 0xA63D, 0xA63C, 0xA63C, 0x9E1C, 0x9E1C, 0x9DFC, 0xAE3C, 0x3C18, 0x3396, 0xFFDF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xF79F, 0x2336, 0x64DA, 0x9DFC, 0x95DC, 0x95FC, 0x95FC, 0x9E1C, 0x9E1C, 0x9E3D, 0x9E3D, 0x9E3D, 0x9E3D, 0x7D3B, 0xA63C, // 0x0130 (304)
+0xB6BD, 0x8DBB, 0x8DFC, 0xA65D, 0x9E3D, 0x9E3D, 0x9E1C, 0x9E1C, 0x95FC, 0x95FC, 0x95DC, 0x95DC, 0x8DBB, 0x0AF6, 0xA5DA, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xA5FB, 0x1337, 0x8DBB, 0x8DBB, 0x8DBC, 0x8DDC, 0x95FC, 0x95FC, 0x961C, 0x961D, 0x963D, 0x9E3D, 0x963D, 0xA67D, 0xB6BD, // 0x0150 (336)
+0xB6BD, 0xAE7D, 0x9E3D, 0x9E3D, 0x961D, 0x961D, 0x961C, 0x95FC, 0x95FC, 0x8DDC, 0x8DDC, 0x859B, 0x95DC, 0x3C18, 0x4BD7, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0x6499, 0x33F8, 0x8DBB, 0x859B, 0x85BC, 0x85BC, 0x8DDC, 0x8DFC, 0x8DFD, 0x8E1D, 0x961D, 0x961D, 0x9E3D, 0xF7BF, 0xFFFF, // 0x0170 (368)
+0xFFFF, 0xFFFF, 0xA67D, 0x8E1D, 0x961D, 0x8E1D, 0x8DFD, 0x8DFC, 0x8DDC, 0x85BC, 0x85BC, 0x859B, 0x859B, 0x5CDA, 0x2336, 0xE71C, // 0x0180 (384)
+0xFFFF, 0x43F8, 0x4C79, 0x859B, 0x7D7B, 0x7D9C, 0x85BC, 0x85DC, 0x85DC, 0x8DFD, 0x8DFD, 0x8E1D, 0x8E1D, 0xA67E, 0xFFFF, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xFFFF, 0xBEDE, 0x85FD, 0x8E1D, 0x8DFD, 0x8DFD, 0x85DC, 0x85DC, 0x85BC, 0x7D9C, 0x7D7B, 0x7D7B, 0x753B, 0x1B36, 0xBE5A, // 0x01A0 (416)
+0xFFBE, 0x3BF8, 0x3419, 0x6D1B, 0x757B, 0x7D9C, 0x7D9C, 0x7DBC, 0x7DDD, 0x85FD, 0x85FD, 0x861D, 0x861D, 0x9E7E, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xFFFF, 0xB6DE, 0x85FD, 0x8E1D, 0x85FD, 0x85FD, 0x7DDD, 0x7DBC, 0x7D9C, 0x7D9C, 0x757B, 0x6D3B, 0x4C9A, 0x1337, 0xADD9, // 0x01C0 (448)
+0xFFBE, 0x4418, 0x23B9, 0x3439, 0x4CBA, 0x653B, 0x759C, 0x7DBD, 0x7DDD, 0x7DFD, 0x861D, 0x861E, 0x861E, 0x9E7E, 0xFFFF, 0xFFFF, // 0x01D0 (464)
+0xFFFF, 0xFFFF, 0xB6DE, 0x7E1E, 0x861E, 0x85FD, 0x7DFD, 0x7DDD, 0x7DBD, 0x759C, 0x653B, 0x4CDB, 0x3439, 0x2BF9, 0x1337, 0xA5B9, // 0x01E0 (480)
+0xFF9E, 0x4C39, 0x2BF9, 0x345A, 0x3C7A, 0x3C9B, 0x4CFC, 0x5D5C, 0x659D, 0x75DD, 0x7DFE, 0x861E, 0x7E3E, 0x969F, 0xFFFF, 0xFFFF, // 0x01F0 (496)
+0xFFFF, 0xFFFF, 0xB6FF, 0x7E1E, 0x863E, 0x7DFE, 0x75DD, 0x6D9D, 0x5D5C, 0x4CFC, 0x3C9B, 0x347A, 0x345A, 0x343A, 0x1B78, 0xA5B9, // 0x0200 (512)
+0xF79E, 0x4418, 0x2C3A, 0x3C7A, 0x449B, 0x44DB, 0x4CFC, 0x4D3C, 0x555D, 0x5D7D, 0x65BE, 0x6DFE, 0x6DFF, 0x867F, 0xFFFF, 0xFFFF, // 0x0210 (528)
+0xFFFF, 0xFFFF, 0xA6DF, 0x65FF, 0x6DFE, 0x65BE, 0x5D9E, 0x555D, 0x4D3C, 0x4CFC, 0x44DB, 0x44BB, 0x3C7A, 0x345A, 0x1B78, 0xA599, // 0x0220 (544)
+0xFFDE, 0x43D8, 0x345A, 0x3C9A, 0x44DB, 0x4CFC, 0x4D3C, 0x555D, 0x5D9D, 0x5DBE, 0x65DE, 0x6DFF, 0x661F, 0x867F, 0xFFFF, 0xFFFF, // 0x0230 (560)
+0xFFFF, 0xFFFF, 0xA6DF, 0x65FF, 0x6DFF, 0x65DE, 0x5DBE, 0x5D9D, 0x555D, 0x4D3C, 0x4CFC, 0x44DB, 0x3C7A, 0x3C9B, 0x1B57, 0xADB9, // 0x0240 (576)
+0xFFFF, 0x4BD7, 0x2C1A, 0x44DB, 0x44DB, 0x4D1C, 0x555D, 0x5D7D, 0x5DBE, 0x65DE, 0x6E1F, 0x6E3F, 0x765F, 0x96BF, 0xFFFF, 0xFFFF, // 0x0250 (592)
+0xFFFF, 0xFFFF, 0xAEFF, 0x6E3F, 0x763F, 0x6E1F, 0x65DE, 0x5DBE, 0x5D7D, 0x555D, 0x4D1C, 0x44DC, 0x3C9B, 0x44DC, 0x1AD5, 0xC639, // 0x0260 (608)
+0xFFFF, 0x84D8, 0x1317, 0x5D7D, 0x44DB, 0x553C, 0x557D, 0x5D9E, 0x65DE, 0x65FF, 0x6E3F, 0x7E5F, 0x7E7F, 0x9EDF, 0xFFFF, 0xFFFF, // 0x0270 (624)
+0xFFFF, 0xFFFF, 0xB73F, 0x7E7F, 0x7E5F, 0x6E3F, 0x65FF, 0x65DE, 0x5D9E, 0x557D, 0x553C, 0x44DC, 0x4D1C, 0x345B, 0x22B4, 0xE71B, // 0x0280 (640)
+0xFFFF, 0xD6BC, 0x0234, 0x4CFC, 0x5D7D, 0x4D3C, 0x5D9D, 0x5DBE, 0x65FF, 0x6E3F, 0x765F, 0x867F, 0x8EBF, 0xA6DF, 0xFFFF, 0xFFFF, // 0x0290 (656)
+0xFFFF, 0xFFFF, 0xB71F, 0x8EBF, 0x869F, 0x765F, 0x6E3F, 0x65FF, 0x5DBE, 0x5D7D, 0x553D, 0x4D1C, 0x65BE, 0x0AB7, 0x6C15, 0xFFBE, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0x53B6, 0x0296, 0x75FE, 0x5D9D, 0x557D, 0x65DE, 0x6E1F, 0x763F, 0x7E7F, 0x8EBF, 0x9EFF, 0x96BE, 0xAE3C, 0xE77E, // 0x02B0 (688)
+0xEF9E, 0xC69D, 0x967E, 0x9EFF, 0x8EBF, 0x7E7F, 0x763F, 0x6E1F, 0x65DE, 0x5D9E, 0x555D, 0x761E, 0x341A, 0x1294, 0xBE18, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xCE9B, 0x0A13, 0x2378, 0x7E5F, 0x6E1E, 0x5DBE, 0x6E1F, 0x7E5F, 0x869F, 0x96DF, 0x9EFF, 0xAF5F, 0x9E9E, 0x8DFC, // 0x02D0 (720)
+0x8E1C, 0x967D, 0xAF3F, 0xA6FF, 0x96DF, 0x869F, 0x7E5F, 0x6E1F, 0x5DBE, 0x65DE, 0x7E5F, 0x4CBB, 0x0AB5, 0x7454, 0xEF5C, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFFF, 0xFFFF, 0x8D17, 0x01D3, 0x23B9, 0x7E3E, 0x8E9F, 0x763F, 0x765F, 0x8E9F, 0x9EDF, 0xA71F, 0xB75F, 0xC7BF, 0xCFDF, // 0x02F0 (752)
+0xCFDF, 0xC7BF, 0xB75F, 0xA71F, 0x9EDF, 0x8E9F, 0x765F, 0x6E1F, 0x867F, 0x8E7F, 0x4CBB, 0x1317, 0x4BB4, 0xD679, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFBD, 0x7476, 0x0214, 0x1B78, 0x659D, 0x9EDF, 0x9EFF, 0x96DF, 0x9EFF, 0xAF1F, 0xB75F, 0xC79F, 0xD7DF, // 0x0310 (784)
+0xD7DF, 0xC79F, 0xB75F, 0xAF1F, 0x9EDF, 0x96DF, 0x96DF, 0x9EFF, 0x7E1E, 0x3C5A, 0x1B77, 0x43B5, 0xBDD6, 0xF7BE, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77D, 0x7CB6, 0x12B4, 0x1337, 0x449B, 0x7DFD, 0xA6FF, 0xB75F, 0xBF7F, 0xC79F, 0xCFBF, 0xD7FF, // 0x0330 (816)
+0xD7FF, 0xCFBF, 0xC79F, 0xBF7F, 0xB77F, 0xAF1F, 0x8E5E, 0x551B, 0x3419, 0x2BD7, 0x5415, 0xB5B6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xA577, 0x3B75, 0x1B36, 0x2BD9, 0x4CBB, 0x759D, 0x965E, 0xAEDF, 0xBF3F, 0xC77F, // 0x0350 (848)
+0xC77F, 0xBF3F, 0xB6FF, 0x9E7F, 0x7DDD, 0x5D1C, 0x447A, 0x3C59, 0x4437, 0x7474, 0xC617, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xD699, 0x84D5, 0x43D5, 0x33B7, 0x3418, 0x4C7A, 0x5CFC, 0x753D, 0x857E, // 0x0370 (880)
+0x859E, 0x755D, 0x653C, 0x5CFB, 0x4CDA, 0x4CB9, 0x5497, 0x6C95, 0xA555, 0xDEDA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xCE79, 0x9D56, 0x7495, 0x5C56, 0x4C77, 0x4C97, 0x4CB8, // 0x0390 (912)
+0x54D8, 0x5CD8, 0x5CF8, 0x64D7, 0x74D6, 0x8CF5, 0xAD96, 0xD699, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xEF1B, 0xD679, 0xBDF7, 0xAD96, 0xA576, // 0x03B0 (944)
+0xA576, 0xAD76, 0xB5B6, 0xC5F7, 0xD679, 0xEF3C, 0xFFDE, 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, 0xFFDF, 0xFFBE, // 0x03D0 (976)
+0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/tux.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/tux.c
new file mode 100644
index 0000000..69a04a1
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap/tux.c
@@ -0,0 +1,71 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: tux.png
+// Time generated: 11.10.2010 22:51:32
+// Size : 2Â 048 Bytes
+
+const unsigned short tux[0x400] ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x9CD3, 0x9CF3, 0xA514, // 0x0010 (16)
+0x9CF3, 0x8C51, 0xAD75, 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, 0xEF7D, 0x5AEB, 0x7BEF, 0x9CD3, 0x94B2, // 0x0030 (48)
+0x94B2, 0x94B2, 0x4228, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x9CF3, 0x18E3, 0x630C, 0x4A49, 0x4A69, // 0x0050 (80)
+0x4A69, 0x528A, 0x4A49, 0x0000, 0xC638, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6D, 0x0000, 0x0020, 0x10A2, 0x1082, // 0x0070 (112)
+0x0841, 0x0841, 0x0841, 0x0000, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x528A, 0x4228, 0x8410, 0x0000, 0x0861, // 0x0090 (144)
+0xAD55, 0xBDD7, 0x10A2, 0x0000, 0x2945, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x5ACB, 0x8C71, 0xE75D, 0x2126, 0x528B, // 0x00B0 (176)
+0xE75D, 0xDEDB, 0x7BCF, 0x0000, 0x18E3, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6D, 0x4A4A, 0x6B2A, 0x8BE7, 0xA48A, // 0x00D0 (208)
+0x6B09, 0x4A8A, 0x8431, 0x0000, 0x2104, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6E, 0x5204, 0xDE6A, 0xFFF7, 0xFFF8, // 0x00F0 (240)
+0xD5AC, 0xBCAA, 0x5A66, 0x0000, 0x1082, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8C10, 0xC540, 0xFFED, 0xFF2C, 0xFEEC, // 0x0110 (272)
+0xFECC, 0xFE66, 0x8260, 0x0000, 0x0000, 0xB596, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B3, 0x9C25, 0xFF20, 0xFE40, 0xFDA0, // 0x0130 (304)
+0xFCC0, 0xF524, 0x836A, 0x0000, 0x0000, 0x630C, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x630C, 0x94B4, 0xFF13, 0xFD83, 0xF523, // 0x0150 (336)
+0xE5CF, 0xF79E, 0xE71D, 0x0861, 0x0000, 0x0861, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xCE59, 0x0841, 0xD69A, 0xFFFF, 0xFF7D, 0xF77D, // 0x0170 (368)
+0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x4A69, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x10A2, 0x8410, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xFFDF, 0xFFFF, 0xCE59, 0x0000, 0x0000, 0x0000, 0x9492, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x52AA, 0x0020, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFDF, 0xFFDF, 0xF7BE, 0xFFDF, 0x3186, 0x0000, 0x0020, 0x0841, 0xCE79, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xC638, 0x0000, 0x52AA, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x01D0 (464)
+0xFFDF, 0xF7BE, 0xF79E, 0xFFFF, 0x9CF3, 0x0000, 0x0841, 0x0000, 0x39E7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5ACB, 0x0000, 0xBDF7, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, // 0x01F0 (496)
+0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0x3186, 0x0000, 0x0861, 0x0000, 0xAD55, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x0861, 0x4A49, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x0210 (528)
+0xF7BE, 0xF79E, 0xEF7D, 0xEF5D, 0xFFDF, 0x8410, 0x0000, 0x1082, 0x0000, 0x39E7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0220 (544)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0xB596, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, // 0x0230 (560)
+0xF79E, 0xEF7D, 0xEF7D, 0xE73C, 0xF79E, 0xAD55, 0x0861, 0x10A2, 0x0861, 0x0841, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x3185, 0x10A2, 0xE71C, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, // 0x0250 (592)
+0xEF7D, 0xEF7D, 0xEF5D, 0xE73C, 0xEF5D, 0xBDF7, 0x18C3, 0x18C3, 0x18C3, 0x0000, 0x8C71, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0260 (608)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0x39E7, 0xF7BE, 0xFFFF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, 0xEF7D, // 0x0270 (624)
+0xEF7D, 0xEF5D, 0xE73C, 0xE71C, 0xE71C, 0xC618, 0x18E3, 0x10A2, 0x10A2, 0x0020, 0x6B4D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0280 (640)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8C51, 0x38E0, 0x4A27, 0xFFFF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, // 0x0290 (656)
+0xEF5D, 0xE73C, 0xE71C, 0xDEFB, 0xDF1D, 0xBDF8, 0x39C7, 0x5ACB, 0x528A, 0x10A3, 0x738F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD6C, 0xFE2B, 0xBC45, 0xA513, 0xFFFF, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF5D, // 0x02B0 (688)
+0xE73C, 0xE71C, 0xDEFB, 0xD6DC, 0xDD8E, 0xB3E4, 0x2124, 0x2965, 0x2945, 0x20C1, 0xB511, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77C, 0xE5CF, 0xF60B, 0xFF9B, 0xFF54, 0x8B02, 0x7BF0, 0xFFDF, 0xF79E, 0xEF5D, 0xEF5D, 0xE73C, // 0x02D0 (720)
+0xE71C, 0xDEFB, 0xDEDB, 0xCE7A, 0xED89, 0xDDAD, 0x0842, 0x0000, 0x0000, 0xAC69, 0xDD6B, 0xEFBF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFFF, 0xFFBE, 0xE5CB, 0xEDC9, 0xFE4B, 0xFF14, 0xFEF3, 0xFF35, 0xFE8D, 0x51C1, 0x634E, 0xE73C, 0xEF5D, 0xE73C, 0xE71C, // 0x02F0 (752)
+0xDEFB, 0xDEDB, 0xD6DB, 0xCE59, 0xE58B, 0xFF98, 0xBD4F, 0x8B88, 0xCD90, 0xFFB7, 0xCCE8, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xEF3B, 0xF583, 0xFF30, 0xFF11, 0xFECF, 0xFEEF, 0xFECF, 0xFF30, 0xDD46, 0x2903, 0x6B8E, 0xEF7D, 0xE71C, 0xDEFB, // 0x0310 (784)
+0xDEDB, 0xD6BA, 0xD69A, 0xCE59, 0xE5AA, 0xFF11, 0xFF53, 0xFF73, 0xFF33, 0xFF12, 0xFE6C, 0xDDAD, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xF79E, 0xEDC5, 0xFECB, 0xFECC, 0xFECC, 0xFEEC, 0xFECB, 0xFECC, 0xFEEA, 0x9BE5, 0x8432, 0xE73C, 0xDEDB, 0xDEDB, // 0x0330 (816)
+0xD6BA, 0xD69A, 0xDEDB, 0xA4F3, 0xD547, 0xFF2E, 0xFECD, 0xFECE, 0xFEEE, 0xFEEE, 0xFF10, 0xFEAB, 0xE5A8, 0xEF7D, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xF79E, 0xF603, 0xFEA2, 0xFEC7, 0xFEC7, 0xFEA4, 0xFE81, 0xFE61, 0xFEA4, 0xFE43, 0xDE33, 0xE75E, 0xE71C, 0xDEFB, // 0x0350 (848)
+0xDEDB, 0xCE58, 0x8C72, 0x5247, 0xEDE4, 0xFF0A, 0xFECA, 0xFEC9, 0xFE84, 0xFE83, 0xFEE7, 0xFEA3, 0xB443, 0xD69B, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xF75B, 0xFE60, 0xFF00, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEE0, 0xE5C1, 0x9492, 0xA514, 0x9CD3, // 0x0370 (880)
+0x8410, 0x630B, 0x4229, 0x6AE8, 0xFE80, 0xFEC1, 0xFEC1, 0xFEA0, 0xFEA0, 0xFEE0, 0xDD80, 0x9BE8, 0xB597, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xF79E, 0xD589, 0xE600, 0xFEA0, 0xFF00, 0xFF40, 0xFF40, 0xFF00, 0xFF00, 0xFF20, 0xFEC0, 0x5267, 0x4229, 0x4A48, // 0x0390 (912)
+0x4A49, 0x5289, 0x424A, 0x7B46, 0xFF20, 0xFEE0, 0xFEE0, 0xFF20, 0xFEE0, 0xB4A5, 0x9C92, 0xDEFD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xE71D, 0xBDB6, 0xB530, 0xBD0B, 0xCD65, 0xEE60, 0xFF40, 0xFFA0, 0xFF80, 0xBD03, 0x8410, 0xA514, 0xA534, // 0x03B0 (944)
+0xAD75, 0xB596, 0xA555, 0x9C8F, 0xF6C0, 0xFFA0, 0xFFA0, 0xF6E0, 0xA449, 0xB5B8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7F, 0xD69C, 0xBD95, 0xBD4C, 0xCDC6, 0xB4E8, 0xAD35, 0xF7BF, 0xFFFF, 0xFFFF, // 0x03D0 (976)
+0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xCDD0, 0xCDC6, 0xCDA7, 0xA48D, 0xCE7B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF1F, 0xB59A, 0xBDDA, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xEF7F, 0xB59A, 0xAD59, 0xDF1D, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino
new file mode 100644
index 0000000..3cc269e
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino
@@ -0,0 +1,49 @@
+// UTFT_Bitmap_128x128 (C)2013 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the drawBitmap()-function.
+//
+// This demo was made to work on the 128x128 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+UTFT myGLCD(LPH9135,6,5,2,3,4); // Remember to change the model parameter to suit your display module!
+
+extern unsigned short icon1[0x400];
+extern unsigned short icon2[0x400];
+extern unsigned short tux[0x1000];
+
+void setup()
+{
+ myGLCD.InitLCD(PORTRAIT);
+}
+
+void loop()
+{
+// Draw a 4 by 4 grid of a 32x32 icon.
+ myGLCD.fillScr(255, 255, 255);
+ for (int x=0; x<4; x++)
+ for (int y=0; y<4; y++)
+ myGLCD.drawBitmap (x*32, y*32, 32, 32, icon1);
+
+ delay(5000);
+
+// Draw a 64x64 icon in double size.
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.drawBitmap (0, 0, 64, 64, tux, 2);
+
+ delay(5000);
+
+// Draw a 2 by 2 grid of a 32x32 icon in double size.
+ myGLCD.fillScr(255, 255, 255);
+ for (int x=0; x<2; x++)
+ for (int y=0; y<2; y++)
+ myGLCD.drawBitmap (x*64, y*64, 32, 32, icon2, 2);
+
+ delay(5000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon1.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon1.c
new file mode 100644
index 0000000..b9c2c97
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon1.c
@@ -0,0 +1,72 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: exit.png
+// Time generated: 14.10.2010 21:53:03
+// Dimensions : 32x32 pixels
+// Size : 2Â 048 Bytes
+
+const unsigned short icon1[0x400] ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF1C, 0xE618, 0xE638, 0xE638, 0xE638, 0xE659, 0xE659, 0xE659, 0xE659, 0xE659, 0xE679, 0xE679, // 0x0010 (16)
+0xE679, 0xE679, 0xE679, 0xE679, 0xEE79, 0xEE9A, 0xEE9A, 0xEE9A, 0xEE9A, 0xEE9A, 0xE638, 0xEEBA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32)
+0xFFFF, 0xFFFF, 0xFFFF, 0xD555, 0xCCD3, 0xDDB6, 0xDDD7, 0xDDF7, 0xDDF7, 0xDE18, 0xE618, 0xE638, 0xE638, 0xE659, 0xE679, 0xE679, // 0x0030 (48)
+0xEE9A, 0xEE9A, 0xEEBA, 0xEEBA, 0xEEBA, 0xEEDB, 0xEEDB, 0xEEFB, 0xEEFB, 0xEEFB, 0xEEFB, 0xE659, 0xD575, 0xF77D, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFDF, 0xFFFF, 0xD534, 0xC471, 0xD575, 0xCCF3, 0xCCD3, 0xCCD3, 0xCCF3, 0xCCF3, 0xD4F3, 0xD514, 0xD514, 0xD514, 0xD534, 0xDD55, // 0x0050 (80)
+0xDD55, 0xDD55, 0xDD55, 0xDD75, 0xDD75, 0xDD75, 0xDD96, 0xDD96, 0xDD96, 0xDDB6, 0xDDD7, 0xEE79, 0xEEBA, 0xD534, 0xFFBE, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xEEDB, 0xB38E, 0xC4B2, 0xBC30, 0xC451, 0xC471, 0xC471, 0xCC71, 0xCC92, 0xCC92, 0xCC92, 0xCCB2, 0xD4B2, 0xD4B2, 0xCC71, // 0x0070 (112)
+0xCC71, 0xD4D3, 0xD4F3, 0xDCF3, 0xDCF3, 0xDD14, 0xDD14, 0xDD14, 0xDD34, 0xDD34, 0xDD34, 0xDD14, 0xE5D7, 0xDD96, 0xDDF7, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xC4F3, 0xAB2C, 0xC430, 0xC410, 0xC430, 0xC430, 0xC430, 0xCC51, 0xCC51, 0xCC51, 0xCC71, 0xCC71, 0xD471, 0xCC71, 0xD5F7, // 0x0090 (144)
+0xD5F7, 0xCC92, 0xDCB2, 0xDCD3, 0xDCD3, 0xDCD3, 0xDCD3, 0xDCF3, 0xDCF3, 0xDD14, 0xDD14, 0xDD34, 0xDD14, 0xDD34, 0xC492, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xB3EF, 0x9A28, 0xC430, 0xBBCF, 0xC3EF, 0xC3EF, 0xC3EF, 0xC410, 0xCC10, 0xCC10, 0xCC30, 0xCC51, 0xCBEF, 0xE638, 0xFFFF, // 0x00B0 (176)
+0xFFFF, 0xE659, 0xD430, 0xDC92, 0xDC92, 0xDC92, 0xDCB2, 0xDCB2, 0xDCB2, 0xDCD3, 0xDCD3, 0xDCD3, 0xE514, 0xD410, 0xAB0C, 0xF7FF, // 0x00C0 (192)
+0xFFFF, 0xABCF, 0x9165, 0xC3EF, 0xBB8E, 0xBBAE, 0xC3AE, 0xC3CF, 0xC3CF, 0xCBCF, 0xCBEF, 0xCC10, 0xCC10, 0xCBAE, 0xEE9A, 0xFFFF, // 0x00D0 (208)
+0xFFFF, 0xF6DB, 0xD410, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xE492, 0xE492, 0xE492, 0xE4F3, 0xCB2C, 0xA249, 0xF7FF, // 0x00E0 (224)
+0xFFFF, 0xABCF, 0x88C3, 0xC3AE, 0xBB4D, 0xBB6D, 0xC36D, 0xC38E, 0xC38E, 0xCBAE, 0xC36D, 0xC34D, 0xCBCF, 0xCB8E, 0xEE59, 0xFFFF, // 0x00F0 (240)
+0xFFFF, 0xF6BA, 0xDBCF, 0xD3CF, 0xCBAE, 0xD3CF, 0xE430, 0xE430, 0xE451, 0xE451, 0xE451, 0xE451, 0xECD3, 0xCAAA, 0xA208, 0xF7FF, // 0x0100 (256)
+0xFFFF, 0xABCF, 0x8061, 0xBB6D, 0xBB2C, 0xBB2C, 0xC34D, 0xC34D, 0xCB4D, 0xBB0C, 0xC492, 0xCD14, 0xC38E, 0xCB2C, 0xEE59, 0xFFFF, // 0x0110 (272)
+0xFFFF, 0xF6BA, 0xD36D, 0xD575, 0xE6DB, 0xDDB6, 0xD3AE, 0xE3EF, 0xE410, 0xE410, 0xE430, 0xE410, 0xECB2, 0xC986, 0xA208, 0xF7FF, // 0x0120 (288)
+0xFFFF, 0xB3EF, 0x8041, 0xBB0C, 0xBAEB, 0xBAEB, 0xC30C, 0xC30C, 0xBACB, 0xD5B6, 0xFFFF, 0xFFFF, 0xEE79, 0xCACB, 0xEE59, 0xFFFF, // 0x0130 (304)
+0xFFFF, 0xF679, 0xDBEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEBA, 0xD3CF, 0xE3AE, 0xE3EF, 0xE3CF, 0xEC10, 0xEB6D, 0xC000, 0xA249, 0xF7FF, // 0x0140 (320)
+0xFFFF, 0xB3EF, 0x8020, 0xBACB, 0xBAAA, 0xBAAA, 0xC2EB, 0xBA8A, 0xD596, 0xFFFF, 0xFFDF, 0xFFFF, 0xF73C, 0xCAAA, 0xEE38, 0xFFFF, // 0x0150 (336)
+0xFFFF, 0xF679, 0xDB4D, 0xFF7D, 0xFFFF, 0xFFDF, 0xFFFF, 0xEEDB, 0xDB6D, 0xEB8E, 0xEBAE, 0xEB8E, 0xE0A2, 0xC800, 0xAA49, 0xF7FF, // 0x0160 (352)
+0xFFFF, 0xB3EF, 0x8000, 0xB28A, 0xBA69, 0xBA8A, 0xBA49, 0xCC30, 0xFFFF, 0xFFDF, 0xFFFF, 0xFF5D, 0xDBCF, 0xCA69, 0xEE18, 0xFFFF, // 0x0170 (368)
+0xFFFF, 0xF679, 0xDAAA, 0xE3AE, 0xF6BA, 0xFFFF, 0xFFDF, 0xFFFF, 0xE5D7, 0xE30C, 0xEB8E, 0xE0E3, 0xE000, 0xC800, 0xAA49, 0xF7FF, // 0x0180 (384)
+0xFFFF, 0xB3EF, 0x8800, 0xB249, 0xBA49, 0xBA49, 0xBA49, 0xEF1C, 0xFFFF, 0xFFFF, 0xFF7D, 0xD32C, 0xCA69, 0xD249, 0xEDF7, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xF659, 0xDAAA, 0xE2CB, 0xE2EB, 0xFEBA, 0xFFFF, 0xFFDF, 0xFFDF, 0xE3CF, 0xE103, 0xE000, 0xE081, 0xD000, 0xAA69, 0xF7FF, // 0x01A0 (416)
+0xFFFF, 0xB3EF, 0x8800, 0xB228, 0xBA08, 0xB9A6, 0xCBAE, 0xFFFF, 0xFFDF, 0xFFFF, 0xDC30, 0xC9E7, 0xD28A, 0xCA08, 0xF618, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xF679, 0xDA49, 0xE2CB, 0xE28A, 0xEB6D, 0xFFBE, 0xFFDF, 0xFFFF, 0xEC92, 0xE000, 0xE0A2, 0xE0C2, 0xD040, 0xAA89, 0xF7FF, // 0x01C0 (448)
+0xFFFF, 0xB3EF, 0x8800, 0xB1E7, 0xB9E7, 0xB165, 0xDD55, 0xFFFF, 0xFFFF, 0xF71C, 0xCA08, 0xCA08, 0xD228, 0xD1E7, 0xE430, 0xFFDF, // 0x01D0 (464)
+0xFFDF, 0xEC51, 0xDA08, 0xE28A, 0xE28A, 0xE228, 0xF618, 0xFFFF, 0xFFFF, 0xF679, 0xE081, 0xE0C2, 0xE903, 0xD081, 0xAA89, 0xF7FF, // 0x01E0 (480)
+0xFFFF, 0xBBEF, 0x9000, 0xB1A6, 0xB986, 0xB145, 0xEE38, 0xFFFF, 0xFFFF, 0xED96, 0xC165, 0xC9E7, 0xD1E7, 0xD1E7, 0xD1C7, 0xDACB, // 0x01F0 (496)
+0xE2EB, 0xD9E7, 0xE228, 0xE228, 0xEA69, 0xE9E7, 0xF40F, 0xFFFF, 0xFFFF, 0xFF5D, 0xE144, 0xE8E2, 0xE943, 0xD8C1, 0xAA8A, 0xF7FF, // 0x0200 (512)
+0xFFFF, 0xBC10, 0x9000, 0xB165, 0xB145, 0xB924, 0xEE9A, 0xFFFF, 0xFFFF, 0xE514, 0xC124, 0xC9A6, 0xD1A6, 0xD1A6, 0xD1C7, 0xD9A6, // 0x0210 (528)
+0xD9A6, 0xE1E7, 0xE208, 0xE208, 0xE9A6, 0xE041, 0xEA8A, 0xFFFF, 0xFFFF, 0xFF9E, 0xE9C6, 0xE902, 0xE984, 0xD902, 0xAAAA, 0xF7FF, // 0x0220 (544)
+0xFFFF, 0xC410, 0x9000, 0xB124, 0xB124, 0xB0C3, 0xEE18, 0xFFFF, 0xFFFF, 0xE575, 0xC0E3, 0xC986, 0xD165, 0xD165, 0xD986, 0xD9A6, // 0x0230 (560)
+0xD9A6, 0xE1A6, 0xE165, 0xE082, 0xE020, 0xE000, 0xEB4C, 0xFFFF, 0xFFFF, 0xFF7D, 0xE9A5, 0xE943, 0xE9A5, 0xD923, 0xAAAA, 0xF7FF, // 0x0240 (576)
+0xFFFF, 0xC410, 0x9800, 0xB0E3, 0xB0E3, 0xB061, 0xE4F3, 0xFFFF, 0xFFFF, 0xF6FB, 0xC104, 0xC924, 0xD145, 0xD145, 0xD945, 0xD945, // 0x0250 (592)
+0xD8E3, 0xD861, 0xD800, 0xE000, 0xE061, 0xE000, 0xED34, 0xFFFF, 0xFFFF, 0xFE9A, 0xE923, 0xE984, 0xE9C5, 0xE163, 0xAAAA, 0xF7FF, // 0x0260 (608)
+0xFFFF, 0xC410, 0xA000, 0xB0A2, 0xB0A2, 0xB041, 0xCACB, 0xFFFF, 0xFFDF, 0xFFFF, 0xD34D, 0xC841, 0xD104, 0xD0A2, 0xD061, 0xD000, // 0x0270 (624)
+0xD800, 0xD800, 0xE000, 0xE041, 0xE000, 0xD965, 0xFF9E, 0xFFDF, 0xFFFF, 0xF4D2, 0xE8E2, 0xE9A5, 0xE9E5, 0xE183, 0xAAAA, 0xF7FF, // 0x0280 (640)
+0xFFFF, 0xCC10, 0xA000, 0xA861, 0xB061, 0xB061, 0xB882, 0xF6DB, 0xFFFF, 0xFFDF, 0xF75D, 0xC124, 0xC800, 0xD000, 0xD000, 0xD800, // 0x0290 (656)
+0xD800, 0xE000, 0xE020, 0xE000, 0xD861, 0xF638, 0xFFFF, 0xFFDF, 0xFFDF, 0xEA68, 0xE943, 0xE9C5, 0xEA06, 0xE1A4, 0xB2CA, 0xF7FF, // 0x02A0 (672)
+0xFFFF, 0xCC10, 0xA000, 0xA820, 0xB000, 0xB000, 0xB000, 0xCA49, 0xFFFF, 0xFFDF, 0xFFFF, 0xF71C, 0xCA08, 0xC800, 0xD000, 0xD800, // 0x02B0 (688)
+0xD800, 0xD800, 0xD800, 0xD944, 0xEE18, 0xFFFF, 0xFFBE, 0xFFFF, 0xF4F2, 0xE902, 0xE9A5, 0xE9C5, 0xEA06, 0xE9A4, 0xB2CA, 0xF7FF, // 0x02C0 (704)
+0xFFFF, 0xD410, 0xA800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xDC10, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xED96, 0xDAEB, 0xD1A6, // 0x02D0 (720)
+0xD965, 0xDA69, 0xECD3, 0xFF9E, 0xFFFF, 0xFFBE, 0xFFFF, 0xFE17, 0xE923, 0xE964, 0xE9A5, 0xE9C5, 0xEA26, 0xE9C4, 0xBACA, 0xF7FF, // 0x02E0 (736)
+0xF7FF, 0xD410, 0xA800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xB800, 0xE3EF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF5B6, 0xE923, 0xE923, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xE9C5, 0xBACA, 0xF7FF, // 0x0300 (768)
+0xF7FF, 0xDC10, 0xB000, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xD228, 0xF638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0310 (784)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFEFB, 0xF3AE, 0xE0C1, 0xE903, 0xE964, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xE9E5, 0xC2CA, 0xF7DF, // 0x0320 (800)
+0xF7FF, 0xDC51, 0xB800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC800, 0xD9E7, 0xEC30, 0xF5D7, 0xFE9A, // 0x0330 (816)
+0xFEBA, 0xF618, 0xF4D3, 0xEACB, 0xE0E2, 0xE040, 0xE903, 0xE943, 0xE943, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xEA05, 0xC30C, 0xF7DF, // 0x0340 (832)
+0xFFFF, 0xD575, 0xD104, 0xA820, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC820, 0xC800, 0xD000, 0xD000, 0xD800, 0xD800, // 0x0350 (848)
+0xE000, 0xE000, 0xE000, 0xE000, 0xE0A1, 0xE0E3, 0xE903, 0xE943, 0xE964, 0xE984, 0xE9C5, 0xE9C5, 0xF226, 0xE227, 0xBC10, 0xF7FF, // 0x0360 (864)
+0xFFFF, 0xDF3C, 0xCAAA, 0xD186, 0xB082, 0xB000, 0xB800, 0xB800, 0xB800, 0xC000, 0xC000, 0xC800, 0xC800, 0xD000, 0xD000, 0xD800, // 0x0370 (880)
+0xD800, 0xE000, 0xE020, 0xE040, 0xE061, 0xE0A1, 0xE0C2, 0xE102, 0xE123, 0xE943, 0xE984, 0xEA26, 0xFB0A, 0xBA08, 0xCE38, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFDF, 0xBDD7, 0xCA69, 0xE248, 0xD207, 0xD1C6, 0xD1C6, 0xD9C7, 0xD9C7, 0xE1C7, 0xE1C7, 0xE1C7, 0xE9C7, 0xE9C7, 0xE9C7, // 0x0390 (912)
+0xF1C6, 0xF1C7, 0xF1E7, 0xF207, 0xF228, 0xF248, 0xF269, 0xF289, 0xF2A9, 0xF2CA, 0xFB0A, 0xF2EA, 0xC207, 0xACB3, 0xF7BE, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xF7BE, 0xBDF7, 0xAB8E, 0xC2EB, 0xC2EB, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xCB0B, 0xCAEB, // 0x03B0 (944)
+0xCAEB, 0xCACA, 0xCACA, 0xCAAA, 0xCAAA, 0xCA8A, 0xCA69, 0xC269, 0xC269, 0xC289, 0xBA69, 0xA2CB, 0xAD34, 0xEF7D, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDF3C, 0xBE39, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, // 0x03D0 (976)
+0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xBE38, 0xD71C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon2.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon2.c
new file mode 100644
index 0000000..9b843cc
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/icon2.c
@@ -0,0 +1,72 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: video.png
+// Time generated: 14.10.2010 21:53:17
+// Dimensions : 32x32 pixels
+// Size : 2Â 048 Bytes
+
+const unsigned short icon2[0x400] ={
+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, 0xE71C, 0xB5B6, 0x94B2, 0x8C71, // 0x0030 (48)
+0x9492, 0xA534, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x9CF3, 0x73AE, 0x6B6D, 0x73AE, 0x7BCF, // 0x0050 (80)
+0x7BEF, 0x7BCF, 0x7BEF, 0xA534, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x7BCF, 0x6B6D, 0x738E, 0x7BCF, 0x8C71, 0x9492, // 0x0070 (112)
+0x9492, 0x9492, 0x9492, 0x8C51, 0x8C71, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x738E, 0x738E, 0x73AE, 0x6B4D, 0x8410, 0x9CF3, 0x9CF3, // 0x0090 (144)
+0x9CF3, 0x9CF3, 0x9CF3, 0x9CF3, 0x94B2, 0x7BEF, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x738E, 0x7BEF, 0x8410, 0x632C, 0x4A69, 0x9492, 0xAD75, 0xAD55, // 0x00B0 (176)
+0xAD55, 0xAD55, 0xAD55, 0xA534, 0xAD55, 0x9492, 0x8430, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x7BCF, 0x8430, 0x7BCF, 0x6B4D, 0x528A, 0x6B6D, 0xB5B6, 0xB5B6, 0xB5B6, // 0x00D0 (208)
+0xB5B6, 0xB596, 0xB596, 0xAD75, 0xAD75, 0xAD55, 0x8410, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x7BEF, 0x9CD3, 0xA514, 0x5AEB, 0x630C, 0x6B4D, 0x9492, 0xC638, 0xC618, 0xC618, // 0x00F0 (240)
+0xBDF7, 0xBDF7, 0xC618, 0xB5B6, 0xB5B6, 0xB596, 0x9492, 0x8C51, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8C71, 0x94B2, 0xAD55, 0xB5B6, 0x738E, 0x6B4D, 0x632C, 0xB596, 0xD69A, 0xCE59, 0xCE59, // 0x0110 (272)
+0xCE79, 0xCE59, 0x6B6D, 0x9492, 0xB5B6, 0xBDF7, 0x9CF3, 0x8430, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x8C51, 0xAD55, 0xB5B6, 0xCE79, 0x8C51, 0x630C, 0x8C51, 0xCE79, 0xD6BA, 0xD69A, 0xDEDB, // 0x0130 (304)
+0xBDD7, 0x8C51, 0x4228, 0x2965, 0xAD55, 0xC638, 0xA534, 0x8430, 0xB5B6, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x8C51, 0xA514, 0xB5B6, 0xC618, 0xD6BA, 0xB5B6, 0xB596, 0xE71C, 0xDEFB, 0xDEFB, 0xE71C, 0xAD55, // 0x0150 (336)
+0x738E, 0x7BEF, 0x5AEB, 0x2945, 0xC638, 0xCE59, 0xA534, 0x9492, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x94B2, 0xB5B6, 0xC618, 0xCE79, 0xD6BA, 0xE73C, 0xEF7D, 0xE73C, 0xEF5D, 0xE73C, 0x9CF3, 0x738E, // 0x0170 (368)
+0x7BCF, 0x8430, 0x6B6D, 0x2965, 0xB596, 0xD69A, 0xAD55, 0x94B2, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
+0xFFFF, 0xFFFF, 0xF79E, 0x9492, 0x9CF3, 0xB5B6, 0xD69A, 0xDEFB, 0xE71C, 0xE73C, 0x6B6D, 0x528A, 0xDEDB, 0xEF5D, 0x7BEF, 0x8430, // 0x0190 (400)
+0x7BEF, 0x8C51, 0x7BCF, 0x2104, 0xB596, 0xD6BA, 0xAD55, 0x9CD3, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xE6FC, // 0x01A0 (416)
+0xFFDF, 0xFFFF, 0xCE59, 0x9492, 0x9492, 0x6B4D, 0x7BCF, 0xBDD7, 0xF7BE, 0xA514, 0x4A49, 0x528A, 0xC638, 0xEF7D, 0x7BEF, 0x7BEF, // 0x01B0 (432)
+0x7BEF, 0x8430, 0x5AEB, 0x10A2, 0xC618, 0xD69A, 0xAD55, 0x94B2, 0xA514, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE5A, 0x8BF2, // 0x01C0 (448)
+0xFFFF, 0xFFFF, 0xAD55, 0x94B2, 0x8C51, 0x5AEB, 0x632C, 0xBDD7, 0xE73C, 0x630C, 0x632C, 0xBDF7, 0xFFDF, 0xEF5D, 0xBDD7, 0xB5B6, // 0x01D0 (464)
+0xAD75, 0xAD75, 0x8C51, 0x738E, 0xD69A, 0xCE59, 0xB596, 0x8C51, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xCE39, 0x7350, // 0x01E0 (480)
+0xFFFF, 0xF79E, 0x94B2, 0x94B2, 0x7BCF, 0x5AEB, 0x738E, 0xD6BA, 0xD69A, 0x2104, 0x6B6D, 0xF79E, 0xF79E, 0xF79E, 0xF7BE, 0xF79E, // 0x01F0 (496)
+0xEF7D, 0xEF5D, 0xE73C, 0xE73C, 0xDEFB, 0xBDF7, 0xBDF7, 0x7BEF, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD36, 0x7350, // 0x0200 (512)
+0xFFFF, 0xDEDB, 0x8C51, 0x94B2, 0x738E, 0x632C, 0x73AE, 0xCE79, 0xF7BE, 0x7BEF, 0xA514, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0210 (528)
+0xE73C, 0xE71C, 0xDEFB, 0xDEDB, 0xDEDB, 0xBDD7, 0xBDF7, 0x73AE, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x9C75, 0x736F, // 0x0220 (544)
+0xFFFF, 0xCE59, 0x8430, 0x94B2, 0x6B4D, 0x6B4D, 0xB596, 0xE73C, 0xEF7D, 0xFFFF, 0xFFFF, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0230 (560)
+0xE73C, 0xE73C, 0xDEFB, 0xDEFB, 0xD6BA, 0xC618, 0xAD55, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x6AEF, 0x9492, // 0x0240 (576)
+0xFFFF, 0xBDF7, 0x8430, 0x8C71, 0x6B6D, 0xB596, 0xE71C, 0xE73C, 0xEF5D, 0xE73C, 0xBDF7, 0xCE59, 0xF7BE, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0250 (592)
+0xE73C, 0xE71C, 0xDEFB, 0xDEFB, 0xC638, 0xD69A, 0x8410, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9474, 0x6B0E, 0xCE59, // 0x0260 (608)
+0xFFFF, 0xB5B6, 0x8410, 0x9492, 0xBDD7, 0xD6BA, 0xD6BA, 0xE71C, 0xE73C, 0x8C71, 0x6B4D, 0xA514, 0xF7BE, 0xEF5D, 0xEF5D, 0xE73C, // 0x0270 (624)
+0xE73C, 0xE71C, 0xDEFB, 0xDEDB, 0xCE59, 0xC618, 0x7BCF, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC5F9, 0x7B51, 0x7BEF, 0xFFFF, // 0x0280 (640)
+0xFFFF, 0xB596, 0x8C71, 0xAD75, 0xBDF7, 0xCE59, 0xD69A, 0xE71C, 0xCE79, 0x8410, 0x8410, 0x9CD3, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, // 0x0290 (656)
+0xE71C, 0xDEFB, 0xDEFB, 0xCE59, 0xDEDB, 0x8C71, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEBB, 0x83B2, 0x630C, 0xE73C, 0xFFFF, // 0x02A0 (672)
+0xFFFF, 0xB5B6, 0x9492, 0xAD55, 0xBDD7, 0xC638, 0xCE79, 0xDEFB, 0xB596, 0x73AE, 0x8410, 0x8410, 0xDEDB, 0xE73C, 0xE71C, 0xE71C, // 0x02B0 (688)
+0xDEFB, 0xDEFB, 0xD6BA, 0xCE59, 0xC618, 0x738E, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDC, 0x8C14, 0x5ACC, 0xC658, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xC638, 0x8C51, 0xA534, 0xB5B6, 0xBDF7, 0xCE59, 0xD6BA, 0x94B2, 0x738E, 0x8410, 0x8430, 0xCE59, 0xE73C, 0xDEFB, 0xDEFB, // 0x02D0 (720)
+0xDEDB, 0xDEFB, 0xBDF7, 0xDEDB, 0x73AE, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDC, 0x8BD2, 0x5ACC, 0xBDD6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xDEDB, 0x8C51, 0xA514, 0xAD75, 0xBDD7, 0xC638, 0xC618, 0x73AE, 0x7BCF, 0x8410, 0x5ACB, 0x8C51, 0xE73C, 0xDEDB, 0xD6BA, // 0x02F0 (752)
+0xDEFB, 0xBDD7, 0xD69A, 0x8C71, 0x8C51, 0xFFFF, 0xFFFF, 0xFFDE, 0xCE5A, 0x7B71, 0x62ED, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xF7BE, 0x94B2, 0x94B2, 0xA534, 0xB596, 0xBDF7, 0xB596, 0x6B6D, 0x4208, 0x2945, 0x18C3, 0x6B6D, 0xDEFB, 0xD69A, 0xDEDB, // 0x0310 (784)
+0xB5B6, 0xC618, 0x9CF3, 0x6B4D, 0xFFDE, 0xFFFF, 0xEF5D, 0xAD37, 0x62EE, 0x6B4D, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFDF, 0xFFFF, 0xBDF7, 0x8C51, 0xA514, 0xAD55, 0xB596, 0xBDD7, 0xA514, 0x738E, 0xA514, 0xB5B6, 0xCE59, 0xD69A, 0xDEDB, 0xB596, // 0x0330 (816)
+0xBDF7, 0xA534, 0x6B4C, 0xEF5D, 0xF79E, 0xBDB8, 0x7370, 0x5AAC, 0x8C71, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xF79E, 0x94B2, 0x94B2, 0xA534, 0xAD55, 0xB5B6, 0xA534, 0xBDD7, 0xD69A, 0xCE59, 0xCE79, 0xCE59, 0xA534, 0x8430, // 0x0350 (848)
+0x738E, 0x3186, 0x7BB0, 0x8C33, 0x7370, 0x62ED, 0x8410, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x8C71, 0x9CD3, 0xAD55, 0xB596, 0xBDD7, 0xBDD7, 0xBDF7, 0xC618, 0xB5B6, 0xA534, 0xA534, 0x632C, // 0x0370 (880)
+0x6B6D, 0xB5B6, 0xAD76, 0xAD76, 0xBE17, 0xE71B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x94B2, 0x8C51, 0x94B2, 0xA534, 0xAD55, 0xAD55, 0x9CD3, 0x8C71, 0x73AE, 0x632C, 0xA534, // 0x0390 (912)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE59, 0xA514, 0x8430, 0x7BCF, 0x738E, 0x73AE, 0x8410, 0xA534, 0xEF7D, 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, 0xF7BE, 0xE73C, 0xE71C, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/tux.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/tux.c
new file mode 100644
index 0000000..7fefd80
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Bitmap_128x128/tux.c
@@ -0,0 +1,264 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: tux_64x64.png
+// Time generated: 14.10.2010 21:56:38
+// Dimensions : 64x64 pixels
+// Size : 8Â 192 Bytes
+
+const unsigned short tux[0x1000] ={
+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, 0xCE79, 0x9CF3, 0x7BCF, 0x738E, 0x738E, // 0x0020 (32)
+0x6B6D, 0x94B2, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xCE79, 0x6B4D, 0x5ACB, 0x8410, 0x9CF3, 0x9CF3, 0x9CF3, // 0x0060 (96)
+0x9CD3, 0x73AE, 0x4208, 0x5ACB, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xA514, 0x3186, 0x8C51, 0xBDF7, 0xC618, 0xBDF7, 0xBDF7, 0xBDF7, // 0x00A0 (160)
+0xBDF7, 0xC618, 0xBDD7, 0x738E, 0x18C3, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00B0 (176)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0xBDD7, 0x10A2, 0x8C71, 0x9CF3, 0x8C71, 0x8C71, 0x8C71, 0x8C71, 0x8C71, // 0x00E0 (224)
+0x8C71, 0x8C51, 0x8C51, 0x9CF3, 0x73AE, 0x0000, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0x2945, 0x31A6, 0x7BCF, 0x6B4D, 0x6B6D, 0x6B6D, 0x6B6D, 0x6B6D, 0x6B6D, // 0x0120 (288)
+0x6B6D, 0x6B6D, 0x6B6D, 0x6B4D, 0x73AE, 0x2124, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0xC638, 0x0000, 0x31A6, 0x52AA, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, // 0x0160 (352)
+0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x528A, 0x2104, 0x0000, 0x2965, 0xEF5D, 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, 0xFFDF, 0xFFFF, 0x8C71, 0x0000, 0x1082, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, // 0x01A0 (416)
+0x3186, 0x3186, 0x3186, 0x3186, 0x2965, 0x0020, 0x0000, 0x0000, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0x630C, 0x0000, 0x0000, 0x0861, 0x18C3, 0x10A2, 0x10A2, 0x10A2, 0x10A2, 0x18C3, // 0x01E0 (480)
+0x1082, 0x0841, 0x1082, 0x10A2, 0x0020, 0x0000, 0x0000, 0x0000, 0x528A, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0x4A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544)
+0x0861, 0x3186, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xD6BA, 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, 0x39C7, 0x0000, 0x3186, 0xAD75, 0x8C51, 0x0841, 0x0000, 0x0000, 0x0000, 0x4208, // 0x0260 (608)
+0xD6BA, 0xFFDF, 0xE71C, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0x39C7, 0x0000, 0xCE59, 0xFFFF, 0xFFFF, 0x94B2, 0x0000, 0x0000, 0x10A2, 0xE73C, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02D0 (720)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2965, 0x18E3, 0xDEDB, 0x7BCF, 0xAD75, 0xEF5D, 0x2944, 0x0000, 0x5ACA, 0xFFFF, // 0x02E0 (736)
+0xAD55, 0x94B2, 0xAD55, 0xF7BE, 0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xF7BE, 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, 0x39E7, 0x2945, 0xA514, 0x9CF3, 0x8C71, 0xD6BB, 0x39C9, 0x0000, 0x632E, 0xF7DF, // 0x0320 (800)
+0x7BEF, 0xAD54, 0x7BEF, 0xBDF7, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C71, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0330 (816)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0350 (848)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A49, 0x18C3, 0x9492, 0x39E7, 0x3187, 0xA48F, 0x8323, 0x5A00, 0x93A6, 0xCDD5, // 0x0360 (864)
+0x4209, 0x4249, 0x2965, 0x9CD2, 0xB575, 0x0000, 0x0000, 0x0000, 0x0000, 0x9492, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0370 (880)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0390 (912)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x5ACB, 0x0000, 0x9D14, 0x2905, 0x6A40, 0xE643, 0xFFAE, 0xFFF3, 0xFF70, 0xDD86, // 0x03A0 (928)
+0x7240, 0x1840, 0x18C3, 0xC65A, 0x73CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0000, 0x5A6A, 0xD566, 0xFF66, 0xFFF8, 0xFFFD, 0xFFDC, 0xFFFD, 0xFFFA, // 0x03E0 (992)
+0xFF0E, 0xE566, 0xC464, 0xC4CC, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B6D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0410 (1040)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x0800, 0xB440, 0xFFC6, 0xFFF3, 0xFFB4, 0xFFB2, 0xFF92, 0xFF72, 0xFF53, // 0x0420 (1056)
+0xFF55, 0xFF75, 0xFEF0, 0xF542, 0x8240, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0430 (1072)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0440 (1088)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0450 (1104)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8432, 0x4140, 0xFFE2, 0xFFEB, 0xFFAC, 0xFF8B, 0xFF4C, 0xFF2C, 0xFEEC, 0xFECB, // 0x0460 (1120)
+0xFE6A, 0xFE08, 0xFDA7, 0xFDC3, 0xA320, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0470 (1136)
+0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, // 0x0490 (1168)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9D14, 0x28A0, 0xF6E0, 0xFFE1, 0xFF43, 0xFF04, 0xFEC4, 0xFE84, 0xFE23, 0xFDE1, // 0x04A0 (1184)
+0xFD60, 0xFD20, 0xFD20, 0xFD20, 0x7241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04B0 (1200)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04C0 (1216)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04D0 (1232)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xB5B6, 0x0000, 0xC4A9, 0xFEC0, 0xFF00, 0xFEA0, 0xFE40, 0xFE00, 0xFDA0, 0xFD60, // 0x04E0 (1248)
+0xFD40, 0xFD20, 0xEC80, 0xDCC7, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04F0 (1264)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0500 (1280)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0510 (1296)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xAD75, 0x0000, 0xD69B, 0xF631, 0xF5C0, 0xFE80, 0xFE00, 0xFDC0, 0xFD60, 0xFD40, // 0x0520 (1312)
+0xFCC0, 0xDC86, 0xCD93, 0xE73D, 0xE71C, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0530 (1328)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, 0xFFFF, // 0x0550 (1360)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x632C, 0x0000, 0xD6BA, 0xFFFF, 0xF5F1, 0xFD40, 0xFD80, 0xFD20, 0xFCE0, 0xECA3, // 0x0560 (1376)
+0xDD6F, 0xE6FC, 0xFFFF, 0xFFFF, 0xFFFF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0570 (1392)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0580 (1408)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0590 (1424)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xDEDB, 0x0861, 0x0000, 0xD69A, 0xFFFF, 0xFFFF, 0xFED8, 0xF631, 0xF610, 0xE5F2, 0xE6B9, // 0x05A0 (1440)
+0xF7BF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xE71C, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05B0 (1456)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05C0 (1472)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05D0 (1488)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x39E7, 0x0000, 0x4228, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FF, 0xF7DF, 0xFFFF, // 0x05E0 (1504)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xEF7D, 0xFFFF, 0xFFFF, // 0x05F0 (1520)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0600 (1536)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0610 (1552)
+0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x738E, 0x0000, 0x18C3, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0620 (1568)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xCE59, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B4D, 0xFFFF, 0xFFFF, // 0x0630 (1584)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0640 (1600)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0650 (1616)
+0xFFFF, 0xFFDF, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0660 (1632)
+0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, // 0x0670 (1648)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0680 (1664)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0690 (1680)
+0xFFDF, 0xFFFF, 0xD69A, 0x0861, 0x0000, 0x2945, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06A0 (1696)
+0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xD6BA, // 0x06B0 (1712)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06C0 (1728)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06D0 (1744)
+0xFFFF, 0xFFDF, 0x39C7, 0x0000, 0x0000, 0x8430, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06E0 (1760)
+0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xFFFF, 0xCE79, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, // 0x06F0 (1776)
+0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0700 (1792)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0710 (1808)
+0xFFFF, 0x94B2, 0x0000, 0x0020, 0x0020, 0xCE79, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0720 (1824)
+0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xFFDF, 0x4A69, 0x0000, 0x0841, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, // 0x0730 (1840)
+0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0740 (1856)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0750 (1872)
+0xEF7D, 0x2104, 0x0020, 0x0000, 0x3186, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, // 0x0760 (1888)
+0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xFFFF, 0xB5B6, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, // 0x0770 (1904)
+0x10A2, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0780 (1920)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x0790 (1936)
+0x8C71, 0x0000, 0x0861, 0x0000, 0x7BCF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x07A0 (1952)
+0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xFFDF, 0x528A, 0x0000, 0x0841, 0x0020, 0x0020, 0x0020, 0x0020, // 0x07B0 (1968)
+0x0000, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07C0 (1984)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x07D0 (2000)
+0x3186, 0x0000, 0x0841, 0x10A2, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x07E0 (2016)
+0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF5D, 0xF7BE, 0xBDD7, 0x0841, 0x0861, 0x0841, 0x0841, 0x0841, 0x0020, // 0x07F0 (2032)
+0x0020, 0x1082, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0800 (2048)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, // 0x0810 (2064)
+0x0020, 0x1082, 0x0000, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, // 0x0820 (2080)
+0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF7D, 0x4208, 0x0020, 0x0861, 0x0861, 0x0841, 0x0841, // 0x0830 (2096)
+0x0841, 0x0000, 0x630C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0840 (2112)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6B4D, // 0x0850 (2128)
+0x0000, 0x0861, 0x2104, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, // 0x0860 (2144)
+0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xE73C, 0xF7BE, 0x8430, 0x0000, 0x1082, 0x0861, 0x0861, 0x0861, // 0x0870 (2160)
+0x0861, 0x0020, 0x18C3, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0880 (2176)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x2124, // 0x0890 (2192)
+0x0861, 0x0020, 0x8410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, // 0x08A0 (2208)
+0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xEF7D, 0xB5B6, 0x0861, 0x1082, 0x1082, 0x0861, 0x0861, // 0x08B0 (2224)
+0x0861, 0x0861, 0x0000, 0x8430, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08C0 (2240)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xA514, 0x0020, // 0x08D0 (2256)
+0x10A2, 0x1082, 0xD69A, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, // 0x08E0 (2272)
+0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xEF5D, 0xCE79, 0x2124, 0x1082, 0x10A2, 0x1082, 0x1082, // 0x08F0 (2288)
+0x0861, 0x1082, 0x0000, 0x4208, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0900 (2304)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x4208, 0x0861, // 0x0910 (2320)
+0x1082, 0x31A6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, // 0x0920 (2336)
+0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEDB, 0x39C7, 0x1082, 0x10A2, 0x10A2, 0x1082, // 0x0930 (2352)
+0x1082, 0x1082, 0x0841, 0x18C3, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0940 (2368)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x0841, 0x18C3, // 0x0950 (2384)
+0x0841, 0x630C, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, // 0x0960 (2400)
+0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xDEFB, 0xE73C, 0x4A49, 0x0861, 0x18C3, 0x10A2, 0x10A2, // 0x0970 (2416)
+0x10A2, 0x1082, 0x1082, 0x0841, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0980 (2432)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x3186, 0x1082, 0x18E3, // 0x0990 (2448)
+0x0861, 0x94B2, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, // 0x09A0 (2464)
+0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEDB, 0xE73C, 0x4A69, 0x1082, 0x18E3, 0x18C3, 0x10A2, // 0x09B0 (2480)
+0x10A2, 0x10A2, 0x10A2, 0x0020, 0x73AE, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09C0 (2496)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0841, 0x18E3, 0x18E3, // 0x09D0 (2512)
+0x0861, 0xAD75, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, // 0x09E0 (2528)
+0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEDB, 0xE73C, 0x52AA, 0x10A2, 0x2104, 0x18E3, 0x18C3, // 0x09F0 (2544)
+0x18C3, 0x18C3, 0x10A2, 0x0841, 0x630C, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A00 (2560)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x632C, 0x0861, 0x18E4, 0x18E4, // 0x0A10 (2576)
+0x1082, 0xC638, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, // 0x0A20 (2592)
+0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xD6BA, 0xE71C, 0x6B4D, 0x10A2, 0x18C3, 0x18C3, 0x10A2, // 0x0A30 (2608)
+0x10A2, 0x10A2, 0x18C3, 0x0861, 0x5AEB, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A40 (2624)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0862, 0x3143, 0x2924, // 0x0A50 (2640)
+0x0882, 0xBDD7, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0A60 (2656)
+0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xE73C, 0x630C, 0x2103, 0x4A69, 0x632C, 0x6B4D, // 0x0A70 (2672)
+0x528A, 0x2965, 0x18C3, 0x1081, 0x738E, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A80 (2688)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x7A40, 0xECA0, 0xCC00, // 0x0A90 (2704)
+0x3941, 0xA535, 0xFFFF, 0xF7BE, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, // 0x0AA0 (2720)
+0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEFB, 0xD6DB, 0xCE38, 0xC618, 0x4A48, 0x4A49, 0x6B6D, 0x6B4D, 0x6B4D, // 0x0AB0 (2736)
+0x6B4D, 0x630C, 0x3186, 0x18E4, 0x9492, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AC0 (2752)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC488, 0xFD41, 0xFE6D, 0xFE6A, // 0x0AD0 (2768)
+0xDC60, 0x5A25, 0xB5D8, 0xFFFF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, // 0x0AE0 (2784)
+0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xD6BB, 0xBCAB, 0xD462, 0xD462, 0x49E4, 0x10C3, 0x18C3, 0x18C3, 0x18C3, // 0x0AF0 (2800)
+0x18C3, 0x18E3, 0x10A3, 0x49C4, 0xB575, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B00 (2816)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCD70, 0xECA0, 0xFF14, 0xFF9B, 0xFF7B, // 0x0B10 (2832)
+0xFECF, 0xC3A0, 0x3143, 0x9CF3, 0xFFFF, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, // 0x0B20 (2848)
+0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEFB, 0xC617, 0xDC60, 0xFD60, 0xFD20, 0x3120, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B30 (2864)
+0x0000, 0x0000, 0x3900, 0xE460, 0xB46A, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B40 (2880)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD5F4, 0xDC20, 0xFE8E, 0xFF59, 0xFF36, 0xFF36, // 0x0B50 (2896)
+0xFF59, 0xFE6B, 0xA300, 0x18E4, 0x8410, 0xFFBE, 0xF7BE, 0xEF7D, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, // 0x0B60 (2912)
+0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEBA, 0xDEFB, 0xC5B5, 0xE4A1, 0xFEF2, 0xF716, 0x3164, 0x18E4, 0x2103, 0x1082, 0x1082, // 0x0B70 (2928)
+0x0021, 0x1061, 0xD5D0, 0xFE27, 0xB3E3, 0xCE9B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B80 (2944)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77D, 0xE697, 0xDDAF, 0xD4C8, 0xE480, 0xFE29, 0xFF36, 0xFF15, 0xFF35, 0xFF15, // 0x0B90 (2960)
+0xFF15, 0xFF36, 0xFDA5, 0x6A42, 0x1905, 0x6B4C, 0xE73C, 0xFFDF, 0xEF5D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, // 0x0BA0 (2976)
+0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xDEDB, 0xBDB5, 0xE4C3, 0xFF56, 0xFFDB, 0xAD10, 0x10A2, 0x10C3, 0x18E4, 0x1082, // 0x0BB0 (2992)
+0x2922, 0xC5B1, 0xFFDC, 0xFED1, 0xB3A2, 0xBE19, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BC0 (3008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6B8, 0xD484, 0xE4C0, 0xF584, 0xFE28, 0xFECF, 0xFF14, 0xFF13, 0xFF13, 0xFF13, 0xFF13, // 0x0BD0 (3024)
+0xFF13, 0xFF14, 0xFEF0, 0xDC80, 0x41C5, 0x2945, 0x5269, 0xCE59, 0xF7BE, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, // 0x0BE0 (3040)
+0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD69A, 0xD6DB, 0xBD95, 0xE4E2, 0xFF33, 0xFF36, 0xFF97, 0xDDF1, 0x8B66, 0x7AE4, 0x9BC7, // 0x0BF0 (3056)
+0xEEB2, 0xFF97, 0xFF37, 0xFEF0, 0xC3E0, 0xB5B7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD52B, 0xFD60, 0xFECD, 0xFF33, 0xFF13, 0xFF12, 0xFEF1, 0xFEF1, 0xFEF1, 0xFEF1, 0xFEF1, // 0x0C10 (3088)
+0xFEF1, 0xFEF1, 0xFF12, 0xFE69, 0x9B41, 0x31A8, 0x31A6, 0x39E7, 0xB5B6, 0xF79E, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, // 0x0C20 (3104)
+0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD699, 0xD6BA, 0xBD94, 0xE502, 0xFF12, 0xFF15, 0xFEF4, 0xFF55, 0xFF95, 0xFF54, 0xFF95, // 0x0C30 (3120)
+0xFF35, 0xFEF4, 0xFF14, 0xFF14, 0xF5A4, 0xB426, 0xE75E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C40 (3136)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD54C, 0xFDA0, 0xFECE, 0xFEF0, 0xFECF, 0xFEEF, 0xFEEF, 0xFEF0, 0xFEEF, 0xFEF0, 0xFEF0, // 0x0C50 (3152)
+0xFEF0, 0xFEEF, 0xFEF0, 0xFEEF, 0xF582, 0x6244, 0x39E8, 0x39C6, 0x528A, 0xE71C, 0xE73C, 0xE71C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, // 0x0C60 (3168)
+0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE9A, 0xBD94, 0xE522, 0xFF10, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, // 0x0C70 (3184)
+0xFEF2, 0xFF12, 0xFEF2, 0xFEF2, 0xFF12, 0xED85, 0xBC68, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C80 (3200)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD5B0, 0xF580, 0xFECB, 0xFEEE, 0xFECD, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, // 0x0C90 (3216)
+0xFEEE, 0xFEEE, 0xFECD, 0xFECE, 0xFECA, 0xCC60, 0x41C7, 0x39C7, 0x4228, 0xCE79, 0xEF5D, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, // 0x0CA0 (3232)
+0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE59, 0xCE9A, 0xBD73, 0xED42, 0xFF0F, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, // 0x0CB0 (3248)
+0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFF31, 0xF628, 0xC4A7, 0xDE57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE13, 0xF560, 0xFEC9, 0xFECD, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, // 0x0CD0 (3280)
+0xFEEC, 0xFEEC, 0xFECC, 0xFECC, 0xFEED, 0xFE44, 0x9323, 0x52CC, 0x73AE, 0xD69A, 0xE73C, 0xDEFB, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, // 0x0CE0 (3296)
+0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE59, 0xD69A, 0xB5D8, 0x7B28, 0xF5A2, 0xFF0F, 0xFECE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, // 0x0CF0 (3312)
+0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFECD, 0xFF10, 0xFEA9, 0xCC60, 0xD615, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D00 (3328)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE55, 0xED80, 0xFEA4, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFEC9, // 0x0D10 (3344)
+0xFEA7, 0xFEA6, 0xFEA8, 0xFEC9, 0xFECB, 0xFEEA, 0xEDA2, 0xB4F0, 0xCE9A, 0xDEFB, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, // 0x0D20 (3360)
+0xD6BA, 0xD69A, 0xCE79, 0xCE79, 0xD6BA, 0xB596, 0x4A8B, 0x72A4, 0xFE45, 0xFEEC, 0xFECC, 0xFEEC, 0xFEEC, 0xFEEC, 0xFEEC, 0xFEEC, // 0x0D30 (3376)
+0xFEEC, 0xFECB, 0xFECB, 0xFEEC, 0xFEEC, 0xFEEC, 0xFECC, 0xFEA5, 0xFDE0, 0xAC8B, 0xE75E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D40 (3392)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE632, 0xF5E0, 0xFE80, 0xFE82, 0xFEC7, 0xFEC8, 0xFEC8, 0xFEC8, 0xFEC7, 0xFEA4, 0xFE61, // 0x0D50 (3408)
+0xFE60, 0xFE60, 0xFE60, 0xFE61, 0xFE83, 0xFEA6, 0xFEA3, 0xDD22, 0xD658, 0xE75D, 0xDEDB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, // 0x0D60 (3424)
+0xD69A, 0xD69A, 0xD6BA, 0xCE59, 0x9492, 0x5289, 0x39E9, 0x9B84, 0xFEA3, 0xFEEB, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEC8, // 0x0D70 (3440)
+0xFE84, 0xFE61, 0xFE61, 0xFEA5, 0xFEC9, 0xFEA7, 0xFEA2, 0xFE80, 0xBC41, 0x8C0F, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D80 (3456)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDDCE, 0xFE40, 0xFEA0, 0xFE80, 0xFE80, 0xFEA2, 0xFEA2, 0xFEA2, 0xFEA0, 0xFE80, 0xFE80, // 0x0D90 (3472)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFE80, 0xFE80, 0xFE80, 0xFE80, 0xFE80, 0xCCE5, 0xD69A, 0xE73C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, // 0x0DA0 (3488)
+0xD69A, 0xBDF7, 0x9CD3, 0x630C, 0x4228, 0x4A69, 0x422A, 0xB423, 0xFEC0, 0xFEA5, 0xFEE7, 0xFEC7, 0xFEC7, 0xFEC6, 0xFEA3, 0xFE80, // 0x0DB0 (3504)
+0xFE80, 0xFE80, 0xFE80, 0xFE60, 0xFEA0, 0xFEC0, 0xEDC0, 0xA3A4, 0x732C, 0xAD96, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE5A8, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0DD0 (3536)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, 0xF640, 0x93A8, 0x8C72, 0xA534, 0xAD75, 0xA534, 0x9CF3, 0x8C51, // 0x0DE0 (3552)
+0x738E, 0x5ACB, 0x4A49, 0x4A69, 0x528A, 0x4A8A, 0x5249, 0xD502, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC1, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, // 0x0DF0 (3568)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFE60, 0xC482, 0x7B09, 0x7BD0, 0xB5B7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E00 (3584)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD8A, 0xFEC0, 0xFF20, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, // 0x0E10 (3600)
+0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEC0, 0xFF20, 0xAC02, 0x4209, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, // 0x0E20 (3616)
+0x528A, 0x528A, 0x52AA, 0x52AA, 0x528A, 0x4A8A, 0x5A69, 0xE5C1, 0xFF00, 0xFEC0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, // 0x0E30 (3632)
+0xFEC0, 0xFEE0, 0xFF00, 0xE561, 0x9367, 0x736E, 0x9D14, 0xD6BA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD617, 0xCCC5, 0xF620, 0xFEE0, 0xFF40, 0xFF40, 0xFF40, 0xFF20, 0xFF00, 0xFF00, 0xFF00, // 0x0E50 (3664)
+0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF40, 0xB483, 0x4A8B, 0x5ACA, 0x5ACB, 0x5ACB, 0x5ACB, 0x5ACB, // 0x0E60 (3680)
+0x5ACB, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x4A8A, 0x6289, 0xEE20, 0xFF20, 0xFEE0, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFEE0, // 0x0E70 (3696)
+0xFF20, 0xFEC0, 0xBC64, 0x732B, 0x8C72, 0xCE58, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xB576, 0x93EE, 0xA408, 0xC4A5, 0xDD63, 0xF641, 0xFEC0, 0xFF40, 0xFF80, 0xFF60, // 0x0E90 (3728)
+0xFF40, 0xFF20, 0xFF20, 0xFF40, 0xFF40, 0xFF40, 0xFF20, 0xFF20, 0xFF80, 0xAC03, 0x4A6B, 0x5ACA, 0x5ACB, 0x5ACB, 0x5AEB, 0x5AEB, // 0x0EA0 (3744)
+0x5AEB, 0x630C, 0x630C, 0x630C, 0x5AEB, 0x52CB, 0x5A69, 0xE5E1, 0xFF60, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF60, // 0x0EB0 (3760)
+0xF640, 0xA3A7, 0x738F, 0xAD96, 0xE71C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EC0 (3776)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6DB, 0xB5B8, 0x9CD4, 0x9431, 0x93EE, 0x9C0A, 0xB467, 0xD544, 0xF660, // 0x0ED0 (3792)
+0xFF60, 0xFFA0, 0xFF80, 0xFF60, 0xFF40, 0xFF40, 0xFF60, 0xFFA0, 0xD521, 0x730A, 0x73CF, 0x8C71, 0x9CD3, 0x9CF3, 0xA514, 0xA534, // 0x0EE0 (3808)
+0xAD55, 0xB596, 0xB5B6, 0xB596, 0xAD55, 0x9CF3, 0x83F0, 0xCD04, 0xFFA0, 0xFF40, 0xFF40, 0xFF40, 0xFF40, 0xFF40, 0xFFA0, 0xF621, // 0x0EF0 (3824)
+0x8B49, 0x8431, 0xCE58, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xE73C, 0xD6BB, 0xBE19, 0xA556, 0x9472, 0x9C0D, // 0x0F10 (3856)
+0xB447, 0xDD82, 0xFEE0, 0xFFA0, 0xFFC0, 0xFFC0, 0xFF80, 0xC4C2, 0x730C, 0x9CF4, 0xD69A, 0xEF5D, 0xEF7D, 0xF79E, 0xF79E, 0xF7BE, // 0x0F20 (3872)
+0xF7BE, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xEF7D, 0xDF1C, 0xC530, 0xF620, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0xE5A2, 0x834A, // 0x0F30 (3888)
+0x8C93, 0xDEDA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F40 (3904)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xEF7D, 0xD6BB, // 0x0F50 (3920)
+0xAD77, 0x9452, 0x9BEB, 0xB466, 0xC524, 0xC543, 0xA3E5, 0x734D, 0xAD76, 0xEF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F60 (3936)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF1C, 0xACB0, 0xBCA6, 0xD544, 0xCD64, 0xCD05, 0xAC07, 0x7B6D, 0x9CF4, // 0x0F70 (3952)
+0xE6FB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F80 (3968)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984)
+0xFFDE, 0xE75D, 0xC65A, 0xA536, 0x9493, 0x8C53, 0x94B4, 0xBE18, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FA0 (4000)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEFC, 0xAD57, 0x9493, 0x8C73, 0x8C73, 0x94D4, 0xBE18, 0xEF5D, // 0x0FB0 (4016)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048)
+0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF5C, 0xE73C, 0xEF5C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FE0 (4064)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF5C, 0xE73C, 0xEF5C, 0xEF7D, 0xFFDE, 0xFFFF, // 0x0FF0 (4080)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino
new file mode 100644
index 0000000..8cee78e
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino
@@ -0,0 +1,93 @@
+// UTFT_CPLD_PageSwitching (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of page switching on CPLD-based display modules..
+//
+// This demo was made for modules with a screen resolution
+// of 800x480 pixels.
+//
+// This program requires the UTFT library.
+//
+// NOTE: The display will be black for a short while during the start
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t BigFont[];
+extern uint8_t SevenSegNumFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(EHOUSE50CPLD,22,23,31,33);
+
+void setup()
+{
+ myGLCD.InitLCD();
+}
+
+void loop()
+{
+ myGLCD.setBackColor(VGA_TRANSPARENT);
+
+ myGLCD.setBrightness(0);
+ for (byte pg=0; pg<8; pg++)
+ {
+ myGLCD.setWritePage(pg);
+ myGLCD.clrScr();
+ for (int ln=0; ln<480; ln+=2)
+ {
+ switch (pg)
+ {
+ case 0:
+ myGLCD.setColor(ln/2, 0, 0);
+ break;
+ case 1:
+ myGLCD.setColor(0, ln/2, 0);
+ break;
+ case 2:
+ myGLCD.setColor(0, 0, ln/2);
+ break;
+ case 3:
+ myGLCD.setColor(ln/4, ln/2, 0);
+ break;
+ case 4:
+ myGLCD.setColor(0, ln/2, ln/2);
+ break;
+ case 5:
+ myGLCD.setColor(ln/2, 0, ln/2);
+ break;
+ case 6:
+ myGLCD.setColor(ln/2, ln/2, 0);
+ break;
+ case 7:
+ myGLCD.setColor(0, ln/2, ln/4);
+ break;
+ }
+ myGLCD.drawLine(0, ln, 799, ln);
+ myGLCD.drawLine(0, ln+1, 799, ln+1);
+ }
+ myGLCD.setColor(VGA_WHITE);
+ myGLCD.setFont(BigFont);
+ myGLCD.print("This is page:", CENTER, 200);
+ myGLCD.setFont(SevenSegNumFont);
+ myGLCD.printNumI(pg, CENTER, 240);
+ }
+ myGLCD.setBrightness(16);
+
+ while(1)
+ {
+ for (byte pg=0; pg<8; pg++)
+ {
+ myGLCD.setDisplayPage(pg);
+ delay(500);
+ }
+ }
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino
new file mode 100644
index 0000000..de371d9
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino
@@ -0,0 +1,335 @@
+// UTFT_Demo_128x128_Serial (C)2013 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 to work on the 128x128 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Declare an instance of the class
+UTFT myGLCD(LPH9135,6,5,2,3,4); // Remember to change the model parameter to suit your display module!
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD(PORTRAIT);
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ byte buf[126];
+ int x, x2;
+ int y, y2;
+ int r;
+
+// Clear the screen and draw the frame
+ myGLCD.clrScr();
+ myGLCD.setContrast(64);
+
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRect(0,0,127,12);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0,117,127,127);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255,0,0);
+ myGLCD.print("Universal TFT", CENTER, 0);
+ myGLCD.setBackColor(64,64,64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("H.Karlsen", LEFT, 116);
+ myGLCD.print("(C)2013", RIGHT, 116);
+ myGLCD.setColor(0,255,0);
+ myGLCD.drawRect(0,13,127,116);
+
+// Draw crosshairs
+ myGLCD.setColor(0,0,255);
+ myGLCD.drawLine(63,14,63,115);
+ myGLCD.drawLine(1,63,126,63);
+ for (int i=3; i<128; i+=10)
+ myGLCD.drawLine(i, 61, i, 65);
+ for (int i=14; i<118; i+=10)
+ myGLCD.drawLine(61, i, 65, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.setBackColor(0,0,0);
+ myGLCD.print("Sin", 2, 14);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(sin(((i*2.85)*3.14)/180)*45));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 2, 26);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(cos(((i*2.85)*3.14)/180)*45));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 2, 38);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(tan(((i*2.85)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+ myGLCD.setColor(0,0,255);
+ myGLCD.drawLine(63,14,63,115);
+ myGLCD.drawLine(1,63,126,63);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<3654; i++)
+ {
+ x++;
+ if (x==127)
+ x=1;
+ if (i>127)
+ {
+ if ((x==63)||(buf[x-1]==63))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=63+(sin(((i*1.3)*3.14)/180)*45);
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ delay(1);
+ }
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(10+(i*10),10+(i*10), 60+(i*10), 60+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(70-(i*10),10+(i*10), 120-(i*10), 60+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(30+(i*10),35+(i*10), 25);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+ // Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=11; i<115; i+=3)
+ {
+ myGLCD.drawLine(1, i, i-10, 115);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=112; i>14; i-=3)
+ {
+ myGLCD.drawLine(126, i, i+14, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=115; i>14; i-=3)
+ {
+ myGLCD.drawLine(1, i, 116-i, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=14; i<115; i+=3)
+ {
+ myGLCD.drawLine(126, i, 140-i, 115);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=22+random(85);
+ y=35+random(59);
+ r=random(20);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random lines
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random pixels
+ for (int i=0; i<5000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(124), 15+random(101));
+ }
+
+ delay (2000);
+
+// Set up the "Finished"-screen
+ myGLCD.setContrast(0);
+ myGLCD.fillScr(0,0,255);
+ myGLCD.setColor(255,0,0);
+ myGLCD.fillRoundRect(2, 40, 125, 88);
+
+ myGLCD.setColor(255,255,255);
+ myGLCD.setBackColor(255,0,0);
+ myGLCD.print("That's it!", CENTER, 46);
+ myGLCD.print("Restarting in a", CENTER, 66);
+ myGLCD.print("few seconds...", CENTER, 76);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.setBackColor(0,0,255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 108);
+ myGLCD.printNumI(millis(), CENTER, 118);
+
+ myGLCD.setContrast(64);
+
+ delay (10000);
+
+// Fade screen to black
+ for (int i=64; i>0; i--)
+ {
+ myGLCD.setContrast(i);
+ delay(100);
+ }
+}
+
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino
new file mode 100644
index 0000000..5ff7106
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino
@@ -0,0 +1,328 @@
+// UTFT_Demo_160x128_Serial (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 160x128 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Usage: myGLCD(, SDA, SCL, CS, RST[, RS]);
+//
+// When using the DM-TFT18-101 and shield from DisplayModule you should use the following:
+// UTFT myGLCD(DMTFT18101,2,3,4,6,5);
+//
+UTFT myGLCD(ITDB18SP,19,18,0,16,17); // Remember to change the model parameter to suit your display module!
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[158];
+ 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, 159, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 114, 159, 127);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("Universal TFT Lib.", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("H.Karlsen", LEFT, 114);
+ myGLCD.print("(C)2014", RIGHT, 114);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 13, 159, 113);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(79, 14, 79, 113);
+ myGLCD.drawLine(1, 63, 158, 63);
+
+ for (int i=9; i<150; i+=10)
+ myGLCD.drawLine(i, 61, i, 65);
+ for (int i=19; i<110; i+=10)
+ myGLCD.drawLine(77, i, 81, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(sin(((i*2.27)*3.14)/180)*40));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(cos(((i*2.27)*3.14)/180)*40));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(tan(((i*2.27)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(79, 14, 79, 113);
+ myGLCD.drawLine(1, 63, 158, 63);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(158*20); i++)
+ {
+ x++;
+ if (x==159)
+ x=1;
+ if (i>159)
+ {
+ if ((x==79)||(buf[x-1]==63))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=63+(sin(((i*2.5)*3.14)/180)*(40-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(39+(i*10), 23+(i*10), 59+(i*10), 43+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(99-(i*10), 23+(i*10), 119-(i*10), 43+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(49+(i*10),33+(i*10), 15);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=14; i<113; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 112);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=112; i>15; i-=5)
+ {
+ myGLCD.drawLine(158, i, (i*1.44)-12, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=112; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 172-(i*1.44), 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<112; i+=5)
+ {
+ myGLCD.drawLine(158, i, 171-(i*1.44), 112);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=22+random(116);
+ y=35+random(57);
+ r=random(20);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+ for (int i=0; i<5000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(156), 16+random(95));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(10, 17, 149, 72);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 20);
+ myGLCD.print("Restarting in a", CENTER, 45);
+ myGLCD.print("few seconds...", CENTER, 57);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 103);
+ myGLCD.printNumI(millis(), CENTER, 115);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176/UTFT_Demo_220x176.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176/UTFT_Demo_220x176.ino
new file mode 100644
index 0000000..b6b3ab2
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176/UTFT_Demo_220x176.ino
@@ -0,0 +1,330 @@
+// UTFT_Demo_220x176 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB22,38,39,40,41);
+
+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("> elec.henningkarlsen.com <", 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/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino
new file mode 100644
index 0000000..7ed75ac
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino
@@ -0,0 +1,323 @@
+// UTFT_Demo_220x176_Serial (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 serial modules with a screen resolution
+// of 220x176 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Usage: myGLCD(, SDA, SCL, CS, RST[, RS]);
+UTFT myGLCD(ITDB22SP,19,18,0,16); // Remember to change the model parameter to suit your display module!
+
+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("> elec.henningkarlsen.com <", 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,161);
+
+// 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/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240/UTFT_Demo_320x240.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240/UTFT_Demo_320x240.ino
new file mode 100644
index 0000000..ce458f3
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240/UTFT_Demo_320x240.ino
@@ -0,0 +1,329 @@
+// UTFT_Demo_320x240 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32S,38,39,40,41);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[318];
+ 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, 319, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 226, 319, 239);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 227);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 319, 225);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+ for (int i=9; i<310; i+=10)
+ myGLCD.drawLine(i, 117, i, 121);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(157, i, 161, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(318*20); i++)
+ {
+ x++;
+ if (x==319)
+ x=1;
+ if (i>319)
+ {
+ if ((x==159)||(buf[x-1]==119))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(100+(i*20),60+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 224);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(318, i, (i*1.44)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 331-(i*1.44), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(318, i, 330-(i*1.44), 224);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(256);
+ y=45+random(146);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(209);
+ x2=2+random(316);
+ y2=16+random(209);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(316), 16+random(209));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(80, 70, 239, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 210);
+ myGLCD.printNumI(millis(), CENTER, 225);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino
new file mode 100644
index 0000000..19da792
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino
@@ -0,0 +1,343 @@
+// UTFT_Demo_320x240_Serial (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+// ********************************************************************
+// * IMPORTANT: Read the comments in the setup() function when *
+// * using the DisplayModule DM-TFT28-105. *
+// ********************************************************************
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Usage: myGLCD(, SDA, SCL, CS, RST[, RS]);
+//UTFT myGLCD(TFT01_22SP,9,8,12,11,10); // ElecFreaks TFT01-2.2SP
+UTFT myGLCD(DMTFT28105,MOSI,SCK,10,NOTINUSE,9); // DisplayModule DM-TFT28-105
+
+void setup()
+{
+// DisplayModule
+// -------------
+// The following 4 lines are needed for the DM-TFT28-105 display
+// module to set the SS/CS pins for the other devices connected
+// to the Arduino SPI pins. If you are using any other display
+// module these lines should be commented out.
+// -------------------------------------------------------------
+ pinMode(10,OUTPUT); digitalWrite(10,HIGH); // TFT SS/CE
+ pinMode(8, OUTPUT); digitalWrite(8, HIGH); // SD card SS/CE
+ pinMode(6, OUTPUT); digitalWrite(6, HIGH); // Flash chip SS/CE
+ pinMode(4, OUTPUT); digitalWrite(4, HIGH); // Touch controller SS/CE
+// -------------------------------------------------------------
+
+
+// Just get some random numbers
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[318];
+ 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, 319, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 226, 319, 239);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 227);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 319, 225);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+ for (int i=9; i<310; i+=10)
+ myGLCD.drawLine(i, 117, i, 121);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(157, i, 161, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(318*20); i++)
+ {
+ x++;
+ if (x==319)
+ x=1;
+ if (i>319)
+ {
+ if ((x==159)||(buf[x-1]==119))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(100+(i*20),60+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 224);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(318, i, (i*1.44)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 331-(i*1.44), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(318, i, 330-(i*1.44), 224);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(256);
+ y=45+random(146);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(209);
+ x2=2+random(316);
+ y2=16+random(209);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(316), 16+random(209));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(80, 70, 239, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 210);
+ myGLCD.printNumI(millis(), CENTER, 225);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_400x240/UTFT_Demo_400x240.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_400x240/UTFT_Demo_400x240.ino
new file mode 100644
index 0000000..078902c
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_400x240/UTFT_Demo_400x240.ino
@@ -0,0 +1,331 @@
+// UTFT_Demo_400x240 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 400x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32WD,38,39,40,41);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[398];
+ 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, 399, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 226, 399, 239);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ 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.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 399, 225);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(199, 15, 199, 224);
+ myGLCD.drawLine(1, 119, 398, 119);
+ for (int i=9; i<390; i+=10)
+ myGLCD.drawLine(i, 117, i, 121);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(197, i, 201, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<398; i++)
+ {
+ myGLCD.drawPixel(i,119+(sin(((i*0.9)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<398; i++)
+ {
+ myGLCD.drawPixel(i,119+(cos(((i*0.9)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<398; i++)
+ {
+ y=119+(tan(((i*0.9)*3.14)/180));
+ if ((y>15) && (y<224))
+ myGLCD.drawPixel(i,y);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(199, 15, 199, 224);
+ myGLCD.drawLine(1, 119, 398, 119);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(398*20); i++)
+ {
+ x++;
+ if (x==399)
+ x=1;
+ if (i>399)
+ {
+ if ((x==199)||(buf[x-1]==119))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=119+(sin(((i)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// 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(110+(i*20), 30+(i*20), 170+(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// 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(230-(i*20), 30+(i*20), 290-(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// 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(110+(i*30),60+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.77)-10, 224);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(398, i, (i*1.77)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 411-(i*1.77), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(398, i, 410-(i*1.77), 224);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(336);
+ y=45+random(146);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(396);
+ y=16+random(207);
+ x2=2+random(396);
+ y2=16+random(207);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(396);
+ y=16+random(207);
+ x2=2+random(396);
+ y2=16+random(207);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(396);
+ y=16+random(209);
+ x2=2+random(396);
+ y2=16+random(209);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,398,224);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(396), 16+random(209));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(120, 70, 279, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 210);
+ myGLCD.printNumI(millis(), CENTER, 225);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x272/UTFT_Demo_480x272.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x272/UTFT_Demo_480x272.ino
new file mode 100644
index 0000000..41c1973
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x272/UTFT_Demo_480x272.ino
@@ -0,0 +1,328 @@
+// UTFT_Demo_480x272 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 480x272 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB43,38,39,40,41);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[478];
+ 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, 479, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 258, 479, 271);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 259);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 479, 257);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(239, 15, 239, 256);
+ myGLCD.drawLine(1, 135, 478, 135);
+ for (int i=9; i<470; i+=10)
+ myGLCD.drawLine(i, 133, i, 138);
+ for (int i=15; i<256; i+=10)
+ myGLCD.drawLine(237, i, 241, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,135+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,135+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,135+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(239, 15, 239, 256);
+ myGLCD.drawLine(1, 135, 478, 135);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(478*20); i++)
+ {
+ x++;
+ if (x==479)
+ x=1;
+ if (i>479)
+ {
+ if ((x==239)||(buf[x-1]==135))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=135+(sin(((i*1.65)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// 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(150+(i*20), 46+(i*20), 210+(i*20), 106+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// 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(330-(i*20), 46+(i*20), 270-(i*20), 106+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// 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(180+(i*20),75+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<256; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.88)-10, 256);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=256; i>15; i-=5)
+ {
+ myGLCD.drawLine(478, i, (i*1.88)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=256; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 491-(i*1.88), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<256; i+=5)
+ {
+ myGLCD.drawLine(478, i, 490-(i*1.88), 256);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// Draw some random circles
+ for (int i=0; i<150; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(416);
+ y=45+random(178);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// Draw some random rectangles
+ for (int i=0; i<150; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(239);
+ x2=2+random(476);
+ y2=16+random(239);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<150; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(239);
+ x2=2+random(476);
+ y2=16+random(239);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+ for (int i=0; i<150; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(239);
+ x2=2+random(476);
+ y2=16+random(239);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,256);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(476), 16+random(239));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(160, 70, 319, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 243);
+ myGLCD.printNumI(millis(), CENTER, 258);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x320/UTFT_Demo_480x320.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x320/UTFT_Demo_480x320.ino
new file mode 100644
index 0000000..6746a93
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_480x320/UTFT_Demo_480x320.ino
@@ -0,0 +1,329 @@
+// UTFT_Demo_480x320 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 480x320 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(CTE32HR,25,26,27,28);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[478];
+ 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, 479, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 306, 479, 319);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 307);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 479, 305);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(239, 15, 239, 304);
+ myGLCD.drawLine(1, 159, 478, 159);
+ for (int i=9; i<470; i+=10)
+ myGLCD.drawLine(i, 157, i, 161);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(237, i, 241, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,159+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,159+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<478; i++)
+ {
+ myGLCD.drawPixel(i,159+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(239, 15, 239, 304);
+ myGLCD.drawLine(1, 159, 478, 159);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(478*15); i++)
+ {
+ x++;
+ if (x==479)
+ x=1;
+ if (i>479)
+ {
+ if ((x==239)||(buf[x-1]==159))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=159+(sin(((i*0.7)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// 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(150+(i*20), 70+(i*20), 210+(i*20), 130+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// 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(270-(i*20), 70+(i*20), 330-(i*20), 130+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// 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(180+(i*20),100+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<304; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.6)-10, 304);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=304; i>15; i-=5)
+ {
+ myGLCD.drawLine(478, i, (i*1.6)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=304; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 491-(i*1.6), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<304; i+=5)
+ {
+ myGLCD.drawLine(478, i, 490-(i*1.6), 304);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(416);
+ y=45+random(226);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(289);
+ x2=2+random(476);
+ y2=16+random(289);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(289);
+ x2=2+random(476);
+ y2=16+random(289);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(476);
+ y=16+random(289);
+ x2=2+random(476);
+ y2=16+random(289);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,478,304);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(476), 16+random(289));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(160, 70, 319, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 290);
+ myGLCD.printNumI(millis(), CENTER, 305);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_800x480/UTFT_Demo_800x480.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_800x480/UTFT_Demo_800x480.ino
new file mode 100644
index 0000000..293bc00
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Demo_800x480/UTFT_Demo_800x480.ino
@@ -0,0 +1,288 @@
+// UTFT_Demo_800x480 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 800x480 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB50,38,39,40,41);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[798];
+ 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, 799, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 466, 799, 479);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 467);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 799, 465);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(399, 15, 399, 464);
+ myGLCD.drawLine(1, 239, 798, 239);
+ for (int i=9; i<790; i+=10)
+ myGLCD.drawLine(i, 237, i, 242);
+ for (int i=19; i<470; i+=10)
+ myGLCD.drawLine(397, i, 402, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<798; i++)
+ {
+ myGLCD.drawPixel(i,239+(sin(((i*1.13)*3.14)/180)*200));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<798; i++)
+ {
+ myGLCD.drawPixel(i,239+(cos(((i*1.13)*3.14)/180)*200));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<798; i++)
+ {
+ myGLCD.drawPixel(i,239+(tan(((i*0.9)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(399, 15, 399, 464);
+ myGLCD.drawLine(1, 239, 798, 239);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(798*20); i++)
+ {
+ x++;
+ if (x==799)
+ x=1;
+ if (i>799)
+ {
+ if ((x==399)||(buf[x-1]==239))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=239+(sin(((i*1.65)*3.14)/180)*(200-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random filled rectangles
+ for (int i=0; i<50; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(746);
+ y=16+random(397);
+ x2=x+50;
+ y2=y+50;
+ myGLCD.fillRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random filled, rounded rectangles
+ for (int i=0; i<50; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(746);
+ y=16+random(397);
+ x2=x+50;
+ y2=y+50;
+ myGLCD.fillRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random filled circles
+ for (int i=0; i<50; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=27+random(746);
+ y=41+random(397);
+ myGLCD.fillCircle(x, y, 25);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<463; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.66)-10, 463);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=463; i>15; i-=5)
+ {
+ myGLCD.drawLine(798, i, (i*1.66)+30, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=463; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 770-(i*1.66), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<463; i+=5)
+ {
+ myGLCD.drawLine(798, i, 810-(i*1.66), 463);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random circles
+ for (int i=0; i<250; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(736);
+ y=45+random(386);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random rectangles
+ for (int i=0; i<250; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(796);
+ y=16+random(447);
+ x2=2+random(796);
+ y2=16+random(447);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<250; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(796);
+ y=16+random(447);
+ x2=2+random(796);
+ y2=16+random(447);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+ for (int i=0; i<250; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(796);
+ y=16+random(447);
+ x2=2+random(796);
+ y2=16+random(447);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,798,464);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(796), 16+random(447));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(320, 190, 479, 289);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 213);
+ myGLCD.print("Restarting in a", CENTER, 239);
+ myGLCD.print("few seconds...", CENTER, 252);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 450);
+ myGLCD.printNumI(millis(), CENTER, 465);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/UTFT_Rotate_Bitmap.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/UTFT_Rotate_Bitmap.ino
new file mode 100644
index 0000000..9f2a83f
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/UTFT_Rotate_Bitmap.ino
@@ -0,0 +1,37 @@
+// UTFT_Rotate_Bitmap (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the drawBitmap()-function.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32S,38,39,40,41);
+
+extern unsigned short biohazard[0x1000];
+
+void setup()
+{
+ myGLCD.InitLCD(LANDSCAPE);
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.setColor(0, 0, 0);
+}
+
+void loop()
+{
+ for (int i=0; i<360; i+=5)
+ {
+ myGLCD.drawBitmap (10, 10, 64, 64, biohazard, i, 32, 32);
+ }
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/biohazard.c b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/biohazard.c
new file mode 100644
index 0000000..ca1348d
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Rotate_Bitmap/biohazard.c
@@ -0,0 +1,264 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: biohazard1_L.png
+// Time generated: 12.06.2011 00:23:59
+// Dimensions : 64x64 pixels
+// Size : 8Â 192 Bytes
+
+const unsigned short biohazard[0x1000] ={
+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, 0xEF7D, 0xC638, 0x9492, 0x6B4D, 0x4228, 0x2945, 0x2124, 0x18C3, 0x1082, // 0x0020 (32)
+0x1082, 0x10A2, 0x18C3, 0x2124, 0x2965, 0x4A49, 0x6B6D, 0x9CD3, 0xCE79, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xF7BE, 0xBDD7, 0x6B6D, 0x2965, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x31A6, 0x73AE, 0xC618, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xE73C, 0x8C71, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, // 0x00A0 (160)
+0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x4207, 0x9CF3, 0xF79E, 0xFFFF, // 0x00B0 (176)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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)
+0xEF7D, 0x8C51, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0x9CD3, // 0x00F0 (240)
+0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, // 0x0110 (272)
+0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0020, 0x2901, 0x5241, 0x7B41, 0x9C02, 0xACA2, 0xBD02, // 0x0120 (288)
+0xC521, 0xBD02, 0xACA2, 0x9C22, 0x7B41, 0x5241, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304)
+0x39E7, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xEF5D, 0x630C, 0x0000, // 0x0150 (336)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x41C1, 0x93E1, 0xD5A1, 0xFEA1, 0xFF01, 0xFF20, 0xFF20, 0xFF20, 0xFF00, // 0x0160 (352)
+0xFF00, 0xFF00, 0xFF20, 0xFF20, 0xFF20, 0xFF01, 0xFEA1, 0xD5A1, 0x93E1, 0x49E1, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0170 (368)
+0x0000, 0x0841, 0x7BEF, 0xF7BE, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xC638, 0x2965, 0x0000, 0x0000, // 0x0190 (400)
+0x0000, 0x0000, 0x0000, 0x0000, 0x18A0, 0x7B41, 0xD5A1, 0xFF01, 0xFF20, 0xFEE0, 0xFEC0, 0xFEA0, 0xF680, 0xF680, 0xFEA0, 0xFEA0, // 0x01A0 (416)
+0xFEA0, 0xFEA0, 0xFEA0, 0xF680, 0xF680, 0xFEA0, 0xFEC0, 0xFF00, 0xFF20, 0xFF01, 0xD5A1, 0x7B41, 0x1880, 0x0000, 0x0000, 0x0000, // 0x01B0 (432)
+0x0000, 0x0000, 0x0000, 0x4208, 0xDEDB, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD55, 0x1082, 0x0000, 0x0000, 0x0000, // 0x01D0 (464)
+0x0000, 0x0000, 0x0840, 0x7B62, 0xEE41, 0xFF21, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF20, 0xFF20, 0xFEA1, 0xFEC0, // 0x01E0 (480)
+0xFEC0, 0xFEC0, 0xFEA1, 0xFF00, 0xFF20, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFF21, 0xEE41, 0x7B62, 0x0840, 0x0000, // 0x01F0 (496)
+0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xC618, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528)
+0x0000, 0x5201, 0xDDE1, 0xFF21, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF40, 0xF6A1, 0xB4C1, 0x7322, 0xA441, 0xFEE0, // 0x0220 (544)
+0xFEA0, 0xFEE0, 0xA461, 0x7322, 0xACA1, 0xF681, 0xFF40, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF21, 0xDDE2, 0x4A01, // 0x0230 (560)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xB596, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, // 0x0250 (592)
+0x9402, 0xFF01, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEE0, 0xFF01, 0x9401, 0x3961, 0x7341, 0xCD81, 0xF680, 0xFEC0, // 0x0260 (608)
+0xFEA0, 0xFEC0, 0xF681, 0xCD81, 0x7B61, 0x3961, 0x8BE1, 0xFEE1, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFF01, // 0x0270 (624)
+0x9402, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0xB596, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0280 (640)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xA534, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0xCD61, // 0x0290 (656)
+0xFF40, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF01, 0xE621, 0x39A1, 0x20E1, 0xCD81, 0xFF40, 0xFEE0, 0xFEC0, 0xFEC0, // 0x02A0 (672)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEE0, 0xFF41, 0xCDC1, 0x2901, 0x3961, 0xDE01, 0xFF00, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEA0, // 0x02B0 (688)
+0xFF21, 0xC561, 0x18A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x3121, 0xDE01, 0xFF00, // 0x02D0 (720)
+0xFE80, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF01, 0xD5A2, 0x18A0, 0x20E0, 0xF682, 0xFF01, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, // 0x02E0 (736)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF00, 0xF6A1, 0x2920, 0x1080, 0xCDA2, 0xFF01, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x02F0 (752)
+0xFE80, 0xFF00, 0xDE01, 0x2921, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x2921, 0xEE41, 0xFF00, 0xFEA0, // 0x0310 (784)
+0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, 0xDE02, 0x18A1, 0x0840, 0xDDE1, 0xFF00, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, // 0x0320 (800)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEE0, 0xE621, 0x0860, 0x1880, 0xD5E2, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0330 (816)
+0xFEA0, 0xFEA0, 0xFF00, 0xE641, 0x2921, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C0, 0xDE21, 0xFF00, 0xFEA0, 0xFEC0, // 0x0350 (848)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC1, 0x39A1, 0x0000, 0x8382, 0xFF21, 0xFE80, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0360 (864)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFE80, 0xFF20, 0x8BC1, 0x0000, 0x3161, 0xF6A1, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0370 (880)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xDE01, 0x18A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0xCD61, 0xFF00, 0xFEA0, 0xFEC0, 0xFEC0, // 0x0390 (912)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF21, 0x93E1, 0x0000, 0x1060, 0xDE01, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x03A0 (928)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEE0, 0xE621, 0x1080, 0x0000, 0x8BA1, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, // 0x03B0 (944)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xCD61, 0x0820, 0x0000, 0x0000, 0x0000, 0x0021, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x9402, 0xFF41, 0xFE80, 0xFEA0, 0xFEC0, 0xFEC0, // 0x03D0 (976)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xF681, 0x20E0, 0x0000, 0x41A1, 0xFEE1, 0xFEA0, 0xFEA1, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x03E0 (992)
+0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF01, 0x49E1, 0x0000, 0x18A1, 0xEE41, 0xFEC0, 0xFEA0, 0xFEC0, // 0x03F0 (1008)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFE80, 0xFF41, 0x9402, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A01, 0xFF01, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0410 (1040)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0xA461, 0x0000, 0x0000, 0x6AC1, 0xFF21, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, // 0x0420 (1056)
+0xFEE0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFE80, 0xFF20, 0x7300, 0x0000, 0x0000, 0x9C21, 0xFF20, 0xFEA0, 0xFEC0, // 0x0430 (1072)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF01, 0x49E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0440 (1088)
+0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0840, 0xDDE1, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0450 (1104)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFF20, 0x6261, 0x0000, 0x0000, 0x7300, 0xFF21, 0xF6A0, 0xFEA0, 0xFEE0, 0xFF20, 0xFF00, 0xFEA1, 0xEE42, // 0x0460 (1120)
+0xE602, 0xEE42, 0xFEA1, 0xFF00, 0xFF20, 0xFEE0, 0xFEA0, 0xF681, 0xFF40, 0x8360, 0x0000, 0x0000, 0x5241, 0xFF01, 0xFEA0, 0xFEA0, // 0x0470 (1136)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xDDC1, 0x0840, 0x0000, 0x0000, 0x0000, 0x2945, 0xEF7D, 0xFFFF, 0xFFFF, // 0x0480 (1152)
+0xFFFF, 0xFFDF, 0xFFFF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x7B42, 0xFF21, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0490 (1168)
+0xFEC0, 0xFEA0, 0xFEC0, 0xFEA0, 0x2900, 0x0000, 0x0000, 0x6AE0, 0xFF21, 0xFEC0, 0xFF01, 0xDE01, 0x9C01, 0x5241, 0x2921, 0x18A1, // 0x04A0 (1184)
+0x1061, 0x1881, 0x2921, 0x5241, 0x9C02, 0xDDE1, 0xFF21, 0xFEC0, 0xFF20, 0x7321, 0x0000, 0x0000, 0x20E0, 0xF681, 0xFEC0, 0xFEA0, // 0x04B0 (1200)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF21, 0x7B41, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFDF, // 0x04C0 (1216)
+0xFFDF, 0xFFFF, 0xEF7D, 0x2104, 0x0000, 0x0000, 0x0000, 0x1080, 0xEE41, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x04D0 (1232)
+0xFEC0, 0xFEA0, 0xFEC0, 0xEE21, 0x1060, 0x0000, 0x0000, 0x41C1, 0xFF21, 0xDDE1, 0x6AC1, 0x0860, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04E0 (1248)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0860, 0x62C1, 0xDDC1, 0xFF41, 0x49E1, 0x0000, 0x0000, 0x0840, 0xE601, 0xFEE0, 0xFEA0, // 0x04F0 (1264)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xEE41, 0x1080, 0x0000, 0x0000, 0x0000, 0x39C7, 0xF7BE, 0xFFFF, // 0x0500 (1280)
+0xFFDF, 0xFFFF, 0xA534, 0x0000, 0x0000, 0x0000, 0x0000, 0x7B21, 0xFF21, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0510 (1296)
+0xFEA0, 0xFEA0, 0xFEE0, 0xE602, 0x0841, 0x0000, 0x0000, 0x1080, 0xACC2, 0x1060, 0x0000, 0x0000, 0x0000, 0x0020, 0x2920, 0x4A01, // 0x0520 (1312)
+0x5241, 0x4A01, 0x3140, 0x0821, 0x0000, 0x0000, 0x0000, 0x0860, 0xACA2, 0x18A0, 0x0000, 0x0000, 0x0820, 0xDDE2, 0xFEE0, 0xFEA0, // 0x0530 (1328)
+0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFE80, 0xFF21, 0x7321, 0x0000, 0x0000, 0x0000, 0x0020, 0xC618, 0xFFFF, // 0x0540 (1344)
+0xFFFF, 0xFFFF, 0x52AA, 0x0000, 0x0020, 0x0000, 0x0820, 0xDDA1, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0550 (1360)
+0xFEC0, 0xFEA0, 0xFEE0, 0xE621, 0x1060, 0x0000, 0x0000, 0x0000, 0x6AE2, 0x20C1, 0x0000, 0x20E1, 0x8BA2, 0xD5A1, 0xFEA1, 0xFF00, // 0x0560 (1376)
+0xFF01, 0xFF00, 0xFEC1, 0xD5C1, 0x8BC2, 0x2901, 0x0000, 0x18A1, 0x7302, 0x0000, 0x0000, 0x0000, 0x0840, 0xDE01, 0xFEE0, 0xFEA0, // 0x0570 (1392)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEE0, 0xD5A1, 0x0020, 0x0000, 0x0000, 0x0000, 0x738E, 0xFFFF, // 0x0580 (1408)
+0xFFFF, 0xE71C, 0x18C3, 0x0000, 0x0020, 0x0000, 0x49C1, 0xFF01, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0590 (1424)
+0xFEA0, 0xFEA0, 0xFEC0, 0xF661, 0x18A0, 0x0000, 0x0000, 0x0000, 0x2101, 0x8363, 0x7321, 0xEE81, 0xFF21, 0xFEE0, 0xFEC0, 0xFEA0, // 0x05A0 (1440)
+0xFEA0, 0xFEA0, 0xFEC0, 0xFEE0, 0xFF20, 0xF681, 0x7B41, 0x8362, 0x2921, 0x0000, 0x0000, 0x0000, 0x1080, 0xEE41, 0xFEC0, 0xFEA0, // 0x05B0 (1456)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF01, 0x41C1, 0x0000, 0x0020, 0x0000, 0x3186, 0xF79E, // 0x05C0 (1472)
+0xFFFF, 0xAD75, 0x0000, 0x0000, 0x0020, 0x0000, 0x93E1, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, // 0x05D0 (1488)
+0xFEC0, 0xFEA0, 0xFEA0, 0xFF41, 0x5221, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0xFF01, 0xFF00, 0xF660, 0xFEA0, 0xFEA0, 0xFEC0, // 0x05E0 (1504)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xF660, 0xFF00, 0xFF22, 0x49E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x49E1, 0xFF40, 0xFEA0, 0xFEA0, // 0x05F0 (1520)
+0xFEA1, 0xFEC0, 0xFEA1, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0x93E1, 0x0000, 0x0020, 0x0000, 0x0020, 0xC638, // 0x0600 (1536)
+0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0020, 0xD5A1, 0xFF00, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA1, 0xFEA0, // 0x0610 (1552)
+0xFEA1, 0xFF20, 0xFEC1, 0xD5C1, 0x5220, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x3981, 0xE622, 0xFF20, 0xFEC0, 0xFEA0, 0xFEA0, // 0x0620 (1568)
+0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF21, 0xE621, 0x41C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49E0, 0xCDA2, 0xFEA1, 0xFF20, // 0x0630 (1584)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xD5A1, 0x0020, 0x0000, 0x0000, 0x0000, 0x9492, // 0x0640 (1600)
+0xFFFF, 0x4A49, 0x0000, 0x0020, 0x0000, 0x2901, 0xFEA1, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, // 0x0650 (1616)
+0xFEE1, 0xA461, 0x3981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1881, 0x93E1, 0xE622, 0xFF01, 0xFF00, // 0x0660 (1632)
+0xFEA0, 0xFF00, 0xFF21, 0xEE41, 0x9401, 0x18A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0x9C21, // 0x0670 (1648)
+0xFEC1, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEA1, 0x2901, 0x0000, 0x0020, 0x0000, 0x632C, // 0x0680 (1664)
+0xE71C, 0x2124, 0x0000, 0x0020, 0x0000, 0x5241, 0xFF01, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF00, 0xD5C1, // 0x0690 (1680)
+0x41C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1081, 0x4A01, 0xAC81, // 0x06A0 (1696)
+0xFF21, 0xB4C1, 0x5221, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x06B0 (1712)
+0x3981, 0xCD81, 0xFF21, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF01, 0x5221, 0x0000, 0x0020, 0x0000, 0x4228, // 0x06C0 (1728)
+0xBDF7, 0x18C3, 0x0000, 0x0020, 0x0000, 0x7B41, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF20, 0xBD02, 0x1060, // 0x06D0 (1744)
+0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5201, // 0x06E0 (1760)
+0xFFC0, 0x5A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, // 0x06F0 (1776)
+0x0000, 0x0840, 0xACA1, 0xFF21, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0x7B41, 0x0000, 0x0020, 0x0000, 0x2945, // 0x0700 (1792)
+0x94B2, 0x0861, 0x0000, 0x0000, 0x0000, 0x9C02, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xBD22, 0x0820, 0x0000, // 0x0710 (1808)
+0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1881, 0xAC81, // 0x0720 (1824)
+0xFF20, 0xB4A1, 0x18A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0730 (1840)
+0x0020, 0x0000, 0x0000, 0xB4C2, 0xFF00, 0xFE80, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0x9C02, 0x0000, 0x0020, 0x0000, 0x2104, // 0x0740 (1856)
+0x73AE, 0x0841, 0x0000, 0x0000, 0x0000, 0xACA2, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, 0xE622, 0x18A1, 0x0000, 0x0000, // 0x0750 (1872)
+0x0000, 0x1080, 0x5221, 0x6B03, 0x6AE2, 0x6AE3, 0x4A01, 0x1080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1061, 0xCD82, 0xFF20, // 0x0760 (1888)
+0xFE80, 0xFF20, 0xD5C2, 0x1881, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1080, 0x5241, 0x6AE3, 0x6AE2, 0x6AE3, 0x5A62, 0x18C0, // 0x0770 (1904)
+0x0000, 0x0000, 0x0000, 0x1060, 0xDDE2, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF20, 0xACA2, 0x0000, 0x0000, 0x0000, 0x10A2, // 0x0780 (1920)
+0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0xBD02, 0xFF00, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF01, 0x5A61, 0x0000, 0x0000, 0x18A0, // 0x0790 (1936)
+0x9401, 0xEE61, 0xFEE2, 0x49E2, 0x18A1, 0x62A1, 0xFF41, 0xE621, 0x8BC2, 0x1880, 0x0000, 0x0820, 0x0000, 0x7B21, 0xFF40, 0xFE80, // 0x07A0 (1952)
+0xFEC0, 0xFE80, 0xFF40, 0x8381, 0x0000, 0x0820, 0x0000, 0x1080, 0x8BE2, 0xEE41, 0xFF41, 0x62A2, 0x10A1, 0x3982, 0xFEC2, 0xF6A1, // 0x07B0 (1968)
+0xA462, 0x2101, 0x0000, 0x0000, 0x49E1, 0xFF01, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF00, 0xBD02, 0x0000, 0x0000, 0x0000, 0x1082, // 0x07C0 (1984)
+0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0xC521, 0xFF00, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF00, 0xCD41, 0x0000, 0x0000, 0x49C1, 0xE642, // 0x07D0 (2000)
+0xFF21, 0xFEE0, 0xEE42, 0x1081, 0x0000, 0x41A0, 0xFEE0, 0xFEC0, 0xFF40, 0xE621, 0x41A1, 0x0000, 0x0000, 0x93E1, 0xFF20, 0xFEA0, // 0x07E0 (2016)
+0xFEA0, 0xFEA0, 0xFF20, 0x9C22, 0x0000, 0x0000, 0x3981, 0xDE01, 0xFF21, 0xFEC0, 0xFEE1, 0x49E1, 0x0000, 0x0840, 0xE602, 0xFEC0, // 0x07F0 (2032)
+0xFF20, 0xEE81, 0x5A61, 0x0000, 0x0000, 0xBCE1, 0xFF00, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF00, 0xC521, 0x0000, 0x0000, 0x0000, 0x1082, // 0x0800 (2048)
+0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0xBD02, 0xFF00, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF20, 0x6AC1, 0x0000, 0x49E1, 0xFEE2, 0xFEE0, // 0x0810 (2064)
+0xFE80, 0xFEC0, 0xF682, 0x20E1, 0x0000, 0x39A0, 0xFEE0, 0xFEA0, 0xFE80, 0xFEE0, 0xF6A2, 0x41A1, 0x3961, 0xDDC1, 0xFF00, 0xFE80, // 0x0820 (2080)
+0xFEA0, 0xFEA0, 0xFF00, 0xE601, 0x41C1, 0x3981, 0xF682, 0xFF00, 0xFE80, 0xFEA0, 0xFF00, 0x41C1, 0x0000, 0x20C1, 0xF661, 0xFEC0, // 0x0830 (2096)
+0xF6A0, 0xFEC0, 0xFF01, 0x6261, 0x0000, 0x5A41, 0xFF01, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF00, 0xBD02, 0x0000, 0x0000, 0x0000, 0x1082, // 0x0840 (2112)
+0x738E, 0x0841, 0x0000, 0x0000, 0x0000, 0xACA2, 0xFF20, 0xFEA0, 0xFEA0, 0xFEC0, 0xF681, 0x18A0, 0x1080, 0xEE41, 0xFEE0, 0xFEA0, // 0x0850 (2128)
+0xFEC0, 0xFEA0, 0xFEE1, 0x3980, 0x0000, 0x20C0, 0xF662, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, 0xF681, 0xFEE1, 0xFF01, 0xDDC1, 0xFF21, // 0x0860 (2144)
+0xFF20, 0xFF21, 0xDDC1, 0xFEC1, 0xFF01, 0xF661, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA1, 0x2900, 0x0000, 0x3140, 0xFEA1, 0xFEA0, // 0x0870 (2160)
+0xFEA0, 0xFEA0, 0xFEC0, 0xF6A1, 0x2101, 0x0840, 0xEE41, 0xFEE0, 0xFEA0, 0xFEA0, 0xFF20, 0xAC82, 0x0000, 0x0000, 0x0000, 0x10A2, // 0x0880 (2176)
+0x9492, 0x0861, 0x0000, 0x0000, 0x0000, 0x9C02, 0xFF20, 0xFEA0, 0xFEA0, 0xFF00, 0xD582, 0x0000, 0x93C1, 0xFF40, 0xFE80, 0xFEC0, // 0x0890 (2192)
+0xFEC0, 0xFEA0, 0xFF21, 0x6AC1, 0x0000, 0x0000, 0xCD41, 0xFF00, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEE0, 0xDDE1, 0x41A1, 0x0860, 0x6AC1, // 0x08A0 (2208)
+0x93E1, 0x6AE1, 0x0841, 0x3161, 0xD5C1, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF00, 0xCD61, 0x0000, 0x0000, 0x5A81, 0xFF21, 0xFEA0, // 0x08B0 (2224)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0xAC81, 0x0000, 0xC521, 0xFF00, 0xFEA0, 0xFEA0, 0xFF20, 0x9C02, 0x0000, 0x0020, 0x0000, 0x2104, // 0x08C0 (2240)
+0xB5B6, 0x10A2, 0x0000, 0x0020, 0x0000, 0x7B41, 0xFF20, 0xFEA0, 0xFEA0, 0xFF20, 0xAC80, 0x0820, 0xEE41, 0xFEC0, 0xFEA0, 0xFEC0, // 0x08D0 (2256)
+0xFEC0, 0xFEA0, 0xFF00, 0xAC81, 0x0000, 0x0000, 0x7301, 0xFF20, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEE0, 0xD5C1, 0x0000, 0x0000, 0x0000, // 0x08E0 (2272)
+0x0000, 0x0000, 0x0000, 0x0000, 0xD561, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF41, 0x7B42, 0x0000, 0x0000, 0xA442, 0xFF21, 0xFEA0, // 0x08F0 (2288)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA1, 0x1080, 0x9C00, 0xFF40, 0xFEA0, 0xFEA0, 0xFF20, 0x7B41, 0x0000, 0x0020, 0x0000, 0x2124, // 0x0900 (2304)
+0xDEFB, 0x2104, 0x0000, 0x0020, 0x0000, 0x5221, 0xFF01, 0xFEA0, 0xFEA0, 0xFF40, 0x93C0, 0x3961, 0xFF21, 0xFEA0, 0xFEC0, 0xFEC0, // 0x0910 (2320)
+0xFEC0, 0xFEA0, 0xFEC0, 0xEE61, 0x1881, 0x0000, 0x1080, 0xEE21, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFF01, 0x41C1, 0x0000, 0x0020, // 0x0920 (2336)
+0x0000, 0x0020, 0x0000, 0x3961, 0xFEE1, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEC0, 0xEE61, 0x18A1, 0x0000, 0x1060, 0xE621, 0xFEC0, 0xFEA0, // 0x0930 (2352)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF21, 0x4A01, 0x8361, 0xFF40, 0xFEA0, 0xFEA0, 0xFF01, 0x5221, 0x0000, 0x0020, 0x0000, 0x4208, // 0x0940 (2368)
+0xFFDF, 0x4208, 0x0000, 0x0000, 0x0000, 0x2901, 0xFEA1, 0xFEC0, 0xFEA0, 0xFF40, 0x93C0, 0x5A60, 0xFF41, 0xFEA0, 0xFEC0, 0xFEC0, // 0x0950 (2384)
+0xFEA0, 0xFEC0, 0xFEA0, 0xFF21, 0x7B41, 0x0000, 0x0000, 0x6281, 0xFF21, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF21, 0x62A1, 0x0000, 0x0000, // 0x0960 (2400)
+0x0000, 0x0000, 0x0000, 0x5A41, 0xFF01, 0xFEA0, 0xFEA0, 0xF680, 0xFF41, 0x6AC1, 0x0000, 0x0000, 0x7301, 0xFF21, 0xFEA0, 0xFEA0, // 0x0970 (2416)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF40, 0x6AE1, 0x8361, 0xFF40, 0xFEA0, 0xFEC0, 0xFEA1, 0x2901, 0x0000, 0x0020, 0x0000, 0x630C, // 0x0980 (2432)
+0xFFFF, 0x6B6D, 0x0000, 0x0020, 0x0000, 0x0020, 0xD5A1, 0xFF00, 0xFEA0, 0xFF20, 0xA461, 0x6AC0, 0xFF40, 0xFEA0, 0xFEC0, 0xFEC0, // 0x0990 (2448)
+0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xEE61, 0x18C0, 0x0000, 0x0000, 0x93E2, 0xFF41, 0xFEA0, 0xFE80, 0xFF20, 0x6AE1, 0x0000, 0x0000, // 0x09A0 (2464)
+0x0000, 0x0000, 0x0000, 0x62A1, 0xFF21, 0xFE80, 0xFEA0, 0xFF40, 0x9C22, 0x0000, 0x0000, 0x1881, 0xE641, 0xFEC0, 0xFEC0, 0xFEC0, // 0x09B0 (2480)
+0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF40, 0x7B61, 0x9C00, 0xFF40, 0xFE80, 0xFF00, 0xD581, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, // 0x09C0 (2496)
+0xFFFF, 0xA534, 0x0000, 0x0000, 0x0000, 0x0000, 0x93E1, 0xFF20, 0xFE80, 0xFF00, 0xC541, 0x72E1, 0xFF20, 0xFEA0, 0xFEC0, 0xFEC0, // 0x09D0 (2512)
+0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF00, 0xB4C1, 0x0000, 0x0020, 0x0000, 0x93E1, 0xFF21, 0xFEC0, 0xFF01, 0x5A81, 0x0000, 0x0000, // 0x09E0 (2528)
+0x0000, 0x0000, 0x0000, 0x5222, 0xFF01, 0xFEC0, 0xFF21, 0x9C01, 0x0000, 0x0020, 0x0000, 0xAC81, 0xFF01, 0xFEA0, 0xFEA0, 0xFEC0, // 0x09F0 (2544)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF20, 0x7B40, 0xBD01, 0xFF20, 0xF680, 0xFF20, 0x93C1, 0x0000, 0x0020, 0x0000, 0x0000, 0xBDF7, // 0x0A00 (2560)
+0xFFFF, 0xDEDB, 0x1082, 0x0000, 0x0000, 0x0000, 0x41C1, 0xFF01, 0xFEA0, 0xFEC0, 0xF660, 0x6AC2, 0xF6A1, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0A10 (2576)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFF21, 0x8BA1, 0x0000, 0x0000, 0x0000, 0x6281, 0xDE21, 0xFF01, 0x3161, 0x0000, 0x0000, // 0x0A20 (2592)
+0x0000, 0x0000, 0x0000, 0x2921, 0xFEE1, 0xE641, 0x62A1, 0x0000, 0x0000, 0x0000, 0x8381, 0xFF21, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0A30 (2608)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC1, 0x6AC2, 0xE621, 0xFEE0, 0xFEA0, 0xFF01, 0x41C1, 0x0000, 0x0020, 0x0000, 0x2124, 0xEF5D, // 0x0A40 (2624)
+0xFFFF, 0xFFFF, 0x4A49, 0x0000, 0x0000, 0x0000, 0x0020, 0xD5A1, 0xFEE0, 0xFEA0, 0xFEC0, 0xCD41, 0xF660, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0A50 (2640)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF21, 0x8BC1, 0x0000, 0x0000, 0x0000, 0x1060, 0xA442, 0x0860, 0x0000, 0x0000, // 0x0A60 (2656)
+0x0000, 0x0000, 0x0000, 0x0820, 0xA442, 0x18A0, 0x0000, 0x0000, 0x0000, 0x8381, 0xFF21, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0A70 (2672)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFE80, 0xCD62, 0xFEC0, 0xFEA1, 0xFEE0, 0xD5A1, 0x0020, 0x0000, 0x0000, 0x0000, 0x630C, 0xFFFF, // 0x0A80 (2688)
+0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x7321, 0xFF21, 0xFEA0, 0xFEA0, 0xFEE0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, // 0x0A90 (2704)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF21, 0xB4C1, 0x20E1, 0x0000, 0x3161, 0x62A2, 0x0000, 0x0000, 0x0000, // 0x0AA0 (2720)
+0x0000, 0x0000, 0x0000, 0x0000, 0x5A82, 0x39A1, 0x0000, 0x20C1, 0xAC82, 0xFF21, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0AB0 (2736)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEE0, 0xFEA0, 0xFEA0, 0xFF21, 0x7321, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0xFFFF, // 0x0AC0 (2752)
+0xFFDF, 0xFFFF, 0xE73C, 0x18C3, 0x0000, 0x0000, 0x0000, 0x1080, 0xEE41, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA1, 0xFF00, 0xFEE0, 0xFEA0, // 0x0AD0 (2768)
+0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFF00, 0xEE41, 0x83C1, 0x8BA3, 0x1081, 0x0000, 0x0000, 0x0000, // 0x0AE0 (2784)
+0x0000, 0x0000, 0x0000, 0x0000, 0x1060, 0x8383, 0x83A1, 0xEE41, 0xFF00, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, // 0x0AF0 (2800)
+0xFEC0, 0xFEA0, 0xFEC0, 0xFF00, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xEE21, 0x1080, 0x0000, 0x0000, 0x0000, 0x2945, 0xEF7D, 0xFFFF, // 0x0B00 (2816)
+0xFFFF, 0xFFFF, 0xFFFF, 0x6B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x7B41, 0xFF21, 0xFEA0, 0xFEA0, 0xFF00, 0xB482, 0xD5C1, 0xFF20, // 0x0B10 (2832)
+0xFE80, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEA0, 0xFEC0, 0xFEA1, 0xFEA0, 0xF680, 0xFF20, 0xF6A2, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B20 (2848)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E1, 0xEE62, 0xFF40, 0xF680, 0xFEA0, 0xFEA1, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, // 0x0B30 (2864)
+0xF681, 0xFF20, 0xE601, 0xAC62, 0xFF00, 0xFEA0, 0xFE80, 0xFF21, 0x7B41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0xFFFF, 0xFFFF, // 0x0B40 (2880)
+0xFFFF, 0xFFDF, 0xFFFF, 0xD69A, 0x0841, 0x0000, 0x0000, 0x0000, 0x0840, 0xDDC1, 0xFEE0, 0xFEA0, 0xFEE1, 0xD5A1, 0x5221, 0xBD21, // 0x0B50 (2896)
+0xFF41, 0xFF00, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEC0, 0xFF00, 0xFF21, 0xCD61, 0x20E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, // 0x0B60 (2912)
+0x7322, 0x0840, 0x0000, 0x0000, 0x0000, 0x0000, 0x18A1, 0xBD22, 0xFF21, 0xFF00, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEE0, // 0x0B70 (2928)
+0xFF40, 0xC561, 0x5221, 0xCD81, 0xFEE0, 0xFE81, 0xFEE0, 0xDDC1, 0x0840, 0x0000, 0x0000, 0x0000, 0x18E3, 0xE71C, 0xFFFF, 0xFFFF, // 0x0B80 (2944)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x49E1, 0xFF01, 0xFEA0, 0xFEA0, 0xFF00, 0xDE01, 0x4181, // 0x0B90 (2960)
+0x5A81, 0xD581, 0xFEE1, 0xFF20, 0xFF20, 0xFF01, 0xFEC1, 0xD582, 0x6AE1, 0x0020, 0x0000, 0x0020, 0x0000, 0x0000, 0x1060, 0xACA2, // 0x0BA0 (2976)
+0xFF61, 0xBD21, 0x18A1, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x62A2, 0xCD62, 0xFEA1, 0xFF01, 0xFF20, 0xFF20, 0xFEE1, 0xD5C1, // 0x0BB0 (2992)
+0x62C1, 0x3981, 0xD5C1, 0xFF21, 0xFEA0, 0xFEA0, 0xFF01, 0x49E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BC0 (3008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x93E2, 0xFF40, 0xFE80, 0xFE80, 0xFEE0, 0xFEC1, // 0x0BD0 (3024)
+0x6B01, 0x1061, 0x18C1, 0x4A00, 0x5AA0, 0x5240, 0x3141, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A01, 0xDDC1, 0xFF20, // 0x0BE0 (3040)
+0xFE80, 0xFF00, 0xE602, 0x5A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2921, 0x5220, 0x5AA0, 0x4A00, 0x20E1, 0x1060, // 0x0BF0 (3056)
+0x6AE1, 0xF6A1, 0xFEE0, 0xFEA1, 0xFEA0, 0xFF41, 0x93E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0xCD61, 0xFF00, 0xFEA0, 0xFEA0, 0xFEC0, // 0x0C10 (3088)
+0xFF41, 0xDDE1, 0x6B01, 0x18C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18A0, 0x5A61, 0xBCE2, 0xFF01, 0xFEE0, 0xFEA0, // 0x0C20 (3104)
+0xFEC0, 0xFEA0, 0xFEE0, 0xFF01, 0xC541, 0x6281, 0x20C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C1, 0x6AE1, 0xDDC1, // 0x0C30 (3120)
+0xFF41, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF01, 0xC541, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C40 (3136)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x18A1, 0xDE01, 0xFF00, 0xFE80, 0xFEC0, // 0x0C50 (3152)
+0xFEA0, 0xFEE0, 0xFF20, 0xFEC1, 0xD5A2, 0xAC82, 0x9401, 0x93E1, 0x9C42, 0xC522, 0xEE41, 0xFF01, 0xFF00, 0xFEA0, 0xFEA0, 0xFEC0, // 0x0C60 (3168)
+0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFF00, 0xFF21, 0xF661, 0xC542, 0xA462, 0x93E1, 0x9C01, 0xB4A2, 0xD5A1, 0xFEC1, 0xFF20, 0xFEE0, // 0x0C70 (3184)
+0xFEA0, 0xFEC0, 0xFE80, 0xFF00, 0xDE01, 0x18A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C80 (3200)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x2921, 0xE641, 0xFF00, 0xFE80, // 0x0C90 (3216)
+0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF00, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF00, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0CA0 (3232)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF00, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF00, 0xFEC0, 0xFEA0, 0xFEA0, // 0x0CB0 (3248)
+0xFEA0, 0xFE80, 0xFF00, 0xE641, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xDE01, 0xFF00, // 0x0CD0 (3280)
+0xFE80, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0CE0 (3296)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEA0, // 0x0CF0 (3312)
+0xFE80, 0xFF00, 0xDE01, 0x2900, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D00 (3328)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18A1, 0xC561, // 0x0D10 (3344)
+0xFF21, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0D20 (3360)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, // 0x0D30 (3376)
+0xFF41, 0xC561, 0x18A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D40 (3392)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, // 0x0D50 (3408)
+0x9402, 0xFF01, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0D60 (3424)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFF01, // 0x0D70 (3440)
+0x9402, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D80 (3456)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0D90 (3472)
+0x0000, 0x4A01, 0xDDC1, 0xFF41, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0DA0 (3488)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF21, 0xD5C1, 0x4A01, // 0x0DB0 (3504)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0DD0 (3536)
+0x0000, 0x0000, 0x0840, 0x7B61, 0xE641, 0xFF21, 0xFEE0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0DE0 (3552)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFF21, 0xE621, 0x7B42, 0x0840, 0x0000, // 0x0DF0 (3568)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x9492, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E00 (3584)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD55, 0x10A2, 0x0000, 0x0000, // 0x0E10 (3600)
+0x0000, 0x0000, 0x0000, 0x0000, 0x1880, 0x7B21, 0xD5A1, 0xFF01, 0xFF20, 0xFF00, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, // 0x0E20 (3616)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFF00, 0xFF20, 0xFF01, 0xD5A1, 0x7321, 0x1880, 0x0000, 0x0000, 0x0000, // 0x0E30 (3632)
+0x0000, 0x0000, 0x0000, 0x18E3, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xD69A, 0x4228, 0x0000, // 0x0E50 (3664)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x41C1, 0x93E1, 0xD5A1, 0xFEA1, 0xFF01, 0xFF20, 0xFF20, 0xFF20, 0xFF00, // 0x0E60 (3680)
+0xFF00, 0xFF00, 0xFF20, 0xFF20, 0xFF20, 0xFF01, 0xFEA1, 0xD5A1, 0x93E1, 0x41C1, 0x0020, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, // 0x0E70 (3696)
+0x0000, 0x0000, 0x528A, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0x8C71, // 0x0E90 (3728)
+0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0x5221, 0x7B41, 0x9402, 0xAC82, 0xBCE2, // 0x0EA0 (3744)
+0xC521, 0xBCE2, 0xAC82, 0x9401, 0x7B41, 0x5221, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0EB0 (3760)
+0x18E3, 0x94B2, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EC0 (3776)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0ED0 (3792)
+0xD6BA, 0x632C, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0EE0 (3808)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0x738E, // 0x0EF0 (3824)
+0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F10 (3856)
+0xFFFF, 0xFFFF, 0xCE79, 0x6B4D, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, // 0x0F20 (3872)
+0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x738E, 0xD69A, 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, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F50 (3920)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0x94B2, 0x4A49, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0F60 (3936)
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x4A69, 0x9CD3, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F70 (3952)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F80 (3968)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0xA534, 0x6B6D, 0x4208, 0x2104, 0x18C3, 0x0861, 0x0841, 0x0000, // 0x0FA0 (4000)
+0x0000, 0x0000, 0x0841, 0x0861, 0x18C3, 0x2124, 0x4228, 0x6B6D, 0xA534, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FB0 (4016)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0xB5B6, 0x9492, 0x6B6D, 0x4A49, // 0x0FE0 (4064)
+0x4228, 0x4A49, 0x6B6D, 0x8C51, 0xAD75, 0xDEDB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FF0 (4080)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096)
+};
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Textrotation_Demo/UTFT_Textrotation_Demo.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Textrotation_Demo/UTFT_Textrotation_Demo.ino
new file mode 100644
index 0000000..3e25649
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_Textrotation_Demo/UTFT_Textrotation_Demo.ino
@@ -0,0 +1,52 @@
+// UTFT_Textrotation_Demo (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the textrotation-functions.
+//
+// This demo was made for modules with a screen resolution
+// of 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t BigFont[];
+extern uint8_t SevenSegNumFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32S,38,39,40,41);
+
+void setup()
+{
+ myGLCD.InitLCD();
+ myGLCD.clrScr();
+ myGLCD.setFont(BigFont);
+}
+
+void loop()
+{
+ myGLCD.print("Text rotation", 0, 0);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.print("0 degrees", 0, 16, 0);
+ myGLCD.print("90 degrees", 319, 0, 90);
+ myGLCD.print("180 degrees", 319, 239, 180);
+ myGLCD.print("270 degrees", 0, 239, 270);
+
+ myGLCD.setFont(SevenSegNumFont);
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.print("45", 90, 100, 45);
+ myGLCD.print("90", 200, 50, 90);
+ myGLCD.print("180", 300, 200, 180);
+
+ while (true) {};
+}
+
diff --git a/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_ViewFont/UTFT_ViewFont.ino b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_ViewFont/UTFT_ViewFont.ino
new file mode 100644
index 0000000..7a99d20
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (ARM) + Teensy/UTFT_ViewFont/UTFT_ViewFont.ino
@@ -0,0 +1,59 @@
+// UTFT_ViewFont (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the included fonts.
+//
+// This demo was made for modules with a screen resolution
+// of 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+extern uint8_t BigFont[];
+extern uint8_t SevenSegNumFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// Standard Arduino Mega/Due shield : ,38,39,40,41
+// CTE TFT LCD/SD Shield for Arduino Due : ,25,26,27,28
+// Teensy 3.x TFT Test Board : ,23,22, 3, 4
+// ElecHouse TFT LCD/SD Shield for Arduino Due : ,22,23,31,33
+//
+// Remember to change the model parameter to suit your display module!
+UTFT myGLCD(ITDB32S,38,39,40,41);
+
+void setup()
+{
+ myGLCD.InitLCD();
+
+ myGLCD.clrScr();
+}
+
+void loop()
+{
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 0);
+
+ myGLCD.setFont(BigFont);
+ myGLCD.print(" !\"#$%&'()*+,-./", CENTER, 0);
+ myGLCD.print("0123456789:;<=>?", CENTER, 16);
+ myGLCD.print("@ABCDEFGHIJKLMNO", CENTER, 32);
+ myGLCD.print("PQRSTUVWXYZ[\\]^_", CENTER, 48);
+ myGLCD.print("`abcdefghijklmno", CENTER, 64);
+ myGLCD.print("pqrstuvwxyz{|}~ ", CENTER, 80);
+
+ myGLCD.setFont(SmallFont);
+ myGLCD.print(" !\"#$%&'()*+,-./0123456789:;<=>?", CENTER, 120);
+ myGLCD.print("@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_", CENTER, 132);
+ myGLCD.print("`abcdefghijklmnopqrstuvwxyz{|}~ ", CENTER, 144);
+
+ myGLCD.setFont(SevenSegNumFont);
+ myGLCD.print("0123456789", CENTER, 190);
+
+ while(1) {};
+}
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/UTFT_Bitmap.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/UTFT_Bitmap.ino
new file mode 100644
index 0000000..3eefe88
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/UTFT_Bitmap.ino
@@ -0,0 +1,71 @@
+// UTFT_Bitmap (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the drawBitmap()-function.
+//
+// This demo was made to work on the 320x240 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+#include
+
+// Declare which fonts we will be using
+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(ITDB32S,38,39,40,41);
+
+extern unsigned int info[0x400];
+extern unsigned int icon[0x400];
+extern unsigned int tux[0x400];
+
+void setup()
+{
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.print(" *** A 10 by 7 grid of a 32x32 icon *** ", CENTER, 228);
+ for (int x=0; x<10; x++)
+ for (int y=0; y<7; y++)
+ myGLCD.drawBitmap (x*32, y*32, 32, 32, info);
+
+ delay(5000);
+
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.print(" Two different icons in scale 1 to 4 ", CENTER, 228);
+ int x=0;
+ for (int s=0; s<4; s++)
+ {
+ x+=(s*32);
+ myGLCD.drawBitmap (x, 0, 32, 32, tux, s+1);
+ }
+ x=0;
+ for (int s=4; s>0; s--)
+ {
+ myGLCD.drawBitmap (x, 224-(s*32), 32, 32, icon, s);
+ x+=(s*32);
+ }
+
+ delay(5000);
+}
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/icon.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/icon.c
new file mode 100644
index 0000000..374dd09
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/icon.c
@@ -0,0 +1,73 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: taskmgr.png
+// Time generated: 11.10.2010 22:51:23
+// Size : 2Â 048 Bytes
+
+#include
+
+const unsigned short icon[0x400] PROGMEM ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE79, 0xBDD7, 0xAD75, // 0x0010 (16)
+0xAD55, 0xAD75, 0xBDF7, 0xD6BA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x9492, 0x8C51, 0x9492, 0xA514, 0xA534, // 0x0030 (48)
+0xA534, 0xA534, 0x9CF3, 0x8C71, 0x8430, 0x9CD3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x8410, 0x9492, 0xB5B6, 0xC618, 0xBDD7, 0xAD75, 0xA514, // 0x0050 (80)
+0xA514, 0xA4F4, 0xAD55, 0xB5B6, 0xBDD7, 0xAD55, 0x8430, 0x8C71, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9CD3, 0x8430, 0xBDF7, 0xC618, 0xAD75, 0x94F2, 0x8CF1, 0x84B0, 0x8CD1, // 0x0070 (112)
+0x9612, 0x8CB1, 0x7C6F, 0x7C8F, 0x8490, 0xA533, 0xBDF7, 0xB596, 0x7BEF, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8430, 0x9CF3, 0xCE39, 0xA514, 0x94B2, 0x9E93, 0x94F2, 0x8CD1, 0x8CB1, 0x9D12, // 0x0090 (144)
+0x9F74, 0x9D52, 0x8450, 0x7C8F, 0x73AE, 0x740E, 0x73CE, 0x9CD3, 0xC638, 0x8C51, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x8430, 0xA534, 0xBDF7, 0x8CB1, 0x8C31, 0x9DB3, 0xA735, 0x9D13, 0x8CB1, 0x8C71, 0x9D13, // 0x00B0 (176)
+0xB756, 0xA5D4, 0x8C71, 0x8490, 0x8390, 0x7C70, 0x73EE, 0x6B4D, 0x8450, 0xBDF7, 0x8C71, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x94B2, 0x9CF3, 0xBDD7, 0x8490, 0x8CF1, 0x9D72, 0xA694, 0xAE94, 0x9DD3, 0xA593, 0xA553, 0x9592, // 0x00D0 (208)
+0x9672, 0x75CE, 0x5BAA, 0x64EB, 0x5D8C, 0x5BCA, 0x4B69, 0x634C, 0x748D, 0x7C4F, 0xBE18, 0x8430, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x8410, 0xBDF7, 0x8410, 0x83F0, 0x94F2, 0x9613, 0x9D13, 0xAE55, 0x9D12, 0x750E, 0x55CB, 0x4BC8, // 0x00F0 (240)
+0x4447, 0x3BC6, 0x4B67, 0x44E8, 0x3CE8, 0x3325, 0x20E2, 0x2B45, 0x43E7, 0x3946, 0x732D, 0xC5F8, 0x7BCF, 0xE71C, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xF7BE, 0x7BEF, 0xBDB6, 0x9533, 0x8D71, 0x9552, 0x9E73, 0x9DD3, 0x94B2, 0x6D6D, 0x4BA8, 0x44A8, 0x55EA, 0x5D2A, // 0x0110 (272)
+0x43E7, 0x4327, 0x46CA, 0x4B87, 0x42C6, 0x4E0A, 0x4D09, 0x4468, 0x4548, 0x3386, 0x2B25, 0x7C6F, 0xAD35, 0x9492, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFDF, 0xFFFF, 0xBDD7, 0x8C71, 0xAD75, 0x8CF0, 0x8D71, 0x8D51, 0x9DF3, 0x740E, 0x21C4, 0x33E5, 0x558A, 0x554A, 0x650A, 0x566B, // 0x0130 (304)
+0x43E7, 0x21C3, 0x3345, 0x2283, 0x1962, 0x3C87, 0x3386, 0x2163, 0x3345, 0x3346, 0x33A6, 0x32C6, 0x9CB3, 0x7BEF, 0xDEDB, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0x8430, 0xAD75, 0x8C31, 0x7C0F, 0x7BCF, 0x83F0, 0x636B, 0x0000, 0x0000, 0x4387, 0x462A, 0x4B27, 0x4B88, 0x4E8B, // 0x0150 (336)
+0x42E6, 0x0000, 0x0020, 0x0100, 0x0000, 0x1121, 0x0040, 0x0000, 0x0941, 0x0000, 0x0020, 0x00E0, 0x5AAB, 0x94B2, 0x9CD3, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xE71C, 0x8410, 0xB596, 0x7BEF, 0x7C6F, 0x84B0, 0x5B6B, 0x09E1, 0x0901, 0x1161, 0x3C06, 0x3D89, 0x32C5, 0x43E7, 0x470B, // 0x0170 (368)
+0x4BC7, 0x0961, 0x11E2, 0x1282, 0x0961, 0x1262, 0x09E2, 0x0961, 0x12A2, 0x0961, 0x09C2, 0x0A01, 0x29E5, 0xA514, 0x7BEF, 0xFFDF, // 0x0180 (384)
+0xFFFF, 0xBDD7, 0x9472, 0xA514, 0x6B4D, 0x7C6F, 0x634C, 0x0040, 0x0981, 0x0060, 0x00E0, 0x11E2, 0x10A1, 0x09C1, 0x19E3, 0x2B25, // 0x0190 (400)
+0x22A3, 0x0060, 0x0120, 0x09E1, 0x0060, 0x09E1, 0x0120, 0x0060, 0x0A21, 0x0060, 0x0100, 0x01A0, 0x0040, 0x9CD3, 0x7BEF, 0xDEDB, // 0x01A0 (416)
+0xFFFF, 0xA514, 0x9CF3, 0xB596, 0x73AE, 0x7C0F, 0x2945, 0x10A2, 0x2184, 0x18C3, 0x1923, 0x2184, 0x18C3, 0x21A4, 0x2964, 0x2905, // 0x01B0 (432)
+0x2A25, 0x2104, 0x2965, 0x2A05, 0x2104, 0x2A05, 0x2985, 0x2104, 0x2A25, 0x2104, 0x2164, 0x29C4, 0x3166, 0xB5B6, 0x8410, 0xC618, // 0x01C0 (448)
+0xFFFF, 0x9492, 0xA514, 0xDEDB, 0xC618, 0xA514, 0x8C51, 0x94B2, 0x9CB3, 0x9CF3, 0xA514, 0xA534, 0xAD75, 0xAD75, 0xB596, 0xB5D6, // 0x01D0 (464)
+0xBDB7, 0xBDF7, 0xBDF7, 0xBDF7, 0xC618, 0xC5F8, 0xC5F8, 0xBDF7, 0xBDD7, 0xBDD7, 0xB5B6, 0xB596, 0xC638, 0xDEFB, 0x8430, 0xB596, // 0x01E0 (480)
+0xFFFF, 0x8C51, 0x9CF3, 0xE73C, 0xDEFB, 0xD69A, 0xD6BA, 0xD6BA, 0xDEDB, 0xDEDB, 0xDEFB, 0xDF1B, 0xE71C, 0xE73C, 0xE73C, 0xE73C, // 0x01F0 (496)
+0xEF5D, 0xEF5D, 0xEF5D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xDEFB, 0xE71C, 0x8C51, 0xAD75, // 0x0200 (512)
+0xFFFF, 0x8C71, 0x9CD3, 0xDEFB, 0xAD75, 0x9492, 0x9CD3, 0xA4F3, 0xA514, 0xAD55, 0xAD75, 0xB596, 0xBDB6, 0xBDD7, 0xC5F7, 0xC618, // 0x0210 (528)
+0xC638, 0xCE59, 0xCE59, 0xCE79, 0xD679, 0xD679, 0xCE79, 0xCE59, 0xCE59, 0xC638, 0xC618, 0xBDF7, 0xCE79, 0xE71C, 0x8C51, 0xB596, // 0x0220 (544)
+0xFFFF, 0x9CD3, 0x9492, 0xAD55, 0x2965, 0x2104, 0x2124, 0x2145, 0x1945, 0x2165, 0x2165, 0x2186, 0x2186, 0x29A6, 0x29A6, 0x31C7, // 0x0230 (560)
+0x39C7, 0x31E7, 0x31E7, 0x31E7, 0x3208, 0x3208, 0x31E7, 0x31E7, 0x29E7, 0x31C7, 0x39C7, 0x31A6, 0x4A49, 0xBDF7, 0x8C51, 0xBDF7, // 0x0240 (576)
+0xFFFF, 0xB5B6, 0x8430, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x2000, // 0x0250 (592)
+0x0000, 0x3000, 0x3800, 0x3000, 0x3800, 0x3800, 0x3800, 0x3000, 0x3800, 0x0800, 0x0000, 0x0000, 0x0000, 0xA514, 0x8430, 0xD6BA, // 0x0260 (608)
+0xFFFF, 0xDEDB, 0x7BCF, 0x8430, 0x0020, 0x0000, 0x0000, 0x8000, 0xC800, 0xC000, 0xC800, 0xC820, 0xC820, 0xC820, 0xD020, 0x9800, // 0x0270 (624)
+0x0000, 0xB820, 0xD020, 0xD020, 0xD020, 0xD020, 0xD020, 0xC820, 0xD020, 0x4800, 0x0000, 0x0000, 0x2144, 0xAD75, 0x8410, 0xF7BE, // 0x0280 (640)
+0xFFFF, 0xFFFF, 0x7BEF, 0x8C71, 0x2945, 0x0000, 0x0000, 0x6800, 0xA800, 0xA800, 0xA800, 0xA800, 0xA800, 0xA800, 0xB000, 0x8000, // 0x0290 (656)
+0x0000, 0x9800, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0xB000, 0x4000, 0x0000, 0x0000, 0x632C, 0xA534, 0x94B2, 0xFFFF, // 0x02A0 (672)
+0xFFDF, 0xFFFF, 0xAD75, 0x73AE, 0x632C, 0x0000, 0x0000, 0x6920, 0xA9E0, 0xA1C0, 0xA9E0, 0xA9E0, 0xA9E0, 0xA9E0, 0xA9E0, 0x7960, // 0x02B0 (688)
+0x0000, 0x99C0, 0xB200, 0xA9E0, 0xB200, 0xB200, 0xB1E0, 0xA9E0, 0xB200, 0x40C0, 0x0000, 0x1082, 0xAD75, 0x8410, 0xD69A, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xF79E, 0x630C, 0x8C51, 0x2965, 0x0000, 0x7400, 0xB620, 0xAE00, 0xB620, 0xB640, 0xB640, 0xB620, 0xB660, 0x84A0, // 0x02D0 (720)
+0x0000, 0xA5A0, 0xBE60, 0xB660, 0xBE60, 0xBE60, 0xB660, 0xB640, 0xBE80, 0x4260, 0x0000, 0x6B6D, 0xAD75, 0x8430, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFDF, 0xFFFF, 0xB5B6, 0x632C, 0x8410, 0x0021, 0x7360, 0xBD40, 0xB520, 0xBD40, 0xBD60, 0xBD60, 0xBD40, 0xC580, 0x8C00, // 0x02F0 (752)
+0x0000, 0xACE0, 0xC580, 0xC580, 0xC580, 0xC580, 0xC580, 0xBD60, 0xC5A0, 0x39C0, 0x2126, 0xBDF7, 0x73AE, 0xD6BA, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x7BEF, 0x630D, 0x4AE1, 0x6D21, 0x6D01, 0x6D21, 0x6D41, 0x6D41, 0x6D41, 0x6D61, 0x53E1, // 0x0310 (784)
+0x0000, 0x64C1, 0x7562, 0x6D62, 0x6D62, 0x6D62, 0x6D62, 0x6D42, 0x6D41, 0x4263, 0xA515, 0x8C51, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x6B4D, 0x8410, 0x636E, 0x04A6, 0x05E5, 0x05C5, 0x0585, 0x0585, 0x0586, 0x05A6, 0x0424, // 0x0330 (816)
+0x0000, 0x0505, 0x05C6, 0x05A6, 0x05A6, 0x05C7, 0x0606, 0x0606, 0x1CE9, 0xA535, 0x9492, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x6B4D, 0x83EF, 0x9411, 0x3A47, 0x0403, 0x0584, 0x05A4, 0x0585, 0x0585, 0x0404, // 0x0350 (848)
+0x0000, 0x04E5, 0x05A5, 0x05A5, 0x05C5, 0x0584, 0x1405, 0x634B, 0xBD76, 0x8C51, 0x8C51, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8410, 0x6B6D, 0x9CB3, 0x7C6F, 0x3CA9, 0x0BE4, 0x0443, 0x0504, 0x03C2, // 0x0370 (880)
+0x0000, 0x0483, 0x0504, 0x0444, 0x1426, 0x552D, 0xA554, 0xB576, 0x73CE, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x6B4D, 0x7BAF, 0x9432, 0x8BD1, 0x6BCE, 0x4C6B, 0x3C09, // 0x0390 (912)
+0x3186, 0x3C8A, 0x5C8C, 0x8430, 0xA493, 0xACD4, 0x8410, 0x7BEF, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xAD75, 0x7BEF, 0x73AE, 0x83F0, 0x8C11, 0x9431, // 0x03B0 (944)
+0x9492, 0x9452, 0x9432, 0x8430, 0x7BEF, 0x8450, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xBDD7, 0xA534, 0x94D3, // 0x03D0 (976)
+0x94B2, 0x9CF3, 0xA554, 0xC618, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/info.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/info.c
new file mode 100644
index 0000000..a0a04ee
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/info.c
@@ -0,0 +1,73 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: info.png
+// Time generated: 11.10.2010 22:27:55
+// Size : 2Â 048 Bytes
+
+#include
+
+const unsigned short info[0x400] 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, 0xEF9F, 0xC69D, 0x95BB, 0x7D1A, 0x6CB9, // 0x0030 (48)
+0x6499, 0x74F9, 0x8D7A, 0xB63C, 0xE73E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAE1C, 0x4C18, 0x2B56, 0x3397, 0x4C38, 0x64B9, 0x751A, // 0x0050 (80)
+0x7D3A, 0x6CD9, 0x5458, 0x3BD7, 0x2B56, 0x3BB7, 0x855A, 0xE77E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA5FB, 0x2B56, 0x2B77, 0x751A, 0xB67C, 0xD73E, 0xE75E, 0xE77E, 0xE77E, // 0x0070 (112)
+0xE77E, 0xE77E, 0xE75E, 0xDF3E, 0xC6DD, 0x8D9B, 0x43D7, 0x1B16, 0x74D9, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9F, 0x4C18, 0x1AF6, 0x855A, 0xCEFE, 0xD71E, 0xCEFD, 0xC6DD, 0xC6BD, 0xC6BD, 0xBEBD, // 0x0090 (144)
+0xC6BD, 0xBEBD, 0xC6BD, 0xC6DD, 0xC6DD, 0xD71E, 0xD71E, 0xA61C, 0x33B7, 0x2316, 0xBE7C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF3E, 0x2336, 0x3BD7, 0xBE9D, 0xC6DD, 0xBE9D, 0xBE9D, 0xBE9D, 0xBEBD, 0xBE9D, 0xCEFD, 0xEF9F, // 0x00B0 (176)
+0xEF9F, 0xD73E, 0xBE9D, 0xBEBD, 0xBE9D, 0xBE9D, 0xB69D, 0xC6BD, 0xCEDD, 0x6CFA, 0x0295, 0x9DBB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xE75E, 0x1AF6, 0x4C58, 0xBEBD, 0xB67D, 0xAE5C, 0xB67D, 0xB67D, 0xB69D, 0xB67D, 0xBEBD, 0xF7DF, 0xFFFF, // 0x00D0 (208)
+0xFFFF, 0xFFFF, 0xCF1E, 0xB67D, 0xB67D, 0xB67D, 0xB67D, 0xAE5C, 0xAE5C, 0xC6BD, 0x857B, 0x0295, 0xA5DB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFDF, 0x3BB7, 0x33D8, 0xB67D, 0xA63C, 0xA63C, 0xAE5C, 0xAE5D, 0xAE5D, 0xAE7D, 0xA65D, 0xC6DD, 0xFFFF, 0xFFFF, // 0x00F0 (240)
+0xFFDF, 0xFFFF, 0xDF5E, 0xA65D, 0xAE7D, 0xAE5D, 0xAE5D, 0xAE5C, 0xA63C, 0xA61C, 0xB67D, 0x753A, 0x0295, 0xCEBC, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xF7DF, 0xFFFF, 0x957A, 0x12F6, 0x9E1C, 0x9E1C, 0x9E1C, 0x9E1C, 0xA63C, 0xA63C, 0xA63D, 0xA63D, 0xA65D, 0x9DFC, 0xDF3E, 0xFFFF, // 0x0110 (272)
+0xFFFF, 0xFFDF, 0xA61C, 0xA65D, 0xA65D, 0xA63D, 0xA63C, 0xA63C, 0x9E1C, 0x9E1C, 0x9DFC, 0xAE3C, 0x3C18, 0x3396, 0xFFDF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xF79F, 0x2336, 0x64DA, 0x9DFC, 0x95DC, 0x95FC, 0x95FC, 0x9E1C, 0x9E1C, 0x9E3D, 0x9E3D, 0x9E3D, 0x9E3D, 0x7D3B, 0xA63C, // 0x0130 (304)
+0xB6BD, 0x8DBB, 0x8DFC, 0xA65D, 0x9E3D, 0x9E3D, 0x9E1C, 0x9E1C, 0x95FC, 0x95FC, 0x95DC, 0x95DC, 0x8DBB, 0x0AF6, 0xA5DA, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xA5FB, 0x1337, 0x8DBB, 0x8DBB, 0x8DBC, 0x8DDC, 0x95FC, 0x95FC, 0x961C, 0x961D, 0x963D, 0x9E3D, 0x963D, 0xA67D, 0xB6BD, // 0x0150 (336)
+0xB6BD, 0xAE7D, 0x9E3D, 0x9E3D, 0x961D, 0x961D, 0x961C, 0x95FC, 0x95FC, 0x8DDC, 0x8DDC, 0x859B, 0x95DC, 0x3C18, 0x4BD7, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0x6499, 0x33F8, 0x8DBB, 0x859B, 0x85BC, 0x85BC, 0x8DDC, 0x8DFC, 0x8DFD, 0x8E1D, 0x961D, 0x961D, 0x9E3D, 0xF7BF, 0xFFFF, // 0x0170 (368)
+0xFFFF, 0xFFFF, 0xA67D, 0x8E1D, 0x961D, 0x8E1D, 0x8DFD, 0x8DFC, 0x8DDC, 0x85BC, 0x85BC, 0x859B, 0x859B, 0x5CDA, 0x2336, 0xE71C, // 0x0180 (384)
+0xFFFF, 0x43F8, 0x4C79, 0x859B, 0x7D7B, 0x7D9C, 0x85BC, 0x85DC, 0x85DC, 0x8DFD, 0x8DFD, 0x8E1D, 0x8E1D, 0xA67E, 0xFFFF, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xFFFF, 0xBEDE, 0x85FD, 0x8E1D, 0x8DFD, 0x8DFD, 0x85DC, 0x85DC, 0x85BC, 0x7D9C, 0x7D7B, 0x7D7B, 0x753B, 0x1B36, 0xBE5A, // 0x01A0 (416)
+0xFFBE, 0x3BF8, 0x3419, 0x6D1B, 0x757B, 0x7D9C, 0x7D9C, 0x7DBC, 0x7DDD, 0x85FD, 0x85FD, 0x861D, 0x861D, 0x9E7E, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xFFFF, 0xB6DE, 0x85FD, 0x8E1D, 0x85FD, 0x85FD, 0x7DDD, 0x7DBC, 0x7D9C, 0x7D9C, 0x757B, 0x6D3B, 0x4C9A, 0x1337, 0xADD9, // 0x01C0 (448)
+0xFFBE, 0x4418, 0x23B9, 0x3439, 0x4CBA, 0x653B, 0x759C, 0x7DBD, 0x7DDD, 0x7DFD, 0x861D, 0x861E, 0x861E, 0x9E7E, 0xFFFF, 0xFFFF, // 0x01D0 (464)
+0xFFFF, 0xFFFF, 0xB6DE, 0x7E1E, 0x861E, 0x85FD, 0x7DFD, 0x7DDD, 0x7DBD, 0x759C, 0x653B, 0x4CDB, 0x3439, 0x2BF9, 0x1337, 0xA5B9, // 0x01E0 (480)
+0xFF9E, 0x4C39, 0x2BF9, 0x345A, 0x3C7A, 0x3C9B, 0x4CFC, 0x5D5C, 0x659D, 0x75DD, 0x7DFE, 0x861E, 0x7E3E, 0x969F, 0xFFFF, 0xFFFF, // 0x01F0 (496)
+0xFFFF, 0xFFFF, 0xB6FF, 0x7E1E, 0x863E, 0x7DFE, 0x75DD, 0x6D9D, 0x5D5C, 0x4CFC, 0x3C9B, 0x347A, 0x345A, 0x343A, 0x1B78, 0xA5B9, // 0x0200 (512)
+0xF79E, 0x4418, 0x2C3A, 0x3C7A, 0x449B, 0x44DB, 0x4CFC, 0x4D3C, 0x555D, 0x5D7D, 0x65BE, 0x6DFE, 0x6DFF, 0x867F, 0xFFFF, 0xFFFF, // 0x0210 (528)
+0xFFFF, 0xFFFF, 0xA6DF, 0x65FF, 0x6DFE, 0x65BE, 0x5D9E, 0x555D, 0x4D3C, 0x4CFC, 0x44DB, 0x44BB, 0x3C7A, 0x345A, 0x1B78, 0xA599, // 0x0220 (544)
+0xFFDE, 0x43D8, 0x345A, 0x3C9A, 0x44DB, 0x4CFC, 0x4D3C, 0x555D, 0x5D9D, 0x5DBE, 0x65DE, 0x6DFF, 0x661F, 0x867F, 0xFFFF, 0xFFFF, // 0x0230 (560)
+0xFFFF, 0xFFFF, 0xA6DF, 0x65FF, 0x6DFF, 0x65DE, 0x5DBE, 0x5D9D, 0x555D, 0x4D3C, 0x4CFC, 0x44DB, 0x3C7A, 0x3C9B, 0x1B57, 0xADB9, // 0x0240 (576)
+0xFFFF, 0x4BD7, 0x2C1A, 0x44DB, 0x44DB, 0x4D1C, 0x555D, 0x5D7D, 0x5DBE, 0x65DE, 0x6E1F, 0x6E3F, 0x765F, 0x96BF, 0xFFFF, 0xFFFF, // 0x0250 (592)
+0xFFFF, 0xFFFF, 0xAEFF, 0x6E3F, 0x763F, 0x6E1F, 0x65DE, 0x5DBE, 0x5D7D, 0x555D, 0x4D1C, 0x44DC, 0x3C9B, 0x44DC, 0x1AD5, 0xC639, // 0x0260 (608)
+0xFFFF, 0x84D8, 0x1317, 0x5D7D, 0x44DB, 0x553C, 0x557D, 0x5D9E, 0x65DE, 0x65FF, 0x6E3F, 0x7E5F, 0x7E7F, 0x9EDF, 0xFFFF, 0xFFFF, // 0x0270 (624)
+0xFFFF, 0xFFFF, 0xB73F, 0x7E7F, 0x7E5F, 0x6E3F, 0x65FF, 0x65DE, 0x5D9E, 0x557D, 0x553C, 0x44DC, 0x4D1C, 0x345B, 0x22B4, 0xE71B, // 0x0280 (640)
+0xFFFF, 0xD6BC, 0x0234, 0x4CFC, 0x5D7D, 0x4D3C, 0x5D9D, 0x5DBE, 0x65FF, 0x6E3F, 0x765F, 0x867F, 0x8EBF, 0xA6DF, 0xFFFF, 0xFFFF, // 0x0290 (656)
+0xFFFF, 0xFFFF, 0xB71F, 0x8EBF, 0x869F, 0x765F, 0x6E3F, 0x65FF, 0x5DBE, 0x5D7D, 0x553D, 0x4D1C, 0x65BE, 0x0AB7, 0x6C15, 0xFFBE, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0x53B6, 0x0296, 0x75FE, 0x5D9D, 0x557D, 0x65DE, 0x6E1F, 0x763F, 0x7E7F, 0x8EBF, 0x9EFF, 0x96BE, 0xAE3C, 0xE77E, // 0x02B0 (688)
+0xEF9E, 0xC69D, 0x967E, 0x9EFF, 0x8EBF, 0x7E7F, 0x763F, 0x6E1F, 0x65DE, 0x5D9E, 0x555D, 0x761E, 0x341A, 0x1294, 0xBE18, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xCE9B, 0x0A13, 0x2378, 0x7E5F, 0x6E1E, 0x5DBE, 0x6E1F, 0x7E5F, 0x869F, 0x96DF, 0x9EFF, 0xAF5F, 0x9E9E, 0x8DFC, // 0x02D0 (720)
+0x8E1C, 0x967D, 0xAF3F, 0xA6FF, 0x96DF, 0x869F, 0x7E5F, 0x6E1F, 0x5DBE, 0x65DE, 0x7E5F, 0x4CBB, 0x0AB5, 0x7454, 0xEF5C, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFFF, 0xFFFF, 0x8D17, 0x01D3, 0x23B9, 0x7E3E, 0x8E9F, 0x763F, 0x765F, 0x8E9F, 0x9EDF, 0xA71F, 0xB75F, 0xC7BF, 0xCFDF, // 0x02F0 (752)
+0xCFDF, 0xC7BF, 0xB75F, 0xA71F, 0x9EDF, 0x8E9F, 0x765F, 0x6E1F, 0x867F, 0x8E7F, 0x4CBB, 0x1317, 0x4BB4, 0xD679, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFBD, 0x7476, 0x0214, 0x1B78, 0x659D, 0x9EDF, 0x9EFF, 0x96DF, 0x9EFF, 0xAF1F, 0xB75F, 0xC79F, 0xD7DF, // 0x0310 (784)
+0xD7DF, 0xC79F, 0xB75F, 0xAF1F, 0x9EDF, 0x96DF, 0x96DF, 0x9EFF, 0x7E1E, 0x3C5A, 0x1B77, 0x43B5, 0xBDD6, 0xF7BE, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77D, 0x7CB6, 0x12B4, 0x1337, 0x449B, 0x7DFD, 0xA6FF, 0xB75F, 0xBF7F, 0xC79F, 0xCFBF, 0xD7FF, // 0x0330 (816)
+0xD7FF, 0xCFBF, 0xC79F, 0xBF7F, 0xB77F, 0xAF1F, 0x8E5E, 0x551B, 0x3419, 0x2BD7, 0x5415, 0xB5B6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xA577, 0x3B75, 0x1B36, 0x2BD9, 0x4CBB, 0x759D, 0x965E, 0xAEDF, 0xBF3F, 0xC77F, // 0x0350 (848)
+0xC77F, 0xBF3F, 0xB6FF, 0x9E7F, 0x7DDD, 0x5D1C, 0x447A, 0x3C59, 0x4437, 0x7474, 0xC617, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xD699, 0x84D5, 0x43D5, 0x33B7, 0x3418, 0x4C7A, 0x5CFC, 0x753D, 0x857E, // 0x0370 (880)
+0x859E, 0x755D, 0x653C, 0x5CFB, 0x4CDA, 0x4CB9, 0x5497, 0x6C95, 0xA555, 0xDEDA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xCE79, 0x9D56, 0x7495, 0x5C56, 0x4C77, 0x4C97, 0x4CB8, // 0x0390 (912)
+0x54D8, 0x5CD8, 0x5CF8, 0x64D7, 0x74D6, 0x8CF5, 0xAD96, 0xD699, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xEF1B, 0xD679, 0xBDF7, 0xAD96, 0xA576, // 0x03B0 (944)
+0xA576, 0xAD76, 0xB5B6, 0xC5F7, 0xD679, 0xEF3C, 0xFFDE, 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, 0xFFDF, 0xFFBE, // 0x03D0 (976)
+0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/tux.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/tux.c
new file mode 100644
index 0000000..3babe53
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap/tux.c
@@ -0,0 +1,73 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: tux.png
+// Time generated: 11.10.2010 22:51:32
+// Size : 2Â 048 Bytes
+
+#include
+
+const unsigned short tux[0x400] PROGMEM ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x9CD3, 0x9CF3, 0xA514, // 0x0010 (16)
+0x9CF3, 0x8C51, 0xAD75, 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, 0xEF7D, 0x5AEB, 0x7BEF, 0x9CD3, 0x94B2, // 0x0030 (48)
+0x94B2, 0x94B2, 0x4228, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x9CF3, 0x18E3, 0x630C, 0x4A49, 0x4A69, // 0x0050 (80)
+0x4A69, 0x528A, 0x4A49, 0x0000, 0xC638, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6D, 0x0000, 0x0020, 0x10A2, 0x1082, // 0x0070 (112)
+0x0841, 0x0841, 0x0841, 0x0000, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x528A, 0x4228, 0x8410, 0x0000, 0x0861, // 0x0090 (144)
+0xAD55, 0xBDD7, 0x10A2, 0x0000, 0x2945, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x5ACB, 0x8C71, 0xE75D, 0x2126, 0x528B, // 0x00B0 (176)
+0xE75D, 0xDEDB, 0x7BCF, 0x0000, 0x18E3, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6D, 0x4A4A, 0x6B2A, 0x8BE7, 0xA48A, // 0x00D0 (208)
+0x6B09, 0x4A8A, 0x8431, 0x0000, 0x2104, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x6B6E, 0x5204, 0xDE6A, 0xFFF7, 0xFFF8, // 0x00F0 (240)
+0xD5AC, 0xBCAA, 0x5A66, 0x0000, 0x1082, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8C10, 0xC540, 0xFFED, 0xFF2C, 0xFEEC, // 0x0110 (272)
+0xFECC, 0xFE66, 0x8260, 0x0000, 0x0000, 0xB596, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B3, 0x9C25, 0xFF20, 0xFE40, 0xFDA0, // 0x0130 (304)
+0xFCC0, 0xF524, 0x836A, 0x0000, 0x0000, 0x630C, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x630C, 0x94B4, 0xFF13, 0xFD83, 0xF523, // 0x0150 (336)
+0xE5CF, 0xF79E, 0xE71D, 0x0861, 0x0000, 0x0861, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xCE59, 0x0841, 0xD69A, 0xFFFF, 0xFF7D, 0xF77D, // 0x0170 (368)
+0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x4A69, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x10A2, 0x8410, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xFFDF, 0xFFFF, 0xCE59, 0x0000, 0x0000, 0x0000, 0x9492, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x52AA, 0x0020, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFDF, 0xFFDF, 0xF7BE, 0xFFDF, 0x3186, 0x0000, 0x0020, 0x0841, 0xCE79, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xC638, 0x0000, 0x52AA, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x01D0 (464)
+0xFFDF, 0xF7BE, 0xF79E, 0xFFFF, 0x9CF3, 0x0000, 0x0841, 0x0000, 0x39E7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5ACB, 0x0000, 0xBDF7, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, // 0x01F0 (496)
+0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0x3186, 0x0000, 0x0861, 0x0000, 0xAD55, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x0861, 0x4A49, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x0210 (528)
+0xF7BE, 0xF79E, 0xEF7D, 0xEF5D, 0xFFDF, 0x8410, 0x0000, 0x1082, 0x0000, 0x39E7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0220 (544)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0xB596, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, // 0x0230 (560)
+0xF79E, 0xEF7D, 0xEF7D, 0xE73C, 0xF79E, 0xAD55, 0x0861, 0x10A2, 0x0861, 0x0841, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x3185, 0x10A2, 0xE71C, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, // 0x0250 (592)
+0xEF7D, 0xEF7D, 0xEF5D, 0xE73C, 0xEF5D, 0xBDF7, 0x18C3, 0x18C3, 0x18C3, 0x0000, 0x8C71, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0260 (608)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0x39E7, 0xF7BE, 0xFFFF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, 0xEF7D, // 0x0270 (624)
+0xEF7D, 0xEF5D, 0xE73C, 0xE71C, 0xE71C, 0xC618, 0x18E3, 0x10A2, 0x10A2, 0x0020, 0x6B4D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0280 (640)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8C51, 0x38E0, 0x4A27, 0xFFFF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, // 0x0290 (656)
+0xEF5D, 0xE73C, 0xE71C, 0xDEFB, 0xDF1D, 0xBDF8, 0x39C7, 0x5ACB, 0x528A, 0x10A3, 0x738F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD6C, 0xFE2B, 0xBC45, 0xA513, 0xFFFF, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF5D, // 0x02B0 (688)
+0xE73C, 0xE71C, 0xDEFB, 0xD6DC, 0xDD8E, 0xB3E4, 0x2124, 0x2965, 0x2945, 0x20C1, 0xB511, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77C, 0xE5CF, 0xF60B, 0xFF9B, 0xFF54, 0x8B02, 0x7BF0, 0xFFDF, 0xF79E, 0xEF5D, 0xEF5D, 0xE73C, // 0x02D0 (720)
+0xE71C, 0xDEFB, 0xDEDB, 0xCE7A, 0xED89, 0xDDAD, 0x0842, 0x0000, 0x0000, 0xAC69, 0xDD6B, 0xEFBF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xFFFF, 0xFFBE, 0xE5CB, 0xEDC9, 0xFE4B, 0xFF14, 0xFEF3, 0xFF35, 0xFE8D, 0x51C1, 0x634E, 0xE73C, 0xEF5D, 0xE73C, 0xE71C, // 0x02F0 (752)
+0xDEFB, 0xDEDB, 0xD6DB, 0xCE59, 0xE58B, 0xFF98, 0xBD4F, 0x8B88, 0xCD90, 0xFFB7, 0xCCE8, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xFFFF, 0xEF3B, 0xF583, 0xFF30, 0xFF11, 0xFECF, 0xFEEF, 0xFECF, 0xFF30, 0xDD46, 0x2903, 0x6B8E, 0xEF7D, 0xE71C, 0xDEFB, // 0x0310 (784)
+0xDEDB, 0xD6BA, 0xD69A, 0xCE59, 0xE5AA, 0xFF11, 0xFF53, 0xFF73, 0xFF33, 0xFF12, 0xFE6C, 0xDDAD, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFFF, 0xFFFF, 0xF79E, 0xEDC5, 0xFECB, 0xFECC, 0xFECC, 0xFEEC, 0xFECB, 0xFECC, 0xFEEA, 0x9BE5, 0x8432, 0xE73C, 0xDEDB, 0xDEDB, // 0x0330 (816)
+0xD6BA, 0xD69A, 0xDEDB, 0xA4F3, 0xD547, 0xFF2E, 0xFECD, 0xFECE, 0xFEEE, 0xFEEE, 0xFF10, 0xFEAB, 0xE5A8, 0xEF7D, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xF79E, 0xF603, 0xFEA2, 0xFEC7, 0xFEC7, 0xFEA4, 0xFE81, 0xFE61, 0xFEA4, 0xFE43, 0xDE33, 0xE75E, 0xE71C, 0xDEFB, // 0x0350 (848)
+0xDEDB, 0xCE58, 0x8C72, 0x5247, 0xEDE4, 0xFF0A, 0xFECA, 0xFEC9, 0xFE84, 0xFE83, 0xFEE7, 0xFEA3, 0xB443, 0xD69B, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xF75B, 0xFE60, 0xFF00, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEA0, 0xFEC0, 0xFEA0, 0xFEE0, 0xE5C1, 0x9492, 0xA514, 0x9CD3, // 0x0370 (880)
+0x8410, 0x630B, 0x4229, 0x6AE8, 0xFE80, 0xFEC1, 0xFEC1, 0xFEA0, 0xFEA0, 0xFEE0, 0xDD80, 0x9BE8, 0xB597, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xF79E, 0xD589, 0xE600, 0xFEA0, 0xFF00, 0xFF40, 0xFF40, 0xFF00, 0xFF00, 0xFF20, 0xFEC0, 0x5267, 0x4229, 0x4A48, // 0x0390 (912)
+0x4A49, 0x5289, 0x424A, 0x7B46, 0xFF20, 0xFEE0, 0xFEE0, 0xFF20, 0xFEE0, 0xB4A5, 0x9C92, 0xDEFD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xE71D, 0xBDB6, 0xB530, 0xBD0B, 0xCD65, 0xEE60, 0xFF40, 0xFFA0, 0xFF80, 0xBD03, 0x8410, 0xA514, 0xA534, // 0x03B0 (944)
+0xAD75, 0xB596, 0xA555, 0x9C8F, 0xF6C0, 0xFFA0, 0xFFA0, 0xF6E0, 0xA449, 0xB5B8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7F, 0xD69C, 0xBD95, 0xBD4C, 0xCDC6, 0xB4E8, 0xAD35, 0xF7BF, 0xFFFF, 0xFFFF, // 0x03D0 (976)
+0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xCDD0, 0xCDC6, 0xCDA7, 0xA48D, 0xCE7B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF1F, 0xB59A, 0xBDDA, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xEF7F, 0xB59A, 0xAD59, 0xDF1D, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino
new file mode 100644
index 0000000..1d10e99
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/UTFT_Bitmap_128x128.ino
@@ -0,0 +1,50 @@
+// UTFT_Bitmap_128x128 (C)2012 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of the drawBitmap()-function.
+//
+// This demo was made to work on the 128x128 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+#include
+
+UTFT myGLCD(LPH9135,6,5,2,3,4); // Remember to change the model parameter to suit your display module!
+
+extern unsigned int icon1[0x400];
+extern unsigned int icon2[0x400];
+extern unsigned int tux[0x1000];
+
+void setup()
+{
+ myGLCD.InitLCD(PORTRAIT);
+}
+
+void loop()
+{
+// Draw a 4 by 4 grid of a 32x32 icon.
+ myGLCD.fillScr(255, 255, 255);
+ for (int x=0; x<4; x++)
+ for (int y=0; y<4; y++)
+ myGLCD.drawBitmap (x*32, y*32, 32, 32, icon1);
+
+ delay(5000);
+
+// Draw a 64x64 icon in double size.
+ myGLCD.fillScr(255, 255, 255);
+ myGLCD.drawBitmap (0, 0, 64, 64, tux, 2);
+
+ delay(5000);
+
+// Draw a 2 by 2 grid of a 32x32 icon in double size.
+ myGLCD.fillScr(255, 255, 255);
+ for (int x=0; x<2; x++)
+ for (int y=0; y<2; y++)
+ myGLCD.drawBitmap (x*64, y*64, 32, 32, icon2, 2);
+
+ delay(5000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon1.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon1.c
new file mode 100644
index 0000000..e9da278
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon1.c
@@ -0,0 +1,74 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: exit.png
+// Time generated: 14.10.2010 21:53:03
+// Dimensions : 32x32 pixels
+// Size : 2Â 048 Bytes
+
+#include
+
+const unsigned short icon1[0x400] PROGMEM ={
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF1C, 0xE618, 0xE638, 0xE638, 0xE638, 0xE659, 0xE659, 0xE659, 0xE659, 0xE659, 0xE679, 0xE679, // 0x0010 (16)
+0xE679, 0xE679, 0xE679, 0xE679, 0xEE79, 0xEE9A, 0xEE9A, 0xEE9A, 0xEE9A, 0xEE9A, 0xE638, 0xEEBA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32)
+0xFFFF, 0xFFFF, 0xFFFF, 0xD555, 0xCCD3, 0xDDB6, 0xDDD7, 0xDDF7, 0xDDF7, 0xDE18, 0xE618, 0xE638, 0xE638, 0xE659, 0xE679, 0xE679, // 0x0030 (48)
+0xEE9A, 0xEE9A, 0xEEBA, 0xEEBA, 0xEEBA, 0xEEDB, 0xEEDB, 0xEEFB, 0xEEFB, 0xEEFB, 0xEEFB, 0xE659, 0xD575, 0xF77D, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFDF, 0xFFFF, 0xD534, 0xC471, 0xD575, 0xCCF3, 0xCCD3, 0xCCD3, 0xCCF3, 0xCCF3, 0xD4F3, 0xD514, 0xD514, 0xD514, 0xD534, 0xDD55, // 0x0050 (80)
+0xDD55, 0xDD55, 0xDD55, 0xDD75, 0xDD75, 0xDD75, 0xDD96, 0xDD96, 0xDD96, 0xDDB6, 0xDDD7, 0xEE79, 0xEEBA, 0xD534, 0xFFBE, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xEEDB, 0xB38E, 0xC4B2, 0xBC30, 0xC451, 0xC471, 0xC471, 0xCC71, 0xCC92, 0xCC92, 0xCC92, 0xCCB2, 0xD4B2, 0xD4B2, 0xCC71, // 0x0070 (112)
+0xCC71, 0xD4D3, 0xD4F3, 0xDCF3, 0xDCF3, 0xDD14, 0xDD14, 0xDD14, 0xDD34, 0xDD34, 0xDD34, 0xDD14, 0xE5D7, 0xDD96, 0xDDF7, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xC4F3, 0xAB2C, 0xC430, 0xC410, 0xC430, 0xC430, 0xC430, 0xCC51, 0xCC51, 0xCC51, 0xCC71, 0xCC71, 0xD471, 0xCC71, 0xD5F7, // 0x0090 (144)
+0xD5F7, 0xCC92, 0xDCB2, 0xDCD3, 0xDCD3, 0xDCD3, 0xDCD3, 0xDCF3, 0xDCF3, 0xDD14, 0xDD14, 0xDD34, 0xDD14, 0xDD34, 0xC492, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xB3EF, 0x9A28, 0xC430, 0xBBCF, 0xC3EF, 0xC3EF, 0xC3EF, 0xC410, 0xCC10, 0xCC10, 0xCC30, 0xCC51, 0xCBEF, 0xE638, 0xFFFF, // 0x00B0 (176)
+0xFFFF, 0xE659, 0xD430, 0xDC92, 0xDC92, 0xDC92, 0xDCB2, 0xDCB2, 0xDCB2, 0xDCD3, 0xDCD3, 0xDCD3, 0xE514, 0xD410, 0xAB0C, 0xF7FF, // 0x00C0 (192)
+0xFFFF, 0xABCF, 0x9165, 0xC3EF, 0xBB8E, 0xBBAE, 0xC3AE, 0xC3CF, 0xC3CF, 0xCBCF, 0xCBEF, 0xCC10, 0xCC10, 0xCBAE, 0xEE9A, 0xFFFF, // 0x00D0 (208)
+0xFFFF, 0xF6DB, 0xD410, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xDC71, 0xE492, 0xE492, 0xE492, 0xE4F3, 0xCB2C, 0xA249, 0xF7FF, // 0x00E0 (224)
+0xFFFF, 0xABCF, 0x88C3, 0xC3AE, 0xBB4D, 0xBB6D, 0xC36D, 0xC38E, 0xC38E, 0xCBAE, 0xC36D, 0xC34D, 0xCBCF, 0xCB8E, 0xEE59, 0xFFFF, // 0x00F0 (240)
+0xFFFF, 0xF6BA, 0xDBCF, 0xD3CF, 0xCBAE, 0xD3CF, 0xE430, 0xE430, 0xE451, 0xE451, 0xE451, 0xE451, 0xECD3, 0xCAAA, 0xA208, 0xF7FF, // 0x0100 (256)
+0xFFFF, 0xABCF, 0x8061, 0xBB6D, 0xBB2C, 0xBB2C, 0xC34D, 0xC34D, 0xCB4D, 0xBB0C, 0xC492, 0xCD14, 0xC38E, 0xCB2C, 0xEE59, 0xFFFF, // 0x0110 (272)
+0xFFFF, 0xF6BA, 0xD36D, 0xD575, 0xE6DB, 0xDDB6, 0xD3AE, 0xE3EF, 0xE410, 0xE410, 0xE430, 0xE410, 0xECB2, 0xC986, 0xA208, 0xF7FF, // 0x0120 (288)
+0xFFFF, 0xB3EF, 0x8041, 0xBB0C, 0xBAEB, 0xBAEB, 0xC30C, 0xC30C, 0xBACB, 0xD5B6, 0xFFFF, 0xFFFF, 0xEE79, 0xCACB, 0xEE59, 0xFFFF, // 0x0130 (304)
+0xFFFF, 0xF679, 0xDBEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEBA, 0xD3CF, 0xE3AE, 0xE3EF, 0xE3CF, 0xEC10, 0xEB6D, 0xC000, 0xA249, 0xF7FF, // 0x0140 (320)
+0xFFFF, 0xB3EF, 0x8020, 0xBACB, 0xBAAA, 0xBAAA, 0xC2EB, 0xBA8A, 0xD596, 0xFFFF, 0xFFDF, 0xFFFF, 0xF73C, 0xCAAA, 0xEE38, 0xFFFF, // 0x0150 (336)
+0xFFFF, 0xF679, 0xDB4D, 0xFF7D, 0xFFFF, 0xFFDF, 0xFFFF, 0xEEDB, 0xDB6D, 0xEB8E, 0xEBAE, 0xEB8E, 0xE0A2, 0xC800, 0xAA49, 0xF7FF, // 0x0160 (352)
+0xFFFF, 0xB3EF, 0x8000, 0xB28A, 0xBA69, 0xBA8A, 0xBA49, 0xCC30, 0xFFFF, 0xFFDF, 0xFFFF, 0xFF5D, 0xDBCF, 0xCA69, 0xEE18, 0xFFFF, // 0x0170 (368)
+0xFFFF, 0xF679, 0xDAAA, 0xE3AE, 0xF6BA, 0xFFFF, 0xFFDF, 0xFFFF, 0xE5D7, 0xE30C, 0xEB8E, 0xE0E3, 0xE000, 0xC800, 0xAA49, 0xF7FF, // 0x0180 (384)
+0xFFFF, 0xB3EF, 0x8800, 0xB249, 0xBA49, 0xBA49, 0xBA49, 0xEF1C, 0xFFFF, 0xFFFF, 0xFF7D, 0xD32C, 0xCA69, 0xD249, 0xEDF7, 0xFFFF, // 0x0190 (400)
+0xFFFF, 0xF659, 0xDAAA, 0xE2CB, 0xE2EB, 0xFEBA, 0xFFFF, 0xFFDF, 0xFFDF, 0xE3CF, 0xE103, 0xE000, 0xE081, 0xD000, 0xAA69, 0xF7FF, // 0x01A0 (416)
+0xFFFF, 0xB3EF, 0x8800, 0xB228, 0xBA08, 0xB9A6, 0xCBAE, 0xFFFF, 0xFFDF, 0xFFFF, 0xDC30, 0xC9E7, 0xD28A, 0xCA08, 0xF618, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xF679, 0xDA49, 0xE2CB, 0xE28A, 0xEB6D, 0xFFBE, 0xFFDF, 0xFFFF, 0xEC92, 0xE000, 0xE0A2, 0xE0C2, 0xD040, 0xAA89, 0xF7FF, // 0x01C0 (448)
+0xFFFF, 0xB3EF, 0x8800, 0xB1E7, 0xB9E7, 0xB165, 0xDD55, 0xFFFF, 0xFFFF, 0xF71C, 0xCA08, 0xCA08, 0xD228, 0xD1E7, 0xE430, 0xFFDF, // 0x01D0 (464)
+0xFFDF, 0xEC51, 0xDA08, 0xE28A, 0xE28A, 0xE228, 0xF618, 0xFFFF, 0xFFFF, 0xF679, 0xE081, 0xE0C2, 0xE903, 0xD081, 0xAA89, 0xF7FF, // 0x01E0 (480)
+0xFFFF, 0xBBEF, 0x9000, 0xB1A6, 0xB986, 0xB145, 0xEE38, 0xFFFF, 0xFFFF, 0xED96, 0xC165, 0xC9E7, 0xD1E7, 0xD1E7, 0xD1C7, 0xDACB, // 0x01F0 (496)
+0xE2EB, 0xD9E7, 0xE228, 0xE228, 0xEA69, 0xE9E7, 0xF40F, 0xFFFF, 0xFFFF, 0xFF5D, 0xE144, 0xE8E2, 0xE943, 0xD8C1, 0xAA8A, 0xF7FF, // 0x0200 (512)
+0xFFFF, 0xBC10, 0x9000, 0xB165, 0xB145, 0xB924, 0xEE9A, 0xFFFF, 0xFFFF, 0xE514, 0xC124, 0xC9A6, 0xD1A6, 0xD1A6, 0xD1C7, 0xD9A6, // 0x0210 (528)
+0xD9A6, 0xE1E7, 0xE208, 0xE208, 0xE9A6, 0xE041, 0xEA8A, 0xFFFF, 0xFFFF, 0xFF9E, 0xE9C6, 0xE902, 0xE984, 0xD902, 0xAAAA, 0xF7FF, // 0x0220 (544)
+0xFFFF, 0xC410, 0x9000, 0xB124, 0xB124, 0xB0C3, 0xEE18, 0xFFFF, 0xFFFF, 0xE575, 0xC0E3, 0xC986, 0xD165, 0xD165, 0xD986, 0xD9A6, // 0x0230 (560)
+0xD9A6, 0xE1A6, 0xE165, 0xE082, 0xE020, 0xE000, 0xEB4C, 0xFFFF, 0xFFFF, 0xFF7D, 0xE9A5, 0xE943, 0xE9A5, 0xD923, 0xAAAA, 0xF7FF, // 0x0240 (576)
+0xFFFF, 0xC410, 0x9800, 0xB0E3, 0xB0E3, 0xB061, 0xE4F3, 0xFFFF, 0xFFFF, 0xF6FB, 0xC104, 0xC924, 0xD145, 0xD145, 0xD945, 0xD945, // 0x0250 (592)
+0xD8E3, 0xD861, 0xD800, 0xE000, 0xE061, 0xE000, 0xED34, 0xFFFF, 0xFFFF, 0xFE9A, 0xE923, 0xE984, 0xE9C5, 0xE163, 0xAAAA, 0xF7FF, // 0x0260 (608)
+0xFFFF, 0xC410, 0xA000, 0xB0A2, 0xB0A2, 0xB041, 0xCACB, 0xFFFF, 0xFFDF, 0xFFFF, 0xD34D, 0xC841, 0xD104, 0xD0A2, 0xD061, 0xD000, // 0x0270 (624)
+0xD800, 0xD800, 0xE000, 0xE041, 0xE000, 0xD965, 0xFF9E, 0xFFDF, 0xFFFF, 0xF4D2, 0xE8E2, 0xE9A5, 0xE9E5, 0xE183, 0xAAAA, 0xF7FF, // 0x0280 (640)
+0xFFFF, 0xCC10, 0xA000, 0xA861, 0xB061, 0xB061, 0xB882, 0xF6DB, 0xFFFF, 0xFFDF, 0xF75D, 0xC124, 0xC800, 0xD000, 0xD000, 0xD800, // 0x0290 (656)
+0xD800, 0xE000, 0xE020, 0xE000, 0xD861, 0xF638, 0xFFFF, 0xFFDF, 0xFFDF, 0xEA68, 0xE943, 0xE9C5, 0xEA06, 0xE1A4, 0xB2CA, 0xF7FF, // 0x02A0 (672)
+0xFFFF, 0xCC10, 0xA000, 0xA820, 0xB000, 0xB000, 0xB000, 0xCA49, 0xFFFF, 0xFFDF, 0xFFFF, 0xF71C, 0xCA08, 0xC800, 0xD000, 0xD800, // 0x02B0 (688)
+0xD800, 0xD800, 0xD800, 0xD944, 0xEE18, 0xFFFF, 0xFFBE, 0xFFFF, 0xF4F2, 0xE902, 0xE9A5, 0xE9C5, 0xEA06, 0xE9A4, 0xB2CA, 0xF7FF, // 0x02C0 (704)
+0xFFFF, 0xD410, 0xA800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xDC10, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xED96, 0xDAEB, 0xD1A6, // 0x02D0 (720)
+0xD965, 0xDA69, 0xECD3, 0xFF9E, 0xFFFF, 0xFFBE, 0xFFFF, 0xFE17, 0xE923, 0xE964, 0xE9A5, 0xE9C5, 0xEA26, 0xE9C4, 0xBACA, 0xF7FF, // 0x02E0 (736)
+0xF7FF, 0xD410, 0xA800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xB800, 0xE3EF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF5B6, 0xE923, 0xE923, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xE9C5, 0xBACA, 0xF7FF, // 0x0300 (768)
+0xF7FF, 0xDC10, 0xB000, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xD228, 0xF638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0310 (784)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFEFB, 0xF3AE, 0xE0C1, 0xE903, 0xE964, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xE9E5, 0xC2CA, 0xF7DF, // 0x0320 (800)
+0xF7FF, 0xDC51, 0xB800, 0xA800, 0xB000, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC800, 0xD9E7, 0xEC30, 0xF5D7, 0xFE9A, // 0x0330 (816)
+0xFEBA, 0xF618, 0xF4D3, 0xEACB, 0xE0E2, 0xE040, 0xE903, 0xE943, 0xE943, 0xE984, 0xE9A5, 0xE9E5, 0xEA26, 0xEA05, 0xC30C, 0xF7DF, // 0x0340 (832)
+0xFFFF, 0xD575, 0xD104, 0xA820, 0xB000, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC820, 0xC800, 0xD000, 0xD000, 0xD800, 0xD800, // 0x0350 (848)
+0xE000, 0xE000, 0xE000, 0xE000, 0xE0A1, 0xE0E3, 0xE903, 0xE943, 0xE964, 0xE984, 0xE9C5, 0xE9C5, 0xF226, 0xE227, 0xBC10, 0xF7FF, // 0x0360 (864)
+0xFFFF, 0xDF3C, 0xCAAA, 0xD186, 0xB082, 0xB000, 0xB800, 0xB800, 0xB800, 0xC000, 0xC000, 0xC800, 0xC800, 0xD000, 0xD000, 0xD800, // 0x0370 (880)
+0xD800, 0xE000, 0xE020, 0xE040, 0xE061, 0xE0A1, 0xE0C2, 0xE102, 0xE123, 0xE943, 0xE984, 0xEA26, 0xFB0A, 0xBA08, 0xCE38, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFDF, 0xBDD7, 0xCA69, 0xE248, 0xD207, 0xD1C6, 0xD1C6, 0xD9C7, 0xD9C7, 0xE1C7, 0xE1C7, 0xE1C7, 0xE9C7, 0xE9C7, 0xE9C7, // 0x0390 (912)
+0xF1C6, 0xF1C7, 0xF1E7, 0xF207, 0xF228, 0xF248, 0xF269, 0xF289, 0xF2A9, 0xF2CA, 0xFB0A, 0xF2EA, 0xC207, 0xACB3, 0xF7BE, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xF7BE, 0xBDF7, 0xAB8E, 0xC2EB, 0xC2EB, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xC30B, 0xCB0B, 0xCAEB, // 0x03B0 (944)
+0xCAEB, 0xCACA, 0xCACA, 0xCAAA, 0xCAAA, 0xCA8A, 0xCA69, 0xC269, 0xC269, 0xC289, 0xBA69, 0xA2CB, 0xAD34, 0xEF7D, 0xFFFF, 0xFFFF, // 0x03C0 (960)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDF3C, 0xBE39, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, // 0x03D0 (976)
+0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xB5F7, 0xBE38, 0xD71C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon2.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon2.c
new file mode 100644
index 0000000..3bcc564
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/icon2.c
@@ -0,0 +1,74 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: video.png
+// Time generated: 14.10.2010 21:53:17
+// Dimensions : 32x32 pixels
+// Size : 2Â 048 Bytes
+
+#include
+
+const unsigned short icon2[0x400] 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, 0xE71C, 0xB5B6, 0x94B2, 0x8C71, // 0x0030 (48)
+0x9492, 0xA534, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x9CF3, 0x73AE, 0x6B6D, 0x73AE, 0x7BCF, // 0x0050 (80)
+0x7BEF, 0x7BCF, 0x7BEF, 0xA534, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x7BCF, 0x6B6D, 0x738E, 0x7BCF, 0x8C71, 0x9492, // 0x0070 (112)
+0x9492, 0x9492, 0x9492, 0x8C51, 0x8C71, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x738E, 0x738E, 0x73AE, 0x6B4D, 0x8410, 0x9CF3, 0x9CF3, // 0x0090 (144)
+0x9CF3, 0x9CF3, 0x9CF3, 0x9CF3, 0x94B2, 0x7BEF, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x738E, 0x7BEF, 0x8410, 0x632C, 0x4A69, 0x9492, 0xAD75, 0xAD55, // 0x00B0 (176)
+0xAD55, 0xAD55, 0xAD55, 0xA534, 0xAD55, 0x9492, 0x8430, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x7BCF, 0x8430, 0x7BCF, 0x6B4D, 0x528A, 0x6B6D, 0xB5B6, 0xB5B6, 0xB5B6, // 0x00D0 (208)
+0xB5B6, 0xB596, 0xB596, 0xAD75, 0xAD75, 0xAD55, 0x8410, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x7BEF, 0x9CD3, 0xA514, 0x5AEB, 0x630C, 0x6B4D, 0x9492, 0xC638, 0xC618, 0xC618, // 0x00F0 (240)
+0xBDF7, 0xBDF7, 0xC618, 0xB5B6, 0xB5B6, 0xB596, 0x9492, 0x8C51, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8C71, 0x94B2, 0xAD55, 0xB5B6, 0x738E, 0x6B4D, 0x632C, 0xB596, 0xD69A, 0xCE59, 0xCE59, // 0x0110 (272)
+0xCE79, 0xCE59, 0x6B6D, 0x9492, 0xB5B6, 0xBDF7, 0x9CF3, 0x8430, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x8C51, 0xAD55, 0xB5B6, 0xCE79, 0x8C51, 0x630C, 0x8C51, 0xCE79, 0xD6BA, 0xD69A, 0xDEDB, // 0x0130 (304)
+0xBDD7, 0x8C51, 0x4228, 0x2965, 0xAD55, 0xC638, 0xA534, 0x8430, 0xB5B6, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320)
+0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x8C51, 0xA514, 0xB5B6, 0xC618, 0xD6BA, 0xB5B6, 0xB596, 0xE71C, 0xDEFB, 0xDEFB, 0xE71C, 0xAD55, // 0x0150 (336)
+0x738E, 0x7BEF, 0x5AEB, 0x2945, 0xC638, 0xCE59, 0xA534, 0x9492, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352)
+0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x94B2, 0xB5B6, 0xC618, 0xCE79, 0xD6BA, 0xE73C, 0xEF7D, 0xE73C, 0xEF5D, 0xE73C, 0x9CF3, 0x738E, // 0x0170 (368)
+0x7BCF, 0x8430, 0x6B6D, 0x2965, 0xB596, 0xD69A, 0xAD55, 0x94B2, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384)
+0xFFFF, 0xFFFF, 0xF79E, 0x9492, 0x9CF3, 0xB5B6, 0xD69A, 0xDEFB, 0xE71C, 0xE73C, 0x6B6D, 0x528A, 0xDEDB, 0xEF5D, 0x7BEF, 0x8430, // 0x0190 (400)
+0x7BEF, 0x8C51, 0x7BCF, 0x2104, 0xB596, 0xD6BA, 0xAD55, 0x9CD3, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xE6FC, // 0x01A0 (416)
+0xFFDF, 0xFFFF, 0xCE59, 0x9492, 0x9492, 0x6B4D, 0x7BCF, 0xBDD7, 0xF7BE, 0xA514, 0x4A49, 0x528A, 0xC638, 0xEF7D, 0x7BEF, 0x7BEF, // 0x01B0 (432)
+0x7BEF, 0x8430, 0x5AEB, 0x10A2, 0xC618, 0xD69A, 0xAD55, 0x94B2, 0xA514, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE5A, 0x8BF2, // 0x01C0 (448)
+0xFFFF, 0xFFFF, 0xAD55, 0x94B2, 0x8C51, 0x5AEB, 0x632C, 0xBDD7, 0xE73C, 0x630C, 0x632C, 0xBDF7, 0xFFDF, 0xEF5D, 0xBDD7, 0xB5B6, // 0x01D0 (464)
+0xAD75, 0xAD75, 0x8C51, 0x738E, 0xD69A, 0xCE59, 0xB596, 0x8C51, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xCE39, 0x7350, // 0x01E0 (480)
+0xFFFF, 0xF79E, 0x94B2, 0x94B2, 0x7BCF, 0x5AEB, 0x738E, 0xD6BA, 0xD69A, 0x2104, 0x6B6D, 0xF79E, 0xF79E, 0xF79E, 0xF7BE, 0xF79E, // 0x01F0 (496)
+0xEF7D, 0xEF5D, 0xE73C, 0xE73C, 0xDEFB, 0xBDF7, 0xBDF7, 0x7BEF, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD36, 0x7350, // 0x0200 (512)
+0xFFFF, 0xDEDB, 0x8C51, 0x94B2, 0x738E, 0x632C, 0x73AE, 0xCE79, 0xF7BE, 0x7BEF, 0xA514, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0210 (528)
+0xE73C, 0xE71C, 0xDEFB, 0xDEDB, 0xDEDB, 0xBDD7, 0xBDF7, 0x73AE, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x9C75, 0x736F, // 0x0220 (544)
+0xFFFF, 0xCE59, 0x8430, 0x94B2, 0x6B4D, 0x6B4D, 0xB596, 0xE73C, 0xEF7D, 0xFFFF, 0xFFFF, 0xF7BE, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0230 (560)
+0xE73C, 0xE73C, 0xDEFB, 0xDEFB, 0xD6BA, 0xC618, 0xAD55, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x6AEF, 0x9492, // 0x0240 (576)
+0xFFFF, 0xBDF7, 0x8430, 0x8C71, 0x6B6D, 0xB596, 0xE71C, 0xE73C, 0xEF5D, 0xE73C, 0xBDF7, 0xCE59, 0xF7BE, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0250 (592)
+0xE73C, 0xE71C, 0xDEFB, 0xDEFB, 0xC638, 0xD69A, 0x8410, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9474, 0x6B0E, 0xCE59, // 0x0260 (608)
+0xFFFF, 0xB5B6, 0x8410, 0x9492, 0xBDD7, 0xD6BA, 0xD6BA, 0xE71C, 0xE73C, 0x8C71, 0x6B4D, 0xA514, 0xF7BE, 0xEF5D, 0xEF5D, 0xE73C, // 0x0270 (624)
+0xE73C, 0xE71C, 0xDEFB, 0xDEDB, 0xCE59, 0xC618, 0x7BCF, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC5F9, 0x7B51, 0x7BEF, 0xFFFF, // 0x0280 (640)
+0xFFFF, 0xB596, 0x8C71, 0xAD75, 0xBDF7, 0xCE59, 0xD69A, 0xE71C, 0xCE79, 0x8410, 0x8410, 0x9CD3, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, // 0x0290 (656)
+0xE71C, 0xDEFB, 0xDEFB, 0xCE59, 0xDEDB, 0x8C71, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEBB, 0x83B2, 0x630C, 0xE73C, 0xFFFF, // 0x02A0 (672)
+0xFFFF, 0xB5B6, 0x9492, 0xAD55, 0xBDD7, 0xC638, 0xCE79, 0xDEFB, 0xB596, 0x73AE, 0x8410, 0x8410, 0xDEDB, 0xE73C, 0xE71C, 0xE71C, // 0x02B0 (688)
+0xDEFB, 0xDEFB, 0xD6BA, 0xCE59, 0xC618, 0x738E, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDC, 0x8C14, 0x5ACC, 0xC658, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xC638, 0x8C51, 0xA534, 0xB5B6, 0xBDF7, 0xCE59, 0xD6BA, 0x94B2, 0x738E, 0x8410, 0x8430, 0xCE59, 0xE73C, 0xDEFB, 0xDEFB, // 0x02D0 (720)
+0xDEDB, 0xDEFB, 0xBDF7, 0xDEDB, 0x73AE, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDC, 0x8BD2, 0x5ACC, 0xBDD6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736)
+0xFFFF, 0xDEDB, 0x8C51, 0xA514, 0xAD75, 0xBDD7, 0xC638, 0xC618, 0x73AE, 0x7BCF, 0x8410, 0x5ACB, 0x8C51, 0xE73C, 0xDEDB, 0xD6BA, // 0x02F0 (752)
+0xDEFB, 0xBDD7, 0xD69A, 0x8C71, 0x8C51, 0xFFFF, 0xFFFF, 0xFFDE, 0xCE5A, 0x7B71, 0x62ED, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768)
+0xFFFF, 0xF7BE, 0x94B2, 0x94B2, 0xA534, 0xB596, 0xBDF7, 0xB596, 0x6B6D, 0x4208, 0x2945, 0x18C3, 0x6B6D, 0xDEFB, 0xD69A, 0xDEDB, // 0x0310 (784)
+0xB5B6, 0xC618, 0x9CF3, 0x6B4D, 0xFFDE, 0xFFFF, 0xEF5D, 0xAD37, 0x62EE, 0x6B4D, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800)
+0xFFDF, 0xFFFF, 0xBDF7, 0x8C51, 0xA514, 0xAD55, 0xB596, 0xBDD7, 0xA514, 0x738E, 0xA514, 0xB5B6, 0xCE59, 0xD69A, 0xDEDB, 0xB596, // 0x0330 (816)
+0xBDF7, 0xA534, 0x6B4C, 0xEF5D, 0xF79E, 0xBDB8, 0x7370, 0x5AAC, 0x8C71, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xF79E, 0x94B2, 0x94B2, 0xA534, 0xAD55, 0xB5B6, 0xA534, 0xBDD7, 0xD69A, 0xCE59, 0xCE79, 0xCE59, 0xA534, 0x8430, // 0x0350 (848)
+0x738E, 0x3186, 0x7BB0, 0x8C33, 0x7370, 0x62ED, 0x8410, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864)
+0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x8C71, 0x9CD3, 0xAD55, 0xB596, 0xBDD7, 0xBDD7, 0xBDF7, 0xC618, 0xB5B6, 0xA534, 0xA534, 0x632C, // 0x0370 (880)
+0x6B6D, 0xB5B6, 0xAD76, 0xAD76, 0xBE17, 0xE71B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x94B2, 0x8C51, 0x94B2, 0xA534, 0xAD55, 0xAD55, 0x9CD3, 0x8C71, 0x73AE, 0x632C, 0xA534, // 0x0390 (912)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE59, 0xA514, 0x8430, 0x7BCF, 0x738E, 0x73AE, 0x8410, 0xA534, 0xEF7D, 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, 0xF7BE, 0xE73C, 0xE71C, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/tux.c b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/tux.c
new file mode 100644
index 0000000..6c2e1e4
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Bitmap_128x128/tux.c
@@ -0,0 +1,266 @@
+// Generated by : ImageConverter 565 v1.0
+// Generated from: tux_64x64.png
+// Time generated: 14.10.2010 21:56:38
+// Dimensions : 64x64 pixels
+// Size : 8Â 192 Bytes
+
+#include
+
+const unsigned short tux[0x1000] 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, 0xCE79, 0x9CF3, 0x7BCF, 0x738E, 0x738E, // 0x0020 (32)
+0x6B6D, 0x94B2, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xCE79, 0x6B4D, 0x5ACB, 0x8410, 0x9CF3, 0x9CF3, 0x9CF3, // 0x0060 (96)
+0x9CD3, 0x73AE, 0x4208, 0x5ACB, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xA514, 0x3186, 0x8C51, 0xBDF7, 0xC618, 0xBDF7, 0xBDF7, 0xBDF7, // 0x00A0 (160)
+0xBDF7, 0xC618, 0xBDD7, 0x738E, 0x18C3, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00B0 (176)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0xBDD7, 0x10A2, 0x8C71, 0x9CF3, 0x8C71, 0x8C71, 0x8C71, 0x8C71, 0x8C71, // 0x00E0 (224)
+0x8C71, 0x8C51, 0x8C51, 0x9CF3, 0x73AE, 0x0000, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0x2945, 0x31A6, 0x7BCF, 0x6B4D, 0x6B6D, 0x6B6D, 0x6B6D, 0x6B6D, 0x6B6D, // 0x0120 (288)
+0x6B6D, 0x6B6D, 0x6B6D, 0x6B4D, 0x73AE, 0x2124, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0xC638, 0x0000, 0x31A6, 0x52AA, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, // 0x0160 (352)
+0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x528A, 0x2104, 0x0000, 0x2965, 0xEF5D, 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, 0xFFDF, 0xFFFF, 0x8C71, 0x0000, 0x1082, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, 0x3186, // 0x01A0 (416)
+0x3186, 0x3186, 0x3186, 0x3186, 0x2965, 0x0020, 0x0000, 0x0000, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0x630C, 0x0000, 0x0000, 0x0861, 0x18C3, 0x10A2, 0x10A2, 0x10A2, 0x10A2, 0x18C3, // 0x01E0 (480)
+0x1082, 0x0841, 0x1082, 0x10A2, 0x0020, 0x0000, 0x0000, 0x0000, 0x528A, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFDF, 0xFFFF, 0x4A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544)
+0x0861, 0x3186, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xD6BA, 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, 0x39C7, 0x0000, 0x3186, 0xAD75, 0x8C51, 0x0841, 0x0000, 0x0000, 0x0000, 0x4208, // 0x0260 (608)
+0xD6BA, 0xFFDF, 0xE71C, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0x39C7, 0x0000, 0xCE59, 0xFFFF, 0xFFFF, 0x94B2, 0x0000, 0x0000, 0x10A2, 0xE73C, // 0x02A0 (672)
+0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02D0 (720)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2965, 0x18E3, 0xDEDB, 0x7BCF, 0xAD75, 0xEF5D, 0x2944, 0x0000, 0x5ACA, 0xFFFF, // 0x02E0 (736)
+0xAD55, 0x94B2, 0xAD55, 0xF7BE, 0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xF7BE, 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, 0x39E7, 0x2945, 0xA514, 0x9CF3, 0x8C71, 0xD6BB, 0x39C9, 0x0000, 0x632E, 0xF7DF, // 0x0320 (800)
+0x7BEF, 0xAD54, 0x7BEF, 0xBDF7, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C71, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0330 (816)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0350 (848)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A49, 0x18C3, 0x9492, 0x39E7, 0x3187, 0xA48F, 0x8323, 0x5A00, 0x93A6, 0xCDD5, // 0x0360 (864)
+0x4209, 0x4249, 0x2965, 0x9CD2, 0xB575, 0x0000, 0x0000, 0x0000, 0x0000, 0x9492, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0370 (880)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0390 (912)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x5ACB, 0x0000, 0x9D14, 0x2905, 0x6A40, 0xE643, 0xFFAE, 0xFFF3, 0xFF70, 0xDD86, // 0x03A0 (928)
+0x7240, 0x1840, 0x18C3, 0xC65A, 0x73CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0000, 0x5A6A, 0xD566, 0xFF66, 0xFFF8, 0xFFFD, 0xFFDC, 0xFFFD, 0xFFFA, // 0x03E0 (992)
+0xFF0E, 0xE566, 0xC464, 0xC4CC, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B6D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0410 (1040)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x0800, 0xB440, 0xFFC6, 0xFFF3, 0xFFB4, 0xFFB2, 0xFF92, 0xFF72, 0xFF53, // 0x0420 (1056)
+0xFF55, 0xFF75, 0xFEF0, 0xF542, 0x8240, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0430 (1072)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0440 (1088)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0450 (1104)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8432, 0x4140, 0xFFE2, 0xFFEB, 0xFFAC, 0xFF8B, 0xFF4C, 0xFF2C, 0xFEEC, 0xFECB, // 0x0460 (1120)
+0xFE6A, 0xFE08, 0xFDA7, 0xFDC3, 0xA320, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0470 (1136)
+0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, // 0x0490 (1168)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9D14, 0x28A0, 0xF6E0, 0xFFE1, 0xFF43, 0xFF04, 0xFEC4, 0xFE84, 0xFE23, 0xFDE1, // 0x04A0 (1184)
+0xFD60, 0xFD20, 0xFD20, 0xFD20, 0x7241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04B0 (1200)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04C0 (1216)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04D0 (1232)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xB5B6, 0x0000, 0xC4A9, 0xFEC0, 0xFF00, 0xFEA0, 0xFE40, 0xFE00, 0xFDA0, 0xFD60, // 0x04E0 (1248)
+0xFD40, 0xFD20, 0xEC80, 0xDCC7, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04F0 (1264)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0500 (1280)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0510 (1296)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xAD75, 0x0000, 0xD69B, 0xF631, 0xF5C0, 0xFE80, 0xFE00, 0xFDC0, 0xFD60, 0xFD40, // 0x0520 (1312)
+0xFCC0, 0xDC86, 0xCD93, 0xE73D, 0xE71C, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0530 (1328)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 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, 0xFFFF, 0xFFFF, // 0x0550 (1360)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x632C, 0x0000, 0xD6BA, 0xFFFF, 0xF5F1, 0xFD40, 0xFD80, 0xFD20, 0xFCE0, 0xECA3, // 0x0560 (1376)
+0xDD6F, 0xE6FC, 0xFFFF, 0xFFFF, 0xFFFF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0570 (1392)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0580 (1408)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0590 (1424)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xDEDB, 0x0861, 0x0000, 0xD69A, 0xFFFF, 0xFFFF, 0xFED8, 0xF631, 0xF610, 0xE5F2, 0xE6B9, // 0x05A0 (1440)
+0xF7BF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xE71C, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05B0 (1456)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05C0 (1472)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05D0 (1488)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x39E7, 0x0000, 0x4228, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FF, 0xF7DF, 0xFFFF, // 0x05E0 (1504)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xEF7D, 0xFFFF, 0xFFFF, // 0x05F0 (1520)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0600 (1536)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0610 (1552)
+0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x738E, 0x0000, 0x18C3, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0620 (1568)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xCE59, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B4D, 0xFFFF, 0xFFFF, // 0x0630 (1584)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0640 (1600)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0650 (1616)
+0xFFFF, 0xFFDF, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0660 (1632)
+0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, // 0x0670 (1648)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0680 (1664)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0690 (1680)
+0xFFDF, 0xFFFF, 0xD69A, 0x0861, 0x0000, 0x2945, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06A0 (1696)
+0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xD6BA, // 0x06B0 (1712)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06C0 (1728)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06D0 (1744)
+0xFFFF, 0xFFDF, 0x39C7, 0x0000, 0x0000, 0x8430, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06E0 (1760)
+0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xFFFF, 0xCE79, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, // 0x06F0 (1776)
+0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0700 (1792)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0710 (1808)
+0xFFFF, 0x94B2, 0x0000, 0x0020, 0x0020, 0xCE79, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0720 (1824)
+0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xFFDF, 0x4A69, 0x0000, 0x0841, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, // 0x0730 (1840)
+0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0740 (1856)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0750 (1872)
+0xEF7D, 0x2104, 0x0020, 0x0000, 0x3186, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, // 0x0760 (1888)
+0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xFFFF, 0xB5B6, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, // 0x0770 (1904)
+0x10A2, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0780 (1920)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x0790 (1936)
+0x8C71, 0x0000, 0x0861, 0x0000, 0x7BCF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x07A0 (1952)
+0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xFFDF, 0x528A, 0x0000, 0x0841, 0x0020, 0x0020, 0x0020, 0x0020, // 0x07B0 (1968)
+0x0000, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07C0 (1984)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x07D0 (2000)
+0x3186, 0x0000, 0x0841, 0x10A2, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x07E0 (2016)
+0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF5D, 0xF7BE, 0xBDD7, 0x0841, 0x0861, 0x0841, 0x0841, 0x0841, 0x0020, // 0x07F0 (2032)
+0x0020, 0x1082, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0800 (2048)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, // 0x0810 (2064)
+0x0020, 0x1082, 0x0000, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, // 0x0820 (2080)
+0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF7D, 0x4208, 0x0020, 0x0861, 0x0861, 0x0841, 0x0841, // 0x0830 (2096)
+0x0841, 0x0000, 0x630C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0840 (2112)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6B4D, // 0x0850 (2128)
+0x0000, 0x0861, 0x2104, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, // 0x0860 (2144)
+0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xE73C, 0xF7BE, 0x8430, 0x0000, 0x1082, 0x0861, 0x0861, 0x0861, // 0x0870 (2160)
+0x0861, 0x0020, 0x18C3, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0880 (2176)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x2124, // 0x0890 (2192)
+0x0861, 0x0020, 0x8410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, // 0x08A0 (2208)
+0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xEF7D, 0xB5B6, 0x0861, 0x1082, 0x1082, 0x0861, 0x0861, // 0x08B0 (2224)
+0x0861, 0x0861, 0x0000, 0x8430, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08C0 (2240)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xA514, 0x0020, // 0x08D0 (2256)
+0x10A2, 0x1082, 0xD69A, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, // 0x08E0 (2272)
+0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xEF5D, 0xCE79, 0x2124, 0x1082, 0x10A2, 0x1082, 0x1082, // 0x08F0 (2288)
+0x0861, 0x1082, 0x0000, 0x4208, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0900 (2304)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x4208, 0x0861, // 0x0910 (2320)
+0x1082, 0x31A6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, // 0x0920 (2336)
+0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEDB, 0x39C7, 0x1082, 0x10A2, 0x10A2, 0x1082, // 0x0930 (2352)
+0x1082, 0x1082, 0x0841, 0x18C3, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0940 (2368)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x0841, 0x18C3, // 0x0950 (2384)
+0x0841, 0x630C, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, // 0x0960 (2400)
+0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xDEFB, 0xE73C, 0x4A49, 0x0861, 0x18C3, 0x10A2, 0x10A2, // 0x0970 (2416)
+0x10A2, 0x1082, 0x1082, 0x0841, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0980 (2432)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x3186, 0x1082, 0x18E3, // 0x0990 (2448)
+0x0861, 0x94B2, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, // 0x09A0 (2464)
+0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEDB, 0xE73C, 0x4A69, 0x1082, 0x18E3, 0x18C3, 0x10A2, // 0x09B0 (2480)
+0x10A2, 0x10A2, 0x10A2, 0x0020, 0x73AE, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09C0 (2496)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x94B2, 0x0841, 0x18E3, 0x18E3, // 0x09D0 (2512)
+0x0861, 0xAD75, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, // 0x09E0 (2528)
+0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEDB, 0xE73C, 0x52AA, 0x10A2, 0x2104, 0x18E3, 0x18C3, // 0x09F0 (2544)
+0x18C3, 0x18C3, 0x10A2, 0x0841, 0x630C, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A00 (2560)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x632C, 0x0861, 0x18E4, 0x18E4, // 0x0A10 (2576)
+0x1082, 0xC638, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, // 0x0A20 (2592)
+0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xD6BA, 0xE71C, 0x6B4D, 0x10A2, 0x18C3, 0x18C3, 0x10A2, // 0x0A30 (2608)
+0x10A2, 0x10A2, 0x18C3, 0x0861, 0x5AEB, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A40 (2624)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0862, 0x3143, 0x2924, // 0x0A50 (2640)
+0x0882, 0xBDD7, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, // 0x0A60 (2656)
+0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xE73C, 0x630C, 0x2103, 0x4A69, 0x632C, 0x6B4D, // 0x0A70 (2672)
+0x528A, 0x2965, 0x18C3, 0x1081, 0x738E, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A80 (2688)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x7A40, 0xECA0, 0xCC00, // 0x0A90 (2704)
+0x3941, 0xA535, 0xFFFF, 0xF7BE, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, // 0x0AA0 (2720)
+0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEFB, 0xD6DB, 0xCE38, 0xC618, 0x4A48, 0x4A49, 0x6B6D, 0x6B4D, 0x6B4D, // 0x0AB0 (2736)
+0x6B4D, 0x630C, 0x3186, 0x18E4, 0x9492, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AC0 (2752)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC488, 0xFD41, 0xFE6D, 0xFE6A, // 0x0AD0 (2768)
+0xDC60, 0x5A25, 0xB5D8, 0xFFFF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, // 0x0AE0 (2784)
+0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xD6BB, 0xBCAB, 0xD462, 0xD462, 0x49E4, 0x10C3, 0x18C3, 0x18C3, 0x18C3, // 0x0AF0 (2800)
+0x18C3, 0x18E3, 0x10A3, 0x49C4, 0xB575, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B00 (2816)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCD70, 0xECA0, 0xFF14, 0xFF9B, 0xFF7B, // 0x0B10 (2832)
+0xFECF, 0xC3A0, 0x3143, 0x9CF3, 0xFFFF, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, // 0x0B20 (2848)
+0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEFB, 0xC617, 0xDC60, 0xFD60, 0xFD20, 0x3120, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0B30 (2864)
+0x0000, 0x0000, 0x3900, 0xE460, 0xB46A, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B40 (2880)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD5F4, 0xDC20, 0xFE8E, 0xFF59, 0xFF36, 0xFF36, // 0x0B50 (2896)
+0xFF59, 0xFE6B, 0xA300, 0x18E4, 0x8410, 0xFFBE, 0xF7BE, 0xEF7D, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, // 0x0B60 (2912)
+0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEBA, 0xDEFB, 0xC5B5, 0xE4A1, 0xFEF2, 0xF716, 0x3164, 0x18E4, 0x2103, 0x1082, 0x1082, // 0x0B70 (2928)
+0x0021, 0x1061, 0xD5D0, 0xFE27, 0xB3E3, 0xCE9B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B80 (2944)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77D, 0xE697, 0xDDAF, 0xD4C8, 0xE480, 0xFE29, 0xFF36, 0xFF15, 0xFF35, 0xFF15, // 0x0B90 (2960)
+0xFF15, 0xFF36, 0xFDA5, 0x6A42, 0x1905, 0x6B4C, 0xE73C, 0xFFDF, 0xEF5D, 0xEF7D, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, // 0x0BA0 (2976)
+0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xDEDB, 0xBDB5, 0xE4C3, 0xFF56, 0xFFDB, 0xAD10, 0x10A2, 0x10C3, 0x18E4, 0x1082, // 0x0BB0 (2992)
+0x2922, 0xC5B1, 0xFFDC, 0xFED1, 0xB3A2, 0xBE19, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BC0 (3008)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6B8, 0xD484, 0xE4C0, 0xF584, 0xFE28, 0xFECF, 0xFF14, 0xFF13, 0xFF13, 0xFF13, 0xFF13, // 0x0BD0 (3024)
+0xFF13, 0xFF14, 0xFEF0, 0xDC80, 0x41C5, 0x2945, 0x5269, 0xCE59, 0xF7BE, 0xEF5D, 0xEF5D, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, // 0x0BE0 (3040)
+0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD69A, 0xD6DB, 0xBD95, 0xE4E2, 0xFF33, 0xFF36, 0xFF97, 0xDDF1, 0x8B66, 0x7AE4, 0x9BC7, // 0x0BF0 (3056)
+0xEEB2, 0xFF97, 0xFF37, 0xFEF0, 0xC3E0, 0xB5B7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD52B, 0xFD60, 0xFECD, 0xFF33, 0xFF13, 0xFF12, 0xFEF1, 0xFEF1, 0xFEF1, 0xFEF1, 0xFEF1, // 0x0C10 (3088)
+0xFEF1, 0xFEF1, 0xFF12, 0xFE69, 0x9B41, 0x31A8, 0x31A6, 0x39E7, 0xB5B6, 0xF79E, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, // 0x0C20 (3104)
+0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD699, 0xD6BA, 0xBD94, 0xE502, 0xFF12, 0xFF15, 0xFEF4, 0xFF55, 0xFF95, 0xFF54, 0xFF95, // 0x0C30 (3120)
+0xFF35, 0xFEF4, 0xFF14, 0xFF14, 0xF5A4, 0xB426, 0xE75E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C40 (3136)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD54C, 0xFDA0, 0xFECE, 0xFEF0, 0xFECF, 0xFEEF, 0xFEEF, 0xFEF0, 0xFEEF, 0xFEF0, 0xFEF0, // 0x0C50 (3152)
+0xFEF0, 0xFEEF, 0xFEF0, 0xFEEF, 0xF582, 0x6244, 0x39E8, 0x39C6, 0x528A, 0xE71C, 0xE73C, 0xE71C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, // 0x0C60 (3168)
+0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE9A, 0xBD94, 0xE522, 0xFF10, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, 0xFEF2, // 0x0C70 (3184)
+0xFEF2, 0xFF12, 0xFEF2, 0xFEF2, 0xFF12, 0xED85, 0xBC68, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C80 (3200)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD5B0, 0xF580, 0xFECB, 0xFEEE, 0xFECD, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, // 0x0C90 (3216)
+0xFEEE, 0xFEEE, 0xFECD, 0xFECE, 0xFECA, 0xCC60, 0x41C7, 0x39C7, 0x4228, 0xCE79, 0xEF5D, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, // 0x0CA0 (3232)
+0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE59, 0xCE9A, 0xBD73, 0xED42, 0xFF0F, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, // 0x0CB0 (3248)
+0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFEF0, 0xFF31, 0xF628, 0xC4A7, 0xDE57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE13, 0xF560, 0xFEC9, 0xFECD, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, 0xFECC, // 0x0CD0 (3280)
+0xFEEC, 0xFEEC, 0xFECC, 0xFECC, 0xFEED, 0xFE44, 0x9323, 0x52CC, 0x73AE, 0xD69A, 0xE73C, 0xDEFB, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, // 0x0CE0 (3296)
+0xD6BA, 0xD6BA, 0xD69A, 0xCE79, 0xCE59, 0xD69A, 0xB5D8, 0x7B28, 0xF5A2, 0xFF0F, 0xFECE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, // 0x0CF0 (3312)
+0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFEEE, 0xFECD, 0xFF10, 0xFEA9, 0xCC60, 0xD615, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D00 (3328)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE55, 0xED80, 0xFEA4, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFECA, 0xFEC9, // 0x0D10 (3344)
+0xFEA7, 0xFEA6, 0xFEA8, 0xFEC9, 0xFECB, 0xFEEA, 0xEDA2, 0xB4F0, 0xCE9A, 0xDEFB, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, // 0x0D20 (3360)
+0xD6BA, 0xD69A, 0xCE79, 0xCE79, 0xD6BA, 0xB596, 0x4A8B, 0x72A4, 0xFE45, 0xFEEC, 0xFECC, 0xFEEC, 0xFEEC, 0xFEEC, 0xFEEC, 0xFEEC, // 0x0D30 (3376)
+0xFEEC, 0xFECB, 0xFECB, 0xFEEC, 0xFEEC, 0xFEEC, 0xFECC, 0xFEA5, 0xFDE0, 0xAC8B, 0xE75E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D40 (3392)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE632, 0xF5E0, 0xFE80, 0xFE82, 0xFEC7, 0xFEC8, 0xFEC8, 0xFEC8, 0xFEC7, 0xFEA4, 0xFE61, // 0x0D50 (3408)
+0xFE60, 0xFE60, 0xFE60, 0xFE61, 0xFE83, 0xFEA6, 0xFEA3, 0xDD22, 0xD658, 0xE75D, 0xDEDB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xD69A, // 0x0D60 (3424)
+0xD69A, 0xD69A, 0xD6BA, 0xCE59, 0x9492, 0x5289, 0x39E9, 0x9B84, 0xFEA3, 0xFEEB, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEEA, 0xFEC8, // 0x0D70 (3440)
+0xFE84, 0xFE61, 0xFE61, 0xFEA5, 0xFEC9, 0xFEA7, 0xFEA2, 0xFE80, 0xBC41, 0x8C0F, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D80 (3456)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDDCE, 0xFE40, 0xFEA0, 0xFE80, 0xFE80, 0xFEA2, 0xFEA2, 0xFEA2, 0xFEA0, 0xFE80, 0xFE80, // 0x0D90 (3472)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFE80, 0xFE80, 0xFE80, 0xFE80, 0xFE80, 0xCCE5, 0xD69A, 0xE73C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, // 0x0DA0 (3488)
+0xD69A, 0xBDF7, 0x9CD3, 0x630C, 0x4228, 0x4A69, 0x422A, 0xB423, 0xFEC0, 0xFEA5, 0xFEE7, 0xFEC7, 0xFEC7, 0xFEC6, 0xFEA3, 0xFE80, // 0x0DB0 (3504)
+0xFE80, 0xFE80, 0xFE80, 0xFE60, 0xFEA0, 0xFEC0, 0xEDC0, 0xA3A4, 0x732C, 0xAD96, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE5A8, 0xFEC0, 0xFEA0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0DD0 (3536)
+0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEA0, 0xFEE0, 0xF640, 0x93A8, 0x8C72, 0xA534, 0xAD75, 0xA534, 0x9CF3, 0x8C51, // 0x0DE0 (3552)
+0x738E, 0x5ACB, 0x4A49, 0x4A69, 0x528A, 0x4A8A, 0x5249, 0xD502, 0xFEE0, 0xFEA0, 0xFEC0, 0xFEC1, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, // 0x0DF0 (3568)
+0xFEA0, 0xFEA0, 0xFEA0, 0xFEE0, 0xFE60, 0xC482, 0x7B09, 0x7BD0, 0xB5B7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E00 (3584)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD8A, 0xFEC0, 0xFF20, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, // 0x0E10 (3600)
+0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEC0, 0xFF20, 0xAC02, 0x4209, 0x4A69, 0x4A69, 0x4A69, 0x4A69, 0x4A69, // 0x0E20 (3616)
+0x528A, 0x528A, 0x52AA, 0x52AA, 0x528A, 0x4A8A, 0x5A69, 0xE5C1, 0xFF00, 0xFEC0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, 0xFEE0, // 0x0E30 (3632)
+0xFEC0, 0xFEE0, 0xFF00, 0xE561, 0x9367, 0x736E, 0x9D14, 0xD6BA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD617, 0xCCC5, 0xF620, 0xFEE0, 0xFF40, 0xFF40, 0xFF40, 0xFF20, 0xFF00, 0xFF00, 0xFF00, // 0x0E50 (3664)
+0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF40, 0xB483, 0x4A8B, 0x5ACA, 0x5ACB, 0x5ACB, 0x5ACB, 0x5ACB, // 0x0E60 (3680)
+0x5ACB, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x4A8A, 0x6289, 0xEE20, 0xFF20, 0xFEE0, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFEE0, // 0x0E70 (3696)
+0xFF20, 0xFEC0, 0xBC64, 0x732B, 0x8C72, 0xCE58, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xB576, 0x93EE, 0xA408, 0xC4A5, 0xDD63, 0xF641, 0xFEC0, 0xFF40, 0xFF80, 0xFF60, // 0x0E90 (3728)
+0xFF40, 0xFF20, 0xFF20, 0xFF40, 0xFF40, 0xFF40, 0xFF20, 0xFF20, 0xFF80, 0xAC03, 0x4A6B, 0x5ACA, 0x5ACB, 0x5ACB, 0x5AEB, 0x5AEB, // 0x0EA0 (3744)
+0x5AEB, 0x630C, 0x630C, 0x630C, 0x5AEB, 0x52CB, 0x5A69, 0xE5E1, 0xFF60, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF20, 0xFF60, // 0x0EB0 (3760)
+0xF640, 0xA3A7, 0x738F, 0xAD96, 0xE71C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EC0 (3776)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6DB, 0xB5B8, 0x9CD4, 0x9431, 0x93EE, 0x9C0A, 0xB467, 0xD544, 0xF660, // 0x0ED0 (3792)
+0xFF60, 0xFFA0, 0xFF80, 0xFF60, 0xFF40, 0xFF40, 0xFF60, 0xFFA0, 0xD521, 0x730A, 0x73CF, 0x8C71, 0x9CD3, 0x9CF3, 0xA514, 0xA534, // 0x0EE0 (3808)
+0xAD55, 0xB596, 0xB5B6, 0xB596, 0xAD55, 0x9CF3, 0x83F0, 0xCD04, 0xFFA0, 0xFF40, 0xFF40, 0xFF40, 0xFF40, 0xFF40, 0xFFA0, 0xF621, // 0x0EF0 (3824)
+0x8B49, 0x8431, 0xCE58, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xE73C, 0xD6BB, 0xBE19, 0xA556, 0x9472, 0x9C0D, // 0x0F10 (3856)
+0xB447, 0xDD82, 0xFEE0, 0xFFA0, 0xFFC0, 0xFFC0, 0xFF80, 0xC4C2, 0x730C, 0x9CF4, 0xD69A, 0xEF5D, 0xEF7D, 0xF79E, 0xF79E, 0xF7BE, // 0x0F20 (3872)
+0xF7BE, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xEF7D, 0xDF1C, 0xC530, 0xF620, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0xE5A2, 0x834A, // 0x0F30 (3888)
+0x8C93, 0xDEDA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F40 (3904)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xEF7D, 0xD6BB, // 0x0F50 (3920)
+0xAD77, 0x9452, 0x9BEB, 0xB466, 0xC524, 0xC543, 0xA3E5, 0x734D, 0xAD76, 0xEF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F60 (3936)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF1C, 0xACB0, 0xBCA6, 0xD544, 0xCD64, 0xCD05, 0xAC07, 0x7B6D, 0x9CF4, // 0x0F70 (3952)
+0xE6FB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F80 (3968)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984)
+0xFFDE, 0xE75D, 0xC65A, 0xA536, 0x9493, 0x8C53, 0x94B4, 0xBE18, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FA0 (4000)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEFC, 0xAD57, 0x9493, 0x8C73, 0x8C73, 0x94D4, 0xBE18, 0xEF5D, // 0x0FB0 (4016)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048)
+0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF5C, 0xE73C, 0xEF5C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FE0 (4064)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF5C, 0xE73C, 0xEF5C, 0xEF7D, 0xFFDE, 0xFFFF, // 0x0FF0 (4080)
+0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096)
+};
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino
new file mode 100644
index 0000000..b3967a8
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_CPLD_PageSwitching/UTFT_CPLD_PageSwitching.ino
@@ -0,0 +1,93 @@
+// UTFT_CPLD_PageSwitching (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// This program is a demo of page switching on CPLD-based display modules..
+//
+// This demo was made for modules with a screen resolution
+// of 800x480 pixels.
+//
+// This program requires the UTFT library.
+//
+// NOTE: The display will be black for 10-15 seconds during the start
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t BigFont[];
+extern uint8_t SevenSegNumFont[];
+
+// Set the pins to the correct ones for your development shield
+// ------------------------------------------------------------
+// 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(CPLD,38,39,40,41);
+
+void setup()
+{
+ myGLCD.InitLCD();
+}
+
+void loop()
+{
+ myGLCD.setBackColor(VGA_TRANSPARENT);
+
+ myGLCD.setBrightness(0);
+ for (byte pg=0; pg<8; pg++)
+ {
+ myGLCD.setWritePage(pg);
+ myGLCD.clrScr();
+ for (int ln=0; ln<480; ln+=2)
+ {
+ switch (pg)
+ {
+ case 0:
+ myGLCD.setColor(ln/2, 0, 0);
+ break;
+ case 1:
+ myGLCD.setColor(0, ln/2, 0);
+ break;
+ case 2:
+ myGLCD.setColor(0, 0, ln/2);
+ break;
+ case 3:
+ myGLCD.setColor(ln/4, ln/2, 0);
+ break;
+ case 4:
+ myGLCD.setColor(0, ln/2, ln/2);
+ break;
+ case 5:
+ myGLCD.setColor(ln/2, 0, ln/2);
+ break;
+ case 6:
+ myGLCD.setColor(ln/2, ln/2, 0);
+ break;
+ case 7:
+ myGLCD.setColor(0, ln/2, ln/4);
+ break;
+ }
+ myGLCD.drawLine(0, ln, 799, ln);
+ myGLCD.drawLine(0, ln+1, 799, ln+1);
+ }
+ myGLCD.setColor(VGA_WHITE);
+ myGLCD.setFont(BigFont);
+ myGLCD.print("This is page:", CENTER, 200);
+ myGLCD.setFont(SevenSegNumFont);
+ myGLCD.printNumI(pg, CENTER, 240);
+ }
+ myGLCD.setBrightness(16);
+
+ while(1)
+ {
+ for (byte pg=0; pg<8; pg++)
+ {
+ myGLCD.setDisplayPage(pg);
+ delay(500);
+ }
+ }
+}
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino
new file mode 100644
index 0000000..45a97e6
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_128x128_Serial/UTFT_Demo_128x128_Serial.ino
@@ -0,0 +1,335 @@
+// UTFT_Demo_128x128_Serial (C)2012 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 to work on the 128x128 modules.
+// Any other size displays may cause strange behaviour.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Declare an instance of the class
+UTFT myGLCD(LPH9135,6,5,2,3,4); // Remember to change the model parameter to suit your display module!
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD(PORTRAIT);
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ byte buf[126];
+ int x, x2;
+ int y, y2;
+ int r;
+
+// Clear the screen and draw the frame
+ myGLCD.clrScr();
+ myGLCD.setContrast(64);
+
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRect(0,0,127,12);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0,117,127,127);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255,0,0);
+ myGLCD.print("Universal TFT", CENTER, 0);
+ myGLCD.setBackColor(64,64,64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("H.Karlsen", LEFT, 116);
+ myGLCD.print("(C)2012", RIGHT, 116);
+ myGLCD.setColor(0,255,0);
+ myGLCD.drawRect(0,13,127,116);
+
+// Draw crosshairs
+ myGLCD.setColor(0,0,255);
+ myGLCD.drawLine(63,14,63,115);
+ myGLCD.drawLine(1,63,126,63);
+ for (int i=3; i<128; i+=10)
+ myGLCD.drawLine(i, 61, i, 65);
+ for (int i=14; i<118; i+=10)
+ myGLCD.drawLine(61, i, 65, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.setBackColor(0,0,0);
+ myGLCD.print("Sin", 2, 14);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(sin(((i*2.85)*3.14)/180)*45));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 2, 26);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(cos(((i*2.85)*3.14)/180)*45));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 2, 38);
+ for (int i=1; i<126; i++)
+ {
+ myGLCD.drawPixel(i,63+(tan(((i*2.85)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+ myGLCD.setColor(0,0,255);
+ myGLCD.drawLine(63,14,63,115);
+ myGLCD.drawLine(1,63,126,63);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<3654; i++)
+ {
+ x++;
+ if (x==127)
+ x=1;
+ if (i>127)
+ {
+ if ((x==63)||(buf[x-1]==63))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=63+(sin(((i*1.3)*3.14)/180)*45);
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+// delay(3);
+ }
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(10+(i*10),10+(i*10), 60+(i*10), 60+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(70-(i*10),10+(i*10), 120-(i*10), 60+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// 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(30+(i*10),35+(i*10), 25);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+ // Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=11; i<115; i+=3)
+ {
+ myGLCD.drawLine(1, i, i-10, 115);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=112; i>14; i-=3)
+ {
+ myGLCD.drawLine(126, i, i+14, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=115; i>14; i-=3)
+ {
+ myGLCD.drawLine(1, i, 116-i, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=14; i<115; i+=3)
+ {
+ myGLCD.drawLine(126, i, 140-i, 115);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=22+random(85);
+ y=35+random(59);
+ r=random(20);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random lines
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(124);
+ y=15+random(101);
+ x2=2+random(124);
+ y2=15+random(101);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,126,115);
+
+// Draw some random pixels
+ for (int i=0; i<5000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(124), 15+random(101));
+ }
+
+ delay (2000);
+
+// Set up the "Finished"-screen
+ myGLCD.setContrast(0);
+ myGLCD.fillScr(0,0,255);
+ myGLCD.setColor(255,0,0);
+ myGLCD.fillRoundRect(2, 40, 125, 88);
+
+ myGLCD.setColor(255,255,255);
+ myGLCD.setBackColor(255,0,0);
+ myGLCD.print("That's it!", CENTER, 46);
+ myGLCD.print("Restarting in a", CENTER, 66);
+ myGLCD.print("few seconds...", CENTER, 76);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.setBackColor(0,0,255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 108);
+ myGLCD.printNumI(millis(), CENTER, 118);
+
+ myGLCD.setContrast(64);
+
+ delay (10000);
+
+// Fade screen to black
+ for (int i=64; i>0; i--)
+ {
+ myGLCD.setContrast(i);
+ delay(100);
+ }
+}
+
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino
new file mode 100644
index 0000000..365b716
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_160x128_Serial/UTFT_Demo_160x128_Serial.ino
@@ -0,0 +1,328 @@
+// UTFT_Demo_160x128_Serial (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 160x128 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Usage: myGLCD(, SDA, SCL, CS, RST[, RS]);
+//
+// When using the DM-TFT18-101 and shield from DisplayModule you should use the following:
+// UTFT myGLCD(DMTFT18101,2,3,4,6,5);
+//
+UTFT myGLCD(ITDB18SP,11,10,9,12,8); // Remember to change the model parameter to suit your display module!
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[158];
+ 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, 159, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 114, 159, 127);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("Universal TFT Lib.", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("H.Karlsen", LEFT, 114);
+ myGLCD.print("(C)2014", RIGHT, 114);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 13, 159, 113);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(79, 14, 79, 113);
+ myGLCD.drawLine(1, 63, 158, 63);
+
+ for (int i=9; i<150; i+=10)
+ myGLCD.drawLine(i, 61, i, 65);
+ for (int i=19; i<110; i+=10)
+ myGLCD.drawLine(77, i, 81, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(sin(((i*2.27)*3.14)/180)*40));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(cos(((i*2.27)*3.14)/180)*40));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<158; i++)
+ {
+ myGLCD.drawPixel(i,63+(tan(((i*2.27)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(79, 14, 79, 113);
+ myGLCD.drawLine(1, 63, 158, 63);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(158*20); i++)
+ {
+ x++;
+ if (x==159)
+ x=1;
+ if (i>159)
+ {
+ if ((x==79)||(buf[x-1]==63))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=63+(sin(((i*2.5)*3.14)/180)*(40-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(39+(i*10), 23+(i*10), 59+(i*10), 43+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(99-(i*10), 23+(i*10), 119-(i*10), 43+(i*10));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// 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(49+(i*10),33+(i*10), 15);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=14; i<113; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 112);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=112; i>15; i-=5)
+ {
+ myGLCD.drawLine(158, i, (i*1.44)-12, 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=112; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 172-(i*1.44), 14);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<112; i+=5)
+ {
+ myGLCD.drawLine(158, i, 171-(i*1.44), 112);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=22+random(116);
+ y=35+random(57);
+ r=random(20);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(156);
+ y=16+random(95);
+ x2=2+random(156);
+ y2=16+random(95);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,14,158,113);
+
+ for (int i=0; i<5000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(156), 16+random(95));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(10, 17, 149, 72);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 20);
+ myGLCD.print("Restarting in a", CENTER, 45);
+ myGLCD.print("few seconds...", CENTER, 57);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 103);
+ myGLCD.printNumI(millis(), CENTER, 115);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176/UTFT_Demo_220x176.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176/UTFT_Demo_220x176.ino
new file mode 100644
index 0000000..50e9c32
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176/UTFT_Demo_220x176.ino
@@ -0,0 +1,335 @@
+// UTFT_Demo_220x176 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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.
+//
+
+#include
+
+// Declare which fonts we will be using
+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(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("> elec.henningkarlsen.com <", 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/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino
new file mode 100644
index 0000000..ec66344
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_220x176_Serial/UTFT_Demo_220x176_Serial.ino
@@ -0,0 +1,322 @@
+// UTFT_Demo_220x176_Serial (C)2012 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 serial modules with a screen resolution
+// of 220x176 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+UTFT myGLCD(ITDB22SP,11,10,9,12); // Remember to change the model parameter to suit your display module!
+
+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("> elec.henningkarlsen.com <", 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,161);
+
+// 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/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240/UTFT_Demo_320x240.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240/UTFT_Demo_320x240.ino
new file mode 100644
index 0000000..1e51058
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240/UTFT_Demo_320x240.ino
@@ -0,0 +1,334 @@
+// UTFT_Demo_320x240 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+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(ITDB32S,38,39,40,41);
+
+void setup()
+{
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+}
+
+void loop()
+{
+ int buf[318];
+ 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, 319, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 226, 319, 239);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 227);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 319, 225);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+ for (int i=9; i<310; i+=10)
+ myGLCD.drawLine(i, 117, i, 121);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(157, i, 161, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(318*20); i++)
+ {
+ x++;
+ if (x==319)
+ x=1;
+ if (i>319)
+ {
+ if ((x==159)||(buf[x-1]==119))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(100+(i*20),60+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 224);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(318, i, (i*1.44)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 331-(i*1.44), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(318, i, 330-(i*1.44), 224);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(256);
+ y=45+random(146);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(209);
+ x2=2+random(316);
+ y2=16+random(209);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(316), 16+random(209));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(80, 70, 239, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 210);
+ myGLCD.printNumI(millis(), CENTER, 225);
+
+ delay (10000);
+}
+
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino
new file mode 100644
index 0000000..a741524
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_320x240_Serial/UTFT_Demo_320x240_Serial.ino
@@ -0,0 +1,354 @@
+// UTFT_Demo_320x240_Serial (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 serial modules with a screen
+// resolution of 320x240 pixels.
+//
+// This program requires the UTFT library.
+//
+// ********************************************************************
+// * IMPORTANT: Read the comments in the setup() function when *
+// * using the Watterott MI0283QT9 or the DisplayModule DM-TFT28-105. *
+// ********************************************************************
+//
+
+#include
+
+// Declare which fonts we will be using
+extern uint8_t SmallFont[];
+
+// Uncomment the line for your display:
+//UTFT myGLCD(TFT01_22SP,9,8,12,11,10); // ElecFreaks TFT01-2.2SP
+//UTFT myGLCD(MI0283QT9,11,13,7,8); // Watterott MI0283QT9
+UTFT myGLCD(DMTFT28105,MOSI,SCK,10,NOTINUSE,9); // DisplayModule DM-TFT28-105 (Works with both Arduino Uno and Arduino Mega)
+
+void setup()
+{
+// Watterott
+// ---------
+// The following two lines are needed for the MI0283QT9 display
+// module to enable the backlight. If you are using any other
+// display module these lines should be commented out.
+// -------------------------------------------------------------
+// pinMode(9, OUTPUT);
+// digitalWrite(9, HIGH);
+// -------------------------------------------------------------
+
+// DisplayModule
+// -------------
+// The following 4 lines are needed for the DM-TFT28-105 display
+// module to set the SS/CS pins for the other devices connected
+// to the Arduino SPI pins. If you are using any other display
+// module these lines should be commented out.
+// -------------------------------------------------------------
+ pinMode(10,OUTPUT); digitalWrite(10,HIGH); // TFT SS/CE
+ pinMode(8, OUTPUT); digitalWrite(8, HIGH); // SD card SS/CE
+ pinMode(6, OUTPUT); digitalWrite(6, HIGH); // Flash chip SS/CE
+ pinMode(4, OUTPUT); digitalWrite(4, HIGH); // Touch controller SS/CE
+// -------------------------------------------------------------
+
+
+// Just get some random numbers
+ randomSeed(analogRead(0));
+
+// Setup the LCD
+ myGLCD.InitLCD();
+ myGLCD.setFont(SmallFont);
+
+}
+
+void loop()
+{
+ int buf[318];
+ 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, 319, 13);
+ myGLCD.setColor(64, 64, 64);
+ myGLCD.fillRect(0, 226, 319, 239);
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
+ myGLCD.setBackColor(64, 64, 64);
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("", CENTER, 227);
+
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.drawRect(0, 14, 319, 225);
+
+// Draw crosshairs
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+ for (int i=9; i<310; i+=10)
+ myGLCD.drawLine(i, 117, i, 121);
+ for (int i=19; i<220; i+=10)
+ myGLCD.drawLine(157, i, 161, i);
+
+// Draw sin-, cos- and tan-lines
+ myGLCD.setColor(0,255,255);
+ myGLCD.print("Sin", 5, 15);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,0,0);
+ myGLCD.print("Cos", 5, 27);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95));
+ }
+
+ myGLCD.setColor(255,255,0);
+ myGLCD.print("Tan", 5, 39);
+ for (int i=1; i<318; i++)
+ {
+ myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+ myGLCD.setColor(0, 0, 255);
+ myGLCD.setBackColor(0, 0, 0);
+ myGLCD.drawLine(159, 15, 159, 224);
+ myGLCD.drawLine(1, 119, 318, 119);
+
+// Draw a moving sinewave
+ x=1;
+ for (int i=1; i<(318*20); i++)
+ {
+ x++;
+ if (x==319)
+ x=1;
+ if (i>319)
+ {
+ if ((x==159)||(buf[x-1]==119))
+ myGLCD.setColor(0,0,255);
+ else
+ myGLCD.setColor(0,0,0);
+ myGLCD.drawPixel(x,buf[x-1]);
+ }
+ myGLCD.setColor(0,255,255);
+ y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100)));
+ myGLCD.drawPixel(x,y);
+ buf[x-1]=y;
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20));
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// 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(100+(i*20),60+(i*20), 30);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some lines in a pattern
+ myGLCD.setColor (255,0,0);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(1, i, (i*1.44)-10, 224);
+ }
+ myGLCD.setColor (255,0,0);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(318, i, (i*1.44)-11, 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=224; i>15; i-=5)
+ {
+ myGLCD.drawLine(1, i, 331-(i*1.44), 15);
+ }
+ myGLCD.setColor (0,255,255);
+ for (int i=15; i<224; i+=5)
+ {
+ myGLCD.drawLine(318, i, 330-(i*1.44), 224);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random circles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=32+random(256);
+ y=45+random(146);
+ r=random(30);
+ myGLCD.drawCircle(x, y, r);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+// Draw some random rounded rectangles
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(207);
+ x2=2+random(316);
+ y2=16+random(207);
+ myGLCD.drawRoundRect(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<100; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ x=2+random(316);
+ y=16+random(209);
+ x2=2+random(316);
+ y2=16+random(209);
+ myGLCD.drawLine(x, y, x2, y2);
+ }
+
+ delay(2000);
+
+ myGLCD.setColor(0,0,0);
+ myGLCD.fillRect(1,15,318,224);
+
+ for (int i=0; i<10000; i++)
+ {
+ myGLCD.setColor(random(255), random(255), random(255));
+ myGLCD.drawPixel(2+random(316), 16+random(209));
+ }
+
+ delay(2000);
+
+ myGLCD.fillScr(0, 0, 255);
+ myGLCD.setColor(255, 0, 0);
+ myGLCD.fillRoundRect(80, 70, 239, 169);
+
+ myGLCD.setColor(255, 255, 255);
+ myGLCD.setBackColor(255, 0, 0);
+ myGLCD.print("That's it!", CENTER, 93);
+ myGLCD.print("Restarting in a", CENTER, 119);
+ myGLCD.print("few seconds...", CENTER, 132);
+
+ myGLCD.setColor(0, 255, 0);
+ myGLCD.setBackColor(0, 0, 255);
+ myGLCD.print("Runtime: (msecs)", CENTER, 210);
+ myGLCD.printNumI(millis(), CENTER, 225);
+
+ delay (10000);
+}
\ No newline at end of file
diff --git a/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_400x240/UTFT_Demo_400x240.ino b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_400x240/UTFT_Demo_400x240.ino
new file mode 100644
index 0000000..93538ce
--- /dev/null
+++ b/libraries/UTFT/examples/Arduino (AVR)/UTFT_Demo_400x240/UTFT_Demo_400x240.ino
@@ -0,0 +1,336 @@
+// UTFT_Demo_400x240 (C)2014 Henning Karlsen
+// web: http://www.henningkarlsen.com/electronics
+//
+// 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 400x240 pixels.
+//
+// This program requires the UTFT library.
+//
+
+#include
+
+// Declare which fonts we will be using
+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 :