Коды цветов стандартной палитры
Двухбайтовые коды символов записываются в видеобуфер в том порядке, в каком они должны появиться на экране: первые 80*2 байт соответствуют первой строке экрана, вторые 80*2 байт – второй и т.д. При этом переход на следующую строку экрана определяется не управляющими кодами возврата каретки и перевода строки, а размещением кода в другом месте видеобуфера. Для того чтобы из программы получить доступ к видеобуферу, надо занести в один из сегментных регистров данных сегментный адрес видеобуфера. После этого, задавая те или иные смещения, можно выполнить запись в любые места (ячейки) видеобуфера. Вычислить смещение ячейки в координатах " строка-столбец" (row, clm) можно так: VidAdd r= (row*160) + (clm*2) При большом объёме выводимых данных, информационный кадр формируется заранее в буфере пользователя, располагающегося в сегменте данных программы. Листинг 3.1. Запись строки в видеобуфер 0- страницы. ; Очистка экрана … ; Настроим сегментный регистр ES на страницу 0 видеобуфера, а ds на сегмент данных mov ax, 0B800h mov es, ax ; Перешлём в видеобуфер строку символов, настроив соответствующим образом ; регистры si, di и cx mov si, offset msg; Смещение источника mov di, 160*12+36*2; Смещение приёмника (36 столбец 13 -ой строки), mov cx, msglen; Число пересылаемых байт cld; Просмотр вперёд rep movsb;)*; Переслать строку символов с атрибутами в видеобуфер ; Остановим программу для наблюдения результата (иначе после завершения программы ; запрос DOS на ввод команды может затереть выведенную информацию) mov ah, 01h int 21h … ; Поля данных в сегменте данных программы. Символы и атрибуты: 0B0h – cветло- ; бирюзовый по чёрному, 0E4h –красный по жёлтому msg db ‘*’, 0B0h, ’T’, 0E4h, ’E’, 0E4, ’S’, 0E4, ’T’, 0E4, ’*’, 0B0h msglen = $-msg В данном фрагменте программы символьные коды выводимого сообщения перемежаются с их атрибутами. Такой способ формирования полей данных, предназначенных для прямой записи в видеопамять, становится громоздким, однако его можно существенно упростить, если выводимые символы имеют одни и те же атрибуты. Так, если мы хотим осуществить вывод символов текста из сегмента данных с единственным атрибутом 0E4h, то нам нужно просто заменить одну командную строку, отмеченную в выше приведённом фрагменте символом " *)", на три. При этом задание строки данных приобретёт привычный для нас вид. … mov si, offset msg; Смещение источника mov di, 160*12+36*2; Смещение приёмника (36 столбец 13 -ой строки), mov cx, msglen; Число пересылаемых байт cld; Просмотр вперёд mov ah, 0E4h; Атрибут выводимых символов 0E4h – красный по жёлтому cycle: lodsb; Загрузка в al очередного символа (al ← ds: si) stosw; Выгрузка “символ + атрибут” из ах в видеобуфер (ax→ es: di) loop cycle; Повторить msglen раз … ; Поля данных в сегменте данных программы. msg db ‘*TEST*’ msglen = $-msg … Изложенный выше способ вывода текста форматируется длиной видеостроки без учёта символов переноса или отступов от левой границы. Внесение элементарных правил текстового редактора в процедуру вывода сильно усложнит программу. В этом случае для вывода сообщений целесообразно использовать функции BIOS. Разработка структуры программ, осуществляющих просмотр произвольных видеостраниц, на которые предварительно записана информация способом прямого программирования видеобуфера, удобно производить с применением функции 05h int 10h BIOS (п. 8.2.3.2).
|