Иллюстрированный самоучитель по SVGA

Подпрограммы для построения строк

Строки отличаются от линий тем, что в оперативной памяти хранится их точечный образ. Он может быть получен в результате чтения файла, содержащего рисунок, сохранения изображения находившегося на экране или любым другим способом, для нас это не имеет значения. Однако сам факт существования образа (или заготовки) строки в отличие от ее рисования непосредственно в процессе вывода на экран существенно изменяет структуру подпрограмм.

Если не требуется дополнительных преобразований кодов точек, то построение строки рисунка сводится к пересылке заданного количества байтов из оперативной в видеопамять или в обратном направлении (для сохранения содержимого видеопамяти). Следовательно, возможно составление универсальных подпрограмм, выполняющихся в любом видеорежиме.

Подпрограммы, выполняющие различные манипуляции со строками при работе в видеорежимах PPG, описаны ранее. Здесь мы продолжим эту тему применительно к режимам direct color.

Для всех вариантов подпрограммы построения строки мы сохраним то расположение входных параметров в регистрах, которое было принято. Адрес оперативной памяти (источника) указывается в паре регистров fs:si, а адрес видеопамяти (приемника) – в регистре di. Предварительно устанавливается окно видеопамяти, которому принадлежит адрес первой точки (указанный в di). Регистр es должен содержать код сегмента видеобуфера, хранящийся в переменной vbuff.

Исходный вариант подпрограммы

Для дальнейших рассуждений нам нужен простой вариант подпрограммы, иллюстрирующий последовательность действий при построении строки. Он приведен в примере 7.10.

Пример 7.10. Цикл построения строки в режиме Hi-Color.

drawline: mov ax, fs: [si];!! для True Color – mov eax, fs[si]
mov es:[di], ax;!! для True Color – mov es:[di], eax
add si, bytppnt переадресация операнда источника
add di, bytppnt переадресация операнда приемника
jne @F переход, если не нуль
call NxtWin установка следующего окна
@@: loop drawline управление повторами цикла
ret возврат из подпрограммы

В комментариях к тексту примера 7.10 показано, как надо изменить две первые команды для того, чтобы подпрограмма drawline могла использоваться при работе в режимах True color.

Вариант со строковой операцией

Команды пересылки целесообразно использовать только в тех случаях, когда переадресацию операнда надо отложить на некоторое время или когда приращение адреса не совпадает с размером операнда.

При простом копировании строк размер операнда совпадает с кодом точки (если он не трехбайтовый) и возможна коррекция адреса сразу после записи точки. Поэтому в примере 7.10 команды пересылки имеет смысл заменить строковой операцией. Одна строковая операция заменяет четыре первые команды – две пересылки и две переадресации операндов. Измененный цикл построения строки приведен в примере 7.11. Его можно использовать в тех случаях, когда код точки занимает 2 или 4 байта.

Пример 7.11. Улучшенный цикл построения строки в режиме Hi-Color.

drawline: movs word ptr [di], f s: [si];!! movs dword ptr [di], f s: [si]
or di, di; начало нового сегмента?
jne @F; › нет
call NxtWin; установка следующего окна
I @@: loop drawline; управление повторами цикла
ret; возврат из подпрограммы

Первая команда примера 7.11 переменная, способ ее записи для пересылки 32-разрядных кодов (режим True color) показан в комментарии.

Для использования всех преимуществ строковой операции из цикла надо исключить проверку значений адресов, т. е. пересылать строку по частям так, как это делалось в примере 7.7. В зависимости от видеорежима, основные действия в нем выполняли команды rep stosw (режим Hi-Color) или rep stosd (режим True color). При подстановке в текст примера 7. И их надо изменить так, как показано ниже.

rep stosw заменяется командой rep movs word ptr [di], fs:[si]
rep stosd заменяется командой rep movs dword ptr [di], fs:[si]

Мы не будем приводить измененный вариант примера 7.7, а перейдем к описанию универсального способа пересылки.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.