MS-DOS 中的默认鼠标光标如何工作而不擦除其下面的任何内容?

问题描述 投票:0回答:2

我对VGA图形的理解可能有缺陷,但它似乎只有一层图形,而MS-DOS(或至少DOSBox)中的鼠标光标似乎与下面的图形无关,很像“精灵层” “在当时的大多数视频游戏机上。然而DOSBox的VGA模式似乎是一层位图屏幕。鼠标是否位于只有它可以占用的单独层上?另外,VGA有没有办法输出硬件精灵?

sprite mouse dos vga retro-computing
2个回答
0
投票

据我所知,VGA 不支持鼠标光标或精灵的硬件。随着 XGA 精灵的推出,图像变得可用。但VGA只支持文本光标,不支持图形光标。

所以我的猜测是鼠标驱动程序读取 16x16 像素(或鼠标指针的任何大小),然后将其存储在某个地方。然后它可以将鼠标指针绘制到帧缓冲区中。例如,当指针向左移动一点时,驱动程序可以恢复帧缓冲区中的原始 16x16 像素。然后它从新位置读取 16x16 像素,然后再次绘制指针。

只要 DOS Box 处于窗口模式(即不是全屏),它就不会访问 VGA 寄存器,而是在操作系统提供的画布上绘图。因此,即使 VGA 不支持,DOS Box 也可以使用硬件精灵。因为在这种情况下根本不使用VGA。


0
投票

鼠标驱动程序通常执行的操作(至少从我在 90 年代看到的真实硬件上来看)是:

  • 对于文本模式:
    • 将背景颜色与所在单元格的文本颜色交换 光标已定位;
    • 从 256 个可用字形中保留 4 个字形,形成 2x2 单元格框,通过软件绘制文本单元格大小的指针,将光标图形与其后面的四个字符混合。然后通过计算指针应出现的单元格的位置来设置四个字形,而不更改字符属性;
  • 对于图形模式:
    • 保存光标后面的屏幕部分,绘制光标,恢复保存的缓冲区,保存新部分,在新位置绘制光标,依此类推
    • 通过对像素值进行异或来绘制光标,再次进行异或以恢复背景,通过对新位置的像素进行异或来绘制光标,依此类推

在文本模式下,视频内存中的一个单元由 2 个字节定义:一个包含字符,另一个包含该字符的属性 (https://en.wikipedia.org/wiki/VGA_text_mode#Text_buffer)。

在图形模式中使用索引颜色进行异或是可能的,因为调色板的排列是为了获得高对比度,至少对于从 EGA 继承的前 16 种颜色。相反,当该模式允许直接指定 RGB 通道的强度时,异或足以使光标具有出色的对比度。

鼠标指针管理还取决于应用程序的类型。通常,对于经常使用线性帧缓冲区的视频游戏来说,一切都由软件管理,而鼠标驱动程序仅提供指针坐标。有时仅使用从驱动器接收到的运动增量,因为在高分辨率下没有其他方法来获得精确定位和平滑运动。

对于 DOSBox,它模拟 CGA/EGA/[S]VGA 卡(因此它从不访问硬件的本机寄存器),并且无论是在窗口还是全屏中,其行为都不会改变。当它获得焦点时,它所运行的系统的本机光标就会消失,只有模拟的光标仍然可见。

© www.soinside.com 2019 - 2024. All rights reserved.