--- nono/vm/lcd.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/lcd.cpp 2026/04/29 17:04:58 1.1.1.8 @@ -1,17 +1,24 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// LCD (HD44780) // #include "lcd.h" +#include "uimessage.h" -LCDDevice *gLCD; +std::unique_ptr gLCD; LCDDevice::LCDDevice() + : inherited("LCD") { - logname = "lcd"; - devname = "LCD(HD44780)"; - monitor.Init(16, 2); + monitor.func = (MonitorCallback_t)&LCDDevice::MonitorUpdate; + monitor.SetSize(67, 3); + monitor.Regist(ID_MONITOR_LCD); } LCDDevice::~LCDDevice() @@ -21,13 +28,26 @@ LCDDevice::~LCDDevice() bool LCDDevice::PowerOff() { - // オフをどう表現するかはあるが、とりあえずモニタ画面での表示を消すのが - // 主目的なので空白で埋める。 + // XXX 電源オフは色を落としたほうがいい memset(ddram, 0x20, sizeof(ddram)); + UIMessage::Post(UIMessage::LCD); return true; } void +LCDDevice::ResetHard() +{ + // とりあえずモニタ画面での表示を消す + memset(ddram, 0x20, sizeof(ddram)); + // XXX not yet + // CGRAM とか信号線とか + + SetAddr(0, false); + + UIMessage::Post(UIMessage::LCD); +} + +void LCDDevice::SetRW(bool val) { rw = val; @@ -35,7 +55,7 @@ LCDDevice::SetRW(bool val) } void -LCDDevice::SetRS(int val) +LCDDevice::SetRS(bool val) { rs = val; putlog(2, "RS = %d", rs); @@ -53,46 +73,115 @@ uint8 LCDDevice::Get() const { return (en ? 0x80 : 0) - | (rs >> 6) + | (rs ? 0x40 : 0) | (rw ? 0x20 : 0); } +// 現在のアドレスでデータレジスタにラッチ +void +LCDDevice::LatchData() +{ + if (addr_is_cgram) { + data_reg = cgram[addr_counter]; + } else { + data_reg = ddram[addr_counter]; + } +} + +// アドレスカウンタを設定 +void +LCDDevice::SetAddr(int addr, bool is_cgram) +{ + // アドレスカウンタをセットするとデータレジスタにラッチされる + addr_counter = addr; + addr_is_cgram = is_cgram; + LatchData(); +} + +// アドレスカウンタを次へ進める +void +LCDDevice::NextAddr() +{ + // アドレス更新について。 + // DDRAM は各行 0x27 までしか存在していないが、stride が 0x40 バイト。 + // XXX CGRAM が折り返すかどうかは分からないがそのまま DDRAM 領域に + // 行っても困ると思うのでとりあえず。 + + if (addr_is_cgram) { + if (addr_inc) { + addr_counter++; + } else { + addr_counter--; + } + addr_counter &= 0x3f; + } else { + // 2 行モードしかサポートしていない + if (addr_inc) { + addr_counter++; + if (addr_counter == 0x28) { // DDRAM 1行目 + addr_counter = 0x40; + } else if (addr_counter == 0x68) { // DDRAM 2行目 + addr_counter = 0x0; + } + } else { + if (addr_counter == 0x0) { // DDRAM 1行目 + addr_counter = 0x68; + } else if (addr_counter == 0x40) { // DDRAM 2行目 + addr_counter = 0x28; + } + addr_counter--; + } + } + LatchData(); +} + uint8 LCDDevice::Read() { if (en == false || rw == false) { - // XXX どうなるんだろ + // ハイインピーダンス return 0xff; } - if (rs == 0) { + + if (rs == false) { // ステータスレジスタの読み込み // B A A A A A A A // | +-+-+-+-+-+-+-- アドレスカウンタ // +---------------- ビジーフラグ %1=BUSY // XXX ビジーは未実装 - return addr; + return addr_counter; } else { - putlog(0, "未実装データ読み込み"); + // データレジスタの読み込み + uint8 rv = data_reg; + NextAddr(); + return rv; } - return 0xff; } void LCDDevice::Write(uint8 data) { - if (en == false || rw == true) { - // どうなるんだろ + if (en == false) { + // ハイインピーダンス + return; + } + if (rw == true) { + // LCD はドライブ、PIOもドライブ。ショートが発生して燃える。 + // たまたま値が一致したときだけセーフ。 + putlog(0, "LCD will short out."); return; } - if (rs == 0) { + + if (rs == false) { // コマンド書き込み + if ((data & 0x80)) { - addr = data & 0x7f; - putlog(1, "DDRAM アドレスセット $%02x", addr); + SetAddr(data & 0x7f, false); + putlog(1, "DDRAM アドレスセット $%02x", addr_counter); } else if ((data & 0x40)) { - putlog(0, "コマンド書き込み $%02x CGRAM アドレスセット(未実装)", - data); + SetAddr(data & 0x3f, true); + putlog(1, "CGRAM アドレスセット $%02x", addr_counter); } else if ((data & 0x20)) { // ファンクション・セット // 0x38 (8ビットバス、2行表示、8ライン/行)モードのみサポート @@ -114,49 +203,1881 @@ LCDDevice::Write(uint8 data) // XXX 表示シフトは未サポート } else if ((data & 0x02)) { // カーソルホーム - addr = 0; + // DDRAM アドレス 0 をセット + SetAddr(0, false); } else if ((data & 0x01)) { // 表示クリア memset(ddram, 0x20, sizeof(ddram)); - addr = 0; + // DDRAM アドレス 0 をセット + SetAddr(0, false); + UIMessage::Post(UIMessage::LCD); } else { // $00 が書き込まれるんだけど、データシートにはないんだよね。 // 無視していいかな。 putlog(2, "未定義書き込み $%02x", data); } } else { - putlog(1, "データ書き込み $%02x (x=%2d,y=%d)", data, - (addr & 0x3f), (addr / 0x40)); - ddram[addr] = data; - // アドレス更新 - // 1行0x40バイト分あるが実際には0x27までしか存在していない - if (addr_inc) { - addr++; - if (addr == 0x28) - addr = 0x40; - if (addr == 0x68) - addr = 0; + // データ書き込み + if (addr_is_cgram) { + cgram[addr_counter] = data; + putlog(1, "CGRAM データ書き込み $%02x <- $%02x", + addr_counter, data); } else { - addr--; - if (addr == -1) - addr = 0x67; - if (addr == 0x3f) - addr = 0x27; + ddram[addr_counter] = data; + putlog(1, "DDRAM データ書き込み X=%d Y=%d <- $%02x", + addr_counter % 0x40, addr_counter / 0x40, data); } + NextAddr(); + UIMessage::Post(UIMessage::LCD); } } -bool -LCDDevice::MonitorUpdate() +// PIO1 からのピーク用 +uint8 +LCDDevice::Peek() const +{ + if (en == false || rw == false) { + // XXX どうなるんだろ + return 0xff; + } + if (rs == false) { + // ステータスレジスタをピークする + // XXX ビジーは未実装 + return addr_counter; + } else { + // データレジスタをピークする + return data_reg; + } + return 0xff; +} + +void +LCDDevice::MonitorUpdate(Monitor *, TextScreen &screen) { char buf[17]; - monitor.Clear(); + // 0 1 2 3 4 5 6 + // 01234567890123456789012345678901234567890123456789012345678901234567 + // RW=R RS=0 E=0 + // 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |0123456789abcdef| + // 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |0123456789abcdef| + + screen.Clear(); + screen.Print(0, 0, "RW=%c RS=%d E=%d", rw ? 'R' : 'W', rs, en); for (int y = 0; y < 2; y++) { memcpy(buf, &ddram[y * 0x40], 16); buf[16] = '\0'; - monitor.Print(0, y, "%s", buf); + // 16進を表示する端から文字ダンプ用に加工していく + for (int x = 0; x < 16; x++) { + screen.Print(x * 3 + (x / 8), y + 1, "%02x", buf[x]); + if (buf[x] < 0x20 || buf[x] > 0x7e) { + buf[x] = '.'; + } + } + screen.Print(49, y + 1, "|%-16s|", buf); } - return true; } + +// CGROM は ROM A00 版のみ考慮する (A02 版との共存は今の所考えない)。 +// A00 版は以下のような配置になっている。 +// +// +0+1+2+3+4+5+6+7+8+9+a+b+c+d+e+f +// 0x00 <------------ CGRAM -----------> +// 0x10 +// 0x20 ! " # $ % & ' ( ) * + , - . / +// 0x30 0 1 2 3 4 5 6 7 8 9 : ; < = > ? +// 0x40 @ A B C D E F G H I J K L M N O +// 0x50 P Q R S T U V W X Y Z [ \ ] ^ _ +// 0x60 ` a b c d e f g h i j k l m n o +// 0x70 p q r s t u v w x y z { | } →← +// 0x80 +// 0x90 +// 0xa0 。「」、・ヲァィゥェォャュョッ +// 0xb0 ーアイウエオカキクケコサシスセソ +// 0xc0 タチツテトナニヌネノハヒフヘホマ +// 0xd0 ミムメモヤユヨラリルレロワン゛゜ +// 0xe0 <---- 5x10 ギリシャ文字など ---> +// 0xf0 <---- 5x10 ギリシャ文字など ---> +// +// 0x00 〜 0x07 は 8文字の CGRAM で、0x08 〜 0x0f には同じものが見える。 +// 0x20〜0x7f と 0xa0〜0xdf までが 5x7 フォント、 +// 0xe0〜0xff は 5x7 フォントと 5x10 フォントが混在している。 +// 5x7 フォントは、メモリとしては 5x8 分(8バイト) を使用し、一番下のラインを +// 常に空白としておく (LCD の1行自体が 5x8 で構成されており、一番下が +// カーソル用に予約されているため)。 +// 一方 5x10 フォントのカーソルはこのフォントの一つ下に表示するので 5x11 +// フォントのうち一番下のラインがカーソル用とも言える。5x10 モードはサポート +// しないので、サイズを揃えるため上から 5x8 分のデータだけを保持することにする。 +// (5x10 モードをサポートする時になんとかすること) +// +// 空き領域が多いこと、どのみち CGRAM 部分を考慮する必要があること、それと +// もし 5x10 モードをサポートする場合には途中でライン数が変わることなどから、 +// フォントデータの取得は生データに直接アクセスさせるのではなく、1文字ずつ +// フォントデータのアドレスを返す方式にする。 + +// 文字コード ch のフォントデータ(の先頭アドレス) を取得する。 +// +// 連続する 8 バイトがフォントデータで、下位側(右側) 5ビットのみ有効。 +// 9バイト目が次の文字の1バイト目であることは保証していないので必ず1文字ごと +// に呼び出すこと。また CGRAM 領域のように動的に変化する場合もあるため +// 呼び出し側でこの読み出し値をキャッシュしないこと。 +const uint8 * +LCDDevice::GetFont(int ch) const +{ + // CGRAM 部分 + if (ch < 0x10) { + ch &= 0x07; + return &cgram[ch * 8]; + } + + if (ch < 0x20) { + return &CGROM[0]; // space + } + + // ASCII 部分 + if (ch < 0x80) { + return &CGROM[(ch - 0x20) * 8]; + } + + if (ch < 0xa0) { + return &CGROM[0]; // space + } + + // カナ以降 + return &CGROM[(ch - 0xa0 + 0x60) * 8]; +} + +/*static*/ const uint8 LCDDevice::CGROM[12 * 16 * 8] = +{ + 0b000'00000, // 0x20 space + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00100, // 0x21 ! + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00000, + 0b000'00100, + 0, + + 0b000'01010, // 0x22 " + 0b000'01010, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'01010, // 0x23 # + 0b000'01010, + 0b000'11111, + 0b000'01010, + 0b000'11111, + 0b000'01010, + 0b000'01010, + 0, + + 0b000'00100, // 0x24 $ + 0b000'01110, + 0b000'10100, + 0b000'01110, + 0b000'00101, + 0b000'01110, + 0b000'00100, + 0, + + 0b000'11000, // 0x25 % + 0b000'11001, + 0b000'00010, + 0b000'00100, + 0b000'01011, + 0b000'10011, + 0b000'00000, + 0, + + 0b000'01100, // 0x26 & + 0b000'10010, + 0b000'10100, + 0b000'01000, + 0b000'10100, + 0b000'10010, + 0b000'01101, + 0, + + 0b000'01100, // 0x27 ' + 0b000'00100, + 0b000'01000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00010, // 0x28 ( + 0b000'00100, + 0b000'01000, + 0b000'01000, + 0b000'01000, + 0b000'00100, + 0b000'00010, + 0, + + 0b000'01000, // 0x29 ) + 0b000'00100, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0x2a * + 0b000'00100, + 0b000'10101, + 0b000'01110, + 0b000'10101, + 0b000'00100, + 0b000'00000, + 0, + + 0b000'00000, // 0x2b + + 0b000'00100, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00000, + 0, + + 0b000'00000, // 0x2c , + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'01100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0x2d - + 0b000'00000, + 0b000'00000, + 0b000'11111, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0x2e . + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'01100, + 0b000'01100, + 0, + + 0b000'00000, // 0x2f / + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0b000'10000, + 0b000'00000, + 0, + + 0b000'01110, // 0x30 0 + 0b000'10001, + 0b000'10011, + 0b000'10101, + 0b000'11001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'00100, // 0x31 1 + 0b000'01100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01110, + 0, + + 0b000'01110, // 0x32 2 + 0b000'10001, + 0b000'10001, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0b000'11111, + 0, + + 0b000'11111, // 0x33 3 + 0b000'00010, + 0b000'00100, + 0b000'01110, + 0b000'00001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'00010, // 0x34 4 + 0b000'00110, + 0b000'01010, + 0b000'10010, + 0b000'11111, + 0b000'00010, + 0b000'00010, + 0, + + 0b000'11111, // 0x35 5 + 0b000'10000, + 0b000'10000, + 0b000'11110, + 0b000'00001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'00110, // 0x36 6 + 0b000'01000, + 0b000'10000, + 0b000'11110, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'11111, // 0x37 7 + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'01110, // 0x38 8 + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'01110, // 0x39 9 + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0b000'00001, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'00000, // 0x3a : + 0b000'01100, + 0b000'01100, + 0b000'00000, + 0b000'01100, + 0b000'01100, + 0b000'00000, + 0, + + 0b000'00000, // 0x3b ; + 0b000'01100, + 0b000'01100, + 0b000'00000, + 0b000'01100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00010, // 0x3c < + 0b000'00100, + 0b000'01000, + 0b000'10000, + 0b000'01000, + 0b000'00100, + 0b000'00010, + 0, + + 0b000'00000, // 0x3d = + 0b000'00000, + 0b000'11111, + 0b000'00000, + 0b000'11111, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'01000, // 0x3e > + 0b000'00100, + 0b000'00010, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'01110, // 0x3f ? + 0b000'10001, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'00000, + 0b000'00100, + 0, + + 0b000'01110, // 0x40 @ + 0b000'10001, + 0b000'00001, + 0b000'01101, + 0b000'10101, + 0b000'10101, + 0b000'01110, + 0, + + 0b000'01110, // 0x41 A + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'11110, // 0x42 B + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0, + + 0b000'01110, // 0x43 C + 0b000'10001, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'11100, // 0x44 D + 0b000'10010, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10010, + 0b000'11100, + 0, + + 0b000'11111, // 0x45 E + 0b000'10000, + 0b000'10000, + 0b000'11110, + 0b000'10000, + 0b000'10000, + 0b000'11111, + 0, + + 0b000'11111, // 0x46 F + 0b000'10000, + 0b000'10000, + 0b000'11110, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0, + + 0b000'01110, // 0x47 G + 0b000'10001, + 0b000'10000, + 0b000'10011, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'10001, // 0x48 H + 0b000'10001, + 0b000'10001, + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'01110, // 0x49 I + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01110, + 0, + + 0b000'00111, // 0x4a J + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'10010, + 0b000'10010, + 0b000'01100, + 0, + + 0b000'10001, // 0x4b K + 0b000'10010, + 0b000'10100, + 0b000'11000, + 0b000'10100, + 0b000'10010, + 0b000'10001, + 0, + + 0b000'10000, // 0x4c L + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0b000'11111, + 0, + + 0b000'10001, // 0x4d M + 0b000'11011, + 0b000'10101, + 0b000'10101, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'10001, // 0x4e N + 0b000'10001, + 0b000'11001, + 0b000'10101, + 0b000'10011, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'01110, // 0x4f O + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'11110, // 0x50 P + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0, + + 0b000'01110, // 0x51 Q + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10101, + 0b000'10010, + 0b000'01101, + 0, + + 0b000'11110, // 0x52 R + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0b000'10100, + 0b000'10010, + 0b000'10001, + 0, + + 0b000'01111, // 0x53 S + 0b000'10000, + 0b000'10000, + 0b000'01110, + 0b000'00001, + 0b000'00001, + 0b000'11110, + 0, + + 0b000'11111, // 0x54 T + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'10001, // 0x55 U + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'10001, // 0x56 V + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0, + + 0b000'10001, // 0x57 W + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10101, + 0b000'10101, + 0b000'01010, + 0, + + 0b000'10001, // 0x58 X + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0b000'01010, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'10001, // 0x59 Y + 0b000'10001, + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'11111, // 0x5a Z + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0b000'10000, + 0b000'11111, + 0, + + 0b000'01110, // 0x5b [ + 0b000'01000, + 0b000'01000, + 0b000'01000, + 0b000'01000, + 0b000'01000, + 0b000'01110, + 0, + + 0b000'10001, // 0x5c ¥ + 0b000'01010, + 0b000'11111, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'01110, // 0x5d ] + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'01110, + 0, + + 0b000'00100, // 0x5e ^ + 0b000'01010, + 0b000'10001, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0x5f _ + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'11111, + 0, + + 0b000'01000, // 0x60 ` + 0b000'00100, + 0b000'00010, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0x61 a + 0b000'00000, + 0b000'01110, + 0b000'00001, + 0b000'01111, + 0b000'10001, + 0b000'01111, + 0, + + 0b000'10000, // 0x62 b + 0b000'10000, + 0b000'10110, + 0b000'11001, + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0, + + 0b000'00000, // 0x63 c + 0b000'00000, + 0b000'01110, + 0b000'10001, + 0b000'10000, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'00001, // 0x64 d + 0b000'00001, + 0b000'01101, + 0b000'10011, + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0, + + 0b000'00000, // 0x65 e + 0b000'00000, + 0b000'01110, + 0b000'10001, + 0b000'11111, + 0b000'10000, + 0b000'01110, + 0, + + 0b000'00011, // 0x66 f + 0b000'00100, + 0b000'01110, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'00000, // 0x67 g + 0b000'00000, + 0b000'01111, + 0b000'10001, + 0b000'01111, + 0b000'00001, + 0b000'01110, + 0, + + 0b000'10000, // 0x68 h + 0b000'10000, + 0b000'10110, + 0b000'11001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'00100, // 0x69 i + 0b000'00000, + 0b000'01100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01110, + 0, + + 0b000'00010, // 0x6a j + 0b000'00000, + 0b000'00110, + 0b000'00010, + 0b000'00010, + 0b000'10010, + 0b000'01100, + 0, + + 0b000'10000, // 0x6b k + 0b000'10000, + 0b000'10010, + 0b000'10100, + 0b000'11000, + 0b000'10100, + 0b000'10010, + 0, + + 0b000'01100, // 0x6c l + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01110, + 0, + + 0b000'00000, // 0x6d m + 0b000'00000, + 0b000'11010, + 0b000'10101, + 0b000'10101, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'00000, // 0x6e n + 0b000'00000, + 0b000'10110, + 0b000'11001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'00000, // 0x6f o + 0b000'00000, + 0b000'01110, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0, + + 0b000'00000, // 0x70 p + 0b000'00000, + 0b000'11110, + 0b000'10001, + 0b000'11110, + 0b000'10000, + 0b000'10000, + 0, + + 0b000'00000, // 0x71 q + 0b000'00000, + 0b000'01111, + 0b000'10001, + 0b000'01111, + 0b000'00001, + 0b000'00001, + 0, + + 0b000'00000, // 0x72 r + 0b000'00000, + 0b000'10110, + 0b000'11001, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0, + + 0b000'00000, // 0x73 s + 0b000'00000, + 0b000'01110, + 0b000'10000, + 0b000'01110, + 0b000'00001, + 0b000'11110, + 0, + + 0b000'00000, // 0x74 t + 0b000'01000, + 0b000'11110, + 0b000'01000, + 0b000'01000, + 0b000'01000, + 0b000'00110, + 0, + + 0b000'00000, // 0x75 u + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10011, + 0b000'01101, + 0, + + 0b000'00000, // 0x76 v + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0, + + 0b000'00000, // 0x77 w + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10101, + 0b000'10101, + 0b000'01010, + 0, + + 0b000'00000, // 0x78 x + 0b000'00000, + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0b000'01010, + 0b000'10001, + 0, + + 0b000'00000, // 0x79 y + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0b000'00001, + 0b000'01110, + 0, + + 0b000'00000, // 0x7a z + 0b000'00000, + 0b000'11111, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0b000'11111, + 0, + + 0b000'00010, // 0x7b { + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0b000'00100, + 0b000'00100, + 0b000'00010, + 0, + + 0b000'00100, // 0x7c | + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'01000, // 0x7d } + 0b000'00100, + 0b000'00100, + 0b000'00010, + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0x7e → + 0b000'00100, + 0b000'00010, + 0b000'11111, + 0b000'00010, + 0b000'00100, + 0b000'00000, + 0, + + 0b000'00000, // 0x7f ← + 0b000'00100, + 0b000'01000, + 0b000'11111, + 0b000'01000, + 0b000'00100, + 0b000'00000, + 0, + + + 0b000'00000, // 0xa0 space + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0xa1 。 + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'11100, + 0b000'10100, + 0b000'11100, + 0, + + 0b000'00111, // 0xa2 「 + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0xa3 」 + 0b000'00000, + 0b000'00000, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'11100, + 0, + + 0b000'00000, // 0xa4 、 + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'10000, + 0b000'01000, + 0b000'00100, + 0, + + 0b000'00000, // 0xa5 ・ + 0b000'00000, + 0b000'00000, + 0b000'01100, + 0b000'01100, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0xa6 ヲ + 0b000'11111, + 0b000'00001, + 0b000'01111, + 0b000'00001, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'00000, // 0xa7 ァ + 0b000'00000, + 0b000'11111, + 0b000'00001, + 0b000'00110, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xa8 ィ + 0b000'00000, + 0b000'00010, + 0b000'00100, + 0b000'01100, + 0b000'10100, + 0b000'00100, + 0, + + 0b000'00000, // 0xa9 ゥ + 0b000'00000, + 0b000'00100, + 0b000'11111, + 0b000'10001, + 0b000'00001, + 0b000'00110, + 0, + + 0b000'00000, // 0xaa ェ + 0b000'00000, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'11111, + 0, + + 0b000'00000, // 0xab ォ + 0b000'00000, + 0b000'00010, + 0b000'11111, + 0b000'00110, + 0b000'01010, + 0b000'10010, + 0, + + 0b000'00000, // 0xac ャ + 0b000'00000, + 0b000'01000, + 0b000'11111, + 0b000'01001, + 0b000'01010, + 0b000'01000, + 0, + + 0b000'00000, // 0xad ュ + 0b000'00000, + 0b000'00000, + 0b000'11110, + 0b000'00010, + 0b000'00010, + 0b000'11111, + 0, + + 0b000'00000, // 0xae ョ + 0b000'00000, + 0b000'11111, + 0b000'00001, + 0b000'11111, + 0b000'00001, + 0b000'11111, + 0, + + 0b000'00000, // 0xaf ッ + 0b000'00000, + 0b000'10101, + 0b000'10101, + 0b000'00001, + 0b000'00001, + 0b000'00110, + 0, + + 0b000'00000, // 0xb0 ー + 0b000'00000, + 0b000'10000, + 0b000'01111, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'00000, // 0xb1 ア + 0b000'11111, + 0b000'00001, + 0b000'00101, + 0b000'00110, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00001, // 0xb2 イ + 0b000'00010, + 0b000'00100, + 0b000'01100, + 0b000'10100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'00100, // 0xb3 ウ + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0, + + 0b000'00000, // 0xb4 エ + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'11111, + 0, + + 0b000'00010, // 0xb5 オ + 0b000'11111, + 0b000'00010, + 0b000'00110, + 0b000'01010, + 0b000'10010, + 0b000'00010, + 0, + + 0b000'01000, // 0xb6 カ + 0b000'11111, + 0b000'01001, + 0b000'01001, + 0b000'01001, + 0b000'01001, + 0b000'10010, + 0, + + 0b000'00100, // 0xb7 キ + 0b000'11111, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0, + + 0b000'00000, // 0xb8 ク + 0b000'01111, + 0b000'01001, + 0b000'10001, + 0b000'00001, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'01000, // 0xb9 ケ + 0b000'01111, + 0b000'10010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00100, + 0, + + 0b000'00000, // 0xba コ + 0b000'11111, + 0b000'00001, + 0b000'00001, + 0b000'00001, + 0b000'00001, + 0b000'11111, + 0, + + 0b000'01010, // 0xbb サ + 0b000'11111, + 0b000'01010, + 0b000'01010, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xbc シ + 0b000'11001, + 0b000'00001, + 0b000'11001, + 0b000'00001, + 0b000'00010, + 0b000'11100, + 0, + + 0b000'00000, // 0xbd ス + 0b000'11111, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0b000'01010, + 0b000'10001, + 0, + + 0b000'01000, // 0xbe セ + 0b000'11111, + 0b000'01001, + 0b000'01001, + 0b000'01010, + 0b000'01000, + 0b000'00110, + 0, + + 0b000'00000, // 0xbf ソ + 0b000'10001, + 0b000'10001, + 0b000'01001, + 0b000'00001, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'00000, // 0xc0 タ + 0b000'01111, + 0b000'01001, + 0b000'10101, + 0b000'00011, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'00010, // 0xc1 チ + 0b000'01100, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xc2 ツ + 0b000'10101, + 0b000'10101, + 0b000'10101, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0, + + 0b000'01110, // 0xc3 テ + 0b000'00000, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'01000, // 0xc4 ト + 0b000'01000, + 0b000'01000, + 0b000'01100, + 0b000'01010, + 0b000'01000, + 0b000'01000, + 0, + + 0b000'00100, // 0xc5 ナ + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xc6 ニ + 0b000'01110, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'11111, + 0, + + 0b000'00000, // 0xc7 ヌ + 0b000'11111, + 0b000'00001, + 0b000'01010, + 0b000'00100, + 0b000'01010, + 0b000'10001, + 0, + + 0b000'00100, // 0xc8 ネ + 0b000'11111, + 0b000'00010, + 0b000'00100, + 0b000'01110, + 0b000'10101, + 0b000'00100, + 0, + + 0b000'00000, // 0xc9 ノ + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xca ハ + 0b000'00100, + 0b000'00010, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0, + + 0b000'00000, // 0xcb ヒ + 0b000'10000, + 0b000'11111, + 0b000'10000, + 0b000'10000, + 0b000'10000, + 0b000'01111, + 0, + + 0b000'00000, // 0xcc フ + 0b000'11111, + 0b000'00001, + 0b000'00001, + 0b000'00001, + 0b000'00010, + 0b000'01100, + 0, + + 0b000'00000, // 0xcd ヘ + 0b000'01000, + 0b000'10100, + 0b000'10010, + 0b000'00001, + 0b000'00001, + 0b000'00000, + 0, + + 0b000'00100, // 0xce ホ + 0b000'11111, + 0b000'00100, + 0b000'10101, + 0b000'10101, + 0b000'10101, + 0b000'00100, + 0, + + 0b000'00000, // 0xcf マ + 0b000'11111, + 0b000'00001, + 0b000'00001, + 0b000'01010, + 0b000'00100, + 0b000'00010, + 0, + + 0b000'00000, // 0xd0 ミ + 0b000'01110, + 0b000'00000, + 0b000'01110, + 0b000'00000, + 0b000'01110, + 0b000'00001, + 0, + + 0b000'00000, // 0xd1 ム + 0b000'00100, + 0b000'00100, + 0b000'01000, + 0b000'01001, + 0b000'10011, + 0b000'11101, + 0, + + 0b000'00000, // 0xd2 メ + 0b000'00001, + 0b000'00001, + 0b000'00101, + 0b000'00010, + 0b000'00101, + 0b000'11000, + 0, + + 0b000'00000, // 0xd3 モ + 0b000'11111, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00011, + 0, + + 0b000'01000, // 0xd4 ヤ + 0b000'01000, + 0b000'11111, + 0b000'01001, + 0b000'01010, + 0b000'01000, + 0b000'01000, + 0, + + 0b000'00000, // 0xd5 ユ + 0b000'01110, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'11111, + 0, + + 0b000'00000, // 0xd6 ヨ + 0b000'11111, + 0b000'00001, + 0b000'01111, + 0b000'00001, + 0b000'00001, + 0b000'11111, + 0, + + 0b000'01110, // 0xd7 ラ + 0b000'00000, + 0b000'11111, + 0b000'00001, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0, + + 0b000'00000, // 0xd8 リ + 0b000'10010, + 0b000'10010, + 0b000'10010, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0, + + 0b000'00000, // 0xd9 ル + 0b000'00100, + 0b000'10100, + 0b000'10100, + 0b000'10101, + 0b000'10101, + 0b000'00110, + 0, + + 0b000'00000, // 0xda レ + 0b000'10000, + 0b000'10000, + 0b000'10001, + 0b000'10010, + 0b000'10100, + 0b000'11000, + 0, + + 0b000'00000, // 0xdb ロ + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'11111, + 0, + + 0b000'00000, // 0xdc ワ + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'00001, + 0b000'00010, + 0b000'00100, + 0, + + 0b000'00000, // 0xdd ン + 0b000'11000, + 0b000'00000, + 0b000'00001, + 0b000'00001, + 0b000'00010, + 0b000'11100, + 0, + + 0b000'00100, // 0xde ゛ + 0b000'10010, + 0b000'01000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + 0b000'11100, // 0xdf ゜ + 0b000'10100, + 0b000'11100, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0, + + // ここから実際には 5x10 dot も混ざるが、現在はサポートしていない + + 0b000'00000, // 0xe0 α + 0b000'00000, + 0b000'00001, + 0b000'01101, + 0b000'10010, + 0b000'10010, + 0b000'01101, + 0b000'00000, + + 0b000'01010, // 0xe1 a‥(Latin Small Letter A with Diaeresis) + 0b000'00000, + 0b000'01110, + 0b000'00001, + 0b000'01111, + 0b000'10001, + 0b000'01111, + 0b000'00000, + + 0b000'00000, // 0xe2 β (10dot) + 0b000'00000, + 0b000'01110, + 0b000'10001, + 0b000'11110, + 0b000'10001, + 0b000'11110, + 0b000'10000, + + 0b000'00000, // 0xe3 ε + 0b000'00000, + 0b000'01110, + 0b000'10000, + 0b000'01110, + 0b000'10000, + 0b000'01110, + 0b000'00000, + + 0b000'00000, // 0xe4 μ (10dot) + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10011, + 0b000'11101, + 0b000'10000, + + 0b000'00000, // 0xe5 σ + 0b000'00000, + 0b000'01111, + 0b000'10010, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0b000'00000, + + 0b000'00000, // 0xe6 ρ (10dot) + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'00000, // 0xe7 g (10dot ver) + 0b000'00000, + 0b000'01111, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0b000'00001, + + 0b000'00000, // 0xe8 √(?) + 0b000'00111, + 0b000'00100, + 0b000'00100, + 0b000'10100, + 0b000'01000, + 0b000'00000, + 0b000'00000, + + 0b000'00000, // 0xe9 ^(-1) (?) + 0b000'00010, + 0b000'11010, + 0b000'00010, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'00010, // 0xea j (10dot ver) + 0b000'00000, + 0b000'00110, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + 0b000'00010, + + 0b000'00000, // 0xeb ^x (?) + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'00000, // 0xec ¢ + 0b000'00100, + 0b000'01110, + 0b000'10100, + 0b000'10101, + 0b000'01110, + 0b000'00100, + 0b000'00000, + + 0b000'00000, // 0xed L= (U+26c0 だろうか?) + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'00000, // 0xee n ̄(n マクロン?) + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'01010, // 0xef o‥(Latin Small Letter O with Diaeresis) + 0b000'00000, + 0b000'01110, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0b000'00000, + + 0b000'00000, // 0xf0 p (10dot ver) + 0b000'00000, + 0b000'10110, + 0b000'11001, + 0b000'10001, + 0b000'10001, + 0b000'11110, + 0b000'10000, + + 0b000'00000, // 0xf1 q (10dot ver) + 0b000'00000, + 0b000'01101, + 0b000'10011, + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0b000'00001, + + 0b000'01110, // 0xf2 θ(?) + 0b000'10001, + 0b000'10001, + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'01110, + 0b000'00000, + + 0b000'00000, // 0xf3 ∞(?) + 0b000'00000, + 0b000'01010, + 0b000'10101, + 0b000'10101, + 0b000'01010, + 0b000'00000, + 0b000'00000, + + 0b000'00000, // 0xf4 Ω + 0b000'01110, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01010, + 0b000'11011, + 0b000'00000, + + 0b000'01010, // 0xf5 u‥(?) + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10011, + 0b000'01101, + 0b000'00000, + + 0b000'11111, // 0xf6 Σ + 0b000'01000, + 0b000'00100, + 0b000'00010, + 0b000'00100, + 0b000'01000, + 0b000'11111, + 0b000'00000, + + 0b000'00000, // 0xf7 π + 0b000'00000, + 0b000'11111, + 0b000'01010, + 0b000'01010, + 0b000'01010, + 0b000'10011, + 0b000'00000, + + 0b000'11111, // 0xf8 x ̄(?) + 0b000'00000, + 0b000'10001, + 0b000'01010, + 0b000'00100, + 0b000'01010, + 0b000'10001, + 0b000'00000, + + 0b000'00000, // 0xf9 y (10dot ver) + 0b000'00000, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'10001, + 0b000'01111, + 0b000'00001, + + 0b000'00000, // 0xfa 千 + 0b000'00001, + 0b000'01110, + 0b000'00100, + 0b000'11111, + 0b000'00100, + 0b000'00100, + 0b000'00000, + + 0b000'00000, // 0xfb 万 + 0b000'11111, + 0b000'01000, + 0b000'01111, + 0b000'01001, + 0b000'01001, + 0b000'10001, + 0b000'00000, + + 0b000'00000, // 0xfc 円 + 0b000'11111, + 0b000'10101, + 0b000'10101, + 0b000'11111, + 0b000'10001, + 0b000'10001, + 0b000'00000, + + 0b000'00000, // 0xfd ÷ + 0b000'00000, + 0b000'00100, + 0b000'00000, + 0b000'11111, + 0b000'00000, + 0b000'00100, + 0b000'00000, + + 0b000'00000, // 0xfe space + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + 0b000'00000, + + 0b000'11111, // 0xff cursor + 0b000'11111, + 0b000'11111, + 0b000'11111, + 0b000'11111, + 0b000'11111, + 0b000'11111, + 0b000'11111, +};