From fae6b8c00e04ef9f5f807f689eb49c8733bf8bce Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Tue, 18 Dec 2012 01:58:22 +0000 Subject: [PATCH] Another magician trick, this time with PC-9801-118 (preliminary) --- .gitattributes | 2 + src/mess/drivers/pc9801.c | 5 +- src/mess/machine/pc9801_118.c | 227 ++++++++++++++++++++++++++++++++++ src/mess/machine/pc9801_118.h | 67 ++++++++++ src/mess/machine/pc9801_26.h | 4 - src/mess/machine/pc9801_86.c | 3 + src/mess/machine/pc9801_86.h | 7 +- src/mess/mess.mak | 1 + 8 files changed, 304 insertions(+), 12 deletions(-) create mode 100644 src/mess/machine/pc9801_118.c create mode 100644 src/mess/machine/pc9801_118.h diff --git a/.gitattributes b/.gitattributes index 1d63c8ae8bb..22b6d315384 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7173,6 +7173,8 @@ src/mess/machine/pc1401.c svneol=native#text/plain src/mess/machine/pc1403.c svneol=native#text/plain src/mess/machine/pc1512kb.c svneol=native#text/plain src/mess/machine/pc1512kb.h svneol=native#text/plain +src/mess/machine/pc9801_118.c svneol=native#text/plain +src/mess/machine/pc9801_118.h svneol=native#text/plain src/mess/machine/pc9801_26.c svneol=native#text/plain src/mess/machine/pc9801_26.h svneol=native#text/plain src/mess/machine/pc9801_86.c svneol=native#text/plain diff --git a/src/mess/drivers/pc9801.c b/src/mess/drivers/pc9801.c index 2e5b39ae07d..6d2dbe89e71 100644 --- a/src/mess/drivers/pc9801.c +++ b/src/mess/drivers/pc9801.c @@ -329,6 +329,7 @@ #include "formats/pc98fdi_dsk.h" #include "machine/pc9801_26.h" #include "machine/pc9801_86.h" +#include "machine/pc9801_118.h" #include "machine/pc9801_cbus.h" @@ -3283,7 +3284,7 @@ static SLOT_INTERFACE_START( pc9801_cbus ) // PC-9801-86 // PC-9801-26 + PC-9801-86 (?) // PC-9801-86 + Chibi-Oto -// PC-9801-118 + SLOT_INTERFACE( "pc9801_118", PC9801_118 ) // Speak Board // Spark Board // AMD-98 (AmuseMent boarD) @@ -3589,7 +3590,7 @@ static MACHINE_CONFIG_FRAGMENT( pc9801_mouse ) MACHINE_CONFIG_END static MACHINE_CONFIG_FRAGMENT( pc9801_cbus ) - MCFG_PC9801CBUS_SLOT_ADD("cbus0", pc9801_cbus, NULL, NULL) + MCFG_PC9801CBUS_SLOT_ADD("cbus0", pc9801_cbus, "pc9801_26", NULL) // TODO: six max slots MACHINE_CONFIG_END diff --git a/src/mess/machine/pc9801_118.c b/src/mess/machine/pc9801_118.c new file mode 100644 index 00000000000..065b9b37f71 --- /dev/null +++ b/src/mess/machine/pc9801_118.c @@ -0,0 +1,227 @@ +/*************************************************************************** + + NEC PC-9801-118 sound card + + YMF288 + some extra ports + + TODO: + - preliminary, presumably needs CS-4231 too + +***************************************************************************/ + +#include "emu.h" +#include "machine/pc9801_118.h" +#include "machine/pic8259.h" +#include "sound/2608intf.h" + +#define MAIN_CLOCK_X1 XTAL_1_9968MHz + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type PC9801_118 = &device_creator; + + +READ8_MEMBER(pc9801_118_device::opn_porta_r) +{ + if(m_joy_sel == 0x80) + return ioport("OPNA_PA1")->read(); + + if(m_joy_sel == 0xc0) + return ioport("OPNA_PA2")->read(); + +// 0x81? +// printf("%02x\n",m_joy_sel); + return 0xff; +} + +WRITE8_MEMBER(pc9801_118_device::opn_portb_w){ m_joy_sel = data; } + +static void pc9801_sound_irq( device_t *device, int irq ) +{ +// pc9801_state *state = device->machine().driver_data(); + + /* TODO: seems to die very often */ + pic8259_ir4_w(device->machine().device("pic8259_slave"), irq); +} + +static const ym2608_interface pc98_ym2608_intf = +{ + { + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pc9801_118_device,opn_porta_r), + DEVCB_NULL,//(pc9801_state,opn_portb_r), + DEVCB_NULL,//(pc9801_state,opn_porta_w), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pc9801_118_device,opn_portb_w), + }, + pc9801_sound_irq +}; + +static MACHINE_CONFIG_FRAGMENT( pc9801_118_config ) + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("opn3", YM2608, MAIN_CLOCK_X1*4) // actually YMF288, unknown clock / divider + MCFG_SOUND_CONFIG(pc98_ym2608_intf) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) +MACHINE_CONFIG_END + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor pc9801_118_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( pc9801_118_config ); +} + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +static INPUT_PORTS_START( pc9801_118 ) + PORT_START("OPNA_PA1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Up") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Down") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Left") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Right") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 1") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 2") + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("OPNA_PA2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Up") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Down") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Left") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Right") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 1") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 2") + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +ioport_constructor pc9801_118_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( pc9801_118 ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// pc9801_118_device - constructor +//------------------------------------------------- + +pc9801_118_device::pc9801_118_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PC9801_118, "pc9801_118", tag, owner, clock), +// m_maincpu(*owner, "maincpu"), + m_opn3(*this, "opn3") +{ + +} + + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void pc9801_118_device::device_validity_check(validity_checker &valid) const +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void pc9801_118_device::install_device(offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_delegate rhandler, write8_delegate whandler) +{ + int buswidth = machine().firstcpu->space_config(AS_IO)->m_databus_width; + switch(buswidth) + { + case 8: + machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0); + break; + case 16: + machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0xffff); + break; + case 32: + machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0xffffffff); + break; + default: + fatalerror("PC-9801-118: Bus width %d not supported\n", buswidth); + break; + } +} + + +void pc9801_118_device::device_start() +{ + install_device(0x0188, 0x018f, 0, 0, read8_delegate(FUNC(pc9801_118_device::pc9801_118_r), this), write8_delegate(FUNC(pc9801_118_device::pc9801_118_w), this) ); + install_device(0xa460, 0xa463, 0, 0, read8_delegate(FUNC(pc9801_118_device::pc9801_118_ext_r), this), write8_delegate(FUNC(pc9801_118_device::pc9801_118_ext_w), this) ); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void pc9801_118_device::device_reset() +{ + m_ext_reg = 1; // TODO: enabled or disabled? +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + + +READ8_MEMBER(pc9801_118_device::pc9801_118_r) +{ + if(((offset & 5) == 0) || m_ext_reg) + return ym2608_r(m_opn3, space, offset >> 1); + else // odd + { + //printf("PC9801-118: Read to undefined port [%02x]\n",offset+0x188); + return 0xff; + } +} + + +WRITE8_MEMBER(pc9801_118_device::pc9801_118_w) +{ + if(((offset & 5) == 0) || m_ext_reg) + ym2608_w(m_opn3,space, offset >> 1,data); + //else // odd + // printf("PC9801-118: Write to undefined port [%02x] %02x\n",offset+0x188,data); +} + +READ8_MEMBER( pc9801_118_device::pc9801_118_ext_r ) +{ + if(offset == 0) + { + printf("OPN3 EXT read ID [%02x]\n",offset); + return 0x80 | (m_ext_reg & 1); + } + + printf("OPN3 EXT read unk [%02x]\n",offset); + return 0xff; +} + +WRITE8_MEMBER( pc9801_118_device::pc9801_118_ext_w ) +{ + if(offset == 0) + { + m_ext_reg = data & 1; + /* TODO: apparently writing a 1 doubles the available channels (and presumably enables CS-4231 too) */ + if(data) + printf("PC-9801-118: extended register %02x write\n",data); + return; + } + + printf("OPN3 EXT write unk %02x -> [%02x]\n",data,offset); +} diff --git a/src/mess/machine/pc9801_118.h b/src/mess/machine/pc9801_118.h new file mode 100644 index 00000000000..f106e57d46f --- /dev/null +++ b/src/mess/machine/pc9801_118.h @@ -0,0 +1,67 @@ +/*************************************************************************** + + NEC PC-9801-118 + +***************************************************************************/ + + +#pragma once + +#ifndef __PC9801_118DEV_H__ +#define __PC9801_118DEV_H__ + +#include "machine/pic8259.h" +#include "sound/2608intf.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> pc9801_118_device + +class pc9801_118_device : public device_t +{ +public: + // construction/destruction + pc9801_118_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + + DECLARE_READ8_MEMBER(opn_porta_r); + DECLARE_WRITE8_MEMBER(opn_portb_w); + DECLARE_READ8_MEMBER(pc9801_118_r); + DECLARE_WRITE8_MEMBER(pc9801_118_w); + DECLARE_READ8_MEMBER(pc9801_118_ext_r); + DECLARE_WRITE8_MEMBER(pc9801_118_ext_w); + +// required_device m_maincpu; + required_device m_opn3; +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); + virtual void device_config_complete() { m_shortname = "pc9801_118"; } + void install_device(offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_delegate rhandler, write8_delegate whandler); + +private: + UINT8 m_joy_sel; + UINT8 m_ext_reg; +}; + + +// device type definition +extern const device_type PC9801_118; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff --git a/src/mess/machine/pc9801_26.h b/src/mess/machine/pc9801_26.h index 536603d31ae..fc72a9b0d6d 100644 --- a/src/mess/machine/pc9801_26.h +++ b/src/mess/machine/pc9801_26.h @@ -13,10 +13,6 @@ Template for skeleton device #include "machine/pic8259.h" #include "sound/2203intf.h" -#define MCFG_PC9801_26_SLOT_ADD(_tag, _slot_intf, _def_slot, _def_inp) \ - MCFG_DEVICE_ADD(_tag, PC9801_26, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) - //************************************************************************** // TYPE DEFINITIONS diff --git a/src/mess/machine/pc9801_86.c b/src/mess/machine/pc9801_86.c index 5ca0d721469..1d56014daf7 100644 --- a/src/mess/machine/pc9801_86.c +++ b/src/mess/machine/pc9801_86.c @@ -5,6 +5,9 @@ Almost the same thing as PC-9801-86, but this one has YM2608 instead of YM2203 + TODO: + - i/o port base jumper + ***************************************************************************/ #include "emu.h" diff --git a/src/mess/machine/pc9801_86.h b/src/mess/machine/pc9801_86.h index 830b2084c94..f44b45100f5 100644 --- a/src/mess/machine/pc9801_86.h +++ b/src/mess/machine/pc9801_86.h @@ -1,6 +1,6 @@ /*************************************************************************** -Template for skeleton device + NEC PC-9801-86 ***************************************************************************/ @@ -13,11 +13,6 @@ Template for skeleton device #include "machine/pic8259.h" #include "sound/2608intf.h" -#define MCFG_PC9801_86_SLOT_ADD(_tag, _slot_intf, _def_slot, _def_inp) \ - MCFG_DEVICE_ADD(_tag, PC9801_86, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) - - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 7f20b4b35dd..a640696f5a5 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1473,6 +1473,7 @@ $(MESSOBJ)/pc.a: \ $(MESSOBJ)/pc9801.a: \ $(MESS_MACHINE)/pc9801_26.o \ $(MESS_MACHINE)/pc9801_86.o \ + $(MESS_MACHINE)/pc9801_118.o \ $(MESS_MACHINE)/pc9801_cbus.o \ $(MESSOBJ)/pcshare.a: \