mov dx, Cur_win | ; запись в dx значения окна |
xor bx, bx | ; признак установки окна |
mov ax, 4F05h | ; код функции BIOS |
int 10h | ; обращение к BIOS |
Ускорение работы с окнами. В описании стандарта VESA не рекомендуется использовать прямое обращение к BIOS для установки окна. Причина простая — при обращениях к BIOS с использованием прерываний, например int lOh, выполняется много вспомогательных действий, связанных с сохранением регистров и расшифровкой кода запроса. Специфической особенностью прерывания int 10h является то, что на обращения к нему реагируют компоненты DOS и некоторые резидентные (постоянно находящиеся в оперативной памяти) задачи, например русификатор KEYRUS. В результате количество дополнительных и ненужных в данном конкретном случае действий оказывается значительно больше количества полезных действий, выполняющих запись или чтение окна. По этой причине разработчики стандарта VESA рекомендуют использовать только процедуру BIOS, которая выполняет чтение или запись окна и состоит всего из 10—15 команд. В описании стандарта процедура называется video Memory control (VMC). Способ сохранения ее адреса показан в примере 2.6.
При вызове процедуры VMC для чтения или установки окна регистры bx и dx заполняются так же, как и при обращении к функции 4F05h. Прежде чем рассматривать конкретные примеры, мы обсудим несколько вопросов, имеющих отношения к работе с окнами.
Описание гнезда подпрограмм. Установка или изменение текущего окна производится в задачах при построении, перемещении или копировании рисунков, управлении курсором, выводе и редактировании текста, т. е. при любых манипуляциях с графическими объектами. Поэтому вызов процедуры VMC целесообразно оформить в виде подпрограмм, расположенных в теле основной задачи.
Опыт показывает, что при работе с графикой номер нового окна чаще всего отличается от текущего значения на единицу. Поэтому целесообразно составить гнездо подпрограмм, которые производят установку не только указанного, но и следующего или предыдущего окна.
Номер текущего окна бывает нужен сравнительно часто, поэтому его надо хранить в рабочей области памяти в переменной cur_win, имеющей размер слова. Конкретное значение этой переменной зависит от выполняемых задачей действий. Обычно в текущем окне располагаются графический курсор, обрабатываемая часть рисунка или редактируемый текст. В некоторых случаях текущее окно может соответствовать области видеопамяти, не отображаемой в данный момент на экране.
В примере 2.8 описаны три подпрограммы, предназначенные для установки значения окна путем вызова процедуры VMC. Подпрограммы оформлены как внутренние, поэтому они должны быть расположены в том же сегменте памяти, в котором находится основная программа. Обращения к ним производятся с помощью команды call, в которой указано имя (метка) подпрограммы. Входным параметром для всех трех подпрограмм является переменная Cur win, исходное значение которой изменяется при установке следующего или предшествующего окна. Так и должно быть, поскольку новое окно становится текущим. Подпрограммы не изменяют содержимое регистров общего назначения, с которыми они работают.
Подпрограммы SetWin, NxtWin и PrevWin. Ядром примера 2.8 является подпрограмма setwin (вызов call Setwin). Она помещает текущее окно в регистр dx, очищает регистр bx и вызывает процедуру VMC для установки указанного окна. Прерывание int lOh не используется, что соответствует рекомендациям стандарта VESA.
Подпрограмма Nxtwin (обращение call Nxtwin) устанавливает следующее окно. При ее выполнении текущее значение переменной Cur__win увеличивается на единицу приращения (crunit), а затем выполняется setwin.
Подпрограмма PrevWin (обращение call PrevWin) устанавливает предыдущее окно. При ее выполнении текущее значение переменной Cur_win уменьшается на единицу приращения (GrUnit), а затем вызывается setwin.