首页 > 解决方案 > 无法使用 VGA 下划线位置寄存器设置下划线位置

问题描述

我正在为自定义操作系统编写终端驱动程序。我想让终端了解控制光标位置、形状、颜色等的常见 vt-100 转义序列。因此,在实现“下划线/下划线”功能时,我想写入下划线位置寄存器VGA/SVGA 视频编程 - CRT 控制器寄存器,但它不工作。没有下划线出现(实际上我不知道在哪里看)。下面是 DOS 框的代码和屏幕截图。

  ; Read the Underline Location Register
  mov dx, 0x3D4
  mov al, 0x14
  out dx, al      ; 0x14 is the index of the Underline Location Register

  mov dx, 0x3D5
  in al, dx

  ; I want an underscore at 6th scan line, so I and 0b00101 with the value I got before
  and ax, 0xE5        ; 0b1110 0101
  push ax
    ; I write back the value to Underline regiser
    mov dx, 0x3D4
    mov al, 0x14
    out dx, al
  pop ax

  mov dx, 0x3D5
  out dx, al

但是没有出现轮廓。设置下划线寄存器后,我正在写一些文本(第二个十六进制值),但没有下划线。 在此处输入图像描述

标签: assemblyx86dosboxreal-modevga

解决方案


让下划线正常工作;你需要:

  • 设置下划线寄存器
  • 重新编程托盘,以便“前景属性 = 1”是您希望带下划线的文本的唯一颜色
  • 意识到“100% VGA 兼容 BIOS 接口”并不意味着“100% VGA 在硬件级别兼容”
  • 意识到“硬件级别 100% VGA 兼容”仅限于 IBM 于 1986 年发布并在 1987 年过时的极为罕见的 ISA 视频卡(现在实际存在的所有内容范围从“0% 硬件兼容”到“99%硬件兼容”,其中“0% 硬件兼容”由于一切都切换到 UEFI 而成为最有可能的可能性)。
  • 意识到如果你想要一些正常工作的东西,你必须使用图形视频模式,除了这些东西之外,你还可以支持 VT-100 所需的东西(下划线、粗体、“双高”和“132 列模式”)对于 VT100 来说是可选的(例如图形处理器),加上 VT-100 不能做的事情(例如支持更多的字符集,而不仅仅是“UK”和“USA ASCII”,有鼠标光标,...)。

推荐阅读