这是一个基本的 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