home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
ports
/
serial.pas
< prev
Wrap
Pascal/Delphi Source File
|
1994-10-30
|
4KB
|
123 lines
Uses Crt,Dos;
Const
RxR=0; {Receive Data, accès en lecture}
TxR=0; {Transmit Data, accès en écriture}
IER=1; {Interrupt Enable}
IIR=2; {Interrupt Identification}
LCR=3; {Line Control}
MCR=4; {Modem Control}
LSR=5; {Line Status}
MSR=6; {Modem Status}
DLL=0; {Divisor Latch High}
DLH=1; {Divisor Latch Low}
N=0; {pas de parité}
O=8; {parité impair}
E=24; {parité pair}
IRQ_Tab:Array[1..4] of Word {Numéros d'interruption des interfaces}
=(4,3,4,3);
Base_Tab:Array[1..4] of Word {les addresses des ports des interfaces}
=($3f8,$2f8,$3e8,$2e8);
Var OldInt:Pointer; {vecteur original d'interruption}
Key:Char; {touche appuyée}
IRQ, {IRQ-numéro du port actuel}
Base:Word; {adresse du port actuel}
fertig:Boolean; {Flag pour la fin du programme}
Procedure Handler;interrupt;
{Interrupt-Handler, intercepte signaux du port série}
Begin
Write(Chr(Port[Base+RxR])); {chercher signe du port et l'émettre}
Port[$20]:=$20; {émettre EOI}
End;
Procedure Open_Port(Nr:Word);
{prépare port COM à l'entrée/sortie}
Begin
IRQ:=IRQ_Tab[Nr]; {chercher numéro IRQ}
Base:=Base_Tab[Nr]; {chercher adresse de base}
GetIntVec(IRQ+8,OldInt);
SetIntVec(IRQ+8,@Handler);
Port[$21]:=Port[$21] and {permettre IRQ }
not (1 shl IRQ);
Port[Base+MCR]:=11; {sortie auxiliaire, positionner RTS et DTR}
Port[Base+IER]:=1; {Interrupt Enable pour Receive}
End;
Procedure Close_Port;
{positionne interruptions COM en arrière}
Begin
SetIntVec(IRQ+8,OldInt); {rétablir vecteur IRQ}
Port[Base+MCR]:=0; {positionne signaux vers l'arrière}
Port[Base+IER]:=0; {mettre interruptions hors service}
Port[$21]:= {positionner Interrupt-Controller vers l'arrière}
Port[$21] or (1 shl IRQ);
End;
Procedure Set_Speed(bps:LongInt);
{positionne vitesse du port}
Var Divisor:Word;
Begin
Port[Base+LCR]:=Port[Base+LCR]{mise en serice du DLAB}
or 128;
Divisor:=115200 div bps;
Port[Base+DLL]:=Lo(Divisor); {écrire valeurs dans Divisor Latch}
Port[BAse+DLH]:=Hi(Divisor);
Port[Base+LCR]:=Port[Base+LCR]{mise hors service de DLAB}
and not 128;
End;
Procedure Set_Param(Data,Par,Stop:Word);
{positionne les paramètres bits de données, parité et stop}
Begin
Port[Base+LCR]:=
(Data-5) {positionner bit 0-1 sur bit de données}
+ Par {y compris la parité}
+ (Stop-1) shl 2; {positionner Stopbits dans Bit 2 du LCR}
End;
Procedure Error;
{se fait appeller lors du Time-Out dans la procédure d'émission}
Begin
WriteLn;
WriteLn('Transmission-Timeout'); {Message}
Close_Port; {fermer Port}
Halt(1); {et quitter}
End;
Procedure Transmit(c:Char);
{envoie signaux sur le port série}
Var Time_Out:Integer; {compteur pour Time-Out}
Begin
Time_Out:=-1;
While Port[Base+MSR] and 16 = 0 Do Begin
Dec(Time_Out); {attendre sur CTS}
If Time_Out=0 Then Error;
End;
Time_Out:=-1;
While Port[Base+LSR] and 32 = 0 Do Begin
Dec(Time_Out); {attendre à ce que le transmitter-registre soit vide}
If Time_Out=0 Then Error;
End;
Port[Base+TxR]:=Ord(c); {envoyer signal}
End;
Begin
Open_Port(2); {ouvrir COM}
Set_Speed(19200); {vitesse 19200 bps}
Set_Param(8,N,1); {définir paramètre}
WriteLn;
WriteLn('Terminal fonctionne (Alt-X pour quitter):');
Repeat
Key:=ReadKey; {lire touche}
If Key <> #0 Then {envoyer touches normales au port com}
Transmit(Key)
Else {terminer sur Alt-X }
If ReadKey=#45 Then fertig:=true;
Until fertig;
Close_Port; {éliminer interruptions}
End.