unit dsampu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Registry, ExtCtrls, Acces32; type TMainFrm = class(TForm) IntroLabel: TLabel; IntroLabel2: TLabel; WriteLabel: TLabel; ReadLabel: TLabel; ValueReadLabel: TLabel; CardLabel: TLabel; StatusPanel: TPanel; StatusLabel: TLabel; ValueWriteEdit: TEdit; WriteByteButton: TButton; ReadByteButton: TButton; ExitButton: TButton; AddressList: TComboBox; WriteWordButton: TButton; ReadWordButton: TButton; AddressLabel: TLabel; AddressEdit: TEdit; procedure ExitButtonClick(Sender: TObject); procedure WriteByteButtonClick(Sender: TObject); procedure ReadByteButtonClick(Sender: TObject); procedure WriteWordButtonClick(Sender: TObject); procedure ReadWordButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure AddressListChange(Sender: TObject); private { Private declarations } BaseAddresses: array [0..256] of Integer; public { Public declarations } function GetCompanyKey(): AnsiString; function GetHardwareValue(Name: AnsiString): LongWord; function GetHardwareBinary(Name: AnsiString; var Data: array of TPCI_COMMON_CONFIG; size: LongWord): LongWord; end; var MainFrm: TMainFrm; const MAXNUMCONFIG = 256; implementation //uses ACCES32; {$R *.DFM} // exit button procedure TMainFrm.ExitButtonClick(Sender: TObject); begin Close; end; procedure TMainFrm.WriteByteButtonClick(Sender: TObject); var PortNumber: WORD; Value: BYTE; begin PortNumber := StrToInt('$' + AddressEdit.text); // collect user's port # Value := StrToInt('$' + ValueWriteEdit.text); OutPortB(PortNumber, Value); StatusLabel.caption := 'Write was successful'; end; procedure TMainFrm.ReadByteButtonClick(Sender: TObject); var PortNumber: WORD; Value: BYTE; begin PortNumber := StrToInt('$' + AddressEdit.Text); // collect user's port selection Value := InPortB(PortNumber); ValueReadLabel.caption := IntToHex(Value, 2); // display byte StatusLabel.caption := 'Read was successful'; end; procedure TMainFrm.WriteWordButtonClick(Sender: TObject); var PortNumber: WORD; Value: WORD; begin PortNumber := StrToInt('$' + AddressEdit.Text); // collect user's port # Value := StrToInt('$' + ValueWriteEdit.text); //Make sure Value is 16 Bit (Word) OutPort(PortNumber, Value); StatusLabel.caption := 'Write was successful'; end; // end WriteWordButtonClick procedure TMainFrm.ReadWordButtonClick(Sender: TObject); var PortNumber: WORD; Value: WORD; begin PortNumber := StrToInt('$' + AddressEdit.Text); // collect user's port selection Value := InPort(PortNumber); ValueReadLabel.caption := IntToHex(Value, 4); // display byte StatusLabel.caption := 'Read was successful'; end; // end ReadWordButtonClick procedure TMainFrm.FormCreate(Sender: TObject); var num, i, BaseIndexOffset: Integer; CompanyKey, TempString: AnsiString; buf: array [0..MAXNUMCONFIG - 1] of TPCI_COMMON_CONFIG; Registry: TRegistry; begin CompanyKey := 'Software\' + GetCompanyKey() + '\Cardlist'; //TPCI_COMMON_CONFIG buf[MAXNUMCONFIG]; Registry := TRegistry.Create; TempString := ''; 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; num := GetHardwareValue('NumDevices'); if (num > 0) then GetHardwareBinary('PCICommonConfig', buf, sizeof(TPCI_COMMON_CONFIG) * num); Registry.RootKey := HKEY_LOCAL_MACHINE; for i := 0 to num - 1 do begin if (buf[i].VendorID = $494F) then begin try // False because we do not want to create it if it doesn't exist Registry.OpenKey(CompanyKey, false); TempString := Registry.ReadString(IntToHex(buf[i].DeviceID, 4) + '$'); if (Pos('COM2', TempString) <> 0) then BaseIndexOffset := 2 else BaseIndexOffset := 0; TempString := Registry.ReadString(IntToHex(buf[i].DeviceID, 4)); buf[i].BaseAddresses[2] := buf[i].BaseAddresses[2] and $FFFE; buf[i].BaseAddresses[3] := buf[i].BaseAddresses[3] and $FFFE; buf[i].BaseAddresses[4] := buf[i].BaseAddresses[4] and $FFFE; buf[i].BaseAddresses[5] := buf[i].BaseAddresses[5] and $FFFE; if (buf[i].BaseAddresses[2 + BaseIndexOffset] > 0) then begin // if the card has any base addresses AddressList.Items.Add(TempString + ': ' + IntToHex(buf[i].BaseAddresses[2 + BaseIndexOffset], 4)); BaseAddresses[AddressList.Items.Count - 1] := buf[i].BaseAddresses[2 + BaseIndexOffset]; end; // end if if (buf[i].BaseAddresses[3 + BaseIndexOffset] > 0) then begin AddressList.Items.Add(TempString + ': ' + IntToHex(buf[i].BaseAddresses[3 + BaseIndexOffset], 4)); BaseAddresses[AddressList.Items.Count - 1] := buf[i].BaseAddresses[3 + BaseIndexOffset]; end; // end if if BaseIndexOffset = 0 then begin if (buf[i].BaseAddresses[4] > 0) then begin AddressList.Items.Add(TempString + ': ' + IntToHex(buf[i].BaseAddresses[4], 4)); BaseAddresses[AddressList.Items.Count - 1] := buf[i].BaseAddresses[4]; end; // end if if (buf[i].BaseAddresses[5] > 0) then begin AddressList.Items.Add(TempString + ': ' + IntToHex(buf[i].BaseAddresses[5], 4)); BaseAddresses[AddressList.Items.Count - 1] := buf[i].BaseAddresses[5]; end; // end if end; // end if BaseIndexOffset except end; // end try/except Registry.CloseKey(); end; // end if ACCES Card end; // end for i Registry.Free; AddressList.ItemIndex := 0; AddressEdit.Text := IntToHex(BaseAddresses[0], 4); end; // end FormCreate function TMainFrm.GetCompanyKey(): AnsiString; var S: AnsiString; Registry: TRegistry; begin Registry := TRegistry.Create; try Registry.RootKey := HKEY_LOCAL_MACHINE; // False because we do not want to create it if it doesn't exist Registry.OpenKey('Software\PCIFind', false); S := Registry.ReadString('Company'); except end; // end try/except Registry.Free; Result := S; end; // end GetCompanyKey function TMainFrm.GetHardwareValue(Name: AnsiString): LongWord; var V: LongWord; Registry: TRegistry; begin Registry := TRegistry.Create; try Registry.RootKey := HKEY_LOCAL_MACHINE; // False because we do not want to create it if it doesn't exist Registry.OpenKey('Software\PCIFind\NTioPCI\Parameters', false); V := Registry.ReadInteger(Name); except V := 0; end; // end try/except Registry.Free; Result := V; end; // end GetHardwareValue function TMainFrm.GetHardwareBinary(Name: AnsiString; var Data: array of TPCI_COMMON_CONFIG; size: LongWord): LongWord; var V: LongWord; Registry: TRegistry; begin V := 0; Registry := TRegistry.Create; try Registry.RootKey := HKEY_LOCAL_MACHINE; // False because we do not want to create it if it doesn't exist Registry.OpenKey('Software\PCIFind\NTioPCI\Parameters', false); V := Registry.ReadBinaryData(Name, Data, size); except end; // end try/except Registry.Free; Result := V; end; // end GetHardwareBinary procedure TMainFrm.AddressListChange(Sender: TObject); begin AddressEdit.Text := IntToHex(BaseAddresses[AddressList.ItemIndex], 4); end; // end AddressListChange end.