diff options
-rw-r--r-- | src/emu/cpu/mb88xx/mb88xx.c | 28 | ||||
-rw-r--r-- | src/emu/cpu/mb88xx/mb88xx.h | 18 | ||||
-rw-r--r-- | src/emu/machine/eepromser.c | 2 | ||||
-rw-r--r-- | src/emu/machine/eepromser.h | 7 | ||||
-rw-r--r-- | src/mess/drivers/pve500.c | 45 |
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 */ |