home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / ports / serial.pas < prev   
Pascal/Delphi Source File  |  1994-10-30  |  4KB  |  123 lines

  1. Uses Crt,Dos;
  2.  
  3. Const
  4.   RxR=0;                        {Receive Data, accès en lecture}
  5.   TxR=0;                        {Transmit Data, accès en écriture}
  6.   IER=1;                        {Interrupt Enable}
  7.   IIR=2;                        {Interrupt Identification}
  8.   LCR=3;                        {Line Control}
  9.   MCR=4;                        {Modem Control}
  10.   LSR=5;                        {Line Status}
  11.   MSR=6;                        {Modem Status}
  12.   DLL=0;                        {Divisor Latch High}
  13.   DLH=1;                        {Divisor Latch Low}
  14.  
  15.   N=0;                          {pas de parité}
  16.   O=8;                          {parité impair}
  17.   E=24;                         {parité pair}
  18.  
  19.   IRQ_Tab:Array[1..4] of Word   {Numéros d'interruption des interfaces}
  20.     =(4,3,4,3);
  21.   Base_Tab:Array[1..4] of Word  {les addresses des ports des interfaces}
  22.     =($3f8,$2f8,$3e8,$2e8);
  23.  
  24. Var OldInt:Pointer;             {vecteur original d'interruption}
  25.     Key:Char;                   {touche appuyée}
  26.     IRQ,                        {IRQ-numéro du port actuel}
  27.     Base:Word;                  {adresse du port actuel}
  28.     fertig:Boolean;             {Flag pour la fin du programme}
  29.  
  30. Procedure Handler;interrupt;
  31. {Interrupt-Handler, intercepte signaux du port série}
  32. Begin
  33.   Write(Chr(Port[Base+RxR]));   {chercher signe du port et l'émettre}
  34.   Port[$20]:=$20;               {émettre EOI}
  35. End;
  36.  
  37. Procedure Open_Port(Nr:Word);
  38. {prépare port COM à l'entrée/sortie}
  39. Begin
  40.   IRQ:=IRQ_Tab[Nr];             {chercher numéro IRQ}
  41.   Base:=Base_Tab[Nr];           {chercher adresse de base}
  42.   GetIntVec(IRQ+8,OldInt);
  43.   SetIntVec(IRQ+8,@Handler);
  44.   Port[$21]:=Port[$21] and      {permettre IRQ }
  45.     not (1 shl IRQ);
  46.   Port[Base+MCR]:=11;           {sortie auxiliaire, positionner RTS et DTR}
  47.   Port[Base+IER]:=1;            {Interrupt Enable pour Receive}
  48. End;
  49.  
  50. Procedure Close_Port;
  51. {positionne interruptions COM en arrière}
  52. Begin
  53.   SetIntVec(IRQ+8,OldInt);      {rétablir vecteur IRQ}
  54.   Port[Base+MCR]:=0;            {positionne signaux vers l'arrière}
  55.   Port[Base+IER]:=0;            {mettre interruptions hors service}
  56.   Port[$21]:=                   {positionner Interrupt-Controller vers l'arrière}
  57.     Port[$21] or (1 shl IRQ);
  58. End;
  59.  
  60. Procedure Set_Speed(bps:LongInt);
  61. {positionne vitesse du port}
  62. Var Divisor:Word;
  63. Begin
  64.   Port[Base+LCR]:=Port[Base+LCR]{mise en serice du DLAB}
  65.     or 128;
  66.   Divisor:=115200 div bps;
  67.   Port[Base+DLL]:=Lo(Divisor);  {écrire valeurs dans Divisor Latch}
  68.   Port[BAse+DLH]:=Hi(Divisor);
  69.   Port[Base+LCR]:=Port[Base+LCR]{mise hors service de DLAB}
  70.     and not 128;
  71. End;
  72.  
  73. Procedure Set_Param(Data,Par,Stop:Word);
  74. {positionne les paramètres bits de données, parité et stop}
  75. Begin
  76.   Port[Base+LCR]:=
  77.     (Data-5)                    {positionner bit 0-1 sur bit de données}
  78.     + Par                       {y compris la parité}
  79.     + (Stop-1) shl 2;           {positionner Stopbits dans Bit 2 du LCR}
  80. End;
  81.  
  82. Procedure Error;
  83. {se fait appeller lors du Time-Out dans la procédure d'émission}
  84. Begin
  85.   WriteLn;
  86.   WriteLn('Transmission-Timeout');     {Message}
  87.   Close_Port;                   {fermer Port}
  88.   Halt(1);                      {et quitter}
  89. End;
  90.  
  91. Procedure Transmit(c:Char);
  92. {envoie signaux sur le port série}
  93. Var Time_Out:Integer;           {compteur pour Time-Out}
  94. Begin
  95.   Time_Out:=-1;
  96.   While Port[Base+MSR] and 16 = 0 Do Begin
  97.     Dec(Time_Out);              {attendre sur CTS}
  98.     If Time_Out=0 Then Error;
  99.   End;
  100.   Time_Out:=-1;
  101.   While Port[Base+LSR] and 32 = 0 Do Begin
  102.     Dec(Time_Out);              {attendre à ce que le transmitter-registre soit vide}
  103.     If Time_Out=0 Then Error;
  104.   End;
  105.   Port[Base+TxR]:=Ord(c);       {envoyer signal}
  106. End;
  107.  
  108. Begin
  109.   Open_Port(2);                 {ouvrir COM}
  110.   Set_Speed(19200);             {vitesse 19200 bps}
  111.   Set_Param(8,N,1);             {définir paramètre}
  112.   WriteLn;
  113.   WriteLn('Terminal fonctionne (Alt-X pour quitter):');
  114.   Repeat
  115.     Key:=ReadKey;               {lire touche}
  116.     If Key <> #0 Then           {envoyer touches normales au port com}
  117.       Transmit(Key)
  118.     Else                        {terminer sur Alt-X }
  119.       If ReadKey=#45 Then fertig:=true;
  120.   Until fertig;
  121.   Close_Port;                   {éliminer interruptions}
  122. End.
  123.