Hardware прерывания в BASICе

Volante24

Уже довольно давно интересуюсь следующей проблемой – как организовать hardware interrupt (например, IRQ5) в QBasic в DOS (без каких-либо Windows)? Скажем, есть какая-то программа на QBasic, и тут приходит IRQ5 с LPT. Нужно отработать простенькую рутинку по прерыванию, желательно в самом же BASICе, и продолжить основную программу. Ну, короче, это нужно для real time processing, хотя и примитивного.

Можно ли это сделать, и как?

ds5
Volante24:

Уже довольно давно интересуюсь следующей проблемой – как организовать hardware interrupt (например, IRQ5) в QBasic в DOS (без каких-либо Windows)? Скажем, есть какая-то программа на QBasic, и тут приходит IRQ5 с LPT. Нужно отработать простенькую рутинку по прерыванию, желательно в самом же BASICе, и продолжить основную программу. Ну, короче, это нужно для real time processing, хотя и примитивного.

Можно ли это сделать, и как?

наверное ассемблерную вставку-перехватчик прерывания писать.

toxa

qbasic - слишком экстримальный вариант. используйте лучше для этих целей турбо-паскаль.

Volante24
ds5:

наверное ассемблерную вставку-перехватчик прерывания писать.

Хорошо, но как это делать? Имеется в виду, что-то вроде переопределение ISR для IRQ5, или что-нибудь другое? То есть, ассемблерная часть никак не связана с Basicом, внешняя по отношению к нему, да? Как тогда лучше осуществлять импорт данных в Basic-программу?

toxa:

qbasic - слишком экстримальный вариант. используйте лучше для этих целей турбо-паскаль.

Ну, просто qbasic я знаю (знал), есть уже опробованные программы… Если ж на него не полагаться, тогда зачем TP, можно сразу на C…

toxa

Ну на си напишите… На qbasic вроде можно организовать ассемблерную вставку, но ассемблировать придется самому при помощи справочника команд. А на паскале можно написать что-нибудь типа:

{$F+}
procedure OnInterrupt; Interrupt; Assembler;
asm
mov…

end;
{$F-}

потом где-нибудь

SetIntVec($05, @OnInterrupt);

при этом можно обойтись вообще без ассемблера, а написать обработчик непосредственно на паскале.

10 days later
pvo
toxa:

потом где-нибудь
SetIntVec($05, @OnInterrupt);

1.Только перед этим GetIntVec…
2.Сохраняем старый вектор
3.SetIntVec устанавливаем новый
4.Восстанавливаем старый перед выходом из проги
5.Выходим из проги

А если ,что-то грамотное ваять то и с контроллером прерываний надо обчацца.
Когда то с этим много возился.