Подпрограммы для построения строк
Строки отличаются от линий тем, что в оперативной памяти хранится их точечный образ. Он может быть получен в результате чтения файла, содержащего рисунок, сохранения изображения находившегося на экране или любым другим способом, для нас это не имеет значения. Однако сам факт существования образа (или заготовки) строки в отличие от ее рисования непосредственно в процессе вывода на экран существенно изменяет структуру подпрограмм.
Если не требуется дополнительных преобразований кодов точек, то построение строки рисунка сводится к пересылке заданного количества байтов из оперативной в видеопамять или в обратном направлении (для сохранения содержимого видеопамяти). Следовательно, возможно составление универсальных подпрограмм, выполняющихся в любом видеорежиме.
Подпрограммы, выполняющие различные манипуляции со строками при работе в видеорежимах 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, а перейдем к описанию универсального способа пересылки.