fpc/rtl/unix/x86.pp

290 lines
5.0 KiB
ObjectPascal

unit x86;
interface
function ReadPortB (Port : Longint): Byte;
function ReadPortW (Port : Longint): Word;
function ReadPortL (Port : Longint): Longint;
Procedure ReadPort (Port : Longint; Var Value : Byte);
Procedure ReadPort (Port : Longint; Var Value : Longint);
Procedure ReadPort (Port : Longint; Var Value : Word);
Procedure ReadPortB (Port : Longint; Var Buf; Count: longint);
Procedure ReadPortL (Port : Longint; Var Buf; Count: longint);
Procedure ReadPortW (Port : Longint; Var Buf; Count: longint);
Procedure WritePort (Port : Longint; Value : Byte);
Procedure WritePort (Port : Longint; Value : Longint);
Procedure WritePort (Port : Longint; Value : Word);
Procedure WritePortB (Port : Longint; Value : Byte);
Procedure WritePortB (Port : Longint; Var Buf; Count: longint);
Procedure WritePortL (Port : Longint; Value : Longint);
Procedure WritePortW (Port : Longint; Value : Word);
Procedure WritePortW (Port : Longint; Var Buf; Count: longint);
Procedure WritePortl (Port : Longint; Var Buf; Count: longint);
implementation
{$ASMMODE ATT}
Procedure WritePort (Port : Longint; Value : Byte);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movb value,%al
outb %al,%dx
end ['EAX','EDX'];
end;
Procedure WritePort (Port : Longint; Value : Word);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movw value,%ax
outw %ax,%dx
end ['EAX','EDX'];
end;
Procedure WritePort (Port : Longint; Value : Longint);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movl value,%eax
outl %eax,%dx
end ['EAX','EDX'];
end;
Procedure WritePortB (Port : Longint; Value : Byte);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movb value,%al
outb %al,%dx
end ['EAX','EDX'];
end;
Procedure WritePortW (Port : Longint; Value : Word);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movw value,%ax
outw %ax,%dx
end ['EAX','EDX'];
end;
Procedure WritePortL (Port : Longint; Value : Longint);
{
Writes 'Value' to port 'Port'
}
begin
asm
movl port,%edx
movl value,%eax
outl %eax,%dx
end ['EAX','EDX'];
end;
Procedure WritePortl (Port : Longint; Var Buf; Count: longint);
{
Writes 'Count' longints from 'Buf' to Port
}
begin
asm
movl count,%ecx
movl buf,%esi
movl port,%edx
cld
rep
outsl
end ['ECX','ESI','EDX'];
end;
Procedure WritePortW (Port : Longint; Var Buf; Count: longint);
{
Writes 'Count' words from 'Buf' to Port
}
begin
asm
movl count,%ecx
movl buf,%esi
movl port,%edx
cld
rep
outsw
end ['ECX','ESI','EDX'];
end;
Procedure WritePortB (Port : Longint; Var Buf; Count: longint);
{
Writes 'Count' bytes from 'Buf' to Port
}
begin
asm
movl count,%ecx
movl buf,%esi
movl port,%edx
cld
rep
outsb
end ['ECX','ESI','EDX'];
end;
Procedure ReadPort (Port : Longint; Var Value : Byte);
{
Reads 'Value' from port 'Port'
}
begin
asm
movl port,%edx
inb %dx,%al
movl value,%edx
movb %al,(%edx)
end ['EAX','EDX'];
end;
Procedure ReadPort (Port : Longint; Var Value : Word);
{
Reads 'Value' from port 'Port'
}
begin
asm
movl port,%edx
inw %dx,%ax
movl value,%edx
movw %ax,(%edx)
end ['EAX','EDX'];
end;
Procedure ReadPort (Port : Longint; Var Value : Longint);
{
Reads 'Value' from port 'Port'
}
begin
asm
movl port,%edx
inl %dx,%eax
movl value,%edx
movl %eax,(%edx)
end ['EAX','EDX'];
end;
function ReadPortB (Port : Longint): Byte; assembler;
{
Reads a byte from port 'Port'
}
asm
xorl %eax,%eax
movl port,%edx
inb %dx,%al
end ['EAX','EDX'];
function ReadPortW (Port : Longint): Word; assembler;
{
Reads a word from port 'Port'
}
asm
xorl %eax,%eax
movl port,%edx
inw %dx,%ax
end ['EAX','EDX'];
function ReadPortL (Port : Longint): LongInt; assembler;
{
Reads a LongInt from port 'Port'
}
asm
movl port,%edx
inl %dx,%eax
end ['EAX','EDX'];
Procedure ReadPortL (Port : Longint; Var Buf; Count: longint);
{
Reads 'Count' longints from port 'Port' to 'Buf'.
}
begin
asm
movl count,%ecx
movl buf,%edi
movl port,%edx
cld
rep
insl
end ['ECX','EDI','EDX'];
end;
Procedure ReadPortW (Port : Longint; Var Buf; Count: longint);
{
Reads 'Count' words from port 'Port' to 'Buf'.
}
begin
asm
movl count,%ecx
movl buf,%edi
movl port,%edx
cld
rep
insw
end ['ECX','EDI','EDX'];
end;
Procedure ReadPortB (Port : Longint; Var Buf; Count: longint);
{
Reads 'Count' bytes from port 'Port' to 'Buf'.
}
begin
asm
movl count,%ecx
movl buf,%edi
movl port,%edx
cld
rep
insb
end ['ECX','EDI','EDX'];
end;
end.