home *** CD-ROM | disk | FTP | other *** search
-
- {
- I've read some questions latelly with questions about how to use a com-port in
- pascal. I've written a couple of procedures for doing this. The following
- routines can be improved, for example they can be satt to run on interrupts
- and a few other thing, but... I'm not supposed to do all the job for you, am
- I??
- }
-
- USES CRT,DOS;
-
-
- CONST
- Com1 : WORD = 1;
- Com2 : WORD = 2;
-
- type
- port = object
- port: byte;
- base: word;
- baud: longint;
- inter: byte;
- function init(comport: word; baudrate: longint): boolean;
- function sendchar(c: char): boolean;
- function getchar(var c: char): boolean;
- end;
-
- function port.init(comport: word; baudrate: longint): boolean;
- var
- tmp: word;
- bas: word;
- test: byte;
- begin
- if odd(comport) then inter:=$C else inter:=$B;
- {This is for later use with interrupts...}
- init:=false;
- if comport<5 then
- begin
- asm {get port base address}
- mov bx,40h
- mov es,bx
- mov bx,comport
- dec bx
- shl bx,1
- mov ax,es:[bx]
- mov bas,ax
- end;
- if bas=0 then
- begin
- writeln('Could''n find selected com-port!');
- exit;
- end;
- end
- else
- begin
- case comport of {don't know where to find ps/2 etd
- bios, standard base is supposed}
- 5: bas:=$4220;
- 6: bas:=$4228;
- 7: bas:=$5220;
- 8: bas:=$5228;
- end;
- end;
- base:=bas;
- tmp:=115200 div baudrate; {baudrate divisor}
- asm {lower DTS and DSR}
- mov dx,bas
- add dx,4
- xor al,al
- out dx,al
- end;
- delay(50);
- asm {raise DTS and DSR}
- mov dx,bas
- add dx,4
- mov al,11b
- out dx,al
- end;
- asm {set baudrate and N,8,1}
- mov dx,bas
- add dx,3
- mov al,10000011b {N,8,1, set baudrate divisor}
- out dx,al
- mov ax,tmp {baudrate divisor}
- mov dx,bas
- out dx,al
- inc dx
- mov al,ah
- out dx,al
- mov dx,bas
- add dx,3
- mov al,00000011b {N,8,1}
- out dx,al
- end;
- asm {interrupt enable, no interrupts enabled --> gain time}
- mov dx,bas
- inc dx
- xor al,al
- out dx,al
- end;
- asm {raise DTS and DSR}
- mov dx,bas
- add dx,4
- mov al,11b
- out dx,al
- in al,dx
- and al,11b
- mov test,al
- end;
- if test<>3 then
- begin
- writeln('Some error....');
- exit;
- end;
- init:=true;
- end;
-
- function port.sendchar(c: char): boolean;
- var
- bas: word;
- cts: byte;
- label
- no_send;
- begin
- cts:=0;
- bas:=base;
- asm
- mov dx,bas
- add dx,5
- in al,dx
- and al,00100000b {test CTS (Clear To Send status)}
- jz no_send
- mov cts,1
- mov dx,bas
- mov al,c
- out dx,al
- no_send:
- end;
- if cts=0 then sendchar:=false else sendchar:=true;
- end;
-
- function port.getchar(var c: char): boolean;
- var
- bas: word;
- rts: byte;
- c2: char;
- label
- no_data;
- begin
- rts:=0;
- bas:=base;
- asm
- mov dx,bas
- add dx,5
- in al,dx
- and al,00000001b {test for data ready}
- jz no_data
- mov rts,1
- mov dx,bas
- in al,dx
- no_data:
- mov c2,al
- end;
- c:=c2;
- if rts=0 then getchar:=false else getchar:=true;
- end;
-
-
- var
- modem: port;
- s: string;
- a: byte;
- c : Char;
-
- begin
- if not modem.init(com2,38400) then
- begin
- writeln('Couldn''t initialize modem...');
- halt;
- end;
- s:='atz'+#13;
- for a:=1 to length(s) do modem.sendchar(s[a]);
-
- end.
-
-
- If you think these routines are just great and you decide to use them as they
- are I wouldn't mind if you gave me a credit.