15

私は小さなブートローダーとカーネルを作成していますが、今までディスクを読み取り、2 番目のセクターをロードし、GDT をロードし、A20 を開き、pmode を有効にしました。

テキスト コンテンツ (0x000B0000 - 0x000B7777) 用のビデオ メモリを使用して、画面に文字を表示する 32 ビット関数にジャンプしました。

pusha
mov edi, 0xB8000
mov bl, '.'
mov dl, bl
mov dh, 63
mov word [edi], dx
popa

ここで、もう少し進んで、画面上に 1 つのピクセルを描画します。いくつかの Web サイトで読んだように、VGA のグラフィック モードを使用する場合は、0x000A0000 の位置にピクセルを書き込む必要があります。そうですか?

では、単一のピクセルの形式は何ですか? 単一の文字の場合、ASCII コードと属性が必要ですが、ピクセルを定義するには何が必要ですか (テキスト モードと同じように機能する場合)。

4

3 に答える 3

21

残念ながら、それはもう少し先です。

ビデオメモリへの書き込みの規則は、グラフィックモードによって異なります。従来のビデオモードの中で、VGAモード320x200(8bpp)は、ビデオメモリが通常の種類のメモリのように動作する唯一のモードです。0xA000:0000(または0xA0000リニア)から始まるピクセルに対応するバイトをビデオバッファに書き込みます。 、そしてそれだけです。

他のVGA(pre-SVGA)モードの場合、ルールはより複雑です。ビデオメモリにバイトを書き込むとき、ピクセルのグループをアドレス指定し、私がずっと忘れていたいくつかのVGAレジスタは、それらのピクセルのどの平面が更新されるかを指定します。そしてそれらの古い値がどのように使用されるか。それはもはや単なる記憶ではありません。

SVGAモードがあります(800x600x8bppから)。VESA Video Bios Extensionsを使用して、ハードウェアに依存しない方法でそれらに切り替えることができます。これらのモードでは、ビデオメモリは再びメモリのように動作し、ピクセルあたり1、2、3、または4バイトであり、1バイトのアクセスで触れるVGAのような8ピクセルグループはありません。問題は、リアルモードのビデオバッファが画面全体をアドレス指定するのに十分な大きさではなくなっていることです。

VESA VBE 1.2は、メモリウィンドウベースを変更する機能を提供することでこの問題に対処しました。特定の瞬間に、線形0xA0000のセグメントはビデオメモリの64Kb領域をアドレス指定しますが、フレームバッファ全体のどの64Kbがこのアドレスで使用可能かを制御できます(ベースアドレス調整の最小単位、別名ウィンドウの細かさはハードウェアに依存しますが、0xA0000でN*64Kbオフセットをマップする機能に依存できます。欠点は、異なる64Kbチャンクで作業を開始するたびにVBEBIOS呼び出しが必要になることです。

VESA VBE 2.0は、フラットフレームバッファーを追加しました。これは、プロテクトモード(非現実モードでも)の一部の上位アドレスで使用できます。したがって、ビデオモードに入るにはVBE BIOS呼び出しが必要ですが、ピクセルを描画するためには必要ありません。

VESA VBE 3.0は、まだ十分に移植性がない可能性がありますが、プロテクトモードでVBE関数を呼び出す方法を提供します。(私はそれを試す機会がありませんでした、それは私の「アセンブリ中のOS」の時代にはありませんでした)。

とにかく、最初にグラフィックモードに切り替える必要があります。それを行うにはいくつかのバリエーションがあります。

  • 最も簡単な方法は、プロテクトモードに入る前にBIOS呼び出しを使用することです。VBE 2.0では、ビデオメモリウィンドウの調整を呼び出す必要はありません。
  • もう1つの方法は、BIOSに十分なV8086モード環境を作成することです。最も難しい部分は、割り込みをリアルモードの割り込みハンドラーに転送することです。簡単ではありませんが、完了すると、PMでビデオモードを切り替えたり、他のBIOS機能(ディスクI / Oなど)を使用したりできるようになります。
  • さらに別の方法は、VESAVBE3.0プロテクトモードインターフェイスを使用することです。それがどれほど簡単か複雑かはわかりません。
  • そして、本当のジェダイの方法は、特定のビデオカードの情報を掘り起こし、レジスタを設定してモードを切り替えることです。そこに行って、過去にいくつかのCirrusカードでそれを行いました-PMで大きなプレーンフレームバッファを取得することはそれほど複雑ではありませんでした。移植性はありませんが、マシンの内部を理解することが目的である場合は、それが必要なのかもしれません。
于 2013-01-19T22:24:47.477 に答える
5

使用しているグラフィック モードに依存し、多くの違いがあります。BIOS VGA ビデオ モード13h(8 ビット/ピクセルで 320x200) はおそらく最も簡単に使い始めることができます (256 色の BIOS VGA ビデオ モードはこれだけですが、ビデオ カードのポートに直接書き込むことで独自のモードを作成できます)。 ): BIOS ビデオ モード 13h では、画面にマップされたビデオ メモリは から始まり、0x0A0000各ピクセルに対して 1 バイト、1 ビット プレーンのみで連続的に実行されるため、各座標のメモリ アドレスは0x0A000 + 320*y + x次のようになります。

リアル モードで BIOS ビデオ モード 13h (8 ビット/ピクセルで 320 x 200) に変更するには:

mov ax,0x13
int 0x10

プロテクト モードで左上隅 (ビデオ モード 13h) にピクセルを描画するには:

mov edi,0x0A0000
mov al,0x0F      ; the color of the pixel
mov [edi],al
于 2013-01-19T21:39:12.323 に答える
1
org 100h
bits 16
cpu 386

section.text:
START:
mov ax,12h
int 10h
mov al,02h
mov ah,0ch 

pixel.asm
c:\>nasm pixel.asm -f bin -o pixel.com
int 10h
于 2015-09-15T17:04:04.013 に答える