TASM 1.4 - 在不清除屏幕的情况下更改背景颜色?
TASM 1.4 - Changing background color without clearing the screen?
我正在使用 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
现在发生了什么......
- 它显示文本 1
- 它要求输入
- 我输入一个输入
- 将显示text2 后接输入的字符,背景颜色变为红色,文本颜色变为绿色。但是,text1 已从屏幕上清除。
我还要说,text1 和 text2 绝对可以放在同一个屏幕上。
那么我如何获得相同的输出但文本 1 没有从屏幕上清除?
直接写显存就可以了。如果您处于模式 03h,则屏幕上有 80x25 个字符。每个字符都有 16 位与之关联。 8 位用于 text/background 颜色,另外 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
我正在使用 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
现在发生了什么......
- 它显示文本 1
- 它要求输入
- 我输入一个输入
- 将显示text2 后接输入的字符,背景颜色变为红色,文本颜色变为绿色。但是,text1 已从屏幕上清除。
我还要说,text1 和 text2 绝对可以放在同一个屏幕上。
那么我如何获得相同的输出但文本 1 没有从屏幕上清除?
直接写显存就可以了。如果您处于模式 03h,则屏幕上有 80x25 个字符。每个字符都有 16 位与之关联。 8 位用于 text/background 颜色,另外 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