Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Стивенс Ал. Весь текст 495.21 Kb

Техника программирования на турбо-С

Предыдущая страница Следующая страница
1 ... 30 31 32 33 34 35 36  37 38 39 40 41 42 43
 записываются до завершения и  обьявления  себя  резидентной. При
вызове TSR-программы один из сохраненных адресов PID используется
для чтения PID прерванной программы.  Это значение  запоминается,
устанавливается  значение  PID   резидентной   программы.   Перед
завершением резидентной программы она восстанавливает  в  системе
PID прерванной программы.

     Этот способ  используется в функциях резидентного драйвера в
главе 12.


     Дисковый буфер.
-----------------------------------------------------------------

     Вторая часть  PSP  -  это  дисковый  буфер,  область,  через
которую ДОС   пишет   и   читает  дисковые  файлы,  открытые  для
использования  с  FCB.  ДОС  также  использует  эту  область  для
функций, работающих с подкаталогами.

     В библиотеке    Турбо    Си   есть   функции,   читающие   и
устанавливающие адрес дискового буфера.  Getdta возвращает  адрес
текущего дискового буфера,  и setdta изменяет адрес.  Эти функции
имеют следующий формат:

#include 
char far *dta;

dta = getdta();

setdta(dta);

     Если TSR-программа  будет использовать функции ДОС,  которые
пишут в дисковый буфер,  она  должна  сохранить  адрес  дискового
буфера прерванной программы, установить свой, и перед завершением
работы восстановить предыдущий адрес.

     Если TSR-программа  будет  писаться  на  Си,   нельзя   быть
уверенным,  что  она  не  изменяет  или  не  использует  дисковый
буфер. Действия функций из библиотеки Си достаточно не изучены, и
лучшим  решением  будет  самое  осторожное.  Резидентный драйвер,
описанный в  главе  12,  сохраняет  дисковый   буфер   прерванной
программы.


     Прерывание от клавиатуры (9).
-----------------------------------------------------------------

     При нажатии   пользователем   "горячего  ключа"  резидентная
программа должна прервать  все,  что  бы  ни  делала  система,  и
запустить себя.  Чтобы сделать это,  программа должна сканировать
клавиатуру в поисках "горячего ключа".  Понимание этого  процесса
требует  понимания,  как  работает  прерывание  от  клавиатуры  и
сканирование кодов.

     Нажатие клавиши  генерирует  прерывание   9,   и   обработка
передается программе  по адресу вектора прерывания 9.  Она должна
прочитать порт  данных  клавиатуры  и  обработать  это  значение.
Клавиатура  PC  генерирует  код сканирования,  который может быть
прочитан из входного  порта  клавиатуры,  а  не  значение  ASCII,
поступающее  в вашу программу при использовании функции get_char.
Каждая клавиша на клавиатуре  имеет  свое  собственное  значение.
Программа  должна  определить  по  нему,  какая  клавиша  или  их
комбинация нажата, и что делать с ними.

     Программа обработки прерывания от клавиатуры,  находящаяся в
ROM-BIOS (базовой   системе  ввода-вывода  в  ПЗУ),  читает  коды
сканирования, переводит их в коды ASCII,  и пересылает их в буфер
клавиатуры. Программы   (включая  ДОС),  читающие  с  клавиатуры,
читают коды из  буфера.  ROM-BIOS  поддерживает  байт  состояния,
показывающий,  были  ли нажаты клавиши Alt,  правый Shift,  левый
Shift, и  Ctrl.   Программа   может   прочитать   эти   значения,
восстановив у себя байт состояния. В главе 12 иллюстрируются коды
сканирования и значения байта состояния клавиатуры.

     TSR-программа может  присоединить  себя  к   прерыванию   9.
Подпрограмма  обработки  прерывания в резидентной программе может
поддерживать  выполнение  программы  из  ROM-BIOS,   читая   коды
сканирования и байт состояния,  и проверяя,  не нажат ли "горячий
ключ". Если нет, то обработка дальше предоставляется программе из
ROM-BIOS.

     Если в  TSR-программе нет вызовов функций ДОС,  подпрограмма
обработки  прерывания  9  может  непосредственно  выполнить  свою
функцию.   Если   же   необходимо   использовать   функции   ДОС,
подпрограмма должна выставить флаг присутствия "горячего ключа" и
закончить работу. Другие подпрограммы обработки прерывания должны
заметить этот флаг и выполниться,  если это  безопасно.  Одна  из
подпрограмм, ждущая подходящего момента для выполнения функции, -
это подпрограмма обработки прерывания от таймера.


     Прерывание от таймера.
-----------------------------------------------------------------

     Работа PC  прерывается  18.2  раза   в   секунду   системным
таймером,  который  использует вектор прерывания 0х1c для запуска
подпрограммы обработки.  В главу 12  включен  пример  резидентной
программы       "часы",      использующей      прерывание      от
таймера. TSR-программы,  вызываемые по  "горячему  ключу",  также
должны использовать это прерывание, поэтому надо прикрепиться и к
вектору 0х1с.  Так как программа не может  выполняться,  пока  не
убедится,  что  использование  функций  ДОС  безопасно,  то  надо
проверить, установлен ли флаг "горячего ключа", как описано выше,
и затем  проверить безопасность.  Если эти два условия выполнены,
то подпрограмма обработки прерывания от таймера  может  запускать
основную резидентную программу.

     Как и  в  случае  с  прерыванием от клавиатуры,  должна быть
реализована  возможность  работы   с   прерыванием   от   таймера
программе,  которая до этого была обработчиком такого прерывания.


     Проблема реентерабельности ДОС.
-----------------------------------------------------------------

     Вы уже  читали  о  проблемах,  возникающих при использовании
функций ДОС из резидентных  программ.В  случае,  когда  программа
прерывает  ДОС  и хочет использовать ее функции,  ДОС не является
реентерабельной.  Может случиться так,  что при нажатии "горячего
ключа"  ДОС  будет  находиться в состоянии ввода с клавиатуры,  и
пользователю не удастся быстро вызвать TSR-программу,  так как до
окончания ввода она не может начать выполнение.


     Два стека ДОС.
-----------------------------------------------------------------

     ДОС поддерживает  два  стека.Когда  ДОС  выполняет  одну  из
функций с номером от 0  до  12,  используется  первый  стек;  при
выполнении других  функций  используется  второй.  ДОС  сохраняет
значение сегментного регистра стека и регистра смещения стека для
каждой  группы  функций  отдельно;  но  реентерабельных  функций,
однако, нет.  Сохраненные значение регистров  при  первом  вызове
функции могут быть затерты при следующем вызове.

     ДОС лучше определить как полуреентерабельную. При прерывании
выполнения функций 0-12 безопасно вызывать остальные  функции,  и
наоборот.

     Можно легко   избежать   использования   функций  0-12.  Они
предназначены для организации консольного ввода и вывода. Но есть
много других способов,  чтобы управлять клавиатурой и экраном,  и
частенько они работают  лучше,  чем  функции  ДОС.  Использования
остальных функций  не  так-то легко избежать.  С их помощью можно
делать многое из того, что нужно в резидентной программе, включая
управление файлами.

     Если вы  можете  избежать  использование  функций  0-12,  но
нуждаетель в остальных функциях,  то  ситуация  с  двумя  стеками
работает на вас.  При уверенности, что прерывания по вызову вашей
программы будут происходить не во  время  работы  функций  второй
группы,  проблемы  реентерабельности  не существует. Задачу можно
решить установкой  флажка  ввода  "горячего  ключа"  и  ожиданием
окончания  работы  небезопасных  функций ДОС,  если таковая имеет
место. Эти функции работают быстро,  так что большой задержки  не
получится.

     Теперь остальсь узнать, каким способом получить информацию о
возможности использовать ДОС. Такую информацию содержит системный
флажок занятости.



     Системный флажок занятости (0х34).
-----------------------------------------------------------------

     Функция ДОС 0х34  возвращает  сегментный  адрес  и  смещение
специального флага в памяти,  поддерживаемого ДОС.  Он называется
системным флажком занятости. Этот флаг устанавливается, когда ДОС
выполняет одну  из своих "небезопасных" функций.  После выхода из
функции ДОС очищает флаг.

     При первом запуске TSR-программы она использует  функцию ДОС
0х34  для  нахождения  и  запоминания  адреса  системного  флажка
занятости.  При   каждом   прерывании   от   системного   таймера
обработчик, находящийся в TSR-программе, проверяет наличие флажка
"горячего ключа",  устанавливаемого  обработчиком  прерывания  от
клавиатуры, и отсутствие системного флажка занятости. При наличии
этих двух условий обработчик таймера сбрасывает  флажок "горячего
ключа" и запускает основную часть TSR-программы.

     Такая процедура  временами  срабатывает.  Но  временами  ДОС
остается  занятой,  пока  пользователь   занят   чем-то   другим,
например, набирает  символы в командной строке.  Если при этом он
нажмет "горячий ключ",  то обработчик клавиатуры  установит  флаг
"горячего  ключа",  но  обработчик  таймера  никогда  не запустит
TSR-программу. Чтобы бороться в таких условиях, надо использовать
вектор прерывания DOSOK.


     Прерывание DOSOK.
-----------------------------------------------------------------

     Часто наступают   периоды,   когда   ДОС  занята,  но  можно
использовать вторую группу функций;  например,  когда ДОС ожидает
ввода строки символов. В этом случае ДОС вызывает прерывание 0х28
- DOSOK.  Цель этого - известить  TSR-программу  (в  частности  -
системный  спулер  PRINT.COM  ),  о  том,  что можно использовать
функции второй группы.  Если никакая программа не  прикреплена  к
этому прерыванию,   оно   просто   указывает   на  команду  IRET.
Прерывание 0х28    -    программное    прерывание;    обработчик,
прикрепленный  к  нему,  будет  вызываться из другой программы по
команде INT 0х28.

     TSR-программы могут  прикрепляться  к  прерыванию  DOSOK   и
использовать его для обнаружения занятости ДОС.  Обработчик этого
прерывания из TSR-программы проверяет установку  флажка "горячего
ключа"  и  в  зависимости от его значения либо запускает основную
часть  TSR-программы;  либо  возвращает   управление   программе,
вызвавшей  это прерывание,  или программе,  ранее прикрепленной к
этому прерыванию.

     Прерывание DOSOK вызывается  в  случае,  когда  ДОС  занята;
однако  TSR-программа,  вызванная  в  это  время,  не  может быть
прервана  другой  такой  же   программой   до   тех   пор,   пока
выполняющаяся  TSR-программа  не  сделает  вызов прерывания 0х28.
Причина  этого  ограничения  в  том,  что  когда   ДОС   вызывает
прерывание  DOSOK,  флажок  занятости ДОС остается установленным.
При выполнении TSR-программы  он  не  меняет  значения,  и,  если
пользователь нажмет  "горячий ключ" для другой TSR-программы,  ее
обработчик  таймера  будет  ожидать,  пока  флажок  занятости  не
сбросится. А    это    не    случится    до   окончания   текущей
TSR-программы. Такая  ситуация  всегда   случается   при   вызове
TSR-программы   в   момент,   когда  ДОС  ожидает  ввода  команды
пользователя.

     Резидентная программа,   чтобы   разрешить   прервать   свое
выполнение  другой такой же программе,  должна вызвать прерывание
DOSOK в подходящее время.  Лучше всего это сделать, когда текущая
программа ожидает ввода строки от пользователя.  Если вы обратили
внимание, функция get_char из главы 4 вызывает прерывание 0х28 во
время ожидания ввода строки. Это делается для поддержки концепции
резидентных программ,  описанной в этой главе  и  используемой  в
главе 12.

     Дисковое прерывание ROM-BIOS.(0х13)
-----------------------------------------------------------------

     Дисковые операции   нельзя   прерывать  из-за  возникновения
ошибок в   прерванной   программе.    Чтобы    избежать    этого,
TSR-программа должна присоединить себя к дисковому прерыванию ROM
-BIOS 0х13. Если какой-либо процесс вызывает это прерывание, TSR-
программа  устанавливает  флаг  и  затем  передает  управление по
старому адресу  прерывания.  Когда  обработка   прерывания   0х13
завершается, TSR-программа  очищает  флаг.  Этот флаг проверяется
Предыдущая страница Следующая страница
1 ... 30 31 32 33 34 35 36  37 38 39 40 41 42 43
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама