[Back to COMM SWAG index] [Back to Main SWAG index] [Original]
{
>Hi Greg; I tried this out a few minutes ago but it insists on
>accessing COM1.
Sorry about that. I should have used a single global CONSTant for
the COM port number. I made the change, so now you just need to
have "COMx = 2" for COM2.
This code is a quick'n-dirty example, so I'm certain that there
are errors/bugs in the COM i/o error checking. I'll take another
look at it later...
}
PROGRAM UseInt14;
USES Dos, Crt;
CONST COMx = 1; { <<-- 1 for COM1, 2 for COM2, etc. }
VAR reg : Registers; { CPU registers }
Okay : BOOLEAN;
ch : CHAR; { i/o character }
PROCEDURE InitCOM (PortNo,Baud,WordLen,Parity,Stops:WORD);
VAR IniParm:BYTE; BEGIN
IniParm := 0;
CASE Baud OF
300 : IniParm := 64;
1200 : IniParm := 128;
2400 : IniParm := 160;
4800 : IniParm := 192;
9600 : IniParm := 224;
END{CASE};
CASE Parity OF
1 : {odd} IniParm := IniParm OR 8;
2 : {none} ;
3 : {even} IniParm := IniParm OR 24;
END{CASE};
CASE Stops OF
2 : IniParm := IniParm OR 4;
ELSE ;
END{CASE};
CASE WordLen OF
7 : IniParm := IniParm OR 2;
8 : IniParm := IniParm OR 3;
END{CASE};
reg.DX := PortNo - 1;; reg.AL := IniParm;;
reg.AH := 0;; Intr($14,reg);
END {InitCOM};
PROCEDURE PutComChar (PortNo:WORD; Data:CHAR); BEGIN
reg.DX := PortNo - 1;; reg.AL := ORD(Data);;
reg.AH := 1;; Intr($14,reg);
Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
END {PutComChar};
PROCEDURE GetComChar (PortNo:WORD; VAR Data:CHAR); BEGIN
reg.DX := PortNo - 1;; reg.AH := 2;; Intr($14,reg);;
Data := CHR(reg.AL);
Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
END {GetComChar};
FUNCTION ComReady (PortNo:WORD):BOOLEAN; BEGIN
reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
ComReady := (reg.AH AND 96) <> 0;
END {ComReady};
FUNCTION ComDataAvailable (PortNo:WORD):BOOLEAN; BEGIN
reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
ComDataAvailable := (reg.AH AND 1) <> 0;
END {ComDataAvailable};
BEGIN {UseInt14}
InitCOM (COMx,9600,8,2,1); { initialize COMx: 9600 bps, 8n1 }
REPEAT
IF ComDataAvailable(COMx) THEN GetComChar(COMx,ch) ELSE ch := #0;
IF (ch <> #0) THEN Write (ch);
IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
IF KeyPressed THEN ch := ReadKey ELSE ch := #0;
IF (ch <> #0) THEN BEGIN
REPEAT {wait} UNTIL ComReady(COMx);
PutComChar(COMx,ch);
END{IF};
IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
UNTIL ch = #27; { exit when ESC key pressed }
END {UseInt14}.
[Back to COMM SWAG index] [Back to Main SWAG index] [Original]