mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
tms1000: added disassembler for tms1400, tms2100, tms2400
This commit is contained in:
parent
b74398db34
commit
1cf61504b3
@ -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(); } // "
|
||||
};
|
||||
|
||||
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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(); } // "
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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 ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
@ -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; } },
|
||||
|
Loading…
Reference in New Issue
Block a user