Несложные вопросы по Pascal!!! Плиииииииииииииз!

C++, Assembler, PHP и т.д. и т.п...

Модератор: Tiger

rva
Сообщения: 13
Зарегистрирован: Чт 16 ноя, 2006 21:21

Несложные вопросы по Pascal!!! Плиииииииииииииз!

Сообщение rva » Пт 02 ноя, 2007 23:53

Нашел программу для ввода данных из COM2-порта по прерыванию! Подскажите для чего здесь некоторые функции, и как они работают? Они выделены красным!
uses WinDos, Crt;
Var OldInt0B: Pointer;
x, i: integer;
c: array[0..100] of integer;
procedure New0B; interrupt
begin
c[i] := port[$2F8]
inc(i);
port[$20]:=$20
end;
begin
GetIntVec($0B, Old0B)
SetIntVec($0B, @New0B);
port[$2FB] := 3;
port[$2FB] := $80;
port[$2F8] := $80;
port[$2F9] := 1;
port[$2F9] := 1;
i:=0;
while not keypressed do begin
x:=0;
repeat x:=x+1; sound(3000) until x=100;
end;
SetIntVec($0B, OldOb)
end.
-------------
С уважением, rva!

SERGant
Сообщения: 1003
Зарегистрирован: Вс 26 сен, 2004 22:04
Откуда: с планеты The Мля
Контактная информация:

Сообщение SERGant » Сб 03 ноя, 2007 1:24

Непонятно что есть что или что именно находится по физическому адресу?

Ну типа ответы из серии OldInt0B - безтиповый указатель, который указывает на какой-либо объект подходят? Или что значит директива interrupt? Какого характера вопросы? (Что здесь не понятно?)

rva
Сообщения: 13
Зарегистрирован: Чт 16 ноя, 2006 21:21

Что да как!

Сообщение rva » Пн 05 ноя, 2007 13:13

Непонятно что есть что! Зачем здесь эта процедура и переменная и какое у них назначение, именно в этой проге. Короче говоря, если не затруднит, объясните, пожалуйста, как работает прога.


-----------------
С уважением,rva!!!

Аватара пользователя
Tiger
Модератор
Сообщения: 2781
Зарегистрирован: Чт 24 июл, 2003 14:13
Откуда: Tiger@jabber.tushino.com. Погода,TV-прогр, фильмы и мн. др.: ftp:// http://10.80.192.167
Контактная информация:

Re: Несложные вопросы по Pascal!!! Плиииииииииииииз!

Сообщение Tiger » Вт 06 ноя, 2007 1:13

Начнём с того, что эта прога у вас даже не будет компилироваться (даже BP, для которого она написана). Но если отбросить все тонкости, то можно попытаться понять что здесь происходит:

Код: Выделить всё

uses WinDos, Crt;              # Подключение библиотек
Var OldInt0B: Pointer;        # Назовём переменную OldOB, а не OldIntOB зачем, не парься, для возможности дальнейшей работы DOS
       x, i: integer;
       c: array[0..100] of integer;
procedure New0B; interrupt;# Слово interrupt говорит о том, что это не просто процедура, а обработчик пррываний, она будет вызываться когда происходит определённое прерывание (в нашем случае что-то с COM2)
 begin
  c[i] := port[$2F8]; # Если эта процедура была вызвана, то скорее всего пришли новые данные, мы считаем что пришел один байт (что в принципе не факт), но мы его читаем в массив из порта.
   inc(i);
  port[$20]:=$20 # Склероз замучал, непомню, скорее всего подтвеждение выполнения прерывания.
 end;
begin
GetIntVec($0B, Old0B); # Сохраняем вектор прерываний для последующего восстановления
SetIntVec($0B, @New0B); # Вешаем свой обработчик пррывания
port[$2FB] := 3; # Это и последующие строки --- инициализация порта, установка скорости передачи и режима использования, точнее смотри описание int 14h и его аналоги через порты.
port[$2FB] := $80;
port[$2F8] := $80;
port[$2F9] := 1;   
port[$2F9] := 1;   
 i:=0;
while not keypressed do begin # пока не нажата (any key) выполяем
x:=0;
repeat x:=x+1; sound(3000) until x=100;
end;
SetIntVec($0B, OldOb) # кладём на место вектор прерываний.
end.
С уважением Tiger.

rva
Сообщения: 13
Зарегистрирован: Чт 16 ноя, 2006 21:21

Спасибо, Tiger!

Сообщение rva » Вт 06 ноя, 2007 20:13

Большое спасибо! Премного благодарен!

----------------------
С уважением, rva![/quote]

rva
Сообщения: 13
Зарегистрирован: Чт 16 ноя, 2006 21:21

Ещё раз HELPPPPPPPPPPPP !!! По Pascal!

Сообщение rva » Ср 14 ноя, 2007 17:29

Доброго времени суток!
А как эту прогу переделать под LPT -порт. Желательно с комментариями! Очень надо!
Заранее благодарен!

uses WinDos, Crt;
Var OldInt0B: Pointer;
x, i: integer;
c: array[0..100] of integer;
procedure New0B; interrupt;
begin
c[i] := port[$2F8];
inc(i);
port[$20]:=$20
end;
begin
GetIntVec($0B, Old0B);
SetIntVec($0B, @New0B);
port[$2FB] := 3;
port[$2FB] := $80;
port[$2F8] := $80;
port[$2F9] := 1;
port[$2F9] := 1;
i:=0;
while not keypressed do begin
x:=0;
repeat x:=x+1; sound(3000) until x=100;
end;
SetIntVec($0B, OldOb)
end.

-------------------
С уважением, rva!


Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость