Процедурка int_1c - для тренировки - раз в сек пишет "g"; работает. По ее образу и подобию - int_rs - должна нaпечатать принятые с СОМ данные. Не работает. Что не так? Порт настраивается нормально, в этом легко убедиться раскомментировав 5 строчек выше "goto ll00;"
Автор: volvo 27.05.2009 14:22
Хм... Навскидку - где занесение значения $20 в порт $20 в конце обработчика прерывания от COM-порта? Т.е., последней командой обработчика должно быть
Port[$20] := $20;
Это первое... А второе, насколько я помню, в обработчиках прерываний с номерами меньшими $16, не должно быть вызовов процедур ввода-вывода Паскаля (равно, как и процедур дин. распределения памяти и вызовов функций операционной системы), так что лучше запоминай полученный байт в глобальной переменной, устанавливай глобальный же флажок "получено", и выходи из прерывания, а в основной программе (в цикле) проверяй состояние флажка "получено", и если он установлен - то печатай байт и снимай флажок.
Автор: Diusha 27.05.2009 16:58
Цитата(volvo @ 27.05.2009 10:22)
последней командой обработчика должно быть
Port[$20] := $20;
Да, про это мне уже сказали. Но пока до последней команды обработчика далеко; до 1-й бы добраться...
Цитата(volvo @ 27.05.2009 10:22)
... в обработчиках прерываний с номерами меньшими $16, не должно быть вызовов процедур ввода-вывода Паскаля ...
И про это мне тоже сказали уже. Только чем это может быть чревато? int_1c я сначала повесил на $08 (<$16) - из-под 98 работало нормально, а под досом висло. Но здесь-то причина подвисания, ИМХО, в другом: в том, что я тупо заменил стандартный обработчик своим.
Автор: Lapp 27.05.2009 17:23
Цитата(Diusha @ 27.05.2009 13:58)
до 1-й бы добраться...
Diusha, я уже настолько прочно забыл это все, что помочь вряд ли смогу. Но я сейчас порылся и нашел свои старые проги (16 лет назад писано). Гарантия, что там все работало. Комментов не то, чтобы много, но все же есть чуток. Оформлено в виде юнита (даже вроде не одного). Нужно?
Автор: volvo 27.05.2009 17:35
Цитата
И про это мне тоже сказали уже. Только чем это может быть чревато?
Вышеперечисленные операции нереентерабельны, следовательно, если ты их используешь - то нарушается принцип "повторной входимости": работа процедуры прерывания может быть в любой момент прервана другими прерываниями. Что тогда будет в случае, если ты внутри своего обработчика используешь операцию, которая НЕреентерабельна?
Автор: Diusha 27.05.2009 22:11
Цитата(Lapp @ 27.05.2009 13:23)
[Нужно?
Нужно! <cut>
Автор: Lapp 28.05.2009 17:28
Цитата(Diusha @ 27.05.2009 19:11)
Нужно!
Извиняюсь, ложная тревога. Главная часть - резидентная - была выполнена в виде отдельной программы, и она утеряна.. Юниты используют обращение к ней - их я аккуратно сохранил)). Вся фишка была в буферизации потока, для чего, собственно, и потребовался резидент. Именно он коммуницировал с com-портом, а юниты - только с ним.
Я еще гляну в одном месте, но надежды мало.. Еще раз извини..