汇编语言更改字符颜色



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

相关内容

  • 没有找到相关文章

最新更新