{$A-,H+}
unit mainform;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,zlportio, ComCtrls, shellapi,rdtsc;

type
  TMain = class(TForm)
    lb1: TLabel;
    ePort: TEdit;
    lb2: TLabel;
    eData: TEdit;
    eRData: TEdit;
    btnExit: TButton;
    lb3: TLabel;
    coDataType: TComboBox;
    Lb4: TLabel;
    gb1: TGroupBox;
    sbBar: TStatusBar;
    lb5: TLabel;
    btnWrite: TButton;
    btnRead: TButton;
    cbDirect: TCheckBox;
    llbWWW: TLabel;
    procedure btnExitClick(Sender: TObject);
    procedure ePortKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ePortKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure coDataTypeChange(Sender: TObject);
    procedure ePortKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure btnWriteClick(Sender: TObject);
    procedure eDataKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure btnReadClick(Sender: TObject);
    procedure cbDirectClick(Sender: TObject);
    procedure llbWWWClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
   procedure setrdata(const Data:dword);
   function str2int(const value:string;const HEX:boolean):integer;
  end;

var
  Main: TMain;
implementation

{$R *.DFM}
{$R-}

function TMain.str2int(const value:string;const HEX:boolean):integer;
begin
  if HEX then
     result := strtoint('$' + value)
    else
     result := strtoint(value);
end;


procedure TMain.btnExitClick(Sender: TObject);
begin
 close;
end;

procedure TMain.ePortKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
try
 Case key of
  38: begin
       key := 0;
      end;
  40: begin
       key := 0;
      end
 end;
except
end;
end;

procedure TMain.ePortKeyPress(Sender: TObject; var Key: Char);
begin
  // filter on hex
 if pos(key,#13#8'0123456789abcdefABCDEF')=0 then
   key := #0;
end;

procedure TMain.FormCreate(Sender: TObject);
begin
 coDataType.itemindex :=0;
 coDataType.Tag := 2;
 if ZLIOStarted then
   sbBar.SimpleText := 'Driver successfully started !'
 else
   sbBar.SimpleText := 'Couldnt start driver. Something wrong !';
end;

procedure TMain.coDataTypeChange(Sender: TObject);
var s:string;
begin
 coDataType.Tag := 2 shl (coDataType.itemindex);
 erdata.MaxLength := coDataType.Tag;
 edata.MaxLength := coDataType.Tag;
 s := edata.Text;
 delete(s,1,length(s)-coDataType.Tag);
 edata.text := s;
end;

procedure TMain.ePortKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var Port,data:dword;
begin
try
      try
       Port := str2int(ePort.Text,true);
      except
       Port := 0;
      end;
 Case key of
  13: begin
        zlioportwrite(port,coDataType.itemindex,str2int(eData.Text, true));
      end;
  38: begin
       inc(Port);
       ePort.Text := inttohex(Port,3);
       key := 0;
      end;
  40: begin
       if port > 0 then
        dec(Port);
       ePort.Text := inttohex(Port,3);
       key := 0;
      end
 end;
 setthreadpriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
 data := zlioportread(Port,coDataType.itemindex);
 setrdata(data);
except
end;

end;

procedure TMain.setrdata(const Data:dword);
begin
 erData.Text := inttohex(Data,coDataType.Tag);
end;

procedure TMain.btnWriteClick(Sender: TObject);
var i:word;
begin
 i := 13;
 ePortKeyDown( self,i,[])
end;



procedure TMain.eDataKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var data:dword;
begin
      try
       Data := str2int(eData.Text,true);
      except Data := 0; end;
 Case key of
  13: begin
        ePortKeyDown( self,key,[])
      end;
  38: begin
       inc(Data);
       eData.Text := inttohex(Data,coDataType.Tag);
       key := 0;
      end;
  40: begin
        dec(Data);
       eData.Text := inttohex(Data,coDataType.Tag);
       key := 0;
      end
 end;

end;

procedure TMain.btnReadClick(Sender: TObject);
var k:word;
begin
 k := 0;
 ePortKeyDown(self, k,[]);
end;

procedure TMain.cbDirectClick(Sender: TObject);
begin
zliosetiopm(cbDirect.Checked);
end;

procedure TMain.llbWWWClick(Sender: TObject);
begin
 shellexecute( 0,'open','http://www.specosoft.com/update/portio_15.htm',nil,nil,SW_SHOW);
end;

end.