汇编语言改变字符的颜色

时间:2015-02-27 01:30:21

标签: assembly x86 vga dosbox

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

1 个答案:

答案 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。)