这是一个基本的DOSBox程序,执行时会将屏幕从左向右翻转。这个程序运行良好。我遇到的唯一问题是,我应该让所有非字母字符都是白底红字。我在更改非字母字符的颜色方面没有任何问题,但我不知道白色上二进制红色的组合。我以为是11111100 b,但这使得颜色在灰色上变成了红色,字符忽亮忽灭。可能是一些非常简单的事情,但我想不出来。有什么建议吗?
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
CGA/EGA/VGA屏幕适配器是为其设计的颜色系统,具有两种独特的文本颜色模式。
在默认模式下,前景颜色有一个"明亮"位——第三位,其中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.)