概要 : 色と属性
←前頁 次頁→ ↑もくじ
ここでは主に、英語テキストモード(つまり DOS/V でない)と DOS/V の標準的な日本語モードでの属性(主に色)について説明してみます。
前置 : 色表現に関する歴史的経緯
まず、ビデオカードのハードウェアがどのように色を扱っているかについて、もろもろのレジスタの説明などを端折った、いたって基礎的な説明をします。
CGA
CGA は IBM PC 用としてはもっとも初期の部類に入るディスプレイアダプタ(ビデオカードの IBM 的表記)です。
最大色表現能力は16色で、青、赤、緑、高輝度の4ビットをデジタルデータとして専用ディスプレイに送り込む、という方法を取っていました(いちおう NTSC ビデオ出力もついていましたが)。
日本のパソコンにむりやりたとえると、8ビット時代の、FM-7 だの PC-8801(初代)に高輝度ビットをつけた、といったところでしょう。
属性(色)
||||
I R G B
||||
↓↓↓↓
モニタ
EGA
CGA に対して大幅な機能アップをはかったのが EGA です。
というより、CGA との互換性を内包したまったく別のビデオカード、と言えます。
EGA も CGA と同じようにデジタル形式でモニタへ信号を出力しますが、青、赤、緑をそれぞれ2ビットづつ、計6ビット用意することにより64色の色を出すことができます(専用モニタが必要)。
ただし、この64色は同時発色はできず、パレットレジスタに登録された16色分だけが表示できます。
つまり EGA では、CGA のように属性値がそのまま表示色になるのではなく、パレットレジスタの番号になるわけです。
パレットレジスタのエントリに書かれた値によって、実際の表示色が決定されます。
属性(色番号)
|
|4 bits
↓
パレットレジスタ
||||||
r g b R G B
||||||
↓↓↓↓↓↓
モニタ
VGA
現在のビデオカードの基本ともいえる VGA ですが、16色モードにおける色表現という点のみに着目すると、EGA のデジタル出力の先にさらにアナログ DAC をつけたものと見なせるでしょう。
EGA の6ビットの色出力が DAC カラーレジスタの番号になるわけです。
(うすうすお分かりかと思いますが、256色モードの場合はパレットレジスタを経由しません)
属性(色番号)
|
|4 bits
↓
パレットレジスタ
|
|6 bits
↓
DACカラーレジスタ
|| || ||
|R |G |B 6bits x 3
|| || ||
∨ ∨ ∨
D A C
| | |
R G B アナログ
↓ ↓ ↓
アナログモニタ
属性(色)
テキストモードでの属性
テキストモードの属性の意味は、以下のように技術解説書に書かれています。
bit 7 高輝度(背景)、もしくは文字のブリンク
6 赤(背景)
5 緑(背景)
4 青(背景)
3 高輝度(前景)
2 赤(前景)
1 緑(前景)
0 青(前景)
いちおうこのようになっていますが、この青、赤、緑、高輝度の関係は、前述した通り、パレットレジスタや DAC カラーレジスタの設定しだいでどうとでもなってしまうものです。
しかし、デフォルトの色設定は上記のものに準じている(これにより CGA との互換性を確保している)ので、レジスタを書き換えない限りはこの関係に従うことができます。
より現実に即した書き方をすれば、こうなるでしょう。
bit7〜4 背景色のパレット番号(※)
3〜0 前景色のパレット番号
※ bit7 は文字のブリンクに使われることもある。
デフォルト状態で、パレット番号に対応する色は以下の通り。
8番(灰色)のうっすらとした色づきがおわかりだろうか。
それにしても4番(赤)と6番(茶)の区別がつかないんですけど…
属性の bit7 が背景の高輝度を示すのか、それとも文字のブリンクなのかを判別する、すべてのビデオカードで共通の方法はおそらく存在しません。
CGA の場合は BIOS データエリアの値(0040:0065h の bit5)により間接的に調べられます(EGA や VGA の BIOS でエミュレーションされているのかと思ったら、必ずしもそうではないらしい)。
VGA では属性コントロールレジスタを直接読み出すことで調べられます(EGA で読み出せただろうか…)。
ハードウェアになるべく依存せずにすませるには「bit7 を使わない」という消極的解法がもっとも現実的といえるでしょう。
(とは言うものの、グラフィックモードと日本語テキストモードのときは高輝度、英語テキストモードのときはブリンク、と決め打ちしてもそれほど問題はでない気もしますが…)
拡張 CGA モードでの属性
ビデオモード 73h と 71h(V-TEXT)では、上記の色属性に加えて拡張属性を使用することができます。
拡張属性を使用した文字表示は int 10h, ax=1321h で、拡張属性の取得は int 10h, ax=1311h で行うことができます。
$DISP.SYS や JDISP.SYS では、擬似テキストバッファ中の拡張属性部分の値を直接取得、変更することも可能です(変更したあと、int 10h, ah=FFh で再描画する)が、スーパードライバーズ32では仕様上認められていません。
拡張 CGA 属性の詳細は以下の通り。
bit 7 アンダーライン
6 予約(リバース用に)
5 予約(ブリンク用に)
4 予約(透過用に)
3 縦罫線
2 横罫線
1 予約
0 予約
※「予約」の部分には 0 を設定します。
※アンダーラインは、前景色のパレット番号の色で描画されます。
※縦罫線は、文字セルの左端にタテの線として描画されます。
線の色はパレット番号 7(白)。
※横罫線は、文字セルの最上部にヨコの線として描画されます。
線の色はパレット番号 7(白)。
(以下、作成中)
←前頁 次頁→ ↑もくじ