unit DIOu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Registry, ExtCtrls ; type TMainFrm = class(TForm) Label5: TLabel; GroupBox1: TGroupBox; ExitButton: TBitBtn; Memo1: TMemo; AddressList: TComboBox; CardName: TLabel; Label1: TLabel; BeginSample: TButton; RunTimer: TTimer; PortAOut: TPanel; PortAIn: TPanel; PortBIn: TPanel; Label2: TLabel; Label3: TLabel; Label4: TLabel; IsaLabel: TLabel; IsaEdit: TEdit; procedure ExitButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure AddressListChange(Sender: TObject); procedure RunTimerTimer(Sender: TObject); procedure BeginSampleClick(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } DriverRegistry:TRegistry; public { Public declarations } end; const myKey = 'Software\PCIFIND\NTioPCI\Parameters'; var MainFrm: TMainFrm; Address : WORD; RunFlag:Boolean; implementation uses ACCES32; type TPCI_COMMON_CONFIG = record VendorID : word; DeviceID : word; Command : word; Status : word; RevisionID : byte; ProgIf : byte; SubClass : byte; BaseClass : byte; CacheLineSize : byte; LatencyTimer : byte; HeaderType : byte; BIST : byte; BaseAddresses : Array[0..5] of longint; Reserved1 : Array[0..1] of longint; RomBaseAddress : longint; Reserved2 : Array[0..1] of longint; InterruptLine : byte; InterruptPin : byte; MinimumGrant : byte; MaximumLatency : byte; end; //global variables for internal use var buf: array [0..63] of TPCI_COMMON_CONFIG; {$R *.DFM} procedure TMainFrm.FormCreate(Sender: TObject); var num, i: Integer; found: Boolean; begin found := false; DriverRegistry:=TRegistry.Create; DriverRegistry.RootKey:=HKEY_LOCAL_MACHINE; RunFlag:=True; if (InPortB($61) = $AA55) then begin Application.MessageBox('ACCESNT.SYS not detected. Please copy ACCESNT.SYS into [NT]/system32/drivers and re-run this sample.', 'Warning', IDOK); end; DriverRegistry.OpenKey(MyKey, True); try num := DriverRegistry.ReadInteger('NumDevices'); except on ERegistryException do num := 0; end; if (num > 0) then DriverRegistry.ReadBinaryData('PCICommonConfig',buf,num*sizeof(TPCI_COMMON_CONFIG)); for i := 0 to num-1 do begin if found then Break; with Buf[i] do begin case (DeviceID) of $0C69:begin CardName.Caption:='P104-DIO-96 Parallel Digital I/O Card'; AddressList.Items.Add('Port 0: '+IntToHex((BaseAddresses[2] AND $FFF8),4)); AddressList.Items.Add('Port 1: '+IntToHex((BaseAddresses[2] AND $FFF8) + 4,4)); AddressList.Items.Add('Port 2: '+IntToHex((BaseAddresses[2] AND $FFF8) + 8,4)); AddressList.Items.Add('Port 3: '+IntToHex((BaseAddresses[2] AND $FFF8) + 12,4)); found := true; OutPortB((BaseAddresses[2] and $FFF8) + $1F, 0);//reset CPLD end; end;{case} end;{with} end;{for} if not found then begin CardName.Caption:='No Card Found In Registry. Or ISA DIO card Installed.'; Memo1.Lines.Clear; Memo1.Lines.Append('No PCI Card Found In Registry. Or ISA DIO Card Installed.'); Memo1.Lines.Append('If you have an ISA DIO card installed, you may continue running the sample ' + 'by entering the card''s Base Address in the edit box above and continuing as normal.'); Memo1.Lines.Append('NTioPCI.SYS may not installed, or the card you have installed is not 8255 equipped.'); Memo1.Lines.Append('If a PCI card is installed, please make sure you have run PCIFind.EXE for Win32.'); IsaEdit.Visible := true; IsaLabel.Visible := true; Label1.hide; Addresslist.hide; RunFlag:=False; end; AddressList.ItemIndex:=0; if RunFlag then Address:=StrToInt('$'+copy(AddressList.Items[AddressList.ItemIndex],9,4)); DriverRegistry.Free; end; procedure TMainFrm.ExitButtonClick(Sender: TObject); begin Close; end; procedure TMainFrm.AddressListChange(Sender: TObject); begin Memo1.Lines.Append('New Port Selected: '+AddressList.Items[AddressList.ItemIndex]); Address:=StrToInt('$'+copy(AddressList.Items[AddressList.ItemIndex],9,4)); end; procedure TMainFrm.RunTimerTimer(Sender: TObject); const value:array[0..2] of Integer=(0,0,0); i:Integer=0; var j:integer; msg:string[8]; begin value[0]:=1 shl i; OutPortB(Address+3,$82); OutPortB(Address,value[0]); value[1] := InPortB(Address); value[2] := InPortB(Address+1); inc(i); i := i mod 8; msg:='00000000'; for j:=0 to 7 do msg[8-j]:=chr(ord((value[0] and (1 shl j))>0)+$30); PortAOut.Caption := msg; for j:=0 to 7 do msg[8-j]:=chr(ord((value[1] and (1 shl j))>0)+$30); PortAIn.Caption := msg; for j:=0 to 7 do msg[8-j]:=chr(ord((value[2] and (1 shl j))>0)+$30); PortBIn.Caption := msg; end; procedure TMainFrm.BeginSampleClick(Sender: TObject); begin if not RunFlag then Address := StrToInt('$' + IsaEdit.Text); if RunTimer.Enabled=True then Begin RunTimer.Enabled:=False; BeginSample.Caption:='Perform I/O'; end else begin RunTimer.Enabled:=True; BeginSample.Caption:='Stop I/O'; end; end; procedure TMainFrm.FormActivate(Sender: TObject); begin if not RunFlag then FocusControl(IsaEdit); end; END.