DosBox如何修复字符属性?

DosBox how to fix character attribute?

我写汇编代码就是为了写一个蓝底白前景的字符。它在 emu8086 的模拟器中工作,但是当我在 DosBox 上打开它时,它不显示背景颜色。

使用 Emu8086:

使用 DosBox:

mov ax,0012h
int 10h

mov ah,9
mov al,31h
mov bl,1fh
int 10h

在图形视频模式下,BIOS 函数 09h 的 BL 参数仅定义前景色。它始终应用于黑色背景。

下面是我对这个函数功能的扩展实现。现在 BL 拥有一个属性(前景颜色和背景颜色),就像在文本视频模式中一样。

仅在图形视频模式下有效

; IN (al,bl,cx) OUT ()
EnhancedWriteCharacterWithAttribute:
    pusha
    mov     bh, 0            ;Display page 0
    mov     bp, bx
    push    ax
    shr     bl, 4            ;Get background color (high nibble)
    mov     ax, 09DBh        ;ASCII DBh is full block character
    int     10h              ;BIOS.WriteCharacterAndAttribute
    xor     bx, bp           ;Anticipate upcoming 'xor'
    and     bl, 15           ;Get foreground color (low nibble)
    or      bl, 128          ;Have BIOS 'xor' it
    pop     ax
    int     10h              ;BIOS.WriteCharacterAndAttribute
    popa
    ret

这样使用:

mov     ax, 0012h ; BIOS.SetVideo 640x480x16
int     10h

mov     al, "1"   ; Character
mov     bl, 1Fh   ; Attribute
mov     cx, 80    ; Repetition count
call    EnhancedWriteCharacterWithAttribute

注意

CX中提供大量重复计数的文本视频模式可以一次写入整个屏幕。这在图形视频模式下是不可能的,因为 BIOS 将停止在屏幕的右边缘。


您可能想阅读 Displaying characters with DOS or BIOS 以了解有关如何实现当前和未来目标的更多信息。