Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблеммы с резидентом.
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Altair
У меня такая проблемма:
я написал резидента, обработчик $9 прерывания, он у меня
к прерыванию 10h часто обращается (для работы с экраном) и 15h(для задержки)
И все это у меня зависает!
Что может вызывать зависание?
virt
может быть 15h и 10h какимто образом вызывают 9h?
Altair
Не могут они вызывать никакие прерывания!
Во-первых 9h прерывание вызывается только когда нажимается клавища,
во-вторых ни одно прерывание не вызывает другого!
virt
а ты регистры перед вызовом сохраняешь?
и после выхода восстанавливаешь?
может сохраняешь n байт в стеке ,а восстанавливаешь m<>n?
Altair
Цитата
а ты регистры перед вызовом сохраняешь?

Ага, вот где собака зарыта!
А я уже разобрался - это только с задержкой проблеммы!
Может подскажите какую - нибудь процедуру для задержки (можно что-то посчитать)
virt
а задержка на сколько нужна?

если на 1/18 секунду то можно так :
var timer:longint absolute $0:$046c;
   brtime:longint;

begin
  brtime:=timer+1;
  while timer<brtime do
end.


timer -- обновляется 18.2 раза в сек.
как сделать задержку в реальном режиме поменьше есть только одно предположение :
заводим переменную большую :longint например ,и в цикле выполнения чего-то там увеличиваем её значение. В начале узнаем тактовую частоту как-нить ,и потом берем коэффициент во сколько раз эта частота больше эталонной.
Altair
Ну я так и делаю - цикл с 10000 повторениями присваиваниями.
Кстати и таймер можно ускорить!
Здесь обсуждалось как.
BlackShadow
Не забудь всё "обрамить" CLI/STI
Altair
Цитата
Не забудь всё "обрамить" CLI/STI

Не забуду.
Я этого резидента сейчас уже дописал, и теперь перевожу на АСМ.
А странно, почему возникает эта проблемма, если пользоватся прерыванием 15h, а со всеми остальными нормально.
BlackShadow
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?
Altair
Цитата
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?

Нет и без CLI не работает!
virt
Цитата
Возможно потому, что войдя в твой обработчик вызывается CLI, что закрывает INT 08h. Может INT 15h от него и работает?


cli не закрывает прерывание ,оно запрещает вызов новых прерываний.
Altair
Цитата
cli не закрывает прерывание ,оно запрещает вызов новых прерываний.

Да, и тогда тем-более зависание не от этого.

Я вот думаю, что это как -то связанно с видео функциями.
Где-то (не помню где), я прочитал, что написанный в пасе резидент, не может обращатся к видеосервису.
Может такое быть?
BlackShadow
Ага. А старушка, переходящая дорогу не может нести сумку.
Altair
Если старушка однозадачная, или работает в реальном режиме, то не может, а если работает в защищенном режиме или многозадачная, то может!
BlackShadow
В защищённом режиме она ещё и за содержимое сумки может не беспокоиться, если положит её в память с ограниченными правами доступа smile.gif
Altair
А если серьезно, то какой, "жизенный цикл" TSR ?
В "MS-DOS для разработчика", все на асме, а как выглядит "скелет" TSR на пасе?
Тот, что в справке к BP7, глюченый.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.