summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/cpu/mb88xx/mb88xx.c28
-rw-r--r--src/emu/cpu/mb88xx/mb88xx.h18
-rw-r--r--src/emu/machine/eepromser.c2
-rw-r--r--src/emu/machine/eepromser.h7
-rw-r--r--src/mess/drivers/pve500.c45
5 files changed, 95 insertions, 5 deletions
diff --git a/src/emu/cpu/mb88xx/mb88xx.c b/src/emu/cpu/mb88xx/mb88xx.c
index d613c7a989e..b2696c6071d 100644
--- a/src/emu/cpu/mb88xx/mb88xx.c
+++ b/src/emu/cpu/mb88xx/mb88xx.c
@@ -19,6 +19,8 @@
const device_type MB88 = &device_creator<mb88_cpu_device>;
+const device_type MB88201 = &device_creator<mb88201_cpu_device>;
+const device_type MB88202 = &device_creator<mb88202_cpu_device>;
const device_type MB8841 = &device_creator<mb8841_cpu_device>;
const device_type MB8842 = &device_creator<mb8842_cpu_device>;
const device_type MB8843 = &device_creator<mb8843_cpu_device>;
@@ -76,6 +78,10 @@ const device_type MB8844 = &device_creator<mb8844_cpu_device>;
ADDRESS MAPS
***************************************************************************/
+static ADDRESS_MAP_START(program_9bit, AS_PROGRAM, 8, mb88_cpu_device)
+ AM_RANGE(0x000, 0x1ff) AM_ROM
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START(program_10bit, AS_PROGRAM, 8, mb88_cpu_device)
AM_RANGE(0x000, 0x3ff) AM_ROM
ADDRESS_MAP_END
@@ -84,6 +90,14 @@ static ADDRESS_MAP_START(program_11bit, AS_PROGRAM, 8, mb88_cpu_device)
AM_RANGE(0x000, 0x7ff) AM_ROM
ADDRESS_MAP_END
+static ADDRESS_MAP_START(data_4bit, AS_DATA, 8, mb88_cpu_device)
+ AM_RANGE(0x00, 0x0f) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(data_5bit, AS_DATA, 8, mb88_cpu_device)
+ AM_RANGE(0x00, 0x1f) AM_RAM
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START(data_6bit, AS_DATA, 8, mb88_cpu_device)
AM_RANGE(0x00, 0x3f) AM_RAM
ADDRESS_MAP_END
@@ -105,13 +119,23 @@ mb88_cpu_device::mb88_cpu_device(const machine_config &mconfig, const char *tag,
mb88_cpu_device::mb88_cpu_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, int program_width, int data_width)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
- , m_program_config("program", ENDIANNESS_BIG, 8, program_width, 0, ( (program_width == 10) ? ADDRESS_MAP_NAME(program_10bit) : ADDRESS_MAP_NAME(program_11bit) ) )
- , m_data_config("data", ENDIANNESS_BIG, 8, data_width, 0, ( (data_width == 6) ? ADDRESS_MAP_NAME(data_6bit) : ADDRESS_MAP_NAME(data_7bit) ) )
+ , m_program_config("program", ENDIANNESS_BIG, 8, program_width, 0, ( (program_width == 9) ? ADDRESS_MAP_NAME(program_9bit) : (program_width == 10) ? ADDRESS_MAP_NAME(program_10bit) : ADDRESS_MAP_NAME(program_11bit) ) )
+ , m_data_config("data", ENDIANNESS_BIG, 8, data_width, 0, ( (data_width == 4) ? ADDRESS_MAP_NAME(data_4bit) : (data_width == 5) ? ADDRESS_MAP_NAME(data_5bit) : (data_width == 6) ? ADDRESS_MAP_NAME(data_6bit) : ADDRESS_MAP_NAME(data_7bit) ) )
, m_io_config("io", ENDIANNESS_BIG, 8, 3, 0)
, m_PLA(NULL)
{
}
+mb88201_cpu_device::mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : mb88_cpu_device(mconfig, MB88201, "MB88201", tag, owner, clock, "mb88201", __FILE__, 9, 4)
+{
+}
+
+mb88202_cpu_device::mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : mb88_cpu_device(mconfig, MB88202, "MB88202", tag, owner, clock, "mb88202", __FILE__, 10, 5)
+{
+}
+
mb8841_cpu_device::mb8841_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: mb88_cpu_device(mconfig, MB8841, "MB8841", tag, owner, clock, "mb8841", __FILE__, 11, 7)
diff --git a/src/emu/cpu/mb88xx/mb88xx.h b/src/emu/cpu/mb88xx/mb88xx.h
index 254df96f266..38ecbf802c2 100644
--- a/src/emu/cpu/mb88xx/mb88xx.h
+++ b/src/emu/cpu/mb88xx/mb88xx.h
@@ -155,6 +155,22 @@ private:
};
+class mb88201_cpu_device : public mb88_cpu_device
+{
+public:
+ // construction/destruction
+ mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
+
+class mb88202_cpu_device : public mb88_cpu_device
+{
+public:
+ // construction/destruction
+ mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
+
class mb8841_cpu_device : public mb88_cpu_device
{
public:
@@ -188,6 +204,8 @@ public:
extern const device_type MB88;
+extern const device_type MB88201;
+extern const device_type MB88202;
extern const device_type MB8841;
extern const device_type MB8842;
extern const device_type MB8843;
diff --git a/src/emu/machine/eepromser.c b/src/emu/machine/eepromser.c
index 5b5d8a5b70a..3b1f05bdc94 100644
--- a/src/emu/machine/eepromser.c
+++ b/src/emu/machine/eepromser.c
@@ -1154,6 +1154,8 @@ DEFINE_SERIAL_EEPROM_DEVICE(93cxx, 93c86, 93C86, 8, 2048, 11)
// ER5911 has a separate ready pin, a reduced command set, and supports 8/16 bit out of the box
DEFINE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 8, 128, 9)
DEFINE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 16, 64, 8)
+DEFINE_SERIAL_EEPROM_DEVICE(er5911, msm16911, MSM16911, 8, 128, 9)
+DEFINE_SERIAL_EEPROM_DEVICE(er5911, msm16911, MSM16911, 16, 64, 8)
// X24c44 8 bit 32byte ram/eeprom combo
DEFINE_SERIAL_EEPROM_DEVICE(x24c44, x24c44, X24C44, 16, 16, 4)
diff --git a/src/emu/machine/eepromser.h b/src/emu/machine/eepromser.h
index ace9f253f1b..49161ba883f 100644
--- a/src/emu/machine/eepromser.h
+++ b/src/emu/machine/eepromser.h
@@ -56,6 +56,11 @@
#define MCFG_EEPROM_SERIAL_ER5911_16BIT_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_ER5911_16BIT, 0)
+#define MCFG_EEPROM_SERIAL_MSM16911_8BIT_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_MSM16911_8BIT, 0)
+#define MCFG_EEPROM_SERIAL_MSM16911_16BIT_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_MSM16911_16BIT, 0)
+
// X24c44 16 bit ram/eeprom combo
#define MCFG_EEPROM_SERIAL_X24C44_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_X24C44_16BIT, 0)
@@ -282,6 +287,8 @@ DECLARE_SERIAL_EEPROM_DEVICE(93cxx, 93c86, 93C86, 8)
// ER5911 has a separate ready pin, a reduced command set, and supports 8/16 bit out of the box
DECLARE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 8)
DECLARE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 16)
+DECLARE_SERIAL_EEPROM_DEVICE(er5911, msm16911, MSM16911, 8)
+DECLARE_SERIAL_EEPROM_DEVICE(er5911, msm16911, MSM16911, 16)
// X24c44 8 bit 32byte ram/eeprom combo
DECLARE_SERIAL_EEPROM_DEVICE(x24c44, x24c44, X24C44, 16)
diff --git a/src/mess/drivers/pve500.c b/src/mess/drivers/pve500.c
index 149ad32410b..7446b9d4ffa 100644
--- a/src/mess/drivers/pve500.c
+++ b/src/mess/drivers/pve500.c
@@ -19,7 +19,7 @@
SELFdIAG Error___ _F3 F3_CtC3c
which means it detected an error in the CTC circuitry (it means we're emulating it wrong!)
- F3 is the coordinate of the subcpu EEPROM chip in the PCB.
+ F3 is the coordinate of the subcpu EPROM chip in the PCB.
According to the service manual, this error code means: "ICF3 CTC CH-3 counter operation failure (No interruption)"
@@ -46,10 +46,12 @@
#include "emu.h"
#include "cpu/z80/tmpz84c015.h"
+#include "cpu/mb88xx/mb88xx.h"
#include "sound/beep.h"
#include "bus/rs232/rs232.h" /* actually meant to be RS422 ports */
#include "pve500.lh"
#include "machine/mb8421.h"
+#include "machine/eepromser.h"
#define IO_EXPANDER_PORTA 0
#define IO_EXPANDER_PORTB 1
@@ -64,6 +66,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_subcpu(*this, "subcpu")
+ , m_eeprom(*this, "eeprom")
, m_buzzer(*this, "buzzer")
{ }
@@ -74,12 +77,15 @@ public:
DECLARE_WRITE8_MEMBER(io_expander_w);
DECLARE_READ8_MEMBER(io_expander_r);
+ DECLARE_WRITE8_MEMBER(eeprom_w);
+ DECLARE_READ8_MEMBER(eeprom_r);
DECLARE_DRIVER_INIT(pve500);
private:
virtual void machine_start();
virtual void machine_reset();
required_device<tmpz84c015_device> m_maincpu;
required_device<tmpz84c015_device> m_subcpu;
+ required_device<eeprom_serial_er5911_device> m_eeprom;
required_device<beep_device> m_buzzer;
UINT8 io_SEL, io_LD, io_LE, io_SC, io_KY;
};
@@ -110,7 +116,7 @@ static ADDRESS_MAP_START(maincpu_io, AS_IO, 8, pve500_state)
ADDRESS_MAP_END
static ADDRESS_MAP_START(maincpu_prg, AS_PROGRAM, 8, pve500_state)
- AM_RANGE (0x0000, 0xBFFF) AM_ROM // ICB7: 48kbytes EEPROM
+ AM_RANGE (0x0000, 0xBFFF) AM_ROM // ICB7: 48kbytes EPROM
AM_RANGE (0xC000, 0xDFFF) AM_RAM // ICD6: 8kbytes of RAM
AM_RANGE (0xE000, 0xE7FF) AM_MIRROR(0x1800) AM_DEVREADWRITE("mb8421", mb8421_device, left_r, left_w)
ADDRESS_MAP_END
@@ -120,7 +126,7 @@ static ADDRESS_MAP_START(subcpu_io, AS_IO, 8, pve500_state)
ADDRESS_MAP_END
static ADDRESS_MAP_START(subcpu_prg, AS_PROGRAM, 8, pve500_state)
- AM_RANGE (0x0000, 0x7FFF) AM_ROM // ICG5: 32kbytes EEPROM
+ AM_RANGE (0x0000, 0x7FFF) AM_ROM // ICG5: 32kbytes EPROM
AM_RANGE (0x8000, 0xBFFF) AM_MIRROR(0x3FF8) AM_READWRITE(io_expander_r, io_expander_w) // ICG3: I/O Expander
AM_RANGE (0xC000, 0xC7FF) AM_MIRROR(0x3800) AM_DEVREADWRITE("mb8421", mb8421_device, right_r, right_w)
ADDRESS_MAP_END
@@ -246,6 +252,18 @@ WRITE_LINE_MEMBER(pve500_state::mb8421_intr)
m_subcpu->trg1(state);
}
+READ8_MEMBER(pve500_state::eeprom_r)
+{
+ return (m_eeprom->ready_read() << 1) | m_eeprom->do_read();
+}
+
+WRITE8_MEMBER(pve500_state::eeprom_w)
+{
+ m_eeprom->di_write( (data & (1 << 2)) ? ASSERT_LINE : CLEAR_LINE);
+ m_eeprom->clk_write( (data & (1 << 3)) ? ASSERT_LINE : CLEAR_LINE);
+ m_eeprom->cs_write( (data & (1 << 4)) ? ASSERT_LINE : CLEAR_LINE);
+}
+
READ8_MEMBER(pve500_state::io_expander_r)
{
// printf("READ IO_EXPANDER_PORT%c\n", 'A'+offset);
@@ -356,6 +374,18 @@ static MACHINE_CONFIG_START( pve500, pve500_state )
MCFG_TMPZ84C015_OUT_TXDA_CB(DEVWRITELINE("switcher", rs232_port_device, write_txd))
MCFG_TMPZ84C015_OUT_TXDB_CB(DEVWRITELINE("serial_mixer", rs232_port_device, write_txd))
+ // PIO callbacks
+ MCFG_TMPZ84C015_IN_PA_CB(READ8(pve500_state, eeprom_r))
+ MCFG_TMPZ84C015_OUT_PA_CB(WRITE8(pve500_state, eeprom_w))
+
+ /* Search Dial MCUs */
+ MCFG_CPU_ADD("dial_mcu_left", MB88201, XTAL_4MHz) /* PLAYER DIAL MCU */
+ MCFG_CPU_ADD("dial_mcu_right", MB88201, XTAL_4MHz) /* RECORDER DIAL MCU */
+
+ /* Serial EEPROM (128 bytes, 8-bit data organization) */
+ /* The EEPROM stores the setup data */
+ MCFG_EEPROM_SERIAL_MSM16911_8BIT_ADD("eeprom")
+
/* FIX-ME: These are actually RS422 ports (except EDL IN/OUT which is indeed an RS232 port)*/
MCFG_RS232_PORT_ADD("recorder", default_rs232_devices, NULL)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("maincpu", tmpz84c015_device, rxa_w))
@@ -396,6 +426,15 @@ ROM_START( pve500 )
ROM_REGION( 0x8000, "subcpu", 0 )
ROM_LOAD("pve500.icg5", 0x00000, 0x8000, CRC(28cca60a) SHA1(308d70062653769250327ede7a4e1a8a76fc9ab9) ) //32kbyte sub-cpu program
+
+ ROM_REGION( 0x200, "dial_mcu_left", 0 ) /* PLAYER DIAL MCU */
+ ROM_LOAD( "pve500.icd3", 0x0000, 0x0200, NO_DUMP )
+
+ ROM_REGION( 0x200, "dial_mcu_right", 0 ) /* RECORDER DIAL MCU */
+ ROM_LOAD( "pve500.icc3", 0x0000, 0x0200, NO_DUMP )
+
+ ROM_REGION( 0x80, "eeprom", 0 ) /* The EEPROM stores the setup data */
+ ROM_LOAD( "pve500.ice3", 0x0000, 0x080, NO_DUMP )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */