title: Assembly Language Changing Color Of Characters
body: <p>This is a basic DOSBox program that when executed will flip the screen from left to right. The program works fine. The only problem I am having is I am supposed to make all non-alphabetic characters be red on white. I don't have any trouble changing the color of non-alphabetic characters but I do not know the combination for binary red on white. I thought it was 11111100b but this makes the color red on grey and the characters blink on and off. Probably something very simple but I can't figure it out. Any suggestions?</p>
  
  <pre><code>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                       
  </code></pre>