2009/09/26(土)グラフィック液晶用フォント

先日から弄って遊んでいるデジットジャンクLCDですが、漸く落ち着いて今のところは、
・ATMEGA644P@8MHzにて、右半分の表示を捨てれば何とか許せる描画スピード
・画面左半分でテトリス作って遊ぶ
ところまでやって色々試しています。グラフィック液晶を使う上ではやはり、VRAM描画の部分の最適化やプログラム的に利用するときの使いやすさも重要になってきます。
命名は自己流ですが、ドットを打つPSET関数、線を引くLINE関数、円を書くCIR関数、文字を書くFONT関数などのことです。で、自分は、実力不足でPSETしか実装していません。何せ、VRAMが164x64ドット / 8bit = 1024byte なのですが、ビット演算盛りだくさんで処理しているし(かなりてこずった)、線や円なんてどうやって処理を作るか、最適化するか…自分にはまだ勉強するところが多い。orz
で、できる機能でかつ実用性あるのがFONT命令かなと思うし、これならいけそうです。文字が打てるとテトリスのスコア表示とかできるし色々用途も広がります。

先にも書いたように、現在のスペックでは画面を左半分しか使いません。つまり64x64ドットです。さらにゲーム画面として32x64は使用済みです。残るのは32x64、横幅32ドットで以下に良い感じに文字を表示するかです。ここでは、表示文字をローマ字の大小+数字+記号に絞り込みました。キャラクターコードで言うところの0x20~0x7Fです。そして、1文字あたりのサイズですが、プログラム的にきりの良い1byte(8ドット)を横幅にすると4文字しか入りません。そこで1byteの下位3ビットを捨てて5ビット(ドット)にしました。高さも8ドットは縦に長すぎるので7ドットに絞り込み、そうしておいて、
・5x7ドットサイズのフォント
・1列あたり1byte消費(下位3bitは無視)
・1byte x 縦7ドット = 7byteで1文字
・文字の隣接防止のため右1ドットは出来るだけ使わない
と設定しました。こうすることで32x64ドット内にびっちり詰めれば6文字 x 9行 = 54文字表示できる計算です。安直に8x8フォントだと32文字で1行4文字であまりにもきつ過ぎるので、それから比べればかなり良い結果になりそうです。

で、構想は出来ましたが肝心のフォントを製作しないと意味がありません。というわけで早速Excelのマス目を利用して地道に書いてHEXデータも見ながら全て手計算しました。本当はExcelのマクロなどでHEXデータは出せばよいかもしれません。というか、そのほうが早かったかも…。
5x7_font.png

ざーっとは綺麗にいけたかな?と思っています。あとは、コレをプログラムヘッダーファイルに適用させて、関数書いて、いざ表示テストして…結構先は長そう。でも、フォントデータって別に転用できるし秋月のグラフィック液晶使うときなどにも役立ちそう。