From ecd19c3b10b21567ee9162a61237035b77860adf Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 5 May 2023 18:51:23 +0200 Subject: hrdvd: Make the initial dvdrom test pass --- src/devices/machine/t10mmc.cpp | 32 ++++++++++++++++++++++++++++---- src/devices/machine/t10mmc.h | 7 ++++++- src/mame/nichibutsu/hrdvd.cpp | 9 +++++++++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/devices/machine/t10mmc.cpp b/src/devices/machine/t10mmc.cpp index d36d9f72600..18e995cf8fd 100644 --- a/src/devices/machine/t10mmc.cpp +++ b/src/devices/machine/t10mmc.cpp @@ -12,6 +12,13 @@ static int to_msf(int frame) return (m << 16) | (s << 8) | f; } +void t10mmc::set_model(std::string model_name) +{ + m_model_name = model_name; + while(m_model_name.size() < 28) + m_model_name += ' '; +} + void t10mmc::t10_start(device_t &device) { m_device = &device; @@ -155,6 +162,12 @@ void t10mmc::ExecCommand() m_transfer_length = 8; break; + case T10MMC_CMD_READ_DISC_STRUCTURE: + m_phase = SCSI_PHASE_DATAIN; + m_status_code = SCSI_STATUS_CODE_GOOD; + m_transfer_length = (command[8] << 8) | command[9]; + break; + case T10SBC_CMD_READ_10: if (!m_image->exists()) { @@ -606,10 +619,7 @@ void t10mmc::ReadData( uint8_t *data, int dataLength ) data[5] = 0; data[6] = 0; data[7] = 0; - memset(&data[8], ' ', 28); - memcpy(&data[8], "MAME", 4); - memcpy(&data[16], "Virtual CDROM", 13); - memcpy(&data[32], "1.0", 3); + memcpy(&data[8], m_model_name.data(), 28); break; case T10SBC_CMD_READ_CAPACITY: @@ -916,6 +926,20 @@ void t10mmc::ReadData( uint8_t *data, int dataLength ) } break; + case T10MMC_CMD_READ_DISC_STRUCTURE: + m_device->machine().debug_break(); + m_device->logerror("T10MMC: READ DISC STRUCTURE, data\n"); + data[0] = data[1] = 0; + data[2] = data[3] = 0; + + if((command[1] & 0x0f) == 0 && command[7] == 0x04) // DVD / DVD disc manufacturing information + { + data[1] = 0xe; + for(int i=4; i != 0xe; i++) + data[i] = 0; + } + break; + default: t10spc::ReadData( data, dataLength ); break; diff --git a/src/devices/machine/t10mmc.h b/src/devices/machine/t10mmc.h index 30e572673c0..99f7813c314 100644 --- a/src/devices/machine/t10mmc.h +++ b/src/devices/machine/t10mmc.h @@ -19,7 +19,7 @@ class t10mmc : public virtual t10spc { public: t10mmc() - : t10spc(), m_image(nullptr), m_cdda(nullptr), m_lba(0), m_blocks(0), m_last_lba(0), m_num_subblocks(0), m_cur_subblock(0), m_audio_sense(0), m_device(nullptr) + : t10spc(), m_image(nullptr), m_cdda(nullptr), m_model_name("MAME Virtual CDROM 1.0 "), m_lba(0), m_blocks(0), m_last_lba(0), m_num_subblocks(0), m_cur_subblock(0), m_audio_sense(0), m_device(nullptr) { } @@ -27,6 +27,8 @@ public: virtual void WriteData( uint8_t *data, int dataLength ) override; virtual void ReadData( uint8_t *data, int dataLength ) override; + void set_model(std::string model_name); + protected: virtual void t10_start(device_t &device) override; virtual void t10_reset() override; @@ -41,6 +43,7 @@ protected: T10MMC_CMD_PAUSE_RESUME = 0x4b, T10MMC_CMD_STOP_PLAY_SCAN = 0x4e, T10MMC_CMD_PLAY_AUDIO_12 = 0xa5, + T10MMC_CMD_READ_DISC_STRUCTURE = 0xad, T10MMC_CMD_SET_CD_SPEED = 0xbb, T10MMC_CMD_READ_CD = 0xbe }; @@ -58,6 +61,8 @@ protected: cdrom_image_device *m_image; cdda_device *m_cdda; + std::string m_model_name; + uint32_t m_lba; uint32_t m_blocks; uint32_t m_last_lba; diff --git a/src/mame/nichibutsu/hrdvd.cpp b/src/mame/nichibutsu/hrdvd.cpp index ba661f3b854..2c8ac4561d7 100644 --- a/src/mame/nichibutsu/hrdvd.cpp +++ b/src/mame/nichibutsu/hrdvd.cpp @@ -109,6 +109,8 @@ public: void hrdvd_map(address_map &map); void hrdvd_sub_io_map(address_map &map); void hrdvd_sub_map(address_map &map); + + static void dvdrom_config(device_t *device); }; // Some kind of device a table is sent to @@ -435,6 +437,12 @@ static void atapi_devs(device_slot_interface &device) device.option_add("dvdrom", ATAPI_FIXED_DVDROM); } +void hrdvd_state::dvdrom_config(device_t *device) +{ + auto *drive = downcast(device); + drive->set_model("PIONEER DVD-A01 1.17"); // Wants firmware version between 1.14 and 1.19 +} + void hrdvd_state::hrdvd(machine_config &config) { /* basic machine hardware */ @@ -450,6 +458,7 @@ void hrdvd_state::hrdvd(machine_config &config) m_subcpu->subdevice("sci0")->tx_handler().set(m_maincpu, FUNC(tmp68301_device::rx0_w)); HRDVD_ATA_CONTROLLER_DEVICE(config, m_ata).options(atapi_devs, "dvdrom", nullptr, true); + m_ata->slot(0).set_option_machine_config("dvdrom", dvdrom_config); m_ata->irq_handler().set(FUNC(hrdvd_state::ata_irq)); m_ata->dmarq_handler().set(FUNC(hrdvd_state::ata_drq)); -- cgit v1.2.3