├── Wiring Diagram-ESP32a.JPG ├── README.md ├── ESP32_Spectrum_Display_03.ino └── font.h /Wiring Diagram-ESP32a.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobozo/ESP32-Audio-Spectrum-Waveform-Display/HEAD/Wiring Diagram-ESP32a.JPG -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP32-8-Octave-Audio-Spectrum-Display 2 | Using an ESP32 and OLED display together with an FFT to display audio as 8-octaves in the frequency domain. 3 | 4 | An improved version solely for the ESP32 with its significantly faster ADC to enable an increase in the resolution of the frequency domain by a factor of 4, whilst also giving an improved dynamic range. Code improvements have also been made to speed up the processing together with a shorter code length. 5 | 6 | You must place the font.h file in the same location as the sketch. The Font file is needed to provide a font that can display enough characters across the screen to enable each band to be clearly denoted. The bands are: 7 | 8 | 125Hz 9 | 250Hz 10 | 500Hz 11 | 1KHz 12 | 2Khz 13 | 4KHz 14 | 8Khz 15 | 16kHz 16 | 17 | Please note, if you use a microphone - speaker test environment it is highly likely (unless of very high bandwidth and quality) that both the microphone and speakers used have insufficient quality to ensure you are getting a flat frequency response for the Fast Fourier Transform to convert and display. The only way to ensure you see the correct result is to feed approximately 50mV to 100mV pk-pk of audio directly into the ADC port with no DC offset. This is not a fault with the software or display or FFT - it’s the laws of physics! 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ESP32_Spectrum_Display_03.ino: -------------------------------------------------------------------------------- 1 | /* ESP8266/32 Audio Spectrum Analyser on an SSD1306/SH1106 Display 2 | The MIT License (MIT) Copyright (c) 2017 by David Bird. 3 | The formulation and display of an AUdio Spectrum using an ESp8266 or ESP32 and SSD1306 or SH1106 OLED Display using a Fast Fourier Transform 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files 5 | (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, 6 | publish, distribute, but not to use it commercially for profit making or to sub-license and/or to sell copies of the Software or to 7 | permit persons to whom the Software is furnished to do so, subject to the following conditions: 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 10 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 11 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 12 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 13 | See more at http://dsbird.org.uk 14 | */ 15 | 16 | #include // needed to get to adc1_get_raw() 17 | #include 18 | #include // needed to disable the WiFi 19 | #include "arduinoFFT.h" // Standard Arduino FFT library: in IDE, Manage Library, then search for FFT 20 | arduinoFFT FFT = arduinoFFT(); // or manually install from https://github.com/kosme/arduinoFFT 21 | 22 | 23 | // comment this out to use regular ILI9341 24 | #define WROVER_KIT 25 | 26 | #ifdef WROVER_KIT 27 | #define TFT_DC 21 28 | #define TFT_CS 0 29 | #define TFT_RST 18 30 | #define SPI_MISO 25 31 | #define SPI_MOSI 23 32 | #define SPI_CLK 19 33 | #define LCD_BL_CTR 5 34 | #include "WROVER_KIT_LCD.h" // https://github.com/espressif/WROVER_KIT_LCD 35 | #include 36 | // Some code uses the Adafruit_ILI9341 interface for tft, fix this here 37 | #define Adafruit_ILI9341 WROVER_KIT_LCD 38 | #define min(X, Y) (((X) < (Y)) ? (X) : (Y)) 39 | #define max(X, Y) (((X) > (Y)) ? (X) : (Y)) 40 | Adafruit_ILI9341 tft; 41 | #else 42 | #define TFT_RST 18 43 | #define SPI_MISO 25 44 | #define SPI_MOSI 23 45 | #define SPI_CLK 19 46 | #define LCD_BL_CTR 5 47 | #define TFT_CS 10 48 | #define TFT_DC 9 49 | #include 50 | #include 51 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 52 | #endif 53 | 54 | #ifdef ILI9341_TFTWIDTH 55 | #define TFT_WIDTH ILI9341_TFTWIDTH 56 | #else 57 | #define TFT_WIDTH 320 58 | #endif 59 | #ifdef ILI9341_TFTHEIGHT 60 | #define TFT_HEIGHT ILI9341_TFTHEIGHT 61 | #else 62 | #define TFT_HEIGHT 240 63 | #endif 64 | 65 | #define WAVEFORM_YPOS (TFT_HEIGHT/2) - 50 66 | #define WAVEFORM_SQUEEZE 5 // e.g. 5 => 1/5th of the screen 67 | 68 | 69 | int SAMPLES = 512; // Must be a power of 2 70 | #define SAMPLING_FREQUENCY 40000 // Hz, must be 40000 or less due to ADC conversion time. Determines maximum frequency that can be analysed by the FFT Fmax=sampleF/2. 71 | #define EQBANDS 8 72 | 73 | struct eqBand { 74 | const char *freqname; 75 | uint16_t amplitude; 76 | byte bandWidth; 77 | int peak; 78 | int lastpeak; 79 | uint16_t curval; 80 | uint16_t lastval; 81 | unsigned long lastmeasured; 82 | }; 83 | 84 | eqBand audiospectrum[EQBANDS] = { 85 | /* 86 | Adjust the amplitude/bandWidth values 87 | to fit your microphone 88 | */ 89 | { "125Hz", 1000, 2, 0, 0, 0, 0, 0}, 90 | { "250Hz", 500, 2, 0, 0, 0, 0, 0}, 91 | { "500Hz", 300, 3, 0, 0, 0, 0, 0}, 92 | { "1KHz", 250, 7, 0, 0, 0, 0, 0}, 93 | { "2KHz", 200, 14, 0, 0, 0, 0, 0}, 94 | { "4KHz", 100, 24, 0, 0, 0, 0, 0}, 95 | { "8KHz", 50, 48, 0, 0, 0, 0, 0}, 96 | { "16KHz", 25, 155, 0, 0, 0, 0, 0} 97 | }; 98 | 99 | /* store bandwidth variations when sample rate changes */ 100 | int bandWidth[EQBANDS] = { 101 | 0, 0, 0, 0, 0, 0, 0, 0 102 | }; 103 | 104 | // sample helpers, buffer and data 105 | unsigned int sampling_period_us; 106 | unsigned long microseconds; 107 | double vReal[1024]; 108 | double vImag[1024]; 109 | unsigned long newTime; 110 | bool adcread = false; // use adc raw or analogread 111 | 112 | // waveform cache and settings 113 | float eQGraph[TFT_WIDTH]; 114 | float wmultiplier = TFT_WIDTH / SAMPLES; 115 | bool wafeformdirtoggler = false; 116 | 117 | // EQ Bands settings 118 | uint16_t bands = EQBANDS; 119 | uint16_t bands_width = floor( TFT_WIDTH / bands ); 120 | uint16_t bands_pad = bands_width - (TFT_WIDTH / 16); 121 | uint16_t colormap[255]; // color palette for the band meter (pre-fill in setup) 122 | uint16_t bands_line_vspacing = 4; 123 | uint16_t bandslabelheight = 10; 124 | uint16_t bandslabelpos = TFT_HEIGHT - bandslabelheight; 125 | uint16_t bandslabelmargin = bandslabelheight * 2; 126 | float bands_vratio = 2; // all collected values will be divided by this, this affects the height of the bands 127 | uint16_t audospectrumheight = TFT_HEIGHT / bands_vratio; 128 | uint16_t asvstart = TFT_HEIGHT - bandslabelmargin; 129 | uint16_t asvend = asvstart - audospectrumheight; 130 | 131 | // booleans to manage the display state 132 | bool displayvolume = true; 133 | bool displaywaveform = true; 134 | bool displayspectrometer = true; 135 | 136 | // volume level 137 | long signalAvg = 0, signalMax = 0, signalMin = 4096; 138 | long max1 = 0, max2 = 0, then, now, nowthen; 139 | bool isSaturating = false; 140 | bool wasSaturating = false; 141 | uint16_t vol = 0; // stores the volume value (0-4096) 142 | uint16_t volWidth = 0; // stores the display-translated volume bar width 143 | float volMod = 1; // fps maintainer: multiplier for waveform, more volume = smaller lines 144 | float lastVolMod = 1; 145 | 146 | 147 | void drawAudioSpectrumGrid() { 148 | tft.setTextColor(ILI9341_YELLOW); 149 | 150 | audospectrumheight = TFT_HEIGHT / bands_vratio; 151 | asvstart = TFT_HEIGHT - bandslabelmargin; 152 | asvend = asvstart - audospectrumheight - bandslabelmargin; 153 | 154 | Serial.println( "Audio Spectrum Height(px): " + String(audospectrumheight) + " Start at:" + String(asvstart) + " End at:" + String(asvend)); 155 | 156 | /* 157 | for(uint8_t i=0;i= asvend; i--) { 163 | uint16_t projected = map(i, asvend - 1, asvstart + 1, 0, 127); 164 | //Serial.println("pixel[" + String(i) + "] + map(" + String(projected) + ") = rgb(" + String(128 + projected) + ", " + String(255 - projected) + ", 0)"); 165 | colormap[i] = tft.color565(255 - projected / 2, 128 + projected, 0); 166 | } 167 | 168 | for (byte band = 0; band < bands; band++) { 169 | tft.setCursor(bands_width * band + 2, bandslabelpos); 170 | tft.print(audiospectrum[band].freqname); 171 | } 172 | } 173 | 174 | 175 | 176 | 177 | 178 | 179 | void displayBand(int band, int dsize) { 180 | uint16_t hpos = bands_width * band + (bands_pad / 2); 181 | int dmax = (TFT_HEIGHT / bands_vratio) - 20; // roof value 182 | dsize /= bands_vratio; 183 | if (dsize > audospectrumheight) { 184 | dsize = audospectrumheight; // leave some hspace for text 185 | } 186 | if (dsize < audiospectrum[band].lastval) { 187 | // lower value, delete some lines 188 | uint8_t bardelta = dsize % bands_line_vspacing; 189 | for (int s = dsize - bardelta; s <= audiospectrum[band].lastval; s = s + bands_line_vspacing) { 190 | tft.drawFastHLine(hpos, TFT_HEIGHT - (s + 20), bands_pad, ILI9341_BLACK); 191 | } 192 | } 193 | if (dsize > dmax) dsize = dmax; 194 | for (int s = 0; s <= dsize; s = s + bands_line_vspacing) { 195 | uint8_t vpos = TFT_HEIGHT - (s + 20); 196 | tft.drawFastHLine(hpos, vpos, bands_pad, colormap[vpos]); 197 | } 198 | if (dsize > audiospectrum[band].peak) { 199 | audiospectrum[band].peak = dsize; 200 | } 201 | audiospectrum[band].lastval = dsize; 202 | audiospectrum[band].lastmeasured = millis(); 203 | } 204 | 205 | 206 | void setBandwidth() { 207 | byte multiplier = SAMPLES / 256; 208 | bandWidth[0] = audiospectrum[0].bandWidth * multiplier; 209 | for (byte j = 1; j < bands; j++) { 210 | bandWidth[j] = audiospectrum[j].bandWidth * multiplier + bandWidth[j - 1]; 211 | } 212 | wmultiplier = ((float)TFT_WIDTH / (float)SAMPLES) * 2; 213 | } 214 | 215 | 216 | byte getBand(int i) { 217 | for (byte j = 0; j < bands; j++) { 218 | if (i <= bandWidth[j]) return j; 219 | } 220 | return bands; 221 | } 222 | 223 | 224 | void peakWaveForm() { 225 | for (uint16_t i = 0; i < SAMPLES / 2; i++) { 226 | if (eQGraph[i] >= 0.00005) { 227 | eQGraph[i] /= 2; //(2+getBand(i)); 228 | } 229 | } 230 | } 231 | 232 | 233 | 234 | void displayWaveForm(uint16_t color) { 235 | uint16_t lastx = 1; 236 | uint16_t lasty = WAVEFORM_YPOS; 237 | float wSqueeze = WAVEFORM_SQUEEZE; 238 | uint8_t maxWaveFormHeight = WAVEFORM_YPOS; 239 | 240 | if (color == ILI9341_BLACK) { 241 | //isSaturating = wasSaturating; 242 | //volMod = lastVolMod; 243 | } else { 244 | wasSaturating = isSaturating; 245 | lastVolMod = volMod; 246 | wafeformdirtoggler = !wafeformdirtoggler; 247 | uint red = vol / 16; 248 | color = tft.color565(red, 255-red, 0); 249 | } 250 | 251 | float toLog = 1.5-lastVolMod*1.5; 252 | if(toLog!=0.00) { 253 | // https://www.google.com/search?q=y%3D(-log(1.5-x*1.5))*8 254 | float volSqueezer = (-log(toLog))*8; 255 | if(volSqueezer > 0.00) { 256 | wSqueeze += volSqueezer/*+WAVEFORM_SQUEEZE*/; 257 | } else { 258 | wSqueeze /= -volSqueezer; 259 | } 260 | } 261 | 262 | byte wafeformdirection = wafeformdirtoggler ? 1 : 0; 263 | for (uint16_t i = 1; i < SAMPLES / 2; i++) { 264 | 265 | if (eQGraph[i] >= 0.00005) { 266 | uint tmpy; 267 | uint nextx = i * wmultiplier; 268 | uint eQGraphPos = eQGraph[i] / wSqueeze; 269 | 270 | if (eQGraphPos > maxWaveFormHeight) { // roof values 271 | eQGraphPos = maxWaveFormHeight; 272 | } 273 | 274 | if (i % 2 == wafeformdirection) { 275 | tmpy = WAVEFORM_YPOS + eQGraphPos; 276 | } else { 277 | tmpy = WAVEFORM_YPOS - eQGraphPos; 278 | } 279 | 280 | if (lasty != 0) { 281 | //color = color==ILI9341_BLACK ? color : colormap[(byte)TFT_HEIGHT-(eQGraph[i])]; 282 | tft.drawLine(lastx, lasty, nextx, tmpy, color); 283 | } 284 | lastx = nextx; 285 | lasty = tmpy; 286 | } 287 | } 288 | tft.drawLine(lastx, lasty, lastx + 1, WAVEFORM_YPOS, color); 289 | if (lastx < TFT_WIDTH && color != ILI9341_BLACK) { 290 | tft.drawLine(lastx + 1, WAVEFORM_YPOS, TFT_WIDTH, WAVEFORM_YPOS, color); 291 | } 292 | } 293 | 294 | 295 | void captureSoundSample() { 296 | signalAvg = 0; 297 | signalMax = 0; 298 | signalMin = 4096; 299 | 300 | for (int i = 0; i < SAMPLES; i++) { 301 | newTime = micros(); 302 | if ( adcread ) { 303 | vReal[i] = adc1_get_raw( ADC1_CHANNEL_0 ); // A raw conversion takes about 20uS on an ESP32 304 | delayMicroseconds(20); 305 | } else { 306 | vReal[i] = analogRead(A0); // A conversion takes about 1uS on an ESP32 307 | } 308 | 309 | vImag[i] = 0; 310 | if (displayvolume) { 311 | signalMin = min(signalMin, vReal[i]); 312 | signalMax = max(signalMax, vReal[i]); 313 | signalAvg += vReal[i]; 314 | } 315 | 316 | while ((micros() - newTime) < sampling_period_us) { 317 | // do nothing to wait 318 | yield(); 319 | } 320 | } 321 | 322 | FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); 323 | FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD); 324 | FFT.ComplexToMagnitude(vReal, vImag, SAMPLES); 325 | } 326 | 327 | 328 | 329 | 330 | 331 | void renderSpectrometer() { 332 | if (displayvolume) { 333 | signalAvg /= SAMPLES; 334 | vol = (signalMax - signalMin); 335 | volWidth = map(vol, 0, 4096, 1, TFT_WIDTH); 336 | volMod = (float) map(vol, 0, 4096, 1, 1000) / 1000; 337 | tft.drawFastHLine(0, 20, volWidth, ILI9341_GREEN); 338 | tft.drawFastHLine(volWidth, 20, TFT_WIDTH - volWidth, ILI9341_BLACK); 339 | if (volMod >= .25) isSaturating = true; 340 | else isSaturating = false; 341 | } 342 | 343 | if (displaywaveform) { 344 | displayWaveForm(ILI9341_BLACK); 345 | peakWaveForm(); 346 | } 347 | 348 | for (int i = 2; i < (SAMPLES / 2); i++) { // Don't use sample 0 and only first SAMPLES/2 are usable. Each array element represents a frequency and its value the amplitude. 349 | if (vReal[i] > 512) { // Add a crude noise filter, 10 x amplitude or more 350 | byte bandNum = getBand(i); 351 | if (bandNum != bands) { 352 | audiospectrum[bandNum].curval = (int)vReal[i] / audiospectrum[bandNum].amplitude; 353 | if (displayspectrometer) { 354 | displayBand(bandNum, audiospectrum[bandNum].curval); 355 | } 356 | if (displaywaveform) { 357 | eQGraph[i] += audiospectrum[bandNum].curval; 358 | } 359 | } 360 | } 361 | } 362 | 363 | if (displaywaveform) { 364 | displayWaveForm(ILI9341_GREEN); 365 | } 366 | 367 | if (displayspectrometer) { 368 | long vnow = millis(); 369 | bool peakchanged = false; 370 | for (byte band = 0; band < bands; band++) { 371 | // auto decay every 50ms on low activity bands 372 | if (vnow - audiospectrum[band].lastmeasured > 50) { 373 | displayBand(band, audiospectrum[band].lastval > bands_line_vspacing ? audiospectrum[band].lastval - bands_line_vspacing : 0); 374 | } 375 | if (audiospectrum[band].peak > 0) { 376 | audiospectrum[band].peak -= bands_line_vspacing;//(band/3)+2; 377 | if (audiospectrum[band].peak <= 0) { 378 | audiospectrum[band].peak = 0; 379 | } 380 | } 381 | // only redraw peak if changed 382 | if (audiospectrum[band].lastpeak != audiospectrum[band].peak) { 383 | peakchanged = true; 384 | // delete last peak 385 | tft.drawFastHLine(bands_width * band + (bands_pad / 2), TFT_HEIGHT - audiospectrum[band].lastpeak - 20, bands_pad, ILI9341_BLACK); 386 | audiospectrum[band].lastpeak = audiospectrum[band].peak; 387 | tft.drawFastHLine(bands_width * band + (bands_pad / 2), TFT_HEIGHT - audiospectrum[band].peak - 20, bands_pad, colormap[TFT_HEIGHT - audiospectrum[band].peak - 20]); 388 | } 389 | } 390 | } 391 | } 392 | 393 | 394 | void handleSerial() { 395 | if (Serial.available()) { 396 | // toggle display modes 397 | char c = Serial.read(); 398 | if (displaywaveform) { 399 | displayWaveForm(ILI9341_BLACK); 400 | memset(eQGraph, 0, TFT_WIDTH); 401 | } 402 | switch (c) { 403 | case 'a': 404 | adcread = !adcread; 405 | Serial.println("Use adc RAW " + String(adcread)); 406 | tft.fillScreen(ILI9341_BLACK); 407 | break; 408 | case 'v': 409 | displayvolume = !displayvolume; 410 | Serial.println("Volume " + String(displayvolume)); 411 | tft.fillScreen(ILI9341_BLACK); 412 | break; 413 | case 'w': 414 | displaywaveform = !displaywaveform; 415 | Serial.println("Waveform " + String(displaywaveform)); 416 | tft.fillScreen(ILI9341_BLACK); 417 | break; 418 | case 's': 419 | displayspectrometer = !displayspectrometer; 420 | Serial.println("Spectro " + String(displayspectrometer)); 421 | tft.fillScreen(ILI9341_BLACK); 422 | break; 423 | case '+': 424 | SAMPLES *= 2; 425 | Serial.println("Sampling buffer " + String(SAMPLES)); 426 | break; 427 | case '-': 428 | if (SAMPLES / 2 > 32) { 429 | SAMPLES /= 2; 430 | } 431 | Serial.println("Sampling buffer " + String(SAMPLES)); 432 | break; 433 | case '*': 434 | if ( bands + 1 <= 8 ) bands++; 435 | bands_width = floor( TFT_WIDTH / bands ); 436 | bands_pad = bands_width - (TFT_WIDTH / 16); 437 | tft.fillScreen(ILI9341_BLACK); 438 | Serial.println("EQ Bands " + String(bands)); 439 | break; 440 | case '/': 441 | if ( bands - 1 > 0 ) bands--; 442 | bands_width = floor( TFT_WIDTH / bands ); 443 | bands_pad = bands_width - (TFT_WIDTH / 16); 444 | tft.fillScreen(ILI9341_BLACK); 445 | Serial.println("EQ Bands " + String(bands)); 446 | break; 447 | case '@': 448 | int SAMPLESIZE = SAMPLES / 2; 449 | int i = 0; 450 | 451 | for (int mag = 1; mag < SAMPLESIZE; mag = mag * 2) { 452 | byte magmapped = map(mag, 1, SAMPLESIZE, 1, TFT_WIDTH); 453 | Serial.println("#" + String(i) + " " + String(magmapped) + " " + String(mag) ); 454 | i++; 455 | } 456 | /* 457 | for (int i = 2; i < (SAMPLES/2); i++){ // Don't use sample 0 and only first SAMPLES/2 are usable. Each array element represents a frequency and its value the amplitude. 458 | if (vReal[i] > 512) { // Add a crude noise filter, 10 x amplitude or more 459 | //byte bandNum = getBand(i); 460 | 461 | } 462 | }*/ 463 | 464 | break; 465 | 466 | } 467 | if (displayspectrometer) { 468 | drawAudioSpectrumGrid(); 469 | } 470 | setBandwidth(); 471 | max1 = 0; 472 | max2 = 0; 473 | } 474 | } 475 | 476 | 477 | void setup() { 478 | WiFi.mode(WIFI_MODE_NULL); 479 | Serial.begin(115200); 480 | 481 | adc1_config_width(ADC_WIDTH_12Bit); //Range 0-1023 482 | adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_11db); //ADC_ATTEN_DB_11 = 0-3,6V 483 | sampling_period_us = round(1000000 * (1.0 / SAMPLING_FREQUENCY)); 484 | 485 | tft.begin(); 486 | tft.setRotation( 3 ); 487 | tft.fillScreen(ILI9341_BLACK); 488 | tft.setTextColor(ILI9341_YELLOW); 489 | tft.setCursor(98, 42); 490 | tft.print("Sampling at: " + String(sampling_period_us) + "uS"); 491 | 492 | delay(1000); 493 | 494 | tft.fillScreen(ILI9341_BLACK); 495 | 496 | drawAudioSpectrumGrid(); 497 | setBandwidth(); 498 | memset(eQGraph, 0, TFT_WIDTH); 499 | } 500 | 501 | 502 | 503 | 504 | void loop() { 505 | 506 | handleSerial(); 507 | captureSoundSample(); 508 | renderSpectrometer(); 509 | 510 | } 511 | -------------------------------------------------------------------------------- /font.h: -------------------------------------------------------------------------------- 1 | // Created by http://oleddisplay.squix.ch/ Consider a donation 2 | // In case of problems make sure that you are using the font file with the correct version! 3 | const char Dialog_plain_8[] PROGMEM = { 4 | 0x08, // Width: 8 5 | 0x0A, // Height: 10 6 | 0x20, // First Char: 32 7 | 0xE0, // Numbers of Chars: 224 8 | 9 | // Jump Table: 10 | 0xFF, 0xFF, 0x00, 0x03, // 32:65535 11 | 0x00, 0x00, 0x03, 0x03, // 33:0 12 | 0x00, 0x03, 0x07, 0x04, // 34:3 13 | 0x00, 0x0A, 0x0B, 0x07, // 35:10 14 | 0x00, 0x15, 0x09, 0x05, // 36:21 15 | 0x00, 0x1E, 0x0F, 0x08, // 37:30 16 | 0x00, 0x2D, 0x0B, 0x06, // 38:45 17 | 0x00, 0x38, 0x03, 0x02, // 39:56 18 | 0x00, 0x3B, 0x05, 0x03, // 40:59 19 | 0x00, 0x40, 0x05, 0x03, // 41:64 20 | 0x00, 0x45, 0x07, 0x04, // 42:69 21 | 0x00, 0x4C, 0x0B, 0x07, // 43:76 22 | 0x00, 0x57, 0x04, 0x03, // 44:87 23 | 0x00, 0x5B, 0x05, 0x03, // 45:91 24 | 0x00, 0x60, 0x03, 0x03, // 46:96 25 | 0x00, 0x63, 0x05, 0x03, // 47:99 26 | 0x00, 0x68, 0x09, 0x05, // 48:104 27 | 0x00, 0x71, 0x07, 0x05, // 49:113 28 | 0x00, 0x78, 0x09, 0x05, // 50:120 29 | 0x00, 0x81, 0x09, 0x05, // 51:129 30 | 0x00, 0x8A, 0x09, 0x05, // 52:138 31 | 0x00, 0x93, 0x09, 0x05, // 53:147 32 | 0x00, 0x9C, 0x09, 0x05, // 54:156 33 | 0x00, 0xA5, 0x09, 0x05, // 55:165 34 | 0x00, 0xAE, 0x09, 0x05, // 56:174 35 | 0x00, 0xB7, 0x09, 0x05, // 57:183 36 | 0x00, 0xC0, 0x03, 0x03, // 58:192 37 | 0x00, 0xC3, 0x04, 0x03, // 59:195 38 | 0x00, 0xC7, 0x0B, 0x07, // 60:199 39 | 0x00, 0xD2, 0x0B, 0x07, // 61:210 40 | 0x00, 0xDD, 0x0B, 0x07, // 62:221 41 | 0x00, 0xE8, 0x07, 0x04, // 63:232 42 | 0x00, 0xEF, 0x0F, 0x08, // 64:239 43 | 0x00, 0xFE, 0x09, 0x05, // 65:254 44 | 0x01, 0x07, 0x09, 0x05, // 66:263 45 | 0x01, 0x10, 0x0B, 0x06, // 67:272 46 | 0x01, 0x1B, 0x0B, 0x06, // 68:283 47 | 0x01, 0x26, 0x09, 0x05, // 69:294 48 | 0x01, 0x2F, 0x07, 0x05, // 70:303 49 | 0x01, 0x36, 0x0B, 0x06, // 71:310 50 | 0x01, 0x41, 0x09, 0x06, // 72:321 51 | 0x01, 0x4A, 0x03, 0x02, // 73:330 52 | 0x01, 0x4D, 0x04, 0x02, // 74:333 53 | 0x01, 0x51, 0x09, 0x05, // 75:337 54 | 0x01, 0x5A, 0x07, 0x04, // 76:346 55 | 0x01, 0x61, 0x0B, 0x07, // 77:353 56 | 0x01, 0x6C, 0x09, 0x06, // 78:364 57 | 0x01, 0x75, 0x0B, 0x06, // 79:373 58 | 0x01, 0x80, 0x09, 0x05, // 80:384 59 | 0x01, 0x89, 0x0B, 0x06, // 81:393 60 | 0x01, 0x94, 0x0B, 0x06, // 82:404 61 | 0x01, 0x9F, 0x09, 0x05, // 83:415 62 | 0x01, 0xA8, 0x09, 0x05, // 84:424 63 | 0x01, 0xB1, 0x09, 0x06, // 85:433 64 | 0x01, 0xBA, 0x09, 0x05, // 86:442 65 | 0x01, 0xC3, 0x0D, 0x08, // 87:451 66 | 0x01, 0xD0, 0x09, 0x05, // 88:464 67 | 0x01, 0xD9, 0x09, 0x05, // 89:473 68 | 0x01, 0xE2, 0x09, 0x05, // 90:482 69 | 0x01, 0xEB, 0x06, 0x03, // 91:491 70 | 0x01, 0xF1, 0x06, 0x03, // 92:497 71 | 0x01, 0xF7, 0x06, 0x03, // 93:503 72 | 0x01, 0xFD, 0x09, 0x07, // 94:509 73 | 0x02, 0x06, 0x08, 0x04, // 95:518 74 | 0x02, 0x0E, 0x03, 0x04, // 96:526 75 | 0x02, 0x11, 0x09, 0x05, // 97:529 76 | 0x02, 0x1A, 0x09, 0x05, // 98:538 77 | 0x02, 0x23, 0x07, 0x04, // 99:547 78 | 0x02, 0x2A, 0x09, 0x05, // 100:554 79 | 0x02, 0x33, 0x09, 0x05, // 101:563 80 | 0x02, 0x3C, 0x05, 0x03, // 102:572 81 | 0x02, 0x41, 0x0A, 0x05, // 103:577 82 | 0x02, 0x4B, 0x09, 0x05, // 104:587 83 | 0x02, 0x54, 0x03, 0x02, // 105:596 84 | 0x02, 0x57, 0x04, 0x02, // 106:599 85 | 0x02, 0x5B, 0x07, 0x05, // 107:603 86 | 0x02, 0x62, 0x03, 0x02, // 108:610 87 | 0x02, 0x65, 0x0F, 0x08, // 109:613 88 | 0x02, 0x74, 0x09, 0x05, // 110:628 89 | 0x02, 0x7D, 0x09, 0x05, // 111:637 90 | 0x02, 0x86, 0x09, 0x05, // 112:646 91 | 0x02, 0x8F, 0x0A, 0x05, // 113:655 92 | 0x02, 0x99, 0x05, 0x03, // 114:665 93 | 0x02, 0x9E, 0x07, 0x04, // 115:670 94 | 0x02, 0xA5, 0x05, 0x03, // 116:677 95 | 0x02, 0xAA, 0x09, 0x05, // 117:682 96 | 0x02, 0xB3, 0x07, 0x05, // 118:691 97 | 0x02, 0xBA, 0x0B, 0x07, // 119:698 98 | 0x02, 0xC5, 0x07, 0x05, // 120:709 99 | 0x02, 0xCC, 0x09, 0x05, // 121:716 100 | 0x02, 0xD5, 0x07, 0x04, // 122:725 101 | 0x02, 0xDC, 0x08, 0x05, // 123:732 102 | 0x02, 0xE4, 0x04, 0x03, // 124:740 103 | 0x02, 0xE8, 0x07, 0x05, // 125:744 104 | 0x02, 0xEF, 0x0B, 0x07, // 126:751 105 | 0x02, 0xFA, 0x08, 0x05, // 127:762 106 | 0x03, 0x02, 0x08, 0x05, // 128:770 107 | 0x03, 0x0A, 0x08, 0x05, // 129:778 108 | 0x03, 0x12, 0x08, 0x05, // 130:786 109 | 0x03, 0x1A, 0x08, 0x05, // 131:794 110 | 0x03, 0x22, 0x08, 0x05, // 132:802 111 | 0x03, 0x2A, 0x08, 0x05, // 133:810 112 | 0x03, 0x32, 0x08, 0x05, // 134:818 113 | 0x03, 0x3A, 0x08, 0x05, // 135:826 114 | 0x03, 0x42, 0x08, 0x05, // 136:834 115 | 0x03, 0x4A, 0x08, 0x05, // 137:842 116 | 0x03, 0x52, 0x08, 0x05, // 138:850 117 | 0x03, 0x5A, 0x08, 0x05, // 139:858 118 | 0x03, 0x62, 0x08, 0x05, // 140:866 119 | 0x03, 0x6A, 0x08, 0x05, // 141:874 120 | 0x03, 0x72, 0x08, 0x05, // 142:882 121 | 0x03, 0x7A, 0x08, 0x05, // 143:890 122 | 0x03, 0x82, 0x08, 0x05, // 144:898 123 | 0x03, 0x8A, 0x08, 0x05, // 145:906 124 | 0x03, 0x92, 0x08, 0x05, // 146:914 125 | 0x03, 0x9A, 0x08, 0x05, // 147:922 126 | 0x03, 0xA2, 0x08, 0x05, // 148:930 127 | 0x03, 0xAA, 0x08, 0x05, // 149:938 128 | 0x03, 0xB2, 0x08, 0x05, // 150:946 129 | 0x03, 0xBA, 0x08, 0x05, // 151:954 130 | 0x03, 0xC2, 0x08, 0x05, // 152:962 131 | 0x03, 0xCA, 0x08, 0x05, // 153:970 132 | 0x03, 0xD2, 0x08, 0x05, // 154:978 133 | 0x03, 0xDA, 0x08, 0x05, // 155:986 134 | 0x03, 0xE2, 0x08, 0x05, // 156:994 135 | 0x03, 0xEA, 0x08, 0x05, // 157:1002 136 | 0x03, 0xF2, 0x08, 0x05, // 158:1010 137 | 0x03, 0xFA, 0x08, 0x05, // 159:1018 138 | 0xFF, 0xFF, 0x00, 0x03, // 160:65535 139 | 0x04, 0x02, 0x04, 0x03, // 161:1026 140 | 0x04, 0x06, 0x07, 0x05, // 162:1030 141 | 0x04, 0x0D, 0x07, 0x05, // 163:1037 142 | 0x04, 0x14, 0x09, 0x05, // 164:1044 143 | 0x04, 0x1D, 0x09, 0x05, // 165:1053 144 | 0x04, 0x26, 0x04, 0x03, // 166:1062 145 | 0x04, 0x2A, 0x08, 0x04, // 167:1066 146 | 0x04, 0x32, 0x07, 0x04, // 168:1074 147 | 0x04, 0x39, 0x0D, 0x08, // 169:1081 148 | 0x04, 0x46, 0x07, 0x04, // 170:1094 149 | 0x04, 0x4D, 0x09, 0x05, // 171:1101 150 | 0x04, 0x56, 0x0B, 0x07, // 172:1110 151 | 0x04, 0x61, 0x05, 0x03, // 173:1121 152 | 0x04, 0x66, 0x0D, 0x08, // 174:1126 153 | 0x04, 0x73, 0x05, 0x04, // 175:1139 154 | 0x04, 0x78, 0x05, 0x04, // 176:1144 155 | 0x04, 0x7D, 0x0B, 0x07, // 177:1149 156 | 0x04, 0x88, 0x05, 0x03, // 178:1160 157 | 0x04, 0x8D, 0x05, 0x03, // 179:1165 158 | 0x04, 0x92, 0x03, 0x04, // 180:1170 159 | 0x04, 0x95, 0x09, 0x05, // 181:1173 160 | 0x04, 0x9E, 0x0A, 0x05, // 182:1182 161 | 0x04, 0xA8, 0x03, 0x03, // 183:1192 162 | 0x04, 0xAB, 0x06, 0x04, // 184:1195 163 | 0x04, 0xB1, 0x05, 0x03, // 185:1201 164 | 0x04, 0xB6, 0x07, 0x04, // 186:1206 165 | 0x04, 0xBD, 0x09, 0x05, // 187:1213 166 | 0x04, 0xC6, 0x0F, 0x08, // 188:1222 167 | 0x04, 0xD5, 0x0F, 0x08, // 189:1237 168 | 0x04, 0xE4, 0x0F, 0x08, // 190:1252 169 | 0x04, 0xF3, 0x08, 0x04, // 191:1267 170 | 0x04, 0xFB, 0x09, 0x05, // 192:1275 171 | 0x05, 0x04, 0x09, 0x05, // 193:1284 172 | 0x05, 0x0D, 0x09, 0x05, // 194:1293 173 | 0x05, 0x16, 0x09, 0x05, // 195:1302 174 | 0x05, 0x1F, 0x09, 0x05, // 196:1311 175 | 0x05, 0x28, 0x09, 0x05, // 197:1320 176 | 0x05, 0x31, 0x0D, 0x08, // 198:1329 177 | 0x05, 0x3E, 0x0B, 0x06, // 199:1342 178 | 0x05, 0x49, 0x09, 0x05, // 200:1353 179 | 0x05, 0x52, 0x09, 0x05, // 201:1362 180 | 0x05, 0x5B, 0x09, 0x05, // 202:1371 181 | 0x05, 0x64, 0x09, 0x05, // 203:1380 182 | 0x05, 0x6D, 0x03, 0x02, // 204:1389 183 | 0x05, 0x70, 0x03, 0x02, // 205:1392 184 | 0x05, 0x73, 0x03, 0x02, // 206:1395 185 | 0x05, 0x76, 0x03, 0x02, // 207:1398 186 | 0x05, 0x79, 0x0B, 0x06, // 208:1401 187 | 0x05, 0x84, 0x09, 0x06, // 209:1412 188 | 0x05, 0x8D, 0x0B, 0x06, // 210:1421 189 | 0x05, 0x98, 0x0B, 0x06, // 211:1432 190 | 0x05, 0xA3, 0x0B, 0x06, // 212:1443 191 | 0x05, 0xAE, 0x0B, 0x06, // 213:1454 192 | 0x05, 0xB9, 0x0B, 0x06, // 214:1465 193 | 0x05, 0xC4, 0x0B, 0x07, // 215:1476 194 | 0x05, 0xCF, 0x0B, 0x06, // 216:1487 195 | 0x05, 0xDA, 0x09, 0x06, // 217:1498 196 | 0x05, 0xE3, 0x09, 0x06, // 218:1507 197 | 0x05, 0xEC, 0x09, 0x06, // 219:1516 198 | 0x05, 0xF5, 0x09, 0x06, // 220:1525 199 | 0x05, 0xFE, 0x09, 0x05, // 221:1534 200 | 0x06, 0x07, 0x09, 0x05, // 222:1543 201 | 0x06, 0x10, 0x09, 0x05, // 223:1552 202 | 0x06, 0x19, 0x09, 0x05, // 224:1561 203 | 0x06, 0x22, 0x09, 0x05, // 225:1570 204 | 0x06, 0x2B, 0x09, 0x05, // 226:1579 205 | 0x06, 0x34, 0x09, 0x05, // 227:1588 206 | 0x06, 0x3D, 0x09, 0x05, // 228:1597 207 | 0x06, 0x46, 0x09, 0x05, // 229:1606 208 | 0x06, 0x4F, 0x0F, 0x08, // 230:1615 209 | 0x06, 0x5E, 0x08, 0x04, // 231:1630 210 | 0x06, 0x66, 0x09, 0x05, // 232:1638 211 | 0x06, 0x6F, 0x09, 0x05, // 233:1647 212 | 0x06, 0x78, 0x09, 0x05, // 234:1656 213 | 0x06, 0x81, 0x09, 0x05, // 235:1665 214 | 0x06, 0x8A, 0x03, 0x02, // 236:1674 215 | 0x06, 0x8D, 0x03, 0x02, // 237:1677 216 | 0x06, 0x90, 0x03, 0x02, // 238:1680 217 | 0x06, 0x93, 0x03, 0x02, // 239:1683 218 | 0x06, 0x96, 0x09, 0x05, // 240:1686 219 | 0x06, 0x9F, 0x09, 0x05, // 241:1695 220 | 0x06, 0xA8, 0x09, 0x05, // 242:1704 221 | 0x06, 0xB1, 0x09, 0x05, // 243:1713 222 | 0x06, 0xBA, 0x09, 0x05, // 244:1722 223 | 0x06, 0xC3, 0x09, 0x05, // 245:1731 224 | 0x06, 0xCC, 0x09, 0x05, // 246:1740 225 | 0x06, 0xD5, 0x0B, 0x07, // 247:1749 226 | 0x06, 0xE0, 0x09, 0x05, // 248:1760 227 | 0x06, 0xE9, 0x09, 0x05, // 249:1769 228 | 0x06, 0xF2, 0x09, 0x05, // 250:1778 229 | 0x06, 0xFB, 0x09, 0x05, // 251:1787 230 | 0x07, 0x04, 0x09, 0x05, // 252:1796 231 | 0x07, 0x0D, 0x09, 0x05, // 253:1805 232 | 0x07, 0x16, 0x09, 0x05, // 254:1814 233 | 0x07, 0x1F, 0x09, 0x05, // 255:1823 234 | 235 | // Font Data: 236 | 0x00,0x00,0xBC, // 33 237 | 0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 34 238 | 0x00,0x00,0xA8,0x00,0x7C,0x00,0xEA,0x00,0x3E,0x00,0x28, // 35 239 | 0x00,0x00,0x98,0x00,0xA8,0x00,0xFC,0x01,0xA8, // 36 240 | 0x00,0x00,0x1C,0x00,0x14,0x00,0xDC,0x00,0x30,0x00,0xEC,0x00,0xA0,0x00,0xE0, // 37 241 | 0x00,0x00,0x60,0x00,0xBC,0x00,0xF4,0x00,0xC4,0x00,0xA0, // 38 242 | 0x00,0x00,0x0C, // 39 243 | 0x00,0x00,0x7C,0x00,0x82, // 40 244 | 0x00,0x00,0x82,0x00,0x7C, // 41 245 | 0x24,0x00,0x18,0x00,0x3C,0x00,0x18, // 42 246 | 0x00,0x00,0x20,0x00,0x20,0x00,0xF8,0x00,0x20,0x00,0x20, // 43 247 | 0x00,0x00,0x80,0x01, // 44 248 | 0x00,0x00,0x20,0x00,0x20, // 45 249 | 0x00,0x00,0x80, // 46 250 | 0x80,0x01,0x70,0x00,0x0C, // 47 251 | 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x78, // 48 252 | 0x00,0x00,0x84,0x00,0xFC,0x00,0x80, // 49 253 | 0x00,0x00,0x84,0x00,0xC4,0x00,0xA4,0x00,0x98, // 50 254 | 0x00,0x00,0x84,0x00,0xA4,0x00,0xA4,0x00,0xD8, // 51 255 | 0x00,0x00,0x60,0x00,0x58,0x00,0xFC,0x00,0x40, // 52 256 | 0x00,0x00,0x9C,0x00,0x94,0x00,0x94,0x00,0x64, // 53 257 | 0x00,0x00,0x78,0x00,0xAC,0x00,0xA4,0x00,0xE4, // 54 258 | 0x00,0x00,0x04,0x00,0x84,0x00,0x74,0x00,0x0C, // 55 259 | 0x00,0x00,0xD8,0x00,0xA4,0x00,0xA4,0x00,0xD8, // 56 260 | 0x00,0x00,0x9C,0x00,0x94,0x00,0xD4,0x00,0x78, // 57 261 | 0x00,0x00,0x90, // 58 262 | 0x00,0x00,0x90,0x01, // 59 263 | 0x00,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x48, // 60 264 | 0x00,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50, // 61 265 | 0x00,0x00,0x48,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x20, // 62 266 | 0x00,0x00,0x04,0x00,0xB4,0x00,0x0C, // 63 267 | 0x00,0x00,0x70,0x00,0x88,0x00,0x74,0x01,0x54,0x01,0x74,0x01,0x4C,0x00,0x38, // 64 268 | 0x80,0x00,0x70,0x00,0x4C,0x00,0x70,0x00,0x80, // 65 269 | 0x00,0x00,0xFC,0x00,0xA4,0x00,0xA4,0x00,0xDC, // 66 270 | 0x00,0x00,0x78,0x00,0xCC,0x00,0x84,0x00,0x84,0x00,0x88, // 67 271 | 0x00,0x00,0xFC,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x78, // 68 272 | 0x00,0x00,0xFC,0x00,0xA4,0x00,0xA4,0x00,0xA4, // 69 273 | 0x00,0x00,0xFC,0x00,0x24,0x00,0x24, // 70 274 | 0x00,0x00,0x78,0x00,0x8C,0x00,0x84,0x00,0x94,0x00,0x78, // 71 275 | 0x00,0x00,0xFC,0x00,0x20,0x00,0x20,0x00,0xFC, // 72 276 | 0x00,0x00,0xFC, // 73 277 | 0x00,0x02,0xFC,0x03, // 74 278 | 0x00,0x00,0xFC,0x00,0x30,0x00,0x68,0x00,0xC4, // 75 279 | 0x00,0x00,0xFC,0x00,0x80,0x00,0x80, // 76 280 | 0x00,0x00,0xFC,0x00,0x1C,0x00,0x70,0x00,0x1C,0x00,0xFC, // 77 281 | 0x00,0x00,0xFC,0x00,0x18,0x00,0x60,0x00,0xFC, // 78 282 | 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x78, // 79 283 | 0x00,0x00,0xFC,0x00,0x14,0x00,0x14,0x00,0x1C, // 80 284 | 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x84,0x01,0x78, // 81 285 | 0x00,0x00,0xFC,0x00,0x14,0x00,0x34,0x00,0x6C,0x00,0x80, // 82 286 | 0x00,0x00,0x98,0x00,0x94,0x00,0xB4,0x00,0xE4, // 83 287 | 0x04,0x00,0x04,0x00,0xFC,0x00,0x04,0x00,0x04, // 84 288 | 0x00,0x00,0x7C,0x00,0x80,0x00,0x80,0x00,0x7C, // 85 289 | 0x04,0x00,0x38,0x00,0xC0,0x00,0x38,0x00,0x04, // 86 290 | 0x0C,0x00,0xF0,0x00,0x78,0x00,0x04,0x00,0x78,0x00,0xF0,0x00,0x0C, // 87 291 | 0x84,0x00,0x4C,0x00,0x30,0x00,0x4C,0x00,0x84, // 88 292 | 0x04,0x00,0x0C,0x00,0xF0,0x00,0x0C,0x00,0x04, // 89 293 | 0x00,0x00,0x84,0x00,0xE4,0x00,0xB4,0x00,0x8C, // 90 294 | 0x00,0x00,0xFC,0x01,0x04,0x01, // 91 295 | 0x0C,0x00,0x70,0x00,0x80,0x01, // 92 296 | 0x00,0x00,0x04,0x01,0xFC,0x01, // 93 297 | 0x00,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x08, // 94 298 | 0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 95 299 | 0x00,0x00,0x04, // 96 300 | 0x00,0x00,0xE0,0x00,0xB0,0x00,0xB0,0x00,0xF0, // 97 301 | 0x00,0x00,0xFE,0x00,0x90,0x00,0x90,0x00,0x60, // 98 302 | 0x00,0x00,0x60,0x00,0x90,0x00,0x90, // 99 303 | 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0xFE, // 100 304 | 0x00,0x00,0x60,0x00,0xB0,0x00,0xB0,0x00,0xB0, // 101 305 | 0x10,0x00,0xFE,0x00,0x12, // 102 306 | 0x00,0x00,0x60,0x00,0x90,0x02,0x90,0x02,0xF0,0x01, // 103 307 | 0x00,0x00,0xFE,0x00,0x10,0x00,0x10,0x00,0xF0, // 104 308 | 0x00,0x00,0xF4, // 105 309 | 0x00,0x02,0xF4,0x03, // 106 310 | 0x00,0x00,0xFE,0x00,0x60,0x00,0x90, // 107 311 | 0x00,0x00,0xFE, // 108 312 | 0x00,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0, // 109 313 | 0x00,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0, // 110 314 | 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0x60, // 111 315 | 0x00,0x00,0xF0,0x03,0x90,0x00,0x90,0x00,0x60, // 112 316 | 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0xF0,0x03, // 113 317 | 0x00,0x00,0xF0,0x00,0x10, // 114 318 | 0x00,0x00,0xB0,0x00,0xB0,0x00,0xD0, // 115 319 | 0x10,0x00,0xF8,0x00,0x90, // 116 320 | 0x00,0x00,0xF0,0x00,0x80,0x00,0x80,0x00,0xF0, // 117 321 | 0x10,0x00,0xE0,0x00,0xE0,0x00,0x10, // 118 322 | 0x30,0x00,0xC0,0x00,0x30,0x00,0x30,0x00,0xC0,0x00,0x30, // 119 323 | 0x90,0x00,0xF0,0x00,0xF0,0x00,0x90, // 120 324 | 0x00,0x00,0x10,0x02,0xE0,0x03,0x60,0x00,0x10, // 121 325 | 0x00,0x00,0x90,0x00,0xD0,0x00,0xF0, // 122 326 | 0x00,0x00,0x20,0x00,0xDC,0x01,0x04,0x01, // 123 327 | 0x00,0x00,0xFC,0x03, // 124 328 | 0x00,0x00,0x04,0x01,0xDC,0x01,0x20, // 125 329 | 0x00,0x00,0x20,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x40, // 126 330 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 127 331 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 128 332 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 129 333 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 130 334 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 131 335 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 132 336 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 133 337 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 134 338 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 135 339 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 136 340 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 137 341 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 138 342 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 139 343 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 140 344 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 141 345 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 142 346 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 143 347 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 144 348 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 145 349 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 146 350 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 147 351 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 148 352 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 149 353 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 150 354 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 151 355 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 152 356 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 153 357 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 154 358 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 155 359 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 156 360 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 157 361 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 158 362 | 0xFC,0x01,0x04,0x01,0x04,0x01,0xFC,0x01, // 159 363 | 0x00,0x00,0xD0,0x03, // 161 364 | 0x00,0x00,0xF0,0x00,0xF8,0x01,0x90, // 162 365 | 0xA0,0x00,0xFC,0x00,0xA4,0x00,0xA4, // 163 366 | 0x88,0x00,0x70,0x00,0x50,0x00,0x70,0x00,0x88, // 164 367 | 0x54,0x00,0x58,0x00,0xE0,0x00,0x58,0x00,0x54, // 165 368 | 0x00,0x00,0xDC,0x01, // 166 369 | 0x00,0x00,0x3C,0x01,0x54,0x01,0xE4,0x01, // 167 370 | 0x00,0x00,0x04,0x00,0x00,0x00,0x04, // 168 371 | 0x00,0x00,0x78,0x00,0xCC,0x00,0xB4,0x00,0xB4,0x00,0xCC,0x00,0x78, // 169 372 | 0x00,0x00,0x58,0x00,0x5C,0x00,0x5C, // 170 373 | 0x00,0x00,0x60,0x00,0xF0,0x00,0x60,0x00,0xF0, // 171 374 | 0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x60, // 172 375 | 0x00,0x00,0x20,0x00,0x20, // 173 376 | 0x00,0x00,0x78,0x00,0xCC,0x00,0xB4,0x00,0xB4,0x00,0xCC,0x00,0x78, // 174 377 | 0x00,0x00,0x04,0x00,0x04, // 175 378 | 0x00,0x00,0x0C,0x00,0x0C, // 176 379 | 0x00,0x00,0x90,0x00,0x90,0x00,0xFC,0x00,0x90,0x00,0x90, // 177 380 | 0x00,0x00,0x14,0x00,0x1C, // 178 381 | 0x00,0x00,0x1C,0x00,0x14, // 179 382 | 0x00,0x00,0x04, // 180 383 | 0x00,0x00,0xF0,0x03,0x80,0x00,0x80,0x00,0xF0, // 181 384 | 0x00,0x00,0x3C,0x00,0xFC,0x01,0x04,0x00,0xFC,0x01, // 182 385 | 0x00,0x00,0x20, // 183 386 | 0x00,0x00,0x00,0x02,0x00,0x03, // 184 387 | 0x00,0x00,0x14,0x00,0x1C, // 185 388 | 0x00,0x00,0x5C,0x00,0x54,0x00,0x5C, // 186 389 | 0x00,0x00,0xF0,0x00,0x60,0x00,0xF0,0x00,0x60, // 187 390 | 0x00,0x00,0x14,0x00,0x9C,0x00,0x70,0x00,0x18,0x00,0x04,0x00,0xC0,0x00,0xE0, // 188 391 | 0x00,0x00,0x14,0x00,0x9C,0x00,0x70,0x00,0x18,0x00,0x04,0x00,0xA0,0x00,0xE0, // 189 392 | 0x00,0x00,0x1C,0x00,0x94,0x00,0x60,0x00,0x18,0x00,0x04,0x00,0xC0,0x00,0xE0, // 190 393 | 0x00,0x00,0x00,0x03,0xD0,0x02,0x00,0x02, // 191 394 | 0x80,0x00,0x70,0x00,0x4E,0x00,0x72,0x00,0x80, // 192 395 | 0x80,0x00,0x70,0x00,0x4E,0x00,0x72,0x00,0x80, // 193 396 | 0x80,0x00,0x70,0x00,0x4C,0x00,0x70,0x00,0x80, // 194 397 | 0x80,0x00,0x72,0x00,0x4E,0x00,0x72,0x00,0x80, // 195 398 | 0x80,0x00,0x72,0x00,0x4C,0x00,0x72,0x00,0x80, // 196 399 | 0x80,0x00,0x60,0x00,0x5F,0x00,0x60,0x00,0x80, // 197 400 | 0x80,0x00,0x70,0x00,0x4C,0x00,0xFC,0x00,0xA4,0x00,0xA4,0x00,0xA4, // 198 401 | 0x00,0x00,0x78,0x00,0xCC,0x02,0x84,0x03,0x84,0x00,0x88, // 199 402 | 0x00,0x00,0xFC,0x00,0xA6,0x00,0xA6,0x00,0xA4, // 200 403 | 0x00,0x00,0xFC,0x00,0xA6,0x00,0xA6,0x00,0xA4, // 201 404 | 0x00,0x00,0xFC,0x00,0xA6,0x00,0xA6,0x00,0xA4, // 202 405 | 0x00,0x00,0xFC,0x00,0xA6,0x00,0xA4,0x00,0xA6, // 203 406 | 0x02,0x00,0xFE, // 204 407 | 0x02,0x00,0xFE, // 205 408 | 0x02,0x00,0xFE, // 206 409 | 0x02,0x00,0xFC, // 207 410 | 0x20,0x00,0xFC,0x00,0xA4,0x00,0x84,0x00,0xCC,0x00,0x78, // 208 411 | 0x00,0x00,0xFC,0x00,0x1A,0x00,0x62,0x00,0xFC, // 209 412 | 0x00,0x00,0x78,0x00,0x86,0x00,0x86,0x00,0x84,0x00,0x78, // 210 413 | 0x00,0x00,0x78,0x00,0x86,0x00,0x86,0x00,0x84,0x00,0x78, // 211 414 | 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x78, // 212 415 | 0x00,0x00,0x78,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x78, // 213 416 | 0x00,0x00,0x78,0x00,0x86,0x00,0x84,0x00,0x86,0x00,0x78, // 214 417 | 0x00,0x00,0x88,0x00,0x50,0x00,0x20,0x00,0x50,0x00,0x88, // 215 418 | 0x00,0x00,0xB8,0x00,0xE4,0x00,0x94,0x00,0x8C,0x00,0x74, // 216 419 | 0x00,0x00,0x7C,0x00,0x82,0x00,0x82,0x00,0x7C, // 217 420 | 0x00,0x00,0x7C,0x00,0x82,0x00,0x82,0x00,0x7C, // 218 421 | 0x00,0x00,0x7C,0x00,0x82,0x00,0x82,0x00,0x7C, // 219 422 | 0x00,0x00,0x7E,0x00,0x80,0x00,0x80,0x00,0x7E, // 220 423 | 0x04,0x00,0x0E,0x00,0xF2,0x00,0x0C,0x00,0x04, // 221 424 | 0x00,0x00,0xFC,0x00,0x28,0x00,0x28,0x00,0x38, // 222 425 | 0x00,0x00,0xFC,0x00,0x02,0x00,0x9A,0x00,0xE4, // 223 426 | 0x00,0x00,0xE4,0x00,0xB0,0x00,0xB0,0x00,0xF0, // 224 427 | 0x00,0x00,0xE4,0x00,0xB0,0x00,0xB0,0x00,0xF0, // 225 428 | 0x00,0x00,0xE0,0x00,0xB4,0x00,0xB4,0x00,0xF0, // 226 429 | 0x00,0x00,0xE0,0x00,0xBC,0x00,0xBC,0x00,0xF0, // 227 430 | 0x00,0x00,0xE0,0x00,0xB4,0x00,0xB4,0x00,0xF0, // 228 431 | 0x00,0x00,0xE0,0x00,0xB6,0x00,0xB6,0x00,0xF0, // 229 432 | 0x00,0x00,0xE0,0x00,0xB0,0x00,0xB0,0x00,0x60,0x00,0xB0,0x00,0xB0,0x00,0xB0, // 230 433 | 0x00,0x00,0x60,0x00,0x90,0x02,0x90,0x03, // 231 434 | 0x00,0x00,0x60,0x00,0xB4,0x00,0xB0,0x00,0xB0, // 232 435 | 0x00,0x00,0x60,0x00,0xB4,0x00,0xB0,0x00,0xB0, // 233 436 | 0x00,0x00,0x60,0x00,0xB4,0x00,0xB4,0x00,0xB0, // 234 437 | 0x00,0x00,0x60,0x00,0xB4,0x00,0xB0,0x00,0xB4, // 235 438 | 0x04,0x00,0xF0, // 236 439 | 0x04,0x00,0xF0, // 237 440 | 0x04,0x00,0xF4, // 238 441 | 0x04,0x00,0xF0, // 239 442 | 0x00,0x00,0x60,0x00,0x94,0x00,0x9C,0x00,0x70, // 240 443 | 0x00,0x00,0xFC,0x00,0x1C,0x00,0x1C,0x00,0xF0, // 241 444 | 0x00,0x00,0x64,0x00,0x90,0x00,0x90,0x00,0x60, // 242 445 | 0x00,0x00,0x64,0x00,0x90,0x00,0x90,0x00,0x60, // 243 446 | 0x00,0x00,0x60,0x00,0x94,0x00,0x94,0x00,0x60, // 244 447 | 0x00,0x00,0x60,0x00,0x9C,0x00,0x9C,0x00,0x60, // 245 448 | 0x00,0x00,0x64,0x00,0x90,0x00,0x90,0x00,0x64, // 246 449 | 0x00,0x00,0x20,0x00,0x20,0x00,0xA8,0x00,0x20,0x00,0x20, // 247 450 | 0x00,0x00,0xF0,0x00,0xD0,0x00,0xB0,0x00,0xF0, // 248 451 | 0x00,0x00,0xF4,0x00,0x80,0x00,0x80,0x00,0xF0, // 249 452 | 0x00,0x00,0xF4,0x00,0x80,0x00,0x80,0x00,0xF0, // 250 453 | 0x00,0x00,0xF0,0x00,0x84,0x00,0x84,0x00,0xF0, // 251 454 | 0x00,0x00,0xF0,0x00,0x84,0x00,0x84,0x00,0xF0, // 252 455 | 0x00,0x00,0x14,0x02,0xE0,0x03,0x60,0x00,0x10, // 253 456 | 0x00,0x00,0xFE,0x03,0x90,0x00,0x90,0x00,0x60, // 254 457 | 0x00,0x00,0x14,0x02,0xE0,0x03,0x64,0x00,0x10 // 255 458 | }; 459 | --------------------------------------------------------------------------------