summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z180/z180dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/z180/z180dasm.cpp')
-rw-r--r--src/devices/cpu/z180/z180dasm.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/devices/cpu/z180/z180dasm.cpp b/src/devices/cpu/z180/z180dasm.cpp
index 521ec1bfe41..835c620770d 100644
--- a/src/devices/cpu/z180/z180dasm.cpp
+++ b/src/devices/cpu/z180/z180dasm.cpp
@@ -2,7 +2,6 @@
// copyright-holders:Juergen Buchmueller
/*****************************************************************************
*
- * z180dasm.c
* Portable Z8x180 disassembler
*
*****************************************************************************/
@@ -402,7 +401,7 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
if( op1 == 0xcb )
{
offset = (int8_t) params.r8(pos++);
- op1 = params.r8(pos++); /* fourth byte from opbase.ram! */
+ op1 = opcodes.r8(pos++); // M1 fetch, unlike Z80
d = &mnemonic_xx_cb[op1];
}
else d = &mnemonic_xx[op1];
@@ -413,7 +412,7 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
if( op1 == 0xcb )
{
offset = (int8_t) params.r8(pos++);
- op1 = params.r8(pos++); /* fourth byte from opbase.ram! */
+ op1 = opcodes.r8(pos++); // M1 fetch, unlike Z80
d = &mnemonic_xx_cb[op1];
}
else d = &mnemonic_xx[op1];
@@ -423,6 +422,7 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
break;
}
+ bool comma = false;
if( d->arguments )
{
util::stream_format(stream, "%-5s ", s_mnemonic[d->mnemonic]);
@@ -450,7 +450,7 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
break;
case 'O': /* Offset relative to PC */
offset = (int8_t) params.r8(pos++);
- util::stream_format(stream, "$%05X", pc + offset + 2);
+ util::stream_format(stream, "$%04X", (pc + offset + 2) & 0xffff);
break;
case 'P': /* Port number */
ea = params.r8(pos++);
@@ -463,16 +463,20 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
case 'W': /* Memory address word */
ea = params.r16(pos);
pos += 2;
- util::stream_format(stream, "$%05X", ea);
+ util::stream_format(stream, "$%04X", ea);
break;
case 'X':
offset = (int8_t) params.r8(pos++);
+ [[fallthrough]];
case 'Y':
util::stream_format(stream,"(%s%c$%02x)", ixy, sign(offset), offs(offset));
break;
case 'I':
util::stream_format(stream, "%s", ixy);
break;
+ case ',':
+ comma = true;
+ [[fallthrough]];
default:
stream << *src;
}
@@ -484,12 +488,16 @@ offs_t z180_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
util::stream_format(stream, "%s", s_mnemonic[d->mnemonic]);
}
- if (d->mnemonic == zCALL || d->mnemonic == zCPDR || d->mnemonic == zCPIR || d->mnemonic == zDJNZ ||
- d->mnemonic == zHLT || d->mnemonic == zINDR || d->mnemonic == zINIR || d->mnemonic == zLDDR ||
- d->mnemonic == zLDIR || d->mnemonic == zOTDR || d->mnemonic == zOTIR || d->mnemonic == zRST)
+ if (d->mnemonic == zCALL || d->mnemonic == zHLT || d->mnemonic == zRST)
flags = STEP_OVER;
else if (d->mnemonic == zRETN || d->mnemonic == zRET || d->mnemonic == zRETI)
flags = STEP_OUT;
+ if (d->mnemonic == zCPDR || d->mnemonic == zCPIR || d->mnemonic == zDJNZ || d->mnemonic == zINDR ||
+ d->mnemonic == zINIR || d->mnemonic == zLDDR || d->mnemonic == zLDIR || d->mnemonic == zOTDR ||
+ d->mnemonic == zOTDMR || d->mnemonic == zOTIR || d->mnemonic == zOTIMR ||
+ ((d->mnemonic == zCALL || d->mnemonic == zJP || d->mnemonic == zJR) && comma) ||
+ (d->mnemonic == zRET && d->arguments))
+ flags = STEP_COND;
return (pos - pc) | flags | SUPPORTED;
}