Воспроизведение не сжатых рисунков
Подпрограмма чтения с диска
Во внешнем цикле происходит обращение к подпрограмме Readf. Она считывает в буфер обмена порцию данных, размер которой (в байтах) задается в регистре сх. Ниже (см. пример 3.23) приведен один из возможных примеров такой подпрограммы.
Пример 3.23. Чтение фрагмента файла в буфер обмена.
Readf: PushReg <bx,dx,ds>; сохраняем в стеке bx и ds mov bx, handler; указываем заголовок файла Ids dx, dword ptr SwpOffs; задаем адрес буфера для чтения mov ax, 3FOOh; код функции DOS "чтение файла" int 21h; обращение к DOS PopReg <ds,dx,bx>; восстанавливаем из стека bx и ds ret; возврат из подпрограммы
В примере 3.23 адрес буфера обмена выбирается из переменных SwpOffs и swpseg, описанных выше. Если при чтении данных возникнет ошибка, то после возврата из int 2in и из подпрограммы будет установлен С-разряд регистра флагов (признак переполнения). При успешном чтении DOS возвращает в регистре ах размер прочитанной порции данных в байтах. Если при чтении обнаружен конец файла, то эта величина может быть меньше указанной в регистре сх.
В примере 3.23 используется еще одна переменная handler, содержащая ссылку на файл (file handle). Эту величину формирует DOS при открытии файла по указанной спецификации и передает задаче в регистре ах. Ее надо сохранить, например в переменной handler и использовать при дальнейшей работе с файлом.
Способ открытия файла для чтения описан в Приложении А в Примере А.1. Для получения более подробной информации на эту тему рекомендуем обратиться к электронной справочной системе Tech Help, или к любому руководству по программированию MS DOS.
Рисунок не помещается на экране
Существуют рисунки, размеры которых превышают размер рабочей области экрана. В таких случаях способ построения выбирается в зависимости от назначения рисунка. Например, если вы собираетесь использовать его в качестве заставки, то целесообразно сократить размеры до допустимых значений с помощью графического редактора и использовать в задаче обрезанный рисунок.
Прежде чем обрезать рисунок, имеет смысл определить его размеры. Возможно, что вам попалась одна из заставок, предназначенная для вывода при высоком разрешении, например 800x600 или 1280x1024 точки. Если вас устраивает работа в таких видеорежимах, то проблемы не существует, достаточно просто устанавливать в задаче нужный видеорежим.
Обрезать рисунок можно и в процессе его построения. Если ширина рисунка превосходит Horsize, то при построении строк в видеопамять записывается ровно Horsize точек, а остатки отбрасываются. Если высота рисунка превосходит versize, то выводится ровно versize строк, а остальные отбрасываются. Изменить подпрограмму построения рисунка не сложно, вопрос в том, целесообразно ли это делать?
Более гибкий способ заключается в принудительном изменении размера сканируемой строки (scaniine). Эта величина задает количество точек, после вывода которых видеоконтроллер переходит на новую строку. После установки видеорежима scaniine и Horsize равны. В разделе описана функция BIOS 4F06h, которая позволяет установить нужное значение Scaniine, но не меньшее чем Horsize. Если Scaniine > Horsize, то в процессе отображения каждой строки видеоконтроллер выводит на экран Horsize точек, а остальные (scaniine – Horsize) пропускает.
Поэтому можно просто копировать рисунок в видеопамять, предварительно установив значение scaniine равным его ширине. После построения на экране будет видна левая верхняя часть рисунка, размер которой равен Horsize Versize. Только не забывайте, что изменение значения Scaniine сказывается на работе с другими рисунками, в том числе с курсором и текстом. Для учета нового значения надо либо ввести специальную переменную, либо изменить значение переменной Horsize.
В видеопамять можно записать большой рисунок и просматривать его по частям, перемещая начало отображаемой области. В разделе описана функция BIOS 4F07h, позволяющая перемещать эту точку. После установки видеорежима начало отображаемой области находится на пересечении нулевой строки и нулевого столбца. В разделе было показано, как можно использовать функцию 4F07h для выбора страниц видеопамяти.
Программирование управления перемещением отображаемой области существенно усложнит вашу задачу, особенно если для управления использовать горизонтальный и вертикальный лифты, как это делается в Windows и ее приложениях. Поэтому описанный способ работы с большими рисунками имеет смысл применять в тех случаях, когда это действительно необходимо и у вас есть достаточный опыт программирования графики.