DosBox如何修复字符属性?

时间:2019-05-19 16:15:31

标签: assembly x86-16 emu8086 dosbox

我编写汇编代码只是为了编写一个具有蓝色背景和白色前景的字符。它可以在emu8086的模拟器中使用,但是当我在DosBox上打开它时,它不会显示背景色。

使用Emu8086: With Emu8086

使用DosBox: Wtih DosBox

mov ax,0012h
int 10h

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

1 个答案:

答案 0 :(得分:3)

在图形视频模式下,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,以获取有关如何实现当前和未来目标的更多信息。