Article View: comp.os.msdos.programmer
Article #4354communication port programming on 386
From: Brian V. Smith
Date: Thu, 24 Jan 1991 22:06
Date: Thu, 24 Jan 1991 22:06
81 lines
3945 bytes
3945 bytes
I have some in-line assembly code that I have used with Turbo Pascal
3.0, 4.0 and 5.0 to initialize the communication ports and do I/O with
them. This has worked fine on an 8086 and an 80286 (AT). However, I can't
get it to work at all with an 80386. I have tried it on two different
machines (a laptop by by DATAworld and a generic 386 desktop model).
Here is the code I have been using for several years now. The put() proc
seems to timeout as does the get() procedure.
Can anyone help me? Are there differences in the communications ports
from the 286 to the 386?
Thanks for any help.
{----------------------------------------------------------------------------}
{ get : Get one character from 'port' into 'chr' }
procedure get(port :integer; var chr : char);
begin
inline (
$C4/$BE/chr/ { les di,chr[bp] ; get ptr to the char }
$B4/$02/ { mov ah,2 ; get char }
$8B/$96/port/ { mov dx,port[bp] ; port }
$CD/$14/ { int 14h ; call int }
$26/$88/$05 { mov es:[di],al ; store char }
)
end; { get }
{----------------------------------------------------------------------------}
{ put : Print 'chr' to 'port' }
procedure put(port :integer; chr : char);
begin
inline (
$8A/$96/chr/ { mov dl,chr ; get char to print }
$8A/$C2/ { mov al,dl ; put char in al }
$B4/$01/ { mov ah,1 ; print char }
$8B/$96/port/ { mov dx,port[bp] ; port }
$CD/$14 { int 14h ; call int }
)
end; { put }
{----------------------------------------------------------------------------}
procedure clearaux(port : integer);
begin
inline (
$B4/$03/ {loop: mov ah,3 ; status check }
$8B/$96/port/{ mov dx,port[bp] ; port }
$CD/$14/ { int 14h ; call aux status }
$80/$e4/$01/{ and ah,1 ; check for data ready }
$74/$0A/ { jz exit ; no chars, return }
$B4/$02/ { mov ah,2 ; get char }
$8B/$96/port/{ mov dx,port[bp] ; port }
$CD/$14/ { int 14h ; get the char }
$EB/$E9/ { jmp loop ; check if another }
$90 {exit: nop ; that's all }
)
end; { clearaux }
{----------------------------------------------------------------------------}
procedure init9600(port :integer);
begin
inline (
$B4/$00/ { mov ah,0 ; function 0 }
$B0/$E2/ { mov al,0E2h ; 9600 baud, no parity, 1 stop bit, 7 data}
$8B/$96/port/{ mov dx,port[bp] ; port }
$CD/$14 { int 14h ; call int }
);
clearaux(port);
end; { init9600 }
--
Brian V. Smith (bvsmith@lbl.gov)
Lawrence Berkeley Laboratory
I don't speak for LBL; they don't pay me enough for that.
Technical Details
Message-ID:
<9243@dog.ee.lbl.gov>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!hellgate.utah.edu!dog.ee.lbl.gov!epb7.lbl.gov!envbvsShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!hellgate.utah.edu!dog.ee.lbl.gov!epb7.lbl.gov!envbvs From: envbvs@epb7.lbl.gov (Brian V. Smith) Newsgroups: comp.os.msdos.programmer Subject: communication port programming on 386 Message-ID: <9243@dog.ee.lbl.gov> Date: 24 Jan 91 22:06:54 GMT Reply-To: envbvs@epb7.lbl.gov (Brian V. Smith) Organization: lbl Lines: 81 X-Local-Date: Thu, 24 Jan 91 14:06:54 PST