5

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

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

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

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

4

2 回答 2

4

当 GMA950 在文本视频模式下运行时,图形存储器被组织为一个双字列表。每个 dword 的第一个字节匹配显示平面 0 中的一个字节,每个 dword 的第二个字节匹配显示平面 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) 不使用这些字节是文本视频模式中使用的奇偶操作的必然结果,其中主机存储器中的 2 个连续字符代码占用显示存储器中连续的偶数地址。由于标有 (b) 的字节对应于奇数地址,因此不使用它们。

于 2016-04-10T15:14:34.617 回答
2

...私人缓冲区...神秘字节...

没有什么秘密的。如果它看起来像一个线性帧缓冲区,并且如果它的功能像一个线性帧缓冲区,并且如果它位于您期望线性帧缓冲区的位置,那么它很可能是一个线性帧缓冲区。从今以后,我将其称为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) 处放置属性字节,但它至少与奇/偶方案不相似吗?

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

  • 写入所有可用的显示页面并查看 IGD 将字符代码和属性字节放在哪里。
  • 加载额外的字体(通过 BIOS)并查看 IGD 存储这些字体的位置。
于 2016-04-01T16:22:19.283 回答