summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2016-10-27 16:26:11 -0400
committer GitHub <noreply@github.com>2016-10-27 16:26:11 -0400
commit25662acbcfe2dc2abdd46c9f7f206ff7079b44b7 (patch)
tree562fa816b5a3931fc6cc5db19025ef832cea5e42
parent3daf6be426363735b1f277f44ca4b87072259437 (diff)
parent6b5070b02f43f68acebee3401ea62d57597a94cd (diff)
Merge pull request #1577 from npwoods/dasmstream_lr35902
Changed the lr35902 disassembler to use 'std::ostream &' internally
-rw-r--r--src/devices/cpu/lr35902/lr35902d.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/devices/cpu/lr35902/lr35902d.cpp b/src/devices/cpu/lr35902/lr35902d.cpp
index 09ee836c287..1f7c63aca18 100644
--- a/src/devices/cpu/lr35902/lr35902d.cpp
+++ b/src/devices/cpu/lr35902/lr35902d.cpp
@@ -190,17 +190,15 @@ static const lr35902dasm mnemonic_main[256]= {
* Disassemble opcode at PC and return number of bytes it takes
****************************************************************************/
-CPU_DISASSEMBLE( lr35902 )
+static offs_t internal_disasm_lr35902(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
{
const lr35902dasm *d;
const char /* *symbol,*/ *src;
- char *dst;
int8_t offset;
uint8_t op, op1;
uint16_t ea;
int pos = 0;
- dst = buffer;
//symbol = nullptr;
op = oprom[pos++];
@@ -214,64 +212,74 @@ CPU_DISASSEMBLE( lr35902 )
}
if( d->arguments ) {
- dst += sprintf(dst, "%-4s ", s_mnemonic[d->mnemonic]);
+ util::stream_format(stream, "%-4s ", s_mnemonic[d->mnemonic]);
src = d->arguments;
while( *src ) {
switch( *src ) {
case '?': /* illegal opcode */
- dst += sprintf( dst, "$%02X,$%02X", op, op1);
+ util::stream_format(stream, "$%02X,$%02X", op, op1);
break;
case 'A':
ea = opram[pos] + ( opram[pos+1] << 8);
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
case 'B': /* Byte op arg */
ea = opram[pos++];
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
break;
case '(': /* Memory byte at (...) */
- *dst++ = *src;
+ stream << *src;
if( !strncmp( src, "(bc)", 4) ) {
} else if( !strncmp( src, "(de)", 4) ) {
} else if( !strncmp( src, "(hl)", 4) ) {
} else if( !strncmp( src, "(sp)", 4) ) {
} else if( !strncmp( src, "(F)", 3) ) {
ea = 0xFF00 + opram[pos++];
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
src++;
} else if( !strncmp( src, "(C)", 3) ) {
- dst += sprintf( dst, "$FF00+c" );
+ util::stream_format(stream, "$FF00+c" );
src++;
}
break;
case 'N': /* Immediate 16 bit */
ea = opram[pos] + ( opram[pos+1] << 8 );
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
case 'O': /* Offset relative to PC */
offset = (int8_t) opram[pos++];
- dst += sprintf( dst, "$%04X", pc + offset + 2 );
+ util::stream_format(stream, "$%04X", pc + offset + 2 );
break;
case 'V': /* Restart vector */
ea = op & 0x38;
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
break;
case 'W': /* Memory address word */
ea = opram[pos] + ( opram[pos+1] << 8 );
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
default:
- *dst++ = *src;
+ stream << *src;
+ break;
}
src++;
}
- *dst = '\0';
} else {
- dst += sprintf(dst, "%s", s_mnemonic[d->mnemonic]);
+ util::stream_format(stream, "%s", s_mnemonic[d->mnemonic]);
}
return pos | s_flags[d->mnemonic] | DASMFLAG_SUPPORTED;
}
+
+
+CPU_DISASSEMBLE(lr35902)
+{
+ std::ostringstream stream;
+ offs_t result = internal_disasm_lr35902(device, stream, pc, oprom, opram, options);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+}