diff options
Diffstat (limited to 'src/mame/machine/gdrom.cpp')
-rw-r--r-- | src/mame/machine/gdrom.cpp | 547 |
1 files changed, 0 insertions, 547 deletions
diff --git a/src/mame/machine/gdrom.cpp b/src/mame/machine/gdrom.cpp deleted file mode 100644 index 1958692a442..00000000000 --- a/src/mame/machine/gdrom.cpp +++ /dev/null @@ -1,547 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf, Angelo Salese -/*************************************************************************** - - gdrom.c - Implementation of the Sega GD-ROM device - -***************************************************************************/ - -#include "emu.h" -#include "gdrom.h" - -#define GDROM_BUSY_STATE 0x00 -#define GDROM_PAUSE_STATE 0x01 -#define GDROM_STANDBY_STATE 0x02 -#define GDROM_PLAY_STATE 0x03 -#define GDROM_SEEK_STATE 0x04 -#define GDROM_SCAN_STATE 0x05 -#define GDROM_OPEN_STATE 0x06 -#define GDROM_NODISC_STATE 0x07 -#define GDROM_RETRY_STATE 0x08 -#define GDROM_ERROR_STATE 0x09 - - -/* - Officially not documented security-related packet commands: - - SYS_CHK_SECU (70h) Media security check - Parameters: 1byte - R0011111, R - "recheck" (it seems actual security check performed automatically at drive power on or when disc was inserted, so normally this and next command returns result of already performed check. - however, when MSB R bit is 1 will be forced media security recheck) - Result: none - SYS_REQ_SECU (71h) Request security data - Parameters: 1byte - always 0x1f - Result: a bit less than 1Kbyte chunk of data (length vary each time), contains real command reply obfuscated, which is extracted by such code: - - u8 reply[], real_reply[]; - for (u32 i = 0, offset = 0; i < length; i++) - { - offset++; - u32 skip = reply[offset] - 2; // normally skip value is < 0x10, might be used to identify real reply length - offset += skip; - real_reply[i] = reply[offset++]; - } - - Real reply is 43 byte: - struct sec_reply { - u8 check_result; // 0x1f - valid GD-ROM, 0x10 - valid Mil-CD (in this case following char[] fields is empty, 0x00-filled) - char key_id[10]; // presumable Disc ID (T-xxxxxx or HDR-xxxxx etc) - char key_maker_id[16]; // presumable "SEGA ENTERPRISES" - char hard_id[16]; // presumable "SEGA SEGAKATANA " - }; - - *_id fields names came from Dev.box "Checker BIOS" disassembly, contents meaning is guesswork because all the reply dumps we have now was dumped with Mil-CD disc inserted but not GD-ROM. - Presumable these data somehow encoded in GD-ROM disc HD area Lead-in (or Security Ring area ?), and compared with data in LD area IP.BIN by GD-drive firmware, - as described in Sega patent EP0935242A1 https://patents.google.com/patent/EP0935242A1 - - Dreamcast BIOS code verify only 1st result byte, if it's 5th bit (0x10) == 1. - Naomi DIMM firmware verify if result byte equal to 0x1f. - - SYS_CHG_COMD (72h) ??? Authentication for next command ? - Parameters: 1byte, probably key/password, in retail Dreamcast - 5th byte of unit SN# (located in flash ROM at 1A05Ah), 0 in Dev.box checker BIOS. - Result: none - - SYS_REQ_COMD (73h) Request command list - Parameters: none - Result: chunk of data where obfuscated real reply, see command 71. - real result: 14 bytes - codes of all regular (not security) packet commands supported by drive (00 10 11 12 13 14 15 16 20 21 22 30 31 40). - - Dreamcast BIOS SysCalls contain commands 0x72/73 routine, but it seems not used at practice. -*/ - -static const uint8_t GDROM_Cmd71_Reply[] = -{ - 0x96, 0x0B, 0x45, 0xF0, 0x7E, 0xFF, 0x3D, 0x06, 0x4D, 0x7D, 0x10, 0xBF, 0x07, 0x00, 0x73, 0xCF, - 0x9C, 0x00, 0xBC, 0x0C, 0x1C, 0xAF, 0x1C, 0x30, 0xE7, 0xA7, 0x03, 0xA8, 0x98, 0x00, 0xBD, 0x0F, - 0xBD, 0x5B, 0xAA, 0x50, 0x23, 0x39, 0x31, 0x10, 0x0E, 0x69, 0x13, 0xE5, 0x00, 0xD2, 0x0D, 0x66, - 0x54, 0xBF, 0x5F, 0xFD, 0x37, 0x74, 0xF4, 0x5B, 0x22, 0x00, 0xC6, 0x09, 0x0F, 0xCA, 0x93, 0xE8, - 0xA4, 0xAB, 0x00, 0x61, 0x0E, 0x2E, 0xE1, 0x4B, 0x76, 0x8B, 0x6A, 0xA5, 0x9C, 0xE6, 0x23, 0xC4, - 0x00, 0x4B, 0x06, 0x1B, 0x91, 0x01, 0x00, 0xE2, 0x0D, 0xCF, 0xCA, 0x38, 0x3A, 0xB9, 0xE7, 0x91, - 0xE5, 0xEF, 0x4B, 0x00, 0xD6, 0x09, 0xD3, 0x68, 0x3E, 0xC4, 0xAF, 0x2D, 0x00, 0x2A, 0x0D, 0xF9, - 0xFC, 0x78, 0xED, 0xAE, 0x99, 0xB3, 0x32, 0x5A, 0xE7, 0x00, 0x4C, 0x0A, 0x22, 0x97, 0x5B, 0x82, - 0x06, 0x7A, 0x4C, 0x00, 0x42, 0x0E, 0x57, 0x78, 0x46, 0xF5, 0x20, 0xFC, 0x6B, 0xCB, 0x01, 0x5B, - 0x86, 0x00, 0xE4, 0x0E, 0xB2, 0x26, 0xCD, 0x71, 0xE3, 0xA5, 0x33, 0x06, 0x8E, 0x9A, 0x50, 0x00, - 0x07, 0x07, 0xF5, 0x34, 0xEF, 0xE6, 0x00, 0x32, 0x0F, 0x13, 0x41, 0x59, 0x56, 0x0F, 0x02, 0x38, - 0x2A, 0x64, 0x2A, 0x07, 0x3E, 0x00, 0x52, 0x11, 0x2A, 0x1D, 0x5F, 0x76, 0x66, 0xA0, 0xB2, 0x2F, - 0x97, 0xC7, 0x5E, 0x6E, 0x52, 0xE2, 0x00, 0x58, 0x09, 0xCA, 0x89, 0xA5, 0xDF, 0x0A, 0xDE, 0x00, - 0x50, 0x06, 0x49, 0xB8, 0xB4, 0x00, 0x77, 0x05, 0x24, 0xE8, 0x00, 0xBB, 0x0C, 0x91, 0x89, 0xA2, - 0x8B, 0x62, 0xDE, 0x6A, 0xC6, 0x60, 0x00, 0xE7, 0x0F, 0x0F, 0x11, 0x96, 0x55, 0xD2, 0xBF, 0xE6, - 0x48, 0x0B, 0x5C, 0xAB, 0xDC, 0x00, 0xBA, 0x0A, 0x30, 0xD7, 0x48, 0x0E, 0x78, 0x63, 0x0C, 0x00, - 0xD2, 0x0D, 0xFB, 0x8A, 0xA3, 0xFE, 0xF8, 0x3A, 0xDD, 0x88, 0xA9, 0x4B, 0x00, 0xA2, 0x0A, 0x75, - 0x5D, 0x0D, 0x37, 0x24, 0xC5, 0x9D, 0x00, 0xF7, 0x0B, 0x25, 0xEF, 0xDB, 0x41, 0xE0, 0x52, 0x3E, - 0x4E, 0x00, 0xB7, 0x03, 0x00, 0xE5, 0x11, 0xB9, 0xDE, 0x5A, 0x57, 0xCF, 0xB9, 0x1A, 0xFC, 0x7F, - 0x26, 0xEE, 0x7B, 0xCD, 0x2B, 0x00, 0x4B, 0x08, 0xB8, 0x09, 0x70, 0x6A, 0x9F, 0x00, 0x4B, 0x11, - 0x8C, 0x15, 0x87, 0xA3, 0x05, 0x4F, 0x37, 0x8E, 0x63, 0xDE, 0xEF, 0x39, 0xFC, 0x4B, 0x00, 0xAB, - 0x10, 0x0B, 0x91, 0xAA, 0x0F, 0xE1, 0xE9, 0xAE, 0x69, 0x3A, 0xF8, 0x03, 0x69, 0xD2, 0x00, 0xE2, - 0x07, 0xC1, 0x5C, 0x3D, 0x82, 0x00, 0xA9, 0x08, 0x68, 0xC4, 0xAD, 0x2E, 0xD1, 0x00, 0xF7, 0x0E, - 0xC6, 0x47, 0xC8, 0xCD, 0x8E, 0x7C, 0x00, 0x5C, 0x95, 0xB9, 0xF4, 0x00, 0xE3, 0x04, 0x5B, 0x00, - 0x74, 0x07, 0x65, 0xC7, 0x84, 0x8E, 0x00, 0xC6, 0x07, 0x61, 0x80, 0x44, 0x3F, 0x00, 0xC8, 0x0E, - 0x72, 0x78, 0x47, 0xD3, 0xC2, 0x4D, 0xAF, 0xC0, 0x54, 0x13, 0x31, 0x00, 0xF7, 0x0D, 0x48, 0xD8, - 0xE2, 0x92, 0x9F, 0x7F, 0x2F, 0x44, 0x68, 0x33, 0x00, 0x0D, 0x10, 0xAB, 0xFE, 0xEA, 0x8E, 0x19, - 0x81, 0xF8, 0x6F, 0x7C, 0xDE, 0xE1, 0xB3, 0x06, 0x00, 0x4D, 0x11, 0x66, 0xAE, 0x4C, 0xF9, 0xB7, - 0x2F, 0xEE, 0xB0, 0x8E, 0x7E, 0xE1, 0x8D, 0x95, 0x6F, 0x00, 0xF4, 0x0D, 0x88, 0x9D, 0xCA, 0xE3, - 0xC4, 0xB2, 0x47, 0xBB, 0xA0, 0x69, 0x00, 0xF3, 0x0B, 0x48, 0x17, 0x41, 0x64, 0xA0, 0x0E, 0x71, - 0x82, 0x00, 0x34, 0x1E, 0x18, 0x4D, 0x85, 0x80, 0x4C, 0xA9, 0x0B, 0x66, 0x9B, 0x75, 0x13, 0x61, - 0x70, 0x27, 0x81, 0x7A, 0x02, 0xCD, 0x57, 0xAB, 0xDF, 0x02, 0x93, 0x52, 0x83, 0xDF, 0x48, 0xA8, - 0xA6, 0x9E, 0x74, 0x6F, 0x89, 0x03, 0x28, 0x25, 0x52, 0x96, 0xFF, 0x67, 0x7A, 0xD8, 0x3C, 0xB1, - 0x2C, 0x46, 0x84, 0xEF, 0xE1, 0xC1, 0xC6, 0xC9, 0xDC, 0x96, 0xAA, 0xA9, 0xC4, 0x82, 0x58, 0x27, - 0x57, 0x75, 0x67, 0x34, 0xFB, 0x3B, 0x25, 0xBF, 0xFB, 0x3B, 0xF6, 0x13, 0xEC, 0x96, 0xE5, 0x16, - 0x26, 0xFD, 0xA8, 0xDA, 0x1B, 0xC6, 0x50, 0x7F, 0x47, 0xFF, 0x08, 0x55, 0x08, 0xED, 0x00, 0x93, - 0x9B, 0xC4, 0x71, 0x67, 0xEC, 0xA6, 0xCC, 0x16, 0x20, 0x87, 0x47, 0x07, 0xA6, 0x00, 0x79, 0x5D, - 0x4F, 0xAB, 0xA1, 0x6F, 0x7A, 0x6B, 0x27, 0xC4, 0xDA, 0xA3, 0xC3, 0x94, 0x4F, 0x7F, 0xF3, 0xE5, - 0x1B, 0x6F, 0xCC, 0xE5, 0xF0, 0xE5, 0x9D, 0xC9, 0xAE, 0xFD, 0x39, 0xAC, 0x4C, 0xE5, 0x58, 0x83, - 0x25, 0x65, 0x92, 0x74, 0x9E, 0x81, 0xA0, 0xB6, 0xA9, 0x02, 0x9B, 0x07, 0xB6, 0xE7, 0x79, 0x57, - 0xD9, 0x4A, 0xCE, 0xFA, 0xB4, 0x94, 0x05, 0xCC, 0x86, 0x3C, 0xDD, 0x06, 0xCD, 0xA6, 0x24, 0x24, - 0xFA, 0xC1, 0xF9, 0x48, 0xC9, 0x0C, 0x6C, 0xC4, 0x96, 0x82, 0x17, 0xF6, 0x31, 0x09, 0xC4, 0xE2, - 0x77, 0xFD, 0xCF, 0x46, 0x18, 0xB2, 0x5F, 0x01, 0x6B, 0xD1, 0x7B, 0x56, 0xB8, 0x94, 0x4A, 0xE5, - 0x6C, 0x19, 0xF0, 0xC0, 0xB6, 0x70, 0x93, 0xF7, 0xD3, 0xD1, 0x2B, 0x6E, 0x7C, 0x53, 0x6D, 0x85, - 0xD1, 0x0C, 0x8B, 0x77, 0xEE, 0x90, 0xDA, 0x15, 0x55, 0xE0, 0x58, 0x09, 0x56, 0xFC, 0x31, 0x9F, - 0xAF, 0x46, 0xCB, 0xC3, 0x8D, 0x71, 0x75, 0xF2, 0x2C, 0xC3, 0xBB, 0xA1, 0xC4, 0xCF, 0x27, 0x56, - 0x7C, 0x9B, 0xFE, 0xAF, 0x3E, 0x4E, 0xB4, 0xCD, 0x6A, 0xAA, 0xF5, 0xF3, 0xE3, 0x22, 0x82, 0xE1, - 0xA5, 0x68, 0xB3, 0xDB, 0x8F, 0x9E, 0x5E, 0x7B, 0x90, 0xF0, 0x79, 0x3F, 0x52, 0x8C, 0x61, 0x88, - 0x76, 0xAE, 0x14, 0x63, 0x19, 0x0F, 0x1D, 0xCE, 0xA1, 0x63, 0x10, 0xB2, 0xE2, 0xD7, 0x94, 0xB1, - 0x33, 0xCB, 0x28, 0x85, 0x7D, 0x9B, 0xF5, 0xF4, 0x25, 0x50, 0x9B, 0xDB, 0x35, 0xA5, 0xB0, 0x9C, - 0x09, 0x92, 0xE3, 0x31, 0x40, 0xAB, 0x4D, 0xF4, 0x35, 0xE8, 0xB3, 0x0A, 0x21, 0xC3, 0x86, 0x9C, - 0xCB, 0x29, 0xA4, 0x77, 0x57, 0xBC, 0xD8, 0xDA, 0xA5, 0x82, 0x80, 0xE8, 0xCF, 0x72, 0x81, 0xAD, - 0x2E, 0x28, 0xFF, 0xD8, 0xB6, 0xD1, 0x2B, 0x97, 0x00, 0xFF, 0xE1, 0x06, 0x44, 0x39, 0x1C, 0x4B, - 0xAB, 0x19, 0x5B, 0x4D, 0xD6, 0x3E, 0x1B, 0x5C, 0x64, 0xBB, 0x32, 0x68, 0xF5, 0x7C, 0xC9, 0x9E, - 0xE8, 0xB4, 0x29, 0x1B, 0x7F, 0x4D, 0x80, 0x80, 0x7E, 0x8B, 0x1C, 0x0A, 0xE6, 0x9A, 0xBF, 0x49, - 0x1E, 0xC5, 0xB6, 0x67, 0x7D, 0x05, 0xE4, 0x90, 0x40, 0x4B, 0xAF, 0x9B, 0x52, 0xDE, 0x17, 0x80, - 0x81, 0x56, 0xEA, 0x3A, 0x53, 0x82, 0x8C, 0x62, 0xFB, 0x96, 0x97, 0x6F, 0xC1, 0x16, 0x78, 0xD4, - 0x7B, 0xE7, 0xB9, 0x5A, 0x2A, 0xEB, 0x87, 0x68, 0x33, 0xD3, 0x31, 0x45, 0xFA, 0xFE, 0xF4, 0x1C, - 0x90, 0x86, 0x73, 0x77, 0xD9, 0xA9, 0xD1, 0x4A, 0x4A, 0xCF, 0xAE, 0x23, 0xDB, 0xF9, 0x09, 0xD8, - 0x18, 0xDC, 0x6A, 0x0D, 0xE4, 0x19, 0x8C, 0x65, 0xC6, 0x64, 0xC7, 0xDC, 0xA9, 0xE3, 0x91, 0xB1, - 0x4C, 0xC8, 0xC1, 0x9E, 0x3B, 0x7F, 0xCB, 0xA3, 0xCF, 0xDD, 0xF0, 0x1D, 0x07, 0x6E, 0xDC, 0xCE, - 0x0D, 0xCD, 0x7E, 0x1E, 0x55, 0x11, 0x8B, 0xDF, 0x3A, 0xAB, 0xB6, 0x3B, 0x6E, 0x52, 0x7F, 0xA7, - 0x00, 0xD1, 0x33, 0xBE, 0xF2, 0x9B, 0xFC, 0x4A, 0xCF, 0x9D, 0x8F, 0xC6, 0xC4, 0x7B, 0xDA, 0xE7, - 0x2A, 0x1C, 0x26, 0x6E -}; - - -void gdrom_device::device_reset() -{ - static const uint8_t GDROM_Def_Cmd11_Reply[32] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x19, 0x00, 0x00, 0x08, 0x53, 0x45, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x52, 0x65, 0x76, 0x20, 0x36, 0x2E, 0x34, 0x32, 0x39, 0x39, 0x30, 0x33, 0x31, 0x36 - }; - - for(int i = 0;i<32;i++) - GDROM_Cmd11_Reply[i] = GDROM_Def_Cmd11_Reply[i]; - - atapi_cdrom_device::device_reset(); -} - -// scsicd_exec_command -// -// Execute a SCSI command. - -void gdrom_device::ExecCommand() -{ - switch ( command[0] ) - { - case 0x11: // REQ_MODE - m_phase = SCSI_PHASE_DATAIN; - m_status_code = SCSI_STATUS_CODE_GOOD; - printf("REQ_MODE %02x %02x %02x %02x %02x %02x\n", - command[0], command[1], - command[2], command[3], - command[4], command[5]); -// if (SCSILengthFromUINT8( &command[ 4 ] ) < 32) return -1; - transferOffset = command[2]; - m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] ); - break; - - case 0x12: // SET_MODE - logerror("GDROM: SET_MODE\n"); - m_phase = SCSI_PHASE_DATAOUT; - m_status_code = SCSI_STATUS_CODE_GOOD; - //transferOffset = command[2]; - m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] ); - printf("SET_MODE %02x %02x\n",command[2],command[4]); - break; - - case 0x30: // CD_READ - if (command[1] & 1) - { - fatalerror("GDROM: MSF mode used for CD_READ, unsupported\n"); - m_transfer_length = 0; - } - else - { - m_lba = (command[2]<<16 | command[3]<<8 | command[4]) - 150; - m_blocks = command[8]<<16 | command[9]<<8 | command[10]; - - read_type = (command[1] >> 1) & 7; - data_select = (command[1]>>4) & 0xf; - - if (read_type != 2) // mode 1 - { - fatalerror("GDROM: Unhandled read_type %d\n", read_type); - } - - if (data_select != 2) // just sector data - { - fatalerror("GDROM: Unhandled data_select %d\n", data_select); - } - - printf("GDROM: CD_READ at LBA %x for %d blocks (%d bytes, read type %d, data select %d)\n", m_lba, m_blocks, m_blocks * m_sector_bytes, read_type, data_select); - - if (m_num_subblocks > 1) - { - m_cur_subblock = m_lba % m_num_subblocks; - m_lba /= m_num_subblocks; - } - else - { - m_cur_subblock = 0; - } - - if (m_cdda != nullptr) - { - m_cdda->stop_audio(); - } - - m_phase = SCSI_PHASE_DATAIN; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = m_blocks * m_sector_bytes; - } - break; - - // READ TOC (GD-ROM ver.) - case 0x14: - { - int start_trk = command[2];// ok? - int end_trk = cdrom_get_last_track(m_cdrom); - int length; - int allocation_length = SCSILengthFromUINT16( &command[ 3 ] ); - - if( start_trk == 0 ) - { - start_trk = 1; - } - if( start_trk == 0xaa ) - { - end_trk = start_trk; - } - - length = 4 + ( 8 * ( ( end_trk - start_trk ) + 1 ) ); - if( length > allocation_length ) - { - length = allocation_length; - } - else if( length < 4 ) - { - length = 4; - } - - if (m_cdda != nullptr) - { - m_cdda->stop_audio(); - } - - m_phase = SCSI_PHASE_DATAIN; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = length; - break; - } - - case 0x70: // security check, return no data, always followed by cmd 0x71, command[1] parameter can be 0x1f or 0x9f - m_phase = SCSI_PHASE_STATUS; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = 0; - break; - - case 0x71: - m_phase = SCSI_PHASE_DATAIN; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = sizeof(GDROM_Cmd71_Reply); - break; - - case 0x40: - if(command[1] & 0xf) - { - m_phase = SCSI_PHASE_DATAIN; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = 0xe; - } - else - { - printf("command 0x40: unhandled subchannel request\n"); - } - break; - - default: - t10mmc::ExecCommand(); - break; - } -} - -// scsicd_read_data -// -// Read data from the device resulting from the execution of a command - -void gdrom_device::ReadData( uint8_t *data, int dataLength ) -{ - int i; - uint8_t tmp_buffer[2048]; - - switch ( command[0] ) - { - case 0x11: // REQ_MODE - printf("REQ_MODE: dataLength %d\n", dataLength); - memcpy(data, &GDROM_Cmd11_Reply[transferOffset], (dataLength >= 32-transferOffset) ? 32-transferOffset : dataLength); - break; - - case 0x30: // CD_READ - logerror("GDROM: read %x dataLength, \n", dataLength); - if ((m_cdrom) && (m_blocks)) - { - while (dataLength > 0) - { - if (!cdrom_read_data(m_cdrom, m_lba, tmp_buffer, CD_TRACK_MODE1)) - { - logerror("GDROM: CD read error!\n"); - } - - logerror("True LBA: %d, buffer half: %d\n", m_lba, m_cur_subblock * m_sector_bytes); - - memcpy(data, &tmp_buffer[m_cur_subblock * m_sector_bytes], m_sector_bytes); - - m_cur_subblock++; - if (m_cur_subblock >= m_num_subblocks) - { - m_cur_subblock = 0; - - m_lba++; - m_blocks--; - } - - m_last_lba = m_lba; - dataLength -= m_sector_bytes; - data += m_sector_bytes; - } - } - break; - - case 0x14: // READ TOC (GD-ROM ver.) - /* - Track numbers are problematic here: 0 = lead-in, 0xaa = lead-out. - That makes sense in terms of how real-world CDs are referred to, but - our internal routines for tracks use "0" as track 1. That probably - should be fixed... - */ - printf("GDROM: READ TOC, format = %d time=%d\n", command[2]&0xf,(command[1]>>1)&1); - switch (command[2] & 0x0f) - { - case 0: // normal - { - int start_trk; - int end_trk; - int len; - int in_len; - int dptr; - uint32_t tstart; - - start_trk = command[2]; - if( start_trk == 0 ) - { - start_trk = 1; - } - - end_trk = cdrom_get_last_track(m_cdrom); - len = (end_trk * 8) + 2; - - // the returned TOC DATA LENGTH must be the full amount, - // regardless of how much we're able to pass back due to in_len - dptr = 0; - data[dptr++] = (len>>8) & 0xff; - data[dptr++] = (len & 0xff); - data[dptr++] = 1; - data[dptr++] = end_trk; - - if( start_trk == 0xaa ) - { - end_trk = 0xaa; - } - - in_len = command[3]<<8 | command[4]; - - for (i = start_trk; i <= end_trk; i++) - { - int cdrom_track = i; - if( cdrom_track != 0xaa ) - { - cdrom_track--; - } - - if( dptr >= in_len ) - { - break; - } - - data[dptr++] = 0; - data[dptr++] = cdrom_get_adr_control(m_cdrom, cdrom_track); - data[dptr++] = i; - data[dptr++] = 0; - - tstart = cdrom_get_track_start(m_cdrom, cdrom_track); - if ((command[1]&2)>>1) - tstart = lba_to_msf(tstart); - data[dptr++] = (tstart>>24) & 0xff; - data[dptr++] = (tstart>>16) & 0xff; - data[dptr++] = (tstart>>8) & 0xff; - data[dptr++] = (tstart & 0xff); - } - } - break; - default: - logerror("GDROM: Unhandled READ TOC format %d\n", command[2]&0xf); - break; - } - break; - - case 0x71: - memcpy(data, &GDROM_Cmd71_Reply[0], sizeof(GDROM_Cmd71_Reply)); - if (is_real_gdrom_disc) - data[10] = 0x1f; // needed by dimm board firmware - break; - - case 0x40: // Get Subchannel status - data[0] = 0; // Reserved - data[1] = 0x15; // Audio Playback status (todo) - data[2] = 0; - data[3] = 0x0e; // header size - data[4] = 0; // ? - data[5] = 1; // Track Number - data[6] = 1; // gap #1 - data[7] = 0; // ? - data[8] = 0; // ? - data[9] = 0; // ? - data[0xa] = 0; // ? - data[0xb] = 0; // FAD >> 16 - data[0xc] = 0; // FAD >> 8 - data[0xd] = 0x96; // FAD >> 0 - break; - - default: - t10mmc::ReadData( data, dataLength ); - break; - } -} - -// scsicd_write_data -// -// Write data to the CD-ROM device as part of the execution of a command - -void gdrom_device::WriteData( uint8_t *data, int dataLength ) -{ - switch (command[ 0 ]) - { - case 0x12: // SET_MODE - memcpy(&GDROM_Cmd11_Reply[transferOffset], data, (dataLength >= 32-transferOffset) ? 32-transferOffset : dataLength); - break; - - default: - t10mmc::WriteData( data, dataLength ); - break; - } -} - -void gdrom_device::SetDevice(void *device) -{ - t10mmc::SetDevice(device); - - // try to find if the mounted chd is from an actual gd-rom disc - if (m_cdrom) - if (cdrom_get_toc(m_cdrom)->flags & CD_FLAG_GDROM) - is_real_gdrom_disc = true; -} - -// device type definition -DEFINE_DEVICE_TYPE(GDROM, gdrom_device, "gdrom", "GD-ROM") - -gdrom_device::gdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - atapi_cdrom_device(mconfig, GDROM, tag, owner, clock), - is_real_gdrom_disc(false) -{ -} - -void gdrom_device::device_start() -{ - save_item(NAME(read_type)); - save_item(NAME(data_select)); - save_item(NAME(transferOffset)); - - /// TODO: split identify buffer into another method as device_start() should be called after it's filled in, but the atapi_cdrom_device has it's own. - atapi_cdrom_device::device_start(); - - memset(m_identify_buffer, 0, sizeof(m_identify_buffer)); - - m_identify_buffer[0] = 0x8600; // ATAPI device, cmd set 6 compliant, DRQ within 3 ms of PACKET command - - m_identify_buffer[23] = ('S' << 8) | 'E'; - m_identify_buffer[24] = (' ' << 8) | ' '; - m_identify_buffer[25] = (' ' << 8) | ' '; - m_identify_buffer[26] = (' ' << 8) | ' '; - - m_identify_buffer[27] = ('C' << 8) | 'D'; - m_identify_buffer[28] = ('-' << 8) | 'R'; - m_identify_buffer[29] = ('O' << 8) | 'M'; - m_identify_buffer[30] = (' ' << 8) | 'D'; - m_identify_buffer[31] = ('R' << 8) | 'I'; - m_identify_buffer[32] = ('V' << 8) | 'E'; - m_identify_buffer[33] = (' ' << 8) | ' '; - m_identify_buffer[34] = (' ' << 8) | ' '; - m_identify_buffer[35] = ('6' << 8) | '.'; - m_identify_buffer[36] = ('4' << 8) | '2'; - m_identify_buffer[37] = (' ' << 8) | ' '; - m_identify_buffer[38] = (' ' << 8) | ' '; - m_identify_buffer[39] = (' ' << 8) | ' '; - m_identify_buffer[40] = (' ' << 8) | ' '; - m_identify_buffer[41] = (' ' << 8) | ' '; - m_identify_buffer[42] = (' ' << 8) | ' '; - m_identify_buffer[43] = (' ' << 8) | ' '; - m_identify_buffer[44] = (' ' << 8) | ' '; - m_identify_buffer[45] = (' ' << 8) | ' '; - m_identify_buffer[46] = (' ' << 8) | ' '; - - m_identify_buffer[49] = 0x0400; // IORDY may be disabled - - m_identify_buffer[63]=7; // multi word dma mode 0-2 supported - m_identify_buffer[64]=1; // PIO mode 3 supported -} - -void gdrom_device::process_buffer() -{ - atapi_hle_device::process_buffer(); - m_sector_number = 0x80 | GDROM_PAUSE_STATE; /// HACK: find out when this should be updated -} - -void gdrom_device::signature() -{ - atapi_hle_device::signature(); - - // naomi dimm board firmware needs the upper nibble to be 8 at the beginning - if (is_real_gdrom_disc) - m_sector_number = 0x81; -} |