Манипуляции с палитрой
Программная реализация преобразования и простой установки палитры показана в примере А.7, который является продолжением примера А.6.
Пример А.7. Преобразование и установка палитры.
convert: mov ex, ax ex = количество строк в палитре mov si, di si = di адрес начала палитры push es сохраняем содержимое es mov es, SwpSeg es = сегмент буфера обмена push di сохраняем адрес начала палитры push ex сохраняем количество строк s Ip: mov al, fs: [si] al = код синего цвета xchg al, fs: [si+2] перестановка кодов красного и синего shr al, 02 сокращаем код красного до 6 разрядов stosb es:di = al, di = di + 1 mov ax, fs: [si+1] ax = коды зеленого и синего цвета shr ax, 02 сокращаем коды до 6 разрядов and al, 3Fh очищаем в al 2 старших разряда stosw es:di = ax, di = di + 2 add si, bx si = si + pbpl (pbpl = 3 или 4) loop S_lp управление повторами цикла setpal: pop ex восстанавливаем количество строк pop dx восстанавливаем адрес палитры xor bx, bx номер первого DAC-регистра mov ax, 1012h ах = код запрашиваемой функции int lOh BIOS устанавливает палитру pop es восстанавливаем содержимое es ret возврат из подпрограммы
Напомним, что после выполнения примера А.6 в регистрах находятся следующие величины: ах – количество строк в палитре, bх – размер строки в байтах, di – адрес начала палитры. Выполнение примера А.7 начинается с формирования содержимого регистров, используемых при преобразовании палитры. Для этого в сх копируется содержимое ах, а в si – содержимое di. Исходное содержимое es сохраняется и в него записывается код сегмента буфера обмена. Адрес и количество строк будут нужны при установке палитры, поэтому содержимое регистров сх и di сохраняется в стеке.
Цикл преобразования имеет метку s_ip. В нем производятся перестановка красного и синего и сокращение кодов базовых цветов до 6-ти разрядов. Первая команда цикла считывает код синего базового цвета в регистр ai, a вторая команда переставляет содержимое регистра ai и байта со смещением 2. В результате в ai оказывается код красного цвета, а в байте со смещением 2 – код синего цвета. Содержимое регистра ai сдвигается на 2 разряда вправо (сокращается до 6-ти разрядов) и записывается в буфер обмена. Зеленый и синий цвета обрабатываются совместно. Их коды считываются в регистр ах, его содержимое сдвигается на 2 разряда вправо, и очищаются два старших разряда ai. Результат записывается в буфер обмена. Описанные действия повторяются для каждой строки палитры.
Преобразованная палитра помещается на место исходной. Если заголовок файла соответствует формату Windows, то она окажется короче исходной за счет исключения пустых байтов.
После цикла преобразования, начиная с команды, имеющей метку setpai, выполняется установка палитры. Размер палитры выталкивается из стека в регистр сх, а адрес ее начала в dx. Для записи, начиная с нулевого DAc-регистра, bx очищается. В регистр ах помещается код запроса и происходит обращение к BIOS для установки палитры. После возврата из BIOS из стека восстанавливается исходное значение es и подпрограмма BitMap завершается, поскольку она выполнила все предусмотренные действия.