diff options
author | 2016-10-29 14:03:17 -0400 | |
---|---|---|
committer | 2016-10-29 14:03:17 -0400 | |
commit | 90adb22c2f6078abde881ff666f4d0e2c0648455 (patch) | |
tree | 60e870d6b8fa705e893b2cd2b34e00e38f79e92f | |
parent | 705dde329e2f138bcfae02a7f97b931e03af888f (diff) |
Changed the tlcs90 disassembler to use 'std::ostream &' internally
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90.cpp | 50 | ||||
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90.h | 12 |
2 files changed, 35 insertions, 27 deletions
diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp index 820d5634126..7ab13e904ed 100644 --- a/src/devices/cpu/tlcs90/tlcs90.cpp +++ b/src/devices/cpu/tlcs90/tlcs90.cpp @@ -991,55 +991,55 @@ const char *tlcs90_device::internal_registers_names(uint16_t x) return ir_names[ir]; return nullptr; } -int tlcs90_device::sprint_arg(char *buffer, uint32_t pc, const char *pre, const e_mode mode, const uint16_t r, const uint16_t rb) +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 MODE_NONE: return 0; + case MODE_NONE: return false; - case MODE_BIT8: return sprintf( buffer, "%s%d", pre, r ); - case MODE_I8: return sprintf( buffer, "%s$%02X", pre, r ); - case MODE_D8: return sprintf( buffer, "%s$%04X", pre, (pc+2+(r&0x7f)-(r&0x80))&0xffff ); - case MODE_I16: return sprintf( buffer, "%s$%04X", pre, r ); - case MODE_D16: return sprintf( buffer, "%s$%04X", pre, (pc+2+(r&0x7fff)-(r&0x8000))&0xffff ); + case MODE_BIT8: util::stream_format(stream, "%s%d", pre, r ); return true; + case MODE_I8: util::stream_format(stream, "%s$%02X", pre, r ); return true; + case MODE_D8: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7f)-(r&0x80))&0xffff ); return true; + case MODE_I16: util::stream_format(stream, "%s$%04X", pre, r ); return true; + case MODE_D16: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7fff)-(r&0x8000))&0xffff ); return true; case MODE_MI16: reg_name = internal_registers_names(r); - return (reg_name) ? sprintf( buffer, "%s(%s)", pre, reg_name ): - sprintf( buffer, "%s($%04X)", pre, r ); - case MODE_R8: return sprintf( buffer, "%s%s", pre, r8_names[r] ); - case MODE_R16: return sprintf( buffer, "%s%s", pre, r16_names[r] ); - case MODE_MR16: return sprintf( buffer, "%s(%s)", pre, r16_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 MODE_R8: util::stream_format(stream, "%s%s", pre, r8_names[r] ); return true; + case MODE_R16: util::stream_format(stream, "%s%s", pre, r16_names[r] ); return true; + case MODE_MR16: util::stream_format(stream, "%s(%s)", pre, r16_names[r] ); return true; - case MODE_MR16R8: return sprintf( buffer, "%s(%s+%s)", pre, r16_names[r], r8_names[rb] ); - case MODE_MR16D8: return sprintf( buffer, "%s(%s%c$%02X)", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); + case MODE_MR16R8: util::stream_format(stream, "%s(%s+%s)", pre, r16_names[r], r8_names[rb] ); return true; + case 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 MODE_CC: return sprintf( buffer, "%s%s", pre, cc_names[r] ); + case MODE_CC: util::stream_format(stream, "%s%s", pre, cc_names[r] ); return true; - case MODE_R16R8: return sprintf( buffer, "%s%s+%s", pre, r16_names[r], r8_names[rb] ); - case MODE_R16D8: return sprintf( buffer, "%s%s%c$%02X", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); + case MODE_R16R8: util::stream_format(stream, "%s%s+%s", pre, r16_names[r], r8_names[rb] ); return true; + case 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,mode); } // never executed - //return 0; + return false; } -offs_t tlcs90_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +offs_t tlcs90_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) { - int len; - m_addr = pc; decode(); m_op &= ~OP_16; - buffer += sprintf ( buffer, "%-5s", op_names[ m_op ] ); // strlen("callr") == 5 - len = sprint_arg ( buffer, pc, " ", m_mode1, m_r1, m_r1b ); - buffer += len; - buffer += sprint_arg ( buffer, pc, (len>1)?",":"", m_mode2, m_r2, m_r2b ); + 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; } diff --git a/src/devices/cpu/tlcs90/tlcs90.h b/src/devices/cpu/tlcs90/tlcs90.h index 3d622a74e32..b303f8dd3f6 100644 --- a/src/devices/cpu/tlcs90/tlcs90.h +++ b/src/devices/cpu/tlcs90/tlcs90.h @@ -58,7 +58,14 @@ protected: // device_disasm_interface overrides virtual uint32_t disasm_min_opcode_bytes() const override { return 1; } virtual uint32_t disasm_max_opcode_bytes() const override { return 6; } - virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override + { + std::ostringstream stream; + offs_t result = disasm_disassemble(stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; + } private: enum e_mode { @@ -114,7 +121,7 @@ private: inline uint16_t READ16(); void decode(); const char *internal_registers_names(uint16_t x); - int sprint_arg(char *buffer, uint32_t pc, const char *pre, const e_mode mode, const uint16_t r, const uint16_t rb); + bool stream_arg(std::ostream &stream, uint32_t pc, const char *pre, const e_mode mode, const uint16_t r, const uint16_t rb); inline uint16_t r8( const uint16_t r ); inline void w8( const uint16_t r, uint16_t value ); inline uint16_t r16( const uint16_t r ); @@ -140,6 +147,7 @@ private: void t90_stop_timer(int i); void t90_stop_timer4(); void set_irq_line(int irq, int state); + offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options); }; |