mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-27 04:43:46 +02:00
290 lines
5.0 KiB
ObjectPascal
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.
|