How does INT 10, 13h work with attributes?

Hi, I am trying to understand INT 10h, 13h (19), which writes a character string with BIOS 10 interrupt from 13h to ah. I found the information below about different flags for entering different registers. One thing that I still don't get is what should be in BL, if I just want to write a line with this function, what should be in BL as an attribute? Right now he is writing out weird blinking characters that don't make sense. Thanks in advance

Writes a string of characters with specified attributes to any display page. On entry: AH 13h AL Subservice (0-3) BH Display page number BL Attribute (Subservices 0 and 1) CX Length of string DH Row position where string is to be written DL Column position where string is to be written ES:BP Pointer to string to write Returns: None Notes: This service is available only for XTs dated 1/19/86 and later, ATs, EGAs, and PC Convertibles. The service has four subservices, as follows: AL=00h: Assign all characters the attribute in BL; do not update cursor AL=01h: Assign all characters the attribute in BL; update cursor AL=02h: Use attributes in string; do not update cursor AL=03h: Use attributes in string; update cursor In Subservices 0 and 1, all characters in the string are written to the screen with the same attribute-- the attribute specified in BL. In Subservices 2 and 3, the attribute byte for each character is found in the string itself. The string itself consists of a character followed by its attribute, another character followed by its attribute, and so on. The string is copied directly to the video buffer as is. In Subservices 0 and 2, the cursor position is not updated after the string is written. In Subservices 1 and 3, the cursor is moved to the first position following the last character in the string. Like Service 0Eh, Service 13h responds appropriately to ASCII 07h (bell), 08h (backspace), 10h (line feed), and 0Dh (carriage return). All other characters are printed. 
+4
source share
1 answer

With int 10h , the BL register is used for color attributes.

If you are not dealing with CGA, where the BL value is the number of the palette, the BL value is a number representing the foreground color (4 bits - low part) and background color (4 bits - high part).

For example, if you need a blue (0x01) background with a red (0x04) text color, you need to put 0x14 in the BL register - in binary format, which is 00010100 .

  0001 0100 |_ Background _| |_ Foreground _| 

Colors usually:

  - Black 0x00 - Blue 0x01 - Green 0x02 - Cyan 0x03 - Red 0x04 - Magenta 0x05 - Brown 0x06 - LightGray 0x07 - DarkGray 0x08 - LightBlue 0x09 - LightGreen 0x0A - LightCyan 0x0B - LightRed 0x0C - LightMagenta 0x0D - LightBrown 0x0E - White 0x0F 
+5
source

Source: https://habr.com/ru/post/1435810/


All Articles