Программирование игр для Windows. Советы профессионала

       

Реализация многозадачности при помощи прерываний


При работе под операционной системой DOS, если и существует какой-нибудь способ, с помощью которого мы можем реализовать многозадачность, так это только использование механизма прерываний. Некоторые прерывания вырабатываются в результате внешних событий, в то время как другие евязаны с событиями внутренними. Для примера, давайте сначала рассмотрим, пожалуй самое популярное прерывание — прерывание от клавиатуры.

Всякий раз, когда происходит нажатие клавиши, ваша программа, что бы она при этом ни делала, останавливается и начинает работать процедура обслуживания прерываний клавиатуры. (Готов спорить, вы и не подозревали, что ваша программа останавливается при каждом нажатии на клавишу, однако это действительно так!) После окончания процедуры обслуживания прерывания управление снова передается вашей программе. Во время всего этого процесса ваша программа, данные и все остальное остается целым и невредимым. Для любой процедуры обслуживания прерываний это Правило Номер Один; без определенной цели ничего не должно уничтожаться. Так, например, если ваша процедура обслуживания прерывания использует для своей работы регистры процессора, вам первым делом следует сохранить содержимое этих регистров, затем осуществить обработку прерывания и снова восстановить содержимое регистров в точно таком же виде, каким оно было до прерывания.

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

Таблица 12.1. Прерывания ПК.



Номер

Адрес

Функция

0h

000-003h

Деление на ноль

1h

004-007h

Пошаговое выполнение

2h

008-00Bh

Немаскируемуе прерывание

3h

00C-00Fh

Точка останова

4h

010-013h

Переполнение

5h

014-017h

Печать содержимого экрана

6h

018-01Bh

Зарезервировано

7h

01C-01Fh

Зарезервировано

8h

020-023h

Таймер 18.2

9h

024-027h

Клавиатура

0Ah

028-02Bh

Зарезервировано

0Bh

02С-02Fh

RS-232 Порт 1

0Ch

030-033h

RS-232 Порт 0

0Dh

034-03Bh

Жесткий диск

0Eh

038-03Bh

Дискета

0Fh

03C-03Fh

Зарезервировано

10h

040-043h

Функция видеовывода

11h

044-047h

Проверка оборудования

12H

048-04ВН

Проверка памяти

13Н

04C-04FH

Функции ввода/вывода на дискету

14Н

050-053Н

Функции ввода/вывода последовательного порта

15Н

054-057Н

Функции ввода/вывода на кассетный магнитофон

16Н

058-05ВН

Функции ввода клавиатуры

17Н

05C-05FH

Функции вывода на принтер

18Н

060-063Н

Точка входа в ROM BIOS

19Н

064-067Н

Процесс загрузки

1АН

068-06ВН

Получение информации о времени

1ВН

06C-06FH

Управление прерыванием

1СН

070-073Н

Управление таймером

1DH

074-077Н

Таблица инициализации видеосистемы

1ЕН

078-07ВН

Таблица параметров дискеты

1FH

07C-07FH

Таблица графических символов

20Н

080-083Н

Завершение DOS

программы

21Н

084-087Н

Универсальные функции DOS

22Н

088-08ВН

Адрес завершения DOS

2ЗН

08C-08FH

Адрес обработчика Ctrl+Break

24Н

090-093Н

Адрес обработчика критических ошибок DOS

25Н

094-097Н

Абсолютное чтение с диска DOS

26Н

098-09ВН

Абсолютная запись на диск DOS

27H

09C-09FH

Установка резидентной программы DOS

28-3FH

0A0-0FFH

Зарезервировано для DOS

40-7FH

100-1FFH

Не используется

80-F0H

200-ЗСЗН

Зарезервировано для Бейсика

F1-FFH

3C4-3FFH

Не используется

<


Таблица 12.1 - это таблица векторов прерываний. Она занимает первые 1024 байт памяти каждого персонального компьютера. Всего в этой таблице 256 элементов, каждый из которых имеет размер 4 байта и представляет собой значение дальнего указателя на процедуру обслуживания прерывания. Как вы могли заметить, персональный компьютер не использует все 256 прерываний. Однако число задействованных прерываний постоянно растет.

Персональный компьютер поддерживает прерывания как на аппаратном, так и на программном уровне. Программные прерывания создаются с помощью расширенного набора инструкций процессора 80х86. Они были разработаны специально для того, чтобы дать возможность не только физическим устройствам мгновенно прерывать исполнение текущей программы. Большинство прерываний на персональном компьютере осуществляются программным путем. Однако некоторые осуществляются только с помощью аппаратуры (к ним относятся немаскируемые прерывания и прерывания от клавиатуры). С точки зрения программиста оба типа прерываний работают одинаково, поэтому нас это деление затрагивать не будет.

Внимание!

При использовании прерываний будьте очень осторожны: вы играете с огнем. Если вы допустите ошибку, компьютер может «зависнуть», что иногда приводит к потере важных данных. Будьте внимательны!

Итак, в соответствии с характером нашей игры мы должны выбрать нужные нам прерывания. Как их выбирать, еще не ясно, но мы разберемся с этим чуть позже. Затем нам нужно будет зарегистрировать (установить) свою собственную процедуру обработки прерываний. Вот, собственно, и все.

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


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