diff options
author | 2013-10-09 09:42:17 +0000 | |
---|---|---|
committer | 2013-10-09 09:42:17 +0000 | |
commit | 7ed7b9ba418fdbe9817d380c4bded10d4eb8ad85 (patch) | |
tree | b0577619f76a6978059edd8490d808fcf275f76f /src | |
parent | 962a003665cb8ba1823883f952dba74c97238703 (diff) |
Uses the sff8020 read toc legacy format field if the mmc format field is zero (MSCDEX uses the sff8020 format field instead of the mmc format field). Added support for session format for read toc, we only support 1 session so the data is mostly hard coded. Fixed read sub command when subq bit was not set [smf]
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/machine/t10mmc.c | 129 | ||||
-rw-r--r-- | src/emu/machine/t10mmc.h | 7 |
2 files changed, 107 insertions, 29 deletions
diff --git a/src/emu/machine/t10mmc.c b/src/emu/machine/t10mmc.c index 34fdcecde69..628a21bcc21 100644 --- a/src/emu/machine/t10mmc.c +++ b/src/emu/machine/t10mmc.c @@ -51,6 +51,18 @@ void t10mmc::abort_audio() } } +t10mmc::toc_format_t t10mmc::toc_format() +{ + int mmc_format = command[2] & 0xf; + if (mmc_format != 0) + { + return (toc_format_t) mmc_format; + } + + /// SFF8020 legacy format field (see T10/1836-D Revision 2g page 643) + return (toc_format_t) ((command[9] >> 6) & 3); +} + int t10mmc::toc_tracks() { int start_track = command[6]; @@ -161,7 +173,24 @@ void t10mmc::ExecCommand() case 0x43: // READ TOC { - int length = 4 + ( 8 * toc_tracks() ); + int length; + + switch (toc_format()) + { + case TOC_FORMAT_TRACKS: + length = 4 + (8 * toc_tracks()); + break; + + case TOC_FORMAT_SESSIONS: + length = 4 + (8 * 1); + break; + + default: + logerror("T10MMC: Unhandled READ TOC format %d\n", toc_format()); + length = 0; + break; + } + int allocation_length = SCSILengthFromUINT16( &command[ 7 ] ); if( length > allocation_length ) @@ -423,6 +452,8 @@ void t10mmc::ReadData( UINT8 *data, int dataLength ) bool msf = (command[1] & 0x2) != 0; + data[0]= 0x00; + int audio_active = m_cdda->audio_active(); if (audio_active) { @@ -451,36 +482,44 @@ void t10mmc::ReadData( UINT8 *data, int dataLength ) } } - data[2] = 0; - data[3] = 12; // data length - data[4] = 0x01; // sub-channel format code - data[5] = 0x10 | (audio_active ? 0 : 4); - data[6] = cdrom_get_track(cdrom, last_lba) + 1; // track - data[7] = 0; // index + if (command[1] & 0x40) + { + data[2] = 0; + data[3] = 12; // data length + data[4] = 0x01; // sub-channel format code + data[5] = 0x10 | (audio_active ? 0 : 4); + data[6] = cdrom_get_track(cdrom, last_lba) + 1; // track + data[7] = 0; // index - UINT32 frame = last_lba; + UINT32 frame = last_lba; - if (msf) - { - frame = to_msf(frame); - } + if (msf) + { + frame = to_msf(frame); + } - data[8] = (frame>>24)&0xff; - data[9] = (frame>>16)&0xff; - data[10] = (frame>>8)&0xff; - data[11] = frame&0xff; + data[8] = (frame>>24)&0xff; + data[9] = (frame>>16)&0xff; + data[10] = (frame>>8)&0xff; + data[11] = frame&0xff; - frame -= cdrom_get_track_start(cdrom, data[6] - 1); + frame -= cdrom_get_track_start(cdrom, data[6] - 1); - if (msf) + if (msf) + { + frame = to_msf(frame); + } + + data[12] = (frame>>24)&0xff; + data[13] = (frame>>16)&0xff; + data[14] = (frame>>8)&0xff; + data[15] = frame&0xff; + } + else { - frame = to_msf(frame); + data[2] = 0; + data[3] = 0; } - - data[12] = (frame>>24)&0xff; - data[13] = (frame>>16)&0xff; - data[14] = (frame>>8)&0xff; - data[15] = frame&0xff; break; } default: @@ -495,14 +534,16 @@ void t10mmc::ReadData( UINT8 *data, int dataLength ) our internal routines for tracks use "0" as track 1. That probably should be fixed... */ - logerror("T10MMC: READ TOC, format = %d time=%d\n", command[2]&0xf,(command[1]>>1)&1); - switch (command[2] & 0x0f) { - case 0: // normal + bool msf = (command[1] & 0x2) != 0; + + logerror("T10MMC: READ TOC, format = %d time=%d\n", toc_format(),msf); + switch (toc_format()) + { + case TOC_FORMAT_TRACKS: { int tracks = toc_tracks(); int len = 2 + (tracks * 8); - bool msf = (command[1] & 0x2) != 0; // the returned TOC DATA LENGTH must be the full amount, // regardless of how much we're able to pass back due to in_len @@ -553,9 +594,39 @@ void t10mmc::ReadData( UINT8 *data, int dataLength ) } break; + case TOC_FORMAT_SESSIONS: + { + int len = 2 + (8 * 1); + + int dptr = 0; + data[dptr++] = (len>>8) & 0xff; + data[dptr++] = (len & 0xff); + data[dptr++] = 1; + data[dptr++] = 1; + + data[dptr++] = 0; + data[dptr++] = cdrom_get_adr_control(cdrom, 0); + data[dptr++] = 1; + data[dptr++] = 0; + + UINT32 tstart = cdrom_get_track_start(cdrom, 0); + + if (msf) + { + tstart = to_msf(tstart+150); + } + + data[dptr++] = (tstart>>24) & 0xff; + data[dptr++] = (tstart>>16) & 0xff; + data[dptr++] = (tstart>>8) & 0xff; + data[dptr++] = (tstart & 0xff); + } + break; + default: - logerror("T10MMC: Unhandled READ TOC format %d\n", command[2]&0xf); + logerror("T10MMC: Unhandled READ TOC format %d\n", toc_format()); break; + } } break; diff --git a/src/emu/machine/t10mmc.h b/src/emu/machine/t10mmc.h index 38ab34ee3f8..66af9d6a51c 100644 --- a/src/emu/machine/t10mmc.h +++ b/src/emu/machine/t10mmc.h @@ -24,7 +24,14 @@ protected: virtual void t10_start(device_t &device); virtual void t10_reset(); + enum toc_format_t + { + TOC_FORMAT_TRACKS = 0, + TOC_FORMAT_SESSIONS = 1 + }; + void abort_audio(); + toc_format_t toc_format(); int toc_tracks(); cdrom_image_device *m_image; |