summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-03-04 13:09:58 +0100
committer hap <happppp@users.noreply.github.com>2021-03-04 13:10:10 +0100
commitd65c5159f16d942fccc3c0420ed166e5fe85b64f (patch)
tree164c93d492bde1c32534fde2b411027749bcca7c /src/devices
parent2d692d7570ae0a3c8819adfa09ac3001171f74c8 (diff)
pps41: add skeleton MM76-derived devices
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/cpu/cops1/mm5799.cpp12
-rw-r--r--src/devices/cpu/pps41/mm75.cpp27
-rw-r--r--src/devices/cpu/pps41/mm75.h52
-rw-r--r--src/devices/cpu/pps41/mm75op.cpp16
-rw-r--r--src/devices/cpu/pps41/mm76.cpp45
-rw-r--r--src/devices/cpu/pps41/mm76.h56
-rw-r--r--src/devices/cpu/pps41/mm76op.cpp4
-rw-r--r--src/devices/cpu/pps41/pps41base.cpp6
-rw-r--r--src/devices/cpu/pps41/pps41base.h1
9 files changed, 199 insertions, 20 deletions
diff --git a/src/devices/cpu/cops1/mm5799.cpp b/src/devices/cpu/cops1/mm5799.cpp
index 85f6674806d..7f6515760a4 100644
--- a/src/devices/cpu/cops1/mm5799.cpp
+++ b/src/devices/cpu/cops1/mm5799.cpp
@@ -15,6 +15,12 @@
DEFINE_DEVICE_TYPE(MM5799, mm5799_device, "mm5799", "National Semiconductor MM5799")
+// constructor
+mm5799_device::mm5799_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ cops1_base_device(mconfig, MM5799, tag, owner, clock, 11, address_map_constructor(FUNC(mm5799_device::program_map), this), 7, address_map_constructor(FUNC(mm5799_device::data_map), this))
+{ }
+
+
// internal memory maps
void mm5799_device::program_map(address_map &map)
{
@@ -41,12 +47,6 @@ void mm5799_device::data_map(address_map &map)
}
-// device definitions
-mm5799_device::mm5799_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- cops1_base_device(mconfig, MM5799, tag, owner, clock, 11, address_map_constructor(FUNC(mm5799_device::program_map), this), 7, address_map_constructor(FUNC(mm5799_device::data_map), this))
-{ }
-
-
// disasm
std::unique_ptr<util::disasm_interface> mm5799_device::create_disassembler()
{
diff --git a/src/devices/cpu/pps41/mm75.cpp b/src/devices/cpu/pps41/mm75.cpp
new file mode 100644
index 00000000000..a0fe7e2bc40
--- /dev/null
+++ b/src/devices/cpu/pps41/mm75.cpp
@@ -0,0 +1,27 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Rockwell MM75 MCU
+
+*/
+
+#include "emu.h"
+#include "mm75.h"
+
+
+DEFINE_DEVICE_TYPE(MM75, mm75_device, "mm75", "Rockwell MM75")
+
+
+// constructor
+mm75_device::mm75_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm76_device(mconfig, MM75, tag, owner, clock, 10, address_map_constructor(FUNC(mm75_device::program_0_6k), this), 6, address_map_constructor(FUNC(mm75_device::data_48x4), this))
+{ }
+
+
+// initialize
+void mm75_device::device_start()
+{
+ mm76_device::device_start();
+ m_d_pins--;
+}
diff --git a/src/devices/cpu/pps41/mm75.h b/src/devices/cpu/pps41/mm75.h
new file mode 100644
index 00000000000..f2950207dc8
--- /dev/null
+++ b/src/devices/cpu/pps41/mm75.h
@@ -0,0 +1,52 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Rockwell MM75 MCU
+
+*/
+
+#ifndef MAME_CPU_PPS41_MM75_H
+#define MAME_CPU_PPS41_MM75_H
+
+#pragma once
+
+#include "mm76.h"
+
+// pinout reference
+
+/*
+ ____ ____
+ RIO8 1 |* \_/ | 28 RIO7
+ RIO1 2 | | 27 RIO6
+ RIO2 3 | | 26 RIO5
+ RIO3 4 | | 25 INT0
+ RIO4 5 | | 24 PO
+ DIO0 6 | | 23 PI4
+ DIO1 7 | MM75 | 22 PI3
+ DIO2 8 | | 21 PI2
+ DIO3 9 | | 20 PI1
+ DIO4 10 | | 19 TEST
+ DIO5 11 | | 18 Vdd
+ DIO6 12 | | 17 VC
+ DIO7 13 | | 16 A
+ Vss 14 |___________| 15 DIO8
+
+*/
+
+class mm75_device : public mm76_device
+{
+public:
+ mm75_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_start() override;
+
+ // opcode handlers
+ virtual void op_ios() override;
+};
+
+
+DECLARE_DEVICE_TYPE(MM75, mm75_device)
+
+#endif // MAME_CPU_PPS41_MM75_H
diff --git a/src/devices/cpu/pps41/mm75op.cpp b/src/devices/cpu/pps41/mm75op.cpp
new file mode 100644
index 00000000000..bea107b9fc4
--- /dev/null
+++ b/src/devices/cpu/pps41/mm75op.cpp
@@ -0,0 +1,16 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+
+// MM75 opcode handlers
+
+#include "emu.h"
+#include "mm75.h"
+
+
+// opcodes (differences with mm76_device)
+
+void mm75_device::op_ios()
+{
+ // IOS: does not have serial I/O
+ op_illegal();
+}
diff --git a/src/devices/cpu/pps41/mm76.cpp b/src/devices/cpu/pps41/mm76.cpp
index c7fdfb42555..2981467c0ac 100644
--- a/src/devices/cpu/pps41/mm76.cpp
+++ b/src/devices/cpu/pps41/mm76.cpp
@@ -13,26 +13,54 @@
DEFINE_DEVICE_TYPE(MM76, mm76_device, "mm76", "Rockwell MM76")
+DEFINE_DEVICE_TYPE(MM76L, mm76l_device, "mm76l", "Rockwell MM76L")
+DEFINE_DEVICE_TYPE(MM76E, mm76e_device, "mm76e", "Rockwell MM76E")
+DEFINE_DEVICE_TYPE(MM76EL, mm76el_device, "mm76el", "Rockwell MM76EL")
+
+
+// constructor
+mm76_device::mm76_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm76_device(mconfig, MM76, tag, owner, clock, 10, address_map_constructor(FUNC(mm76_device::program_0_6k), this), 6, address_map_constructor(FUNC(mm76_device::data_48x4), this))
+{ }
+
+mm76_device::mm76_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) :
+ pps41_base_device(mconfig, type, tag, owner, clock, prgwidth, program, datawidth, data)
+{ }
+
+mm76l_device::mm76l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm76_device(mconfig, MM76L, tag, owner, clock, 10, address_map_constructor(FUNC(mm76l_device::program_0_6k), this), 6, address_map_constructor(FUNC(mm76l_device::data_48x4), this))
+{ }
+
+mm76e_device::mm76e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm76e_device(mconfig, MM76E, tag, owner, clock, 10, address_map_constructor(FUNC(mm76e_device::program_1k), this), 6, address_map_constructor(FUNC(mm76e_device::data_48x4), this))
+{ }
+
+mm76e_device::mm76e_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) :
+ mm76_device(mconfig, type, tag, owner, clock, prgwidth, program, datawidth, data)
+{ }
+
+mm76el_device::mm76el_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm76e_device(mconfig, MM76EL, tag, owner, clock, 10, address_map_constructor(FUNC(mm76el_device::program_1k), this), 6, address_map_constructor(FUNC(mm76el_device::data_48x4), this))
+{ }
// internal memory maps
-void mm76_device::program_map(address_map &map)
+void mm76_device::program_0_6k(address_map &map)
{
map(0x000, 0x17f).mirror(0x200).rom();
map(0x180, 0x1ff).rom();
map(0x380, 0x3ff).rom();
}
-void mm76_device::data_map(address_map &map)
+void mm76e_device::program_1k(address_map &map)
{
- map(0x00, 0x2f).ram();
+ map(0x000, 0x3ff).rom();
}
-
-// device definitions
-mm76_device::mm76_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- pps41_base_device(mconfig, MM76, tag, owner, clock, 10, address_map_constructor(FUNC(mm76_device::program_map), this), 6, address_map_constructor(FUNC(mm76_device::data_map), this))
-{ }
+void mm76_device::data_48x4(address_map &map)
+{
+ map(0x00, 0x2f).ram();
+}
// machine config
@@ -54,6 +82,7 @@ void mm76_device::device_start()
{
pps41_base_device::device_start();
m_stack_levels = 1;
+ m_d_pins = 10;
}
void mm76_device::device_reset()
diff --git a/src/devices/cpu/pps41/mm76.h b/src/devices/cpu/pps41/mm76.h
index 8df0866f80a..2bc3c7af670 100644
--- a/src/devices/cpu/pps41/mm76.h
+++ b/src/devices/cpu/pps41/mm76.h
@@ -16,7 +16,28 @@
// pinout reference
/*
-...
+ ____ ____ ____ ____
+ A 1 |* \_/ | 42 BP BP 1 |* \_/ | 40 A
+ EXCLK 2 | | 41 DIO9 VC 2 | | 39 DIO9
+ CLKIN 3 | | 40 DIO8 XTLIN 3 | | 38 DIO8
+ VC 4 | | 39 N/C XTLOUT 4 | | 37 DIO7
+ Vdd 5 | | 38 DIO7 Vdd 5 | | 36 DIO6
+ Vss 6 | | 37 DIO6 PI2 6 | | 35 DIO5
+ TEST 7 | | 36 DIO5 TEST 7 | | 34 DIO4
+ PI2 8 | | 35 DIO4 PI6 8 | | 33 DIO3
+ PI6 9 | | 34 DIO3 PI1 9 | | 32 DIO2
+ PI1 10 | MM76 | 33 DIO2 PI5 10 | MM76L | 31 DIO1
+ PI5 11 | MM76E | 32 DIO1 PI7 11 | MM76EL | 30 DIO0
+ PI7 12 | | 31 DIO0 PI3 12 | | 29 CLOCK
+ PI3 13 | | 30 CLOCK PI8 13 | | 28 DATAO
+ PI8 14 | | 29 DATAO PI4 14 | | 27 DATAI
+ PI4 15 | | 28 DATAI PO 15 | | 26 RIO4
+ Vdd 16 | | 27 RIO4 INT0 16 | | 25 RIO3
+ PO 17 | | 26 RIO3 INT1 17 | | 24 RIO2
+ INT0 18 | | 25 RIO2 RIO5 18 | | 23 RIO1
+ INT1 19 | | 24 RIO1 RIO6 19 | | 22 RIO8
+ RIO5 20 | | 23 RIO8 Vss 20 |___________| 21 RIO7
+ RIO6 21 |___________| 22 RIO7
*/
@@ -26,6 +47,8 @@ public:
mm76_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
+ mm76_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);
+
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -37,8 +60,8 @@ protected:
// device_execute_interface overrides
virtual void execute_one() override;
- void data_map(address_map &map);
- void program_map(address_map &map);
+ void data_48x4(address_map &map);
+ void program_0_6k(address_map &map);
// opcode helpers
u8 ram_r();
@@ -51,9 +74,36 @@ protected:
// opcode handlers
void op_nop();
+ virtual void op_ios();
+};
+
+class mm76l_device : public mm76_device
+{
+public:
+ mm76l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class mm76e_device : public mm76_device
+{
+public:
+ mm76e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ mm76e_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);
+
+ void program_1k(address_map &map);
+};
+
+class mm76el_device : public mm76e_device
+{
+public:
+ mm76el_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(MM76, mm76_device)
+DECLARE_DEVICE_TYPE(MM76L, mm76l_device)
+DECLARE_DEVICE_TYPE(MM76E, mm76e_device)
+DECLARE_DEVICE_TYPE(MM76EL, mm76el_device)
#endif // MAME_CPU_PPS41_MM76_H
diff --git a/src/devices/cpu/pps41/mm76op.cpp b/src/devices/cpu/pps41/mm76op.cpp
index 55b1980f859..f0560fee9d8 100644
--- a/src/devices/cpu/pps41/mm76op.cpp
+++ b/src/devices/cpu/pps41/mm76op.cpp
@@ -44,3 +44,7 @@ void mm76_device::op_illegal()
void mm76_device::op_nop()
{
}
+
+void mm76_device::op_ios()
+{
+}
diff --git a/src/devices/cpu/pps41/pps41base.cpp b/src/devices/cpu/pps41/pps41base.cpp
index 55cf0506171..2766fead2cf 100644
--- a/src/devices/cpu/pps41/pps41base.cpp
+++ b/src/devices/cpu/pps41/pps41base.cpp
@@ -12,8 +12,8 @@ Part numbers:
- A76xx = MM76 - 42 pin spider
- A77xx = MM77 - 42 pin spider
- A78xx = MM78 - 42 pin spider
-- A79xx = MM76C - 52 pin spider
-- A86xx = MM76E - 42 pin spider
+- A79xx = MM76C - 52 pin spider - counter
+- A86xx = MM76E - 42 pin spider - extended ROM
- B76xx = MM76L - 40 pin dip
- B77xx = MM77L - 40 pin dip
- B78xx = MM78L - 40 pin dip
@@ -21,7 +21,7 @@ Part numbers:
- B90xx = MM78LA - 42 pin spider
"spider" = 2 rows of pins on each side, just like standard PPS-4 CPUs.
-"L" only difference is low-power
+"L" main difference is low-power
References:
- Series MM76 Product Description
diff --git a/src/devices/cpu/pps41/pps41base.h b/src/devices/cpu/pps41/pps41base.h
index b8b42a44a78..3f8459c8002 100644
--- a/src/devices/cpu/pps41/pps41base.h
+++ b/src/devices/cpu/pps41/pps41base.h
@@ -69,6 +69,7 @@ protected:
u8 m_prev2_op;
int m_stack_levels;
u16 m_stack[2]; // max 2
+ int m_d_pins;
u8 m_a;
u8 m_b;