88 lines
1.5 KiB
ObjectPascal
88 lines
1.5 KiB
ObjectPascal
unit serial;
|
|
|
|
interface
|
|
|
|
uses
|
|
util, isrmanager;
|
|
|
|
const
|
|
COM1 = $3F8;
|
|
COM2 = $2F8;
|
|
COM3 = $3E8;
|
|
COM4 = $2E8;
|
|
|
|
procedure init();
|
|
function receive(PORT : uint16; timeout : uint32) : uint8;
|
|
function send(PORT : uint16; data : uint8; timeout : uint32) : boolean;
|
|
|
|
implementation
|
|
|
|
uses
|
|
console;
|
|
|
|
procedure IRQ_Hook();
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure initPort(PORT : uint16);
|
|
begin
|
|
outb(PORT + 1, $00);
|
|
outb(PORT + 3, $80);
|
|
outb(PORT + 0, $03);
|
|
outb(PORT + 1, $00);
|
|
outb(PORT + 3, $03);
|
|
outb(PORT + 2, $C7);
|
|
outb(PORT + 4, $0B);
|
|
end;
|
|
|
|
procedure init();
|
|
begin
|
|
initPort(COM1);
|
|
initPort(COM2);
|
|
initPort(COM3);
|
|
initPort(COM4);
|
|
end;
|
|
|
|
function serial_received(PORT : uint16) : uint32;
|
|
begin
|
|
serial_received:= inb(PORT + 5) AND 1;
|
|
end;
|
|
|
|
function is_transmit_empty(PORT : uint16) : uint32;
|
|
begin
|
|
is_transmit_empty:= inb(PORT + 5) AND $20;
|
|
end;
|
|
|
|
function receive(PORT : uint16; timeout : uint32) : uint8;
|
|
var
|
|
_timeout : uint32;
|
|
|
|
begin
|
|
receive:= 0;
|
|
_timeout:= timeout;
|
|
while (serial_received(PORT) = 0) AND (_timeout > 0) do begin
|
|
dec(_timeout);
|
|
end;
|
|
if _timeout <> 0 then begin
|
|
receive:= inb(PORT);
|
|
end;
|
|
end;
|
|
|
|
function send(PORT : uint16; data : uint8; timeout : uint32) : boolean;
|
|
var
|
|
_timeout : uint32;
|
|
|
|
begin
|
|
send:= false;
|
|
_timeout:= timeout;
|
|
while (is_transmit_empty(PORT) = 0) and (_timeout > 0) do begin
|
|
dec(_timeout);
|
|
end;
|
|
if _timeout <> 0 then begin
|
|
outb(PORT, data);
|
|
send:= true;
|
|
end;
|
|
end;
|
|
|
|
end. |