Системное программное обеспечение персональных ЭВМ


Пример 6 - часть 2


Выкл.звука и пауза */ silence(); for(i=0; i>8); outportb(0x61,inportb(0x61)|0x03); } /*==== Выключение звука ====*/ silence() { outportb(0x61,inportb(0x61)&0xfc); } /*==== Получение старого вектора ====*/ void *readvect(int in) { rr.h.ah=0x35; rr.h.al=in; intdosx(&rr,&rr,&sr); return(MK_FP(sr.es,rr.x.bx)); } /*==== Запись нового вектора ====*/ void writevect(int in, void *h) { rr.h.ah=0x25; rr.h.al=in; sr.ds=FP_SEG(h); rr.x.dx=FP_OFF(h); intdosx(&rr,&rr,&sr); }

Обратим внимание на то, что номер прерывания таймера определен как макро-константа TIMEINT. Значение этой константы - 8, но может быть и 0x1C. Дело в том, что в ПЭВМ специфицированы два прерывания таймера: 8 и 0x1C, последнее носит название пользовательского прерывания по таймеру. Это не аппаратное прерывание, оно вызывается программно из обработчика прерывания 8. Системный обработчик прерывания 0x1C содержит единственную команду IRET. Что дает нам наличие этого прерывания? Честно говоря, ничего нового. По-видимому, это прерывание было введено в рассчете на то, что если в ПЭВМ имеется единственная программа пользователя, обрабатывающая сигналы таймера, то эта программа может подключаться к вектору 0x1C, не соблюдая правила дополнения, о которых шла речь в разделе 3. Но на самом деле в памяти нашей ПЭВМ всегда находится целый набор несистемных, возможно резидентных, программ, некоторые из которых тоже обрабатывают сигналы таймера, возможно, тоже используя прерывание 0x1C. Поэтому обработчик этого прерывания должен включаться в цепочку так же, как и любой другой. (Заметим, что авторы некоторых программ, перехватывающих 0x1C, позволяют себе некорректную работу с этим вектором, поэтому использование прерывания 8 надежнее).

В приведенном примере 6.5 максимальная длительность звучания ноты - около 55 мсек (1 тик). Даже для воспроизведения не всякой мелодии такая характеристика может оказаться удовлетворительной. Нетрудно назвать задачи, в которых минимальный измеряемый временной интервал должен быть меньше.


- Начало -  - Назад -  - Вперед -