文豪ミニ5でプログラミング! その2

文豪で…というよりはV33で…というか8086でというか(^^;;

なんとなく高速化ネタを思いついてしまったので、私にしては珍しく初期段階での高速化プログラミング。まぁ趣味の世界だからいーのよw

 

f:id:PocketGriffon:20210311104518j:plain

文豪はテキストVRAMを持たない表示構成なので、文字フォントを表示させようと思ったらドット単位(実際には8ドット単位)で点を打っていく必要がある。まだフォント周りの解析なども一切進んでいない。表示されているこのフォントは、プログラムファイルにデータとして含んでいる。

 

画面構成は640x400ドットとなっていて、色を出すためには3つのプレーンに同じデータを書き込む必要がある。この辺りはPC-8801PC-9801を想像してもらえれば良いだろう。3プレーン同時書き込みとかALUのデータコピーなどの機能は無い(と思う)ので、地道にバンク切り替えて書き込むというオーソドックスなパターン。

 

開発&解析の初期段階なので、極力プログラムに労力は掛けず、全てC言語で記述することで開発効率を上げる方向に振っていた。スタックポインタの初期化などどうしても避けられないところはインラインアセンブラで記述していたが、アセンブラの使用はその程度だ。

 

先日までの作業で、ようやくメモリダンプが動くようになり、8086で使用できる1MBのメモリ内容が見られるようになった。そこでやっと「自分自身がロードされているアドレス」を知ることが出来たw それまで手探り状態だったのでちょっとスッキリ!何をするにも仮説を立て「多分こうだろう」と想定してプログラミングしていた事が、実際に実証されていく過程がとても楽しい!(^^)

 

ダンプ表示はカーソルキーでアドレスとセグメントを変化させていく事が出来るようにしてあるけど、キーリピートの速度に表示が追いつかなくて、少しもたもたした表示になってた。出来る限りC言語で高速に描画出来るようにプログラム書いてたけど、いくらV33 16MHzとしても限界かなー。

 

ふと…「そうか、1文字のフォントデータは8バイト(一番下は空白なので7バイト)しか無いから、先にデータを全部レジスタに読んでおいたら各バンクへ書き込みだけで済むなぁ」なんて思った。思ってしまったらアセンブラで書きたくなって仕方がないw

 

具体的な方法

ここに8086(V33)のプログラムを掲載するのもアレなので、日本語で書いてみる。

考え方としては、レジスタマシンである8086でメモリをアクセスするのは時間が掛かるので、必要なフォントデータ(同じデータを最大3回書く)をあらかじめレジスタにロードしておいて、メモリをアクセスする回数を減らしてみよう、という作戦だ。

同時にセグメントレジスタの管理も簡単になるため、全体的に高速化されるハズだ。

 

幸い8086にはレジスタが豊富にあるため、レジスタの使い回しに困る事はなかった。DI、SI、ES、DL(合計7バイト)をデータ保持用レジスタとしてプログラムを組んでみた。VRAMのアクセスをする際にはDSを固定する事ができ、ループ展開で一気にVRAMへ書き込んでやる。これをバンク切り替えしながら3プレーンに書き込めば良いのだ。

 

この作業と同時に、書き換えるべきデータが前回と同じだった場合には描画をパスするようにした。PC-8801などで良く使うテクニックだw

これらの作業をしたおかげで、ストレスなくメモリダンプが行えるようになった!無駄にスクロールさせちゃうよw

 

高速化された事に気を良くして、リアルタイムにダンプ表示を行えるようにもしてみた。こうする事のメリットは、割り込みなどで書き換えられるワークエリアを簡単に探し出す事が出来る事だ。キー入力があった時にどこのメモリのどのビットが1になる…なんてのもすぐに探し出せる。高速表示が可能だからこそ出来る技だ(^-^)

 

ところで……LSI C-86(試食版)でアセンブラを使うプログラムを初めて書いたかもしれない。書き方がMASMなどと違っていて最初は面食らったけど、そこはコンパイラが出力するアセンブラリストが参考になるので特に困らなかった。

 

V33はシフト回数が指定できるので、なんとなく8086では出来ない「SHL BX,3」(BXの値を8倍にする)などと書いてみたが、これがうまくアセンブル出来てしまう。あれ?このアセンブラは80186の命令も解釈してくれるんだ…と思っていたが、実際に出力されたコードを見てみると「SHL BX,1」が3つ出てたw

 

今回のプログラムはループの外にあるコードだったのでこのままにしたが、どうしても気になるならばDB列でマシン語コードを書いてやれば良いかなーと思った。

f:id:PocketGriffon:20210311130534j:plain

 

何をするにも1行書いては試してみる…という様子を見ながら書いていく状態が過ぎ、ようやくまとまったプログラムを書いても大丈夫になってきた。ここまで来るのが本当に大変w

慌てず騒がず落ち着いて取り組んでいくよ!(でもやりたくて仕方ないw)

 

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