From 8ab7875e897aebfac7a210cb8e00b61bc2fe1c16 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 16 Sep 2016 10:07:34 -0500 Subject: [PATCH] mcd: add incomplete Mitsumi ISA CDROM emulation [Carl] --- scripts/src/bus.lua | 2 + src/devices/bus/isa/isa_cards.cpp | 1 + src/devices/bus/isa/isa_cards.h | 1 + src/devices/bus/isa/mcd.cpp | 243 ++++++++++++++++++++++++++++++ src/devices/bus/isa/mcd.h | 103 +++++++++++++ src/mame/drivers/vis.cpp | 34 +---- 6 files changed, 351 insertions(+), 33 deletions(-) create mode 100644 src/devices/bus/isa/mcd.cpp create mode 100644 src/devices/bus/isa/mcd.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index eb3da56b646..caf2972665c 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -941,6 +941,8 @@ if (BUSES["ISA"]~=null) then MAME_DIR .. "src/devices/bus/isa/svga_trident.h", MAME_DIR .. "src/devices/bus/isa/num9rev.cpp", MAME_DIR .. "src/devices/bus/isa/num9rev.h", + MAME_DIR .. "src/devices/bus/isa/mcd.cpp", + MAME_DIR .. "src/devices/bus/isa/mcd.h", } end diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp index e2702a5598f..c6bda65c273 100644 --- a/src/devices/bus/isa/isa_cards.cpp +++ b/src/devices/bus/isa/isa_cards.cpp @@ -102,4 +102,5 @@ SLOT_INTERFACE_START( pc_isa16_cards ) SLOT_INTERFACE("3c505", ISA16_3C505) SLOT_INTERFACE("mach64", ISA16_SVGA_MACH64) SLOT_INTERFACE("sb16_lle", ISA16_SB16) + SLOT_INTERFACE("mcd", ISA16_MCD) SLOT_INTERFACE_END diff --git a/src/devices/bus/isa/isa_cards.h b/src/devices/bus/isa/isa_cards.h index 5133d4772d4..838fc9623bb 100644 --- a/src/devices/bus/isa/isa_cards.h +++ b/src/devices/bus/isa/isa_cards.h @@ -37,6 +37,7 @@ #include "side116.h" #include "aha1542.h" #include "wd1002a_wx1.h" +#include "mcd.h" // sound #include "adlib.h" diff --git a/src/devices/bus/isa/mcd.cpp b/src/devices/bus/isa/mcd.cpp new file mode 100644 index 00000000000..ce3cf540839 --- /dev/null +++ b/src/devices/bus/isa/mcd.cpp @@ -0,0 +1,243 @@ +// license:BSD-3-Clause +// copyright-holders:Carl + +#include "mcd.h" +#include "coreutil.h" + +DEVICE_ADDRESS_MAP_START(map, 16, mcd_isa_device) + AM_RANGE(0x0, 0x1) AM_READWRITE8(data_r, cmd_w, 0x00ff) + AM_RANGE(0x0, 0x1) AM_READWRITE8(flag_r, reset_w, 0xff00) +ADDRESS_MAP_END + +static INPUT_PORTS_START( ide ) +INPUT_PORTS_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type ISA16_MCD = &device_creator; + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor mcd_isa_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( ide ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// mcd_isa_device - constructor +//------------------------------------------------- + +mcd_isa_device::mcd_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + cdrom_image_device(mconfig, ISA16_MCD, "Mitsumi ISA CDROM Adapter", tag, owner, clock, "mcd_isa", __FILE__), + device_isa16_card_interface( mconfig, *this ) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void mcd_isa_device::device_start() +{ + cdrom_image_device::device_start(); + set_isa_device(); + m_isa->install_device(0x0310, 0x0311, *this, &mcd_isa_device::map, 16); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void mcd_isa_device::device_reset() +{ + m_data = false; + m_stat = m_cdrom_handle ? STAT_READY : 0; + m_flag = FLAG_STAT; + m_rd_count = 0; + m_buf_count = 0; + m_curtoctrk = 1; + m_dma = 0; + m_irq = 0; + m_locked = false; +} + +READ8_MEMBER(mcd_isa_device::flag_r) +{ + UINT8 ret = m_flag; + m_flag = 0; + return ret; +} + +READ8_MEMBER(mcd_isa_device::data_r) +{ + if(!m_data) + { + if(m_buf_count) + { + m_flag = FLAG_DATA; + m_data = true; + } + return m_stat; + } + else if(m_buf_count) + { + UINT8 ret = m_buf[m_buf_idx++]; + m_buf_count--; + if(m_buf_count) + m_flag = FLAG_DATA; + return ret; + } + return 0; +} + +WRITE8_MEMBER(mcd_isa_device::reset_w) +{ + reset(); +} + +WRITE8_MEMBER(mcd_isa_device::cmd_w) +{ + if(m_rd_count) + { + m_rd_count--; + switch(m_cmd) + { + case CMD_SET_MODE: + m_mode = data; + break; + case CMD_LOCK: + m_locked = data & 1 ? true : false; + m_buf[0] = 0; + m_buf[1] = 0; + m_buf_count = 2; + break; + case CMD_CONFIG: + switch(m_rd_count) + { + case 1: + m_conf = data; + break; + case 0: + switch(m_conf) + { + case 0x10: + m_irq = data; + break; + case 0x02: + m_dma = data; + break; + } + m_buf[0] = 0; + m_buf_count = 1; + break; + } + } + if(!m_rd_count) + { + m_data = false; + m_flag = FLAG_STAT; + m_stat = m_cdrom_handle ? STAT_READY : 0; + } + return; + } + m_cmd = data; + m_buf_idx = 0; + m_rd_count = 0; + m_buf_count = 0; + m_stat = m_cdrom_handle ? STAT_READY : 0; + switch(data) + { + case CMD_GET_INFO: + if(m_cdrom_handle) + { + UINT32 first = lba_to_msf(150), last = lba_to_msf(cdrom_get_track_start(m_cdrom_handle, 0xaa)); + m_buf[0] = 1; + m_buf[1] = dec_2_bcd(cdrom_get_last_track(m_cdrom_handle)); + m_buf[2] = dec_2_bcd((first >> 16) & 0xff); + m_buf[3] = dec_2_bcd((first >> 8) & 0xff); + m_buf[4] = dec_2_bcd(first & 0xff); + m_buf[5] = dec_2_bcd((last >> 16) & 0xff); + m_buf[6] = dec_2_bcd((last >> 8) & 0xff); + m_buf[7] = dec_2_bcd(last & 0xff); + m_buf_count = 8; + } + else + { + m_buf_count = 1; + m_buf[0] = 0; + m_stat = STAT_CMD_CHECK; + } + break; + case CMD_GET_Q: + if(m_cdrom_handle) + { + int tracks = cdrom_get_last_track(m_cdrom_handle); + UINT32 start = lba_to_msf(cdrom_get_track_start(m_cdrom_handle, m_curtoctrk)); + UINT32 end = lba_to_msf(cdrom_get_track_start(m_cdrom_handle, m_curtoctrk < tracks ? m_curtoctrk + 1 : 0xaa)); + m_buf[0] = 1; // track type? + m_buf[1] = dec_2_bcd(m_curtoctrk + 1); + m_buf[2] = dec_2_bcd(m_curtoctrk + 1); + m_buf[3] = dec_2_bcd((start >> 16) & 0xff); + m_buf[4] = dec_2_bcd((start >> 8) & 0xff); + m_buf[5] = dec_2_bcd(start & 0xff); + m_buf[6] = 0; + m_buf[7] = dec_2_bcd((end >> 16) & 0xff); + m_buf[8] = dec_2_bcd((end >> 8) & 0xff); + m_buf[9] = dec_2_bcd(end & 0xff); + if(m_curtoctrk >= tracks) + m_curtoctrk = 1; + m_buf_count = 10; + } + else + m_stat = STAT_CMD_CHECK; + break; + case CMD_GET_STAT: + m_buf[0] = m_stat; + m_buf_count = 1; + break; + case CMD_SET_MODE: + m_rd_count = 1; + break; + case CMD_STOPCDDA: + case CMD_STOP: + m_drvmode = DRV_MODE_STOP; + m_curtoctrk = 1; + break; + case CMD_CONFIG: + m_rd_count = 2; + break; + case CMD_READ: + m_drvmode = DRV_MODE_READ; + break; + case CMD_READCDDA: + m_drvmode = DRV_MODE_CDDA; + break; + case CMD_GET_VER: + m_buf[0] = 1; // ? + m_buf[1] = 'D'; + m_buf[2] = 0; + m_buf_count = 3; + break; + case CMD_EJECT: + break; + case CMD_LOCK: + m_rd_count = 1; + break; + default: + m_stat |= STAT_CMD_CHECK; + break; + } + if(!m_rd_count) + { + m_data = false; + m_flag = FLAG_STAT; + } +} diff --git a/src/devices/bus/isa/mcd.h b/src/devices/bus/isa/mcd.h new file mode 100644 index 00000000000..a7d0fb3e313 --- /dev/null +++ b/src/devices/bus/isa/mcd.h @@ -0,0 +1,103 @@ +// license:BSD-3-Clause +// copyright-holders:Carl +#pragma once + +#ifndef __MCD_H__ +#define __MCD_H__ + +#include "emu.h" +#include "isa.h" +#include "imagedev/chd_cd.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> mcd_isa_device + +class mcd_isa_device : public cdrom_image_device, + public device_isa16_card_interface +{ +public: + // construction/destruction + mcd_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + + DECLARE_ADDRESS_MAP(map, 16); + + DECLARE_READ8_MEMBER(data_r); + DECLARE_READ8_MEMBER(flag_r); + DECLARE_WRITE8_MEMBER(cmd_w); + DECLARE_WRITE8_MEMBER(reset_w); +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; +private: + bool m_data; + UINT8 m_stat; + UINT8 m_flag; + UINT8 m_buf[2048]; + int m_buf_count; + int m_buf_idx; + int m_rd_count; + UINT8 m_mode; + UINT8 m_cmd; + UINT8 m_conf; + UINT8 m_irq; + UINT8 m_dma; + bool m_locked; + int m_drvmode; + int m_curtoctrk; + enum { + STAT_CMD_CHECK = 0x01, + STAT_PLAY_CDDA = 0x02, + STAT_ERROR = 0x04, + STAT_DISK_CDDA = 0x08, + STAT_SPIN = 0x10, + STAT_CHANGE = 0x20, + STAT_READY = 0x40, + STAT_OPEN = 0x80 + }; + enum { + CMD_GET_INFO = 0x10, + CMD_GET_Q = 0x20, + CMD_GET_STAT = 0x40, + CMD_SET_MODE = 0x50, + CMD_SOFT_RESET = 0x60, + CMD_STOPCDDA = 0x70, + CMD_CONFIG = 0x90, + CMD_SET_VOL = 0xae, + CMD_READ = 0xc0, + CMD_READCDDA = 0xc1, + CMD_GET_VER = 0xdc, + CMD_STOP = 0xf0, + CMD_EJECT = 0xf6, + CMD_LOCK = 0xfe + }; + enum { + MODE_MUTE = 0x01, + MODE_GET_TOC = 0x04, + MODE_STOP = 0x08, + MODE_ECC = 0x20, + MODE_DATA = 0x40 + }; + enum { + DRV_MODE_STOP, + DRV_MODE_READ, + DRV_MODE_CDDA + }; + enum { + FLAG_DATA = 2, + FLAG_STAT = 4, + FLAG_OPEN = 16 + }; +}; + + +// device type definition +extern const device_type ISA16_MCD; + +#endif diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp index a84d9bb3d1d..c62e1bee804 100644 --- a/src/mame/drivers/vis.cpp +++ b/src/mame/drivers/vis.cpp @@ -66,38 +66,6 @@ READ8_MEMBER(vis_state::unk3_r) return 0x00; } -// probably a mitsumi isa non-atapi cdrom controller, mcd.c in older linux versions -READ8_MEMBER(vis_state::cdrom_r) -{ - if(m_cdcmd) - { - if(offset) - { - int ret = m_cdstat; - m_cdstat = 0; - return ret; - } - else - { - m_cdcmd = 0; - return 0x80; - } - } - if(offset) - return 0; - else - return 0x20; -} - -WRITE8_MEMBER(vis_state::cdrom_w) -{ - if(!offset) - { - m_cdcmd = data; - m_cdstat = 4; - } -} - READ8_MEMBER(vis_state::sysctl_r) { return m_sysctl; @@ -125,7 +93,6 @@ static ADDRESS_MAP_START( at16_io, AS_IO, 16, vis_state ) AM_RANGE(0x006a, 0x006b) AM_READ8(unk2_r, 0x00ff) AM_RANGE(0x0092, 0x0093) AM_READWRITE8(sysctl_r, sysctl_w, 0x00ff) AM_RANGE(0x0000, 0x00ff) AM_DEVICE("mb", at_mb_device, map) - AM_RANGE(0x0310, 0x0311) AM_READWRITE8(cdrom_r, cdrom_w, 0xffff) AM_RANGE(0x031a, 0x031b) AM_READ8(unk3_r, 0x00ff) ADDRESS_MAP_END @@ -140,6 +107,7 @@ static MACHINE_CONFIG_START( vis, vis_state ) MCFG_DEVICE_ADD("mb", AT_MB, 0) MCFG_ISA16_SLOT_ADD("mb:isabus","vga", pc_isa16_cards, "clgd542x", true) + MCFG_ISA16_SLOT_ADD("mb:isabus","mcd", pc_isa16_cards, "mcd", true) MACHINE_CONFIG_END ROM_START(vis)