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

Простая установка палитры

Позиционирование файла

В процессе построения рисунка формата PCX приходится дважды принудительно изменять текущую позицию файла. Рассмотрим, как это делается.

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

В созданной DOS структуре, помимо прочих величин, хранится указатель позиции, в которой находится файл, сразу после открытия это число 0. При каждом чтении или записи значение указателя увеличивается на количество прочитанных или записанных байтов. Поэтому если вы последовательно читаете или записываете данные, то дополнительные действия по изменению позиции файла не требуются. Однако в некоторых случаях может понадобиться принудительное изменение позиции (значения указателя) без чтения или записи данных. Для выполнения таких действий предназначена специальная функция DOS, которая называется Lseek.

Все функции DOS вызываются через прерывания int 2ih, а код функции указывается в регистре ah. Код функции Lseek равен 42h. В регистре al указывается точка, относительно которой выбирается новая позиция, это числа 0, 1 или 2. Соответственно эти числам точкой отсчета является начало, текущая позиция, или конец файла. В паре регистров cx:dx задается 32-разрядное число, для получения новой позиции, его значение прибавляется к точке отсчета. При работе с файлами в регистр bx всегда записывается ссылка (file handle). После выполнения функции DOS возвращает в паре регистров dx:ax новое значение указателя, если эта величина используется в задаче, то ее надо сохранить.

Подпрограмма установки палитры PCX

В примере 4.6 приведен текст подпрограммы, выполняющей простую установку палитры из файла формата PCX. Предполагается, что файл был открыт, и его заголовок обработан. После возврата из подпрограммы задача должна проверить состояние С-раз-ряда. Если он очищен, то палитра успешно установлена. В противном случае подпрограмма обнаружила ошибку при позиционировании или в структуре файла.

Пример 4.6. Установка 256-цветной палитры из файла PCX.

SetPpal: pusha сохранение содержимого регистров
; Позиционирование на конец файла PCX
mov ax, 4202h код запроса позиционирования файла
mov bx, Handler указываем ссылку на файл
mov ex, – I старшая часть числа – 769
mov dx, – T69 младшая часть числа – 769
int 21h обращение к функциям DOS
j с spexit › ошибка позиционирования
/ Чтение палитры в буфер и проверка признака
mov ex, T 69 размер считываемой порции данных
call readf чтение данных в буфер обмена
xor si, si нулевой адрес в буфере обмена
lods byte ptr f s: [si] чтение в al нулевого байта
cmp al, OAh в байте находится код ОА?
je spal › да, исключаем масштабирование
cmp al, OCh в байте находится код ОС?
je @F › да, выполняем масштабирование
stc установка признака ошибки jmp short spexit;
 › на завершение подпрограммы
Масштабирование (сдвиг ее содержимого байтов) палитры
@@: mov ex, 768; указываем размер палитры
rapal: shr byte ptr fs:[si], 0 2 сдвиг очередного байта
inc si адрес следующего байта
loop ir.pal управление повторами цикла
; Установка палитры (копире вание в регистры цвета видеокарты)
spal: push es сохраняем содержимое es
push fs сохраняем содержимое fs
pop es выталкиваем его в es
mov dx, 01 адрес начала палитры
xor bx, bx номер первого регистра цвета
mov ex, 256 кол-во устанавливаемых регистров
mov ax, 1012h код запроса на установку палитры
int lOh обращение к функции BIOS
pop es восстанавливаем содержимое es
; Позиционирование файла на начало рисунка
mov ax, 4200h код запроса позиционирования файла
mov bx, Handler указываем ссылку на файл
xor ex, ex старшая часть величины смещения
mov dx, 8 Oh младшая часть величины смещения
int 21h обращение к функциям DOS
spexit: popa восстановление регистров
ret возврат из подпрограммы
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.