非常に興味深い投稿です。私は古いハードウェアもとても好きです。
当時、メモリ コピーを使用して画面バッファをスワップするのは非常に遅く、メモリのコピーを開始するために垂直リトレース期間を待たなければならなかったことは言うまでもありません。(最低限の VGA カードを持っていたので、ハードウェアが優れていて、遅延が許容範囲を超えている可能性があります)。
興味のある方は、Michael Abrash のMode-Xコラムを読むことを強くお勧めします。
Mode-X とその派生物は、Michael Abrash によって最初に文書化された代替グラフィック モードです。基本的に、これらは 256 色 13H モードへのハックであり、VGA カードのいくつかのレジスタを微調整することで有効にすることができました。
アクティブ化すると、次の 2 つの大きな利点がありました。
- 4 ページの表示メモリ
- Square Pixels (元の ModeX では 320x240)、(プロットされた円は楕円ではなく円のように見えます)
ダブルまたはトリプル バッファの実装は非常に簡単でした。非アクティブ バッファに直接書き込み、それをアクティブにするには、VGA カードのレジスタを変更するだけで済み、memcopy はまったく必要ありませんでした。(まだ垂直リトレースを待つ必要があります。そうしないと、醜いちらつきが発生します)
欠点は、このモードのプログラミングが難しいことです。基本的にモード X では、1 つのメモリ アドレスが 4 つの連続するピクセルにマップされるため、1 つのピクセルの書き込みで実際には 4 つのピクセルが一度に変更されます。(これは、ポリゴン フィラー ルーチンの大幅な高速化です!)。
単一のピクセルを変更する場合は、ピクセルをプロットする直前に、4 つのピクセルのどれがメモリ書き込みの影響を受けるかを指定する「ピクセル マスク」(VGA カード レジスタも) をセットアップする必要があります。
プロットされるすべてのピクセルでマスクを設定する必要があるため、単純に行うと時間がかかります。通常、私たちは直感的に左から右、上から下に描画する傾向があります (VGA モード 13H でのビデオ メモリのマッピング方法が正確であるため)。 、上から下、左から右に物事を描きました。
なんで?これにより、描画された列ごとにピクセル マスクを 1 回だけ変更できるためです。ここにいくつかの擬似コードがあります:
素朴で直感的なプログラミング
pixelptr = start of screen memory
foreach row
foreach column
adjust pixel mask
write pixel value
pixelptr+= 1 // advance pointer to next pixel to the left
next
next
プログラミングの回転モード
[Edit1: ポインタを次の列の先頭に移動する必要がある欠落しているステップを追加]
[編集 2: 修正、次の行に進むために 320 を追加していましたが、実際にはこれを 4 で割る必要があります。これは、ビデオ メモリ アドレスの連続したインクリメントが、前の行の右側にある次の 4 つのピクセルのグループにマップされるためです。 -ピクセルグループ]
for each column
pixelptr = start of screen memory + current column index
adjust pixel mask // same mask applies to every pixel in the same column!
for each row
write pixel value
pixelptr += (320 / 4) // advance pointer to next pixel, to the bottom
next
next
関連するすべての手順と登録アドレスは、私が提供した Michael Abrash のコラムへのリンクで詳しく説明されています。これは古いものですが、きっと魅力的だと思います。
乾杯!