私が覚えているように、AX (ah:al) レジスタを設定し、INT 10h を呼び出すことでビデオ モードを設定します。これを参照してください。
次に、メモリ アドレス 0xA000 でピクセル マップにアクセスします。ビデオ モード fe 320x200 を 256 カラー パレットで選択した場合、ポート 0x3C8 にカラー インデックスを書き込み、次に Red 値を 0x3C9 に書き込み、Green 値を 0x3C9 に書き込み、Blue 値を 0x3C9 に書き込むことで、RGB カラー パレットを設定できます。
// select mode 320x200
asm {
mov ah, 0
mov al, 13
int 10h
}
// set red background (color index 0)
asm {
mov dx, 0x3c8
mov al, 0
out dx, al
mov dx, 0x3c9
mov al, 0xff
out dx, al
mov al, 0x00
out dx, al
out dx, al
}
outportb
asm の代わりにandも使用できますinportb
// Set color with index 5 in color palette with outportb:
outportb(0x3c8, 5); // color with index 5
outportb(0x3c9, 0xFF); // red channel value
outportb(0x3c9, 0x00); // green channel value
outportb(0x3c9, 0x00); // blue channel value
C でビデオ モードを変更するには、次のようにします。
union REGS regs;
regs.w.ax = 13;
int86(0x10, ®s, ®s);
グラフィカル ピクセル マップへの C ポインター:
volatile unsigned char *pixmap = (volatile unsigned char *)0xA000;
// Write a pixel with color index 5 to X:10 Y:25 in 320x200x256 video mode:
pixmap[10 + 25 * 320] = 5;
テキスト マップへの C ポインター:
volatile char *charmap = (volatile char *)0xB800;
// Write hello world in text-mode
int offset = 0;
charmap[offset++] = 'H';
charmap[offset++] = 'e';
charmap[offset++] = 'l';
charmap[offset++] = 'l';
charmap[offset++] = 'o';
charmap[offset++] = ' ';
charmap[offset++] = 'w';
charmap[offset++] = 'o';
charmap[offset++] = 'r';
charmap[offset++] = 'l';
charmap[offset++] = 'd';
これらはすべて DOS モードであることを前提としており、私はテストしていないことに注意してください。Windows では、これは失敗し、セグメンテーション違反またはメモリ アクセス エラーが発生します...