summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-03-08 15:51:52 +0100
committer hap <happppp@users.noreply.github.com>2021-03-08 15:52:04 +0100
commit82461369ffcff4761881a51e64213e109578968d (patch)
tree07aab65a903cf11da7ce9ef18a18ef4e7f119dad /src/devices
parente8cdd0068533a4aaa614a5baf56f9bb61829b9d9 (diff)
pps41: added mm78 disasm and mm77/mm78 skeleton device
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/cpu/pps41/mm75op.cpp2
-rw-r--r--src/devices/cpu/pps41/mm76op.cpp2
-rw-r--r--src/devices/cpu/pps41/mm78.cpp109
-rw-r--r--src/devices/cpu/pps41/mm78.h107
-rw-r--r--src/devices/cpu/pps41/mm78op.cpp14
-rw-r--r--src/devices/cpu/pps41/pps41base.cpp24
-rw-r--r--src/devices/cpu/pps41/pps41base.h2
-rw-r--r--src/devices/cpu/pps41/pps41d.cpp56
-rw-r--r--src/devices/cpu/pps41/pps41d.h23
9 files changed, 319 insertions, 20 deletions
diff --git a/src/devices/cpu/pps41/mm75op.cpp b/src/devices/cpu/pps41/mm75op.cpp
index 93e61af3ae9..e4ef365a03e 100644
--- a/src/devices/cpu/pps41/mm75op.cpp
+++ b/src/devices/cpu/pps41/mm75op.cpp
@@ -25,7 +25,7 @@ void mm75_device::op_i2c()
}
-// slightly different opcodes
+// changed opcodes
void mm75_device::op_ibm()
{
diff --git a/src/devices/cpu/pps41/mm76op.cpp b/src/devices/cpu/pps41/mm76op.cpp
index 0b50cfeb9dc..b95944cbd37 100644
--- a/src/devices/cpu/pps41/mm76op.cpp
+++ b/src/devices/cpu/pps41/mm76op.cpp
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:hap
-// MM76 opcode handlers
+// MM76/shared opcode handlers
#include "emu.h"
#include "mm76.h"
diff --git a/src/devices/cpu/pps41/mm78.cpp b/src/devices/cpu/pps41/mm78.cpp
new file mode 100644
index 00000000000..62a013e33d3
--- /dev/null
+++ b/src/devices/cpu/pps41/mm78.cpp
@@ -0,0 +1,109 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Rockwell MM77/MM78 MCU
+
+*/
+
+#include "emu.h"
+#include "mm78.h"
+
+#include "pps41d.h"
+
+
+DEFINE_DEVICE_TYPE(MM78, mm78_device, "mm78", "Rockwell MM78") // 2KB bytes ROM, 128 nibbles RAM
+DEFINE_DEVICE_TYPE(MM78L, mm78l_device, "mm78l", "Rockwell MM78L") // low-power
+DEFINE_DEVICE_TYPE(MM77, mm77_device, "mm77", "Rockwell MM77") // 1.3KB ROM, 96 nibbles RAM
+DEFINE_DEVICE_TYPE(MM77L, mm77l_device, "mm77l", "Rockwell MM77L") // 1.5KB ROM, low-power
+
+
+// constructor
+mm78_device::mm78_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm78_device(mconfig, MM78, tag, owner, clock, 11, address_map_constructor(FUNC(mm78_device::program_2k), this), 7, address_map_constructor(FUNC(mm78_device::data_128x4), this))
+{ }
+
+mm78_device::mm78_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)
+{ }
+
+mm78l_device::mm78l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm78_device(mconfig, MM78L, tag, owner, clock, 11, address_map_constructor(FUNC(mm78l_device::program_2k), this), 7, address_map_constructor(FUNC(mm78l_device::data_128x4), this))
+{ }
+
+mm77_device::mm77_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm77_device(mconfig, MM77, tag, owner, clock, 11, address_map_constructor(FUNC(mm77_device::program_1_3k), this), 7, address_map_constructor(FUNC(mm77_device::data_96x4), this))
+{ }
+
+mm77_device::mm77_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) :
+ mm78_device(mconfig, type, tag, owner, clock, prgwidth, program, datawidth, data)
+{ }
+
+mm77l_device::mm77l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm77_device(mconfig, MM77L, tag, owner, clock, 11, address_map_constructor(FUNC(mm77l_device::program_1_5k), this), 7, address_map_constructor(FUNC(mm77l_device::data_96x4), this))
+{ }
+
+
+// internal memory maps
+void mm78_device::program_2k(address_map &map)
+{
+ map(0x000, 0x7ff).rom();
+}
+
+void mm77_device::program_1_3k(address_map &map)
+{
+ map(0x040, 0x1ff).rom();
+ map(0x240, 0x3ff).rom();
+ map(0x640, 0x7ff).rom();
+}
+
+void mm77l_device::program_1_5k(address_map &map)
+{
+ map(0x000, 0x3ff).rom();
+ map(0x600, 0x7ff).rom();
+}
+
+void mm78_device::data_128x4(address_map &map)
+{
+ map(0x00, 0x7f).ram();
+}
+
+void mm77_device::data_96x4(address_map &map)
+{
+ map(0x00, 0x3f).ram();
+ map(0x40, 0x47).mirror(0x18).ram(); // not to 0x50
+ map(0x50, 0x57).ram();
+ map(0x60, 0x67).mirror(0x18).ram(); // not to 0x70
+ map(0x70, 0x77).ram();
+}
+
+
+// disasm
+std::unique_ptr<util::disasm_interface> mm78_device::create_disassembler()
+{
+ return std::make_unique<mm78_disassembler>();
+}
+
+
+// initialize
+void mm78_device::device_start()
+{
+ mm76_device::device_start();
+ m_stack_levels = 2;
+
+ state_add(++m_state_count, "X", m_x).formatstr("%01X");
+}
+
+void mm78_device::device_reset()
+{
+ mm76_device::device_reset();
+}
+
+
+//-------------------------------------------------
+// execute
+//-------------------------------------------------
+
+void mm78_device::execute_one()
+{
+}
diff --git a/src/devices/cpu/pps41/mm78.h b/src/devices/cpu/pps41/mm78.h
new file mode 100644
index 00000000000..a2262bacdec
--- /dev/null
+++ b/src/devices/cpu/pps41/mm78.h
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Rockwell MM77/MM78 MCU
+
+*/
+
+#ifndef MAME_CPU_PPS41_MM78_H
+#define MAME_CPU_PPS41_MM78_H
+
+#pragma once
+
+#include "mm76.h"
+
+// pinout reference
+
+/*
+ ____ ____ ____ ____
+ BP 1 |* \_/ | 42 DIO9 BP 1 |* \_/ | 40 DIO9
+ A 2 | | 41 DIO8 A 2 | | 39 DIO8
+ CLKIN 3 | | 40 DIO7 XTLOUT 3 | | 38 DIO7
+ EXCLK 4 | | 39 DIO6 XTLIN 4 | | 37 DIO6
+ VC 5 | | 38 DIO5 VC 5 | | 36 DIO5
+ Vdd 6 | | 37 DIO4 Vdd 6 | | 35 DIO4
+ Vss 7 | | 36 DIO3 Vss 7 | | 34 DIO3
+ N/C 8 | | 35 DIO2 TEST 8 | | 33 DIO2
+ TEST 9 | | 34 DIO1 PI4 9 | | 32 DIO1
+ PI4 10 | MM78 | 33 DIO0 PI8 10 | MM78L | 31 DIO0
+ PI8 11 | MM77 | 32 INT1 PI3 11 | MM77L | 30 INT1
+ PI3 12 | | 31 INT0 PI7 12 | | 29 INT0
+ PI7 13 | | 30 DATAI PI6 13 | | 28 DATAI
+ PI6 14 | | 29 DATAO PI2 14 | | 27 DATAO
+ PI2 15 | | 28 CLOCK PI5 15 | | 26 CLOCK
+ PI5 16 | | 27 RIO4 PI1 16 | | 25 RIO4
+ Vdd 17 | | 26 RIO3 PO 17 | | 24 RIO3
+ PI1 18 | | 25 RIO2 RIO5 18 | | 23 RIO2
+ PO 19 | | 24 RIO1 RIO6 19 | | 22 RIO1
+ RIO5 20 | | 23 RIO8 RIO7 20 |___________| 21 RIO8
+ RIO6 21 |___________| 22 RIO7
+
+*/
+
+class mm78_device : public mm76_device
+{
+public:
+ mm78_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ mm78_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;
+ virtual void device_add_mconfig(machine_config &config) override { ; }
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ // device_execute_interface overrides
+ virtual void execute_one() override;
+
+ void data_128x4(address_map &map);
+ void program_2k(address_map &map);
+
+ // opcode helpers
+ virtual bool op_is_eob(u8 op) override { return (op & 0xf8) == 0x08; };
+ virtual bool op_is_lb(u8 op) override { return (op & 0xf0) == 0x10; };
+ virtual bool op_is_lai(u8 op) override { return (op & 0xf0) == 0x40; };
+
+ // opcode handlers
+};
+
+class mm78l_device : public mm78_device
+{
+public:
+ mm78l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class mm77_device : public mm78_device
+{
+public:
+ mm77_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ mm77_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 data_96x4(address_map &map);
+ void program_1_3k(address_map &map);
+};
+
+class mm77l_device : public mm77_device
+{
+public:
+ mm77l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ void program_1_5k(address_map &map);
+};
+
+
+DECLARE_DEVICE_TYPE(MM78, mm78_device)
+DECLARE_DEVICE_TYPE(MM78L, mm78l_device)
+DECLARE_DEVICE_TYPE(MM77, mm77_device)
+DECLARE_DEVICE_TYPE(MM77L, mm77l_device)
+
+#endif // MAME_CPU_PPS41_MM78_H
diff --git a/src/devices/cpu/pps41/mm78op.cpp b/src/devices/cpu/pps41/mm78op.cpp
new file mode 100644
index 00000000000..35f9980b212
--- /dev/null
+++ b/src/devices/cpu/pps41/mm78op.cpp
@@ -0,0 +1,14 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+
+// MM77/MM78 opcode handlers
+
+#include "emu.h"
+#include "mm78.h"
+
+
+// opcodes
+
+// changed opcodes
+
+// new opcodes
diff --git a/src/devices/cpu/pps41/pps41base.cpp b/src/devices/cpu/pps41/pps41base.cpp
index e28b99ff1ab..74352464aab 100644
--- a/src/devices/cpu/pps41/pps41base.cpp
+++ b/src/devices/cpu/pps41/pps41base.cpp
@@ -40,7 +40,8 @@ TODO:
flops with SOS/ROS opcodes
- add MCU mask options, there's one for inverting interrupts
- add serial i/o
-- add MM78
+- add MM78 opcodes
+- add MM78LA
*/
@@ -69,11 +70,6 @@ pps41_base_device::pps41_base_device(const machine_config &mconfig, device_type
// device_start - device-specific startup
//-------------------------------------------------
-enum
-{
- PPS41_PC=1, PPS41_A, PPS41_C, PPS41_B, PPS41_S
-};
-
void pps41_base_device::device_start()
{
m_program = &space(AS_PROGRAM);
@@ -113,6 +109,7 @@ void pps41_base_device::device_start()
m_c_in = 0;
m_c_delay = false;
m_s = 0;
+ m_x = 0;
m_skip = false;
m_skip_count = 0;
@@ -144,6 +141,7 @@ void pps41_base_device::device_start()
save_item(NAME(m_c_in));
save_item(NAME(m_c_delay));
save_item(NAME(m_s));
+ save_item(NAME(m_x));
save_item(NAME(m_skip));
save_item(NAME(m_skip_count));
@@ -155,12 +153,13 @@ void pps41_base_device::device_start()
// register state for debugger
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%03X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_prev_pc).formatstr("%03X").noshow();
- state_add(PPS41_PC, "PC", m_pc).formatstr("%03X");
- state_add(PPS41_A, "A", m_a).formatstr("%01X");
- state_add(PPS41_C, "C", m_c_in).formatstr("%01X");
- state_add(PPS41_B, "B", m_b).formatstr("%02X");
- state_add(PPS41_S, "S", m_s).formatstr("%01X");
+ m_state_count = 0;
+ state_add(++m_state_count, "PC", m_pc).formatstr("%03X");
+ state_add(++m_state_count, "A", m_a).formatstr("%01X");
+ state_add(++m_state_count, "C", m_c_in).formatstr("%01X");
+ state_add(++m_state_count, "B", m_b).formatstr("%02X");
+ state_add(++m_state_count, "S", m_s).formatstr("%01X");
set_icountptr(m_icount);
}
@@ -197,8 +196,7 @@ void pps41_base_device::device_reset()
void pps41_base_device::execute_set_input(int line, int state)
{
- // negative voltage, Vdd=0, Vss(GND)=1
- state = (state) ? 0 : 1;
+ state = (state) ? 1 : 0;
switch (line)
{
diff --git a/src/devices/cpu/pps41/pps41base.h b/src/devices/cpu/pps41/pps41base.h
index 24a35f56c32..e5f8029a4ac 100644
--- a/src/devices/cpu/pps41/pps41base.h
+++ b/src/devices/cpu/pps41/pps41base.h
@@ -62,6 +62,7 @@ protected:
address_space *m_data;
int m_icount;
+ int m_state_count;
// fixed settings or mask options
int m_prgwidth; // ROM/RAM address size
@@ -100,6 +101,7 @@ protected:
int m_c_in;
bool m_c_delay;
u8 m_s;
+ u8 m_x;
bool m_skip;
int m_skip_count;
diff --git a/src/devices/cpu/pps41/pps41d.cpp b/src/devices/cpu/pps41/pps41d.cpp
index 8925bb82c71..dc6fdeda0a0 100644
--- a/src/devices/cpu/pps41/pps41d.cpp
+++ b/src/devices/cpu/pps41/pps41d.cpp
@@ -34,6 +34,7 @@ offs_t pps41_common_disassembler::increment_pc(offs_t pc)
const char *const pps41_common_disassembler::s_name[] =
{
+ // MM76
"?",
"XAB", "LBA", "LB", "EOB",
"SB", "RB", "SKBF",
@@ -42,13 +43,19 @@ const char *const pps41_common_disassembler::s_name[] =
"A", "AC", "ACSK", "ASK", "COM", "RC", "SC", "SKNC", "LAI", "AISK",
"RT", "RTSK", "T", "NOP", "TL", "TM", "TML", "TR",
"SKMEA", "SKBEI", "SKAEI",
- "SOS", "ROS", "SKISL", "IBM", "OB", "IAM", "OA", "IOS", "I1", "I2C", "INT1H", "DIN1", "INT0L", "DIN0", "SEG1", "SEG2"
+ "SOS", "ROS", "SKISL", "IBM", "OB", "IAM", "OA", "IOS", "I1", "I2C", "INT1H", "DIN1", "INT0L", "DIN0", "SEG1", "SEG2",
+
+ // MM78
+ "INT0H", "INT1L", "SAG", "EOB", "TAB",
+ "I1SK", "IX", "OX", "LXA", "XAX", "IOA",
+ "TLB", "TMLB"
};
// number of bits per opcode parameter
-// note: d4 means hex, d5 means inverted, d6 means extended
+// note: d4 means hex, d5 means inverted, d6 means extended, d7 means double extended
const u8 pps41_common_disassembler::s_bits[] =
{
+ // MM76
0,
0, 0, 4, 2,
2, 2, 2,
@@ -58,10 +65,16 @@ const u8 pps41_common_disassembler::s_bits[] =
0, 0, 0x36, 0, 0x76, 0x36, 0x76, 0x34,
0, 0x40, 0x60,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ // MM78
+ 0, 0, 0, 3, 0,
+ 0, 0, 0, 0, 0, 0,
+ 0xf6, 0xf6
};
const u32 pps41_common_disassembler::s_flags[] =
{
+ // MM76
0,
0, 0, 0, 0,
0, 0, 0,
@@ -71,6 +84,11 @@ const u32 pps41_common_disassembler::s_flags[] =
STEP_OUT, STEP_OUT, 0, 0, 0, STEP_OVER, STEP_OVER, 0,
0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ // MM78
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 0, STEP_OVER
};
@@ -115,7 +133,7 @@ const u8 mm76_disassembler::mm76_opmap[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
em_NOP, em_SKNC, em_RT, em_RTSK, em_INT0L,em_INT1H,em_DIN1, em_DIN0, em_SKBF, em_SKBF, em_SKBF, em_SKBF, em_SC, em_RC, em_SEG1, em_SEG2, // 0
- em_SB, em_SB, em_SB, em_SB, em_RB, em_RB, em_RB, em_RB, em_OA, em_OB, em_IAM, em_IBM, em_EOB, em_EOB, em_EOB, em_EOB, // 1
+ em_SB, em_SB, em_SB, em_SB, em_RB, em_RB, em_RB, em_RB, em_OA, em_OB, em_IAM, em_IBM, em_EOB2, em_EOB2, em_EOB2, em_EOB2, // 1
em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, // 2
em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, // 3
@@ -139,3 +157,35 @@ offs_t mm76_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
{
return common_disasm(mm76_opmap, stream, pc, opcodes, params);
}
+
+
+// MM78 disasm
+
+const u8 mm78_disassembler::mm78_opmap[0x100] =
+{
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ em_NOP, em_SKISL,em_SKNC, em_INT0H,em_INT1L,em_RC, em_SC, em_SAG, em_EOB3, em_EOB3, em_EOB3, em_EOB3, em_EOB3, em_EOB3, em_EOB3, em_EOB3, // 0
+ em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, em_LB, // 1
+ em_SB, em_SB, em_SB, em_SB, em_RB, em_RB, em_RB, em_RB, em_SKBF, em_SKBF, em_SKBF, em_SKBF, em_TAB, em_IOS, em_RTSK, em_RT, // 2
+ em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, em_TR, // 3
+
+ em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, em_LAI, // 4
+ em_L, em_L, em_L, em_L, em_XNSK, em_XNSK, em_XNSK, em_XNSK, em_XDSK, em_XDSK, em_XDSK, em_XDSK, em_X, em_X, em_X, em_X, // 5
+ em_I1SK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, em_AISK, // 6
+ em_SOS, em_ROS, em_IX, em_OX, em_XAS, em_LXA, em_LBA, em_COM, em_I2C, em_XAX, em_XAB, em_IOA, em_AC, em_ACSK, em_A, em_SKMEA,// 7
+
+ em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, // 8
+ em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, // 9
+ em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, // A
+ em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, em_TM, // B
+
+ em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, // C
+ em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, // D
+ em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, // E
+ em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T, em_T // F
+};
+
+offs_t mm78_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ return common_disasm(mm78_opmap, stream, pc, opcodes, params);
+}
diff --git a/src/devices/cpu/pps41/pps41d.h b/src/devices/cpu/pps41/pps41d.h
index 5e35adbd53b..4697d30dd42 100644
--- a/src/devices/cpu/pps41/pps41d.h
+++ b/src/devices/cpu/pps41/pps41d.h
@@ -28,8 +28,9 @@ protected:
// opcode mnemonics
enum e_mnemonics
{
- em_ILL,
- em_XAB, em_LBA, em_LB, em_EOB,
+ // MM76/shared
+ em_ILL /* 0! */,
+ em_XAB, em_LBA, em_LB, em_EOB2,
em_SB, em_RB, em_SKBF,
em_XAS, em_LSA,
em_L, em_X, em_XDSK, em_XNSK,
@@ -37,6 +38,11 @@ protected:
em_RT, em_RTSK, em_T, em_NOP, em_TL, em_TM, em_TML, em_TR,
em_SKMEA, em_SKBEI, em_SKAEI,
em_SOS, em_ROS, em_SKISL, em_IBM, em_OB, em_IAM, em_OA, em_IOS, em_I1, em_I2C, em_INT1H, em_DIN1, em_INT0L, em_DIN0, em_SEG1, em_SEG2,
+
+ // MM78 differences
+ em_INT0H, em_INT1L, em_SAG, em_EOB3, em_TAB,
+ em_I1SK, em_IX, em_OX, em_LXA, em_XAX, em_IOA,
+ em_TLB, em_TMLB
};
static const char *const s_name[];
@@ -63,4 +69,17 @@ private:
};
+class mm78_disassembler : public pps41_common_disassembler
+{
+public:
+ mm78_disassembler() = default;
+ virtual ~mm78_disassembler() = default;
+
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ static const u8 mm78_opmap[0x100];
+
+};
+
#endif // MAME_CPU_PPS41_PPS41D_H