mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
mcd: add incomplete Mitsumi ISA CDROM emulation [Carl]
This commit is contained in:
parent
ba28590ba9
commit
8ab7875e89
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
243
src/devices/bus/isa/mcd.cpp
Normal 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
103
src/devices/bus/isa/mcd.h
Normal 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
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user