Only in bochs-2.2.pre3-4nic/bios: Makefile
diff -ur bochs-2.2.pre3/bochs.h bochs-2.2.pre3-4nic/bochs.h
--- bochs-2.2.pre3/bochs.h	2005-03-16 17:36:31.000000000 +0100
+++ bochs-2.2.pre3-4nic/bochs.h	2005-04-26 17:38:48.000000000 +0200
@@ -653,7 +653,7 @@
   bx_pcidev_options pcidev;
   bx_cmos_options   cmos;
   bx_clock_options  clock;
-  bx_ne2k_options   ne2k;
+  bx_ne2k_options   ne2k[4];
   bx_param_bool_c   *OnewHardDriveSupport;
   bx_load32bitOSImage_t load32bitOSImage;
   bx_log_options    log;
Only in bochs-2.2.pre3-4nic/build/linux: bochs-dlx
Only in bochs-2.2.pre3-4nic/build/macosx: Info.plist
Only in bochs-2.2.pre3-4nic/build/win32/nsis: bochs.nsi
Only in bochs-2.2.pre3-4nic/build/win32/nsis: Makefile
Only in bochs-2.2.pre3-4nic/bx_debug: Makefile
Only in bochs-2.2.pre3-4nic/: bxversion.h
diff -ur bochs-2.2.pre3/config.cc bochs-2.2.pre3-4nic/config.cc
--- bochs-2.2.pre3/config.cc	2005-04-03 17:00:44.000000000 +0200
+++ bochs-2.2.pre3-4nic/config.cc	2005-05-04 10:07:28.000000000 +0200
@@ -1321,28 +1321,6 @@
   */
 
   // NE2K options
-  bx_options.ne2k.Oenabled = new bx_param_bool_c (BXP_NE2K_ENABLED,
-      "Enable NE2K NIC emulation",
-      "Enables the NE2K NIC emulation",
-      0);
-  bx_options.ne2k.Oioaddr = new bx_param_num_c (BXP_NE2K_IOADDR,
-      "NE2K I/O Address",
-      "I/O base address of the emulated NE2K device",
-      0, 0xffff,
-      0x240);
-  bx_options.ne2k.Oioaddr->set_base (16);
-  bx_options.ne2k.Oirq = new bx_param_num_c (BXP_NE2K_IRQ,
-      "NE2K Interrupt",
-      "IRQ used by the NE2K device",
-      0, 15,
-      9);
-  bx_options.ne2k.Oirq->set_options (bx_param_num_c::USE_SPIN_CONTROL);
-  bx_options.ne2k.Omacaddr = new bx_param_string_c (BXP_NE2K_MACADDR,
-      "MAC Address",
-      "MAC address of the NE2K device. Don't use an address of a machine on your net.",
-      "\xfe\xfd\xde\xad\xbe\xef", 6);
-  bx_options.ne2k.Omacaddr->get_options ()->set (bx_options.ne2k.Omacaddr->RAW_BYTES);
-  bx_options.ne2k.Omacaddr->set_separator (':');
   static char *eth_module_list[] = {
     "null",
 #if defined(ETH_LINUX)
@@ -1369,24 +1347,169 @@
     "vnet",
     NULL
   };
-  bx_options.ne2k.Oethmod = new bx_param_enum_c (BXP_NE2K_ETHMOD,
-      "Ethernet module",
+  bx_options.ne2k[0].Oenabled = new bx_param_bool_c (BXP_NE2K_0_ENABLED,
+      "Enable NE2K NIC_0 emulation",
+      "Enables the NE2K NIC emulation",
+      0);
+  bx_options.ne2k[0].Oioaddr = new bx_param_num_c (BXP_NE2K_0_IOADDR,
+      "NE2K_0 I/O Address",
+      "I/O base address of the emulated NE2K device",
+      0, 0xffff,
+      0x240);
+  bx_options.ne2k[0].Oioaddr->set_base (16);
+  bx_options.ne2k[0].Oirq = new bx_param_num_c (BXP_NE2K_0_IRQ,
+      "NE2K_0 Interrupt",
+      "IRQ used by the NE2K device",
+      0, 15,
+      9);
+  bx_options.ne2k[0].Oirq->set_options (bx_param_num_c::USE_SPIN_CONTROL);
+  bx_options.ne2k[0].Omacaddr = new bx_param_string_c (BXP_NE2K_0_MACADDR,
+      "MAC Address for NE2K_0",
+      "MAC address of the NE2K device. Don't use an address of a machine on your net.",
+      "\xfe\xfd\xde\xad\xbe\xef", 6);
+  bx_options.ne2k[0].Omacaddr->get_options ()->set (bx_options.ne2k[0].Omacaddr->RAW_BYTES);
+  bx_options.ne2k[0].Omacaddr->set_separator (':');
+  bx_options.ne2k[0].Oethmod = new bx_param_enum_c (BXP_NE2K_0_ETHMOD,
+      "Ethernet module 0",
       "Module used for the connection to the real net.",
        eth_module_list,
        0,
        0);
-  bx_options.ne2k.Oethmod->set_by_name ("null");
-  bx_options.ne2k.Oethmod->set_ask_format ("Choose ethernet module for the NE2K [%s] ");
-  bx_options.ne2k.Oethdev = new bx_param_string_c (BXP_NE2K_ETHDEV,
-      "Ethernet device",
+  bx_options.ne2k[0].Oethmod->set_by_name ("null");
+  bx_options.ne2k[0].Oethmod->set_ask_format ("Choose ethernet module for the NE2K [%s] ");
+  bx_options.ne2k[0].Oethdev = new bx_param_string_c (BXP_NE2K_0_ETHDEV,
+      "Ethernet device 0",
       "Device used for the connection to the real net. This is only valid if an ethernet module other than 'null' is used.",
       "xl0", BX_PATHNAME_LEN);
-  bx_options.ne2k.Oscript = new bx_param_string_c (BXP_NE2K_SCRIPT,
-      "Device configuration script",
+  bx_options.ne2k[0].Oscript = new bx_param_string_c (BXP_NE2K_0_SCRIPT,
+      "Device configuration script 0",
+      "Name of the script that is executed after Bochs initializes the network interface (optional).",
+      "none", BX_PATHNAME_LEN);
+#if !BX_WITH_WX
+  bx_options.ne2k[0].Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
+#endif
+  bx_options.ne2k[1].Oenabled = new bx_param_bool_c (BXP_NE2K_1_ENABLED,
+      "Enable NE2K NIC_1 emulation",
+      "Enables the NE2K NIC emulation",
+      0);
+  bx_options.ne2k[1].Oioaddr = new bx_param_num_c (BXP_NE2K_1_IOADDR,
+      "NE2K_1 I/O Address",
+      "I/O base address of the emulated NE2K device",
+      0, 0xffff,
+      0x240);
+  bx_options.ne2k[1].Oioaddr->set_base (16);
+  bx_options.ne2k[1].Oirq = new bx_param_num_c (BXP_NE2K_1_IRQ,
+      "NE2K_1 Interrupt",
+      "IRQ used by the NE2K device",
+      0, 15,
+      9);
+  bx_options.ne2k[1].Oirq->set_options (bx_param_num_c::USE_SPIN_CONTROL);
+  bx_options.ne2k[1].Omacaddr = new bx_param_string_c (BXP_NE2K_1_MACADDR,
+      "MAC Address for NE2K_1",
+      "MAC address of the NE2K device. Don't use an address of a machine on your net.",
+      "\xfe\xfd\xde\xad\xbe\xef", 6);
+  bx_options.ne2k[1].Omacaddr->get_options ()->set (bx_options.ne2k[1].Omacaddr->RAW_BYTES);
+  bx_options.ne2k[1].Omacaddr->set_separator (':');
+  bx_options.ne2k[1].Oethmod = new bx_param_enum_c (BXP_NE2K_1_ETHMOD,
+      "Ethernet module 1",
+      "Module used for the connection to the real net.",
+       eth_module_list,
+       0,
+       0);
+  bx_options.ne2k[1].Oethmod->set_by_name ("null");
+  bx_options.ne2k[1].Oethmod->set_ask_format ("Choose ethernet module for the NE2K [%s] ");
+  bx_options.ne2k[1].Oethdev = new bx_param_string_c (BXP_NE2K_1_ETHDEV,
+      "Ethernet device 1",
+      "Device used for the connection to the real net. This is only valid if an ethernet module other than 'null' is used.",
+      "xl0", BX_PATHNAME_LEN);
+  bx_options.ne2k[1].Oscript = new bx_param_string_c (BXP_NE2K_1_SCRIPT,
+      "Device configuration script 1",
       "Name of the script that is executed after Bochs initializes the network interface (optional).",
       "none", BX_PATHNAME_LEN);
 #if !BX_WITH_WX
-  bx_options.ne2k.Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
+  bx_options.ne2k[1].Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
+#endif
+  bx_options.ne2k[2].Oenabled = new bx_param_bool_c (BXP_NE2K_2_ENABLED,
+      "Enable NE2K NIC_2 emulation",
+      "Enables the NE2K NIC emulation",
+      0);
+  bx_options.ne2k[2].Oioaddr = new bx_param_num_c (BXP_NE2K_2_IOADDR,
+      "NE2K_2 I/O Address",
+      "I/O base address of the emulated NE2K device",
+      0, 0xffff,
+      0x240);
+  bx_options.ne2k[2].Oioaddr->set_base (16);
+  bx_options.ne2k[2].Oirq = new bx_param_num_c (BXP_NE2K_2_IRQ,
+      "NE2K_2 Interrupt",
+      "IRQ used by the NE2K device",
+      0, 15,
+      9);
+  bx_options.ne2k[2].Oirq->set_options (bx_param_num_c::USE_SPIN_CONTROL);
+  bx_options.ne2k[2].Omacaddr = new bx_param_string_c (BXP_NE2K_2_MACADDR,
+      "MAC Address for NE2K_2",
+      "MAC address of the NE2K device. Don't use an address of a machine on your net.",
+      "\xfe\xfd\xde\xad\xbe\xef", 6);
+  bx_options.ne2k[2].Omacaddr->get_options ()->set (bx_options.ne2k[2].Omacaddr->RAW_BYTES);
+  bx_options.ne2k[2].Omacaddr->set_separator (':');
+  bx_options.ne2k[2].Oethmod = new bx_param_enum_c (BXP_NE2K_2_ETHMOD,
+      "Ethernet module 2",
+      "Module used for the connection to the real net.",
+       eth_module_list,
+       0,
+       0);
+  bx_options.ne2k[2].Oethmod->set_by_name ("null");
+  bx_options.ne2k[2].Oethmod->set_ask_format ("Choose ethernet module for the NE2K [%s] ");
+  bx_options.ne2k[2].Oethdev = new bx_param_string_c (BXP_NE2K_2_ETHDEV,
+      "Ethernet device 2",
+      "Device used for the connection to the real net. This is only valid if an ethernet module other than 'null' is used.",
+      "xl0", BX_PATHNAME_LEN);
+  bx_options.ne2k[2].Oscript = new bx_param_string_c (BXP_NE2K_2_SCRIPT,
+      "Device configuration script 2",
+      "Name of the script that is executed after Bochs initializes the network interface (optional).",
+      "none", BX_PATHNAME_LEN);
+#if !BX_WITH_WX
+  bx_options.ne2k[2].Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
+#endif
+  bx_options.ne2k[3].Oenabled = new bx_param_bool_c (BXP_NE2K_3_ENABLED,
+      "Enable NE2K NIC_3 emulation",
+      "Enables the NE2K NIC emulation",
+      0);
+  bx_options.ne2k[3].Oioaddr = new bx_param_num_c (BXP_NE2K_3_IOADDR,
+      "NE2K_3 I/O Address",
+      "I/O base address of the emulated NE2K device",
+      0, 0xffff,
+      0x240);
+  bx_options.ne2k[3].Oioaddr->set_base (16);
+  bx_options.ne2k[3].Oirq = new bx_param_num_c (BXP_NE2K_3_IRQ,
+      "NE2K_3 Interrupt",
+      "IRQ used by the NE2K device",
+      0, 15,
+      9);
+  bx_options.ne2k[3].Oirq->set_options (bx_param_num_c::USE_SPIN_CONTROL);
+  bx_options.ne2k[3].Omacaddr = new bx_param_string_c (BXP_NE2K_3_MACADDR,
+      "MAC Address for NE2K_3",
+      "MAC address of the NE2K device. Don't use an address of a machine on your net.",
+      "\xfe\xfd\xde\xad\xbe\xef", 6);
+  bx_options.ne2k[3].Omacaddr->get_options ()->set (bx_options.ne2k[3].Omacaddr->RAW_BYTES);
+  bx_options.ne2k[3].Omacaddr->set_separator (':');
+  bx_options.ne2k[3].Oethmod = new bx_param_enum_c (BXP_NE2K_3_ETHMOD,
+      "Ethernet module 3",
+      "Module used for the connection to the real net.",
+       eth_module_list,
+       0,
+       0);
+  bx_options.ne2k[3].Oethmod->set_by_name ("null");
+  bx_options.ne2k[3].Oethmod->set_ask_format ("Choose ethernet module for the NE2K [%s] ");
+  bx_options.ne2k[3].Oethdev = new bx_param_string_c (BXP_NE2K_3_ETHDEV,
+      "Ethernet device 3",
+      "Device used for the connection to the real net. This is only valid if an ethernet module other than 'null' is used.",
+      "xl0", BX_PATHNAME_LEN);
+  bx_options.ne2k[3].Oscript = new bx_param_string_c (BXP_NE2K_3_SCRIPT,
+      "Device configuration script 3",
+      "Name of the script that is executed after Bochs initializes the network interface (optional).",
+      "none", BX_PATHNAME_LEN);
+#if !BX_WITH_WX
+  bx_options.ne2k[3].Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
 #endif
   bx_options.pnic.Oenabled = new bx_param_bool_c (BXP_PNIC_ENABLED,
       "Enable Pseudo NIC emulation",
@@ -1429,14 +1552,44 @@
 #if !BX_WITH_WX
   bx_options.pnic.Oscript->set_ask_format ("Enter new script name, or 'none': [%s] ");
 #endif
-  bx_param_c *ne2k_init_list[] = {
-    bx_options.ne2k.Oenabled,
-    bx_options.ne2k.Oioaddr,
-    bx_options.ne2k.Oirq,
-    bx_options.ne2k.Omacaddr,
-    bx_options.ne2k.Oethmod,
-    bx_options.ne2k.Oethdev,
-    bx_options.ne2k.Oscript,
+  bx_param_c *ne2k_0_init_list[] = {
+    bx_options.ne2k[0].Oenabled,
+    bx_options.ne2k[0].Oioaddr,
+    bx_options.ne2k[0].Oirq,
+    bx_options.ne2k[0].Omacaddr,
+    bx_options.ne2k[0].Oethmod,
+    bx_options.ne2k[0].Oethdev,
+    bx_options.ne2k[0].Oscript,
+    NULL
+  };
+  bx_param_c *ne2k_1_init_list[] = {
+    bx_options.ne2k[1].Oenabled,
+    bx_options.ne2k[1].Oioaddr,
+    bx_options.ne2k[1].Oirq,
+    bx_options.ne2k[1].Omacaddr,
+    bx_options.ne2k[1].Oethmod,
+    bx_options.ne2k[1].Oethdev,
+    bx_options.ne2k[1].Oscript,
+    NULL
+  };
+  bx_param_c *ne2k_2_init_list[] = {
+    bx_options.ne2k[2].Oenabled,
+    bx_options.ne2k[2].Oioaddr,
+    bx_options.ne2k[2].Oirq,
+    bx_options.ne2k[2].Omacaddr,
+    bx_options.ne2k[2].Oethmod,
+    bx_options.ne2k[2].Oethdev,
+    bx_options.ne2k[2].Oscript,
+    NULL
+  };
+  bx_param_c *ne2k_3_init_list[] = {
+    bx_options.ne2k[3].Oenabled,
+    bx_options.ne2k[3].Oioaddr,
+    bx_options.ne2k[3].Oirq,
+    bx_options.ne2k[3].Omacaddr,
+    bx_options.ne2k[3].Oethmod,
+    bx_options.ne2k[3].Oethdev,
+    bx_options.ne2k[3].Oscript,
     NULL
   };
   bx_param_c *pnic_init_list[] = {
@@ -1449,17 +1602,33 @@
     bx_options.pnic.Oscript,
     NULL
   };
-  menu = new bx_list_c (BXP_NE2K, "NE2000", "", ne2k_init_list);
+  menu = new bx_list_c (BXP_NE2K_0, "NE2000_0", "", ne2k_0_init_list);
+  menu->get_options ()->set (menu->USE_BOX_TITLE | menu->SHOW_PARENT);
+  bx_options.ne2k[0].Oenabled->set_dependent_list (
+      new bx_list_c (BXP_NULL, "", "", ne2k_0_init_list));
+  menu = new bx_list_c (BXP_NE2K_1, "NE2000_1", "", ne2k_1_init_list);
   menu->get_options ()->set (menu->USE_BOX_TITLE | menu->SHOW_PARENT);
-  bx_options.ne2k.Oenabled->set_dependent_list (
-      new bx_list_c (BXP_NULL, "", "", ne2k_init_list));
+  bx_options.ne2k[1].Oenabled->set_dependent_list (
+      new bx_list_c (BXP_NULL, "", "", ne2k_1_init_list));
+  menu = new bx_list_c (BXP_NE2K_2, "NE2000_2", "", ne2k_2_init_list);
+  menu->get_options ()->set (menu->USE_BOX_TITLE | menu->SHOW_PARENT);
+  bx_options.ne2k[2].Oenabled->set_dependent_list (
+      new bx_list_c (BXP_NULL, "", "", ne2k_2_init_list));
+  menu = new bx_list_c (BXP_NE2K_3, "NE2000_3", "", ne2k_3_init_list);
+  menu->get_options ()->set (menu->USE_BOX_TITLE | menu->SHOW_PARENT);
+  bx_options.ne2k[3].Oenabled->set_dependent_list (
+      new bx_list_c (BXP_NULL, "", "", ne2k_3_init_list));
+
   menu = new bx_list_c (BXP_PNIC, "PCI Pseudo NIC", "", pnic_init_list);
   menu->get_options ()->set (menu->USE_BOX_TITLE | menu->SHOW_PARENT);
   bx_options.pnic.Oenabled->set_dependent_list (
       new bx_list_c (BXP_NULL, "", "", pnic_init_list));
 
   bx_param_c *netdev_init_list2[] = {
-    SIM->get_param (BXP_NE2K),
+    SIM->get_param (BXP_NE2K_0),
+    SIM->get_param (BXP_NE2K_1),
+    SIM->get_param (BXP_NE2K_2),
+    SIM->get_param (BXP_NE2K_3),
     SIM->get_param (BXP_PNIC),
     NULL
   };
@@ -1828,13 +1997,37 @@
 #endif
 
   // ne2k
-  bx_options.ne2k.Oenabled->reset();
-  bx_options.ne2k.Oioaddr->reset();
-  bx_options.ne2k.Oirq->reset();
-  bx_options.ne2k.Omacaddr->reset();
-  bx_options.ne2k.Oethmod->reset();
-  bx_options.ne2k.Oethdev->reset();
-  bx_options.ne2k.Oscript->reset();
+  bx_options.ne2k[0].Oenabled->reset();
+  bx_options.ne2k[0].Oioaddr->reset();
+  bx_options.ne2k[0].Oirq->reset();
+  bx_options.ne2k[0].Omacaddr->reset();
+  bx_options.ne2k[0].Oethmod->reset();
+  bx_options.ne2k[0].Oethdev->reset();
+  bx_options.ne2k[0].Oscript->reset();
+
+  bx_options.ne2k[1].Oenabled->reset();
+  bx_options.ne2k[1].Oioaddr->reset();
+  bx_options.ne2k[1].Oirq->reset();
+  bx_options.ne2k[1].Omacaddr->reset();
+  bx_options.ne2k[1].Oethmod->reset();
+  bx_options.ne2k[1].Oethdev->reset();
+  bx_options.ne2k[1].Oscript->reset();
+
+  bx_options.ne2k[2].Oenabled->reset();
+  bx_options.ne2k[2].Oioaddr->reset();
+  bx_options.ne2k[2].Oirq->reset();
+  bx_options.ne2k[2].Omacaddr->reset();
+  bx_options.ne2k[2].Oethmod->reset();
+  bx_options.ne2k[2].Oethdev->reset();
+  bx_options.ne2k[2].Oscript->reset();
+
+  bx_options.ne2k[3].Oenabled->reset();
+  bx_options.ne2k[3].Oioaddr->reset();
+  bx_options.ne2k[3].Oirq->reset();
+  bx_options.ne2k[3].Omacaddr->reset();
+  bx_options.ne2k[3].Oethmod->reset();
+  bx_options.ne2k[3].Oethdev->reset();
+  bx_options.ne2k[3].Oscript->reset();
 
   // pcidev
   bx_options.pcidev.Ovendor->reset();
@@ -3124,19 +3317,41 @@
     char tmpchar[6];
     int valid = 0;
     int n;
-    if (!bx_options.ne2k.Oenabled->get ()) {
-      bx_options.ne2k.Oethmod->set_by_name ("null");
+    // find the card-number in the line. this has to happen first, so
+    // we loop over all param's
+    int cardNo(0);
+    for (i=1; i<num_params; i++) {
+      if (!strncmp(params[i], "card=", 5)) {
+        if (strlen(params[i]) < 6) {
+            PARSE_ERR(("%s: No card number given!", context));
+            PARSE_WARN(("assuming card number=0"));
+            cardNo = 0;
+            break; // leave the for loop
+        }
+        cardNo = atoi(&(params[i][5]));
+        if (cardNo < 0 || cardNo > 3) {
+          PARSE_ERR(("%s: invalid NE2K Card Number. Allowed range: 0-3", context));
+          cardNo = 0; 
+        }
+      }
+    }
+    
+    BX_INFO(("Reading NE2K, Card %i Configuration", cardNo));
+
+
+    if (!bx_options.ne2k[cardNo].Oenabled->get ()) {
+      bx_options.ne2k[cardNo].Oethmod->set_by_name ("null");
       }
     for (i=1; i<num_params; i++) {
       if (!strncmp(params[i], "enabled=", 8)) {
         if (atol(&params[i][8]) == 0) valid |= 0x80;
         }
       else if (!strncmp(params[i], "ioaddr=", 7)) {
-        bx_options.ne2k.Oioaddr->set (strtoul(&params[i][7], NULL, 16));
+        bx_options.ne2k[cardNo].Oioaddr->set (strtoul(&params[i][7], NULL, 16));
         valid |= 0x01;
         }
       else if (!strncmp(params[i], "irq=", 4)) {
-        bx_options.ne2k.Oirq->set (atol(&params[i][4]));
+        bx_options.ne2k[cardNo].Oirq->set (atol(&params[i][4]));
         valid |= 0x02;
         }
       else if (!strncmp(params[i], "mac=", 4)) {
@@ -3147,26 +3362,26 @@
         }
         for (n=0;n<6;n++)
           tmpchar[n] = (unsigned char)tmp[n];
-        bx_options.ne2k.Omacaddr->set (tmpchar);
+        bx_options.ne2k[cardNo].Omacaddr->set (tmpchar);
         valid |= 0x04;
         }
       else if (!strncmp(params[i], "ethmod=", 7)) {
-        if (!bx_options.ne2k.Oethmod->set_by_name (strdup(&params[i][7])))
+        if (!bx_options.ne2k[cardNo].Oethmod->set_by_name (strdup(&params[i][7])))
           PARSE_ERR(("%s: ethernet module '%s' not available", context, strdup(&params[i][7])));
         }
       else if (!strncmp(params[i], "ethdev=", 7)) {
-        bx_options.ne2k.Oethdev->set (strdup(&params[i][7]));
+        bx_options.ne2k[cardNo].Oethdev->set (strdup(&params[i][7]));
         }
       else if (!strncmp(params[i], "script=", 7)) {
-        bx_options.ne2k.Oscript->set (strdup(&params[i][7]));
+        bx_options.ne2k[cardNo].Oscript->set (strdup(&params[i][7]));
         }
       else {
         PARSE_WARN(("%s: unknown parameter '%s' for ne2k ignored.", context, params[i]));
         }
     }
-    if (!bx_options.ne2k.Oenabled->get ()) {
+    if (!bx_options.ne2k[cardNo].Oenabled->get ()) {
       if (valid == 0x07) {
-        bx_options.ne2k.Oenabled->set (1);
+        bx_options.ne2k[cardNo].Oenabled->set (1);
         }
       else if (valid < 0x80) {
         PARSE_ERR(("%s: ne2k directive incomplete (ioaddr, irq and mac are required)", context));
@@ -3174,7 +3389,7 @@
       }
     else {
       if (valid & 0x80) {
-        bx_options.ne2k.Oenabled->set (0);
+        bx_options.ne2k[cardNo].Oenabled->set (0);
         }
       }
     }
@@ -3567,9 +3782,9 @@
 }
 
 int
-bx_write_ne2k_options (FILE *fp, bx_ne2k_options *opt)
+bx_write_ne2k_options (FILE *fp, bx_ne2k_options *opt, int cardNumber)
 {
-  fprintf (fp, "ne2k: enabled=%d", opt->Oenabled->get ());
+  fprintf (fp, "ne2k_%i: enabled=%d", cardNumber, opt->Oenabled->get ());
   if (opt->Oenabled->get ()) {
     char *ptr = opt->Omacaddr->getptr ();
     fprintf (fp, ", ioaddr=0x%x, irq=%d, mac=%02x:%02x:%02x:%02x:%02x:%02x, ethmod=%s, ethdev=%s, script=%s",
@@ -3778,7 +3993,12 @@
   fprintf (fp, "screenmode: name=\"%s\"\n", bx_options.Oscreenmode->getptr ());
 #endif
   bx_write_clock_options (fp, &bx_options.clock);
-  bx_write_ne2k_options (fp, &bx_options.ne2k);
+
+  bx_write_ne2k_options (fp, &(bx_options.ne2k[0]), 0);
+  bx_write_ne2k_options (fp, &(bx_options.ne2k[1]), 1);
+  bx_write_ne2k_options (fp, &(bx_options.ne2k[2]), 2);
+  bx_write_ne2k_options (fp, &(bx_options.ne2k[3]), 3);
+
   bx_write_pnic_options (fp, &bx_options.pnic);
   bx_write_loader_options (fp, &bx_options.load32bitOSImage);
   bx_write_log_options (fp, &bx_options.log);
Only in bochs-2.2.pre3-4nic/: .config.cc.swp
Only in bochs-2.2.pre3-4nic/: config.h
diff -ur bochs-2.2.pre3/config.h.in bochs-2.2.pre3-4nic/config.h.in
--- bochs-2.2.pre3/config.h.in	2005-03-30 00:01:22.000000000 +0200
+++ bochs-2.2.pre3-4nic/config.h.in	2005-04-26 17:49:20.000000000 +0200
@@ -258,7 +258,7 @@
 #define BX_USE_PCIDEV_SMF  1  // PCI-DEV
 #define BX_USE_PCIUSB_SMF  1  // USB hub
 #define BX_USE_PCIPNIC_SMF 1  // PCI pseudo NIC
-#define BX_USE_NE2K_SMF    1  // NE2K
+#define BX_USE_NE2K_SMF    0  // NE2K
 #define BX_USE_EFI_SMF     1  // External FPU IRQ
 #define BX_USE_GAME_SMF    1  // Gameport
 #define BX_USE_CIRRUS_SMF  1  // SVGA Cirrus
Only in bochs-2.2.pre3-4nic/: config.status
Only in bochs-2.2.pre3-4nic/cpu: libcpu.a
Only in bochs-2.2.pre3-4nic/cpu: Makefile
Only in bochs-2.2.pre3-4nic/: cscope-refresh.sh
Only in bochs-2.2.pre3-4nic/disasm: Makefile
Only in bochs-2.2.pre3-4nic/doc/docbook: Makefile
Only in bochs-2.2.pre3-4nic/fpu: libfpu.a
Only in bochs-2.2.pre3-4nic/fpu: Makefile
Only in bochs-2.2.pre3-4nic/gui: libgui.a
Only in bochs-2.2.pre3-4nic/gui: Makefile
diff -ur bochs-2.2.pre3/gui/siminterface.h bochs-2.2.pre3-4nic/gui/siminterface.h
--- bochs-2.2.pre3/gui/siminterface.h	2005-02-01 20:16:19.000000000 +0100
+++ bochs-2.2.pre3-4nic/gui/siminterface.h	2005-04-26 17:39:18.000000000 +0200
@@ -370,14 +370,42 @@
   BXP_MENU_MISC_2,
   BXP_MENU_RUNTIME,
   BXP_MAX_IPS,
-  BXP_NE2K_ENABLED,
-  BXP_NE2K_IOADDR,
-  BXP_NE2K_IRQ,
-  BXP_NE2K_MACADDR,
-  BXP_NE2K_ETHMOD,
-  BXP_NE2K_ETHDEV,
-  BXP_NE2K_SCRIPT,
-  BXP_NE2K,
+  BXP_NE2K_0_ENABLED,
+  BXP_NE2K_0_PRESENT,
+  BXP_NE2K_0_IOADDR,
+  BXP_NE2K_0_IRQ,
+  BXP_NE2K_0_MACADDR,
+  BXP_NE2K_0_ETHMOD,
+  BXP_NE2K_0_ETHDEV,
+  BXP_NE2K_0_SCRIPT,
+  BXP_NE2K_0,
+  BXP_NE2K_1_ENABLED,
+  BXP_NE2K_1_PRESENT,
+  BXP_NE2K_1_IOADDR,
+  BXP_NE2K_1_IRQ,
+  BXP_NE2K_1_MACADDR,
+  BXP_NE2K_1_ETHMOD,
+  BXP_NE2K_1_ETHDEV,
+  BXP_NE2K_1_SCRIPT,
+  BXP_NE2K_1,
+  BXP_NE2K_2_ENABLED,
+  BXP_NE2K_2_PRESENT,
+  BXP_NE2K_2_IOADDR,
+  BXP_NE2K_2_IRQ,
+  BXP_NE2K_2_MACADDR,
+  BXP_NE2K_2_ETHMOD,
+  BXP_NE2K_2_ETHDEV,
+  BXP_NE2K_2_SCRIPT,
+  BXP_NE2K_2,
+  BXP_NE2K_3_ENABLED,
+  BXP_NE2K_3_PRESENT,
+  BXP_NE2K_3_IOADDR,
+  BXP_NE2K_3_IRQ,
+  BXP_NE2K_3_MACADDR,
+  BXP_NE2K_3_ETHMOD,
+  BXP_NE2K_3_ETHDEV,
+  BXP_NE2K_3_SCRIPT,
+  BXP_NE2K_3,
   BXP_PNIC_ENABLED,
   BXP_PNIC_IOADDR,
   BXP_PNIC_IRQ,
Only in bochs-2.2.pre3-4nic/host/linux/pcidev: Makefile
Only in bochs-2.2.pre3-4nic/instrument/stubs: Makefile
diff -ur bochs-2.2.pre3/iodev/devices.cc bochs-2.2.pre3-4nic/iodev/devices.cc
--- bochs-2.2.pre3/iodev/devices.cc	2005-02-16 18:53:40.000000000 +0100
+++ bochs-2.2.pre3-4nic/iodev/devices.cc	2005-04-26 17:40:07.000000000 +0200
@@ -85,7 +85,10 @@
   pluginPicDevice = &stubPic;
   pluginHardDrive = &stubHardDrive;
   pluginSB16Device = NULL;
-  pluginNE2kDevice =&stubNE2k;
+  pluginNE2kDevice[0] =&stubNE2k;
+  pluginNE2kDevice[1] =&stubNE2k;
+  pluginNE2kDevice[2] =&stubNE2k;
+  pluginNE2kDevice[3] =&stubNE2k;
   pluginExtFpuIrq = NULL;
   pluginGameport = NULL;
   pluginSpeaker = &stubSpeaker;
@@ -95,6 +98,15 @@
 #endif
 }
 
+#if !BX_PLUGINS
+// We need a forward-declaration of these functions since the compiler doesn't find them
+// otherwise. With the original Bochs, it finds the function. But I don't know
+// why. 
+int libne2k0_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[]);
+int libne2k1_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[]);
+int libne2k2_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[]);
+int libne2k3_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[]);
+#endif
 
 bx_devices_c::~bx_devices_c(void)
 {
@@ -207,14 +219,29 @@
 #endif
   }
 
-  // NE2000 NIC
-  if (bx_options.ne2k.Oenabled->get ()) {
 #if BX_SUPPORT_NE2K
-    PLUG_load_plugin(ne2k, PLUGTYPE_OPTIONAL);
+  // NE2000 NIC
+  if (bx_options.ne2k[0].Oenabled->get ()) {
+    PLUG_load_plugin(ne2k0, PLUGTYPE_OPTIONAL);
+  }
+  if (bx_options.ne2k[1].Oenabled->get ()) {
+    PLUG_load_plugin(ne2k1, PLUGTYPE_OPTIONAL);
+  }
+  if (bx_options.ne2k[2].Oenabled->get ()) {
+    PLUG_load_plugin(ne2k2, PLUGTYPE_OPTIONAL);
+  }
+  if (bx_options.ne2k[3].Oenabled->get ()) {
+    PLUG_load_plugin(ne2k3, PLUGTYPE_OPTIONAL);
+  }
 #else
+  if (bx_options.ne2k[0].Oenabled->get() ||
+      bx_options.ne2k[1].Oenabled->get() ||
+      bx_options.ne2k[2].Oenabled->get() ||
+      bx_options.ne2k[3].Oenabled->get())
+  {
     BX_ERROR(("Bochs is not compiled with NE2K support"));
-#endif
   }
+#endif
 
 #if BX_SUPPORT_APIC
     // I/O APIC 82093AA
diff -ur bochs-2.2.pre3/iodev/eth.cc bochs-2.2.pre3-4nic/iodev/eth.cc
--- bochs-2.2.pre3/iodev/eth.cc	2004-10-07 19:38:03.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/eth.cc	2005-04-26 18:10:41.000000000 +0200
@@ -163,7 +163,7 @@
 };
 
 #undef LOG_THIS
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 // This is a utility script used for tuntap or ethertap
 int execute_script( char* scriptname, char* arg1 )
diff -ur bochs-2.2.pre3/iodev/eth_linux.cc bochs-2.2.pre3-4nic/iodev/eth_linux.cc
--- bochs-2.2.pre3/iodev/eth_linux.cc	2004-10-07 19:38:03.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/eth_linux.cc	2005-04-26 18:11:29.000000000 +0200
@@ -50,7 +50,7 @@
 
 #include "eth.h"
 
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 extern "C" {
 #include <errno.h>
diff -ur bochs-2.2.pre3/iodev/eth_null.cc bochs-2.2.pre3-4nic/iodev/eth_null.cc
--- bochs-2.2.pre3/iodev/eth_null.cc	2004-10-07 19:38:03.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/eth_null.cc	2005-04-26 18:10:53.000000000 +0200
@@ -41,7 +41,7 @@
 
 #include "eth.h"
 
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 
 //
diff -ur bochs-2.2.pre3/iodev/eth_tap.cc bochs-2.2.pre3-4nic/iodev/eth_tap.cc
--- bochs-2.2.pre3/iodev/eth_tap.cc	2004-10-07 19:38:03.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/eth_tap.cc	2005-04-26 18:11:36.000000000 +0200
@@ -89,7 +89,7 @@
 
 #include "eth.h"
 
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 #include <signal.h>
 #include <sys/param.h>
diff -ur bochs-2.2.pre3/iodev/eth_tuntap.cc bochs-2.2.pre3-4nic/iodev/eth_tuntap.cc
--- bochs-2.2.pre3/iodev/eth_tuntap.cc	2004-10-07 19:38:03.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/eth_tuntap.cc	2005-04-26 18:11:41.000000000 +0200
@@ -36,7 +36,7 @@
 
 #include "eth.h"
 
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 #include <signal.h>
 #include <sys/param.h>
diff -ur bochs-2.2.pre3/iodev/eth_vnet.cc bochs-2.2.pre3-4nic/iodev/eth_vnet.cc
--- bochs-2.2.pre3/iodev/eth_vnet.cc	2005-01-19 19:21:36.000000000 +0100
+++ bochs-2.2.pre3-4nic/iodev/eth_vnet.cc	2005-04-26 18:11:16.000000000 +0200
@@ -22,7 +22,7 @@
 
 #include "eth.h"
 
-#define LOG_THIS bx_devices.pluginNE2kDevice->
+#define LOG_THIS bx_devices.pluginNE2kDevice[0]->
 
 #define BX_ETH_VNET_LOGGING 1
 
diff -ur bochs-2.2.pre3/iodev/iodev.h bochs-2.2.pre3-4nic/iodev/iodev.h
--- bochs-2.2.pre3/iodev/iodev.h	2005-04-02 13:30:08.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/iodev.h	2005-04-26 17:42:04.000000000 +0200
@@ -428,7 +428,7 @@
   bx_pic_stub_c     *pluginPicDevice;
   bx_hard_drive_stub_c *pluginHardDrive;
   bx_devmodel_c     *pluginSB16Device;
-  bx_ne2k_stub_c    *pluginNE2kDevice;
+  bx_ne2k_stub_c    *pluginNE2kDevice[4];
   bx_g2h_c          *g2h;
   bx_devmodel_c     *pluginExtFpuIrq;
   bx_devmodel_c     *pluginGameport;
Only in bochs-2.2.pre3-4nic/iodev: libiodev.a
Only in bochs-2.2.pre3-4nic/iodev: Makefile
diff -ur bochs-2.2.pre3/iodev/ne2k.cc bochs-2.2.pre3-4nic/iodev/ne2k.cc
--- bochs-2.2.pre3/iodev/ne2k.cc	2005-01-01 10:31:38.000000000 +0100
+++ bochs-2.2.pre3-4nic/iodev/ne2k.cc	2005-04-26 18:04:50.000000000 +0200
@@ -41,21 +41,77 @@
 // hit the unclear completely full buffer condition.
 #define BX_NE2K_NEVER_FULL_RING (1)
 
-#define LOG_THIS theNE2kDevice->
+#if BX_USE_NE2K_SMF
+// theNE2kDevice may only be a pointer in the static case there
+// there can only be one NIC installed.
 
 bx_ne2k_c *theNE2kDevice = NULL;
+#define LOG_THIS theNE2kDevice->
+
+#else
+// in the non-static case, there can be more than one NIC,
+// so we have to use "this" for theNE2kDevice
+#define theNE2kDevice this
+#define LOG_THIS this->
+
+#endif
+
+
 
 const Bit8u ne2k_iomask[32] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
                                7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
 
-  int
-libne2k_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
+int
+libne2k_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[], const int cardNo)
 {
+#if BX_USE_NE2K_SMF 
   theNE2kDevice = new bx_ne2k_c ();
   bx_devices.pluginNE2kDevice = theNE2kDevice;
+  theNE2kDevice->interfaceNo = cardNo;
+  bx_devices.pluginNE2kDevice[cardNo] = theNE2kDevice;
   BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theNE2kDevice, BX_PLUGIN_NE2K);
-  return(0); // Success
+#else
+  bx_ne2k_c *tempDevice = new bx_ne2k_c ();
+  tempDevice->interfaceNo = cardNo;
+  bx_devices.pluginNE2kDevice[cardNo] = tempDevice;
+  // BX_PLUGIN_NE2K has to contain %d.
+  // the % is replaced by the number, and the d by a \0
+  // therefore the strlen is enough!
+  int nlen = strlen(BX_PLUGIN_NE2K)+1;
+  char *pluginName;
+  pluginName = (char*)malloc(nlen);
+  for (int i=0; i!=nlen; i++)
+      pluginName[i] = '\0';
+  // snprintf may only print nlen-1 chars, cause the last one will be set to \0
+  snprintf(pluginName, nlen-1, BX_PLUGIN_NE2K, cardNo);
+/*--------------------------------------------------
+*   pluginName[nlen-1] = '\0';
+*--------------------------------------------------*/
+  printf("PLUGINNAME: %s<<\n", pluginName);
+  BX_REGISTER_DEVICE_DEVMODEL(plugin, type, tempDevice, pluginName);
+#endif
+   return(0); // Success
+ }
+ 
+int libne2k0_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
+{
+    libne2k_LTX_plugin_init(plugin, type, argc, argv, 0);
 }
+int libne2k1_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
+{
+    libne2k_LTX_plugin_init(plugin, type, argc, argv, 1);
+}
+int libne2k2_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
+{
+    libne2k_LTX_plugin_init(plugin, type, argc, argv, 2);
+}
+int libne2k3_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
+{
+    libne2k_LTX_plugin_init(plugin, type, argc, argv, 3);
+}
+
+
+
 
   void
 libne2k_LTX_plugin_fini(void)
@@ -1296,7 +1352,7 @@
   BX_DEBUG(("Init $Id: ne2k.cc,v 1.72 2005/01/01 09:31:38 vruppert Exp $"));
 
   // Read in values from config file
-  memcpy(BX_NE2K_THIS s.physaddr, bx_options.ne2k.Omacaddr->getptr (), 6);
+  memcpy(BX_NE2K_THIS s.physaddr, bx_options.ne2k[interfaceNo].Omacaddr->getptr (), 6);
   BX_NE2K_THIS s.pci_enabled = 0;
   strcpy(devname, "NE2000 NIC");
 
@@ -1332,32 +1388,43 @@
   }
   // Register the IRQ and i/o port addresses
   if (!BX_NE2K_THIS s.pci_enabled) {
-    BX_NE2K_THIS s.base_address = bx_options.ne2k.Oioaddr->get ();
-    BX_NE2K_THIS s.base_irq     = bx_options.ne2k.Oirq->get ();
+    BX_NE2K_THIS s.base_address = bx_options.ne2k[interfaceNo].Oioaddr->get ();
+    BX_NE2K_THIS s.base_irq     = bx_options.ne2k[interfaceNo].Oirq->get ();
+
+  char *pluginName;
+  pluginName = (char*)malloc(22);
+  snprintf(pluginName, 22, "NE2000 ethernet NIC_%d", interfaceNo);
+  pluginName[21] = '\0';
+  DEV_register_irq(BX_NE2K_THIS s.base_irq, pluginName);
+  free(pluginName);
+
+  pluginName = (char*)malloc(13);
+  snprintf(pluginName, 13, "ne2000 NIC_%d", interfaceNo);
+  pluginName[12] = '\0';
 
-    DEV_register_irq(BX_NE2K_THIS s.base_irq, "NE2000 ethernet NIC");
 
     DEV_register_ioread_handler_range(BX_NE2K_THIS_PTR, read_handler,
                                       BX_NE2K_THIS s.base_address,
                                       BX_NE2K_THIS s.base_address + 0x0F,
-                                      devname, 3);
+                                      pluginName, 3);
     DEV_register_iowrite_handler_range(BX_NE2K_THIS_PTR, write_handler,
                                        BX_NE2K_THIS s.base_address,
                                        BX_NE2K_THIS s.base_address + 0x0F,
-                                       devname, 3);
+                                       pluginName, 3);
     DEV_register_ioread_handler(BX_NE2K_THIS_PTR, read_handler,
                                 BX_NE2K_THIS s.base_address + 0x10,
-                                devname, 3);
+                                pluginName, 3);
     DEV_register_iowrite_handler(BX_NE2K_THIS_PTR, write_handler,
                                  BX_NE2K_THIS s.base_address + 0x10,
-                                 devname, 3);
+                                 pluginName, 3);
     DEV_register_ioread_handler(BX_NE2K_THIS_PTR, read_handler,
                                 BX_NE2K_THIS s.base_address + 0x1F,
-                                devname, 1);
+                                pluginName, 1);
     DEV_register_iowrite_handler(BX_NE2K_THIS_PTR, write_handler,
                                  BX_NE2K_THIS s.base_address + 0x1F,
-                                 devname, 1);
+                                 pluginName, 1);
 
+ free(pluginName);
     BX_INFO(("port 0x%x/32 irq %d mac %02x:%02x:%02x:%02x:%02x:%02x",
              BX_NE2K_THIS s.base_address,
              BX_NE2K_THIS s.base_irq,
@@ -1388,13 +1455,13 @@
     BX_NE2K_THIS s.macaddr[i] = 0x57;
     
   // Attach to the simulated ethernet dev
-  char *ethmod = bx_options.ne2k.Oethmod->get_choice(bx_options.ne2k.Oethmod->get());
+  char *ethmod = bx_options.ne2k[interfaceNo].Oethmod->get_choice(bx_options.ne2k[interfaceNo].Oethmod->get());
   BX_NE2K_THIS ethdev = eth_locator_c::create(ethmod,
-                                              bx_options.ne2k.Oethdev->getptr (),
-                                              (const char *) bx_options.ne2k.Omacaddr->getptr (),
+                                              bx_options.ne2k[interfaceNo].Oethdev->getptr (),
+                                              (const char *) bx_options.ne2k[interfaceNo].Omacaddr->getptr (),
                                               rx_handler, 
                                               this,
-                                              bx_options.ne2k.Oscript->getptr ());
+                                              bx_options.ne2k[interfaceNo].Oscript->getptr ());
 
   if (BX_NE2K_THIS ethdev == NULL) {
     BX_PANIC(("could not find eth module %s", ethmod));
@@ -1402,7 +1469,7 @@
     BX_INFO(("could not find eth module %s - using null instead", ethmod));
 
     BX_NE2K_THIS ethdev = eth_locator_c::create("null", NULL,
-                                                (const char *) bx_options.ne2k.Omacaddr->getptr (),
+                                                (const char *) bx_options.ne2k[interfaceNo].Omacaddr->getptr (),
                                                 rx_handler, 
                                                 this, "");
     if (BX_NE2K_THIS ethdev == NULL)
diff -ur bochs-2.2.pre3/iodev/ne2k.h bochs-2.2.pre3-4nic/iodev/ne2k.h
--- bochs-2.2.pre3/iodev/ne2k.h	2004-09-05 12:30:19.000000000 +0200
+++ bochs-2.2.pre3-4nic/iodev/ne2k.h	2005-04-26 17:43:58.000000000 +0200
@@ -32,9 +32,15 @@
 // a National Semiconductor DS-8390 ethernet MAC chip, with some h/w
 // to provide a windowed memory region for the chip and a MAC address.
 //
-
+// multiple NICs:
+// Code has been chaned by Timo Teifel (ttri@teifel.net) from University 
+// of Tuebingen, Chair for Computer Networks and Internet. (Feb-Apr 2004, for Bochs Version 2.2: April 2005)
+// Now it's possible to use up to 4 distinct NICs... see README-multiple-NICs
 
 #if BX_USE_NE2K_SMF
+#error Ne2K cannot use Static functions with multiple NIC cards
+#error change BX_USE_NE2K_SMF in config.h to 0
+
 #  define BX_NE2K_SMF  static
 #  define BX_NE2K_THIS theNE2kDevice->
 #  define BX_NE2K_THIS_PTR theNE2kDevice
@@ -211,6 +217,7 @@
   virtual void reset(unsigned type);
   virtual void print_info (FILE *file, int page, int reg, int nodups);
 
+  int interfaceNo;
 private:
   bx_ne2k_t s;
 
Only in bochs-2.2.pre3-4nic/: libtool
Only in bochs-2.2.pre3-4nic/: ltdlconf.h
Only in bochs-2.2.pre3-4nic/: Makefile
Only in bochs-2.2.pre3-4nic/memory: libmemory.a
Only in bochs-2.2.pre3-4nic/memory: Makefile
Only in bochs-2.2.pre3-4nic/misc: Makefile
Only in bochs-2.2.pre3-4nic/: myConfigure
