(MESS) msx.c: Added preliminary sfg01 support (nw)

This commit is contained in:
Wilbert Pol 2014-06-01 19:36:29 +00:00
parent e67b7aeeba
commit 238738412b
13 changed files with 341 additions and 12 deletions

2
.gitattributes vendored
View File

@ -1017,6 +1017,8 @@ src/emu/bus/msx_cart/rtype.c svneol=native#text/plain
src/emu/bus/msx_cart/rtype.h svneol=native#text/plain
src/emu/bus/msx_cart/superloderunner.c svneol=native#text/plain
src/emu/bus/msx_cart/superloderunner.h svneol=native#text/plain
src/emu/bus/msx_cart/yamaha.c svneol=native#text/plain
src/emu/bus/msx_cart/yamaha.h svneol=native#text/plain
src/emu/bus/msx_slot/bunsetsu.c svneol=native#text/plain
src/emu/bus/msx_slot/bunsetsu.h svneol=native#text/plain
src/emu/bus/msx_slot/cartridge.c svneol=native#text/plain

View File

@ -420,6 +420,7 @@ BUSOBJS += $(BUSOBJ)/msx_cart/msxdos2.o
BUSOBJS += $(BUSOBJ)/msx_cart/nomapper.o
BUSOBJS += $(BUSOBJ)/msx_cart/rtype.o
BUSOBJS += $(BUSOBJ)/msx_cart/superloderunner.o
BUSOBJS += $(BUSOBJ)/msx_cart/yamaha.o
endif

View File

@ -12,6 +12,7 @@
#include "nomapper.h"
#include "rtype.h"
#include "superloderunner.h"
#include "yamaha.h"
SLOT_INTERFACE_START(msx_cart)
@ -44,6 +45,7 @@ SLOT_INTERFACE_END
msx_cart_interface::msx_cart_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device)
, m_out_irq_cb(*this)
{
}
@ -61,3 +63,12 @@ void msx_cart_interface::sram_alloc(UINT32 size)
{
m_sram.resize(size);
}
// Several yamaha machines had 60 pin expansion slots. The pinouts of these slots was
// exactly the same as the regular 50 pin cartridge slots. The lowest 10 pins are simply
// not connected.
SLOT_INTERFACE_START(msx_yamaha_60pin)
SLOT_INTERFACE("sfg01", MSX_CART_SFG01)
SLOT_INTERFACE_END

View File

@ -3,6 +3,7 @@
SLOT_INTERFACE_EXTERN(msx_cart);
SLOT_INTERFACE_EXTERN(msx_yamaha_60pin); // 60 pin expansion slots as found in yamaha machines
class msx_cart_interface : public device_slot_card_interface
@ -10,6 +11,8 @@ class msx_cart_interface : public device_slot_card_interface
public:
msx_cart_interface(const machine_config &mconfig, device_t &device);
template<class _Object> void set_out_irq_cb(_Object object) { m_out_irq_cb.set_callback(object); m_out_irq_cb.resolve_safe(); }
// This is called after loading cartridge contents and allows the cartridge
// implementation to perform some additional initialization based on the
// cartridge contents.
@ -36,6 +39,7 @@ protected:
dynamic_buffer m_rom;
dynamic_buffer m_ram;
dynamic_buffer m_sram;
devcb_write_line m_out_irq_cb;
};

View File

@ -136,11 +136,13 @@ msx_cart_msx_audio_nms1205::msx_cart_msx_audio_nms1205(const machine_config &mco
static MACHINE_CONFIG_FRAGMENT( msx_audio_nms1205 )
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
// At the same time the sound is also output on two output on the nms1205 cartridge itself
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("y8950", Y8950, XTAL_3_579545MHz)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MCFG_Y8950_KEYBOARD_WRITE_HANDLER(DEVWRITE8("kbdc", msx_audio_kbdc_port_device, write))
MCFG_Y8950_KEYBOARD_READ_HANDLER(DEVREAD8("kbdc", msx_audio_kbdc_port_device, read))
MCFG_Y8950_IRQ_HANDLER(WRITELINE(msx_cart_msx_audio_nms1205, irq_write))
MCFG_MSX_AUDIO_KBDC_PORT_ADD("kbdc", msx_audio_keyboards, NULL)
@ -174,6 +176,16 @@ const rom_entry *msx_cart_msx_audio_nms1205::device_rom_region() const
}
WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205::irq_write)
{
// Trigger IRQ on the maincpu
// The 8950 seems to trigger an irq on reset, this causes an infinite loop of continuously triggering
// the MSX's interrupt handler. The 8950 irq will never be cleared the nms1205's irq handler hook hasn't
// been installed yet.
// m_out_irq_cb(state);
}
WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205::midi_in)
{
// MIDI in signals is sent to both the 6850 and the MIDI thru output port

View File

@ -47,6 +47,7 @@ public:
virtual DECLARE_READ8_MEMBER(read_cart);
DECLARE_WRITE_LINE_MEMBER(midi_in);
DECLARE_WRITE_LINE_MEMBER(irq_write);
private:
required_device<y8950_device> m_y8950;

View File

@ -0,0 +1,143 @@
#include "emu.h"
#include "yamaha.h"
const device_type MSX_CART_SFG01 = &device_creator<msx_cart_sfg01>;
msx_cart_sfg01::msx_cart_sfg01(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MSX_CART_SFG01, "MSX Cartridge - SFG01", tag, owner, clock, "msx_cart_sfg01", __FILE__)
, msx_cart_interface(mconfig, *this)
, m_region_sfg01(*this, "sfg01")
, m_ym2151(*this, "ym2151")
, m_kbdc(*this, "kbdc")
, m_ym2151_irq_state(CLEAR_LINE)
, m_ym2148_irq_state(CLEAR_LINE)
{
}
static MACHINE_CONFIG_FRAGMENT( msx_sfg01 )
// YM2151 (OPM)
// YM3012 (DAC)
// YM2148 (MKS)
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_YM2151_ADD("ym2151", XTAL_4MHz)
MCFG_YM2151_IRQ_HANDLER(WRITELINE(msx_cart_sfg01, ym2151_irq_w))
// MCFG_YM2151_PORT_WRITE_HANDLER(WRITE8(msx_cart_sfg01, port_w))
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_MSX_AUDIO_KBDC_PORT_ADD("kbdc", msx_audio_keyboards, NULL)
MACHINE_CONFIG_END
machine_config_constructor msx_cart_sfg01::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( msx_sfg01 );
}
ROM_START( msx_sfg01 )
ROM_REGION(0x4000, "sfg01", 0)
ROM_LOAD("sfg01.rom", 0x0, 0x4000, CRC(0995fb36) SHA1(434651305f92aa770a89e40b81125fb22d91603d))
ROM_END
const rom_entry *msx_cart_sfg01::device_rom_region() const
{
return ROM_NAME( msx_sfg01 );
}
void msx_cart_sfg01::device_start()
{
}
void msx_cart_sfg01::initialize_cartridge()
{
}
WRITE_LINE_MEMBER(msx_cart_sfg01::ym2151_irq_w)
{
m_ym2151_irq_state = state ? ASSERT_LINE : CLEAR_LINE;
check_irq();
}
WRITE_LINE_MEMBER(msx_cart_sfg01::ym2148_irq_w)
{
m_ym2148_irq_state = state ? ASSERT_LINE : CLEAR_LINE;
check_irq();
}
void msx_cart_sfg01::check_irq()
{
if (m_ym2151_irq_state != CLEAR_LINE || m_ym2148_irq_state != CLEAR_LINE)
{
m_out_irq_cb(ASSERT_LINE);
}
else
{
m_out_irq_cb(CLEAR_LINE);
}
}
READ8_MEMBER(msx_cart_sfg01::read_cart)
{
switch (offset)
{
case 0x3ff0: // YM-2151 status read
case 0x3ff1: // YM-2151 status read mirror?
return m_ym2151->status_r(space, 0);
case 0x3ff2: // YM-2148 keyboard column read
return m_kbdc->read(space, 0);
case 0x3ff3: // YM-2148 --
case 0x3ff4: // YM-2148 --
case 0x3ff5: // YM-2148 MIDI UART data read register
case 0x3ff6: // YM-2148 MIDI UART status register
break;
}
if (offset < 0x8000)
{
return m_region_sfg01->u8(offset & 0x3fff);
}
return 0xff;
}
WRITE8_MEMBER(msx_cart_sfg01::write_cart)
{
switch (offset)
{
case 0x3ff0: // YM-2151 register
m_ym2151->register_w(space, 0, data);
break;
case 0x3ff1: // YM-2151 data
m_ym2151->data_w(space, 0, data);
break;
case 0x3ff2: // YM-2148 write keyboard row
m_kbdc->write(space, 0, data);
break;
case 0x3ff3: // YM-2148 MIDI IRQ vector
case 0x3ff4: // YM-2148 External IRQ vector
case 0x3ff5: // YM-2148 MIDI UART data write register
case 0x3ff6: // YM-2148 MIDI UART command register
default:
logerror("msx_cart_sfg01::write_cart: write %02x to %04x\n", data, offset);
break;
}
}

View File

@ -0,0 +1,43 @@
#ifndef __MSX_CART_YAMAHA_H
#define __MSX_CART_YAMAHA_H
#include "bus/msx_cart/cartridge.h"
#include "sound/2151intf.h"
#include "bus/msx_cart/msx_audio_kb.h"
extern const device_type MSX_CART_SFG01;
//extern const device_type MSX_CART_SFG05;
class msx_cart_sfg01 : public device_t
, public msx_cart_interface
{
public:
msx_cart_sfg01(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual const rom_entry *device_rom_region() const;
virtual void device_start();
virtual void initialize_cartridge();
virtual DECLARE_READ8_MEMBER(read_cart);
virtual DECLARE_WRITE8_MEMBER(write_cart);
DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
DECLARE_WRITE_LINE_MEMBER(ym2148_irq_w);
private:
required_memory_region m_region_sfg01;
required_device<ym2151_device> m_ym2151;
required_device<msx_audio_kbdc_port_device> m_kbdc;
int m_ym2151_irq_state;
int m_ym2148_irq_state;
void check_irq();
};
#endif

View File

@ -28,6 +28,7 @@ enum
const device_type MSX_SLOT_CARTRIDGE = &device_creator<msx_slot_cartridge_device>;
const device_type MSX_SLOT_YAMAHA_EXPANSION = &device_creator<msx_slot_yamaha_expansion_device>;
msx_slot_cartridge_device::msx_slot_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
@ -35,6 +36,19 @@ msx_slot_cartridge_device::msx_slot_cartridge_device(const machine_config &mconf
, device_image_interface(mconfig, *this)
, device_slot_interface(mconfig, *this)
, msx_internal_slot_interface()
, m_irq_handler(*this)
, m_cartridge(NULL)
{
}
msx_slot_cartridge_device::msx_slot_cartridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source)
, device_image_interface(mconfig, *this)
, device_slot_interface(mconfig, *this)
, msx_internal_slot_interface()
, m_irq_handler(*this)
, m_cartridge(NULL)
{
}
@ -81,6 +95,7 @@ static const char *msx_cart_get_slot_option(int type)
void msx_slot_cartridge_device::device_start()
{
m_irq_handler.resolve_safe();
m_cartridge = dynamic_cast<msx_cart_interface *>(get_card_device());
}
@ -133,6 +148,7 @@ bool msx_slot_cartridge_device::call_load()
}
}
m_cartridge->set_out_irq_cb(DEVCB_WRITELINE(msx_slot_cartridge_device, irq_out));
m_cartridge->initialize_cartridge();
if (m_cartridge->get_sram_size() > 0)
@ -163,6 +179,12 @@ bool msx_slot_cartridge_device::call_softlist_load(software_list_device &swlist,
}
WRITE_LINE_MEMBER(msx_slot_cartridge_device::irq_out)
{
m_irq_handler(state);
}
int msx_slot_cartridge_device::get_cart_type(UINT8 *rom, UINT32 length)
{
if (length < 0x2000)
@ -315,3 +337,23 @@ WRITE8_MEMBER(msx_slot_cartridge_device::write)
}
}
msx_slot_yamaha_expansion_device::msx_slot_yamaha_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: msx_slot_cartridge_device(mconfig, MSX_SLOT_YAMAHA_EXPANSION, "MSX Yamaha Expansion slot", tag, owner, clock, "msx_slot_yamaha_expansion", __FILE__)
{
}
void msx_slot_yamaha_expansion_device::device_start()
{
m_irq_handler.resolve_safe();
m_cartridge = dynamic_cast<msx_cart_interface *>(get_card_device());
if (m_cartridge)
{
m_cartridge->set_out_irq_cb(DEVCB_WRITELINE(msx_slot_cartridge_device, irq_out));
}
}

View File

@ -6,11 +6,19 @@
extern const device_type MSX_SLOT_CARTRIDGE;
extern const device_type MSX_SLOT_YAMAHA_EXPANSION;
#define MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag) \
#define MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag, _devcb) \
MCFG_DEVICE_ADD(_tag, MSX_SLOT_CARTRIDGE, 0) \
MCFG_DEVICE_SLOT_INTERFACE(msx_cart, NULL, false)
MCFG_DEVICE_SLOT_INTERFACE(msx_cart, NULL, false) \
devcb = &msx_slot_cartridge_device::set_irq_handler(*device, DEVCB_##_devcb);
#define MCFG_MSX_SLOT_YAMAHA_EXPANSION_ADD(_tag, _devcb) \
MCFG_DEVICE_ADD(_tag, MSX_SLOT_YAMAHA_EXPANSION, 0) \
MCFG_DEVICE_SLOT_INTERFACE(msx_yamaha_60pin, NULL, false) \
devcb = &msx_slot_cartridge_device::set_irq_handler(*device, DEVCB_##_devcb);
class msx_slot_cartridge_device : public device_t
@ -20,8 +28,12 @@ class msx_slot_cartridge_device : public device_t
{
public:
// construction/destruction
msx_slot_cartridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
msx_slot_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast<msx_slot_cartridge_device &>(device).m_irq_handler.set_callback(object); }
// device-level overrides
virtual void device_start();
virtual void device_config_complete() { update_names(MSX_SLOT_CARTRIDGE, "cartridge", "cart"); }
@ -47,11 +59,25 @@ public:
virtual DECLARE_READ8_MEMBER(read);
virtual DECLARE_WRITE8_MEMBER(write);
private:
DECLARE_WRITE_LINE_MEMBER(irq_out);
protected:
devcb_write_line m_irq_handler;
msx_cart_interface *m_cartridge;
int get_cart_type(UINT8 *rom, UINT32 length);
};
class msx_slot_yamaha_expansion_device : public msx_slot_cartridge_device
{
public:
// construction/destruction
msx_slot_yamaha_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual void device_start();
};
#endif

View File

@ -1244,7 +1244,7 @@ static MACHINE_CONFIG_DERIVED( msx_ntsc, msx )
/* Video hardware */
MCFG_DEVICE_ADD( "tms9928a", TMS9928A, XTAL_10_738635MHz / 2 )
MCFG_TMS9928A_VRAM_SIZE(0x4000)
MCFG_TMS9928A_OUT_INT_LINE_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(msx_state,msx_irq_source0))
MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" )
MCFG_SCREEN_UPDATE_DEVICE("tms9928a", tms9928a_device, screen_update)
MACHINE_CONFIG_END
@ -1254,7 +1254,7 @@ static MACHINE_CONFIG_DERIVED( msx_pal, msx )
/* Video hardware */
MCFG_DEVICE_ADD( "tms9928a", TMS9929A, XTAL_10_738635MHz / 2 )
MCFG_TMS9928A_VRAM_SIZE(0x4000)
MCFG_TMS9928A_OUT_INT_LINE_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(msx_state,msx_irq_source0))
MCFG_TMS9928A_SCREEN_ADD_PAL( "screen" )
MCFG_SCREEN_UPDATE_DEVICE("tms9928a", tms9928a_device, screen_update)
MACHINE_CONFIG_END
@ -1285,7 +1285,7 @@ static MACHINE_CONFIG_START( msx2, msx_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", 0x20000)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_vdp_interrupt))
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_irq_source0))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
@ -1353,7 +1353,7 @@ static MACHINE_CONFIG_START( msx2p, msx_state )
/* video hardware */
MCFG_V9958_ADD("v9958", "screen", 0x20000)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_vdp_interrupt))
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_irq_source0))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
@ -2774,12 +2774,14 @@ static MACHINE_CONFIG_DERIVED( cx5m, msx_pal )
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
// 1 Expansion slot (60 pins interface instead of regular 50 pin cartridge interface)
MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
MCFG_MSX_LAYOUT_ROM("sfg", 3, 0, 0, 2, "maincpu", 0x8000) /* SFG */
MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 0)
// MCFG_MSX_LAYOUT_ROM("sfg", 3, 0, 0, 2, "maincpu", 0x8000) /* SFG */
MCFG_FRAGMENT_ADD( msx1_cartlist )
MACHINE_CONFIG_END

View File

@ -53,7 +53,11 @@
msx_state::install_slot_pages(*owner, _prim, _sec, _page, _numpages, device);
#define MCFG_MSX_LAYOUT_CARTRIDGE(_tag, _prim, _sec) \
MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag) \
MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag, WRITELINE(msx_state, msx_irq_source1)) \
msx_state::install_slot_pages(*owner, _prim, _sec, 0, 4, device);
#define MCFG_MSX_LAYOUT_YAMAHA_EXPANSION(_tag, _prim, _sec) \
MCFG_MSX_SLOT_YAMAHA_EXPANSION_ADD(_tag, WRITELINE(msx_state, msx_irq_source2)) \
msx_state::install_slot_pages(*owner, _prim, _sec, 0, 4, device);
#define MCFG_MSX_LAYOUT_RAM_MM(_tag, _prim, _sec, _total_size) \
@ -148,6 +152,10 @@ public:
}
m_mouse[0] = m_mouse[1] = 0;
m_mouse_stat[0] = m_mouse_stat[1] = 0;
for (int i = 0; i < ARRAY_LENGTH(m_irq_state); i++)
{
m_irq_state[i] = CLEAR_LINE;
}
}
// static configuration helpers
@ -218,7 +226,10 @@ public:
DECLARE_WRITE8_MEMBER(msx_ay8910_w);
void msx_memory_init();
DECLARE_WRITE_LINE_MEMBER(msx_vdp_interrupt);
DECLARE_WRITE_LINE_MEMBER(msx_irq_source0) { msx_irq_source(0, state); } // usually tms9918/v9938/v9958
DECLARE_WRITE_LINE_MEMBER(msx_irq_source1) { msx_irq_source(1, state); } // usually first cartridge slot
DECLARE_WRITE_LINE_MEMBER(msx_irq_source2) { msx_irq_source(2, state); } // usually second cartridge slot
DECLARE_WRITE_LINE_MEMBER(msx_irq_source3) { msx_irq_source(3, state); } // sometimes expansion slot
protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == 0) ? &m_switched_device_as_config : NULL; }
@ -237,6 +248,12 @@ protected:
required_ioport m_io_key3;
required_ioport m_io_key4;
required_ioport m_io_key5;
private:
int m_irq_state[4];
void msx_irq_source(int source, int level);
void check_irq();
};

View File

@ -16,15 +16,40 @@
#define VERBOSE 0
WRITE_LINE_MEMBER(msx_state::msx_vdp_interrupt)
void msx_state::msx_irq_source(int source, int level)
{
m_maincpu->set_input_line(0, (state ? ASSERT_LINE : CLEAR_LINE));
assert(source >= 0 && source < ARRAY_LENGTH(m_irq_state));
m_irq_state[source] = level;
check_irq();
}
void msx_state::check_irq()
{
int state = CLEAR_LINE;
for (int i = 0; i < ARRAY_LENGTH(m_irq_state); i++)
{
if (m_irq_state[i] != CLEAR_LINE)
{
state = ASSERT_LINE;
}
}
m_maincpu->set_input_line(0, state);
}
void msx_state::msx_ch_reset_core ()
{
msx_memory_reset ();
msx_memory_map_all ();
for (int i = 0; i < ARRAY_LENGTH(m_irq_state); i++)
{
m_irq_state[i] = CLEAR_LINE;
}
check_irq();
}
MACHINE_START_MEMBER(msx_state,msx)