ゆるく楽しむプログラミング

美咲フォントROMを作ってみた

メモリーに限りのあるArduinoで日本語を表示すべく、美咲フォントをEEPROMに書き込んで、美咲フォントROMを作ってみました。
EEPROMは 24FC1025 を使用します。 使用方法は 『I2C接続:1MBit EEPROM 24FC1025』 を参照。
表示デバイスにはSSD1306を使用しています。
※SSD1315でもそのまま使えます (多分:スクロール関係の命令が若干違うだけでホボ互換なので)

美咲フォント

Arduno用 美咲フォントデータを作る

FONTX ビットマップフォントデータからArduinoで使えるテキスト形式の定義情報に変換します。
FONTXはMS-DOS時代のフォントデータで、現在では、ほぼ使われていないようです。
FONTXからテキスト形式に変換するコンバータは存在しますが、MS-DOS(16Bit-OS)用でWidnows(32Bit/64Bit-OS)では動作しません。

FONTXのファイルフォーマットは▼のようになっています。

半角フォント

Offset Size フィールド内容
0 6 ファイル・シグネチャ("FONTX2")
6 8 フォント名
14 1 フォント幅 WF(ドット)
15 1 フォント高さ HF(ドット)
16 1 文字コード・フラグ(0:ANK)
17 ※1 フォントイメージ
(※1:フォントサイズ×256)

全角フォント
Offset Size フィールド内容
0 6 ファイル・シグネチャ("FONTX2")
6 8 フォント名
14 1 フォント幅 WF?(ドット)
15 1 フォント高さ HF?(ドット)
16 1 文字コード・フラグ (1:シフトJIS)
17 1 コード・ブロック数 NB
18 2 ブロック1開始コード コード・ブロック・テーブル
20 2 ブロック1終了コード (リトル・エンディアン)
14+4*NB 2 ブロックNB開始コード
16+4*NB 2 ブロックNB終了コード
18+4*NB ※2 フォントイメージ
(※2:フォントサイズ×各ブロックのコード数の総和)

これを読み出して ▼の書式で書き出すツールをVC++で作成
フォントイメージのアドレス  UTF16コード  フォントイメージ 
 0x0000~0xFFFF 0x0020~0xFFE5  未使用部分を削って7Byteに圧縮 

美咲フォントはMS-DOSなどのCRT表示を前提としたフォントなので、SSD1306とは表示の向きが違います。
なので、SSD1306で使いやすいように読み出し時に90度回転しておきます。
Windows等のディプレイと
SSD1306等のOLEDでは
表示の向きが違うので
SSD1306に合わせて
ビットデータを変換 


 FONTX2TEXT.zip ソースコード(VisualStudio2019)と実行モジュール(x86用)
※SJIS->UTF16コード変換にWinAPIを使用しているため、Windowsでしか動きません。

フォントデータをEEPROMに書き込む

UTF16文字コードの1バイト目をINDEXテーブルのテーブル番号のキーとし
2バイト目でFONTイメージのアドレスのINDEXテーブルのキーとします。

美咲フォントファイルの構造を▼のようにします。

ROM1(64KByteブロック)
0x0000

0x00FF 
INDEXテーブルのテーブル番号 256バイト 1~255の番号が入る。
実際には美咲フォントで使用されるUTF16の1バイト目は96種類しかないので
1~96の値が入る。
0は該当するINDEXが存在しない事を示す。※未対応文字になります
0x0100

0x01FF 
未使用 
0x0200

0x03FF
INDEXテーブル1
(UTF16コード1バイト目が0x00)
FONTイメージのアドレス
 
512Byte  フォントイメージのアドレスが入る 
INDEテーブル2 ・・・ INDEXテーブル95(表記省略)
0xC000

0xC1FF
INDEXテーブル96
(UTF16コード1バイト目が0xFF)
FONTイメージのアドレス
 
512Byte  フォントイメージのアドレスが入る  
0xC200

0xCFFF 
 未使用
0xD000

0xD03F 
半角カナ全角変換テーブル   64Byte 半角カナ全角変換テーブル
※容量あまったから入れてみた 

ROM2(64KByteブロック)
0x0000

0x0006 
フォントイメージ 7Byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //  
フォントイメージ 6929文字 x 7Byte
0xBD86

0xBD8D 
フォントイメージ  7Byte 0x00,0x2B,0x2C,0x78,0x2C,0x2B,0x00, // ¥



FONTデータの全部はArduinoに乗らないので、分割して書き込みます。
MISAKI.hの #define FONTxx のコメントを順番に外してコンパイル/実行

MakeKanjiROM-01.zip

日本語フォント表示

フォントの読み出し手順 例:'あ' UTF16コード 0x3042 の場合

1バイト目の0x30 をキーにして INDEXテーブルのテーブル番号 を取得します。
(1) ROM1のアドレス 0x0030 から1バイトを読み出し。 ※256バイトのテーブルなのでメモリー上に保持した方が良いです。
  -> 11が得られます
(2) INDEXテーブルのアドレスを求めます。
  -> 512 × 11 = 5632 = 0x1600 が得られます。
(3) FONTデータのINDEXアドレスを求めます
  -> 0x1600 + UTF16コードの2バイト目 × 2 = 0x1600 + 0x42 × 2 = 0x1684
(4) ROM1のアドレス 0x1684 から2バイト読み出し。 ※FONTデータのアドレスです。
 -> 0x074D が得られます。
(5) ROM2のアドレス 0x074D から7バイトを読み出し。
 -> 'あ' のフォントイメージが得られます。

得られたフォントイメージをSSD1306に書き出し。
※ SPI接続のSSD1306を使用しています。



KanjiFontDEMO-EEPROM3.zip

解説動画