PS/55のテキストカーソル重ね描画処理
テキストカーソルの表示は機種によって個性が出るので面白い。某巨大掲示板でApple II J-Plusのカーソル表示を見たが、あれはなかなか奇妙だった。
PS/55エミュのカーソル表示処理を直している時、文字の上にカーソルが来たときにどのように描画するか迷った。実機があれば早い話だが、J-DOSの表示に必要なCRTディスプレイが壊れて処分したので、もう確認できる環境がない。稼働していた当時に何枚か写真は撮っているが、テキストカーソルの重ね処理を確認できる唯一の資料はトップにある写真の通り。これだけでは、そもそも重ね処理かどうかも分からない。CRTの画面をきれいに撮影するためにシャッタースピードを長く取っているので、点滅の瞬間に撮影してこう見えている可能性も考えられる。
IBM PC系のテキストカーソルはどうかというと、VGAで最もよく使われるCGA英数(テキスト)モードでは、カーソル位置の属性で指定している前景色での点滅になる。
反転属性が付いている場合はカーソルの色が背景と同化するため、見た目は反転文字自体が点滅しているように見える。
これは単純にカーソル位置の属性を読み取って、垂直同期のカウントタイマーとの条件で文字ボックス全体に前景色を描画するだけなので、エミュレーターの実装としては非常に楽だ。
DOS/Vの場合、標準で使われるエミュレートCGA文字モードはカーソル位置のAPAとFFh(16進数)とのXOR演算による常時表示になる。この画面モードは見かけ上テキストだが実際はグラフィック画面に表示している為、点滅させるのは描画処理的に負担が掛かるということだろうか。常時表示とする代わりにXOR演算で反転表示できるのはグラフィックならではだろう。
PS/55の場合、テキストカーソルは常時表示と点滅のどちらも可能だが、デフォルトは常時表示となっている。しかも、カーソルはそれ単独で色を指定できる。カーソルの表示はグラフィックではなく、あくまで属性コントローラー上で処理されるので、DOS/Vのような演算は行っていないと予想できる。
カーソルを常時表示にした場合、CGAのように全面をカーソル色で上書きすると文字が見えなくなってしまう。そこで、文字色以外をカーソル色で上書きするようにする。
何と、写真と同じような画面が出来上がった。この処理を作るまで自信がなかったが、出来上がってみるととてもしっくり来るな。これに間違いないだろう。
しかし、ここで別の問題が生じる。文字色がカーソル色と同じ場合、文字が見えなくなってしまう。
この対策として、文字色がカーソル色と同じであれば反転表示になるような実装を入れる。
この処理、頭のイメージでは分かっているつもりだけども、実際に組もうとすると準備やら条件やらがごっちゃになる。黒の背景に白の文字があって、カーソルが白の時にカーソル部分を反転することはいいのだが、その文字に反転属性が付いたら白黒が入れ替わるので、それも考慮する必要がある。
一つのケースを満足させるのは簡単だが、三つのケースを同時に満足するように作るのは大変だ。