trunk/src/mess/drivers/fmtowns.c
| r21020 | r21021 | |
| 1449 | 1449 | } |
| 1450 | 1450 | } |
| 1451 | 1451 | |
| 1452 | UINT8 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 | |
| 1452 | 1487 | static void towns_cdrom_read(cdrom_image_device* device) |
| 1453 | 1488 | { |
| 1454 | 1489 | // MODE 1 read |
| r21020 | r21021 | |
| 1492 | 1527 | else |
| 1493 | 1528 | { |
| 1494 | 1529 | 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 | } |
| 1497 | 1540 | // state->m_towns_cd.buffer_ptr = 0; |
| 1498 | 1541 | // state->m_towns_cd.read_timer->adjust(attotime::from_hz(300000),1); |
| 1499 | 1542 | if(state->m_towns_cd.command & 0x20) |
| r21020 | r21021 | |
| 1504 | 1547 | else |
| 1505 | 1548 | { |
| 1506 | 1549 | 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); |
| 1508 | 1554 | } |
| 1509 | 1555 | } |
| 1510 | 1556 | } |
| r21020 | r21021 | |
| 1802 | 1848 | }*/ |
| 1803 | 1849 | } |
| 1804 | 1850 | 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 | } |
| 1805 | 1856 | default: |
| 1806 | 1857 | return 0x00; |
| 1807 | 1858 | } |
| r21020 | r21021 | |
| 1839 | 1890 | logerror("CD: parameter %02x added\n",data); |
| 1840 | 1891 | break; |
| 1841 | 1892 | 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 | } |
| 1843 | 1900 | if(data & 0x10) |
| 1844 | 1901 | { |
| 1845 | 1902 | m_towns_cd.status |= 0x10; // DMA transfer begin |
| 1846 | 1903 | m_towns_cd.status &= ~0x20; // not a software transfer |
| 1904 | m_towns_cd.software_tx = false; |
| 1847 | 1905 | if(m_towns_cd.buffer_ptr < 0) |
| 1848 | 1906 | { |
| 1849 | 1907 | m_towns_cd.buffer_ptr = 0; |
| r21020 | r21021 | |
| 2798 | 2856 | |
| 2799 | 2857 | static MACHINE_CONFIG_DERIVED( townssj, towns ) |
| 2800 | 2858 | |
| 2801 | | MCFG_CPU_REPLACE("maincpu",I486, 66000000) |
| 2859 | MCFG_CPU_REPLACE("maincpu",PENTIUM, 66000000) |
| 2802 | 2860 | MCFG_CPU_PROGRAM_MAP(towns_mem) |
| 2803 | 2861 | MCFG_CPU_IO_MAP(towns_io) |
| 2804 | 2862 | MCFG_CPU_VBLANK_INT_DRIVER("screen", towns_state, towns_vsync_irq) |