IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Чат между двумя компами по локалке
сообщение
Сообщение #1


Гость






Приветствую, народ!

Вообщем, ситуация сложилась следущая... Задали в школе написать "чат" на паскале, но так получилось, что я на этих уроках редко уж появлялся... потреял почему-то интерес к компам, сложные времена в жизни были.... сейчас напрягли, я скопировал у знакомого рабочую версию, но проблема в том, что экзаменатор будет по исходнику задавать вопросы... а я честно говоря смутно представляю, что ему отвечать...
Так что может вам не составит труда разжевать мне что происходит в каждой строке... наверняка опытным программистам это как орешки щёлкать, а у меня от этого зависит оценка...  Заранее благодарен за любую оказанную помощь! Спасибо!

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

Код

program chat;
uses dos,crt;
var c:char;
bios_interface:registers;

begin
         with bios_interface do         {ithol cartis reshet}
            begin
             ah:=0;
             al:=$a3;
             dx:=0;
            end;
intr($14,bios_interface);

if bios_interface.ah and $80 = $80
   then
     writeln ('no good')
   else
     writeln ('good');


   while true  do           {Ввод символа}
       begin
       if keypressed then
          begin
                          c:=readkey;
                          if ord(c)=27 then halt; {exit by pressing esc. }
                          with bios_interface do
                           begin                         {Из символа в цифру}
                            ah:=1;
                            al:=ord(c);
                            dx:=0;
                           end;
                           intr($14,bios_interface);
                           write(c);
          end;

with bios_interface do
                           begin                         {проверка status}
                            ah:=3;
                            dx:=0;
                            end;
intr($14,bios_interface);
if (bios_interface.ah and $01)=$01 then        {Проверка если статус успешный}
  begin                                      {Ввод символа}
  with bios_interface  do
      begin
      ah:=2;
      dx:=0;
      end;

intr($14,bios_interface);
c:=chr(bios_interface.al);
writeln (c);      {Из эксадецимального в символ}
end;
end;

end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


Это что, по модему чат? или по нуль-модему? честно говоря, не помню, с чем работает служба BIOS $14. Если с COM-портом, тогда все ясно. А насчет программы - комментарии некоторые надо бы подвинуть:
readkey - ввод символа с клавы
ord© - символ -> код
chr(...) - код -> символ
в блоках with bios_interface do происходит заполнение регистров - параметров службы. Служба (service) BIOSа - это как библиотека функций, только ассемблерная, поэтому приходится через регистры передавать ей параметры. в AH обычно номер нужной функции, в AL - подфункция (если есть), либо какой-нибудь параметр.
С помощью intr($14,regs) происходит собственно вызов службы BIOS.
из программы легко вычислить номера функций этой службы:
ah=0 - инициализация порта, в al скорей всего заносятся управляющие биты: скорость передачи, четность и т.д.
функция возвращает ошибку тоже в ah - старший бит (только надо бы после 'no good' сделать выход, а то... ???)
ah=1 - отправка символа в порт, в al - сам символ
ah=2 - прием символа из буфера, возвращает в al
ah=3 - проверка статуса - пришел символ или буфер пуст

чтоб чат выглядел более презентабельно, рекомендую добавить gotoxy перед каждым write, иначе все в кучу будет выводиться
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 18.12.2017 12:06
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"