summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms1000
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2022-08-05 01:13:12 +0200
committer hap <happppp@users.noreply.github.com>2022-08-05 01:13:26 +0200
commit1cf61504b33f42ff9e5702dbeacce90da86c9afd (patch)
tree863abf5fe82713bc99c3ab096eafb43c8b0e7c97 /src/devices/cpu/tms1000
parentb74398db34f71f22988d189556ef9ab156eb922f (diff)
tms1000: added disassembler for tms1400, tms2100, tms2400
Diffstat (limited to 'src/devices/cpu/tms1000')
-rw-r--r--src/devices/cpu/tms1000/tms1000c.h7
-rw-r--r--src/devices/cpu/tms1000/tms1100.cpp1
-rw-r--r--src/devices/cpu/tms1000/tms1400.cpp8
-rw-r--r--src/devices/cpu/tms1000/tms1400.h9
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp19
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h7
-rw-r--r--src/devices/cpu/tms1000/tms1k_dasm.cpp165
-rw-r--r--src/devices/cpu/tms1000/tms1k_dasm.h54
8 files changed, 202 insertions, 68 deletions
diff --git a/src/devices/cpu/tms1000/tms1000c.h b/src/devices/cpu/tms1000/tms1000c.h
index 7857bf07f0c..e45868919b7 100644
--- a/src/devices/cpu/tms1000/tms1000c.h
+++ b/src/devices/cpu/tms1000/tms1000c.h
@@ -24,9 +24,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual u32 decode_micro(u8 sel) override;
- virtual void op_br() override { op_br3(); } // 3-level stack
- virtual void op_call() override { op_call3(); } // "
- virtual void op_retn() override { op_retn3(); } // "
+ virtual u8 stack_levels() override { return 3; } // 3-level stack
+ virtual void op_br() override { op_br2(); } // "
+ virtual void op_call() override { op_call2(); } // "
+ virtual void op_retn() override { op_retn2(); } // "
};
diff --git a/src/devices/cpu/tms1000/tms1100.cpp b/src/devices/cpu/tms1000/tms1100.cpp
index 710f0d52e88..57f98d6ea3d 100644
--- a/src/devices/cpu/tms1000/tms1100.cpp
+++ b/src/devices/cpu/tms1000/tms1100.cpp
@@ -60,6 +60,7 @@ std::unique_ptr<util::disasm_interface> tms1100_cpu_device::create_disassembler(
return std::make_unique<tms1100_disassembler>();
}
+
// device_reset
void tms1100_cpu_device::device_reset()
{
diff --git a/src/devices/cpu/tms1000/tms1400.cpp b/src/devices/cpu/tms1000/tms1400.cpp
index ffb3a79b23c..bc16b6c9809 100644
--- a/src/devices/cpu/tms1000/tms1400.cpp
+++ b/src/devices/cpu/tms1000/tms1400.cpp
@@ -11,6 +11,7 @@
#include "emu.h"
#include "tms1400.h"
+#include "tms1k_dasm.h"
// TMS1400 follows the TMS1100, it doubles the ROM size again (4 chapters of 16 pages), and adds a 3-level callstack
// - rotate the view and mirror the OR-mask to get the proper layout of the mpla, the default is identical to tms1100
@@ -78,6 +79,13 @@ void tms1400_cpu_device::device_add_mconfig(machine_config &config)
}
+// disasm
+std::unique_ptr<util::disasm_interface> tms1400_cpu_device::create_disassembler()
+{
+ return std::make_unique<tms1400_disassembler>();
+}
+
+
// device_reset
void tms1400_cpu_device::device_reset()
{
diff --git a/src/devices/cpu/tms1000/tms1400.h b/src/devices/cpu/tms1000/tms1400.h
index 4ea94160855..3f89ee34fb8 100644
--- a/src/devices/cpu/tms1000/tms1400.h
+++ b/src/devices/cpu/tms1000/tms1400.h
@@ -28,9 +28,12 @@ protected:
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
- virtual void op_br() override { op_br3(); } // 3-level stack
- virtual void op_call() override { op_call3(); } // "
- virtual void op_retn() override { op_retn3(); } // "
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ virtual u8 stack_levels() override { return 3; } // 3-level stack
+ virtual void op_br() override { op_br2(); } // "
+ virtual void op_call() override { op_call2(); } // "
+ virtual void op_retn() override { op_retn2(); } // "
virtual void op_setr() override { tms1k_base_device::op_setr(); } // no anomaly with MSB of X register
virtual void op_rstr() override { tms1k_base_device::op_rstr(); } // "
diff --git a/src/devices/cpu/tms1000/tms1k_base.cpp b/src/devices/cpu/tms1000/tms1k_base.cpp
index ecea0a83b28..87989cfae74 100644
--- a/src/devices/cpu/tms1000/tms1k_base.cpp
+++ b/src/devices/cpu/tms1000/tms1k_base.cpp
@@ -413,9 +413,9 @@ void tms1k_base_device::op_retn()
}
-// TMS1400/TMS1000C 3-level stack version
+// TMS1400/TMS1000C multiple level stack version
-void tms1k_base_device::op_br3()
+void tms1k_base_device::op_br2()
{
// BR/BL: conditional branch
if (m_status)
@@ -426,13 +426,14 @@ void tms1k_base_device::op_br3()
}
}
-void tms1k_base_device::op_call3()
+void tms1k_base_device::op_call2()
{
// CALL/CALLL: conditional call
if (m_status)
{
- // mask clatch 3 bits (no need to mask others)
- m_clatch = (m_clatch << 1 | 1) & 7;
+ // mask clatch bits (no need to mask others)
+ u8 smask = (1 << stack_levels()) - 1;
+ m_clatch = (m_clatch << 1 | 1) & smask;
m_sr = m_sr << m_pc_bits | m_pc;
m_pc = m_opcode & m_pc_mask;
@@ -450,7 +451,7 @@ void tms1k_base_device::op_call3()
}
}
-void tms1k_base_device::op_retn3()
+void tms1k_base_device::op_retn2()
{
// RETN: return from subroutine
if (m_clatch & 1)
@@ -531,7 +532,7 @@ void tms1k_base_device::op_comx8()
{
// COMX8: complement MSB of X register
// note: on TMS1100, the mnemonic is simply called "COMX"
- m_x ^= 1 << (m_x_bits-1);
+ m_x ^= 1 << (m_x_bits - 1);
}
void tms1k_base_device::op_ldp()
@@ -565,7 +566,7 @@ void tms1k_base_device::op_xda()
{
// XDA: exchange DAM and A
// note: setting A to DAM is done with DMTP and AUTA during this instruction
- m_ram_address |= (0x10 << (m_x_bits-1));
+ m_ram_address |= (0x10 << (m_x_bits - 1));
}
void tms1k_base_device::op_off()
@@ -620,7 +621,7 @@ void tms1k_base_device::execute_one()
dynamic_output();
set_cki_bus();
m_ram_in = m_data->read_byte(m_ram_address) & 0xf;
- m_dam_in = m_data->read_byte(m_ram_address | (0x10 << (m_x_bits-1))) & 0xf;
+ m_dam_in = m_data->read_byte(m_ram_address | (0x10 << (m_x_bits - 1))) & 0xf;
m_p = 0;
m_n = 0;
m_carry_in = 0;
diff --git a/src/devices/cpu/tms1000/tms1k_base.h b/src/devices/cpu/tms1000/tms1k_base.h
index e249e02b8f0..f8b7990c517 100644
--- a/src/devices/cpu/tms1000/tms1k_base.h
+++ b/src/devices/cpu/tms1000/tms1k_base.h
@@ -176,12 +176,13 @@ protected:
virtual void dynamic_output() { ; } // not used by default
virtual void read_opcode();
+ virtual u8 stack_levels() { return 1; }
virtual void op_br();
virtual void op_call();
virtual void op_retn();
- virtual void op_br3();
- virtual void op_call3();
- virtual void op_retn3();
+ virtual void op_br2();
+ virtual void op_call2();
+ virtual void op_retn2();
virtual void op_sbit();
virtual void op_rbit();
diff --git a/src/devices/cpu/tms1000/tms1k_dasm.cpp b/src/devices/cpu/tms1000/tms1k_dasm.cpp
index 95f2e36e5f1..3c1e67500c9 100644
--- a/src/devices/cpu/tms1000/tms1k_dasm.cpp
+++ b/src/devices/cpu/tms1000/tms1k_dasm.cpp
@@ -43,7 +43,20 @@ tms1000_base_disassembler::tms1000_base_disassembler(const u8 *lut_mnemonic, boo
tms1000_disassembler::tms1000_disassembler() : tms1000_base_disassembler(tms1000_mnemonic, false, 6)
{ }
-tms1100_disassembler::tms1100_disassembler() : tms1000_base_disassembler(tms1100_mnemonic, false, 6)
+tms1100_disassembler::tms1100_disassembler(const u8 *lut_mnemonic, bool opcode_9bits, int pc_bits) :
+ tms1000_base_disassembler(lut_mnemonic, opcode_9bits, pc_bits)
+{ }
+
+tms1100_disassembler::tms1100_disassembler() : tms1100_disassembler(tms1100_mnemonic, false, 6)
+{ }
+
+tms1400_disassembler::tms1400_disassembler() : tms1100_disassembler(tms1400_mnemonic, false, 6)
+{ }
+
+tms2100_disassembler::tms2100_disassembler() : tms1100_disassembler(tms2100_mnemonic, false, 6)
+{ }
+
+tms2400_disassembler::tms2400_disassembler() : tms1100_disassembler(tms2400_mnemonic, false, 6)
{ }
tms0980_disassembler::tms0980_disassembler() : tms1000_base_disassembler(tms0980_mnemonic, true, 7)
@@ -71,37 +84,37 @@ offs_t tms1000_base_disassembler::pc_real_to_linear(offs_t pc) const
const char *const tms1000_base_disassembler::s_mnemonic[] =
{
"?",
- "A10AAC", "A6AAC", "A8AAC", "AC1AC", "ACACC", "ACNAA", "ALEC", "ALEM", "AMAAC", "BRANCH", "CALL", "CCLA",
+ "AC0AC", "AC1AC", "ACACC", "ACNAA", "ALEC", "ALEM", "AMAAC", "BRANCH", "CALL", "CCLA",
"CLA", "CLO", "COMC", "COMX", "COMX8", "CPAIZ", "CTMDYN", "DAN", "DMAN", "DMEA", "DNAA",
"DYN", "IA", "IMAC", "IYC", "KNEZ", "LDP", "LDX", "LDX", "LDX", "MNEA", "MNEZ",
"NDMEA", "OFF", "RBIT", "REAC", "RETN", "RSTR", "SAL", "SAMAN", "SBIT",
- "SBL", "SEAC", "SETR", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA",
- "TAY", "TBIT", "TCMIY", "TCY", "TDO", "TKA", "TKM", "TMA",
- "TMY", "TYA", "XDA", "XMA", "YMCY", "YNEA", "YNEC"
+ "SBL", "SEAC", "SETR", "TAC", "TADM", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA",
+ "TAX", "TAY", "TBIT", "TCA", "TCMIY", "TCY", "TDO", "TKA", "TKM", "TMA",
+ "TMY", "TPC", "TRA", "TXA", "TYA", "XDA", "XMA", "YMCY", "YNEA", "YNEC"
};
const u32 tms1000_base_disassembler::s_flags[] =
{
0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, STEP_COND, STEP_OVER | STEP_COND, 0,
+ 0, 0, 0, 0, 0, 0, 0, STEP_COND, STEP_OVER | STEP_COND, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, STEP_OUT, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
-const u8 tms1000_base_disassembler::s_addressing[] =
+const u8 tms1000_base_disassembler::s_bits[] =
{
- zB0,
- zB0, zB0, zB0, zI4, zI4, zI4, zI4, zB0, zB0, zB7, zB7, zB0,
- zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0,
- zB0, zB0, zB0, zB0, zB0, zI4, zI2, zI3, zI4, zB0, zB0,
- zB0, zB0, zI2, zB0, zB0, zB0, zB0, zB0, zI2,
- zB0, zB0, zB0, zB0, zI4, zB0, zB0, zB0, zB0,
- zB0, zI2, zI4, zI4, zB0, zB0, zB0, zB0,
- zB0, zB0, zB0, zB0, zI4, zB0, zI4
+ 0,
+ 4, 4, 4, 4, 4, 0, 0, 6, 6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4, 2, 3, 4, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
+ 0, 0, 2, 0, 4, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4, 0, 4
};
@@ -110,7 +123,7 @@ const u8 tms1000_base_disassembler::s_addressing[] =
const u8 tms1000_disassembler::tms1000_mnemonic[256] =
{
/* 0x00 */
- zCOMX, zA8AAC, zYNEA, zTAM, zTAMZA, zA10AAC, zA6AAC, zDAN, zTKA, zKNEZ, zTDO, zCLO, zRSTR, zSETR, zIA, zRETN, // 0
+ zCOMX, zAC0AC, zYNEA, zTAM, zTAMZA, zAC0AC, zAC0AC, zDAN, zTKA, zKNEZ, zTDO, zCLO, zRSTR, zSETR, zIA, zRETN, // 0
zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, // 1
zTAMIY, zTMA, zTMY, zTYA, zTAY, zAMAAC, zMNEZ, zSAMAN, zIMAC, zALEM, zDMAN, zIYC, zDYN, zCPAIZ, zXMA, zCLA, // 2
zSBIT, zSBIT, zSBIT, zSBIT, zRBIT, zRBIT, zRBIT, zRBIT, zTBIT, zTBIT, zTBIT, zTBIT, zLDX2, zLDX2, zLDX2, zLDX2, // 3
@@ -153,6 +166,75 @@ const u8 tms1100_disassembler::tms1100_mnemonic[256] =
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
};
+const u8 tms1400_disassembler::tms1400_mnemonic[256] =
+{
+/* 0x00 */
+ zMNEA, zALEM, zYNEA, zXMA, zDYN, zIYC, zAMAAC, zDMAN, zTKA, zCOMX, zTDO, zTPC, zRSTR, zSETR, zKNEZ, zRETN, // 0
+ zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, // 1
+ zTAY, zTMA, zTMY, zTYA, zTAMDYN, zTAMIYC, zTAMZA, zTAM, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, // 2
+ zSBIT, zSBIT, zSBIT, zSBIT, zRBIT, zRBIT, zRBIT, zRBIT, zTBIT, zTBIT, zTBIT, zTBIT, zSAMAN, zCPAIZ, zIMAC, zMNEZ, // 3
+ zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, // 4
+ zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, // 5
+ zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, // 6
+ zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zCLA, // 7
+/* 0x80 */
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 8
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 9
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // A
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // B
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // C
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // D
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // E
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL // F
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+};
+
+const u8 tms2100_disassembler::tms2100_mnemonic[256] =
+{
+/* 0x00 */
+ zMNEA, zALEM, zYNEA, zXMA, zDYN, zIYC, zAMAAC, zDMAN, zTKA, zTAX, zTDO, zCOMC, zRSTR, zSETR, zTADM, zRETN, // 0
+ zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, // 1
+ zTAY, zTMA, zTMY, zTYA, zTAMDYN, zTAMIYC, zTAC, zTAM, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, // 2
+ zSBIT, zSBIT, zSBIT, zSBIT, zRBIT, zRBIT, zRBIT, zRBIT, zTBIT, zTBIT, zTBIT, zTBIT, zSAMAN, zCPAIZ, zIMAC, zMNEZ, // 3
+ zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, // 4
+ zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, // 5
+ zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, // 6
+ zAC1AC, zAC1AC, zAC1AC, zTCA, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zTRA, zAC1AC, zAC1AC, zAC1AC, zCLA, // 7
+/* 0x80 */
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 8
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 9
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // A
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // B
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // C
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // D
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // E
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL // F
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+};
+
+const u8 tms2400_disassembler::tms2400_mnemonic[256] =
+{
+/* 0x00 */
+ zMNEA, zALEM, zYNEA, zXMA, zDYN, zIYC, zAMAAC, zDMAN, zTKA, zTAX, zTDO, zTPC, zRSTR, zSETR, zTADM, zRETN, // 0
+ zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, // 1
+ zTAY, zTMA, zTMY, zTYA, zTAMDYN, zTAMIYC, zTAC, zTAM, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, // 2
+ zSBIT, zSBIT, zSBIT, zSBIT, zRBIT, zRBIT, zRBIT, zRBIT, zTBIT, zTBIT, zTBIT, zTBIT, zSAMAN, zCPAIZ, zIMAC, zMNEZ, // 3
+ zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, zTCY, // 4
+ zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, zYNEC, // 5
+ zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, zTCMIY, // 6
+ zAC1AC, zAC1AC, zAC1AC, zTCA, zAC1AC, zCOMX, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zAC1AC, zTRA, zAC1AC, zTXA, zAC1AC, zCLA, // 7
+/* 0x80 */
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 8
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // 9
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // A
+ zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, zBRANCH, // B
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // C
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // D
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, // E
+ zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL, zCALL // F
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+};
+
const u8 tms0980_disassembler::tms0980_mnemonic[512] =
{
/* 0x000 */
@@ -256,27 +338,36 @@ const u8 tms1000_base_disassembler::i4_value[16] =
offs_t tms1000_base_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
u16 op = m_opcode_9bits ? opcodes.r16(pc) & 0x1ff : opcodes.r8(pc);
-
- // convert to mnemonic/param
u16 instr = m_lut_mnemonic[op];
- util::stream_format(stream, "%-8s", s_mnemonic[instr]);
- switch( s_addressing[instr] )
+ if (instr == zAC0AC || instr == zAC1AC)
+ {
+ // special case for AcAAC
+ u8 c = (i4_value[op & 0x0f] + ((instr == zAC1AC) ? 1 : 0)) & 0xf;
+ util::stream_format(stream, "A%dACC", c);
+ }
+ else
{
- case zI2:
- util::stream_format(stream, "%d", i2_value[op & 0x03]);
- break;
- case zI3:
- util::stream_format(stream, "%d", i3_value[op & 0x07]);
- break;
- case zI4:
- util::stream_format(stream, "%d", i4_value[op & 0x0f]);
- break;
- case zB7:
- util::stream_format(stream, "$%02X", op & (m_opcode_9bits ? 0x7f : 0x3f));
- break;
- default:
- break;
+ // convert to mnemonic/param
+ util::stream_format(stream, "%-8s", s_mnemonic[instr]);
+
+ switch (s_bits[instr])
+ {
+ case 2:
+ util::stream_format(stream, "%d", i2_value[op & 0x03]);
+ break;
+ case 3:
+ util::stream_format(stream, "%d", i3_value[op & 0x07]);
+ break;
+ case 4:
+ util::stream_format(stream, "%d", i4_value[op & 0x0f]);
+ break;
+ case 6:
+ util::stream_format(stream, "$%02X", op & (m_opcode_9bits ? 0x7f : 0x3f));
+ break;
+ default:
+ break;
+ }
}
return 1 | s_flags[instr] | SUPPORTED;
diff --git a/src/devices/cpu/tms1000/tms1k_dasm.h b/src/devices/cpu/tms1000/tms1k_dasm.h
index 18aad27fe1a..07f854350dd 100644
--- a/src/devices/cpu/tms1000/tms1k_dasm.h
+++ b/src/devices/cpu/tms1000/tms1k_dasm.h
@@ -28,23 +28,18 @@ protected:
enum e_mnemonics
{
zILL = 0,
- zA10AAC, zA6AAC, zA8AAC, zAC1AC, zACACC, zACNAA, zALEC, zALEM, zAMAAC, zBRANCH, zCALL, zCCLA,
+ zAC0AC, zAC1AC, zACACC, zACNAA, zALEC, zALEM, zAMAAC, zBRANCH, zCALL, zCCLA,
zCLA, zCLO, zCOMC, zCOMX, zCOMX8, zCPAIZ, zCTMDYN, zDAN, zDMAN, zDMEA, zDNAA,
zDYN, zIA, zIMAC, zIYC, zKNEZ, zLDP, zLDX2, zLDX3, zLDX4, zMNEA, zMNEZ,
zNDMEA, zOFF, zRBIT, zREAC, zRETN, zRSTR, zSAL, zSAMAN, zSBIT,
- zSBL, zSEAC, zSETR, zTAM, zTAMACS, zTAMDYN, zTAMIY, zTAMIYC, zTAMZA,
- zTAY, zTBIT, zTCMIY, zTCY, zTDO, zTKA, zTKM, zTMA,
- zTMY, zTYA, zXDA, zXMA, zYMCY, zYNEA, zYNEC
- };
-
- enum e_addressing
- {
- zB0 = 0, zI2, zI3, zI4, zB7
+ zSBL, zSEAC, zSETR, zTAC, zTADM, zTAM, zTAMACS, zTAMDYN, zTAMIY, zTAMIYC, zTAMZA,
+ zTAX, zTAY, zTBIT, zTCA, zTCMIY, zTCY, zTDO, zTKA, zTKM, zTMA,
+ zTMY, zTPC, zTRA, zTXA, zTYA, zXDA, zXMA, zYMCY, zYNEA, zYNEC
};
static const char *const s_mnemonic[];
static const u32 s_flags[];
- static const u8 s_addressing[];
+ static const u8 s_bits[];
static const u8 i2_value[4];
static const u8 i3_value[8];
static const u8 i4_value[16];
@@ -63,7 +58,7 @@ public:
tms1000_disassembler();
virtual ~tms1000_disassembler() = default;
-protected:
+private:
static const u8 tms1000_mnemonic[256];
};
@@ -77,16 +72,49 @@ public:
virtual u32 page2_address_bits() const override { return 4; }
protected:
+ tms1100_disassembler(const u8 *lut_mnemonic, bool opcode_9bits, int pc_bits);
+
+private:
static const u8 tms1100_mnemonic[256];
};
+class tms1400_disassembler : public tms1100_disassembler
+{
+public:
+ tms1400_disassembler();
+ virtual ~tms1400_disassembler() = default;
+
+private:
+ static const u8 tms1400_mnemonic[256];
+};
+
+class tms2100_disassembler : public tms1100_disassembler
+{
+public:
+ tms2100_disassembler();
+ virtual ~tms2100_disassembler() = default;
+
+private:
+ static const u8 tms2100_mnemonic[256];
+};
+
+class tms2400_disassembler : public tms1100_disassembler
+{
+public:
+ tms2400_disassembler();
+ virtual ~tms2400_disassembler() = default;
+
+private:
+ static const u8 tms2400_mnemonic[256];
+};
+
class tms0980_disassembler : public tms1000_base_disassembler
{
public:
tms0980_disassembler();
virtual ~tms0980_disassembler() = default;
-protected:
+private:
static const u8 tms0980_mnemonic[512];
};
@@ -96,7 +124,7 @@ public:
tp0320_disassembler();
virtual ~tp0320_disassembler() = default;
-protected:
+private:
static const u8 tp0320_mnemonic[512];
};