summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tlcs90/tlcs90.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/tlcs90/tlcs90.cpp')
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp88
1 files changed, 6 insertions, 82 deletions
diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp
index 7a99a60bbe4..593e454605f 100644
--- a/src/devices/cpu/tlcs90/tlcs90.cpp
+++ b/src/devices/cpu/tlcs90/tlcs90.cpp
@@ -15,8 +15,7 @@
#include "emu.h"
#include "debugger.h"
#include "tlcs90.h"
-
-static const char *const op_names[] = { "??", "nop", "ex", "exx", "ld", "ldw", "lda", "ldi", "ldir", "ldd", "lddr", "cpi", "cpir", "cpd", "cpdr", "push", "pop", "jp", "jr", "call", "callr", "ret", "reti", "halt", "di", "ei", "swi", "daa", "cpl", "neg", "ldar", "rcf", "scf", "ccf", "tset", "bit", "set", "res", "inc", "dec", "incx", "decx", "incw", "decw", "add", "adc", "sub", "sbc", "and", "xor", "or", "cp", "rlc", "rrc", "rl", "rr", "sla", "sra", "sll", "srl", "rld", "rrd", "djnz", "mul", "div" };
+#include "tlcs90d.h"
ALLOW_SAVE_TYPE(tlcs90_device::e_mode); // allow save_item on a non-fundamental type
@@ -154,9 +153,6 @@ enum {
#define F m_af.b.l
-static const char *const r8_names[] = { "b", "c", "d", "e", "h", "l", "a" };
-static const char *const r16_names[] = { "bc", "de", "hl", "??", "ix", "iy", "sp", "af", "af'", "pc" };
-
// Condition Codes
#define FLS 0x0
@@ -198,8 +194,6 @@ static uint8_t SZP[256]; /* zero, sign and parity flags */
static uint8_t SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
static uint8_t SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
-static const char *const cc_names[] = { "f", "lt", "le", "ule", "ov", "mi", "z", "c", "", "ge", "gt", "ugt", "nov", "pl", "nz", "nc" };
-
// Opcodes
#define OP_16 0x80
@@ -1009,81 +1003,6 @@ void tlcs90_device::decode()
OP( UNKNOWN,2 ) NONE( 1 ) NONE( 2 )
}
-static const char *const ir_names[] = {
- "P0", "P1", "P01CR/IRFL", "IRFH", "P2", "P2CR", "P3", "P3CR",
- "P4", "P4CR", "P5", "SMMOD", "P6", "P7", "P67CR", "SMCR",
- "P8", "P8CR", "WDMOD", "WDCR", "TREG0", "TREG1", "TREG2", "TREG3",
- "TCLK", "TFFCR", "TMOD", "TRUN", "CAP1L", "CAP1H", "CAP2L", "CAL2H",
- "TREG4L", "TREG4H", "TREG5L", "TREG5H", "T4MOD", "T4FFCR", "INTEL", "INTEH",
- "DMAEH", "SCMOD", "SCCR", "SCBUF", "BX", "BY", "ADREG", "ADMOD"
-};
-
-const char *tlcs90_device::internal_registers_names(uint16_t x)
-{
- if (type() != TMP90PH44)
- {
- // FIXME: TMP90PH44 and many other models have completely different SFR maps
- int ir = x - 0xffc0;
- if ( ir >= 0 && ir < ARRAY_LENGTH(ir_names) )
- return ir_names[ir];
- }
- return nullptr;
-}
-
-bool tlcs90_device::stream_arg(std::ostream &stream, uint32_t pc, const char *pre, const e_mode mode, const uint16_t r, const uint16_t rb)
-{
- const char *reg_name;
- switch ( mode )
- {
- case e_mode::NONE: return false;
-
- case e_mode::BIT8: util::stream_format(stream, "%s%d", pre, r ); return true;
- case e_mode::I8: util::stream_format(stream, "%s$%02X", pre, r ); return true;
- case e_mode::D8: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7f)-(r&0x80))&0xffff ); return true;
- case e_mode::I16: util::stream_format(stream, "%s$%04X", pre, r ); return true;
- case e_mode::D16: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7fff)-(r&0x8000))&0xffff ); return true;
- case e_mode::MI16:
- reg_name = internal_registers_names(r);
- if (reg_name)
- util::stream_format(stream, "%s(%s)", pre, reg_name);
- else
- util::stream_format(stream, "%s($%04X)", pre, r );
- return true;
- case e_mode::R8: util::stream_format(stream, "%s%s", pre, r8_names[r] ); return true;
- case e_mode::R16: util::stream_format(stream, "%s%s", pre, r16_names[r] ); return true;
- case e_mode::MR16: util::stream_format(stream, "%s(%s)", pre, r16_names[r] ); return true;
-
- case e_mode::MR16R8: util::stream_format(stream, "%s(%s+%s)", pre, r16_names[r], r8_names[rb] ); return true;
- case e_mode::MR16D8: util::stream_format(stream, "%s(%s%c$%02X)", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); return true;
-
- case e_mode::CC: util::stream_format(stream, "%s%s", pre, cc_names[r] ); return true;
-
- case e_mode::R16R8: util::stream_format(stream, "%s%s+%s", pre, r16_names[r], r8_names[rb] ); return true;
- case e_mode::R16D8: util::stream_format(stream, "%s%s%c$%02X", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); return true;
-
- default:
- fatalerror("%04x: unimplemented addr mode = %d\n",pc,std::underlying_type_t<e_mode>(mode));
- }
-
- // never executed
- return false;
-}
-
-offs_t tlcs90_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
-{
- m_addr = pc;
-
- decode();
- m_op &= ~OP_16;
-
- util::stream_format (stream, "%-5s", op_names[ m_op ] ); // strlen("callr") == 5
- bool streamed = stream_arg (stream, pc, " ", m_mode1, m_r1, m_r1b );
- stream_arg (stream, pc, streamed ?",":"", m_mode2, m_r2, m_r2b );
-
- return (m_addr - pc) | DASMFLAG_SUPPORTED;
-}
-
-
uint16_t tlcs90_device::r8( const uint16_t r )
{
switch( r )
@@ -2938,3 +2857,8 @@ void tlcs90_device::state_string_export(const device_state_entry &entry, std::st
break;
}
}
+
+util::disasm_interface *tlcs90_device::create_disassembler()
+{
+ return new tlcs90_disassembler;
+}