diff options
Diffstat (limited to 'src/devices/cpu/z80/z80dasm.cpp')
-rw-r--r-- | src/devices/cpu/z80/z80dasm.cpp | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/src/devices/cpu/z80/z80dasm.cpp b/src/devices/cpu/z80/z80dasm.cpp index f579fd6d62d..fcd358c3c78 100644 --- a/src/devices/cpu/z80/z80dasm.cpp +++ b/src/devices/cpu/z80/z80dasm.cpp @@ -2,13 +2,12 @@ // copyright-holders:Juergen Buchmueller /***************************************************************************** * - * z80dasm.c + * z80dasm.cpp * Portable Z80 disassembler * *****************************************************************************/ #include "emu.h" -#include "debugger.h" #include "z80dasm.h" @@ -23,19 +22,31 @@ static const char *const s_mnemonic[] = "retn","rl" ,"rla" ,"rlc" ,"rlca","rld" ,"rr" ,"rra" , "rrc" ,"rrca","rrd" ,"rst" ,"sbc" ,"scf" ,"set" ,"sla" , "sll" ,"sra" ,"srl" ,"sub" ,"xor " + + // z80n + ,"swap","mirr","test", + "bsla","bsra","bsrl","bsrf","brlc","mul" ,"otib","nreg", + "pxdn","pxad","stae","ldix","ldws","lddx","lirx","lprx", + "ldrx" }; const u32 z80_disassembler::s_flags[] = { 0 ,0 ,0 ,0 ,STEP_OVER,0 ,0 ,0 , STEP_OVER,0 ,STEP_OVER,0 ,0 ,0 ,0 ,0 , - STEP_OVER,0 ,0 ,0 ,STEP_OVER,0 ,0 ,0 , + STEP_COND,0 ,0 ,0 ,STEP_OVER,0 ,0 ,0 , 0 ,STEP_OVER,0 ,STEP_OVER,0 ,0 ,0 ,0 , STEP_OVER,0 ,STEP_OVER,0 ,0 ,0 ,STEP_OVER,STEP_OVER, 0 ,0 ,0 ,0 ,0 ,0 ,STEP_OUT ,STEP_OUT , STEP_OUT ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,STEP_OVER,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 + + // z80n + ,0 ,0 ,0 , + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + 0 }; const z80_disassembler::z80dasm z80_disassembler::mnemonic_xx_cb[256] = @@ -216,13 +227,13 @@ const z80_disassembler::z80dasm z80_disassembler::mnemonic_ed[256] = {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, - {zLDI,nullptr}, {zCPI,nullptr}, {zINI,nullptr}, {zOUTI,nullptr}, + {zLDI,nullptr}, {zCPI,nullptr}, {zINI,nullptr}, {zOUTI,nullptr}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, - {zLDD,nullptr}, {zCPD,nullptr}, {zIND,nullptr}, {zOUTD,nullptr}, + {zLDD,nullptr}, {zCPD,nullptr}, {zIND,nullptr}, {zOUTD,nullptr}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, - {zLDIR,nullptr}, {zCPIR,nullptr}, {zINIR,nullptr}, {zOTIR,nullptr}, + {zLDIR,nullptr},{zCPIR,nullptr},{zINIR,nullptr},{zOTIR,nullptr}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, - {zLDDR,nullptr}, {zCPDR,nullptr}, {zINDR,nullptr}, {zOTDR,nullptr}, + {zLDDR,nullptr},{zCPDR,nullptr},{zINDR,nullptr},{zOTDR,nullptr}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, @@ -341,7 +352,7 @@ const z80_disassembler::z80dasm z80_disassembler::mnemonic_main[256] = {zLD,"l,b"}, {zLD,"l,c"}, {zLD,"l,d"}, {zLD,"l,e"}, {zLD,"l,h"}, {zLD,"l,l"}, {zLD,"l,(hl)"}, {zLD,"l,a"}, {zLD,"(hl),b"}, {zLD,"(hl),c"}, {zLD,"(hl),d"}, {zLD,"(hl),e"}, - {zLD,"(hl),h"}, {zLD,"(hl),l"}, {zHLT,nullptr}, {zLD,"(hl),a"}, + {zLD,"(hl),h"}, {zLD,"(hl),l"}, {zHLT,nullptr}, {zLD,"(hl),a"}, {zLD,"a,b"}, {zLD,"a,c"}, {zLD,"a,d"}, {zLD,"a,e"}, {zLD,"a,h"}, {zLD,"a,l"}, {zLD,"a,(hl)"}, {zLD,"a,a"}, {zADD,"a,b"}, {zADD,"a,c"}, {zADD,"a,d"}, {zADD,"a,e"}, @@ -380,7 +391,7 @@ const z80_disassembler::z80dasm z80_disassembler::mnemonic_main[256] = char z80_disassembler::sign(s8 offset) { - return (offset < 0)? '-':'+'; + return (offset < 0) ? '-' : '+'; } u32 z80_disassembler::offs(s8 offset) @@ -415,7 +426,7 @@ offs_t z80_disassembler::disassemble(std::ostream &stream, offs_t pc, const data d = &mnemonic_cb[op]; break; case 0xed: - d = &mnemonic_ed[opcodes.r8(pos++)]; + d = &get_mnemonic_ed(opcodes.r8(pos++)); if (d->mnemonic == zDB) pos--; break; @@ -423,7 +434,7 @@ offs_t z80_disassembler::disassemble(std::ostream &stream, offs_t pc, const data { ixy = "ix"; u8 op1 = opcodes.r8(pos++); - if( op1 == 0xcb ) + if (op1 == 0xcb) { offset = params.r8(pos++); op1 = params.r8(pos++); @@ -441,7 +452,7 @@ offs_t z80_disassembler::disassemble(std::ostream &stream, offs_t pc, const data { ixy = "iy"; u8 op1 = opcodes.r8(pos++); - if( op1 == 0xcb ) + if (op1 == 0xcb) { offset = params.r8(pos++); op1 = params.r8(pos++); @@ -460,44 +471,49 @@ offs_t z80_disassembler::disassemble(std::ostream &stream, offs_t pc, const data break; } - if( d->arguments ) + uint32_t flags = s_flags[d->mnemonic]; + if (d->arguments) { util::stream_format(stream, "%-4s ", s_mnemonic[d->mnemonic]); const char *src = d->arguments; - while( *src ) + while (*src) { - switch( *src ) + switch (*src) { - case '?': /* illegal opcode */ + case '?': // illegal opcode util::stream_format(stream, "$%02x", op ); break; case 'A': util::stream_format(stream, "$%04X", params.r16(pos) ); pos += 2; + if (src != d->arguments) + flags |= STEP_COND; break; - case 'B': /* Byte op arg */ + case 'B': // Byte op arg util::stream_format(stream, "$%02X", params.r8(pos++) ); break; - case 'N': /* Immediate 16 bit */ + case 'N': // Immediate 16 bit util::stream_format(stream, "$%04X", params.r16(pos) ); pos += 2; break; - case 'O': /* Offset relative to PC */ + case 'O': // Offset relative to PC util::stream_format(stream, "$%04X", (pc + s8(params.r8(pos++)) + 2) & 0xffff); + if (src != d->arguments) + flags |= STEP_COND; break; - case 'P': /* Port number */ + case 'P': // Port number util::stream_format(stream, "$%02X", params.r8(pos++) ); break; - case 'V': /* Restart vector */ + case 'V': // Restart vector util::stream_format(stream, "$%02X", op & 0x38 ); break; - case 'W': /* Memory address word */ + case 'W': // Memory address word util::stream_format(stream, "$%04X", params.r16(pos) ); pos += 2; break; case 'X': offset = params.r8(pos++); - /* fall through */ + [[fallthrough]]; case 'Y': util::stream_format(stream,"(%s%c$%02x)", ixy, sign(offset), offs(offset) ); break; @@ -506,14 +522,17 @@ offs_t z80_disassembler::disassemble(std::ostream &stream, offs_t pc, const data break; default: stream << *src; + break; } src++; } + if (d->mnemonic == zRET) + flags |= STEP_COND; } else { util::stream_format(stream, "%s", s_mnemonic[d->mnemonic]); } - return (pos - pc) | s_flags[d->mnemonic] | SUPPORTED; + return (pos - pc) | flags | SUPPORTED; } |