在文本屏幕(模式3,80x25)上工作时,B800h的常用视频缓冲区和4GB地址空间末端附近的线性帧缓冲区(LFB)都处于活动状态。我发现对于显示器上的每个字符单元格,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个字节保持为零,但如果我在其中放入任何内容,它甚至可以在视频模式设置中存活。
答案 0 :(得分:3)
当GMA950以文本视频模式运行时,图形内存被组织为双字列表。每个双字的第1个字节与显示平面0中的字节匹配,每个双字的第2个字节与显示平面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)的字节对应于奇数地址,因此不使用它们。
答案 1 :(得分: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)处放置属性字节,但它是否至少与Odd / Even方案有一些相似之处?
现在,除非其他人提出更好的解释,否则您可以通过以下方式进一步调查问题: