SHARP PC-1600KでCP/M80!その7

悩んでいたフォント問題

PC-1600Kへ移植しているCP/M80の続報だ!

今は表示系のプログラムを触っている。

先日のブログで「表示をどうしようか迷っている」という旨を書いていた。Twitterでも同様の嘆きをしていたら、なんとフォントを書いてくださった方が現れた!!しかも4x4ドット(下の空白いれたら4x5ドット)のサイズ!

 

自分のセンスでは絶対に描けないような、超イケてるフォントを作成してもらえたのは本当に助かる!(^O^) すぐに製作者へご連絡して、使わせてくださいとお願いした!

敬意と感謝の意を込めてこのフォントを「案山子フォント」と呼んでいる(^-^)

f:id:PocketGriffon:20210508222728j:plain

↑これがPC-1600Kへ実際に表示させてみた案山子フォント。

Mac上で作ったビットマップデータを、そのままPC-1600K上で「絵として表示」しているだけだ!(^^; 小さいながらもしっかりと読めることが分かるだろう。

 

f:id:PocketGriffon:20210508223121j:plain

↑こちらも「絵として表示」をしている、CP/Mが起動した時の想像図(^^)

f:id:PocketGriffon:20210508223325j:plain

↑こちらが実際に起動していたCP/M80の状態。↑の2つを比較しても、だいーぶ雰囲気が変わることが分かるだろう。

よし!だいぶモチベーションが上がった!(^-^)

 

CP/Mへ組み込む前に組み立ててみる

さて、使うフォントが決まったところでCP/Mへの組み込みをしていこう。

…と思ったけれども、今まで表示系は極力触らずにIOCSの機能を使う流れに徹していた。そのため、脳内で諦めていた事もたくさんあるのだ!

せっかくフォント系を組み込む事にしたので、脳内にあった構想を整理してみたい。

・フォント表示をどうやって実現しよう?

・仮想スクリーンを持ち80x24をサポートしたい

・仮想スクリーンの中をスクロールして自由に見てみたい

・全体を大雑把に把握出来る機能がほしい

エスケープシーケンスはどこまでサポートする?

ひとつずつ考えていってみる。

 

フォント表示をどうやって実現しよう?

まず今回採用したフォントを用いると、標準状態で26x4キャラクタという構成だった画面が、一気に39x6キャラクタとなる。画面中に表示出来るキャラクタ数は104 vs 234と倍以上だ!

f:id:PocketGriffon:20210508225119j:plain

↑の図は外枠が80x24の大きさ、そのうち黄色が標準フォントで見える範囲、赤が今回採用した案山子フォントで見る範囲だ。めちゃ広い!!これは是が非でも実現したい!(^0^)

だが…これをPC-1600Kで実現するにはいろいろとハードルがある。

 

PC-1600KのVRAMはオンメモリにはなく、表示させたいデータをいちいちLCDCへ送り込まないといけない。ROM内部でもスクリーン情報はメモリ内に保持しているが、実際の表示データはメモリ中に無く、その都度LCDCへ送り込む事で解決している(んだと思う)。

 

VRAMの構成は、縦8ドットが1バイト構成となっている。PC-1600K標準のフォントも横方向は6ドットとなっているが、縦は8ドット構成だ。ハード的にもとても理にかなっていると思う。ただし横方向も64ドット境界という問題があり、横6ドットはその点で少々面倒だ。

f:id:PocketGriffon:20210508225719j:plain

↑の図は…だいーぶ分かりづらいが、各行の文字を描画しようとした時、どっちに何ドットずれているのか…を示したモノだ。描画にはANDしてORすることが必要だが、その辺りを自分の中で分かるように図式にしてみたのだ(^^;

 

私はこんな感じに図を書きながらプログラムを妄想したりする。世のプログラマの多く(おそらく多く)は、コーディングし始めた時にはもう脳内でプログラミングが終わってる。そしてより慣れたプログラマであれば、完成時のコードサイズと実行速度もだいたい目処がついていて、そしてソレを外すことはまずない。

 

今回は増設メモリもあることなので、画面に表示すべきビットマップ情報をメモリ内に持つ事にする。スクリーン情報を元にビットマップ情報を書き換え、それをLCDCに転送する。効率その他は後から頑張ることが出来る構造にしておけば、動かす事に専念出来る。

よしこれで行こう(^-^)

 

仮想スクリーンを持ち80x24をサポートしたい

もうこれは個人的な趣味なのだが、CP/M上で動くいくつかのゲームは画面サイズが80x24以上あることを期待している。特にSTARTREKROGUEはそうで、この2つを動かしたいがためだけに80x24をサポートする事にした!(^^)

 

色情報やアトリビュート情報(太字、反転、アンダーラインその他)はサポートしない。アンダーラインはもしかしたらサポートしても良いかも知れないけど、フォントの上と下がくっついてしまうため文字の可読性が非常に悪くなる恐れがある。太字は無理だって!(^^;

 

そう考えると、メモリ中には80x24=1920バイトのエリアがあれば事足りる。ここで…ちょっと考えてみたが、せっかくなので横を256桁にして座標計算を簡単にしてみたい。24個のアドレステーブルを持てばいいだろう…とも思ったが、将来的にアセンブラ化した時のための布石にしたいので、ここは横256に拘りたい。

 

というわけで、スクリーン情報は256x24=6140バイト確保した。本来の容量の3.2倍だ!

 

仮想スクリーンの中をスクロールして自由に見てみたい

案山子フォントを使うことで画面上に39x6キャラもの情報量が表示されることとなるが、内部的には80x24の広大な(!)スクリーンが存在する。

大きなスクリーンの一部を覗く「のぞき窓」の役割をするのがPC-1600Kの液晶だ。…となると、のぞき窓を動かして全体を見たくなるだろう。むしろ見えないと広くした意味がない!

 

そこで、CP/M80実行中に[MODE]キーを押す事により、画面を自由にスクロールさせるモードに切り替える方式を考えた。つまりこんな感じだ。

f:id:PocketGriffon:20210508233402j:plain

↑これが初期画面。80x24の左上が見えている状態。

 

f:id:PocketGriffon:20210508233507j:plain

↑のぞき窓を右に動かしてやると、右側の見えていなかった情報が見える。

 

f:id:PocketGriffon:20210508233554j:plain

↑のぞき窓を下に動かすと、下側の情報が見える。

どの状態からでも[CL]を押すと、左上のポジションに戻れる。

これがソコソコの速度で動いてくれれば実用性は高いはずだ。

 

全体を大雑把に把握出来る機能がほしい

のぞき窓を使って動かしてみていたが、どうにも全体像が分かりづらい。

ものすごーく大雑把で良いので「画面全体はこんな感じになってる」というレイアウトが表示されると助かるなぁ…と思った。

f:id:PocketGriffon:20210508233842j:plain

↑というわけで作ってみたのがこちら。

こんな感じに、80x24の領域の文字が置かれている部分のドットが点灯する。この状態では文字が読めないが、なんとなくあそこにこんな情報、こっちにこんな情報というのが想像出来るだろう(^^)

 

これを「ビューモード」と名付けて、上記ののぞき窓モードからいつでも呼び出せるようにしたら使いやすそうだ!

 

エスケープシーケンスはどこまでサポートする? 

エスケープシーケンスとはなんぞや…という説明まで書き始めると大変なので、ここでは画面に表示されるテキストを制御する便利なモノ…くらいに捉えてくれたらだいたいあってる。

 

サポートする端末はVT100を基準として考えようと思う。以前、CP/Mエミュレータを作った時に、なんとなくSoroc基準で作っていたら、いくつかの動かないソフトが出てきてしまい、途中からVT100に変更するという疎き目にあった(^^;;

 

ただVT100の全部をサポートするのは億劫だし、PC-1600K用CP/M80では意味のないコードも存在する(太字とか無理だってば!(^^;;) そこで必要なものを最低限のみ実装する方式にする。

STARTREKは制御コード($00〜$1F)があれば動くらしい。問題はROGUEだな…。

実装していないエスケープシーケンスが来たら、その旨を表示して停止するようにしておけば、対応も早そう。

よし、エスケープシーケンスの実装もなんとなく決まった!

 

作ってみるよ!

さて、ここまで材料が揃えばあとは作るのみだ!

 

実は上の写真の一部は、実際に動いてるところを撮影している。開発速度を高めるために、いきなりCP/Mへ組み込むことはせず、単独で動くようにしている。

 

メモリは贅沢にも増設メモリの1バンク分(16KB)を充てがうことにした。でも大きなスクリーンやらビットマップやらを保持するので、そこまで余裕があるわけではない。

 

実機で動かしてみたら…想像していた通りの重さ(しかも激重!)になった(^^;; 回避方法も考えてはあるけれども、まずは安定動作が先!ちゃんと動くようになったら、楽しい楽しい高速化をしてみようと思う!そこまでまずはたどり着かねば(^^;;

 

実は今、私生活で大変な状態になっているので、あまりCP/M80の開発に時間が掛けられないでいる。ちょこちょこTwitterなどで情報を流していくので、気長にお待ちくだされ(^^)

 

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