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

         

Сохранение и изменение содержимого вектора 1Ch



Пример 5.25. Сохранение и изменение содержимого вектора 1Ch

хоr ах, ах ; очистка регистра ах
mov CurStat, al ; запрет построения рисунка курсора
mov fs, ax ; очистка сегментного регистра fs
lea ax, cs:Timeint ах=адрес прерывающей подпрограммы
mov bx, cs bx=сегмент прерывающей подпрограммы
cli запрещаем прерывания
xchg fs:[7Oh], ax перестановка содержимого ах и 7Oh
xchg fs:[72h], bx перестановка содержимого bx и 72h
mov cs:VeclC, ax \/ес1С=исходное значение слова 70h
mov cs:VeclC+2, bx Уес1С+2=исходное значение слова 72h
sti разрешаем прерывания

Перехват вектора ich производится в начале выполнения задачи, но после того, как подготовлено все необходимое для корректной работы прерывающей подпрограммы. В нашем случае имя прерывающей подпрограммы Timeint, а для ее корректной работы надо запретить построение рисунка текстового курсора. Для этого вторая команда примера очищает переменную CurStat.

Для доступа к словам вектора прерывания очищается один из сегментных регистров, в примере 5.25 это регистр fs, его очищает третья команда. Затем в регистры ах и bx записываются адрес прерывающей подпрограммы и сегмент, в котором она находится. Прежде чем изменять содержимое вектора, надо запретить прерывания. Это делается потому, что выполнение задачи никак не синхронизировано с таймером и прерывание от последнего может произойти в тот момент, когда задача начала, но еще не завершила изменение и запоминание содержимого вектора ich.

Прерывание запрещает команда cli, после нее производится обмен содержимого (xchg) слов вектора и регистров ах и bx. В результате в словах вектора ich окажется новый, а в регистрах ах и bx старый адрес, который надо запомнить. Следующие две команды пересылают старый адрес в слова vecic и vecic+2, после чего команда sti разрешает прерывания.



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