Цитата(rmihail @ Apr 27 2005, 08:01)
На самом деле енавле и дизабле хоть ставь хоть нет эффект тотже. Сначала их не было, потом начал всякие эксперименты ставить. Так что проблема не в этом

Эффект все-таки "не тот же".
По крайней мере процедура выполняется медленнее.
Кроме того, результат в таких случаях носит вероятностный
характер.
"Это надо знать точно". Ни понять, не заосциллографировать
(чуть язык не сломал

) тут ничего не удасться.
Цитата
docommonwrite( (char *) &t,4,'t'); // запись текущего времени
cnt = 0;
enable(); // востановление прерываний
Это не будет работать потому, что энейбл и дизэйбл - это
разрешение/запрещение прерываний центральному процессору.
Кстати, лучше делать так:
asm sti; // enable
asm cli; // disable
Но система прерываний (в Вашей программе) не приведена в исходное
состояние. Это значит, никаких прерываний не будет .Независимо
от их разрешения.
Цитата
enable(); // востановление прерываний
SvInt08(); // вызов старого обработчика прерывания
А вот это, видимо, Ваша проблема.
Дело в том, что прерывания "активизируются" командой INTx.
Вот как она работает:
asm pushf; !!
asm cli;
asm call dword ptr [4*x]
А заканчивается прерывание командой IRET, которая:
asm pop ip
asm pop cs
asm popf
Точнее вы и сами можете почитать. <_<
Поэтому нельзя просто так вызвать старый обработчик.
надо что-то вроде:
asm pushf;
OldVector ();
При этом надо быть уверенным, что адрес старого обработчика
спасен как (far *)
Я бы посоветовал вам сделать (для начала) прерывание по рыбе:
void interrupt some_routine (void)
{
// для начала сбросим систему прерываний:
RESET_MASTER_IC // это outportb (0x20,0x20);
// RESET_SLAVE_IC // это outportb (oxA0,0x20); - если используется слэйв
.
.
// тело обработчика
.
.
}
И фсе !
Если это будет работать устойчиво, тогда можно будет ставить
еще эксперименты.

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