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 void device_add_mconfig(machine_config &config) override;
virtual u32 decode_micro(u8 sel) override; virtual u32 decode_micro(u8 sel) override;
virtual void op_br() override { op_br3(); } // 3-level stack virtual u8 stack_levels() override { return 3; } // 3-level stack
virtual void op_call() override { op_call3(); } // " virtual void op_br() override { op_br2(); } // "
virtual void op_retn() override { op_retn3(); } // " 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>(); return std::make_unique<tms1100_disassembler>();
} }
// device_reset // device_reset
void tms1100_cpu_device::device_reset() void tms1100_cpu_device::device_reset()
{ {

View File

@ -11,6 +11,7 @@
#include "emu.h" #include "emu.h"
#include "tms1400.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 // 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 // - 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 // device_reset
void tms1400_cpu_device::device_reset() void tms1400_cpu_device::device_reset()
{ {

View File

@ -28,9 +28,12 @@ protected:
virtual void device_reset() override; virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override; virtual void device_add_mconfig(machine_config &config) override;
virtual void op_br() override { op_br3(); } // 3-level stack virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
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(); } // "
virtual void op_setr() override { tms1k_base_device::op_setr(); } // no anomaly with MSB of X register 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(); } // " 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 // BR/BL: conditional branch
if (m_status) 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 // CALL/CALLL: conditional call
if (m_status) if (m_status)
{ {
// mask clatch 3 bits (no need to mask others) // mask clatch bits (no need to mask others)
m_clatch = (m_clatch << 1 | 1) & 7; u8 smask = (1 << stack_levels()) - 1;
m_clatch = (m_clatch << 1 | 1) & smask;
m_sr = m_sr << m_pc_bits | m_pc; m_sr = m_sr << m_pc_bits | m_pc;
m_pc = m_opcode & m_pc_mask; 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 // RETN: return from subroutine
if (m_clatch & 1) if (m_clatch & 1)
@ -531,7 +532,7 @@ void tms1k_base_device::op_comx8()
{ {
// COMX8: complement MSB of X register // COMX8: complement MSB of X register
// note: on TMS1100, the mnemonic is simply called "COMX" // 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() void tms1k_base_device::op_ldp()
@ -565,7 +566,7 @@ void tms1k_base_device::op_xda()
{ {
// XDA: exchange DAM and A // XDA: exchange DAM and A
// note: setting A to DAM is done with DMTP and AUTA during this instruction // 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() void tms1k_base_device::op_off()
@ -620,7 +621,7 @@ void tms1k_base_device::execute_one()
dynamic_output(); dynamic_output();
set_cki_bus(); set_cki_bus();
m_ram_in = m_data->read_byte(m_ram_address) & 0xf; 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_p = 0;
m_n = 0; m_n = 0;
m_carry_in = 0; m_carry_in = 0;

View File

@ -176,12 +176,13 @@ protected:
virtual void dynamic_output() { ; } // not used by default virtual void dynamic_output() { ; } // not used by default
virtual void read_opcode(); virtual void read_opcode();
virtual u8 stack_levels() { return 1; }
virtual void op_br(); virtual void op_br();
virtual void op_call(); virtual void op_call();
virtual void op_retn(); virtual void op_retn();
virtual void op_br3(); virtual void op_br2();
virtual void op_call3(); virtual void op_call2();
virtual void op_retn3(); virtual void op_retn2();
virtual void op_sbit(); virtual void op_sbit();
virtual void op_rbit(); 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) 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) 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[] = 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", "CLA", "CLO", "COMC", "COMX", "COMX8", "CPAIZ", "CTMDYN", "DAN", "DMAN", "DMEA", "DNAA",
"DYN", "IA", "IMAC", "IYC", "KNEZ", "LDP", "LDX", "LDX", "LDX", "MNEA", "MNEZ", "DYN", "IA", "IMAC", "IYC", "KNEZ", "LDP", "LDX", "LDX", "LDX", "MNEA", "MNEZ",
"NDMEA", "OFF", "RBIT", "REAC", "RETN", "RSTR", "SAL", "SAMAN", "SBIT", "NDMEA", "OFF", "RBIT", "REAC", "RETN", "RSTR", "SAL", "SAMAN", "SBIT",
"SBL", "SEAC", "SETR", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA", "SBL", "SEAC", "SETR", "TAC", "TADM", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA",
"TAY", "TBIT", "TCMIY", "TCY", "TDO", "TKA", "TKM", "TMA", "TAX", "TAY", "TBIT", "TCA", "TCMIY", "TCY", "TDO", "TKA", "TKM", "TMA",
"TMY", "TYA", "XDA", "XMA", "YMCY", "YNEA", "YNEC" "TMY", "TPC", "TRA", "TXA", "TYA", "XDA", "XMA", "YMCY", "YNEA", "YNEC"
}; };
const u32 tms1000_base_disassembler::s_flags[] = const u32 tms1000_base_disassembler::s_flags[] =
{ {
0, 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, 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, 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, 0,
zB0, zB0, zB0, zI4, zI4, zI4, zI4, zB0, zB0, zB7, zB7, zB0, 4, 4, 4, 4, 4, 0, 0, 6, 6, 0,
zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
zB0, zB0, zB0, zB0, zB0, zI4, zI2, zI3, zI4, zB0, zB0, 0, 0, 0, 0, 0, 4, 2, 3, 4, 0, 0,
zB0, zB0, zI2, zB0, zB0, zB0, zB0, zB0, zI2, 0, 0, 2, 0, 0, 0, 0, 0, 2,
zB0, zB0, zB0, zB0, zI4, zB0, zB0, zB0, zB0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
zB0, zI2, zI4, zI4, zB0, zB0, zB0, zB0, 0, 0, 2, 0, 4, 4, 0, 0, 0, 0,
zB0, zB0, zB0, zB0, zI4, zB0, zI4 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] = const u8 tms1000_disassembler::tms1000_mnemonic[256] =
{ {
/* 0x00 */ /* 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 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 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 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 */ /* 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] = const u8 tms0980_disassembler::tms0980_mnemonic[512] =
{ {
/* 0x000 */ /* 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) 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); u16 op = m_opcode_9bits ? opcodes.r16(pc) & 0x1ff : opcodes.r8(pc);
// convert to mnemonic/param
u16 instr = m_lut_mnemonic[op]; u16 instr = m_lut_mnemonic[op];
util::stream_format(stream, "%-8s", s_mnemonic[instr]);
switch( s_addressing[instr] ) if (instr == zAC0AC || instr == zAC1AC)
{ {
case zI2: // special case for AcAAC
util::stream_format(stream, "%d", i2_value[op & 0x03]); u8 c = (i4_value[op & 0x0f] + ((instr == zAC1AC) ? 1 : 0)) & 0xf;
break; util::stream_format(stream, "A%dACC", c);
case zI3: }
util::stream_format(stream, "%d", i3_value[op & 0x07]); else
break; {
case zI4: // convert to mnemonic/param
util::stream_format(stream, "%d", i4_value[op & 0x0f]); util::stream_format(stream, "%-8s", s_mnemonic[instr]);
break;
case zB7: switch (s_bits[instr])
util::stream_format(stream, "$%02X", op & (m_opcode_9bits ? 0x7f : 0x3f)); {
break; case 2:
default: util::stream_format(stream, "%d", i2_value[op & 0x03]);
break; 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; return 1 | s_flags[instr] | SUPPORTED;

View File

@ -28,23 +28,18 @@ protected:
enum e_mnemonics enum e_mnemonics
{ {
zILL = 0, 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, zCLA, zCLO, zCOMC, zCOMX, zCOMX8, zCPAIZ, zCTMDYN, zDAN, zDMAN, zDMEA, zDNAA,
zDYN, zIA, zIMAC, zIYC, zKNEZ, zLDP, zLDX2, zLDX3, zLDX4, zMNEA, zMNEZ, zDYN, zIA, zIMAC, zIYC, zKNEZ, zLDP, zLDX2, zLDX3, zLDX4, zMNEA, zMNEZ,
zNDMEA, zOFF, zRBIT, zREAC, zRETN, zRSTR, zSAL, zSAMAN, zSBIT, zNDMEA, zOFF, zRBIT, zREAC, zRETN, zRSTR, zSAL, zSAMAN, zSBIT,
zSBL, zSEAC, zSETR, zTAM, zTAMACS, zTAMDYN, zTAMIY, zTAMIYC, zTAMZA, zSBL, zSEAC, zSETR, zTAC, zTADM, zTAM, zTAMACS, zTAMDYN, zTAMIY, zTAMIYC, zTAMZA,
zTAY, zTBIT, zTCMIY, zTCY, zTDO, zTKA, zTKM, zTMA, zTAX, zTAY, zTBIT, zTCA, zTCMIY, zTCY, zTDO, zTKA, zTKM, zTMA,
zTMY, zTYA, zXDA, zXMA, zYMCY, zYNEA, zYNEC zTMY, zTPC, zTRA, zTXA, zTYA, zXDA, zXMA, zYMCY, zYNEA, zYNEC
};
enum e_addressing
{
zB0 = 0, zI2, zI3, zI4, zB7
}; };
static const char *const s_mnemonic[]; static const char *const s_mnemonic[];
static const u32 s_flags[]; static const u32 s_flags[];
static const u8 s_addressing[]; static const u8 s_bits[];
static const u8 i2_value[4]; static const u8 i2_value[4];
static const u8 i3_value[8]; static const u8 i3_value[8];
static const u8 i4_value[16]; static const u8 i4_value[16];
@ -63,7 +58,7 @@ public:
tms1000_disassembler(); tms1000_disassembler();
virtual ~tms1000_disassembler() = default; virtual ~tms1000_disassembler() = default;
protected: private:
static const u8 tms1000_mnemonic[256]; static const u8 tms1000_mnemonic[256];
}; };
@ -77,16 +72,49 @@ public:
virtual u32 page2_address_bits() const override { return 4; } virtual u32 page2_address_bits() const override { return 4; }
protected: protected:
tms1100_disassembler(const u8 *lut_mnemonic, bool opcode_9bits, int pc_bits);
private:
static const u8 tms1100_mnemonic[256]; 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 class tms0980_disassembler : public tms1000_base_disassembler
{ {
public: public:
tms0980_disassembler(); tms0980_disassembler();
virtual ~tms0980_disassembler() = default; virtual ~tms0980_disassembler() = default;
protected: private:
static const u8 tms0980_mnemonic[512]; static const u8 tms0980_mnemonic[512];
}; };
@ -96,7 +124,7 @@ public:
tp0320_disassembler(); tp0320_disassembler();
virtual ~tp0320_disassembler() = default; virtual ~tp0320_disassembler() = default;
protected: private:
static const u8 tp0320_mnemonic[512]; 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; } }, { "tms0980", be, 0, []() -> util::disasm_interface * { return new tms0980_disassembler; } },
{ "tms1000", le, 0, []() -> util::disasm_interface * { return new tms1000_disassembler; } }, { "tms1000", le, 0, []() -> util::disasm_interface * { return new tms1000_disassembler; } },
{ "tms1100", le, 0, []() -> util::disasm_interface * { return new tms1100_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; } }, { "tms32010", be, -1, []() -> util::disasm_interface * { return new tms32010_disassembler; } },
{ "tms32025", be, -1, []() -> util::disasm_interface * { return new tms32025_disassembler; } }, { "tms32025", be, -1, []() -> util::disasm_interface * { return new tms32025_disassembler; } },
{ "tms32031", le, -2, []() -> util::disasm_interface * { return new tms32031_disassembler; } }, { "tms32031", le, -2, []() -> util::disasm_interface * { return new tms32031_disassembler; } },