【问题标题】:How to enable text cursor in IBMPC BIOS graphics mode 16 (INT 10H/AX=0010H)?如何在 IBMPC BIOS 图形模式 16 (INT 10H/AX=0010H) 中启用文本光标?
【发布时间】:2020-12-13 11:00:50
【问题描述】:

进入图形视频模式 16 (INT 10H/AX=0010),没有文本光标。

在带有板载 VGA/AMIBIOS(1.16) 且运行 DOS 的物理旧 IBMPC 和 DOSBOX 中进行了尝试。

我试过弄乱这些没有效果,因为它们似乎只是“文本模式”(不是图形):

  • “光标形状”(INT 10H/AH=01/CX=0D0EH)
  • “光标模拟”(INT 10H/AH=12H/AL=0/BL=34H)

看来光标应该很容易打开和关闭,是否有不同的BIOS功能可以打开它?

【问题讨论】:

    标签: assembly dos bios vga


    【解决方案1】:

    在 Dosbox 下,您可以使用 dos 中断调用 (int 0x33) 来操作鼠标。 我写了一个简单的例子,你可以用 fasm 组装它:

    org 0x100
    
    ;; Init Data Segment
    xor ax, ax
    mov ds, ax
    
    ;; Init screen
    mov ah, 0x00    ; Set video mode
    mov al, 0x10    ; 640x350 graphics
    int 0x10
    
    mov ah, 0x0b    ; Set color palette
    mov bh, 0x00    ; Set current
    mov bl, 0x03    ; Color: Cyan
    int 0x10
    
    mov ax, 0x0000  ; Reset mouse cursor
    int 0x33
    
    mov ax, 01          ; Show mouse cursor
    int 0x33
    
    hang:
        hlt
        jmp hang
    
    
    ;; Magic number
    times 510-($-$$) db 0
    dw 0xaa55
    

    【讨论】:

    • 谢谢,虽然实际上是 /text cursor/ 我试图在图形模式下打开,而不是鼠标。
    【解决方案2】:

    EGA/VGA 视频模式编号10h 是 graphic (640*350),请参阅Interrupt List,并且您尝试使用的 BIOS 服务仅适用于 text 模式。 恐怕您必须自己绘制光标。

    另一方面,您可以将光标绘制成任意形状,并在图形模式下以像素粒度将其定位在屏幕上。

    【讨论】:

    • 谢谢,我害怕那个。我将查看 IBM 技术参考手册中的 BIOS 源代码,以仔细检查是否有任何相关规定,否则将很难做到这一点……听起来它必须是 TSR 设备司机。
    【解决方案3】:

    模式 10h 是一种 16 色图形模式 (640x350)。在图形模式下,虽然 BIOS 会跟踪其位置,但不会显示光标,但仅此而已。

    即使屏幕所有像素都可寻址,BIOS 为这个不可见光标维护的位置将对应于字符单元布局 (8x14)。

    如果您想要一个光标,您必须自己以图形方式绘制它(一条短线),或者您也可以显示一个文本字符和一个空格来创建闪烁字符的效果。

    【讨论】:

    • 听起来我必须创建一个 TSR 来管理它,以便它在 DOS 等中工作。我的 DOS 应用程序绘制图形,但也可以提示用户输入新数据值,并将命令输出到图形在屏幕上时的 DOS。猜猜我必须截取视频打印以将光标保持在正确的位置,当它移动时取消绘制它并在新位置反向重新绘制它。呃,也许那里有一个司机……我会四处闻一闻。
    • 如果您的 TSR 只是简单地反转光标位置指向的 8x14 矩形中的所有像素,并在定时的基础上继续这样做,那么您已经设置好了。当然,一旦位置发生变化,您需要恢复之前的矩形。
    • 谢谢,我可以看到在定时器中断上做一个闪烁的光标,比如对底部扫描线进行异或,但它可能会留下垃圾,例如,如果屏幕被滚动/清除。可能必须拦截 INT 10 并确保在进行实际调用之前关闭光标,然后再将其重新打开。
    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 2016-03-02
    • 1970-01-01
    • 2020-03-12
    • 2013-01-25
    • 2017-05-02
    • 2020-08-12
    • 2021-08-06
    相关资源
    最近更新 更多