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