英特尔 GMA950 专用缓冲区中字节的含义,在 VGA 文本模式下

Meaning of bytes in Intel GMA950 private buffer, in VGA text mode

在文本屏幕(模式 3、80x25)上工作时,位于 B800h 的常用视频缓冲区和靠近 4GB 地址末尾的线性帧缓冲区 (LFB) space 都处于活动状态。我发现对于显示器上的每个字符单元,LFB 使用 8 个字节 。第一个字节 (a) 表示 ASCII,第二个字节 (b) 表示属性。

在空白显示页面上,这 8 个字节如下所示:

20h,07h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)    

有谁知道额外的6个字节是干什么用的?我观察到这些神秘字节中只有第一个 (c) 和第五个 (g) 实际上被刷新为对我来说似乎是随机的值。其他 4 个字节保持为零,但如果我在其中放入任何内容,它甚至在视频模式设置下仍然存在。

...private buffer...mystery bytes...

这没什么好隐瞒的。如果它看起来像一个线性帧缓冲区,并且如果它的功能像一个线性帧缓冲区,并且如果它位于您期望线性帧缓冲区的位置,那么它很可能是一个线性帧缓冲区。以后我就叫它LFB吧。

要获取 GMA950 上 LFB 的地址,您可以使用此代码:

mov di, 0018h       ;Offset for GMADR
mov bx, 0010h       ;[15-8] Bus=0, [7-3] Device=2, [2-0] Function=0
mov ax, B10Ah       ;Read PCI dword
int 1Ah
and ecx, F0000000h  ; --> ECX is linear address of the LFB

在 16 色图形模式下,LFB 的组织方式如下:

 --------------------------------- 1st byte of bit-plane 0
 |   ----------------------------- 1st byte of bit-plane 1
 |   |   ------------------------- 1st byte of bit-plane 2
 |   |   |   --------------------- 1st byte of bit-plane 3
 |   |   |   |   ----------------- 2nd byte of bit-plane 0
 |   |   |   |   |   ------------- 2nd byte of bit-plane 1
 |   |   |   |   |   |   --------- 2nd byte of bit-plane 2
 |   |   |   |   |   |   |   ----- 2nd byte of bit-plane 3
 |   |   |   |   |   |   |   |
00h,00h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)

文本视频模式使用类似的组织,因此 (c) 和 (g) 处的字节与位平面 2 相关联,这意味着它们表示字符集的位模式。 为了字体操作而麻烦地访问位平面 2 的日子已经过去了!
我不知道为什么英特尔选择不在 (e) 处放置一个字符代码或在 (f) 处放置一个属性字节,但它不至少与 Odd/Even 方案有一些相似之处吗?

现在,在其他人提出更好的解释之前,您可以通过以下方式进一步调查问题:

  • 写入所有可用的显示页面并查看 IGD 放置字符代码和属性字节的位置。
  • 加载额外的字体(通过 BIOS)并查看 IGD 存储这些字体的位置。

当 GMA950 在文本视频模式下运行时,图形内存 被组织为双字列表。每个双字的第一个字节与显示平面 0 中的一个字节匹配,每个双字的第二个字节与显示平面 1 中的一个字节匹配,依此类推...

可以显示8个页面

GM + 00000000h : Display page 0
GM + 00004000h : Display page 1
GM + 00008000h : Display page 2
GM + 0000C000h : Display page 3
GM + 00010000h : Display page 4
GM + 00014000h : Display page 5
GM + 00018000h : Display page 6
GM + 0001C000h : Display page 7

可以加载8种字体。

GM + 00000000h : Font block 0
GM + 00008000h : Font block 4
GM + 00010000h : Font block 1
GM + 00018000h : Font block 5
GM + 00020000h : Font block 2
GM + 00028000h : Font block 6
GM + 00030000h : Font block 3
GM + 00038000h : Font block 7

图形内存的前 12 个字节是这样使用的:

 /------------------------------------------------> character code 1st cell
 |   /--------------------------------------------> attribute byte 1st cell
 |   |   /----------------------------------------> 1st bit pattern 1st ascii
 |   |   |   /------------------------------------> unused (a)
 |   |   |   |   /--------------------------------> unused (b)
 |   |   |   |   |   /----------------------------> unused (b)
 |   |   |   |   |   |   /------------------------> 2nd bit pattern 1st ascii
 |   |   |   |   |   |   |   /--------------------> unused (a)
 |   |   |   |   |   |   |   |   / ---------------> character code 2nd cell
 |   |   |   |   |   |   |   |   |   /------------> attribute byte 2nd cell
 |   |   |   |   |   |   |   |   |   |   /--------> 3rd bit pattern 1st ascii
 |   |   |   |   |   |   |   |   |   |   |   /----> unused (a)
 |   |   |   |   |   |   |   |   |   |   |   |
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h

(a) 未使用这些字节,因为它们与未使用的位平面 3 相匹配

(b) 不使用这些字节是文本视频模式使用odd/even操作的必然结果,主机内存中连续2个字符代码占用连续even 显示内存中的地址。由于标有 (b) 的字节对应于未使用的奇数地址。