Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Вывод цветного текста - мож. кому пригодится...


Автор: Ruterian 12.2.2004, 16:30
Давно хотел сделать процедуру, аналогичную 09h функции int 21h, но для вывода строк в цвете (как в языках высокого уровня). И, вот, придумал smile.gif

Адрес строки передаем в ES:BP
далее просто вызываем ЭТО :-)

Можно писать текст в виде <$><атрибут1>,<текст1>,<$><атрибут2>,<текст2>,0 Длину строки указывать не надо, положение не надо - пишет от курсора.

Перед строкой, и внутри её, можно использовать следующие управляющие символы:

24h - признак цвета. Указывает, что следующий за ним байт нужно рассматривать как атрибут.

0Ah и 0Dh - перенос строки и возврат курсора на 0-ю колонку. Работают, если перед ними нет символа 24h.

0 - признак конца строки.

Схема строки в виде <текст>,0 будет рассматриваться как белый на черном. Признак цвета и управляющий символ можно вставлять в любое место строки.

color_string:
mov ax,0300h ; получить адрес курсора
mov bx,0
int 10h
set_att:
cmp byte ptr [es:bp],24h ; анализируем первый знак
je yes_color ; если это признак цвета, то следующий - атрибут
jmp no_color

yes_color:
inc bp ; получаем атрибут
jmp nbw ; далее обращаемся как с атрибутом
anal_att:
cmp byte ptr [es:bp],20h
jl nbw ; если первый знак - не атрибут
no_color:
mov bl,07h ; писать белым на черном
jmp clr_txt
nbw:
mov bl,[es:bp] ; выделяем атрибут из строки
inc bp
clr_txt:
mov cx,1 ; вывести один символ
mov ax,1301h ; функция
cmp byte ptr [es:bp],0 ; ищем признак конца строки
je endoftxt
cmp byte ptr [es:bp],24h ; ищем след.признак цвета в строке
je yes_color
cmp byte ptr [es:bp],13
jne no_ret_cur
xor dl,dl

no_ret_cur:
int 10h ; пишем текст
inc bp ; получам адрес след.символа
cmp byte ptr [es:bp-1],13
je no_move_cur
cmp byte ptr [es:bp-2],13
je no_move_cur
inc dx ; перемещаем курсор
no_move_cur:
jmp clr_txt
endoftxt:
retn

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)