У меня такая проблемма: я написал резидента, обработчик $9 прерывания, он у меня к прерыванию 10h часто обращается (для работы с экраном) и 15h(для задержки) И все это у меня зависает! Что может вызывать зависание?
virt
25.05.2004 22:13
может быть 15h и 10h какимто образом вызывают 9h?
Altair
25.05.2004 22:19
Не могут они вызывать никакие прерывания! Во-первых 9h прерывание вызывается только когда нажимается клавища, во-вторых ни одно прерывание не вызывает другого!
virt
25.05.2004 22:26
а ты регистры перед вызовом сохраняешь? и после выхода восстанавливаешь? может сохраняешь n байт в стеке ,а восстанавливаешь m<>n?
Altair
25.05.2004 23:13
Цитата
а ты регистры перед вызовом сохраняешь?
Ага, вот где собака зарыта! А я уже разобрался - это только с задержкой проблеммы! Может подскажите какую - нибудь процедуру для задержки (можно что-то посчитать)
virt
26.05.2004 0:28
а задержка на сколько нужна?
если на 1/18 секунду то можно так :
var timer:longint absolute $0:$046c; brtime:longint;
begin brtime:=timer+1; while timer<brtime do end.
timer -- обновляется 18.2 раза в сек. как сделать задержку в реальном режиме поменьше есть только одно предположение : заводим переменную большую :longint например ,и в цикле выполнения чего-то там увеличиваем её значение. В начале узнаем тактовую частоту как-нить ,и потом берем коэффициент во сколько раз эта частота больше эталонной.
Altair
26.05.2004 2:22
Ну я так и делаю - цикл с 10000 повторениями присваиваниями. Кстати и таймер можно ускорить! Здесь обсуждалось как.
BlackShadow
26.05.2004 2:39
Не забудь всё "обрамить" CLI/STI
Altair
26.05.2004 10:52
Цитата
Не забудь всё "обрамить" CLI/STI
Не забуду. Я этого резидента сейчас уже дописал, и теперь перевожу на АСМ. А странно, почему возникает эта проблемма, если пользоватся прерыванием 15h, а со всеми остальными нормально.
BlackShadow
26.05.2004 22:37
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?
Altair
26.05.2004 22:42
Цитата
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?
Нет и без CLI не работает!
virt
27.05.2004 0:10
Цитата
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?
cli не закрывает прерывание ,оно запрещает вызов новых прерываний.
Altair
27.05.2004 10:49
Цитата
cli не закрывает прерывание ,оно запрещает вызов новых прерываний.
Да, и тогда тем-более зависание не от этого.
Я вот думаю, что это как -то связанно с видео функциями. Где-то (не помню где), я прочитал, что написанный в пасе резидент, не может обращатся к видеосервису. Может такое быть?
BlackShadow
27.05.2004 15:31
Ага. А старушка, переходящая дорогу не может нести сумку.
Altair
27.05.2004 17:55
Если старушка однозадачная, или работает в реальном режиме, то не может, а если работает в защищенном режиме или многозадачная, то может!
BlackShadow
27.05.2004 18:04
В защищённом режиме она ещё и за содержимое сумки может не беспокоиться, если положит её в память с ограниченными правами доступа
Altair
27.05.2004 22:24
А если серьезно, то какой, "жизенный цикл" TSR ? В "MS-DOS для разработчика", все на асме, а как выглядит "скелет" TSR на пасе? Тот, что в справке к BP7, глюченый.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.