Previous 199869 Revisions Next

r23771 Tuesday 18th June, 2013 at 12:12:45 UTC by smf
Added device number in logs, fixed issues with status flags that was causing freebsd to fail to boot with two drives (nw)
[src/emu/machine]idehd.c idehd.h

trunk/src/emu/machine/idehd.c
r23770r23771
436436   }
437437}
438438
439void ide_mass_storage_device::signal_delayed_interrupt(attotime time, int buffer_ready)
440{
441   /* clear buffer ready and set the busy flag */
442   m_status &= ~IDE_STATUS_DRQ;
443   m_status |= IDE_STATUS_BSY;
444
445   /* set a timer */
446   if (buffer_ready)
447      timer_set(time, TID_DELAYED_INTERRUPT_BUFFER_READY);
448   else
449      timer_set(time, TID_DELAYED_INTERRUPT);
450}
451
452439/*************************************
453440 *
454441 *  Advance to the next sector
r23770r23771
532519   m_status &= ~IDE_STATUS_DRQ;
533520   set_dmarq(CLEAR_LINE);
534521
535   if (m_master_password_enable || m_user_password_enable)
522   fill_buffer();
523}
524
525void ide_mass_storage_device::fill_buffer()
526{
527   switch (m_command)
536528   {
537      security_error();
538      return;
539   }
529   case IDE_COMMAND_IDENTIFY_DEVICE:
530      break;
540531
541   /* if there is more data to read, keep going */
542   if (m_sector_count > 0)
543      m_sector_count--;
532   default:
533      if (m_master_password_enable || m_user_password_enable)
534      {
535         security_error();
536      }
537      else
538      {
539         /* if there is more data to read, keep going */
540         if (m_sector_count > 0)
541            m_sector_count--;
544542
545   if (m_sector_count > 0)
546      read_next_sector();
543         if (m_sector_count > 0)
544            read_next_sector();
545      }
546      break;
547   }
547548}
548549
549550
r23770r23771
879880   case IDE_COMMAND_IDENTIFY_DEVICE:
880881      LOGPRINT(("IDE Identify device\n"));
881882
883      m_status |= IDE_STATUS_BSY;
882884      if (m_can_identify_device)
883885      {
884886         memcpy(m_buffer, m_identify_device, sizeof(m_buffer));
885887
886         /* signal an interrupt */
887         signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 1);
888         timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT_BUFFER_READY);
888889      }
889890      else
890891      {
891892         m_status |= IDE_STATUS_ERR;
892893         m_error = IDE_ERROR_NONE;
893         m_status &= ~IDE_STATUS_DRDY;
894         signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0);
894         timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT);
895895      }
896896      return true;
897897
r23770r23771
901901      else
902902         m_error = IDE_ERROR_DIAGNOSTIC_FAILED;
903903
904      /* signal an interrupt */
905      signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0);
904      m_status |= IDE_STATUS_BSY;
905      timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT);
906906      return true;
907907
908908   case IDE_COMMAND_RECALIBRATE:
909      /* signal an interrupt */
910      signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0);
909      m_status |= IDE_STATUS_BSY;
910      timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT);
911911      return true;
912912
913913   case IDE_COMMAND_IDLE:
r23770r23771
919919      LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", (m_device_head & IDE_DEVICE_HEAD_HS) + 1, m_sector_count));
920920      set_geometry(m_sector_count,(m_device_head & IDE_DEVICE_HEAD_HS) + 1);
921921
922      /* signal an interrupt */
923      signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0);
922      m_status |= IDE_STATUS_BSY;
923      timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT);
924924      return true;
925925
926926   case IDE_COMMAND_UNKNOWN_F9:
r23770r23771
934934   case IDE_COMMAND_SET_FEATURES:
935935      LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", m_feature, m_sector_count & 0xff, m_sector_number, m_cylinder_low, m_cylinder_high));
936936
937      /* signal an interrupt */
938      signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0);
937      m_status |= IDE_STATUS_BSY;
938      timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT);
939939      return true;
940940
941941   case IDE_COMMAND_SET_BLOCK_COUNT:
r23770r23771
965965   {
966966      if (!m_dmack)
967967      {
968         logerror( "%s: read_dma ignored (!DMACK)\n", machine().describe_context() );
968         logerror( "%s: dev %d read_dma ignored (!DMACK)\n", machine().describe_context(), dev() );
969969      }
970970      else if( !m_dmarq)
971971      {
972         logerror( "%s: read_dma ignored (!DMARQ)\n", machine().describe_context() );
972         logerror( "%s: dev %d read_dma ignored (!DMARQ)\n", machine().describe_context(), dev() );
973973      }
974974      else if (m_status & IDE_STATUS_BSY)
975975      {
976         logerror( "%s: read_dma ignored (BSY)\n", machine().describe_context() );
976         logerror( "%s: dev %d read_dma ignored (BSY)\n", machine().describe_context(), dev() );
977977      }
978978      else if (!(m_status & IDE_STATUS_DRQ))
979979      {
980         logerror( "%s: read_dma ignored (!DRQ)\n", machine().describe_context() );
980         logerror( "%s: dev %d read_dma ignored (!DRQ)\n", machine().describe_context(), dev() );
981981      }
982982      else
983983      {
r23770r23771
10071007   {
10081008      if (m_dmack)
10091009      {
1010         logerror( "%s: read_cs0 %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, mem_mask );
1010         logerror( "%s: dev %d read_cs0 %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, mem_mask );
10111011      }
10121012      else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_STATUS_R)
10131013      {
r23770r23771
10161016            switch (offset)
10171017            {
10181018               case IDE_CS0_DATA_RW:
1019                  logerror( "%s: read_cs0 %04x %04x ignored (BSY)\n", machine().describe_context(), offset, mem_mask );
1019                  logerror( "%s: dev %d read_cs0 %04x %04x ignored (BSY)\n", machine().describe_context(), dev(), offset, mem_mask );
10201020                  break;
10211021
10221022               default:
r23770r23771
11431143   {
11441144      if (m_dmack)
11451145      {
1146         logerror( "%s: read_cs1 %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, mem_mask );
1146         logerror( "%s: dev %d read_cs1 %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, mem_mask );
11471147      }
11481148      else
11491149      {
r23770r23771
11841184   {
11851185      if (!m_dmack)
11861186      {
1187         logerror( "%s: write_dma %04x ignored (!DMACK)\n", machine().describe_context(), data );
1187         logerror( "%s: dev %d write_dma %04x ignored (!DMACK)\n", machine().describe_context(), dev(), data );
11881188      }
11891189      else if( !m_dmarq)
11901190      {
1191         logerror( "%s: write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), data );
1191         logerror( "%s: dev %d write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), dev(), data );
11921192      }
11931193      else if (m_status & IDE_STATUS_BSY)
11941194      {
1195         logerror( "%s: write_dma %04x ignored (BSY)\n", machine().describe_context(), data );
1195         logerror( "%s: dev %d write_dma %04x ignored (BSY)\n", machine().describe_context(), dev(), data );
11961196      }
11971197      else if (!(m_status & IDE_STATUS_DRQ))
11981198      {
1199         logerror( "%s: write_dma %04x ignored (!DRQ)\n", machine().describe_context(), data );
1199         logerror( "%s: dev %d write_dma %04x ignored (!DRQ)\n", machine().describe_context(), dev(), data );
12001200      }
12011201      else
12021202      {
r23770r23771
12221222
12231223   if (m_dmack)
12241224   {
1225      logerror( "%s: write_cs0 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, data, mem_mask );
1225      logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, data, mem_mask );
12261226   }
12271227   else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_COMMAND_W)
12281228   {
1229      logerror( "%s: write_cs0 %04x %04x %04x ignored (BSY)\n", machine().describe_context(), offset, data, mem_mask );
1229      logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (BSY)\n", machine().describe_context(), dev(), offset, data, mem_mask );
12301230   }
12311231   else if ((m_status & IDE_STATUS_DRQ) && offset != IDE_CS0_DATA_RW && offset != IDE_CS0_COMMAND_W)
12321232   {
1233      logerror( "%s: write_cs0 %04x %04x %04x ignored (DRQ)\n", machine().describe_context(), offset, data, mem_mask );
1233      logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (DRQ) command %02x\n", machine().describe_context(), dev(), offset, data, mem_mask, m_command );
12341234   }
12351235   else
12361236   {
r23770r23771
12441244            {
12451245               if (!(m_status & IDE_STATUS_DRQ))
12461246               {
1247                  logerror( "%s: write_cs0 %04x %04x %04x ignored (!DRQ)\n", machine().describe_context(), offset, data, mem_mask );
1247                  logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (!DRQ)\n", machine().describe_context(), dev(), offset, data, mem_mask );
12481248               }
12491249               else
12501250               {
r23770r23771
13091309               m_buffer_offset = 0;
13101310               m_sectors_until_int = 0;
13111311
1312               m_status &= ~IDE_STATUS_BSY;
1313               m_status &= ~IDE_STATUS_DRQ;
13121314               m_status &= ~IDE_STATUS_ERR;
13131315
13141316               if (!process_command())
r23770r23771
13321334
13331335   if (m_dmack)
13341336   {
1335      logerror( "%s: write_cs1 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, data, mem_mask );
1337      logerror( "%s: dev %d write_cs1 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, data, mem_mask );
13361338   }
13371339   else
13381340   {
trunk/src/emu/machine/idehd.h
r23770r23771
101101   virtual int read_sector(UINT32 lba, void *buffer) = 0;
102102   virtual int write_sector(UINT32 lba, const void *buffer) = 0;
103103
104   bool device_selected() { return m_csel == (m_device_head & IDE_DEVICE_HEAD_DRV) >> 4; }
104   int dev() { return (m_device_head & IDE_DEVICE_HEAD_DRV) >> 4; }
105   bool device_selected() { return m_csel == dev(); }
105106   bool single_device() { return m_csel == 0 && m_dasp == 0; }
106107
107108   void set_irq(int state);
r23770r23771
110111
111112   virtual bool process_command();
112113   virtual void process_buffer();
114   virtual void fill_buffer();
113115
114116   UINT8           m_buffer[IDE_DISK_SECTOR_SIZE];
115117   UINT16          m_buffer_offset;
r23770r23771
137139   void write_sector_done();
138140   void read_next_sector();
139141   void continue_write();
140   void signal_delayed_interrupt(attotime time, int buffer_ready);
141142   void next_sector();
142143   void security_error();
143144   void continue_read();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team