Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Проблеммы с резидентом.

Автор: Altair 25.05.2004 21:32

У меня такая проблемма:
я написал резидента, обработчик $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

В защищённом режиме она ещё и за содержимое сумки может не беспокоиться, если положит её в память с ограниченными правами доступа smile.gif

Автор: Altair 27.05.2004 22:24

А если серьезно, то какой, "жизенный цикл" TSR ?
В "MS-DOS для разработчика", все на асме, а как выглядит "скелет" TSR на пасе?
Тот, что в справке к BP7, глюченый.