unit Port;

interface

uses
  Windows, SysUtils, Classes;

type
  TPort = class(TComponent)
  private
   procedure SetByte(Index:Word;Value:Byte);
   procedure SetWord(Index:Word;Value:Word);
   procedure SetLong(Index:Word;Value:LongWord);
   function  GetByte(Index:Word):Byte;
   function  GetWord(Index:Word):Word;
   function  GetLong(Index:Word):LongWord;
  public
   {свойство для обращения к байтовым портам }
   property Byte [Index:Word] : Byte     read GetByte write SetByte; default;
   {свойство для обращения к двухбайтовым портам }
   property Word [Index:Word] : Word     read GetWord write SetWord;
   {свойство для обращения к четырехбайтовым портам }
   property DWord[Index:Word] : LongWord read GetLong write SetLong;
  end;

procedure Register;

implementation

{Регистрация компонента в палитре компонент}
procedure Register;
begin
  RegisterComponents('System', [TPort]);
end;

{Чтение байта из порта}
function TPort.GetByte(Index: Word): Byte;
begin
 asm
  mov dx,Index
  in al,dx
  mov Result,al
 end;
end;

{Чтение слова из порта}
function TPort.GetWord(Index: Word): Word;
begin
 asm
  mov dx,Index
  in ax,dx
  mov Result,ax
 end;
end;

{Чтение двойного слова из порта}
function TPort.GetLong(Index: Word): LongWord;
begin
 asm
  mov dx,Index
  in eax,dx
  mov Result,eax
 end;
end;

{Запись байта в порт}
procedure TPort.SetByte(Index: Word; Value: Byte);
begin
 asm
  mov dx,index
  mov al,Value
  out dx,al
 end;
end;

{Запись слова в порт}
procedure TPort.SetWord(Index, Value: Word);
begin
 asm
  mov dx,Index
  mov ax,Value
  out dx,ax
 end;
end;

{Запись двойного слова в порт}
procedure TPort.SetLong(Index: Word; Value: LongWord);
begin
 asm
  mov dx,Index
  mov eax,Value
  out dx,eax
 end;
end;

end.
