PC-98 ハイレゾ機種専用お絵描きソフト作成

タグ: #PC-98  #release 

以前「PC-98 ハイレゾ専用プログラムを作るというのは面白い事だと思う」といったことを書いたので、実践してみた。 ハイレゾ専用という条件から、題材は自然と画像関係に傾き、お絵描き用のソフトウェアを作ることにした。 ここのところ暫く作業を行って、機能はまだ少ないが最低限取り敢えずの絵を描けるようになった。

取り扱える画像の解像度はノーマルモードと同じ 640 × 400 固定とした。 ハイレゾ解像度の画像はノーマルモードでは全体を一度に表示できないし、解像度を可変にするのは正直実装が億劫でバグりそうだったのでやめた。 また、上側と下側の 2 つだけとはいえ、レイヤ機能を実装しようと思っていたが、ハイレゾ解像度だとコンベンショナルメモリが足りないのだった。 レイヤを、4 プレーンの画像データ 2 組と、上のレイヤの透過判定用 1bpp マスクで実装する場合 9 プレーン必要になる。 ハイレゾ 1 プレーンが 1120 * 750 / 8 = 105000 ≒ 102.5 KiB バイトなので、9プレーンなら 900 KiB を超えてしまう。

画面構成はやや悩んだ。 ハイレゾ解像度がノーマル解像度の 2 倍以上あれば、640 × 400 を常時 2 倍拡大表示した状態を基本の状態として色々実装すればいいと思えたのだが、実際のところ 2 倍未満の 1120 × 750 なのでそうはいかない。 結局画面の左上 960 × 608 ドット(ノーマル解像度のほぼ 1.5 倍)の領域を描画領域として、残りの領域にパレットやマスク等各種の UI を常時表示することにした。 また、画像の表示は、描画領域の一部に 640 × 400 を等倍表示するか、全体を一部切り抜いて 2 倍拡大表示するか切替可能にすることにした。

更に、EMS メモリを用いた undo 機能を付けようと思っていた。 が、やっぱ色々大変に思えたので、妥協して、ユーザが明示的に「復元ポイント」として現在の画像データを登録して、後でその登録した画像を 1 つ選んで画像データを復元できる機能になった。 これだけだと、マルペの fix とあまり変わらないので、復元ポイントは 8 個まで登録できるようにした。

その後は、TODO リストを作って、ガシガシ実装するだけとなった。

実装の話というと、EGC は 2 倍拡大表示時の表示範囲変更の際 VRAM 上のデータをブロック転送するのに使っているくらいで、結構 GRCG を使っている。 これは、GRCG の方が機能が単純で使い易かったので、実装の進捗優先で GRCG を多用したことによる。 また、これも実装優先で、描画の実態が 1 ドットの点描処理の複数回呼び出しになっている箇所がちょくちょくある。 EGC の word アクセスも GRCG の byte アクセスも点描ならばメモリアクセス回数は変わらないし、byte データで処理すればレジスタにも余裕ができるので GRCG を使っている。 今後、塗りつぶしの実装等では EGC の活用場面がまだあるだろう。

UI は、マルペや PST を使ったことがあったため、あんまり独自性を出して取っ付きが悪くなるよりは良いと思い、パレットとマスクの部分はそれらをリスペクトした感じになった。 これからの実装方針は未定(というかこれまでも行き当たりばったり)なので、追加の UI がどうなるかあまり確証のあることは言えないが、既存 UI に引っ張られるだろうから、現状の延長線上の雰囲気からは大きく外れない気はする。

振り返って、ハイレゾ専用プログラムを書くのが面白かったかというと、今回の作業内容ではハイレゾ機固有のローレベルな機能の利用といったことは殆どしていない。 そのため、個人的には、VRAM へのアクセス方式がやや違うことを除けば、結局 8086 マシン上での DOS プログラミングの範疇という印象が強いのであった。 更に言えば、下回りの基本的な描画ルーチンが完成してしまえば、その先は大体 GUI プログラミングになってしまう。 それもリソースが足りない環境故に極力部分的な更新を要請される難儀なやつ。 そういうことで、今回の成果物は、存在については面白いと思うが、実装が面白かったかというと、どうだろうか。 まあ、規模が大きめのプログラムを書こうとしたら各部を抽象化して疎結合にするのが楽なので、進捗すればするほどハイレゾ味がしなくなってゆくのはちょっと考えれば分かる話だったな。 兎も角、乗りかかった船、ある程度機能が育つまでは付き合おうかと思っている。

作成したお絵描きソフトは HR11 のページ からダウンロードできます。


投稿一覧に戻るトップに戻る