1)直接写入显存要快得多。
2) 对于只有 16 色(4 位)的图形视频模式,我们必须使用端口访问(到 3CEh 像素掩码寄存器)并在目标位置附加一个虚拟读取,以便将一个像素设置为帧缓冲区。解释方法并不是那么简单。但是我可以给你一个例子,我的 ET4000 显卡使用 16 色视频模式的像素设置例程:
PIXEL: pusha
add bp, XMIN
add bx, YMIN
mov cx, bp ; Screen-Offset
shr cx, 3
mov ax, PS ; Pixel of a line
mul bx ; * Y
add ax, cx ; + (X/8)
mov di, ax ; = address
cmp BYTE PTR[FLAG_2], 5 ; SVGA ?
jb VGA
mov al, dl ; Bank switch ET4000
shl al, 4 ; for SVGA: 1024x768 and 1280x1024
add al, dl ; overflow 64K border
mov dx, 3CDh ; Port address for bank switching ET4000
out dx, al
VGA: inc cx ; calculate Pixel
shl cx, 3
sub cx, bp
dec cx
mov ah, 1 ; 2 ^ (((X/8) + 1) * 8 - X) - 1
shl ah, cl ; = Pixel pos.
mov dx, 3CEh ; Pixel-Mask-Register
mov al, 8
out dx, ax
mov al, fs:[di] ; Dummy-READ (get the address)
EBENE: mov BYTE PTR fs:[di], 1 ; set Pixel
popa
ret
但是 8,15/16,24/32 位颜色的视频模式在没有端口访问的情况下更易于使用。以 8 位颜色为例,计算像素地址很简单。像素地址= (Y_coordinate * 水平分辨率) + X_coordinate
使用 8 位颜色,每个地址代表屏幕上的一个像素。但另外我们有一个调色板(查找表)来确定每个颜色编号的红色、绿色和蓝色部分。仅对于具有 15/16 和 24/32 色的视频模式,颜色在像素地址中完全编码为两个字节,或三个字节的颜色。
3) 是的,对于具有 8、15/16、24/32 位颜色的视频模式,很容易用颜色填充屏幕。
4)我们不需要告诉显卡刷新屏幕内容。但是如果阴极射线在屏幕上,我们可以检查端口3DAh的状态寄存器,以尽量减少闪烁效果和屏幕内容撕裂。
第一次我也尝试使用具有 4 位颜色的视频模式,但它不像其他具有更多颜色的图形模式那样简单。今天使用我的 Radeon 7950 卡,我更喜欢使用位于 4 GB 某处的线性帧缓冲区,以 19202x1200 和 32 位颜色使用我的 28 英寸宽屏显示器的原始分辨率。为了切换到这个分辨率,我使用 VBE-Bios 和VBE-bios 中的modenumbers 模式表。可以在该页面公共部分的vesa.org的 vbe3.pdf 中找到相关文档(免费但需要注册/登录)。