From 954b9ff18e67bbdb63a22545adedc4997a42d277 Mon Sep 17 00:00:00 2001 From: Wilbert Pol Date: Mon, 2 Dec 2013 22:42:23 +0000 Subject: [PATCH] (MESS) New working driver Nichibutsu My Vision (KH-1000) [ranger_lennier, Charles MacDonald, Wilbert Pol] --- .gitattributes | 2 + hash/myvision.xml | 64 +++++++++ src/mess/drivers/myvision.c | 275 ++++++++++++++++++++++++++++++++++++ src/mess/mess.lst | 2 + src/mess/mess.mak | 1 + 5 files changed, 344 insertions(+) create mode 100644 hash/myvision.xml create mode 100644 src/mess/drivers/myvision.c diff --git a/.gitattributes b/.gitattributes index 8dc12e94b7d..bb84c8809d7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -167,6 +167,7 @@ hash/msx1_cart.xml svneol=native#text/xml hash/msx1_cass.xml svneol=native#text/xml hash/msx2.hsi svneol=native#text/plain hash/msx2_cart.xml svneol=native#text/xml +hash/myvision.xml svneol=native#text/xml hash/mz2000_cass.xml svneol=native#text/xml hash/mz2000_flop.xml svneol=native#text/xml hash/mz2500.xml svneol=native#text/xml @@ -7071,6 +7072,7 @@ src/mess/drivers/multi16.c svneol=native#text/plain src/mess/drivers/multi8.c svneol=native#text/plain src/mess/drivers/myb3k.c svneol=native#text/plain src/mess/drivers/mycom.c svneol=native#text/plain +src/mess/drivers/myvision.c svneol=native#text/plain src/mess/drivers/mz2000.c svneol=native#text/plain src/mess/drivers/mz2500.c svneol=native#text/plain src/mess/drivers/mz3500.c svneol=native#text/plain diff --git a/hash/myvision.xml b/hash/myvision.xml new file mode 100644 index 00000000000..53ce2831a57 --- /dev/null +++ b/hash/myvision.xml @@ -0,0 +1,64 @@ + + + + + + Gomoku Narabe Renju + 1983 + Nihonbussan + + + + + + + + + + + + Hanafuda + 1983 + Logitec Corp. + + + + + + + + + + + + + Mahjong Nichibutsu + 1983 + Nihonbussan + + + + + + + + + + + + + Tsumeshougi + 1983 + Logitec Corp. + + + + + + + + + + + + diff --git a/src/mess/drivers/myvision.c b/src/mess/drivers/myvision.c new file mode 100644 index 00000000000..51aefd24953 --- /dev/null +++ b/src/mess/drivers/myvision.c @@ -0,0 +1,275 @@ +// license:BSD +// copyright-holders:Wilbert Pol +/*************************************************************************** + + Nichibutsu My Vision + driver by Wilbert Pol + + 2013/12/01 Skeleton driver. + 2013/12/02 Working driver. + + Known issues: + - The inputs sometimes feel a bit unresponsive. Was the real unit like + that? Or is it just because we have incorrect clocks? + + TODO: + - Review software list + - Implement cnd figure out ontrols + - Add clickable artwork + - Verify sound chip model + - Verify exact TMS9918 model + - Verify clock crystal(s) + - Verify size of vram + +****************************************************************************/ + + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "imagedev/cartslot.h" +#include "video/tms9928a.h" +#include "sound/ay8910.h" + + +class myvision_state : public driver_device +{ +public: + myvision_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_io_row0(*this, "ROW0") + , m_io_row1(*this, "ROW1") + , m_io_row2(*this, "ROW2") + , m_io_row3(*this, "ROW3") + { } + + DECLARE_WRITE_LINE_MEMBER( vdp_interrupt ); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( cart ); + DECLARE_READ8_MEMBER( ay_port_a_r ); + DECLARE_READ8_MEMBER( ay_port_b_r ); + DECLARE_WRITE8_MEMBER( ay_port_a_w ); + DECLARE_WRITE8_MEMBER( ay_port_b_w ); + +private: + virtual void machine_start(); + virtual void machine_reset(); + required_device m_maincpu; + UINT8 m_column; + required_ioport m_io_row0; + required_ioport m_io_row1; + required_ioport m_io_row2; + required_ioport m_io_row3; +}; + + +static ADDRESS_MAP_START(myvision_mem, AS_PROGRAM, 8, myvision_state) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE( 0x0000, 0x5fff ) AM_ROM + AM_RANGE( 0xa000, 0xa7ff ) AM_RAM + AM_RANGE(0xe000, 0xe000) AM_DEVREADWRITE("tms9918", tms9918a_device, vram_read, vram_write) + AM_RANGE(0xe002, 0xe002) AM_DEVREADWRITE("tms9918", tms9918a_device, register_read, register_write) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START(myvision_io, AS_IO, 8, myvision_state) + ADDRESS_MAP_UNMAP_HIGH + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_DEVWRITE("ay8910", ay8910_device, address_w) + AM_RANGE(0x01, 0x01) AM_DEVWRITE("ay8910", ay8910_device, data_w) + AM_RANGE(0x02, 0x02) AM_DEVREAD("ay8910", ay8910_device, data_r) +ADDRESS_MAP_END + + +/* Input ports */ +/* + Keyboard layout is something like: + B + A D E + C + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + */ +static INPUT_PORTS_START( myvision ) + PORT_START("ROW0") + PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("13") PORT_CODE(KEYCODE_G) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) // C + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("9") PORT_CODE(KEYCODE_A) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("5") PORT_CODE(KEYCODE_T) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("1") PORT_CODE(KEYCODE_Q) + + PORT_START("ROW1") + PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("12") PORT_CODE(KEYCODE_F) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("8") PORT_CODE(KEYCODE_I) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("4") PORT_CODE(KEYCODE_R) + + PORT_START("ROW2") + PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_START) PORT_NAME("14/Start") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) // D + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("10") PORT_CODE(KEYCODE_S) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("6") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("2") PORT_CODE(KEYCODE_W) + + PORT_START("ROW3") + PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) // E + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("11") PORT_CODE(KEYCODE_D) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("7") PORT_CODE(KEYCODE_U) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("3") PORT_CODE(KEYCODE_E) + +INPUT_PORTS_END + + +void myvision_state::machine_start() +{ + save_item(NAME(m_column)); +} + + +void myvision_state::machine_reset() +{ + m_column = 0xff; +} + + +DEVICE_IMAGE_LOAD_MEMBER( myvision_state, cart ) +{ + UINT8 *cart = memregion("maincpu")->base(); + + if (image.software_entry() == NULL) + { + UINT32 filesize = image.length(); + + if (filesize != 0x4000 && filesize != 0x6000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Incorrect or not support cartridge size"); + return IMAGE_INIT_FAIL; + } + + if (image.fread( cart, filesize) != filesize) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Error loading file"); + return IMAGE_INIT_FAIL; + } + } + else + { + memcpy(cart, image.get_software_region("rom"), image.get_software_region_length("rom")); + } + + return IMAGE_INIT_PASS; +} + + +WRITE_LINE_MEMBER(myvision_state::vdp_interrupt) +{ + m_maincpu->set_input_line(INPUT_LINE_IRQ0, state); +} + + +static TMS9928A_INTERFACE(myvision_tms9918a_interface) +{ + 0x4000, /* Not verified */ + DEVCB_DRIVER_LINE_MEMBER(myvision_state,vdp_interrupt) +}; + + +READ8_MEMBER( myvision_state::ay_port_a_r ) +{ + UINT8 data = 0xFF; + + if ( ! ( m_column & 0x80 ) ) + { + data &= m_io_row0->read(); + } + + if ( ! ( m_column & 0x40 ) ) + { + data &= m_io_row1->read(); + } + + if ( ! ( m_column & 0x20 ) ) + { + data &= m_io_row2->read(); + } + + if ( ! ( m_column & 0x10 ) ) + { + data &= m_io_row3->read(); + } + + return data; +} + + +READ8_MEMBER( myvision_state::ay_port_b_r ) +{ + return 0xFF; +} + + +WRITE8_MEMBER( myvision_state::ay_port_a_w ) +{ +} + + +// Upper 4 bits select column +WRITE8_MEMBER( myvision_state::ay_port_b_w ) +{ + m_column = data; +} + + +static const ay8910_interface myvision_ay8910_interface = +{ + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_DRIVER_MEMBER(myvision_state, ay_port_a_r), + DEVCB_DRIVER_MEMBER(myvision_state, ay_port_b_r), + DEVCB_DRIVER_MEMBER(myvision_state, ay_port_a_w), + DEVCB_DRIVER_MEMBER(myvision_state, ay_port_b_w) +}; + + +static MACHINE_CONFIG_START( myvision, myvision_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu",Z80, XTAL_10_738635MHz/3) /* Not verified */ + MCFG_CPU_PROGRAM_MAP(myvision_mem) + MCFG_CPU_IO_MAP(myvision_io) + + /* video hardware */ + MCFG_TMS9928A_ADD( "tms9918", TMS9918A, myvision_tms9918a_interface ) /* Exact model not verified */ + MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9918", tms9918a_device, screen_update ) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("ay8910", AY8910, XTAL_10_738635MHz/3/2) /* Exact model and clock not verified */ + MCFG_SOUND_CONFIG(myvision_ay8910_interface) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + /* cartridge */ + MCFG_CARTSLOT_ADD("cart") + MCFG_CARTSLOT_EXTENSION_LIST("bin") + MCFG_CARTSLOT_MANDATORY + MCFG_CARTSLOT_LOAD(myvision_state,cart) + MCFG_CARTSLOT_INTERFACE("myvision_cart") + + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("cart_list","myvision") +MACHINE_CONFIG_END + +/* ROM definition */ +ROM_START( myvision ) + ROM_REGION( 0x6000, "maincpu", ROMREGION_ERASEFF ) +ROM_END + +/* Driver */ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ +COMP( 1983, myvision, 0, 0, myvision, myvision, driver_device, 0, "Nichibutsu", "My Vision (KH-1000)", 0 ) + diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 4138a50c85d..8f2dc9588d8 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2298,3 +2298,5 @@ taitons1 sh4robot mcb216 cb308 +myvision + diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 4044f362d34..fcb8b2cb070 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2185,6 +2185,7 @@ $(MESSOBJ)/skeleton.a: \ $(MESS_DRIVERS)/ms9540.o \ $(MESS_DRIVERS)/mstation.o \ $(MESS_DRIVERS)/mycom.o \ + $(MESS_DRIVERS)/myvision.o \ $(MESS_DRIVERS)/octopus.o \ $(MESS_DRIVERS)/onyx.o \ $(MESS_DRIVERS)/okean240.o \