Графические устройства

         

Подпрограмма чтения 24разрядного кода точки



Пример 7.2. Подпрограмма чтения 24-разрядного кода точки

rdpnt : xor еах, еах очистка регистра еах
mov al, es: [di] чтение младшего байта кода точки
mov DotBuff, al и его сохранение в DotBuff
cmp di, -2 сколько байтов до конца окна ?
jae rdpnt 2 -> 1 или 2 байта
mov ax, es: [di+1] чтение старших байтов кода точки
rdpntl: shl eax, 08 сдвиг содержимого еах влево
mov al, DotBuff добавление кода младшего байта
ret выход из подпрограммы
rdpnt2 : push Cur win сохранение значения Cur win
je rdpnt3 -> до конца окна 2 байта
call NxtWinB установка следующего окна


mov ax, es: [di+1] чтение старших байтов кода точки
jmp SHORT rdpnt4 переход на метку rdpnt4
rdpnt3: mov al, es: [di+1] чтение 2-го байта кода точки
call NxtWinB установка следующего окна
mov ah, es: [di+2] чтение старшего байта кода точки
rdpnt4 : pop Cur win восстановление значения Cur win
call SetWinB восстановление исходного окна
jmp SHORT rdpntl переход на метку rdpnt2

Выполнение примера 7.2 начинается с очистки регистра еах. Это нужно для очистки старшего байта формируемого кода. Затем младший байт кода точки считывается в регистр al и помещается в DotBuff. Теперь надо проверить, сколько байтов осталось до конца окна, и выбрать способ чтения старших байтов кода точки.

Если до конца окна осталось больше двух байтов, то переход на метку rdpnt2 не происходит и выполняется команда, следующая за jae rdpnt2. Она помещает в регистр ах два старших байта кода точки. Содержимое регистра еах сдвигается на 8 разрядов влево, в освободившийся младший байт копируется содержимое DotBuff и происходит возврат'из подпрограммы на вызывающий модуль.

Если до конца окна осталось меньше чем 3 байта, то команда jae выполняет переход на метку rdpnt2. При этом в стеке сохраняется значение переменной cur_win, и если в буфере остался 1 байт, то команда je не выполняет переход на метку rdpnts. В этом случае устанавливается следующее окно видеопамяти, в регистр ах считываются два старших байта кода точки, и происходит безусловный переход на метку rdpnt4 для завершающих действий.

Если до конца окна осталось 2 байта, то команда je rdpnts выполняет переход на метку rdpna. В таком случае в регистр al сначала записывается средний код точки, после этого устанавливается следующее окно видеопамяти и в регистр ah считывается старший байт кода точки.

Далее выполняется фрагмент подпрограммы, имеющий метку rdpnt4. В нем восстанавливаются значение переменной cur__win и исходное окно видеопамяти, после чего происходит безусловный переход на метку rdpntl для окончательного формирования кода и выхода из подпрограммы.



Содержание раздела