summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fmtowns.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fmtowns.cpp')
-rw-r--r--src/mame/drivers/fmtowns.cpp57
1 files changed, 40 insertions, 17 deletions
diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp
index 1063f1eeff3..83199f23062 100644
--- a/src/mame/drivers/fmtowns.cpp
+++ b/src/mame/drivers/fmtowns.cpp
@@ -193,7 +193,7 @@ Notes:
#define TOWNS_CD_IRQ_DMA 2
#define LOG_SYS 0
-#define LOG_CD 0
+#define LOG_CD 1
enum
{
@@ -868,6 +868,9 @@ READ8_MEMBER(towns_state::towns_sound_ctrl_r)
switch(offset)
{
+ case 0x00:
+ ret = 1;
+ break;
case 0x01:
if(m_towns_fm_irq_flag)
ret |= 0x01;
@@ -1646,8 +1649,16 @@ void towns_state::towns_cdrom_execute_command(cdrom_image_device* device)
break;
case 0x05: // Read TOC
if(LOG_CD) logerror("CD: Command 0x05: READ TOC\n");
- m_towns_cd.extra_status = 1;
- towns_cd_set_status(0x00,0x00,0x00,0x00);
+ if(m_towns_cd.command & 0x20)
+ {
+ m_towns_cd.extra_status = 1;
+ towns_cd_set_status(0x00,0x00,0x00,0x00);
+ }
+ else
+ {
+ m_towns_cd.extra_status = 2;
+ towns_cd_set_status(0x16,0x00,0xa0,0x00);
+ }
break;
case 0x06: // Read CD-DA state?
if(LOG_CD) logerror("CD: Command 0x06: READ CD-DA STATE\n");
@@ -1656,7 +1667,7 @@ void towns_state::towns_cdrom_execute_command(cdrom_image_device* device)
break;
case 0x1f: // unknown
if(LOG_CD) logerror("CD: Command 0x1f: unknown\n");
- m_towns_cd.extra_status = 1;
+ m_towns_cd.extra_status = 0;
towns_cd_set_status(0x00,0x00,0x00,0x00);
break;
case 0x80: // set state
@@ -1736,7 +1747,6 @@ READ8_MEMBER(towns_state::towns_cdrom_r)
case 0x01: // command status
if(m_towns_cd.cmd_status_ptr >= 3)
{
- m_towns_cd.status &= ~0x02;
// check for more status bytes
if(m_towns_cd.extra_status != 0)
{
@@ -1753,55 +1763,59 @@ READ8_MEMBER(towns_state::towns_cdrom_r)
break;
case 0x04: // play cdda
towns_cd_set_status(0x07,0x00,0x00,0x00);
+ m_towns_cd.status &= ~2;
m_towns_cd.extra_status = 0;
break;
case 0x05: // read toc
switch(m_towns_cd.extra_status)
{
case 1:
- case 3:
- towns_cd_set_status(0x16,0x00,0x00,0x00);
+ towns_cd_set_status(0x16,0x00,0xa0,0x00);
m_towns_cd.extra_status++;
break;
case 2: // st1 = first track number (BCD)
towns_cd_set_status(0x17,0x01,0x00,0x00);
m_towns_cd.extra_status++;
break;
+ case 3:
+ towns_cd_set_status(0x16,0x00,0xa1,0x00);
+ m_towns_cd.extra_status++;
+ break;
case 4: // st1 = last track number (BCD)
towns_cd_set_status(0x17,
byte_to_bcd(cdrom_get_last_track(m_cdrom->get_cdrom_file())),
0x00,0x00);
m_towns_cd.extra_status++;
break;
- case 5: // st1 = control/adr of track 0xaa?
- towns_cd_set_status(0x16,
- cdrom_get_adr_control(m_cdrom->get_cdrom_file(),0xaa),
- 0xaa,0x00);
+ case 5:
+ towns_cd_set_status(0x16, 0x00, 0xa2, 0x00);
m_towns_cd.extra_status++;
break;
case 6: // st1/2/3 = address of track 0xaa? (BCD)
addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),0xaa);
- addr = lba_to_msf(addr);
+ addr = lba_to_msf(addr + 150);
towns_cd_set_status(0x17,
(addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
m_towns_cd.extra_status++;
break;
- default: // same as case 5 and 6, but for each individual track
+ default:
if(m_towns_cd.extra_status & 0x01)
{
towns_cd_set_status(0x16,
((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0x0f) << 4)
| ((cdrom_get_adr_control(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-3) & 0xf0) >> 4),
- (m_towns_cd.extra_status/2)-3,0x00);
+ byte_to_bcd((m_towns_cd.extra_status/2)-2),0x00);
m_towns_cd.extra_status++;
}
else
{
- addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),(m_towns_cd.extra_status/2)-4);
- addr = lba_to_msf(addr);
+ int track = (m_towns_cd.extra_status/2)-4;
+ addr = cdrom_get_track_start(m_cdrom->get_cdrom_file(),track);
+ addr += cdrom_get_toc(m_cdrom->get_cdrom_file())->tracks[track].pregap;
+ addr = lba_to_msf(addr + 150);
towns_cd_set_status(0x17,
(addr & 0xff0000) >> 16,(addr & 0x00ff00) >> 8,addr & 0x0000ff);
- if(((m_towns_cd.extra_status/2)-3) >= cdrom_get_last_track(m_cdrom->get_cdrom_file()))
+ if(track >= cdrom_get_last_track(m_cdrom->get_cdrom_file()))
{
m_towns_cd.extra_status = 0;
}
@@ -1852,6 +1866,8 @@ READ8_MEMBER(towns_state::towns_cdrom_r)
break;
}
}
+ else
+ m_towns_cd.status &= ~0x02;
}
if(LOG_CD) logerror("CD: reading command status port (%i), returning %02x\n",m_towns_cd.cmd_status_ptr,ret);
m_towns_cd.cmd_status_ptr++;
@@ -2070,6 +2086,11 @@ WRITE8_MEMBER(towns_state::towns_volume_w)
}
}
+READ8_MEMBER(towns_state::unksnd_r)
+{
+ return 0;
+}
+
// some unknown ports...
READ8_MEMBER(towns_state::towns_41ff_r)
{
@@ -2325,6 +2346,7 @@ static ADDRESS_MAP_START( towns_io , AS_IO, 32, towns_state)
// Sound (YM3438 [FM], RF5c68 [PCM])
AM_RANGE(0x04d8,0x04df) AM_DEVREADWRITE8("fm", ym3438_device, read, write, 0x00ff00ff)
AM_RANGE(0x04e0,0x04e3) AM_READWRITE8(towns_volume_r,towns_volume_w,0xffffffff) // R/W -- volume ports
+ AM_RANGE(0x04e4,0x04e7) AM_READ8(unksnd_r, 0xffffffff)
AM_RANGE(0x04e8,0x04ef) AM_READWRITE8(towns_sound_ctrl_r,towns_sound_ctrl_w,0xffffffff)
AM_RANGE(0x04f0,0x04fb) AM_DEVWRITE8("pcm", rf5c68_device, rf5c68_w, 0xffffffff)
// CRTC / Video
@@ -2382,6 +2404,7 @@ static ADDRESS_MAP_START( towns16_io , AS_IO, 16, towns_state) // for the 386SX
// Sound (YM3438 [FM], RF5c68 [PCM])
AM_RANGE(0x04d8,0x04df) AM_DEVREADWRITE8("fm", ym3438_device, read, write, 0x00ff)
AM_RANGE(0x04e0,0x04e3) AM_READWRITE8(towns_volume_r,towns_volume_w,0xffff) // R/W -- volume ports
+ AM_RANGE(0x04e4,0x04e7) AM_READ8(unksnd_r, 0xffff)
AM_RANGE(0x04e8,0x04ef) AM_READWRITE8(towns_sound_ctrl_r,towns_sound_ctrl_w,0xffff)
AM_RANGE(0x04f0,0x04fb) AM_DEVWRITE8("pcm", rf5c68_device, rf5c68_w, 0xffff)
// CRTC / Video