mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 12:11:34 +01: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.
 | 
