Previous 15994 Revisions Next

r15074 Monday 30th April, 2012 at 22:42:22 UTC by R. Belmont
3c505 improvements. Netbooting a MESS Apollo instance off a second MESS Apollo instance is now possible, and Domain/OS 10.4 works. [Hans Ostermeyer]
[src/mess/machine]3c505.c 3c505.h

src/mess/machine/3c505.c
r15073r15074
107107enum
108108{
109109   /* host PCB commands */
110   CMD_RESET = 0x00,
110111   CMD_CONFIGURE_ADAPTER_MEMORY = 0x01,
111112   CMD_CONFIGURE_82586 = 0x02,
112113   CMD_STATION_ADDRESS = 0x03,
r15073r15074
132133   CMD_MC_FA =0xfa,
133134
134135   /*adapter PCB commands */
136   CMD_RESET_RESPONSE = 0x30,
135137   CMD_CONFIGURE_ADAPTER_RESPONSE = 0x31,
136138   CMD_CONFIGURE_82586_RESPONSE = 0x32,
137139   CMD_ADDRESS_RESPONSE = 0x33,
r15073r15074
236238   m_control = 0;
237239   m_command_index = 0;
238240   m_command_pending = 0;
241   m_mc_f9_pending = 0;
242   m_wait_for_ack = 0;
239243   m_rx_data_index = 0;
240244   m_rx_pending = 0;
241245   m_tx_data_length = 0;
r15073r15074
244248   m_microcode_running = 0;
245249   m_microcode_version = 0;
246250   m_i82586_config = 0;
251
252   // FIXME: test data
253   m_netstat.tot_recv = 1;
254   m_netstat.tot_xmit = 2;
255   m_netstat.err_CRC = 3;
256   m_netstat.err_align = 4;
257   m_netstat.err_res = 5;
258   m_netstat.err_ovrrun = 6;
259
247260   memset(m_station_address, 0 , sizeof(m_station_address));
248261   memset(m_multicast_list, 0 , sizeof(m_multicast_list));
249262   set_filter_list();
r15073r15074
432445   if (setfilter != NULL)
433446   {
434447      int node_id = (((m_station_address[3] << 8) + m_station_address[4]) << 8) + m_station_address[5];
435      LOG1(("set_filter_list node_id=%x",node_id));
448      LOG2(("set_filter_list node_id=%x",node_id));
436449      (*setfilter)(this, node_id);
437450   }
438451
r15073r15074
446459{
447460   if (state != irq_state)
448461   {
449      LOG1(("set_interrupt(%d)",state));
462      LOG2(("set_interrupt(%d)",state));
450463      if (set_irq != NULL)
451464      {
452465         (*set_irq)(this, state);
r15073r15074
476489      logerror("%s: Command ", cpu_context());
477490      switch (m_command_buffer[0])
478491      {
492      case CMD_RESET: // 0x00
493         logerror("CMD_RESET");
494         break;
479495      case CMD_CONFIGURE_ADAPTER_MEMORY: // 0x01
480496         logerror("CMD_CONFIGURE_ADAPTER_MEMORY");
481497         break;
r15073r15074
517533         break;
518534
519535      case CMD_MC_F8: // 0xf8
520         logerror("CMD_MC_F8");
536         logerror("!!! CMD_MC_F8");
521537         break;
522538      case CMD_MC_F9: // 0xf9
523539         logerror("CMD_MC_F9");
524540         break;
525541      case CMD_MC_FA: // 0xfa
526         logerror("CMD_MC_FA");
542         logerror("!!! CMD_MC_FA");
527543         break;
528544
529545      default:
r15073r15074
533549      switch (m_command_buffer[0])
534550      {
535551      case CMD_MC_F9: // 0xf9
536//          logerror(" (%02x, length=00)", m_command_buffer[0]);
552           logerror(" (%02x, length=00)", m_command_buffer[0]);
537553         break;
538554
539555      default:
r15073r15074
557573      logerror("%s: Response ", cpu_context());
558574      switch (m_response.command)
559575      {
576      case CMD_RESET_RESPONSE: // 0x30
577         logerror("CMD_RESET_RESPONSE");
578         break;
560579      case CMD_CONFIGURE_ADAPTER_RESPONSE: // 0x31
561580         logerror("CMD_CONFIGURE_ADAPTER_RESPONSE");
562581         break;
r15073r15074
594613         logerror("CMD_TRANSMIT_PACKET_18_COMPLETE");
595614         break;
596615      case CMD_MC_E1_RESPONSE: // 0xe1
597         logerror("CMD_MC_E1_RESPONSE");
616         logerror("!!! CMD_MC_E1_RESPONSE");
598617         break;
599618      case CMD_MC_E2_RESPONSE: // 0xe2
600         logerror("CMD_MC_E2_RESPONSE");
619         logerror("!!! CMD_MC_E2_RESPONSE");
601620         break;
602621      default:
603622         logerror("!!! Unexpected Response !!!");
r15073r15074
658677void threecom3c505_device::set_command_pending(int onoff)
659678{
660679   m_command_pending = onoff;
661   LOG1(("set_command_pending %d m_rx_pending=%d m_rx_data_buffer.get_length()=%x%s", m_command_pending, m_rx_pending, m_rx_data_buffer.get_length(), onoff ? "" :"\n"));
680   LOG2(("set_command_pending %d m_rx_pending=%d m_rx_data_buffer.get_length()=%x%s",
681         m_command_pending, m_rx_pending, m_rx_data_buffer.get_length(), onoff ? "" :"\n"));
662682
683//-   verbose = onoff ? 1 : 2;
684
663685   if (!m_command_pending)
664686   {
665687      // clear previous command byte
666688      m_command_buffer[0] = 0;
667689
690      m_mc_f9_pending = 0;
691      m_wait_for_ack = 0;
692
668693      if (m_rx_pending > 0 && m_rx_data_buffer.get_length() > 0)
669694      {
670695         m_rx_pending--;
671696         m_command_pending = 1;
672697
673         LOG1(("set_command_pending %d m_rx_pending=%d", m_command_pending, m_rx_pending));
698         LOG2(("set_command_pending %d m_rx_pending=%d", m_command_pending, m_rx_pending));
674699
675700         do_receive_command();
676701      }
r15073r15074
690715
691716   switch (m_command_buffer[0])
692717   {
718   case CMD_RESET: // 0x00
719//      FIXME:
720//      device_reset();
721      break;
722
693723   case CMD_CONFIGURE_ADAPTER_MEMORY: // 0x01
694724      m_i82586_config = m_program_buffer.get_word(1);
695725      break;
696726
697//  case CMD_MC_F8:
698727   case CMD_RECEIVE_PACKET: // 0x08
699728      if (m_rx_data_buffer.get_length() == 0 && !m_rx_fifo.get(&m_rx_data_buffer))
700729      {
730         // receive data not yet available
701731         m_rx_pending++;
702732         set_command_pending(0);
703733      }
r15073r15074
708738      return;
709739      // break;
710740
711//      case CMD_MC_F8:
712      case CMD_MC_F9:
713//      case CMD_MC_FA:
714      // FIXME:
741   case CMD_MC_F9:
715742      m_response.command = CMD_TRANSMIT_PACKET_COMPLETE;
716//     break;
743      // fall through
717744
718745   case CMD_TRANSMIT_PACKET: // 0x09
719746   case CMD_TRANSMIT_PACKET_18: // 0x18
r15073r15074
732759
733760   case CMD_NETWORK_STATISTICS: // 0x0a
734761      m_response.length = sizeof(struct Netstat);
735      // FIXME: replace test data; must be LSB first!
736      m_response.data.netstat.tot_recv = 1;
737      m_response.data.netstat.tot_xmit = 2;
738      m_response.data.netstat.err_CRC = 3;
739      m_response.data.netstat.err_align = 4;
740      m_response.data.netstat.err_res = 5;
741      m_response.data.netstat.err_ovrrun = 6;
762      // response data must be LSB first!
763      m_response.data.netstat.tot_recv = lsb_first(m_netstat.tot_recv);
764      m_response.data.netstat.tot_xmit = lsb_first(m_netstat.tot_xmit);
765      m_response.data.netstat.err_CRC = lsb_first(m_netstat.err_CRC);
766      m_response.data.netstat.err_align = lsb_first(m_netstat.err_align);
767      m_response.data.netstat.err_res = lsb_first(m_netstat.err_res);
768      m_response.data.netstat.err_ovrrun = lsb_first(m_netstat.err_ovrrun);
742769      break;
743770
744771   case CMD_ADAPTER_INFO: // 0x11
r15073r15074
800827      case CMD_EXECUTE_PROGRAM: // 0x0e
801828      case CMD_ADAPTER_INFO: // 0x11
802829         // interrupt later
803         m_timer->adjust( attotime::from_msec(10));
830         m_timer->adjust( attotime::from_msec(5));
804831         break;
805832
806833      default:
r15073r15074
837864
838865void threecom3c505_device::recv_cb(UINT8 *data, int length)
839866{
867
840868   if (length < ETHERNET_ADDR_SIZE || !ethernet_packet_is_for_me(data))
841869   {
842870      // skip packet
843871   }
844//  else if (m_command_pending && m_command_buffer[0] == CMD_MC_F9)
845//  {
846//      LOG(("recv_cb: data_length=%x !!!! skipped data while CMD_MC_F9 is pending!", length));
847//  }
848872   else if (!m_rx_fifo.put(data, length))
849873   {
874      m_netstat.tot_recv++;
875      m_netstat.err_ovrrun++;
850876      // fifo overrun
851877      LOG1(("recv_cb: data_length=%x !!! RX FIFO OVERRUN !!!", length));
878
852879   }
853880   else
854881   {
855      LOG1(("recv_cb: data_length=%x m_rx_pending=%d", length, m_rx_pending));
882      m_netstat.tot_recv++;
883      LOG2(("recv_cb: data_length=%x m_rx_pending=%d", length, m_rx_pending));
856884
857885      if (m_rx_data_buffer.get_length() == 0)
858886      {
859887         m_rx_fifo.get(&m_rx_data_buffer);
860888      }
861889
862//      if (m_command_pending && m_command_buffer[0] == CMD_MC_F9)
863//      {
864//          verbose = 2;
865//      }
866
867890      if (!m_command_pending && m_rx_pending > 0
868891            && m_rx_data_buffer.get_length() > 0)
869892      {
r15073r15074
871894         set_command_pending(1);
872895         do_receive_command();
873896      }
874
875//      guessing!
876//      else if (m_control & CMDE)
877//      {
878//          m_status |= ACRF; /* adapter command register full */
879//
880//          LOG(("recv_cb - set_interrupt(%d)",ASSERT_LINE));
881//          set_interrupt(ASSERT_LINE);
882//      }
883897   }
884898}
885899
r15073r15074
913927            // spurious data; set command register empty
914928            m_command_index = 0;
915929            m_status |= HCRE;
916//              verbose = 2;
917930            break;
918931
919932         case CMD_MC_F9:
r15073r15074
9971010
9981011      LOG2(("FIXME: reading 3C505 Command Register at offset %02x with index %02x = %02x",
9991012            PORT_COMMAND, m_response_index, data));
1013
1014      if (m_mc_f9_pending == 1)
1015      {
1016         m_mc_f9_pending++;
1017      }
10001018   }
10011019   else
10021020   {
r15073r15074
10361054
10371055         case CMD_TRANSMIT_PACKET_COMPLETE:
10381056         case CMD_TRANSMIT_PACKET_18_COMPLETE:
1057            m_netstat.tot_xmit++;
1058
10391059            if(!send(m_tx_data_buffer.get_data(), m_tx_data_buffer.get_length()))
10401060            {
10411061               // FIXME: failed to send the ethernet packet
r15073r15074
10501070            }
10511071
10521072            m_tx_data_buffer.reset();
1053            set_command_pending(0);
1073            if (m_command_buffer[0] != CMD_MC_F9)
1074            {
1075//               set_command_pending(0);
1076               m_wait_for_ack = 1;
1077            }
10541078            break;
10551079
10561080         case CMD_DOWNLOAD_PROGRAM_RESPONSE:
10571081            m_program_buffer.reset();
1058            set_command_pending(0);
1082//            set_command_pending(0);
1083            m_wait_for_ack = 1;
10591084            break;
10601085
10611086         default:
1062            set_command_pending(0);
1087//            set_command_pending(0);
1088            m_wait_for_ack = 1;
10631089            break;
10641090         }
10651091      }
r15073r15074
11981224         m_status &= ~HRDY; /* data register no longer ready */
11991225         m_rx_data_buffer.log("Rx Data");
12001226         m_rx_data_buffer.reset();
1201         set_command_pending(0);
1227//         set_command_pending(0);
1228         m_wait_for_ack = 1;
12021229      }
12031230   }
12041231
r15073r15074
12391266   switch (data & HSF_PCB_MASK)
12401267   {
12411268   case HSF_PCB_ACK: // HSF1
1269      if (m_wait_for_ack)
1270      {
1271         set_command_pending(0);
1272      }
12421273      break;
12431274   case HSF_PCB_NAK: // HSF2
12441275      if (m_microcode_running)
r15073r15074
12571288      m_command_index = 0;
12581289      m_status |= HCRE; /* command register empty */
12591290
1291      if (m_command_buffer[0] == CMD_MC_F9)
1292      {
1293         m_mc_f9_pending = 1;
1294//-         verbose = 2;
1295      }
1296
12601297      if (data == 0x00)
12611298      {
12621299         // hardware reset
r15073r15074
12941331      m_status |= ASF_PCB_END;
12951332   }
12961333
1334   if (m_mc_f9_pending == 2)
1335   {
1336      m_mc_f9_pending = 0;
1337      set_command_pending(0);
1338   }
1339
12971340   m_control = data;
12981341}
12991342
src/mess/machine/3c505.h
r15073r15074
256256   UINT8 m_command_buffer[CMD_BUFFER_SIZE];
257257   int m_command_index;
258258   int m_command_pending;
259   int m_mc_f9_pending;
260   int m_wait_for_ack;
259261
260262   data_buffer_fifo m_rx_fifo;
261263
r15073r15074
278280
279281   UINT16 m_i82586_config;
280282
283   struct Netstat m_netstat;
284
281285   UINT8 m_station_address[ETHERNET_ADDR_SIZE];
282286   UINT8 m_multicast_list[ETHERNET_ADDR_SIZE*2];
283287   UINT8 m_filter_list[ETHERNET_ADDR_SIZE*4];

Previous 15994 Revisions Next


© 1998-2018 The MESS Team