Previous 199869 Revisions Next

r21430 Sunday 24th February, 2013 at 22:42:25 UTC by Barry Rodewald
fmtowns: moved some static CD-ROM functions in the driver class (no whatsnew)
[src/mess/drivers]fmtowns.c
[src/mess/includes]fmtowns.h

trunk/src/mess/includes/fmtowns.h
r21429r21430
149149   UINT8 m_timer1;
150150
151151   emu_timer* m_towns_wait_timer;
152   emu_timer* m_towns_status_timer;
153   emu_timer* m_towns_cdda_timer;
152154   struct towns_cdrom_controller m_towns_cd;
153155   struct towns_video_controller m_video;
154156
r21429r21430
248250   static const device_timer_id TIMER_KEYBOARD = 3;
249251   static const device_timer_id TIMER_MOUSE = 4;
250252   static const device_timer_id TIMER_WAIT = 5;
253   static const device_timer_id TIMER_CDSTATUS = 6;
254   static const device_timer_id TIMER_CDDA = 7;
251255   void rtc_second();
252256   void freerun_inc();
253257   void intervaltimer2_timeout();
254258   void poll_keyboard();
255259   void mouse_timeout();
256260   void wait_end();
261   void towns_cd_set_status(UINT8 st0, UINT8 st1, UINT8 st2, UINT8 st3);
262   void towns_cdrom_execute_command(cdrom_image_device* device);
263   void towns_cdrom_play_cdda(cdrom_image_device* device);
264   void towns_cdrom_read(cdrom_image_device* device);
265   void towns_cd_status_ready();
266   void towns_delay_cdda(cdrom_image_device* dev);
257267public:
258268   INTERRUPT_GEN_MEMBER(towns_vsync_irq);
259   TIMER_CALLBACK_MEMBER(towns_cd_status_ready);
260269   TIMER_CALLBACK_MEMBER(towns_cdrom_read_byte);
261   TIMER_CALLBACK_MEMBER(towns_delay_cdda);
262270   TIMER_CALLBACK_MEMBER(towns_sprite_done);
263271   TIMER_CALLBACK_MEMBER(towns_vblank_end);
264272   DECLARE_WRITE_LINE_MEMBER(towns_scsi_irq);
trunk/src/mess/drivers/fmtowns.c
r21429r21430
419419   case TIMER_WAIT:
420420      wait_end();
421421      break;
422   case TIMER_CDSTATUS:
423      towns_cd_status_ready();
424      break;
425   case TIMER_CDDA:
426      towns_delay_cdda((cdrom_image_device*)ptr);
427      break;
422428   }
423429}
424430void towns_state::freerun_inc()
r21429r21430
13641370   }
13651371}
13661372
1367TIMER_CALLBACK_MEMBER(towns_state::towns_cd_status_ready)
1373void towns_state::towns_cd_status_ready()
13681374{
13691375   m_towns_cd.status |= 0x02;  // status read request
13701376   m_towns_cd.status |= 0x01;  // ready
r21429r21430
13721378   towns_cdrom_set_irq((running_machine&)machine(),TOWNS_CD_IRQ_MPU,1);
13731379}
13741380
1375static void towns_cd_set_status(running_machine &machine, UINT8 st0, UINT8 st1, UINT8 st2, UINT8 st3)
1381void towns_state::towns_cd_set_status(UINT8 st0, UINT8 st1, UINT8 st2, UINT8 st3)
13761382{
1377   towns_state* state = machine.driver_data<towns_state>();
1378   state->m_towns_cd.cmd_status[0] = st0;
1379   state->m_towns_cd.cmd_status[1] = st1;
1380   state->m_towns_cd.cmd_status[2] = st2;
1381   state->m_towns_cd.cmd_status[3] = st3;
1383   m_towns_cd.cmd_status[0] = st0;
1384   m_towns_cd.cmd_status[1] = st1;
1385   m_towns_cd.cmd_status[2] = st2;
1386   m_towns_cd.cmd_status[3] = st3;
13821387   // wait a bit
1383   machine.scheduler().timer_set(attotime::from_msec(1), timer_expired_delegate(FUNC(towns_state::towns_cd_status_ready),state), 0, &machine);
1388   m_towns_status_timer->adjust(attotime::from_msec(1),0,attotime::never);
13841389}
13851390
13861391static UINT8 towns_cd_get_track(running_machine &machine)
r21429r21430
14311436         if(m_towns_cd.lba_current >= m_towns_cd.lba_last)
14321437         {
14331438            m_towns_cd.extra_status = 0;
1434            towns_cd_set_status(device->machine(),0x06,0x00,0x00,0x00);
1439            towns_cd_set_status(0x06,0x00,0x00,0x00);
14351440            towns_cdrom_set_irq(device->machine(),TOWNS_CD_IRQ_DMA,1);
14361441            m_towns_cd.buffer_ptr = -1;
14371442            m_towns_cd.status |= 0x01;  // ready
r21429r21430
14391444         else
14401445         {
14411446            m_towns_cd.extra_status = 0;
1442            towns_cd_set_status(device->machine(),0x22,0x00,0x00,0x00);
1447            towns_cd_set_status(0x22,0x00,0x00,0x00);
14431448            towns_cdrom_set_irq(device->machine(),TOWNS_CD_IRQ_DMA,1);
14441449            cdrom_read_data(m_cdrom->get_cdrom_file(),++m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
14451450            m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
r21429r21430
14651470      if(m_towns_cd.lba_current >= m_towns_cd.lba_last)
14661471      {
14671472         m_towns_cd.extra_status = 0;
1468         towns_cd_set_status(machine(),0x06,0x00,0x00,0x00);
1473         towns_cd_set_status(0x06,0x00,0x00,0x00);
14691474         towns_cdrom_set_irq(machine(),TOWNS_CD_IRQ_DMA,1);
14701475         m_towns_cd.buffer_ptr = -1;
14711476         m_towns_cd.status |= 0x01;  // ready
r21429r21430
14741479      {
14751480         cdrom_read_data(m_cdrom->get_cdrom_file(),++m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
14761481         m_towns_cd.extra_status = 0;
1477         towns_cd_set_status(machine(),0x21,0x00,0x00,0x00);
1482         towns_cd_set_status(0x21,0x00,0x00,0x00);
14781483         towns_cdrom_set_irq(machine(),TOWNS_CD_IRQ_DMA,1);
14791484         m_towns_cd.status &= ~0x10;
14801485         m_towns_cd.status |= 0x20;
r21429r21430
14841489   return ret;
14851490}
14861491
1487static void towns_cdrom_read(cdrom_image_device* device)
1492void towns_state::towns_cdrom_read(cdrom_image_device* device)
14881493{
14891494   // MODE 1 read
14901495   // load data into buffer to be sent via DMA1 channel 3
r21429r21430
14931498   // parameters:
14941499   //          3 bytes: MSF of first sector to read
14951500   //          3 bytes: MSF of last sector to read
1496   towns_state* state = device->machine().driver_data<towns_state>();
14971501   UINT32 lba1,lba2,track;
14981502
1499   lba1 = state->m_towns_cd.parameter[7] << 16;
1500   lba1 += state->m_towns_cd.parameter[6] << 8;
1501   lba1 += state->m_towns_cd.parameter[5];
1502   lba2 = state->m_towns_cd.parameter[4] << 16;
1503   lba2 += state->m_towns_cd.parameter[3] << 8;
1504   lba2 += state->m_towns_cd.parameter[2];
1505   state->m_towns_cd.lba_current = msf_to_lbafm(lba1);
1506   state->m_towns_cd.lba_last = msf_to_lbafm(lba2);
1503   lba1 = m_towns_cd.parameter[7] << 16;
1504   lba1 += m_towns_cd.parameter[6] << 8;
1505   lba1 += m_towns_cd.parameter[5];
1506   lba2 = m_towns_cd.parameter[4] << 16;
1507   lba2 += m_towns_cd.parameter[3] << 8;
1508   lba2 += m_towns_cd.parameter[2];
1509   m_towns_cd.lba_current = msf_to_lbafm(lba1);
1510   m_towns_cd.lba_last = msf_to_lbafm(lba2);
15071511
15081512   // first track starts at 00:02:00 - this is hardcoded in the boot procedure
1509   track = cdrom_get_track(device->get_cdrom_file(),state->m_towns_cd.lba_current);
1513   track = cdrom_get_track(device->get_cdrom_file(),m_towns_cd.lba_current);
15101514   if(track < 2)
15111515   {  // recalculate LBA
1512      state->m_towns_cd.lba_current -= 150;
1513      state->m_towns_cd.lba_last -= 150;
1516      m_towns_cd.lba_current -= 150;
1517      m_towns_cd.lba_last -= 150;
15141518   }
15151519
15161520   // parameter 7 = sector count?
1517   if(state->m_towns_cd.parameter[1] != 0)
1518      state->m_towns_cd.lba_last += state->m_towns_cd.parameter[1];
1521   if(m_towns_cd.parameter[1] != 0)
1522      m_towns_cd.lba_last += m_towns_cd.parameter[1];
15191523
1520   logerror("CD: Mode 1 read from LBA next:%i last:%i track:%i\n",state->m_towns_cd.lba_current,state->m_towns_cd.lba_last,track);
1524   logerror("CD: Mode 1 read from LBA next:%i last:%i track:%i\n",m_towns_cd.lba_current,m_towns_cd.lba_last,track);
15211525
1522   if(state->m_towns_cd.lba_current > state->m_towns_cd.lba_last)
1526   if(m_towns_cd.lba_current > m_towns_cd.lba_last)
15231527   {
1524      state->m_towns_cd.extra_status = 0;
1525      towns_cd_set_status(device->machine(),0x01,0x00,0x00,0x00);
1528      m_towns_cd.extra_status = 0;
1529      towns_cd_set_status(0x01,0x00,0x00,0x00);
15261530   }
15271531   else
15281532   {
1529      cdrom_read_data(device->get_cdrom_file(),state->m_towns_cd.lba_current,state->m_towns_cd.buffer,CD_TRACK_MODE1);
1530      if(state->m_towns_cd.software_tx)
1533      cdrom_read_data(device->get_cdrom_file(),m_towns_cd.lba_current,m_towns_cd.buffer,CD_TRACK_MODE1);
1534      if(m_towns_cd.software_tx)
15311535      {
1532         state->m_towns_cd.status &= ~0x10;  // not a DMA transfer
1533         state->m_towns_cd.status |= 0x20;  // software transfer
1536         m_towns_cd.status &= ~0x10;  // not a DMA transfer
1537         m_towns_cd.status |= 0x20;  // software transfer
15341538      }
15351539      else
15361540      {
1537         state->m_towns_cd.status |= 0x10;  // DMA transfer begin
1538         state->m_towns_cd.status &= ~0x20;  // not a software transfer
1541         m_towns_cd.status |= 0x10;  // DMA transfer begin
1542         m_towns_cd.status &= ~0x20;  // not a software transfer
15391543      }
1540//      state->m_towns_cd.buffer_ptr = 0;
1541//      state->m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1542      if(state->m_towns_cd.command & 0x20)
1544//      m_towns_cd.buffer_ptr = 0;
1545//      m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1);
1546      if(m_towns_cd.command & 0x20)
15431547      {
1544         state->m_towns_cd.extra_status = 2;
1545         towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1548         m_towns_cd.extra_status = 2;
1549         towns_cd_set_status(0x00,0x00,0x00,0x00);
15461550      }
15471551      else
15481552      {
1549         state->m_towns_cd.extra_status = 0;
1550         if(state->m_towns_cd.software_tx)
1551            towns_cd_set_status(device->machine(),0x21,0x00,0x00,0x00);
1553         m_towns_cd.extra_status = 0;
1554         if(m_towns_cd.software_tx)
1555            towns_cd_set_status(0x21,0x00,0x00,0x00);
15521556         else
1553            towns_cd_set_status(device->machine(),0x22,0x00,0x00,0x00);
1557            towns_cd_set_status(0x22,0x00,0x00,0x00);
15541558      }
15551559   }
15561560}
15571561
1558static void towns_cdrom_play_cdda(cdrom_image_device* device)
1562void towns_state::towns_cdrom_play_cdda(cdrom_image_device* device)
15591563{
15601564   // PLAY AUDIO
15611565   // Plays CD-DA audio from the specified MSF
15621566   // Parameters:
15631567   //          3 bytes: starting MSF of audio to play
15641568   //          3 bytes: ending MSF of audio to play (can span multiple tracks)
1565   towns_state* state = device->machine().driver_data<towns_state>();
15661569   UINT32 lba1,lba2;
1567   device_t* cdda = state->m_cdda;
15681570
1569   lba1 = state->m_towns_cd.parameter[7] << 16;
1570   lba1 += state->m_towns_cd.parameter[6] << 8;
1571   lba1 += state->m_towns_cd.parameter[5];
1572   lba2 = state->m_towns_cd.parameter[4] << 16;
1573   lba2 += state->m_towns_cd.parameter[3] << 8;
1574   lba2 += state->m_towns_cd.parameter[2];
1575   state->m_towns_cd.cdda_current = msf_to_lbafm(lba1);
1576   state->m_towns_cd.cdda_length = msf_to_lbafm(lba2) - state->m_towns_cd.cdda_current;
1571   lba1 = m_towns_cd.parameter[7] << 16;
1572   lba1 += m_towns_cd.parameter[6] << 8;
1573   lba1 += m_towns_cd.parameter[5];
1574   lba2 = m_towns_cd.parameter[4] << 16;
1575   lba2 += m_towns_cd.parameter[3] << 8;
1576   lba2 += m_towns_cd.parameter[2];
1577   m_towns_cd.cdda_current = msf_to_lbafm(lba1);
1578   m_towns_cd.cdda_length = msf_to_lbafm(lba2) - m_towns_cd.cdda_current;
15771579
1578   cdda_set_cdrom(cdda,device->get_cdrom_file());
1579   cdda_start_audio(cdda,state->m_towns_cd.cdda_current,state->m_towns_cd.cdda_length);
1580   logerror("CD: CD-DA start from LBA:%i length:%i\n",state->m_towns_cd.cdda_current,state->m_towns_cd.cdda_length);
1581   if(state->m_towns_cd.command & 0x20)
1580   cdda_set_cdrom(m_cdda,device->get_cdrom_file());
1581   cdda_start_audio(m_cdda,m_towns_cd.cdda_current,m_towns_cd.cdda_length);
1582   logerror("CD: CD-DA start from LBA:%i length:%i\n",m_towns_cd.cdda_current,m_towns_cd.cdda_length);
1583   if(m_towns_cd.command & 0x20)
15821584   {
1583      state->m_towns_cd.extra_status = 1;
1584      towns_cd_set_status(device->machine(),0x00,0x03,0x00,0x00);
1585      m_towns_cd.extra_status = 1;
1586      towns_cd_set_status(0x00,0x03,0x00,0x00);
15851587   }
15861588}
15871589
1588TIMER_CALLBACK_MEMBER(towns_state::towns_delay_cdda)
1590void towns_state::towns_delay_cdda(cdrom_image_device* dev)
15891591{
1590   towns_cdrom_play_cdda((cdrom_image_device*)ptr);
1592   towns_cdrom_play_cdda(dev);
15911593}
15921594
1593static void towns_cdrom_execute_command(cdrom_image_device* device)
1595void towns_state::towns_cdrom_execute_command(cdrom_image_device* device)
15941596{
1595   towns_state* state = device->machine().driver_data<towns_state>();
1596
15971597   if(device->get_cdrom_file() == NULL)
15981598   {  // No CD in drive
1599      if(state->m_towns_cd.command & 0x20)
1599      if(m_towns_cd.command & 0x20)
16001600      {
1601         state->m_towns_cd.extra_status = 0;
1602         towns_cd_set_status(device->machine(),0x10,0x00,0x00,0x00);
1601         m_towns_cd.extra_status = 0;
1602         towns_cd_set_status(0x10,0x00,0x00,0x00);
16031603      }
16041604   }
16051605   else
16061606   {
1607      state->m_towns_cd.status &= ~0x02;
1608      switch(state->m_towns_cd.command & 0x9f)
1607      m_towns_cd.status &= ~0x02;
1608      switch(m_towns_cd.command & 0x9f)
16091609      {
16101610         case 0x00:  // Seek
1611            if(state->m_towns_cd.command & 0x20)
1611            if(m_towns_cd.command & 0x20)
16121612            {
1613               state->m_towns_cd.extra_status = 1;
1614               towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1613               m_towns_cd.extra_status = 1;
1614               towns_cd_set_status(0x00,0x00,0x00,0x00);
16151615            }
16161616            logerror("CD: Command 0x00: SEEK\n");
16171617            break;
16181618         case 0x01:  // unknown
1619            if(state->m_towns_cd.command & 0x20)
1619            if(m_towns_cd.command & 0x20)
16201620            {
1621               state->m_towns_cd.extra_status = 0;
1622               towns_cd_set_status(device->machine(),0x00,0xff,0xff,0xff);
1621               m_towns_cd.extra_status = 0;
1622               towns_cd_set_status(0x00,0xff,0xff,0xff);
16231623            }
16241624            logerror("CD: Command 0x01: unknown\n");
16251625            break;
r21429r21430
16291629            break;
16301630         case 0x04:  // Play Audio Track
16311631            logerror("CD: Command 0x04: PLAY CD-DA\n");
1632            device->machine().scheduler().timer_set(attotime::from_msec(1), timer_expired_delegate(FUNC(towns_state::towns_delay_cdda),state), 0, device);
1632            m_towns_cdda_timer->set_ptr(device);
1633            m_towns_cdda_timer->adjust(attotime::from_msec(1),0,attotime::never);
16331634            break;
16341635         case 0x05:  // Read TOC
16351636            logerror("CD: Command 0x05: READ TOC\n");
1636            state->m_towns_cd.extra_status = 1;
1637            towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1637            m_towns_cd.extra_status = 1;
1638            towns_cd_set_status(0x00,0x00,0x00,0x00);
16381639            break;
16391640         case 0x06:  // Read CD-DA state?
16401641            logerror("CD: Command 0x06: READ CD-DA STATE\n");
1641            state->m_towns_cd.extra_status = 1;
1642            towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1642            m_towns_cd.extra_status = 1;
1643            towns_cd_set_status(0x00,0x00,0x00,0x00);
16431644            break;
16441645         case 0x80:  // set state
16451646            logerror("CD: Command 0x80: set state\n");
1646            if(state->m_towns_cd.command & 0x20)
1647            if(m_towns_cd.command & 0x20)
16471648            {
1648               state->m_towns_cd.extra_status = 0;
1649               if(cdda_audio_active(state->m_cdda) && !cdda_audio_paused(state->m_cdda))
1650                  towns_cd_set_status(device->machine(),0x00,0x03,0x00,0x00);
1649               m_towns_cd.extra_status = 0;
1650               if(cdda_audio_active(m_cdda) && !cdda_audio_paused(m_cdda))
1651                  towns_cd_set_status(0x00,0x03,0x00,0x00);
16511652               else
1652                  towns_cd_set_status(device->machine(),0x00,0x01,0x00,0x00);
1653                  towns_cd_set_status(0x00,0x01,0x00,0x00);
16531654
16541655            }
16551656            break;
16561657         case 0x81:  // set state (CDDASET)
1657            if(state->m_towns_cd.command & 0x20)
1658            if(m_towns_cd.command & 0x20)
16581659            {
1659               state->m_towns_cd.extra_status = 0;
1660               towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1660               m_towns_cd.extra_status = 0;
1661               towns_cd_set_status(0x00,0x00,0x00,0x00);
16611662            }
16621663            logerror("CD: Command 0x81: set state (CDDASET)\n");
16631664            break;
16641665         case 0x84:   // Stop CD audio track  -- generates no status output?
1665            if(state->m_towns_cd.command & 0x20)
1666            if(m_towns_cd.command & 0x20)
16661667            {
1667               state->m_towns_cd.extra_status = 1;
1668               towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1668               m_towns_cd.extra_status = 1;
1669               towns_cd_set_status(0x00,0x00,0x00,0x00);
16691670            }
1670            cdda_pause_audio(state->m_cdda,1);
1671            cdda_pause_audio(m_cdda,1);
16711672            logerror("CD: Command 0x84: STOP CD-DA\n");
16721673            break;
16731674         case 0x85:   // Stop CD audio track (difference from 0x84?)
1674            if(state->m_towns_cd.command & 0x20)
1675            if(m_towns_cd.command & 0x20)
16751676            {
1676               state->m_towns_cd.extra_status = 1;
1677               towns_cd_set_status(device->machine(),0x00,0x00,0x00,0x00);
1677               m_towns_cd.extra_status = 1;
1678               towns_cd_set_status(0x00,0x00,0x00,0x00);
16781679            }
1679            cdda_pause_audio(state->m_cdda,1);
1680            cdda_pause_audio(m_cdda,1);
16801681            logerror("CD: Command 0x85: STOP CD-DA\n");
16811682            break;
16821683         case 0x87:  // Resume CD-DA playback
1683            if(state->m_towns_cd.command & 0x20)
1684            if(m_towns_cd.command & 0x20)
16841685            {
1685               state->m_towns_cd.extra_status = 1;
1686               towns_cd_set_status(device->machine(),0x00,0x03,0x00,0x00);
1686               m_towns_cd.extra_status = 1;
1687               towns_cd_set_status(0x00,0x03,0x00,0x00);
16871688            }
1688            cdda_pause_audio(state->m_cdda,0);
1689            cdda_pause_audio(m_cdda,0);
16891690            logerror("CD: Command 0x87: RESUME CD-DA\n");
16901691            break;
16911692         default:
1692            state->m_towns_cd.extra_status = 0;
1693            towns_cd_set_status(device->machine(),0x10,0x00,0x00,0x00);
1694            logerror("CD: Unknown or unimplemented command %02x\n",state->m_towns_cd.command);
1693            m_towns_cd.extra_status = 0;
1694            towns_cd_set_status(0x10,0x00,0x00,0x00);
1695            logerror("CD: Unknown or unimplemented command %02x\n",m_towns_cd.command);
16951696      }
16961697   }
16971698}
r21429r21430
17261727               switch(m_towns_cd.command & 0x9f)
17271728               {
17281729                  case 0x00:  // seek
1729                     towns_cd_set_status(space.machine(),0x04,0x00,0x00,0x00);
1730                     towns_cd_set_status(0x04,0x00,0x00,0x00);
17301731                     m_towns_cd.extra_status = 0;
17311732                     break;
17321733                  case 0x02:  // read
17331734                     if(m_towns_cd.extra_status == 2)
1734                        towns_cd_set_status(space.machine(),0x22,0x00,0x00,0x00);
1735                        towns_cd_set_status(0x22,0x00,0x00,0x00);
17351736                     m_towns_cd.extra_status = 0;
17361737                     break;
17371738                  case 0x04:  // play cdda
1738                     towns_cd_set_status(space.machine(),0x07,0x00,0x00,0x00);
1739                     towns_cd_set_status(0x07,0x00,0x00,0x00);
17391740                     m_towns_cd.extra_status = 0;
17401741                     break;
17411742                  case 0x05:  // read toc
r21429r21430
17431744                     {
17441745                        case 1:
17451746                        case 3:
1746                           towns_cd_set_status(space.machine(),0x16,0x00,0x00,0x00);
1747                           towns_cd_set_status(0x16,0x00,0x00,0x00);
17471748                           m_towns_cd.extra_status++;
17481749                           break;
17491750                        case 2: // st1 = first track number (BCD)
1750                           towns_cd_set_status(space.machine(),0x17,0x01,0x00,0x00);
1751                           towns_cd_set_status(0x17,0x01,0x00,0x00);
17511752                           m_towns_cd.extra_status++;
17521753                           break;
17531754                        case 4: // st1 = last track number (BCD)
1754                           towns_cd_set_status(space.machine(),0x17,
1755                           towns_cd_set_status(0x17,
17551756                              byte_to_bcd(cdrom_get_last_track(m_cdrom->get_cdrom_file())),
17561757                              0x00,0x00);
17571758                           m_towns_cd.extra_status++;
17581759                           break;
17591760                        case 5:  // st1 = control/adr of track 0xaa?
1760                           towns_cd_set_status(space.machine(),0x16,
1761                           towns_cd_set_status(0x16,
17611762                              cdrom_get_adr_control(m_cdrom->get_cdrom_file(),0xaa),
17621763                              0xaa,0x00);
17631764                           m_towns_cd.extra_status++;
r21429r21430
17651766                        case 6:  // st1/2/3 = address of track 0xaa? (BCD)
17661767                           addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),0xaa);
17671768                           addr = lba_to_msf(addr);
1768                           towns_cd_set_status(space.machine(),0x17,
1769                           towns_cd_set_status(0x17,
17691770                              (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
17701771                           m_towns_cd.extra_status++;
17711772                           break;
17721773                        default:  // same as case 5 and 6, but for each individual track
17731774                           if(m_towns_cd.extra_status & 0x01)
17741775                           {
1775                              towns_cd_set_status(space.machine(),0x16,
1776                              towns_cd_set_status(0x16,
17761777                                 ((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0x0f) << 4)
17771778                                 | ((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0xf0) >> 4),
17781779                                 (m_towns_cd.extra_status/2)-3,0x00);
r21429r21430
17821783                           {
17831784                              addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-4);
17841785                              addr = lba_to_msf(addr);
1785                              towns_cd_set_status(space.machine(),0x17,
1786                              towns_cd_set_status(0x17,
17861787                                 (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
17871788                              if(((m_towns_cd.extra_status/2)-3) >= cdrom_get_last_track(m_cdrom->get_cdrom_file()))
17881789                              {
r21429r21430
17981799                     switch(m_towns_cd.extra_status)
17991800                     {
18001801                        case 1:  // st2 = track number
1801                           towns_cd_set_status(space.machine(),0x18,
1802                           towns_cd_set_status(0x18,
18021803                              0x00,towns_cd_get_track(space.machine()),0x00);
18031804                           m_towns_cd.extra_status++;
18041805                           break;
18051806                        case 2:  // st0/1/2 = MSF from beginning of current track
18061807                           addr = cdda_get_audio_lba(m_cdda);
18071808                           addr = lba_to_msf(addr - m_towns_cd.cdda_current);
1808                           towns_cd_set_status(space.machine(),0x19,
1809                           towns_cd_set_status(0x19,
18091810                              (addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
18101811                           m_towns_cd.extra_status++;
18111812                           break;
18121813                        case 3:  // st1/2 = current MSF
18131814                           addr = cdda_get_audio_lba(m_cdda);
18141815                           addr = lba_to_msf(addr);  // this data is incorrect, but will do until exact meaning is found
1815                           towns_cd_set_status(space.machine(),0x19,
1816                           towns_cd_set_status(0x19,
18161817                              0x00,(addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8);
18171818                           m_towns_cd.extra_status++;
18181819                           break;
18191820                        case 4:
18201821                           addr = cdda_get_audio_lba(m_cdda);
18211822                           addr = lba_to_msf(addr);  // this data is incorrect, but will do until exact meaning is found
1822                           towns_cd_set_status(space.machine(),0x20,
1823                           towns_cd_set_status(0x20,
18231824                              addr & 0x0000ff,0x00,0x00);
18241825                           m_towns_cd.extra_status = 0;
18251826                           break;
18261827                     }
18271828                     break;
18281829                  case 0x84:
1829                     towns_cd_set_status(space.machine(),0x11,0x00,0x00,0x00);
1830                     towns_cd_set_status(0x11,0x00,0x00,0x00);
18301831                     m_towns_cd.extra_status = 0;
18311832                     break;
18321833                  case 0x85:
1833                     towns_cd_set_status(space.machine(),0x12,0x00,0x00,0x00);
1834                     towns_cd_set_status(0x12,0x00,0x00,0x00);
18341835                     m_towns_cd.extra_status = 0;
18351836                     break;
18361837               }
r21429r21430
25642565   m_towns_wait_timer = timer_alloc(TIMER_WAIT);
25652566   m_towns_freerun_counter = timer_alloc(TIMER_FREERUN);
25662567   m_towns_intervaltimer2 = timer_alloc(TIMER_INTERVAL2);
2568   m_towns_status_timer = timer_alloc(TIMER_CDSTATUS);
2569   m_towns_cdda_timer = timer_alloc(TIMER_CDDA);
25672570
25682571   // CD-ROM init
25692572   m_towns_cd.read_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::towns_cdrom_read_byte),this), (void*)machine().device("dma_1"));
r21429r21430
28562859
28572860static MACHINE_CONFIG_DERIVED( townssj, towns )
28582861
2859   MCFG_CPU_REPLACE("maincpu",I486, 66000000)
2862   MCFG_CPU_REPLACE("maincpu",PENTIUM, 66000000)
28602863   MCFG_CPU_PROGRAM_MAP(towns_mem)
28612864   MCFG_CPU_IO_MAP(towns_io)
28622865   MCFG_CPU_VBLANK_INT_DRIVER("screen", towns_state,  towns_vsync_irq)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team