Иллюстрированный самоучитель по SVGA

Процедуры для работы с одним окном видеопамяти

Описание гнезда подпрограмм

Установка или изменение текущего окна производится в задачах при построении, перемещении или копировании рисунков, управлении курсором, выводе и редактировании текста, т. е. при любых манипуляциях с графическими объектами. Поэтому вызов процедуры 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.

Пример 2.8. Три подпрограммы для работы с видеоокнами.

  ; Установка следующего окна
NxtWin: push ax ; сохраняем содержимое ах
mov ax, GrUnit ; читаем единицу приращения окна
add Cur win, ax ; увеличиваем номер окна
pop ax ; восстанавливаем содержимое ах
; Установка окна, указанного в Cur win
SetWin: PushP,eg <ax,bx,dx> ; сохранение содержимого регистров
xor bx, bx ; признак установки окна
mov dx, Cur win ; номер устанавливаемого окна
call [VMC] ; обращение к подпрограмме BIOS
PopReg <dx,bx,ax> ; восстановление содержимого регистров
ret ; возврат из подпрограммы
; Установка предыдущего окна
PrevWIN push ax ; сохранение содержимого ах
mov ax, GrUnit ; читаем единицу приращения окна
sub Cur win, ax ; уменьшаем номер окна
pop ax ; восстанавливаем содержимое ах
jmp SHORT SetWin ; переходим на установку окна
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.