циал расширенной памяти в Вашем собственном программном обеспече-
нии путем снабжения исчерпывающим набором листингов на языке С
фирмы Microsoft версия 5.0. Мы также представим пример приложения
спецификации расширенной памяти, в котором используются некоторые
из более сложных функций расширенной памяти. В таблице 7-4 кратко
перечислены листинги, которые Вы найдете в конце данной главы.
Таблица 7-4
Программы сопряжения на низком уровне
ДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Лис-¦Имя файла ¦ Содержание
тинг¦ ¦
ДДД†ДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
7-2¦EMMCONST.H¦Обеспечивает #defines для общих констант менед-
¦ ¦жера расширенной памяти
7-3¦EMMTYPES.H¦Содержит typdefs (определения типов) для структур
¦ ¦данных, передаваемых между функциями сопряжения
¦ ¦спецификации расширенной памяти и прикладными
¦ ¦программами спецификации расширенной памяти
7-4¦EMMERMSG.C¦Дает массив символьных строк,обеспечивающих крат-
¦ ¦кое текстовое описание для каждого ненулевого
¦ ¦кода состояния функции спецификации расширенной
¦ ¦памяти
7-5¦EMMFUNC.C ¦Исчерпывающая библиотека функций спецификации рас-
¦ ¦ширенной памяти. Если не определено иное, любая
¦ ¦функция спецификации расширенной памяти возвра-
¦ ¦щает код состояния функции спецификации расши-
¦ ¦ренной памяти как целое
7-6¦EMMFUNC.H ¦Содержит прототипы функций для каждой функции в
¦ ¦EMMFUNC.С. Если Ваш компилятор поддерживает
¦ ¦прототипы функций, определенные в спецификации
¦ ¦языка С ANSI (как версия 5 фирмы Microsoft),
¦ ¦включение данного файла в Ваши приложения будет
¦ ¦гарантировать, что типы аргументов, указанные в
¦ ¦Ваших программах согласуются с типом парамет-
¦ ¦ров, ожидаемым вызванными функциями.
7-7¦EMMEXIST.H¦Содержит программы тестирования наличия расширен-
¦ ¦ной памяти. Метод "открытого обработчика" вы-
¦ ¦полняется функцией emm_exists (строка 25). Ме-
¦ ¦тод "получения вектора прерывания" тестирования
¦ ¦наличия расширенной памяти выполняется функцией
¦ ¦emm_exists2 (строка 113).
7-8¦SNAPSHOT.C¦Обеспечивает программу, остающуюся резидентной
¦ ¦после завершения, которая сохраняет текущее со-
¦ ¦держимое экрана дисплея в буфер в расширенной
¦ ¦памяти каждый раз, когда нажимается клавиша
¦ ¦PrtScr. Данная программа может сохранять столь-
¦ ¦ко образов экрана, сколько расширенной памяти в
¦ ¦Вашей системе.
7-9¦PLAYBACK.C¦Обеспечивает программу для копирования образов эк-
¦ ¦ранов, сохраненных программой SNAPSHOT в расши-
¦ ¦ренной памяти, в стандартный выходной файл DOS.
¦ ¦Экранные изображения программы мо
- 7-50 -
¦ ¦гут захватываться постоянно, например, путем
¦ ¦перенаправления стандартного выходного файла
¦ ¦PLAYBACK в дисковый файл.
7-10¦BEEP.ASM ¦Утилита для издания звука слышимого тона на встро-
¦ ¦енном динамике PC.
ДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
О примере приложения
Пример приложения состоит из двух программ: SNAPSHOT.C и
PLAYBACK.C. SNAPSHOT.C - программа, остающаяся в памяти резидент-
но после завершения, которая сохраняет образы текстовых экранов в
расширенной памяти путем перехвата прерывания печати экрана
(int 5). Данное прерывание выдается всякий раз, когда нажимается
клавиша PrtScr или Print Screen. SNAPSHOT также строит индексную
структуру данных в расширенной памяти, которая содержит номер ло-
гической страницы и смещение в байтах для каждого образа экрана,
сохраненного в расширенной памяти. PLAYBACK просто считывает ин-
дексную структуру данных, копируя каждый из текстовых экранов из
расширенной памяти в стандартный выходной файл DOS. На рис. 7-4
показано использование расширенной памяти для установления связи
между двумя независимыми программами.
Для того чтобы продемонстрировать некоторые из более сложных
идей расширенной памяти, которые были представлены в данной гла-
ве, данное приложение с необходимостью является более сложным,
чем мог бы ожидать программист среднего уровня от первого проекта
приложения расширенной памяти. Разработчики, которые незнакомы с
программами, остающимися резидентными по завершении, и программи-
рованием драйверов прерываний в среде DOS, могут ощущать особенно
значительные трудности, воспринимая большую часть кода
SNAPSHOT.C, которая требуется для установки, управления и заверше-
ния самой программы.
В то же время в программе SNAPSHOT - не только доля усложне-
ний, связанных с DOS, использование переключения контекста и но-
вых функций спецификации расширенной памяти LIM 4.0 предлагает
ценный пример для изучения идей спецификации расширенной памяти,
которые не всегда демонстрируются в руководствах по программиро-
ванию спецификации расширенной памяти. Ключевые средства специфи-
кации расширенной памяти, использованные в SNAPSHOT, включают в
себя:
* Разделение расширенной памяти между программами с помощью
средства "Именования обработчика" (функция 20 спецификации расши-
ренной памяти).
* Переключение контекста с помощью "Получить/установить
отображение страниц" (функция 15 спецификации расширенной памя-
ти).
* Перемещения блоков данных между обычной и расширенной па-
мятью с помощью функции "Передвинуть/обменять область памяти"
(функция 18 спецификации расширенной памяти).
* Динамическое добавление логических страниц к ранее разме-
щенным для обработчика спецификации расширенной памяти с помощью
функции переразмещения страниц (функция 18 спецификации расширен-
ной памяти).
Примечание: Для выполнения этих программ Ваш менеджер расши-
ренной памяти должен поддерживать спецификацию расширенной памяти
LIM 4.0.
- 7-51 -
Несколько соображений по кодированию
Фактические действия по сохранению экранов видеоотображения
в расширенной памяти тривиальны. Единственного вызова функции
спецификации расширенной памяти "Передвинуть/обменять область па-
мяти" на строке 175 SNAPSHOT.C достаточно для копирования всего
образа экрана из видеобуфера в расширенную память. Так как это
происходит внутри обработчика прерывания, функция "Получить отоб-
ражение страниц" на строке 110 требуется для сохранения контекста
SNAPSHOT.EXE ("после завершения остаться в памяти")
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦
¦ ¦inst_isr(вход при нажатии PrtScr)¦ ¦
¦ ¦ 1.Сохраняет состояние emm ¦ ¦
¦ ¦ 2.Копирует образ экрана ¦ ¦
¦ ¦ в расширенную память ¦ ¦
¦ ¦ 3.Обновляет индекс образа эк- ¦ ¦
¦ ¦ рана в расширенной памяти ¦ ГДДД¬
¦ ¦ 4.Восстанавливает состояние emm ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦ ¦
¦ ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦ ¦
¦ ¦main ¦ ¦ ¦
¦ ¦ 1.Начинает,завершает и сооб- ¦ ¦ ¦
¦ ¦ щает состояние программы ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦
¦ Расширенная память
SNAPSHOT ¦
ЪДДДДДДДДДДДДДДВДДДДДБДДДДДДВДДДДДДДДДДДД¬
¦ Заголовок и ¦Образ экрана¦Образ экрана¦
0 ¦ индекс экрана¦ 1 ¦ 2 ¦
ГДДВДДДДДДДДДДДБВДДДДДДДДДДДБДВДДДДДДДДДДґ
¦ ¦Образ экрана¦ . . . ¦ . . . ¦
1 ¦ ¦ 3 ¦ ¦ ¦
ГДДБДВДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДґ
¦ ¦ ¦
2 ¦ ¦ ¦
ГДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
3 ¦ ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
4 ¦ ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
5 ¦ ¦
АДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДЩ
¦
PLAYBACK.EXE ¦
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦
¦1.Обнаруживает расширенную память¦ ¦
¦2.Ищет идентификатор обработчика ¦ ¦
¦3.Отображает в индекс экрана ¦ ¦
¦4.Отображает в каждый образ эк- ГДДДДДДДЩ
¦ рана и копирует в стандартный ¦
¦ выходной файл ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 7-4. Пример приложения - SNAPSHOT/PLAYBACK
- 7-52 -
отображения спецификации расширенной памяти. Функция "Установить
отображение страниц" на строке 120 восстанавливает отображение
страниц спецификации расширенной памяти, которое имело место пе-
ред входом в драйвер прерывания.
Функция "Установить имя обработчика" на строке 372 SNAPSHOT.
C связывает имя в кодах ASCII "SNAPSHOT" с обработчиком специфи-
кации расширенной памяти, который данной программой размещен для
сохранения экрана. Путем задания обработчику имени программа
PLAYBACK может определить положение и обратиться к данной области
расширенной памяти, не зная действительного номера обработчика,
значение которого может изменяться каждый раз, когда стартует
SNAPSHOT.
Листинг 7-2. EMMCONST.H
------------------------------------------------------------------