这是一个基本的DOSBox程序,执行时会从左到右翻转屏幕。该程序工作正常。我唯一的问题是我应该让所有非字母字符在白色上是红色的。我在改变非字母字符的颜色时没有任何问题,但我不知道白色二进制红色的组合。我以为它是11111100b,但这会使颜色变为灰色,并且字符会闪烁。可能是非常简单的事情,但我无法弄清楚。有什么建议吗?
MyCode SEGMENT
ASSUME CS:MyCode, DS:MyData
MainProg PROC
MOV AX, MyData
MOV DS, AX
MOV AX, 0B800h
MOV ES, AX
MOV BX, (25 * 160) ;BX contains value that equals row 25, column 0
loop25:
SUB BX, 160 ;Selects next row
CALL flipRow ;Flips that row
CMP BX, 0 ;Have all rows been flipped?
JNE loop25 ;if not, repeat
MOV AH, 4Ch
INT 21h
MainProg ENDP
flipRow PROC ;PROC will flip each rown on verticle axis
MOV DI, BX ;Puts row, column 0 in DI
ADD DI, 158 ;Adds 158 to DI to select right most character
MOV SI, BX ;Puts row, column 0 in SI
loopRow: ;loop until row is finished flipping
MOV AX, ES: [DI] ;AX points to right most character
MOV CX, ES: [SI] ;CX points to left most character
MOV ES: [DI], CX ;Put left most character into right most place
;-------------------------------------------------------------------------
CMP CL, 65
JL thenPart
CMP CL, 91
JL next
CMP CL, 97
JL thenPart ;Is the character Alphebetic? If not, color red on white
CMP CL, 123
JL next
CMP CL, 122
JG next
thenPart:
MOV ES: [DI + 1], BYTE PTR 00FCh
next:
;-------------------------------------------------------------------------
MOV ES: [SI], AX ;Put right most character in left most place
;-------------------------------------------------------------------------
CMP AL, 66
JL then2
CMP AL, 91
JL next2
CMP AL, 97
JL then2 ;Is the character Alphabetic? If not, color red on white
CMP AL, 123
JL next2
CMP AL, 122
JG next2
then2:
MOV ES: [SI + 1], BYTE PTR 01111100b
next2:
;-------------------------------------------------------------------------
DEC DI
DEC DI ;Move in left
INC SI
INC SI ;Move in right
CMP SI, DI ;Is the row completely flipped?
JL loopRow ;If not, repeat
RET
flipRow ENDP
MyCode ENDS
答案 0 :(得分:1)
此色彩系统设计的CGA / EGA / VGA屏幕适配器具有两种独特的文本颜色模式。
在默认模式下,前景色有一个明亮的' bit - 第3位,其中2-1-0是RGB - ,但是在背景中的相同位'部分是“眨眼”。因此,你不能有一个明亮的'背景
可以使用低级别VIDEO中断更改默认设置:
AX = 1003h (operation code)
BL = 00h (enable bold background)
or BL = 01h (enable blinking)
INT 10h (execute operation)
(古代记忆慢慢来了http://webpages.charter.net/danrollins/techhelp/0140.HTM。)