cnvpal: PushReg <ax,bx,cx,di,si,es>; сохранение содержимого регистров
les di, dword ptr GenOffs; es:di = адрес таблицы цветов
modcol: mov al, fs:[si] ; читаем код красного цвета в al
shr al, 03 ; сокращаем его до 5-ти разрядов
mov bh, fs:[si+1] ; читаем код зеленого цвета в bh
shld ax, fax, 05 ; !! или shld ax, bx, 06
mov bh, fs: [si-t-2] читаем код синего цвета в bh
shld ax, bx, 05 сдвигаем и дополняем код в ах
add si, 03 адрес следующей строки палитры
stosw записываем новый код цвета
loop modcol управление повторами цикла
PopReg <es,si,di,cx,bx,ax> ; восстановление регистров
ret возврат из подпрограммы
В примере 7.17 основную роль играет команда shld, напомним ее особенности. При выполнении команды содержимое первых двух операндов, в данном случае это регистры ах и bx, сдвигается как одно 32-разрядное слово, но записывается только старшая часть результата в первый операнд, а содержимое второго операнда не изменяется. Таким образом, в примере 7.17 команда shld сдвигает содержимое регистра ах на пять разрядов влево и записывает в освободившееся место пять старших разрядов регистра bх.
В зависимости от установленного видеорежима код зеленого цвета может занимать 5 или 6 разрядов. В комментарии показано, как изменится одна из команд shld в случае формирования 16-разрядного кода цвета.
Устаревший формат палитры PCX. В разделе 4.4 говорилось о том, что существует устаревший формат 256-цветной палитры, поддерживаемый версией стандарта PCX, разработанной фирмой Genius. Если вам надо работать с файлом, соответствующим этому стандарту, то проще всего преобразовать его в основной стандарт фирмы ZSoft. Это можно сделать, например, с помощью графического редактора Photofinish фирмы ZSoft.