From 7ad40b4fbde61280a1525d331621d68be2b9ba0c Mon Sep 17 00:00:00 2001 From: marco Date: Sun, 14 Sep 2003 20:16:10 +0000 Subject: [PATCH] * more unix reform --- rtl/unix/syscall.pp | 10 ++ rtl/unix/x86.pp | 289 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 299 insertions(+) create mode 100644 rtl/unix/syscall.pp create mode 100644 rtl/unix/x86.pp diff --git a/rtl/unix/syscall.pp b/rtl/unix/syscall.pp new file mode 100644 index 0000000000..27e78bc1db --- /dev/null +++ b/rtl/unix/syscall.pp @@ -0,0 +1,10 @@ +unit syscall; + +interface + +{$i sysnr.inc} +{$i syscallh.inc} + +implementation + +end. diff --git a/rtl/unix/x86.pp b/rtl/unix/x86.pp new file mode 100644 index 0000000000..012f7fe9b9 --- /dev/null +++ b/rtl/unix/x86.pp @@ -0,0 +1,289 @@ +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 + + +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. \ No newline at end of file