画面下部に新しい文字を表示するには、ダブルバッファに文字を描画していく事は、前回のプログラムの流れで説明しました。



今回は如何に処理の負担を分散しながら新しい行を作成していくかについて説明します。


  • バッファをクリアする
文字数が多いと、当然描画には時間がかかります。また、バッファは前回の描画で文字表示などが残ったままとなっているので、それも消す必要があります。左端座標までスペースを表示する方法のほうが、トータルで描画数は少ないと思いますが、文字以外のエフェクトも表示することを考えると、一旦、バッファを全て消すことにします。

今回は文字の高さが12ドットあります。横幅は80バイトですから、バッファのサイズは960バイトもあります。1フレームで960バイトものサイズをゼロクリアは、どのような高速化を行っても重いのは目に見えていますので、処理を分散します。

処理は縦に12ドットスクロールする間に完了させる必要があります。言い換えると12回、新しい行を描画する呼び出しが出来るわけです。文字列の表示も分散するため、この 12回の呼び出しを最初の4回はバッファのクリア、残りの8回で文字列の描画と分けることにしました。バッファクリアに4回呼び出しがありますから、一度の呼び出しで960÷4 = 240バイトの消去で済みます。

少なくなったとはいえ、240バイトのゼロクリアですから、ここは最速の処理が必要です。そこでスタックを利用した以下のようなプログラムとしてみました。
Bufferクリア
HL にバッファの一番下のアドレス Buffer1.last があります。ここに DE オフセットを加算(実際にはマイナスの値を加算するため減算になります)します。DE を 0 として、PUSH DE を8回羅列する事で、16バイトのゼロクリアを行い、それを 15回ループとしています。16×15 = 240 となり、この処理部分で 240バイトのクリアとなります。
Bufferクリアを4回呼び出す
一度の呼び出しで 240バイトクリアを4回呼び出しますが、DE オフセットの値を -240, -480, -720 と変化させていくことで、4回で 960バイトをゼロクリアさせています。
KIOXIA(キオクシア) 旧東芝メモリ USBフラッシュメモリ 256GB USB3.2 Gen1 日本製 国内サポート正規品 KLU301A256GL
KIOXIA
2022-11-22
※ 小さくて持ち歩きやすく、いざというときのデータ保存に最適。ブランドは我が国の誇るキオクシア。どうせ買うならこちらですよねぇ。


  • 文字列を表示する
文字列表示は全部で最大8回呼び出されます。1行の横幅は80バイトです。そのため、一度の呼び出しで 80÷8 = 10バイトを描画すれば、どんな長い文字列でも表示できるはずです。ですが、10バイトですと、半角文字で10文字、全角文字で5文字を描画することになります。もう少し減らしたいので、現状でどうなっているかを探ります。これはコンバータで文字列のデータ変換をする際に最長文字列の調査をしておきます。
コンバーターの調査結果
一番左端の小さいのが 19、最大長さで最も右側に表示されるのが 61 とでています。ということは、文字列の最大長さとしては 61 - 19 + 1 = 43 文字で想定すれば大丈夫ということになります、43 ÷ 8 = 5.375 なので、一度の呼び出しで半角で 6文字描画すれば問題ないことが分かります。将来、この値は変わる可能性もありますので、定数定義して変更可能にしてしまいます。
最大同時表示文字数
文字の描画開始の前にカウンタをゼロクリアします。これは、現在文字をいくつ処理したかのカウントです。6以上になったら処理を中断してメインループに戻ります。
文字を表示する
文字表示は描画アドレス、描画範囲、文字数を適宜更新する必要があります。全角文字の場合は、横に2バイトの大きさとなりますので、以下のような処理になります。
全角文字の場合
描画処理はコメントアウトして、情報の更新部分だけ抜き出しています。この部分は少し冗長となってしまいますが、最適化する方法もないため致し方なしかと。次は半角の場合です。
半角文字の場合
この凄く単純です。この単純さがバグ発生の予防にもなると考えています。

※私が今この記事を書いているPCに採用しているキオクシアのM2.SSDです。速いです。安定してます。使ってて何の不安もないです。5年保証もあるので安心感が凄いです。2TBもあればだいたいOKですよねー

バッファに描いた新しい文字列を実際にGVRAMにコピーする方法はこちらで解説しています。