diff --git a/.gitattributes b/.gitattributes index a94eab432ae..7ac57617c6c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index 8c3140d1a7f..e736f1c7a0e 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -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 diff --git a/src/emu/bus/msx_cart/cartridge.c b/src/emu/bus/msx_cart/cartridge.c index 905fb25d136..3111e72275e 100644 --- a/src/emu/bus/msx_cart/cartridge.c +++ b/src/emu/bus/msx_cart/cartridge.c @@ -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 + diff --git a/src/emu/bus/msx_cart/cartridge.h b/src/emu/bus/msx_cart/cartridge.h index bcd51c263a7..7df0dc662a4 100644 --- a/src/emu/bus/msx_cart/cartridge.h +++ b/src/emu/bus/msx_cart/cartridge.h @@ -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 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; }; diff --git a/src/emu/bus/msx_cart/msx_audio.c b/src/emu/bus/msx_cart/msx_audio.c index 0d108be875f..c6fc781feb6 100644 --- a/src/emu/bus/msx_cart/msx_audio.c +++ b/src/emu/bus/msx_cart/msx_audio.c @@ -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 diff --git a/src/emu/bus/msx_cart/msx_audio.h b/src/emu/bus/msx_cart/msx_audio.h index e7552ad30c2..9d5711c1145 100644 --- a/src/emu/bus/msx_cart/msx_audio.h +++ b/src/emu/bus/msx_cart/msx_audio.h @@ -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 m_y8950; diff --git a/src/emu/bus/msx_cart/yamaha.c b/src/emu/bus/msx_cart/yamaha.c new file mode 100644 index 00000000000..4b5c7ef4230 --- /dev/null +++ b/src/emu/bus/msx_cart/yamaha.c @@ -0,0 +1,143 @@ +#include "emu.h" +#include "yamaha.h" + + +const device_type MSX_CART_SFG01 = &device_creator; + + +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; + } +} + diff --git a/src/emu/bus/msx_cart/yamaha.h b/src/emu/bus/msx_cart/yamaha.h new file mode 100644 index 00000000000..90e9b1b5f6c --- /dev/null +++ b/src/emu/bus/msx_cart/yamaha.h @@ -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 m_ym2151; + required_device m_kbdc; + int m_ym2151_irq_state; + int m_ym2148_irq_state; + + void check_irq(); +}; + +#endif + diff --git a/src/emu/bus/msx_slot/cartridge.c b/src/emu/bus/msx_slot/cartridge.c index 199d1c8a1b7..c3eabedcb9d 100644 --- a/src/emu/bus/msx_slot/cartridge.c +++ b/src/emu/bus/msx_slot/cartridge.c @@ -28,6 +28,7 @@ enum const device_type MSX_SLOT_CARTRIDGE = &device_creator; +const device_type MSX_SLOT_YAMAHA_EXPANSION = &device_creator; 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(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(get_card_device()); + if (m_cartridge) + { + m_cartridge->set_out_irq_cb(DEVCB_WRITELINE(msx_slot_cartridge_device, irq_out)); + } +} + + diff --git a/src/emu/bus/msx_slot/cartridge.h b/src/emu/bus/msx_slot/cartridge.h index 6716dc3ca14..1ca3ebfff61 100644 --- a/src/emu/bus/msx_slot/cartridge.h +++ b/src/emu/bus/msx_slot/cartridge.h @@ -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 static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(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 diff --git a/src/mess/drivers/msx.c b/src/mess/drivers/msx.c index 5c3c6d8c961..42f2f3ea235 100644 --- a/src/mess/drivers/msx.c +++ b/src/mess/drivers/msx.c @@ -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 diff --git a/src/mess/includes/msx.h b/src/mess/includes/msx.h index e910de14676..1facdb7aef4 100644 --- a/src/mess/includes/msx.h +++ b/src/mess/includes/msx.h @@ -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(); }; diff --git a/src/mess/machine/msx.c b/src/mess/machine/msx.c index 9b635c9fb2f..5cc78cfa073 100644 --- a/src/mess/machine/msx.c +++ b/src/mess/machine/msx.c @@ -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)