Path: utzoo!utgpu!jarvis.csri.toronto.edu!clyde.concordia.ca!uunet!mcsun!ukc!tcdcs!swift.cs.tcd.ie!dit.ie!alawlor From: alawlor@dit.ie (Aengus Lawlor) Newsgroups: comp.dcom.lans Subject: Telling ENet cards apart. Message-ID: <7191.25d1d24d@dit.ie> Date: 8 Feb 90 20:10:53 GMT Organization: Dublin Institute of Technology Lines: 71 Some time back, I asked for help in getting the Ethernet address from a board (so that I could distinguish between boards, and load the correct driver) The following is a Turbo Pascal (I can easily rewrite in C if anybody needs it) program that distinguishes between WD8003E, 3C501, and DE-001 (NE-1000 clones). The tests aren't foolproof and I would be happy to hear from people with ideas for improvingthe tests, or extending the boards it can test for. The program sets the ERRORLEVEL, and a sample Batch job to test this is also included Aengus. ----------------------------------------------------- { Turbo Pascal 4.0 and above } var i, j : integer; check : longint; begin check := 0; for i:=$288 to $28f do (* WD8003E EtherCard *) begin (* Addr at locations $288 - $28D *) j := port[i]; (* Type at $28E. C/Sum at $28F *) check := check + j; end; if ((check mod 256) = $ff) and (port[$28e] = 3) then begin (* It's a WD8003E so *) halt(3); end; check := 0; for i :=0 to 2 do (* 3C501 EtherCard *) begin (* Get first 3 digits *) port[$308] := i; j := port[$30C]; check := check * 256 + j; end; (* all my 3C501's have addresses *) if check = $02608C then (* of the form $02608CXXXXXX *) begin (* It's a 3C501 so *) halt(2); (* set ERRORLEVEL 2 *) end; (* D-link DE-001 *) { check := 0; port[$300] := $21; (* possible timing problems *) port[$307] := $ff; (* this code is actually for a *) port[$308] := $0; (* NE-1000. It sometimes works *) port[$309] := $0; (* with a D-link, and sometimes *) port[$30a] := $6; (* returns garbage. *) port[$30b] := $0; (* For my own purposes, I assume *) port[$300] := $a; (* any card that fails the first *) for i:=1 to 6 do (* 2 tests is a D-Link *) begin j := port[$310]; check := check * 256 + j; end; } halt(1) (* Not WD or 3C so it must be DL *) end. ----------------------------------------- {BATch file to use ETHTST.EXE} @echo off ethtst if errorlevel 3 if not errorlevel 4 echo WD8003 if errorlevel 2 if not errorlevel 3 echo 3C501 if errorlevel 1 if not errorlevel 2 echo I suppose it must be a D-Link! -- Aengus Lawlor Dept of Computer Science. Time flies like an arrow, ALAWLOR@DIT.IE Dublin Institute of Technology. Fruit-flies like a banana Kevin Street. Dublin 8. Ireland.