(MESS) dmv: added preliminary K803 emulation. (nw)

(MESS) dmv.xml: added more disks. (nw)
This commit is contained in:
Sandro Ronco 2014-11-02 17:20:07 +01:00
parent d16d1affab
commit 871c97b815
9 changed files with 320 additions and 13 deletions

View file

@ -939,6 +939,74 @@
</part>
</software>
<software name="drdrawc"> <!-- CP/M-86 -->
<description>DR Draw (Color)</description>
<year>1983</year>
<publisher>Digital Research</publisher>
<info name="usage" value="Requires K208, K235 and K806" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="281212">
<rom name="86drdraw.td0" size="281212" crc="451350ce" sha1="3d710e12241850988c88ca8c16528da3cdbdc2fd" offset="0" />
</dataarea>
</part>
</software>
<software name="drdrawm"> <!-- CP/M-86 -->
<description>DR Draw (Monochrome)</description>
<year>1983</year>
<publisher>Digital Research</publisher>
<info name="usage" value="Requires CP/M-86" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="189140">
<rom name="86drmo-m.td0" size="189140" crc="61543ccf" sha1="b8e33a0076bd1568a40d403bb6b391e6c45f9569" offset="0" />
</dataarea>
</part>
</software>
<software name="tgdemo"> <!-- CP/M-80 -->
<description>TUTBOGRAPH Demonstration Programs</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="259406">
<rom name="80tgraf.td0" size="259406" crc="d22d403f" sha1="8b1182f42faa68c1e5d879e79375683e48dd8bae" offset="0" />
</dataarea>
</part>
</software>
<software name="cpm86qd"> <!-- CP/M-86 -->
<description>CP/M-86 1.1 with quad-density FDD support</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="221628">
<rom name="586-4896.td0" size="221628" crc="383d54d3" sha1="be36d161f72c12bf6263f9577d609fd21b352c47" offset="0" />
</dataarea>
</part>
</software>
<software name="gsx86tst"> <!-- CP/M-86 -->
<description>GSX-86 Test Suite</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="1128529">
<rom name="5-gsx86-test.mfi" size="1128529" crc="353821bc" sha1="ce977ea324ef6faf8245b4e1bcac84f2504f0c37" offset="0" />
</dataarea>
</part>
</software>
<software name="msdosqd"> <!-- MS-DOS -->
<description>MS-DOS v2.11 with quad-density FDD support</description>
<year>1983</year>
<publisher>Microsoft</publisher>
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="611287">
<rom name="5_dos_96.mfi" size="611287" crc="c0f9d426" sha1="bccb7e04b320150435ee20e3d563dd163f6ab241" offset="0" />
</dataarea>
</part>
</software>
<software name="dbase238"> <!-- CP/M-80 -->
<description>dBASE II v2.38</description>
<year>198?</year>
@ -1043,7 +1111,7 @@
</part>
</software>
<software name="acad" supported="no"> <!-- MS-DOS --> <!-- graphic mode doesn't works -->
<software name="acad"> <!-- MS-DOS -->
<description>AutoCAD</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
@ -1060,7 +1128,7 @@
</part>
</software>
<software name="acada" cloneof="acad" supported="no"> <!-- MS-DOS --> <!-- graphic mode doesn't works -->
<software name="acada" cloneof="acad"> <!-- MS-DOS -->
<description>AutoCAD (Alt 1)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
@ -1087,7 +1155,7 @@
</part>
</software>
<software name="acadb" cloneof="acad" supported="no"> <!-- MS-DOS --> <!-- graphic mode doesn't works -->
<software name="acadb" cloneof="acad"> <!-- MS-DOS -->
<description>AutoCAD (Alt 2)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>

View file

@ -333,6 +333,7 @@ BUSOBJS += $(BUSOBJ)/dmv/dmvbus.o
BUSOBJS += $(BUSOBJ)/dmv/k220.o
BUSOBJS += $(BUSOBJ)/dmv/k230.o
BUSOBJS += $(BUSOBJ)/dmv/k233.o
BUSOBJS += $(BUSOBJ)/dmv/k803.o
BUSOBJS += $(BUSOBJ)/dmv/k806.o
BUSOBJS += $(BUSOBJ)/dmv/ram.o
endif

View file

@ -199,6 +199,7 @@ dmvcart_slot_device::dmvcart_slot_device(const machine_config &mconfig, const ch
device_slot_interface(mconfig, *this),
m_prog_read_cb(*this),
m_prog_write_cb(*this),
m_out_int_cb(*this),
m_out_irq_cb(*this),
m_out_thold_cb(*this)
{
@ -224,6 +225,7 @@ void dmvcart_slot_device::device_start()
// resolve callbacks
m_prog_read_cb.resolve_safe(0);
m_prog_write_cb.resolve_safe();
m_out_int_cb.resolve_safe();
m_out_irq_cb.resolve_safe();
m_out_thold_cb.resolve_safe();
}

View file

@ -58,6 +58,7 @@ public:
template<class _Object> static devcb_base &set_prog_read_callback(device_t &device, _Object object) { return downcast<dmvcart_slot_device &>(device).m_prog_read_cb.set_callback(object); }
template<class _Object> static devcb_base &set_prog_write_callback(device_t &device, _Object object) { return downcast<dmvcart_slot_device &>(device).m_prog_write_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast<dmvcart_slot_device &>(device).m_out_int_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast<dmvcart_slot_device &>(device).m_out_irq_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_thold_callback(device_t &device, _Object object) { return downcast<dmvcart_slot_device &>(device).m_out_thold_cb.set_callback(object); }
@ -86,6 +87,7 @@ public:
// internal state
devcb_read8 m_prog_read_cb;
devcb_write8 m_prog_write_cb;
devcb_write_line m_out_int_cb;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_thold_cb;
device_dmvslot_interface* m_cart;
@ -104,6 +106,9 @@ extern const device_type DMVCART_SLOT;
devcb = &dmvcart_slot_device::set_prog_read_callback(*device, DEVCB_##_read_devcb); \
devcb = &dmvcart_slot_device::set_prog_write_callback(*device, DEVCB_##_write_devcb);
#define MCFG_DMVCART_SLOT_OUT_INT_CB(_devcb) \
devcb = &dmvcart_slot_device::set_out_int_callback(*device, DEVCB_##_devcb);
#define MCFG_DMVCART_SLOT_OUT_IRQ_CB(_devcb) \
devcb = &dmvcart_slot_device::set_out_irq_callback(*device, DEVCB_##_devcb);

133
src/emu/bus/dmv/k803.c Normal file
View file

@ -0,0 +1,133 @@
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
/***************************************************************************
K803 RTC module
***************************************************************************/
#include "emu.h"
#include "k803.h"
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
static MACHINE_CONFIG_FRAGMENT( dmv_k803 )
MCFG_DEVICE_ADD("rtc", MM58167, XTAL_32_768kHz)
MCFG_MM58167_IRQ_CALLBACK(WRITELINE(dmv_k803_device, rtc_irq_w))
MACHINE_CONFIG_END
static INPUT_PORTS_START( dmv_k803 )
PORT_START("DSW")
PORT_DIPNAME( 0x0f, 0x09, "K803 IFSEL" ) PORT_DIPLOCATION("S:!4,S:!3,S:!2,S:!1")
PORT_DIPSETTING( 0x00, "0A" )
PORT_DIPSETTING( 0x01, "0B" )
PORT_DIPSETTING( 0x02, "1A" )
PORT_DIPSETTING( 0x03, "1B" )
PORT_DIPSETTING( 0x04, "2A" )
PORT_DIPSETTING( 0x05, "2B" )
PORT_DIPSETTING( 0x06, "3A" )
PORT_DIPSETTING( 0x07, "3B" )
PORT_DIPSETTING( 0x08, "4A" )
PORT_DIPSETTING( 0x09, "4B" ) // default
INPUT_PORTS_END
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
const device_type DMV_K803 = &device_creator<dmv_k803_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// dmv_k803_device - constructor
//-------------------------------------------------
dmv_k803_device::dmv_k803_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, DMV_K803, "K803 RTC", tag, owner, clock, "dmv_k803", __FILE__),
device_dmvslot_interface( mconfig, *this ),
m_rtc(*this, "rtc"),
m_dsw(*this, "DWS")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void dmv_k803_device::device_start()
{
m_bus = static_cast<dmvcart_slot_device*>(owner());
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void dmv_k803_device::device_reset()
{
m_latch = 0;
m_rtc_int = CLEAR_LINE;
}
//-------------------------------------------------
// machine_config_additions - device-specific
// machine configurations
//-------------------------------------------------
machine_config_constructor dmv_k803_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( dmv_k803 );
}
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor dmv_k803_device::device_input_ports() const
{
return INPUT_PORTS_NAME( dmv_k803 );
}
void dmv_k803_device::io_read(address_space &space, int ifsel, offs_t offset, UINT8 &data)
{
UINT8 dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
{
if (offset & 0x04)
data = m_rtc->read(space, ((m_latch & 0x07) << 2) | (offset & 0x03));
}
}
void dmv_k803_device::io_write(address_space &space, int ifsel, offs_t offset, UINT8 data)
{
UINT8 dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
{
if (offset & 0x04)
m_rtc->write(space, ((m_latch & 0x07) << 2) | (offset & 0x03), data);
else
{
m_latch = data;
update_int();
}
}
}
WRITE_LINE_MEMBER(dmv_k803_device::rtc_irq_w)
{
m_rtc_int = state;
update_int();
}
void dmv_k803_device::update_int()
{
bool state = ((m_latch & 0x80) && m_rtc_int);
m_bus->m_out_irq_cb(state ? ASSERT_LINE : CLEAR_LINE);
}

54
src/emu/bus/dmv/k803.h Normal file
View file

@ -0,0 +1,54 @@
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
#pragma once
#ifndef __DMV_K803_H__
#define __DMV_K803_H__
#include "emu.h"
#include "dmvbus.h"
#include "machine/mm58167.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> dmv_k803_device
class dmv_k803_device :
public device_t,
public device_dmvslot_interface
{
public:
// construction/destruction
dmv_k803_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual ioport_constructor device_input_ports() const;
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER(rtc_irq_w);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void io_read(address_space &space, int ifsel, offs_t offset, UINT8 &data);
virtual void io_write(address_space &space, int ifsel, offs_t offset, UINT8 data);
void update_int();
private:
required_device<mm58167_device> m_rtc;
required_ioport m_dsw;
dmvcart_slot_device * m_bus;
UINT8 m_latch;
int m_rtc_int;
};
// device type definition
extern const device_type DMV_K803;
#endif /* __DMV_K803_H__ */

View file

@ -20,7 +20,8 @@ ROM_START( dmv_k806 )
ROM_END
static ADDRESS_MAP_START( k806_io, AS_IO, 8, dmv_k806_device )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(port1_r, port1_w)
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(port1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(port2_w)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(portt1_r)
ADDRESS_MAP_END
@ -75,6 +76,7 @@ dmv_k806_device::dmv_k806_device(const machine_config &mconfig, const char *tag,
void dmv_k806_device::device_start()
{
m_bus = static_cast<dmvcart_slot_device*>(owner());
}
//-------------------------------------------------
@ -129,6 +131,15 @@ void dmv_k806_device::io_write(address_space &space, int ifsel, offs_t offset, U
READ8_MEMBER( dmv_k806_device::port1_r )
{
// ---- ---x Left button
// ---- --x- Middle button
// ---- -x-- Right button
// ---- x--- XA / Y1
// ---x ---- XB / Y2
// --x- ---- YA / X2
// -x-- ---- YB / X1
// x--- ---- not used
// TODO
return 0xff;
}
@ -138,7 +149,7 @@ READ8_MEMBER( dmv_k806_device::portt1_r )
return BIT(m_jumpers->read(), 7) ? 0 : 1;
}
WRITE8_MEMBER( dmv_k806_device::port1_w )
WRITE8_MEMBER( dmv_k806_device::port2_w )
{
// TODO
m_bus->m_out_int_cb((data & 1) ? CLEAR_LINE : ASSERT_LINE);
};

View file

@ -31,7 +31,7 @@ public:
DECLARE_READ8_MEMBER(portt1_r);
DECLARE_READ8_MEMBER(port1_r);
DECLARE_WRITE8_MEMBER(port1_w);
DECLARE_WRITE8_MEMBER(port2_w);
protected:
// device-level overrides
@ -44,6 +44,7 @@ protected:
private:
required_device<upi41_cpu_device> m_mcu;
required_ioport m_jumpers;
dmvcart_slot_device * m_bus;
};

View file

@ -25,6 +25,7 @@
#include "bus/dmv/k220.h"
#include "bus/dmv/k230.h"
#include "bus/dmv/k233.h"
#include "bus/dmv/k803.h"
#include "bus/dmv/k806.h"
#include "bus/dmv/ram.h"
@ -114,7 +115,17 @@ public:
DECLARE_READ8_MEMBER(exp_program_r);
DECLARE_WRITE8_MEMBER(exp_program_w);
DECLARE_WRITE_LINE_MEMBER(thold7_w);
DECLARE_WRITE_LINE_MEMBER(busint_w);
void update_busint(int slot, int state);
DECLARE_WRITE_LINE_MEMBER(busint2_w) { update_busint(0, state); }
DECLARE_WRITE_LINE_MEMBER(busint2a_w) { update_busint(1, state); }
DECLARE_WRITE_LINE_MEMBER(busint3_w) { update_busint(2, state); }
DECLARE_WRITE_LINE_MEMBER(busint4_w) { update_busint(3, state); }
DECLARE_WRITE_LINE_MEMBER(busint5_w) { update_busint(4, state); }
DECLARE_WRITE_LINE_MEMBER(busint6_w) { update_busint(5, state); }
DECLARE_WRITE_LINE_MEMBER(busint7_w) { update_busint(6, state); }
DECLARE_WRITE_LINE_MEMBER(busint7a_w) { update_busint(7, state); }
DECLARE_FLOPPY_FORMATS( floppy_formats );
UINT8 program_read(address_space &space, int cas, offs_t offset);
@ -146,6 +157,7 @@ public:
int m_dack3_line;
int m_sd_poll_state;
int m_floppy_motor;
int m_busint[8];
};
WRITE8_MEMBER(dmv_state::tc_set_w)
@ -329,6 +341,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( dmv_state::hgdc_draw_text )
static SLOT_INTERFACE_START( dmv_floppies )
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
SLOT_INTERFACE( "525qd", FLOPPY_525_QD )
SLOT_INTERFACE_END
@ -375,10 +388,21 @@ WRITE_LINE_MEMBER( dmv_state::thold7_w )
}
}
WRITE_LINE_MEMBER( dmv_state::busint_w )
void dmv_state::update_busint(int slot, int state)
{
m_slot7a->irq2_w(state);
m_slot7->irq2_w(state);
m_busint[slot] = state;
int new_state = CLEAR_LINE;
for (int i=0; i<8; i++)
if (m_busint[i] != CLEAR_LINE)
{
new_state = ASSERT_LINE;
break;
}
m_slot7a->irq2_w(new_state);
m_slot7->irq2_w(new_state);
m_maincpu->set_input_line(0, new_state);
}
void dmv_state::program_write(address_space &space, int cas, offs_t offset, UINT8 data)
@ -505,6 +529,7 @@ void dmv_state::machine_reset()
m_switch16 = 0;
m_thold7 = 0;
m_dma_hrq = 0;
memset(m_busint, 0, sizeof(m_busint));
update_halt_line();
}
@ -606,6 +631,7 @@ SLOT_INTERFACE_END
static SLOT_INTERFACE_START(dmv_slot2_6)
SLOT_INTERFACE("k233", DMV_K233) // K233 16K Shared RAM
SLOT_INTERFACE("k803", DMV_K803) // K803 RTC module
SLOT_INTERFACE("k806", DMV_K806) // K806 Mouse module
SLOT_INTERFACE_END
@ -692,27 +718,33 @@ static MACHINE_CONFIG_START( dmv, dmv_state )
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot1, NULL, false)
MCFG_DEVICE_ADD("slot2", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint2_w))
MCFG_DEVICE_ADD("slot2a", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2a, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint2a_w))
MCFG_DEVICE_ADD("slot3", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint3_w))
MCFG_DEVICE_ADD("slot4", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint4_w))
MCFG_DEVICE_ADD("slot5", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint5_w))
MCFG_DEVICE_ADD("slot6", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, NULL, false)
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint6_w))
MCFG_DEVICE_ADD("slot7", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot7, NULL, false)
MCFG_DMVCART_SLOT_PROGRAM_READWRITE_CB(READ8(dmv_state, exp_program_r), WRITE8(dmv_state, exp_program_w))
MCFG_DMVCART_SLOT_OUT_THOLD_CB(WRITELINE(dmv_state, thold7_w))
MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(dmv_state, busint_w))
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint7_w))
MCFG_DEVICE_ADD("slot7a", DMVCART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(dmv_slot7a, "k230", false)
MCFG_DMVCART_SLOT_PROGRAM_READWRITE_CB(READ8(dmv_state, exp_program_r), WRITE8(dmv_state, exp_program_w))
MCFG_DMVCART_SLOT_OUT_THOLD_CB(WRITELINE(dmv_state, thold7_w))
MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(dmv_state, busint_w))
MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(dmv_state, busint7a_w))
MCFG_SOFTWARE_LIST_ADD("flop_list", "dmv")