Unpack: PushReg <ax, dx, ex, di> сохранение используемых регистров
mov di, GenOffs адрес начала строки в GenSeg
add di, 02 начинаем с записи красных цветов
mov ex, 03 количество цветов
Unpckl: PushReg <di,cx> сохранение содержимого di и сх
mov dx, f width логический размер строки
Unpck2 : call nxt sym возвращает в al — текущий код
rnov ex, 01 предполагаем одиночный символ
cmp al, OCOh одиночный символ ?
jbe Unpck3 => да, на запись символа
mov ex, ax пересылка ах в счетчик
and ex, 3Fh выделяем число повторов
call Nxt sym читаем повторяемый код
Unpck3 : sub dx, ex кол-во байтов до конца строки
Unpck4 : mov gs: [di] , al запись кода цвета
add di, 03 коррекция адреса
loop Unpck4 управление повторами записи
Подпрограмма примера 7.27 состоит из двух вложенных циклов, внешний имеет метку Unpckl, а внутренний unpck2.
Внутренний цикл отличается от аналогичного цикла unpioop примера 3.24 тем, что запись результатов распаковки выполняется в цикле, имеющем метку unpck4 и состоящем из трех команд. Он усложнен потому, что результаты распаковки записываются в память не подряд друг за другом, а с шагом в 3 байта.
Внешний цикл управляет трехкратным повторением внутреннего. Кроме того, он формирует в регистре di адрес для записи результатов так, чтобы строка соответствовала формату bgr.