Previous 199869 Revisions Next

r21021 Wednesday 13th February, 2013 at 06:59:14 UTC by Barry Rodewald
fmtowns: Preliminary implementation of the CD-ROM controller's software mode.  Enough to get the CD-ROM working under Win95. [Barry Rodewald]
[src/mess/drivers]fmtowns.c
[src/mess/includes]fmtowns.h

trunk/src/mess/includes/fmtowns.h
r21020r21021
3737   UINT32 lba_last;
3838   UINT32 cdda_current;
3939   UINT32 cdda_length;
40   bool software_tx;
4041   emu_timer* read_timer;
4142};
4243
r21020r21021
238239   UINT8 speaker_get_spk();
239240   void speaker_set_spkrdata(UINT8 data);
240241   void speaker_set_input(UINT8 data);
242   UINT8 towns_cdrom_read_byte_software();
241243
242   private:
244private:
243245   static const device_timer_id TIMER_RTC = 0;
244246   static const device_timer_id TIMER_FREERUN = 1;
245247   static const device_timer_id TIMER_INTERVAL2 = 2;
trunk/src/mess/drivers/fmtowns.c
r21020r21021
14491449   }
14501450}
14511451
1452UINT8 towns_state::towns_cdrom_read_byte_software()
1453{
1454   UINT8 ret;
1455   if(m_towns_cd.buffer_ptr < 0) // transfer has ended
1456      return 0x00;
1457
1458   ret = m_towns_cd.buffer[m_towns_cd.buffer_ptr++];
1459
1460   if(m_towns_cd.buffer_ptr >= 2048)
1461   {  // end of transfer
1462      m_towns_cd.status &= ~0x10;  // no longer transferring by DMA
1463      m_towns_cd.status &= ~0x20;  // no longer transferring by software
1464      logerror("CD: end of software transfer (LBA=%08x)\n",m_towns_cd.lba_current);
1465      if(m_towns_cd.lba_current >= m_towns_cd.lba_last)
1466      {
1467         m_towns_cd.extra_status = 0;
1468         towns_cd_set_status(machine(),0x06,0x00,0x00,0x00);
1469         towns_cdrom_set_irq(machine(),TOWNS_CD_IRQ_DMA,1);
1470         m_towns_cd.buffer_ptr = -1;
1471         m_towns_cd.status |= 0x01;  // ready
1472      }
1473      else
1474      {
1475         cdrom_read_data(m_cdrom->get_cdrom_file(),++m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
1476         m_towns_cd.extra_status = 0;
1477         towns_cd_set_status(machine(),0x21,0x00,0x00,0x00);
1478         towns_cdrom_set_irq(machine(),TOWNS_CD_IRQ_DMA,1);
1479         m_towns_cd.status &= ~0x10;
1480         m_towns_cd.status |= 0x20;
1481         m_towns_cd.buffer_ptr = -1;
1482      }
1483   }
1484   return ret;
1485}
1486
14521487static void towns_cdrom_read(cdrom_image_device* device)
14531488{
14541489   // MODE 1 read
r21020r21021
14921527   else
14931528   {
14941529      cdrom_read_data(device->get_cdrom_file(),state->m_towns_cd.lba_current,state->m_towns_cd.buffer,CD_TRACK_MODE1);
1495      state->m_towns_cd.status |= 0x10;  // DMA transfer begin
1496      state->m_towns_cd.status &= ~0x20;  // not a software transfer
1530      if(state->m_towns_cd.software_tx)
1531      {
1532         state->m_towns_cd.status &= ~0x10;  // not a DMA transfer
1533         state->m_towns_cd.status |= 0x20;  // software transfer
1534      }
1535      else
1536      {
1537         state->m_towns_cd.status |= 0x10;  // DMA transfer begin
1538         state->m_towns_cd.status &= ~0x20;  // not a software transfer
1539      }
14971540//      state->m_towns_cd.buffer_ptr = 0;
14981541//      state->m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
14991542      if(state->m_towns_cd.command & 0x20)
r21020r21021
15041547      else
15051548      {
15061549         state->m_towns_cd.extra_status = 0;
1507         towns_cd_set_status(device->machine(),0x22,0x00,0x00,0x00);
1550         if(state->m_towns_cd.software_tx)
1551            towns_cd_set_status(device->machine(),0x21,0x00,0x00,0x00);
1552         else
1553            towns_cd_set_status(device->machine(),0x22,0x00,0x00,0x00);
15081554      }
15091555   }
15101556}
r21020r21021
18021848                }*/
18031849         }
18041850         return ret;
1851      case 0x02:  // data transfer (used in software transfers)
1852         if(m_towns_cd.software_tx)
1853         {
1854            return towns_cdrom_read_byte_software();
1855         }
18051856      default:
18061857         return 0x00;
18071858   }
r21020r21021
18391890         logerror("CD: parameter %02x added\n",data);
18401891         break;
18411892      case 0x03:
1842         // TODO: software transfer mode (bit 3)
1893         if(data & 0x08)  // software transfer
1894         {
1895            m_towns_cd.status &= ~0x10;  // no DMA transfer
1896            m_towns_cd.status |= 0x20;
1897            m_towns_cd.software_tx = true;
1898            m_towns_cd.buffer_ptr = 0;
1899         }
18431900         if(data & 0x10)
18441901         {
18451902            m_towns_cd.status |= 0x10;  // DMA transfer begin
18461903            m_towns_cd.status &= ~0x20;  // not a software transfer
1904            m_towns_cd.software_tx = false;
18471905            if(m_towns_cd.buffer_ptr < 0)
18481906            {
18491907               m_towns_cd.buffer_ptr = 0;
r21020r21021
27982856
27992857static MACHINE_CONFIG_DERIVED( townssj, towns )
28002858
2801   MCFG_CPU_REPLACE("maincpu",I486, 66000000)
2859   MCFG_CPU_REPLACE("maincpu",PENTIUM, 66000000)
28022860   MCFG_CPU_PROGRAM_MAP(towns_mem)
28032861   MCFG_CPU_IO_MAP(towns_io)
28042862   MCFG_CPU_VBLANK_INT_DRIVER("screen", towns_state,  towns_vsync_irq)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team