我记得,您通过设置 AX (ah:al) 寄存器并调用 INT 10h 来设置视频模式,请参阅此。
然后在内存地址 0xA000 访问像素图。如果您选择视频模式 fe 320x200 和 256 调色板,您可以通过将颜色索引写入端口 0x3C8,然后将红色值写入 0x3C9,将绿色值写入 0x3C9 并将蓝色值写入 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
}
除了 asm,您还可以使用outportb
andinportb
// 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 中,这将失败并给您分段错误或内存访问错误...