mcd: add incomplete Mitsumi ISA CDROM emulation [Carl]

This commit is contained in:
cracyc 2016-09-16 10:07:34 -05:00
parent ba28590ba9
commit 8ab7875e89
6 changed files with 351 additions and 33 deletions

View File

@ -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

View File

@ -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

View File

@ -37,6 +37,7 @@
#include "side116.h"
#include "aha1542.h"
#include "wd1002a_wx1.h"
#include "mcd.h"
// sound
#include "adlib.h"

243
src/devices/bus/isa/mcd.cpp Normal file
View File

@ -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<mcd_isa_device>;
//-------------------------------------------------
// 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;
}
}

103
src/devices/bus/isa/mcd.h Normal file
View File

@ -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

View File

@ -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)