mirror of
https://github.com/holub/mame
synced 2025-07-05 01:48:29 +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 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(); } // "
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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(); } // "
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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 ¶ms)
|
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);
|
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;
|
||||||
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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; } },
|
||||||
|
Loading…
Reference in New Issue
Block a user