BigDraw: pusha сохраняем стандартные регистры
PushReg <fs, gs, CL г win> ; сохраняем fs, gs и Cur win
mov fs, SwpSeg fs = сегмент буфера обмена
mov gs, GenSeg gs = сегмент таблицы цветов
mov SwpOffs, 0 нулевой адрес в буфере обмена
xor dx, dx старшая часть делимого dx=0
mov ax , - 1 младшая часть делимого ах=65535
div iwidth ах = 65535 / iwidth
mov part, ax число строк в порции для чтения
mul iwidth количество байтов в порции для чтения
mov nurnbyte , ex сохраняем его в numbyte
mov ax, iheight копируем количество строк в рисунке
mov remline, ax в счетчик не выведенных строк
mov dx, iwidth dx = iwidth, ширина рисунка
call calloffs вычисляем константу переадресации
NewPart: mov ex, numbyte размер порции для чтения
call readf чтение очередной порции данных
jnc sucread -> чтение без ошибок
; Здесь должны выполь яться действия в случае ошибки чтения
sucread : mov ex, part ex = стандартное количество строк
cmp remiine, ex осталось меньше строк ?
jae lbl_l -> нет, обходим команду пересылки
mov ex, remiine сх = оставшееся число строк
1Ы 1: sub remiine, ex уменьшаем оставшееся число строк
xor si, si адрес начала в буфере обмена
drwout : push ex сохраняем счетчик повторов
mov ex , dx задаем размер строки рисунка
call drawline построение очередной строки
pop ex восстанавливаем счетчик повторов
add di, bx адрес начала следующей строки
jnc @F -> адрес в пределах сегмента
call NxtWin установка следующего окна
@@: loop drwout управление повторами цикла
cmp remiine, 0 все строки выведены ?
jne NewPart -> нет, продолжаем построение
PopReg <Cur win, js, fs> ; восстановление Cur win, gs и fs
popa восстановление всех регистров
call setwin восстановление исходного окна
ret возврат из подпрограммы
По сравнению с оригиналом (см. пример 3.22), текст примера 7.24 изменился в той части, где выполняются подготовительные действия. Добавилось сохранение в стеке содержимого регистра gs и запись в него кода сегмента, содержащего таблицу цветов, а для вычисления константы переадресации строк видеопамяти вызывается подпрограмма calioffs. В заключительной части примера добавилось восстановление из стека исходного содержимого gs.
Цикл построения рисунка не изменился, но имя drawline соответствует другой подпрограмме построения строки, поскольку нужна перекодировка точек по таблице цветов.