tms1000: added disassembler for tms1400, tms2100, tms2400

This commit is contained in:
hap 2022-08-05 01:13:12 +02:00
parent b74398db34
commit 1cf61504b3
9 changed files with 205 additions and 68 deletions

View File

@ -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(); } // "
};

View File

@ -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()
{

View File

@ -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()
{

View File

@ -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(); } // "

View File

@ -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)

View File

@ -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();

View File

@ -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,28 +338,37 @@ 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];
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
{
// convert to mnemonic/param
util::stream_format(stream, "%-8s", s_mnemonic[instr]);
switch( s_addressing[instr] )
switch (s_bits[instr])
{
case zI2:
case 2:
util::stream_format(stream, "%d", i2_value[op & 0x03]);
break;
case zI3:
case 3:
util::stream_format(stream, "%d", i3_value[op & 0x07]);
break;
case zI4:
case 4:
util::stream_format(stream, "%d", i4_value[op & 0x0f]);
break;
case zB7:
case 6:
util::stream_format(stream, "$%02X", op & (m_opcode_9bits ? 0x7f : 0x3f));
break;
default:
break;
}
}
return 1 | s_flags[instr] | SUPPORTED;
}

View File

@ -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];
};

View File

@ -595,6 +595,9 @@ static const dasm_table_entry dasm_table[] =
{ "tms0980", be, 0, []() -> util::disasm_interface * { return new tms0980_disassembler; } },
{ "tms1000", le, 0, []() -> util::disasm_interface * { return new tms1000_disassembler; } },
{ "tms1100", le, 0, []() -> util::disasm_interface * { return new tms1100_disassembler; } },
{ "tms1400", le, 0, []() -> util::disasm_interface * { return new tms1400_disassembler; } },
{ "tms2100", le, 0, []() -> util::disasm_interface * { return new tms2100_disassembler; } },
{ "tms2400", le, 0, []() -> util::disasm_interface * { return new tms2400_disassembler; } },
{ "tms32010", be, -1, []() -> util::disasm_interface * { return new tms32010_disassembler; } },
{ "tms32025", be, -1, []() -> util::disasm_interface * { return new tms32025_disassembler; } },
{ "tms32031", le, -2, []() -> util::disasm_interface * { return new tms32031_disassembler; } },