SMART Response XEを使う!その2

f:id:PocketGriffon:20211116175404j:plain

前回のブログで、SMART Response XEでプログラムを開発する準備が整った。

編集は外部のEmacsエディタ、ビルドと実機への書き込みはArduino IDE

ほんの少し前までは「これどうやるんだよ…」って感じの環境しかなかったのでモチベーションも上がらなかったけれど、ここまで環境が出来上がればコッチのもの!

なにはともあれ何か画面に表示させてみたい。

 

これまでSMART Response XEの解析をしてくれた方々が、素晴らしいライブラリを開発されていた。

GitHub - bitbank2/SmartResponseXE: Arduino library with LCD, Keyboard and SPI Flash support for the SMART Response XE classroom communicator

 

このSmartResponseXE.{cpp,h}を使わせてもらっている。

本来であればブート部分からプログラムを組まねばならないところを、このライブラリのおかげで相当ラクをさせてもらっている。

本当に感謝だ!(^-^)

 

画面にドットを打ちたいんだ!

この手のハードの多くはVRAMがLCDC側にあり、本体からはリニアに触れないものがほとんどだ。そして今回のXEも同じような構成になってる。

あんまり詳しい事は理解していないけれども…

・ドットを打つためにはデータを用意して…

・SRXESetPositionを呼び出して表示位置(と範囲)を確定し…

・SRXEWriteDataBlockを呼び出せば良い…

みたいだ。

単純明快!(^-^)

 

LCDはモノクロ4値のグレイスケール表示となっている。

普通に考えたら1ドット2ビット構成で、横4ドットが1バイトだろうか(^-^)

そう思って調べ始めたら……

……ちょっと待って(T-T)

 

f:id:PocketGriffon:20211116191752j:plain

………

f:id:PocketGriffon:20211116201034j:plain

3ビット3ビット2ビットの、1バイト3ドット構成!?

え?え?(@_@;;;

3ドット??

 

……どうやら図を見る限り、入力時は332の構成だけど、DDRAM(Display Data RAM)の中では222の構成になる……らしい?

あらやだなにこの変態構成!(^-^)

謎パーの本領発揮って感じでタマランです!!!

 

…いろんな情報の理解が及ぼないけれども……とにかく入力は332が必要みたい。

横3ドットという時点でなんとなく計算に除算が入りそうな気がするのと、ドット単位で動かそうとするのとかめちゃくちゃ大変じゃないのさ、これ…汗

 

もうひとつ面倒な問題が。

このXE、液晶の解像度が384 x 136ドットある。

この手のマシンはメモリにフレームバッファを用意して、そのフレームバッファを書き換えた後にLCDCへ転送…という方法で使いたいんだけど…困った事にメモリが足りない。

SRAMのサイズは16KB、横を3ドットとして計算すると384/3=128、縦が136なので128 * 136=17,408バイト。

16KB超えちゃうじゃないのさ…orz

 

仕方がないので…こんな感じの構成にしてみた。

やはりドット構成は2ビット1ドット、つまり1バイト4ドットの考え方が使いやすい。

これならば384/4=96、136 * 96=13,056バイトでSRAM容量に収まる。

作るモノによっては画面全体をバッファする必要のないものが多いと思うので、その場合は適宜サイズを小さくすれば良い。

MAXで必要なのが12.75KB、と考えたらそこまで無茶じゃないかも?

 

そして横2ドット構成のフレームバッファを、表示する際にデータをDDRAMフォーマット(上記の332)に変換しながら転送してやればどうだろう…。

データ加工の利点は計り知れないと思うので、あとの問題は速度かな。

 

実際にそれで試してみた動画がコレ↓。

……思ったよりも速くない?!(^-^)

 

4ドット(1バイト)単位の横スクロール、ランダムサイズの矩形を描画、全画面再描画をしてこの速度。

コンパイラの最適化はしているけれど、アルゴリズムの最適化も何もしてない状態!

これは……なんとなく行ける予感(^-^)

 

いくつか表示実験をしてみる

メモリ上のフレームバッファにデータを書き込むことで絵が表示出来るようになった!

せっかくなので、なにか意味のある絵を出してみたい。

 

というわけで、私としてはワンパターンな花札こいこいの絵を表示してみた!

f:id:PocketGriffon:20211116211035j:plain

f:id:PocketGriffon:20211116211053j:plain

花札のカードデータは、工学社から発売されていたI/Oに掲載されていたMZ-80B用のゲームソフトからお借りした。MZ-80B用ということで、色は白黒の2色データだ。

液晶が繊細なせいか、とってもキレイに見える!

 

カードデータは32 * 48ドットのサイズで48枚あり、1枚が192バイトなので9,216バイトある。サイズ的にSRAMには載せられないのでFLASHに置いた状態にしつつ、必要に応じて1バイトずつ読み込んでいる。それでも十分な速度で表示してくれるのは頼もしい!

 

f:id:PocketGriffon:20211116211658j:plain

f:id:PocketGriffon:20211116211715j:plain

こちらは日本語表示テスト。

漢字ROMは、昔PC-8801MCから吸い出したものを利用させていただいた。

面倒なので漢字ROM全体をFLASHに置きたかったが、あいにくFLASHメモリのサイズは128KBしかなく断念。

テキストデータの中に含まれている文字データのみを抜き出してデータ化した。

こういうちまちましたツールを作る作業は面倒だけど大好きだ!(^^)

 

というわけで、フレームバッファに絵を描く事は出来るようになった!

今のところ、CPUの速度に助けられているところが多いけれど、AVRというCPUはどんなコードで動いてるんだろう…。

興味がそっち方面へ行きつつあるので、脱線しつつももう少しだけ触ってみたい。

X68000もMZ-2500も中途半端になっているので、近々戻らないとw

#マシンをセッティングしたままなので場所がない…汗

 

それではまた次回!(^-^)ノ