普通の VGA メモリマップは 0xA0000 から始まる 64k です。64k より大き なメモリにアクセスするには、``バンク切り替え機能(bank switching)'' - 高位のアドレスビットをメモリのバンク選択に使うような操作に置き換 える機能を実現しているSuperVGA チップセットが必要です。サイズと数の バンクは変化し、その名称はチップセットの資料に記載されています。チッ プセットはバンクレジスタ無しか一つか二つのバンクレジスタを持ってい ます。バンクレジスタなしの場合は generic な VGA *だけ* ですので、関 係ありません。
新しいチップセット(例えば Trident 8900CL, Cirrus製)はビデオメモリ をリニアに割り当てる事が出来る事に注意してください。このやり方を使う 場合はサーバの性能を向上させますが、現在はサポートしていません。故 に新しいチップセットのこの機能は使用出来ません。
殆どの SVGA チップセットは二つのバンクレジスタを持っています。デー タを画面のある領域から他の領域に単純に 'mov' 命令で移動出来るので 非常に望ましい構造です(どんなバンク構造も ``望ましい'' と呼んでい ます)。二重化バンキング(dual-banking) は二つの方式があり、一方は 読み込み専用バンクと書き込み専用バンクの二つのバンク操作で、もう一 方は二つの書き込み/読み込み兼用窓です。最初の方式は全ての SVGA メ モリ窓を読み込みと書き込み両方に使い、二つのバンクレジスタはどちら のバンクを実際に使うのか(例えばET3000, ET4000 では)決定するのに 使用しています。二番目の方式では SVGA メモリ窓を読み込み/書き込み 可能な二つのバンクに分けどちらかのバンクポインタが一つの窓を制御す るようになっています。この場合一つの窓が読み込み操作を行うときは他 の窓が書き込み操作を(例えば PVGA1/Western Digital, Cirrus では)行 うようになります。
単一のバンクレジスタを持っているチップセットは一つのバンクへの読み 込みと書き込みの両方のアクセスを行います。画面の一部の情報を他の部 分へコピーする事はデータを読み込み、蓄え、それから書き出すという手 順が要求されるため困難です。幸運にも、サーバは一つのバンクのチッ プセットと二つのバンクのチップセットの両方を扱え、その挙動を次に説 明するドライバデータ構造の項目定義で決定します。
ドライバには`sdc_bank.s
' ファイル内の三つのアセンブラ言語
で書いてある関数が必要です。
これらの関数はバンク読み込み設定 - SDCSetRead(),
バンク書き込み - SDCSetWrite() と 両バンク設定 -
SDCSetReadWrite() です。
一つのバンクだけのチップセット用に三つ全ての関数の入り口点を同じ関
数に宣言できるでしょう(``tvga8900'' ドライバを例として参照してくだ
さい)。
関数はかなり単純で - バンク番号を関数の %al レジスタへ渡し、 関数はシフトやビットマスク等行い正しい形式でバンク番号をレジスタヘ 保存し、正しい I/O ポートへ書き込みます。二つのバンクが読み込み専 用と書き込み専用になっているチップセットの場合、一回づつ各々のバン クに、計二回 SetReadWrite()関数を実行する必要があります。 二つの独立な読み込み/書き込み窓になっているチップセットの場合、 SetReadWrite() 関数を SetWrite() 関数の代わりに 同じバンクに実行するべきです。
特別な注意として、これらの関数は ``assyntax.h'' ファイルに定義して いるマクロアセンブラの書式で書く必要があります。これは OS に関係な く正しいアセンブラコードを生成することを保証する為です。現在、この マクロ形式は USL, GNU と インテルのアセンブラの書式をサポートしてい ます。
以上がバンク機能に関する作業です。普通、チップセットの参考書がこの プログラムの例題を掲載していますが、そうでない場合でも他のドライバ の例を用いれば想像するのは難しくはありません。