英特尔 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) 的字节对应于未使用的奇数地址。
在文本屏幕(模式 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) 的字节对应于未使用的奇数地址。