--- nono/vm/lcd.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/lcd.cpp 2026/04/29 17:04:39 1.1.1.4 @@ -1,17 +1,22 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// LCD (HD44780) // #include "lcd.h" -LCDDevice *gLCD; +std::unique_ptr gLCD; LCDDevice::LCDDevice() { logname = "lcd"; devname = "LCD(HD44780)"; - monitor.Init(16, 2); + monitor_size = nnSize(67, 3); } LCDDevice::~LCDDevice() @@ -24,6 +29,7 @@ LCDDevice::PowerOff() // オフをどう表現するかはあるが、とりあえずモニタ画面での表示を消すのが // 主目的なので空白で埋める。 memset(ddram, 0x20, sizeof(ddram)); + update++; return true; } @@ -71,7 +77,7 @@ LCDDevice::Read() // +---------------- ビジーフラグ %1=BUSY // XXX ビジーは未実装 - return addr; + return (addr & 0x7f); } else { putlog(0, "未実装データ読み込み"); } @@ -87,12 +93,13 @@ LCDDevice::Write(uint8 data) } if (rs == 0) { // コマンド書き込み + if ((data & 0x80)) { - addr = data & 0x7f; - putlog(1, "DDRAM アドレスセット $%02x", addr); + addr = data; + putlog(1, "DDRAM アドレスセット $%02x", addr & 0x7f); } else if ((data & 0x40)) { - putlog(0, "コマンド書き込み $%02x CGRAM アドレスセット(未実装)", - data); + addr = data; + putlog(1, "CGRAM アドレスセット $%02x", addr & 0x3f); } else if ((data & 0x20)) { // ファンクション・セット // 0x38 (8ビットバス、2行表示、8ライン/行)モードのみサポート @@ -114,49 +121,1894 @@ LCDDevice::Write(uint8 data) // XXX 表示シフトは未サポート } else if ((data & 0x02)) { // カーソルホーム - addr = 0; + addr = 0x40; } else if ((data & 0x01)) { // 表示クリア memset(ddram, 0x20, sizeof(ddram)); - addr = 0; + addr = 0x40; + update++; } else { // $00 が書き込まれるんだけど、データシートにはないんだよね。 // 無視していいかな。 putlog(2, "未定義書き込み $%02x", data); } } else { - putlog(1, "データ書き込み $%02x (x=%2d,y=%d)", data, - (addr & 0x3f), (addr / 0x40)); - ddram[addr] = data; + if ((addr & 0x80)) { + putlog(1, "DDRAM データ書き込み X=%d Y=%d <- $%02x", + (addr & 0x7f) % 0x40, (addr & 0x7f) / 0x40, data); + } else { + putlog(1, "CGRAM データ書き込み $%02x <- $%02x", addr & 0x3f, data); + } + ram[addr] = data; + update++; // アドレス更新 - // 1行0x40バイト分あるが実際には0x27までしか存在していない + // DDRAM は各行 0x27 までしか存在していないが、stride が 0x40 バイト。 + // XXX CGRAM が折り返すかどうかは分からないがそのまま DDRAM 領域に + // 行っても困ると思うのでとりあえず。 if (addr_inc) { addr++; - if (addr == 0x28) + if (addr == 0x80) // CGRAM (XXX) addr = 0x40; - if (addr == 0x68) - addr = 0; + else if (addr == 0x80 + 0x28) // DDRAM 1行目 + addr = 0x80 + 0x40; + else if (addr == 0x80 + 0x68) // DDRAM 2行目 + addr = 0x80 + 0; } else { addr--; - if (addr == -1) - addr = 0x67; - if (addr == 0x3f) - addr = 0x27; + if (addr == 0x3f) // CGRAM (XXX) + addr = 0x7f; + else if (addr == 0x7f) // DDRAM 1行目 + addr = 0x80 + 0x67; + else if (addr == 0x80 + 0x3f) // DDRAM 2行目 + addr = 0x80 + 0x27; } } } -bool -LCDDevice::MonitorUpdate() +// PIO1 からのピーク用 +uint8 +LCDDevice::Peek() const +{ + if (en == false || rw == false) { + // XXX どうなるんだろ + return 0xff; + } + if (rs == 0) { + // XXX ? + return (addr & 0x7f); + } else { + // データ読み込みは未実装 + } + return 0xff; +} + +void +LCDDevice::MonitorUpdate(TextScreen &monitor) { char buf[17]; + // 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| + monitor.Clear(); + monitor.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++) { + monitor.Print(x * 3 + (x / 8), y + 1, "%02x", buf[x]); + if (buf[x] < 0x20 || buf[x] > 0x7e) { + buf[x] = '.'; + } + } + monitor.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=(?) + 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, +};