gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 1424fafd87ad4691f7552d8e0bdbfb5575f56efe
parent 6ffa78ed7eb94b3b93a9eccba8ee76b56c3f277d
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon,  5 Aug 2024 20:09:43 +0200

move 2*20 LCD sim to hardware lib

Diffstat:
Msource/hardwareLib/CMakeLists.txt | 2++
Asource/hardwareLib/lcd.cpp | 218+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/hardwareLib/lcd.h | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/hardwareLib/lcdfonts.cpp | 2675+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/hardwareLib/lcdfonts.h | 8++++++++
Msource/mqJucePlugin/mqLcd.cpp | 8+++-----
Msource/mqLib/lcd.cpp | 2+-
Msource/mqLib/lcd.h | 4++--
Msource/wLib/CMakeLists.txt | 2--
Dsource/wLib/lcd.cpp | 218-------------------------------------------------------------------------------
Dsource/wLib/lcd.h | 88-------------------------------------------------------------------------------
Dsource/wLib/lcdfonts.cpp | 2675-------------------------------------------------------------------------------
Dsource/wLib/lcdfonts.h | 8--------
Msource/xtJucePlugin/xtLcd.cpp | 4++--
14 files changed, 3002 insertions(+), 3001 deletions(-)

diff --git a/source/hardwareLib/CMakeLists.txt b/source/hardwareLib/CMakeLists.txt @@ -9,6 +9,8 @@ set(SOURCES haltDSP.cpp haltDSP.h i2c.cpp i2c.h i2cFlash.cpp i2cFlash.h + lcd.cpp lcd.h + lcdfonts.cpp lcdfonts.h sciMidi.cpp sciMidi.h syncUCtoDSP.h ) diff --git a/source/hardwareLib/lcd.cpp b/source/hardwareLib/lcd.cpp @@ -0,0 +1,218 @@ +#include "lcd.h" + +#include <cassert> + +#include "mc68k/logging.h" + +#define LOG MCLOG + +namespace hwLib +{ + LCD::LCD() = default; + + std::optional<uint8_t> LCD::exec(bool registerSelect, bool read, uint8_t g) + { + bool changed = false; + bool cgRamChanged = false; + + std::optional<uint8_t> result; + + if(!read) + { + if(!registerSelect) + { + if(g == 0x01) + { + LOG("LCD Clear Display"); + m_dramData.fill(' '); + changed = true; + } + else if(g == 0x02) + { + LOG("LCD Return Home"); + m_dramAddr = 0; + m_cursorPos = 0; + } + else if((g & 0xfc) == 0x04) + { + const int increment = (g >> 1) & 1; + const int shift = g & 1; + LOG("LCD Entry Mode Set, inc=" << increment << ", shift=" << shift); + + m_addrIncrement = increment ? 1 : -1; + } + else if((g & 0xf8) == 0x08) + { + const int displayOnOff = (g >> 2) & 1; + const int cursorOnOff = (g >> 1) & 1; + const int cursorBlinking = g & 1; + + LOG("LCD Display ON/OFF, display=" << displayOnOff << ", cursor=" << cursorOnOff << ", blinking=" << cursorBlinking); + + m_displayOn = displayOnOff != 0; + m_cursorOn = cursorOnOff != 0; + m_cursorBlinking = cursorBlinking != 0; + } + else if((g & 0xf3) == 0x10) + { + const int scrl = (g >> 2) & 3; + + LOG("LCD Cursor/Display Shift, scrl=" << scrl); + m_cursorShift = static_cast<CursorShiftMode>(scrl); + } + else if((g & 0xec) == 0x28) + { + const int dl = (g >> 4) & 1; + const int ft = g & 3; + + LOG("LCD Function Set, dl=" << dl << ", ft=" << ft); + m_dataLength = static_cast<DataLength>(dl); + m_fontTable = static_cast<FontTable>(ft); + } + else if(g & (1<<7)) + { + const int addr = g & 0x7f; +// LOG("LCD Set DDRAM address, addr=" << addr); + m_dramAddr = addr; + m_addressMode = AddressMode::DDRam; + } + else if(g & (1<<6)) + { + const int acg = g & 0x3f; + +// LOG("LCD Set CGRAM address, acg=" << acg); + m_cgramAddr = acg; + m_addressMode = AddressMode::CGRam; + } + else + { + LOG("LCD unknown command"); + assert(false); + } + } + else + { + if(m_addressMode == AddressMode::CGRam) + { +// changed = true; +// LOG("LCD write data to CGRAM addr " << m_cgramAddr << ", data=" << static_cast<int>(g)); + + if (m_cgramData[m_cgramAddr] != g) + { + m_cgramData[m_cgramAddr] = g; + cgRamChanged = true; + } + + m_cgramAddr += m_addrIncrement; + + /* + if((m_cgramAddr & 0x7) == 0) + { + std::stringstream ss; + ss << "CG RAM character " << (m_cgramAddr/8 - 1) << ':' << '\n'; + ss << "##################" << '\n'; + for(auto i = m_cgramAddr - 8; i < m_cgramAddr - 1; ++i) + { + ss << '#'; + for(int x=7; x >= 0; --x) + { + if(m_cgramData[i] & (1<<x)) + ss << "[]"; + else + ss << " "; + } + ss << '#' << '\n'; + } + ss << "##################" << '\n'; + const auto s(ss.str()); + LOG(s); + } + */ + } + else + { +// LOG("LCD write data to DDRAM addr " << m_dramAddr << ", data=" << static_cast<int>(g) << ", char=" << static_cast<char>(g)); + + const auto old = m_dramData; + + if(m_dramAddr >= 20 && m_dramAddr < 0x40) + { + for(size_t i=1; i<=20; ++i) + m_dramData[i-1] = m_dramData[i]; + m_dramData[19] = static_cast<char>(g); + } + else if(m_dramAddr > 0x53) + { + for(size_t i=21; i<=40; ++i) + m_dramData[i-1] = m_dramData[i]; + + m_dramData[39] = static_cast<char>(g); + } + else + { + if(m_dramAddr < 20) + m_dramData[m_dramAddr] = static_cast<char>(g); + else + m_dramData[m_dramAddr - 0x40 + 20] = static_cast<char>(g); + } + + if(m_dramAddr != 20 && m_dramAddr != 0x54) + m_dramAddr += m_addrIncrement; + + if(m_dramData != old) + changed = true; + } + } + } + else + { + if(registerSelect) + { + LOG("LCD read data from CGRAM or DDRAM"); + if(m_addressMode == AddressMode::CGRam) + result = m_cgramData[m_cgramAddr]; + else + result = m_dramData[m_dramAddr]; + } + else + { + LOG("LCD read busy flag & address"); + if(m_addressMode == AddressMode::CGRam) + { + result = static_cast<uint8_t>(m_cgramAddr); + } + else + { + auto a = m_dramAddr; + if(a > 0x53) + a = 0x53; + if(a == 20) + a = 19; + result = static_cast<uint8_t>(m_dramAddr); + } + } + } + + if(changed && m_changeCallback) + m_changeCallback(); + + if(cgRamChanged && m_cgRamChangeCallback) + m_cgRamChangeCallback(); + + return result; + } + + bool LCD::getCgData(std::array<uint8_t, 8>& _data, uint32_t _charIndex) const + { + const auto idx = _charIndex * 8; + if(idx + 8 >= getCgRam().size()) + return false; + + uint32_t j = 0; + + for(auto i = idx; i<idx+8; ++i) + _data[j++] = getCgRam()[i]; + + return true; + } +} diff --git a/source/hardwareLib/lcd.h b/source/hardwareLib/lcd.h @@ -0,0 +1,91 @@ +#pragma once + +#include <array> +#include <cstdint> +#include <functional> +#include <optional> + +namespace hwLib +{ + // 2*20 characters display simulation (20*2) + // EW20290GLW / NHD-0220DZW-AB5 and compatibles + + class LCD + { + public: + using ChangeCallback = std::function<void()>; + + LCD(); + std::optional<uint8_t> exec(bool registerSelect, bool read, uint8_t g); + + const std::array<char, 40>& getDdRam() const { return m_dramData; } + const auto& getCgRam() const { return m_cgramData; } + bool getCgData(std::array<uint8_t, 8>& _data, uint32_t _charIndex) const; + + void setChangeCallback(const ChangeCallback& _callback) + { + m_changeCallback = _callback; + } + + void setCgRamChangeCallback(const ChangeCallback& _callback) + { + m_cgRamChangeCallback = _callback; + } + private: + enum class CursorShiftMode + { + CursorLeft, + CursorRight, + DisplayLeft, + DisplayRight + }; + enum class DisplayShiftMode + { + Right, + Left + }; + enum class FontTable + { + EnglishJapanese, + WesternEuropean1, + EnglishRussian, + WesternEuropean2, + }; + enum class DataLength + { + Bit8, + Bit4 + }; + + enum class AddressMode + { + DDRam, + CGRam, + }; + + uint32_t m_lastWriteCounter = 0xffffffff; + + uint32_t m_cursorPos = 0; + uint32_t m_dramAddr = 0; + uint32_t m_cgramAddr = 0; + + CursorShiftMode m_cursorShift = CursorShiftMode::CursorLeft; + DisplayShiftMode m_displayShift = DisplayShiftMode::Left; + FontTable m_fontTable = FontTable::EnglishJapanese; + DataLength m_dataLength = DataLength::Bit8; + AddressMode m_addressMode = AddressMode::DDRam; + + bool m_displayOn = true; + bool m_cursorOn = false; + bool m_cursorBlinking = false; + + int m_addrIncrement = 1; + + std::array<uint8_t, 0x40> m_cgramData{}; + std::array<char, 40> m_dramData{}; + uint32_t m_lastOpState = 0; + + ChangeCallback m_changeCallback; + ChangeCallback m_cgRamChangeCallback; + }; +} diff --git a/source/hardwareLib/lcdfonts.cpp b/source/hardwareLib/lcdfonts.cpp @@ -0,0 +1,2675 @@ +#include <cstdint> +#include <cstddef> + +#include <array> + +namespace hwLib +{ + constexpr uint8_t g_fontTable0[] = + { + // CGRam Data, initially empty + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 0 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 1 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 2 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 3 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 4 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 5 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 6 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 7 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 8 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 9 + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 a + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 b + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 c + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 d + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 e + 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 f + + 0b00000, // 1 0 + 0b10001, + 0b01001, + 0b01110, + 0b10010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 1 + 0b11110, + 0b00010, + 0b00010, + 0b00010, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 2 + 0b00110, + 0b00010, + 0b00110, + 0b01010, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 3 + 0b11111, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 4 + 0b11111, + 0b00001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 5 + 0b00110, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 6 + 0b01110, + 0b00100, + 0b01000, + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 7 + 0b11111, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 8 + 0b10111, + 0b10101, + 0b10101, + 0b10001, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 9 + 0b00110, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 a + 0b01111, + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 b + 0b11110, + 0b00001, + 0b00001, + 0b00001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // 1 c + 0b11111, + 0b00001, + 0b00001, + 0b00001, + 0b00110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 d + 0b11111, + 0b10001, + 0b10001, + 0b10001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 e + 0b10110, + 0b01001, + 0b10001, + 0b10001, + 0b10111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 1 f + 0b00110, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 0 + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 2 1 ! + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // 2 2 " + 0b01010, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // 2 3 # + 0b01010, + 0b11111, + 0b01010, + 0b11111, + 0b01010, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 2 4 $ + 0b01111, + 0b10100, + 0b01110, + 0b00101, + 0b11110, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b11000, // 2 5 % + 0b11001, + 0b00010, + 0b00100, + 0b01000, + 0b10011, + 0b00011, + 0b00000, + 0b00000, + 0b00000, + + 0b01100, // 2 6 & + 0b10010, + 0b10100, + 0b01000, + 0b10101, + 0b10010, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + + 0b01100, // 2 7 ' + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 2 8 ( + 0b00100, + 0b01000, + 0b01000, + 0b01000, + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // 2 9 ) + 0b00100, + 0b00010, + 0b00010, + 0b00010, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 a * + 0b00100, + 0b10101, + 0b01110, + 0b10101, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 b + + 0b00100, + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 c , + 0b00000, + 0b00000, + 0b00000, + 0b01100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 d - + 0b00000, + 0b00000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 e . + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b01100, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 2 f / + 0b00001, + 0b00010, + 0b00100, + 0b01000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 3 0 0 + 0b10001, + 0b10011, + 0b10101, + 0b11001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 3 1 1 + 0b01100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 3 2 2 + 0b10001, + 0b00001, + 0b00010, + 0b00100, + 0b01000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 3 3 3 + 0b00010, + 0b00100, + 0b00010, + 0b00001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 3 4 4 + 0b00110, + 0b01010, + 0b10010, + 0b11111, + 0b00010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 3 5 5 + 0b10000, + 0b11110, + 0b00001, + 0b00001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00110, // 3 6 6 + 0b01000, + 0b10000, + 0b11110, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 3 7 7 + 0b00001, + 0b00010, + 0b00100, + 0b01000, + 0b01000, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 3 8 8 + 0b10001, + 0b10001, + 0b01110, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 3 9 9 + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 3 a : + 0b01100, + 0b01100, + 0b00000, + 0b01100, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 3 b ; + 0b01100, + 0b01100, + 0b00000, + 0b01100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 3 c < + 0b00100, + 0b01000, + 0b10000, + 0b01000, + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 3 d = + 0b00000, + 0b11111, + 0b00000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // 3 e > + 0b00100, + 0b00010, + 0b00001, + 0b00010, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 3 f ? + 0b10001, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 0 @ + 0b10001, + 0b00001, + 0b01101, + 0b10101, + 0b10101, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 1 A + 0b10001, + 0b10001, + 0b10001, + 0b11111, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b11110, // 4 2 B + 0b10001, + 0b10001, + 0b11110, + 0b10001, + 0b10001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 3 C + 0b10001, + 0b10000, + 0b10000, + 0b10000, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b11100, // 4 4 D + 0b10010, + 0b10001, + 0b10001, + 0b10001, + 0b10010, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 4 5 E + 0b10000, + 0b10000, + 0b11110, + 0b10000, + 0b10000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 4 6 F + 0b10000, + 0b10000, + 0b11110, + 0b10000, + 0b10000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 7 G + 0b10001, + 0b10000, + 0b10111, + 0b10001, + 0b10001, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 4 8 H + 0b10001, + 0b10001, + 0b11111, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 9 I + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00111, // 4 a J + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b10010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 4 b K + 0b10010, + 0b10100, + 0b11000, + 0b10100, + 0b10010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // 4 c L + 0b10000, + 0b10000, + 0b10000, + 0b10000, + 0b10000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 4 d M + 0b11011, + 0b10101, + 0b10101, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 4 e N + 0b10001, + 0b11001, + 0b10101, + 0b10011, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 4 f O + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b11110, // 5 0 P + 0b10001, + 0b10001, + 0b11110, + 0b10000, + 0b10000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 5 1 Q + 0b10001, + 0b10001, + 0b10001, + 0b10101, + 0b10010, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + + 0b11110, // 5 2 R + 0b10001, + 0b10001, + 0b11110, + 0b10100, + 0b10010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b01111, // 5 3 S + 0b10000, + 0b10000, + 0b01110, + 0b00001, + 0b00001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 5 4 T + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 5 5 U + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 5 6 V + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b01010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b10101, // 5 7 W + 0b10101, + 0b10101, + 0b10101, + 0b10101, + 0b10101, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 5 8 X + 0b10001, + 0b01010, + 0b00100, + 0b01010, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 5 9 Y + 0b10001, + 0b10001, + 0b01010, + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // 5 a Z + 0b00001, + 0b00010, + 0b00100, + 0b01000, + 0b10000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 5 b [ + 0b01000, + 0b01000, + 0b01000, + 0b01000, + 0b01000, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b10001, // 5 c + 0b01010, + 0b11111, + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // 5 d ] + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 5 e ^ + 0b01010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 5 f _ + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // 6 0 ` + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 1 a + 0b00000, + 0b01110, + 0b00001, + 0b01111, + 0b10001, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // 6 2 b + 0b10000, + 0b10110, + 0b11001, + 0b10001, + 0b10001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 3 c + 0b00000, + 0b01110, + 0b10000, + 0b10000, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00001, // 6 4 d + 0b00001, + 0b01101, + 0b10011, + 0b10001, + 0b10001, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 5 e + 0b00000, + 0b01110, + 0b10001, + 0b11111, + 0b10000, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00110, // 6 6 f + 0b01001, + 0b01000, + 0b11100, + 0b01000, + 0b01000, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 7 g + 0b01111, + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // 6 8 h + 0b10000, + 0b10110, + 0b11001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 6 9 i + 0b00000, + 0b01100, + 0b00100, + 0b00100, + 0b00100, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 6 a j + 0b00000, + 0b00110, + 0b00010, + 0b00010, + 0b10010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // 6 b k + 0b10000, + 0b10010, + 0b10100, + 0b11000, + 0b10100, + 0b10010, + 0b00000, + 0b00000, + 0b00000, + + 0b01100, // 6 c l + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 d m + 0b00000, + 0b11010, + 0b10101, + 0b10101, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 e n + 0b00000, + 0b10110, + 0b11001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 6 f o + 0b00000, + 0b01110, + 0b10001, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 0 p + 0b00000, + 0b11110, + 0b10001, + 0b11110, + 0b10000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 1 q + 0b00000, + 0b01101, + 0b10011, + 0b01111, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 2 r + 0b00000, + 0b10110, + 0b11001, + 0b10000, + 0b10000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 3 s + 0b00000, + 0b01110, + 0b10000, + 0b01110, + 0b00001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // 7 4 t + 0b01000, + 0b11100, + 0b01000, + 0b01000, + 0b01001, + 0b00110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 5 u + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b10011, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 6 v + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b01010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 7 w + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b10101, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 8 x + 0b00000, + 0b10001, + 0b01010, + 0b00100, + 0b01010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 9 y + 0b00000, + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 a z + 0b00000, + 0b11111, + 0b00010, + 0b00100, + 0b01000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 7 b { + 0b00100, + 0b00100, + 0b01000, + 0b00100, + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 7 c | + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // 7 d } + 0b00100, + 0b00100, + 0b00010, + 0b00100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 e -> + 0b00100, + 0b00010, + 0b11111, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 7 f <- + 0b00100, + 0b01000, + 0b11111, + 0b01000, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 0 + 0b00110, + 0b00010, + 0b00010, + 0b00010, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 1 + 0b11111, + 0b10001, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 2 + 0b10001, + 0b10001, + 0b01001, + 0b00101, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 3 + 0b01111, + 0b01001, + 0b01101, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 4 + 0b11111, + 0b01001, + 0b01101, + 0b00001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 5 + 0b01001, + 0b00110, + 0b00010, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 6 + 0b10001, + 0b01010, + 0b00100, + 0b00010, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 7 + 0b11111, + 0b00001, + 0b10001, + 0b10110, + 0b10000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 8 + 0b11111, + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 9 + 0b10101, + 0b10101, + 0b10101, + 0b10101, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 a + 0b01111, + 0b01001, + 0b01001, + 0b01001, + 0b11001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 8 b + 0b01001, + 0b11101, + 0b00001, + 0b10001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 c + 0b00010, + 0b00000, + 0b00010, + 0b00101, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 d + 0b00000, + 0b00000, + 0b00010, + 0b00101, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // 8 e + 0b00100, + 0b01110, + 0b00000, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 8 f + 0b00100, + 0b00000, + 0b00110, + 0b01000, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 9 0 + 0b00101, + 0b11100, + 0b00000, + 0b00100, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 1 + 0b00000, + 0b00100, + 0b01010, + 0b00001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 2 + 0b00010, + 0b00000, + 0b10011, + 0b10011, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 3 + 0b00000, + 0b00000, + 0b00111, + 0b00101, + 0b11011, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 4 + 0b01100, + 0b00010, + 0b01001, + 0b10101, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 9 5 + 0b00000, + 0b01111, + 0b01001, + 0b00110, + 0b11001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 9 6 + 0b01001, + 0b11101, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 7 + 0b00101, + 0b00000, + 0b00010, + 0b00101, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 8 + 0b00000, + 0b00000, + 0b01100, + 0b01010, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 9 + 0b01010, + 0b00000, + 0b01100, + 0b01010, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 a + 0b00000, + 0b01111, + 0b01001, + 0b00110, + 0b11001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // 9 b + 0b00000, + 0b00100, + 0b01010, + 0b00001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 c + 0b00101, + 0b00000, + 0b10011, + 0b10011, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 d + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b11110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // 9 e + 0b00000, + 0b00000, + 0b00100, + 0b01010, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00110, // 9 f + 0b11101, + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 0 + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 1 + 0b00000, + 0b00000, + 0b00000, + 0b11100, + 0b10100, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + + 0b00111, // a 2 + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 3 + 0b00000, + 0b00000, + 0b00100, + 0b00100, + 0b00100, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 4 + 0b00000, + 0b00000, + 0b00000, + 0b10000, + 0b01000, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 5 + 0b00000, + 0b00000, + 0b01100, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 6 + 0b11111, + 0b00001, + 0b11111, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 7 + 0b00000, + 0b11111, + 0b00001, + 0b00110, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 8 + 0b00000, + 0b00010, + 0b00100, + 0b01100, + 0b10100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a 9 + 0b00000, + 0b00100, + 0b11111, + 0b10001, + 0b00001, + 0b00110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a a + 0b00000, + 0b00000, + 0b11111, + 0b00100, + 0b00100, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a b + 0b00000, + 0b00010, + 0b11111, + 0b00110, + 0b01010, + 0b10010, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a c + 0b00000, + 0b01000, + 0b11111, + 0b01001, + 0b01010, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a d + 0b00000, + 0b00000, + 0b01110, + 0b00010, + 0b00010, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // a e + 0b00000, + 0b00000, + 0b11110, + 0b00010, + 0b11110, + 0b00010, + 0b11110, + 0b00000, + 0b00000, + + 0b00000, // a f + 0b00000, + 0b00000, + 0b10101, + 0b10101, + 0b00001, + 0b00110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b 0 + 0b00000, + 0b00000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // b 1 + 0b00001, + 0b00101, + 0b00110, + 0b00100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00001, // b 2 + 0b00010, + 0b00100, + 0b01100, + 0b10100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // b 3 + 0b11111, + 0b10001, + 0b10001, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b 4 + 0b11111, + 0b00100, + 0b00100, + 0b00100, + 0b00100, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // b 5 + 0b11111, + 0b00010, + 0b00110, + 0b01010, + 0b10010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // b 6 + 0b11111, + 0b01001, + 0b01001, + 0b01001, + 0b01001, + 0b10010, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // b 7 + 0b11111, + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b 8 + 0b01111, + 0b01001, + 0b10001, + 0b00001, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // b 9 + 0b01111, + 0b10010, + 0b00010, + 0b00010, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b a + 0b11111, + 0b00001, + 0b00001, + 0b00001, + 0b00001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // b b + 0b11111, + 0b01010, + 0b01010, + 0b00010, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b c + 0b11000, + 0b00001, + 0b11001, + 0b00001, + 0b00010, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b d + 0b11111, + 0b00001, + 0b00010, + 0b00100, + 0b01010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // b e + 0b11111, + 0b01001, + 0b01010, + 0b01000, + 0b01000, + 0b00111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // b f + 0b10001, + 0b10001, + 0b01001, + 0b00001, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c 0 + 0b01111, + 0b01001, + 0b10101, + 0b00011, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // c 1 + 0b11100, + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c 2 + 0b10101, + 0b10101, + 0b10101, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // c 3 + 0b00000, + 0b11111, + 0b00100, + 0b00100, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // c 4 + 0b01000, + 0b01000, + 0b01100, + 0b01010, + 0b01000, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // c 5 + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b01000, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c 6 + 0b01110, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c 7 + 0b11111, + 0b00001, + 0b01010, + 0b00100, + 0b01010, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // c 8 + 0b11111, + 0b00010, + 0b00100, + 0b01110, + 0b10101, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // c 9 + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c a + 0b00100, + 0b00010, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b10000, // c b + 0b10000, + 0b11111, + 0b10000, + 0b10000, + 0b10000, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c c + 0b11111, + 0b00001, + 0b00001, + 0b00001, + 0b00010, + 0b01100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c d + 0b01000, + 0b10100, + 0b00010, + 0b00001, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // c e + 0b11111, + 0b00100, + 0b10101, + 0b10101, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // c f + 0b11111, + 0b00001, + 0b00001, + 0b01010, + 0b00100, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 0 + 0b01110, + 0b00000, + 0b01110, + 0b00000, + 0b01110, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 1 + 0b00100, + 0b01000, + 0b10000, + 0b10001, + 0b11111, + 0b00001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 2 + 0b00001, + 0b00001, + 0b01010, + 0b00100, + 0b01010, + 0b10000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 3 + 0b11111, + 0b01000, + 0b11111, + 0b01000, + 0b01000, + 0b00111, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // d 4 + 0b01000, + 0b11111, + 0b01001, + 0b01010, + 0b01000, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 5 + 0b01110, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 6 + 0b11111, + 0b00001, + 0b11111, + 0b00001, + 0b00001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // d 7 + 0b00000, + 0b11111, + 0b00001, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b10010, // d 8 + 0b10010, + 0b10010, + 0b10010, + 0b00010, + 0b00100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d 9 + 0b00100, + 0b10100, + 0b10100, + 0b10100, + 0b10101, + 0b10110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d a + 0b10000, + 0b10000, + 0b10001, + 0b10010, + 0b10100, + 0b11000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d b + 0b11111, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d c + 0b11111, + 0b10001, + 0b10001, + 0b00001, + 0b00010, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // d d + 0b11000, + 0b00000, + 0b00001, + 0b00001, + 0b00010, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + + 0b00100, // d e + 0b10010, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b11100, // d f + 0b10100, + 0b11100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // e 0 + 0b01001, + 0b10101, + 0b10010, + 0b10010, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // e 1 + 0b00000, + 0b01110, + 0b00001, + 0b01111, + 0b10001, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // e 2 + 0b00000, + 0b01110, + 0b10001, + 0b11110, + 0b10001, + 0b11110, + 0b10000, + 0b10000, + 0b10000, + + 0b00000, // e 3 + 0b00000, + 0b01110, + 0b10000, + 0b01100, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // e 4 + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b10011, + 0b11101, + 0b10000, + 0b10000, + 0b10000, + + 0b00000, // e 5 + 0b00000, + 0b00000, + 0b01111, + 0b10100, + 0b10010, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + + 0b00000, // e 6 + 0b00000, + 0b00110, + 0b01001, + 0b10001, + 0b10001, + 0b11110, + 0b10000, + 0b10000, + 0b10000, + + 0b00000, // e 7 + 0b00000, + 0b01111, + 0b10001, + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b00001, + 0b01110, + + 0b00000, // e 8 + 0b00000, + 0b00111, + 0b00100, + 0b00100, + 0b10100, + 0b01000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // e 9 + 0b00010, + 0b11010, + 0b00010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00010, // e a + 0b00000, + 0b00110, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b00010, + 0b10010, + 0b01100, + + 0b00000, // e b + 0b10100, + 0b01000, + 0b10100, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // e c + 0b00100, + 0b01110, + 0b10100, + 0b10101, + 0b01110, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b01000, // e d + 0b01000, + 0b11100, + 0b01000, + 0b11100, + 0b01000, + 0b01111, + 0b00000, + 0b00000, + 0b00000, + + 0b01110, // e e + 0b00000, + 0b10110, + 0b11001, + 0b10001, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // e f + 0b00000, + 0b01110, + 0b10001, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f 0 + 0b00000, + 0b10110, + 0b11001, + 0b10001, + 0b10001, + 0b11110, + 0b10000, + 0b10000, + 0b10000, + + 0b00000, // f 1 + 0b00000, + 0b01101, + 0b10011, + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b00001, + 0b00001, + + 0b00000, // f 2 + 0b01110, + 0b10001, + 0b11111, + 0b10001, + 0b10001, + 0b01110, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f 3 + 0b00000, + 0b00000, + 0b01011, + 0b10101, + 0b11010, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f 4 + 0b00000, + 0b01110, + 0b10001, + 0b10001, + 0b01010, + 0b11011, + 0b00000, + 0b00000, + 0b00000, + + 0b01010, // f 5 + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b10011, + 0b01101, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // f 6 + 0b10000, + 0b01000, + 0b00100, + 0b01000, + 0b10000, + 0b11111, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f 7 + 0b00000, + 0b11111, + 0b01010, + 0b01010, + 0b01010, + 0b10011, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // f 8 + 0b00000, + 0b10001, + 0b01010, + 0b00100, + 0b01010, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f 9 + 0b00000, + 0b10001, + 0b10001, + 0b10001, + 0b10001, + 0b01111, + 0b00001, + 0b00001, + 0b01110, + + 0b00000, // f a + 0b00001, + 0b11110, + 0b00100, + 0b11111, + 0b00100, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f b + 0b00000, + 0b11111, + 0b01000, + 0b01111, + 0b01001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f c + 0b00000, + 0b11111, + 0b10101, + 0b11111, + 0b10001, + 0b10001, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f d + 0b00000, + 0b00100, + 0b00000, + 0b11111, + 0b00000, + 0b00100, + 0b00000, + 0b00000, + 0b00000, + + 0b00000, // f e + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + 0b00000, + + 0b11111, // f f + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + }; + + static_assert(std::size(g_fontTable0) == static_cast<size_t>(256 * 10)); + + const uint8_t* getCharacterData(const uint8_t _character) + { + return &g_fontTable0[static_cast<size_t>(_character) * 10]; + } +} diff --git a/source/hardwareLib/lcdfonts.h b/source/hardwareLib/lcdfonts.h @@ -0,0 +1,8 @@ +#pragma once + +#include <cstdint> + +namespace hwLib +{ + const uint8_t* getCharacterData(uint8_t _character); +} diff --git a/source/mqJucePlugin/mqLcd.cpp b/source/mqJucePlugin/mqLcd.cpp @@ -1,10 +1,8 @@ #include "mqLcd.h" -#include "jucePluginLib/pluginVersion.h" - -#include "wLib/lcdfonts.h" +#include "hardwareLib/lcdfonts.h" -// EW20290GLW display simulation (20*2) +#include "jucePluginLib/pluginVersion.h" MqLcd::MqLcd(Component& _parent) : Lcd(_parent, 20, 2) { @@ -40,5 +38,5 @@ bool MqLcd::getOverrideText(std::vector<std::vector<uint8_t>>& _lines) const uint8_t* MqLcd::getCharacterData(uint8_t _character) const { - return wLib::getCharacterData(_character); + return hwLib::getCharacterData(_character); } diff --git a/source/mqLib/lcd.cpp b/source/mqLib/lcd.cpp @@ -30,7 +30,7 @@ namespace mqLib if(!execute) return false; - const auto res = wLib::LCD::exec(registerSelect, read, g); + const auto res = hwLib::LCD::exec(registerSelect, read, g); if(res) _portGp.writeRX(*res); diff --git a/source/mqLib/lcd.h b/source/mqLib/lcd.h @@ -1,6 +1,6 @@ #pragma once -#include "wLib/lcd.h" +#include "hardwareLib/lcd.h" namespace mc68k { @@ -9,7 +9,7 @@ namespace mc68k namespace mqLib { - class LCD : public wLib::LCD + class LCD : public hwLib::LCD { public: bool exec(mc68k::Port& _portGp, const mc68k::Port& _portF); diff --git a/source/wLib/CMakeLists.txt b/source/wLib/CMakeLists.txt @@ -5,8 +5,6 @@ project(wLib) add_library(wLib STATIC) set(SOURCES - lcd.cpp lcd.h - lcdfonts.cpp lcdfonts.h wDevice.cpp wDevice.h wDsp.cpp wDsp.h wHardware.cpp wHardware.h diff --git a/source/wLib/lcd.cpp b/source/wLib/lcd.cpp @@ -1,218 +0,0 @@ -#include "lcd.h" - -#include <cassert> - -#include "mc68k/logging.h" - -#define LOG MCLOG - -namespace wLib -{ - LCD::LCD() = default; - - std::optional<uint8_t> LCD::exec(bool registerSelect, bool read, uint8_t g) - { - bool changed = false; - bool cgRamChanged = false; - - std::optional<uint8_t> result; - - if(!read) - { - if(!registerSelect) - { - if(g == 0x01) - { - LOG("LCD Clear Display"); - m_dramData.fill(' '); - changed = true; - } - else if(g == 0x02) - { - LOG("LCD Return Home"); - m_dramAddr = 0; - m_cursorPos = 0; - } - else if((g & 0xfc) == 0x04) - { - const int increment = (g >> 1) & 1; - const int shift = g & 1; - LOG("LCD Entry Mode Set, inc=" << increment << ", shift=" << shift); - - m_addrIncrement = increment ? 1 : -1; - } - else if((g & 0xf8) == 0x08) - { - const int displayOnOff = (g >> 2) & 1; - const int cursorOnOff = (g >> 1) & 1; - const int cursorBlinking = g & 1; - - LOG("LCD Display ON/OFF, display=" << displayOnOff << ", cursor=" << cursorOnOff << ", blinking=" << cursorBlinking); - - m_displayOn = displayOnOff != 0; - m_cursorOn = cursorOnOff != 0; - m_cursorBlinking = cursorBlinking != 0; - } - else if((g & 0xf3) == 0x10) - { - const int scrl = (g >> 2) & 3; - - LOG("LCD Cursor/Display Shift, scrl=" << scrl); - m_cursorShift = static_cast<CursorShiftMode>(scrl); - } - else if((g & 0xec) == 0x28) - { - const int dl = (g >> 4) & 1; - const int ft = g & 3; - - LOG("LCD Function Set, dl=" << dl << ", ft=" << ft); - m_dataLength = static_cast<DataLength>(dl); - m_fontTable = static_cast<FontTable>(ft); - } - else if(g & (1<<7)) - { - const int addr = g & 0x7f; -// LOG("LCD Set DDRAM address, addr=" << addr); - m_dramAddr = addr; - m_addressMode = AddressMode::DDRam; - } - else if(g & (1<<6)) - { - const int acg = g & 0x3f; - -// LOG("LCD Set CGRAM address, acg=" << acg); - m_cgramAddr = acg; - m_addressMode = AddressMode::CGRam; - } - else - { - LOG("LCD unknown command"); - assert(false); - } - } - else - { - if(m_addressMode == AddressMode::CGRam) - { -// changed = true; -// LOG("LCD write data to CGRAM addr " << m_cgramAddr << ", data=" << static_cast<int>(g)); - - if (m_cgramData[m_cgramAddr] != g) - { - m_cgramData[m_cgramAddr] = g; - cgRamChanged = true; - } - - m_cgramAddr += m_addrIncrement; - - /* - if((m_cgramAddr & 0x7) == 0) - { - std::stringstream ss; - ss << "CG RAM character " << (m_cgramAddr/8 - 1) << ':' << '\n'; - ss << "##################" << '\n'; - for(auto i = m_cgramAddr - 8; i < m_cgramAddr - 1; ++i) - { - ss << '#'; - for(int x=7; x >= 0; --x) - { - if(m_cgramData[i] & (1<<x)) - ss << "[]"; - else - ss << " "; - } - ss << '#' << '\n'; - } - ss << "##################" << '\n'; - const auto s(ss.str()); - LOG(s); - } - */ - } - else - { -// LOG("LCD write data to DDRAM addr " << m_dramAddr << ", data=" << static_cast<int>(g) << ", char=" << static_cast<char>(g)); - - const auto old = m_dramData; - - if(m_dramAddr >= 20 && m_dramAddr < 0x40) - { - for(size_t i=1; i<=20; ++i) - m_dramData[i-1] = m_dramData[i]; - m_dramData[19] = static_cast<char>(g); - } - else if(m_dramAddr > 0x53) - { - for(size_t i=21; i<=40; ++i) - m_dramData[i-1] = m_dramData[i]; - - m_dramData[39] = static_cast<char>(g); - } - else - { - if(m_dramAddr < 20) - m_dramData[m_dramAddr] = static_cast<char>(g); - else - m_dramData[m_dramAddr - 0x40 + 20] = static_cast<char>(g); - } - - if(m_dramAddr != 20 && m_dramAddr != 0x54) - m_dramAddr += m_addrIncrement; - - if(m_dramData != old) - changed = true; - } - } - } - else - { - if(registerSelect) - { - LOG("LCD read data from CGRAM or DDRAM"); - if(m_addressMode == AddressMode::CGRam) - result = m_cgramData[m_cgramAddr]; - else - result = m_dramData[m_dramAddr]; - } - else - { - LOG("LCD read busy flag & address"); - if(m_addressMode == AddressMode::CGRam) - { - result = static_cast<uint8_t>(m_cgramAddr); - } - else - { - auto a = m_dramAddr; - if(a > 0x53) - a = 0x53; - if(a == 20) - a = 19; - result = static_cast<uint8_t>(m_dramAddr); - } - } - } - - if(changed && m_changeCallback) - m_changeCallback(); - - if(cgRamChanged && m_cgRamChangeCallback) - m_cgRamChangeCallback(); - - return result; - } - - bool LCD::getCgData(std::array<uint8_t, 8>& _data, uint32_t _charIndex) const - { - const auto idx = _charIndex * 8; - if(idx + 8 >= getCgRam().size()) - return false; - - uint32_t j = 0; - - for(auto i = idx; i<idx+8; ++i) - _data[j++] = getCgRam()[i]; - - return true; - } -} diff --git a/source/wLib/lcd.h b/source/wLib/lcd.h @@ -1,88 +0,0 @@ -#pragma once - -#include <array> -#include <cstdint> -#include <functional> -#include <optional> - -namespace wLib -{ - class LCD - { - public: - using ChangeCallback = std::function<void()>; - - LCD(); - std::optional<uint8_t> exec(bool registerSelect, bool read, uint8_t g); - - const std::array<char, 40>& getDdRam() const { return m_dramData; } - const auto& getCgRam() const { return m_cgramData; } - bool getCgData(std::array<uint8_t, 8>& _data, uint32_t _charIndex) const; - - void setChangeCallback(const ChangeCallback& _callback) - { - m_changeCallback = _callback; - } - - void setCgRamChangeCallback(const ChangeCallback& _callback) - { - m_cgRamChangeCallback = _callback; - } - private: - enum class CursorShiftMode - { - CursorLeft, - CursorRight, - DisplayLeft, - DisplayRight - }; - enum class DisplayShiftMode - { - Right, - Left - }; - enum class FontTable - { - EnglishJapanese, - WesternEuropean1, - EnglishRussian, - WesternEuropean2, - }; - enum class DataLength - { - Bit8, - Bit4 - }; - - enum class AddressMode - { - DDRam, - CGRam, - }; - - uint32_t m_lastWriteCounter = 0xffffffff; - - uint32_t m_cursorPos = 0; - uint32_t m_dramAddr = 0; - uint32_t m_cgramAddr = 0; - - CursorShiftMode m_cursorShift = CursorShiftMode::CursorLeft; - DisplayShiftMode m_displayShift = DisplayShiftMode::Left; - FontTable m_fontTable = FontTable::EnglishJapanese; - DataLength m_dataLength = DataLength::Bit8; - AddressMode m_addressMode = AddressMode::DDRam; - - bool m_displayOn = true; - bool m_cursorOn = false; - bool m_cursorBlinking = false; - - int m_addrIncrement = 1; - - std::array<uint8_t, 0x40> m_cgramData{}; - std::array<char, 40> m_dramData{}; - uint32_t m_lastOpState = 0; - - ChangeCallback m_changeCallback; - ChangeCallback m_cgRamChangeCallback; - }; -} diff --git a/source/wLib/lcdfonts.cpp b/source/wLib/lcdfonts.cpp @@ -1,2675 +0,0 @@ -#include <cstdint> -#include <cstddef> - -#include <array> - -namespace wLib -{ - constexpr uint8_t g_fontTable0[] = - { - // CGRam Data, initially empty - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 0 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 1 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 2 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 3 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 4 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 5 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 6 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 7 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 8 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 9 - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 a - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 b - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 c - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 d - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 e - 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, // 0 f - - 0b00000, // 1 0 - 0b10001, - 0b01001, - 0b01110, - 0b10010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 1 - 0b11110, - 0b00010, - 0b00010, - 0b00010, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 2 - 0b00110, - 0b00010, - 0b00110, - 0b01010, - 0b01010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 3 - 0b11111, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 4 - 0b11111, - 0b00001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 5 - 0b00110, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 6 - 0b01110, - 0b00100, - 0b01000, - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 7 - 0b11111, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 8 - 0b10111, - 0b10101, - 0b10101, - 0b10001, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 9 - 0b00110, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 a - 0b01111, - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 b - 0b11110, - 0b00001, - 0b00001, - 0b00001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // 1 c - 0b11111, - 0b00001, - 0b00001, - 0b00001, - 0b00110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 d - 0b11111, - 0b10001, - 0b10001, - 0b10001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 e - 0b10110, - 0b01001, - 0b10001, - 0b10001, - 0b10111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 1 f - 0b00110, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 0 - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 2 1 ! - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // 2 2 " - 0b01010, - 0b01010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // 2 3 # - 0b01010, - 0b11111, - 0b01010, - 0b11111, - 0b01010, - 0b01010, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 2 4 $ - 0b01111, - 0b10100, - 0b01110, - 0b00101, - 0b11110, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b11000, // 2 5 % - 0b11001, - 0b00010, - 0b00100, - 0b01000, - 0b10011, - 0b00011, - 0b00000, - 0b00000, - 0b00000, - - 0b01100, // 2 6 & - 0b10010, - 0b10100, - 0b01000, - 0b10101, - 0b10010, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - - 0b01100, // 2 7 ' - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 2 8 ( - 0b00100, - 0b01000, - 0b01000, - 0b01000, - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // 2 9 ) - 0b00100, - 0b00010, - 0b00010, - 0b00010, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 a * - 0b00100, - 0b10101, - 0b01110, - 0b10101, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 b + - 0b00100, - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 c , - 0b00000, - 0b00000, - 0b00000, - 0b01100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 d - - 0b00000, - 0b00000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 e . - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b01100, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 2 f / - 0b00001, - 0b00010, - 0b00100, - 0b01000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 3 0 0 - 0b10001, - 0b10011, - 0b10101, - 0b11001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 3 1 1 - 0b01100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 3 2 2 - 0b10001, - 0b00001, - 0b00010, - 0b00100, - 0b01000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 3 3 3 - 0b00010, - 0b00100, - 0b00010, - 0b00001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 3 4 4 - 0b00110, - 0b01010, - 0b10010, - 0b11111, - 0b00010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 3 5 5 - 0b10000, - 0b11110, - 0b00001, - 0b00001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00110, // 3 6 6 - 0b01000, - 0b10000, - 0b11110, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 3 7 7 - 0b00001, - 0b00010, - 0b00100, - 0b01000, - 0b01000, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 3 8 8 - 0b10001, - 0b10001, - 0b01110, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 3 9 9 - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 3 a : - 0b01100, - 0b01100, - 0b00000, - 0b01100, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 3 b ; - 0b01100, - 0b01100, - 0b00000, - 0b01100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 3 c < - 0b00100, - 0b01000, - 0b10000, - 0b01000, - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 3 d = - 0b00000, - 0b11111, - 0b00000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // 3 e > - 0b00100, - 0b00010, - 0b00001, - 0b00010, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 3 f ? - 0b10001, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 0 @ - 0b10001, - 0b00001, - 0b01101, - 0b10101, - 0b10101, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 1 A - 0b10001, - 0b10001, - 0b10001, - 0b11111, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b11110, // 4 2 B - 0b10001, - 0b10001, - 0b11110, - 0b10001, - 0b10001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 3 C - 0b10001, - 0b10000, - 0b10000, - 0b10000, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b11100, // 4 4 D - 0b10010, - 0b10001, - 0b10001, - 0b10001, - 0b10010, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 4 5 E - 0b10000, - 0b10000, - 0b11110, - 0b10000, - 0b10000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 4 6 F - 0b10000, - 0b10000, - 0b11110, - 0b10000, - 0b10000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 7 G - 0b10001, - 0b10000, - 0b10111, - 0b10001, - 0b10001, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 4 8 H - 0b10001, - 0b10001, - 0b11111, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 9 I - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00111, // 4 a J - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b10010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 4 b K - 0b10010, - 0b10100, - 0b11000, - 0b10100, - 0b10010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // 4 c L - 0b10000, - 0b10000, - 0b10000, - 0b10000, - 0b10000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 4 d M - 0b11011, - 0b10101, - 0b10101, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 4 e N - 0b10001, - 0b11001, - 0b10101, - 0b10011, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 4 f O - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b11110, // 5 0 P - 0b10001, - 0b10001, - 0b11110, - 0b10000, - 0b10000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 5 1 Q - 0b10001, - 0b10001, - 0b10001, - 0b10101, - 0b10010, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - - 0b11110, // 5 2 R - 0b10001, - 0b10001, - 0b11110, - 0b10100, - 0b10010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b01111, // 5 3 S - 0b10000, - 0b10000, - 0b01110, - 0b00001, - 0b00001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 5 4 T - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 5 5 U - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 5 6 V - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b01010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b10101, // 5 7 W - 0b10101, - 0b10101, - 0b10101, - 0b10101, - 0b10101, - 0b01010, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 5 8 X - 0b10001, - 0b01010, - 0b00100, - 0b01010, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 5 9 Y - 0b10001, - 0b10001, - 0b01010, - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // 5 a Z - 0b00001, - 0b00010, - 0b00100, - 0b01000, - 0b10000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 5 b [ - 0b01000, - 0b01000, - 0b01000, - 0b01000, - 0b01000, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b10001, // 5 c - 0b01010, - 0b11111, - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // 5 d ] - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 5 e ^ - 0b01010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 5 f _ - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // 6 0 ` - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 1 a - 0b00000, - 0b01110, - 0b00001, - 0b01111, - 0b10001, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // 6 2 b - 0b10000, - 0b10110, - 0b11001, - 0b10001, - 0b10001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 3 c - 0b00000, - 0b01110, - 0b10000, - 0b10000, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00001, // 6 4 d - 0b00001, - 0b01101, - 0b10011, - 0b10001, - 0b10001, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 5 e - 0b00000, - 0b01110, - 0b10001, - 0b11111, - 0b10000, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00110, // 6 6 f - 0b01001, - 0b01000, - 0b11100, - 0b01000, - 0b01000, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 7 g - 0b01111, - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // 6 8 h - 0b10000, - 0b10110, - 0b11001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 6 9 i - 0b00000, - 0b01100, - 0b00100, - 0b00100, - 0b00100, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 6 a j - 0b00000, - 0b00110, - 0b00010, - 0b00010, - 0b10010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // 6 b k - 0b10000, - 0b10010, - 0b10100, - 0b11000, - 0b10100, - 0b10010, - 0b00000, - 0b00000, - 0b00000, - - 0b01100, // 6 c l - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 d m - 0b00000, - 0b11010, - 0b10101, - 0b10101, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 e n - 0b00000, - 0b10110, - 0b11001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 6 f o - 0b00000, - 0b01110, - 0b10001, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 0 p - 0b00000, - 0b11110, - 0b10001, - 0b11110, - 0b10000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 1 q - 0b00000, - 0b01101, - 0b10011, - 0b01111, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 2 r - 0b00000, - 0b10110, - 0b11001, - 0b10000, - 0b10000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 3 s - 0b00000, - 0b01110, - 0b10000, - 0b01110, - 0b00001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // 7 4 t - 0b01000, - 0b11100, - 0b01000, - 0b01000, - 0b01001, - 0b00110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 5 u - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b10011, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 6 v - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b01010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 7 w - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b10101, - 0b01010, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 8 x - 0b00000, - 0b10001, - 0b01010, - 0b00100, - 0b01010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 9 y - 0b00000, - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 a z - 0b00000, - 0b11111, - 0b00010, - 0b00100, - 0b01000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 7 b { - 0b00100, - 0b00100, - 0b01000, - 0b00100, - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 7 c | - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // 7 d } - 0b00100, - 0b00100, - 0b00010, - 0b00100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 e -> - 0b00100, - 0b00010, - 0b11111, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 7 f <- - 0b00100, - 0b01000, - 0b11111, - 0b01000, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 0 - 0b00110, - 0b00010, - 0b00010, - 0b00010, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 1 - 0b11111, - 0b10001, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 2 - 0b10001, - 0b10001, - 0b01001, - 0b00101, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 3 - 0b01111, - 0b01001, - 0b01101, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 4 - 0b11111, - 0b01001, - 0b01101, - 0b00001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 5 - 0b01001, - 0b00110, - 0b00010, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 6 - 0b10001, - 0b01010, - 0b00100, - 0b00010, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 7 - 0b11111, - 0b00001, - 0b10001, - 0b10110, - 0b10000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 8 - 0b11111, - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 9 - 0b10101, - 0b10101, - 0b10101, - 0b10101, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 a - 0b01111, - 0b01001, - 0b01001, - 0b01001, - 0b11001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 8 b - 0b01001, - 0b11101, - 0b00001, - 0b10001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 c - 0b00010, - 0b00000, - 0b00010, - 0b00101, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 d - 0b00000, - 0b00000, - 0b00010, - 0b00101, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // 8 e - 0b00100, - 0b01110, - 0b00000, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 8 f - 0b00100, - 0b00000, - 0b00110, - 0b01000, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 9 0 - 0b00101, - 0b11100, - 0b00000, - 0b00100, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 1 - 0b00000, - 0b00100, - 0b01010, - 0b00001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 2 - 0b00010, - 0b00000, - 0b10011, - 0b10011, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 3 - 0b00000, - 0b00000, - 0b00111, - 0b00101, - 0b11011, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 4 - 0b01100, - 0b00010, - 0b01001, - 0b10101, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 9 5 - 0b00000, - 0b01111, - 0b01001, - 0b00110, - 0b11001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 9 6 - 0b01001, - 0b11101, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 7 - 0b00101, - 0b00000, - 0b00010, - 0b00101, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 8 - 0b00000, - 0b00000, - 0b01100, - 0b01010, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 9 - 0b01010, - 0b00000, - 0b01100, - 0b01010, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 a - 0b00000, - 0b01111, - 0b01001, - 0b00110, - 0b11001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // 9 b - 0b00000, - 0b00100, - 0b01010, - 0b00001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 c - 0b00101, - 0b00000, - 0b10011, - 0b10011, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 d - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b11110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // 9 e - 0b00000, - 0b00000, - 0b00100, - 0b01010, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00110, // 9 f - 0b11101, - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 0 - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 1 - 0b00000, - 0b00000, - 0b00000, - 0b11100, - 0b10100, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - - 0b00111, // a 2 - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 3 - 0b00000, - 0b00000, - 0b00100, - 0b00100, - 0b00100, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 4 - 0b00000, - 0b00000, - 0b00000, - 0b10000, - 0b01000, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 5 - 0b00000, - 0b00000, - 0b01100, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 6 - 0b11111, - 0b00001, - 0b11111, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 7 - 0b00000, - 0b11111, - 0b00001, - 0b00110, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 8 - 0b00000, - 0b00010, - 0b00100, - 0b01100, - 0b10100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a 9 - 0b00000, - 0b00100, - 0b11111, - 0b10001, - 0b00001, - 0b00110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a a - 0b00000, - 0b00000, - 0b11111, - 0b00100, - 0b00100, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a b - 0b00000, - 0b00010, - 0b11111, - 0b00110, - 0b01010, - 0b10010, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a c - 0b00000, - 0b01000, - 0b11111, - 0b01001, - 0b01010, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a d - 0b00000, - 0b00000, - 0b01110, - 0b00010, - 0b00010, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // a e - 0b00000, - 0b00000, - 0b11110, - 0b00010, - 0b11110, - 0b00010, - 0b11110, - 0b00000, - 0b00000, - - 0b00000, // a f - 0b00000, - 0b00000, - 0b10101, - 0b10101, - 0b00001, - 0b00110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b 0 - 0b00000, - 0b00000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // b 1 - 0b00001, - 0b00101, - 0b00110, - 0b00100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00001, // b 2 - 0b00010, - 0b00100, - 0b01100, - 0b10100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // b 3 - 0b11111, - 0b10001, - 0b10001, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b 4 - 0b11111, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // b 5 - 0b11111, - 0b00010, - 0b00110, - 0b01010, - 0b10010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // b 6 - 0b11111, - 0b01001, - 0b01001, - 0b01001, - 0b01001, - 0b10010, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // b 7 - 0b11111, - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b 8 - 0b01111, - 0b01001, - 0b10001, - 0b00001, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // b 9 - 0b01111, - 0b10010, - 0b00010, - 0b00010, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b a - 0b11111, - 0b00001, - 0b00001, - 0b00001, - 0b00001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // b b - 0b11111, - 0b01010, - 0b01010, - 0b00010, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b c - 0b11000, - 0b00001, - 0b11001, - 0b00001, - 0b00010, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b d - 0b11111, - 0b00001, - 0b00010, - 0b00100, - 0b01010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // b e - 0b11111, - 0b01001, - 0b01010, - 0b01000, - 0b01000, - 0b00111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // b f - 0b10001, - 0b10001, - 0b01001, - 0b00001, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c 0 - 0b01111, - 0b01001, - 0b10101, - 0b00011, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // c 1 - 0b11100, - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c 2 - 0b10101, - 0b10101, - 0b10101, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // c 3 - 0b00000, - 0b11111, - 0b00100, - 0b00100, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // c 4 - 0b01000, - 0b01000, - 0b01100, - 0b01010, - 0b01000, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // c 5 - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b01000, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c 6 - 0b01110, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c 7 - 0b11111, - 0b00001, - 0b01010, - 0b00100, - 0b01010, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // c 8 - 0b11111, - 0b00010, - 0b00100, - 0b01110, - 0b10101, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // c 9 - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c a - 0b00100, - 0b00010, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b10000, // c b - 0b10000, - 0b11111, - 0b10000, - 0b10000, - 0b10000, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c c - 0b11111, - 0b00001, - 0b00001, - 0b00001, - 0b00010, - 0b01100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c d - 0b01000, - 0b10100, - 0b00010, - 0b00001, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // c e - 0b11111, - 0b00100, - 0b10101, - 0b10101, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // c f - 0b11111, - 0b00001, - 0b00001, - 0b01010, - 0b00100, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 0 - 0b01110, - 0b00000, - 0b01110, - 0b00000, - 0b01110, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 1 - 0b00100, - 0b01000, - 0b10000, - 0b10001, - 0b11111, - 0b00001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 2 - 0b00001, - 0b00001, - 0b01010, - 0b00100, - 0b01010, - 0b10000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 3 - 0b11111, - 0b01000, - 0b11111, - 0b01000, - 0b01000, - 0b00111, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // d 4 - 0b01000, - 0b11111, - 0b01001, - 0b01010, - 0b01000, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 5 - 0b01110, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 6 - 0b11111, - 0b00001, - 0b11111, - 0b00001, - 0b00001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // d 7 - 0b00000, - 0b11111, - 0b00001, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b10010, // d 8 - 0b10010, - 0b10010, - 0b10010, - 0b00010, - 0b00100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d 9 - 0b00100, - 0b10100, - 0b10100, - 0b10100, - 0b10101, - 0b10110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d a - 0b10000, - 0b10000, - 0b10001, - 0b10010, - 0b10100, - 0b11000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d b - 0b11111, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d c - 0b11111, - 0b10001, - 0b10001, - 0b00001, - 0b00010, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // d d - 0b11000, - 0b00000, - 0b00001, - 0b00001, - 0b00010, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - - 0b00100, // d e - 0b10010, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b11100, // d f - 0b10100, - 0b11100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // e 0 - 0b01001, - 0b10101, - 0b10010, - 0b10010, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // e 1 - 0b00000, - 0b01110, - 0b00001, - 0b01111, - 0b10001, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // e 2 - 0b00000, - 0b01110, - 0b10001, - 0b11110, - 0b10001, - 0b11110, - 0b10000, - 0b10000, - 0b10000, - - 0b00000, // e 3 - 0b00000, - 0b01110, - 0b10000, - 0b01100, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // e 4 - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b10011, - 0b11101, - 0b10000, - 0b10000, - 0b10000, - - 0b00000, // e 5 - 0b00000, - 0b00000, - 0b01111, - 0b10100, - 0b10010, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - - 0b00000, // e 6 - 0b00000, - 0b00110, - 0b01001, - 0b10001, - 0b10001, - 0b11110, - 0b10000, - 0b10000, - 0b10000, - - 0b00000, // e 7 - 0b00000, - 0b01111, - 0b10001, - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b00001, - 0b01110, - - 0b00000, // e 8 - 0b00000, - 0b00111, - 0b00100, - 0b00100, - 0b10100, - 0b01000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // e 9 - 0b00010, - 0b11010, - 0b00010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00010, // e a - 0b00000, - 0b00110, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b00010, - 0b10010, - 0b01100, - - 0b00000, // e b - 0b10100, - 0b01000, - 0b10100, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // e c - 0b00100, - 0b01110, - 0b10100, - 0b10101, - 0b01110, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b01000, // e d - 0b01000, - 0b11100, - 0b01000, - 0b11100, - 0b01000, - 0b01111, - 0b00000, - 0b00000, - 0b00000, - - 0b01110, // e e - 0b00000, - 0b10110, - 0b11001, - 0b10001, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // e f - 0b00000, - 0b01110, - 0b10001, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f 0 - 0b00000, - 0b10110, - 0b11001, - 0b10001, - 0b10001, - 0b11110, - 0b10000, - 0b10000, - 0b10000, - - 0b00000, // f 1 - 0b00000, - 0b01101, - 0b10011, - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b00001, - 0b00001, - - 0b00000, // f 2 - 0b01110, - 0b10001, - 0b11111, - 0b10001, - 0b10001, - 0b01110, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f 3 - 0b00000, - 0b00000, - 0b01011, - 0b10101, - 0b11010, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f 4 - 0b00000, - 0b01110, - 0b10001, - 0b10001, - 0b01010, - 0b11011, - 0b00000, - 0b00000, - 0b00000, - - 0b01010, // f 5 - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b10011, - 0b01101, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // f 6 - 0b10000, - 0b01000, - 0b00100, - 0b01000, - 0b10000, - 0b11111, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f 7 - 0b00000, - 0b11111, - 0b01010, - 0b01010, - 0b01010, - 0b10011, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // f 8 - 0b00000, - 0b10001, - 0b01010, - 0b00100, - 0b01010, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f 9 - 0b00000, - 0b10001, - 0b10001, - 0b10001, - 0b10001, - 0b01111, - 0b00001, - 0b00001, - 0b01110, - - 0b00000, // f a - 0b00001, - 0b11110, - 0b00100, - 0b11111, - 0b00100, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f b - 0b00000, - 0b11111, - 0b01000, - 0b01111, - 0b01001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f c - 0b00000, - 0b11111, - 0b10101, - 0b11111, - 0b10001, - 0b10001, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f d - 0b00000, - 0b00100, - 0b00000, - 0b11111, - 0b00000, - 0b00100, - 0b00000, - 0b00000, - 0b00000, - - 0b00000, // f e - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - 0b00000, - - 0b11111, // f f - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - }; - - static_assert(std::size(g_fontTable0) == static_cast<size_t>(256 * 10)); - - const uint8_t* getCharacterData(const uint8_t _character) - { - return &g_fontTable0[static_cast<size_t>(_character) * 10]; - } -} diff --git a/source/wLib/lcdfonts.h b/source/wLib/lcdfonts.h @@ -1,8 +0,0 @@ -#pragma once - -#include <cstdint> - -namespace wLib -{ - const uint8_t* getCharacterData(uint8_t _character); -} diff --git a/source/xtJucePlugin/xtLcd.cpp b/source/xtJucePlugin/xtLcd.cpp @@ -4,7 +4,7 @@ #include "jucePluginLib/pluginVersion.h" -#include "wLib/lcdfonts.h" +#include "hardwareLib/lcdfonts.h" namespace { @@ -84,7 +84,7 @@ bool XtLcd::getOverrideText(std::vector<std::vector<uint8_t>>& _lines) const uint8_t* XtLcd::getCharacterData(const uint8_t _character) const { - return wLib::getCharacterData(_character); + return hwLib::getCharacterData(_character); } void XtLcd::setCurrentParameter(const std::string& _name, const std::string& _value)