我对VGA图形的理解可能有缺陷,但它似乎只有一层图形,而MS-DOS(或至少DOSBox)中的鼠标光标似乎与下面的图形无关,很像“精灵层” “在当时的大多数视频游戏机上。然而DOSBox的VGA模式似乎是一层位图屏幕。鼠标是否位于只有它可以占用的单独层上?另外,VGA有没有办法输出硬件精灵?
据我所知,VGA 不支持鼠标光标或精灵的硬件。随着 XGA 精灵的推出,图像变得可用。但VGA只支持文本光标,不支持图形光标。
所以我的猜测是鼠标驱动程序读取 16x16 像素(或鼠标指针的任何大小),然后将其存储在某个地方。然后它可以将鼠标指针绘制到帧缓冲区中。例如,当指针向左移动一点时,驱动程序可以恢复帧缓冲区中的原始 16x16 像素。然后它从新位置读取 16x16 像素,然后再次绘制指针。
只要 DOS Box 处于窗口模式(即不是全屏),它就不会访问 VGA 寄存器,而是在操作系统提供的画布上绘图。因此,即使 VGA 不支持,DOS Box 也可以使用硬件精灵。因为在这种情况下根本不使用VGA。
鼠标驱动程序通常执行的操作(至少从我在 90 年代看到的真实硬件上来看)是:
在文本模式下,视频内存中的一个单元由 2 个字节定义:一个包含字符,另一个包含该字符的属性 (https://en.wikipedia.org/wiki/VGA_text_mode#Text_buffer)。
在图形模式中使用索引颜色进行异或是可能的,因为调色板的排列是为了获得高对比度,至少对于从 EGA 继承的前 16 种颜色。相反,当该模式允许直接指定 RGB 通道的强度时,异或足以使光标具有出色的对比度。
鼠标指针管理还取决于应用程序的类型。通常,对于经常使用线性帧缓冲区的视频游戏来说,一切都由软件管理,而鼠标驱动程序仅提供指针坐标。有时仅使用从驱动器接收到的运动增量,因为在高分辨率下没有其他方法来获得精确定位和平滑运动。
对于 DOSBox,它模拟 CGA/EGA/[S]VGA 卡(因此它从不访问硬件的本机寄存器),并且无论是在窗口还是全屏中,其行为都不会改变。当它获得焦点时,它所运行的系统的本机光标就会消失,只有模拟的光标仍然可见。