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

Воспроизведение не сжатых рисунков

Выбор вспомогательной подпрограммы

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

Лучше всего его задавать в регистре bр, в виде адреса нужной подпрограммы, а в тексте примера 3.21 вместо команды call drawiine записать call bp, как это указано в комментарии. Если вспомогательные подпрограммы включены в текст задачи, то для формирования адреса используется команда lea, например:

lea bp, drawline; для рисования 256-цветных рисунков
lea bp, drwlin4; для рисования 16-цветных рисунков
lea bp, drwlinl; для рисования двухцветных рисунков
lea bp, horline; для закрашивания прямоугольной области

Таким образом, мы получили универсальную процедуру, позволяющую:

  • закрашивать прямоугольные области произвольного размера;
  • рисовать рисунки небольшого размера;
  • сохранять в оперативной памяти содержимое прямоугольной области;
  • восстанавливать сохраненное ранее содержимое прямоугольной области.

При рисовании, сохранении или восстановлении содержимого видеопамяти прямоугольная область может содержать не более чем 65 536 точек. По существу это единственное ограничение описанной процедуры. Вы можете составить подпрограммы для более сложных манипуляций со строками небольших рисунков. При этом должно соблюдаться только одно требование – по расположению параметров в регистрах они должны быть совместимы с описанными выше.

Особенности работы с большими рисунками

Большие рисунки не помешаются в одном сегменте оперативной памяти, и их приходится считывать и выводить на экран по частям. В этом случае при построении основное время затрачивается не на рисование строк, а на чтение данных из файла в оперативную память. Очевидно, что чем больше размер порции данных, считываемых за одно обращение к файлу, тем меньше повторных обращений к процедуре чтения и тем быстрее будет построен рисунок. Стандартные средства DOS, например функция 3Fh прерывания int 2ih, позволяют прочитать за одно обращение к диску от 1 до 65 535 байт. Однако считывать каждый раз по 65 535 байтов не рационально, и вот почему.

Размер считываемой порции

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

Чтобы узнать его, надо число 65 535 разделить на размер строки рисунка. После деления частное умножается на размер строки, в результате получается размер порции для чтения в байтах. Последняя порция данных наверняка окажется меньшего размера и это надо учесть при построении рисунка.

Новые переменные

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

SwpOf fs dw 0 адрес (смещение) в буфере обмена
SwpSeg dw 0 значение сегмента, содержащего буфер обмена
iwidth dw 0 ширина строки рисунка
iheight dw 0 количество строк в рисунке
numbyte dw 0 количество байтов в считываемой порции данных
part dw 0 количество строк в считываемой порции данных
remline dw 0 остающееся не выведенным количество строк

Переменные Swpoffs и Swpseg указывают полный адрес буфера обмена, в который считываются данные из файла. Как резервируется пространство оперативной памяти, описано в Приложении Б данной книги. Значения переменных iwidth и iheight получаются при обработке заголовка файла, содержащего образ строящегося рисунка. Значения переменных numbyte, part и remline формирует сама подпрограмма BigDraw.

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