TASM 1.4 - 在不清除屏幕的情况下更改背景颜色?

时间:2015-09-16 21:41:45

标签: assembly x86 dos tasm 16-bit

我使用的是Tasm 1.4。 我试图更改背景和文字的颜色而不清除之前的文字,但它总是在清除以前的文字时结束,尽管颜色已经改变。

例如:

mov ah,09h
lea dx,text1
int 21h             ;displays text1
mov ah,01h
int 21h             ;I input a character
mov ah,06h
mov bh,42h
mov cx,0000h
mov dx,184fh
int 10h             ;I use this to change the text and background color
mov ah,02h
mov bh,00h
mov dh,0ch
mov dl,20h
int 10h             ;along with this
mov ah,09h
lea dx,text2
int 21h             ;displays text2
mov ah,02h
mov dl,al
int 21h             ;displays the inputted character

现在会发生什么......

  • 显示text1
  • 它要求输入
  • 我输入了一个输入
  • 它将显示text2,后跟输入的字符,背景颜色变为红色,文本颜色变为绿色。但是,text1已从屏幕上清除。

我还应该说text1和text2绝对可以放在同一个屏幕上。

那么如何获得相同的输出但是没有从屏幕上清除text1?

1 个答案:

答案 0 :(得分:2)

直接写入视频内存即可完成。如果你处于模式03h,那么你的屏幕上有80x25个字符。每个char都有16位与之关联。 8位用于文本/背景颜色,另外8位用于显示的字符。

要显示的字符是第一个字节,属性是第二个字节。 您可以在此处找到内存组织和属性位的简要说明:http://www.shikadi.net/moddingwiki/B800_Text

这里有一些代码可以保持文本内容不变,只会为80x25屏幕上的所有文本设置属性字节。这些天我使用nasm,自从我上次使用tasm以来已经过了15年 - 我不确定是否需要更改任何语法。

;********************************************************
; Sets the text-mode attributes for the whole 80x25 screen
; call  with AL = attribute (hi nibble = background, lo-nibble = foreground)
;********************************************************
setTextAttributes:
    push    es              ; save the seg register
    mov     cx, 80*25       ; # of chars to do
    mov     bx, 0xB800      ; segment of the screen memory for this video mode
    mov     es, bx
    xor     di, di          ; point to char data of screen-pos 0,0
.setTextAttributesLoop:
    inc     di              ; advance by 1 to point to the attribute, rather than the char
    stosb                   ; store our attribute byte to [es:di] and increment di. di now points to a character
    loop    .setTextAttributesLoop
    pop     es
    ret