Changed the tlcs90 disassembler to use 'std::ostream &' internally

This commit is contained in:
Nathan Woods 2016-10-29 14:03:17 -04:00
parent 705dde329e
commit 90adb22c2f
2 changed files with 35 additions and 27 deletions

View File

@ -991,55 +991,55 @@ const char *tlcs90_device::internal_registers_names(uint16_t x)
return ir_names[ir]; return ir_names[ir];
return nullptr; 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; const char *reg_name;
switch ( mode ) switch ( mode )
{ {
case MODE_NONE: return 0; case MODE_NONE: return false;
case MODE_BIT8: return sprintf( buffer, "%s%d", pre, r ); case MODE_BIT8: util::stream_format(stream, "%s%d", pre, r ); return true;
case MODE_I8: return sprintf( buffer, "%s$%02X", pre, r ); case MODE_I8: util::stream_format(stream, "%s$%02X", pre, r ); return true;
case MODE_D8: return sprintf( buffer, "%s$%04X", pre, (pc+2+(r&0x7f)-(r&0x80))&0xffff ); case MODE_D8: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7f)-(r&0x80))&0xffff ); return true;
case MODE_I16: return sprintf( buffer, "%s$%04X", pre, r ); case MODE_I16: util::stream_format(stream, "%s$%04X", pre, r ); return true;
case MODE_D16: return sprintf( buffer, "%s$%04X", pre, (pc+2+(r&0x7fff)-(r&0x8000))&0xffff ); case MODE_D16: util::stream_format(stream, "%s$%04X", pre, (pc+2+(r&0x7fff)-(r&0x8000))&0xffff ); return true;
case MODE_MI16: case MODE_MI16:
reg_name = internal_registers_names(r); reg_name = internal_registers_names(r);
return (reg_name) ? sprintf( buffer, "%s(%s)", pre, reg_name ): if (reg_name)
sprintf( buffer, "%s($%04X)", pre, r ); util::stream_format(stream, "%s(%s)", pre, reg_name);
case MODE_R8: return sprintf( buffer, "%s%s", pre, r8_names[r] ); else
case MODE_R16: return sprintf( buffer, "%s%s", pre, r16_names[r] ); util::stream_format(stream, "%s($%04X)", pre, r );
case MODE_MR16: return sprintf( buffer, "%s(%s)", pre, r16_names[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_MR16R8: util::stream_format(stream, "%s(%s+%s)", pre, r16_names[r], r8_names[rb] ); return true;
case MODE_MR16D8: return sprintf( buffer, "%s(%s%c$%02X)", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); 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_R16R8: util::stream_format(stream, "%s%s+%s", pre, r16_names[r], r8_names[rb] ); return true;
case MODE_R16D8: return sprintf( buffer, "%s%s%c$%02X", pre, r16_names[r], (rb&0x80)?'-':'+', (rb&0x80)?((rb^0xff)+1):rb ); 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: default:
fatalerror("%04x: unimplemented addr mode = %d\n",pc,mode); fatalerror("%04x: unimplemented addr mode = %d\n",pc,mode);
} }
// never executed // 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; m_addr = pc;
decode(); decode();
m_op &= ~OP_16; m_op &= ~OP_16;
buffer += sprintf ( buffer, "%-5s", op_names[ m_op ] ); // strlen("callr") == 5 util::stream_format (stream, "%-5s", op_names[ m_op ] ); // strlen("callr") == 5
len = sprint_arg ( buffer, pc, " ", m_mode1, m_r1, m_r1b ); bool streamed = stream_arg (stream, pc, " ", m_mode1, m_r1, m_r1b );
buffer += len; stream_arg (stream, pc, streamed ?",":"", m_mode2, m_r2, m_r2b );
buffer += sprint_arg ( buffer, pc, (len>1)?",":"", m_mode2, m_r2, m_r2b );
return (m_addr - pc) | DASMFLAG_SUPPORTED; return (m_addr - pc) | DASMFLAG_SUPPORTED;
} }

View File

@ -58,7 +58,14 @@ protected:
// device_disasm_interface overrides // device_disasm_interface overrides
virtual uint32_t disasm_min_opcode_bytes() const override { return 1; } virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
virtual uint32_t disasm_max_opcode_bytes() const override { return 6; } 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: private:
enum e_mode { enum e_mode {
@ -114,7 +121,7 @@ private:
inline uint16_t READ16(); inline uint16_t READ16();
void decode(); void decode();
const char *internal_registers_names(uint16_t x); 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 uint16_t r8( const uint16_t r );
inline void w8( const uint16_t r, uint16_t value ); inline void w8( const uint16_t r, uint16_t value );
inline uint16_t r16( const uint16_t r ); inline uint16_t r16( const uint16_t r );
@ -140,6 +147,7 @@ private:
void t90_stop_timer(int i); void t90_stop_timer(int i);
void t90_stop_timer4(); void t90_stop_timer4();
void set_irq_line(int irq, int state); 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);
}; };