diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index c9639d1d7a1..126d28ed524 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -1515,6 +1515,7 @@ if (CPUS["NEC"]~=null) then files { MAME_DIR .. "src/devices/cpu/nec/nec.cpp", MAME_DIR .. "src/devices/cpu/nec/nec.h", + MAME_DIR .. "src/devices/cpu/nec/nec_common.h", MAME_DIR .. "src/devices/cpu/nec/necea.h", MAME_DIR .. "src/devices/cpu/nec/necinstr.h", MAME_DIR .. "src/devices/cpu/nec/necinstr.hxx", diff --git a/src/devices/cpu/nec/nec_common.h b/src/devices/cpu/nec/nec_common.h new file mode 100644 index 00000000000..4356214a302 --- /dev/null +++ b/src/devices/cpu/nec/nec_common.h @@ -0,0 +1,9 @@ +#ifndef NEC_COMMON_H +#define NEC_COMMON_H + +#include + +extern int necv_dasm_one(std::ostream &stream, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table); +extern int necv_dasm_one(char *buffer, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table); + +#endif // NEC_COMMON_H diff --git a/src/devices/cpu/nec/necdasm.cpp b/src/devices/cpu/nec/necdasm.cpp index 78e3badea8e..e3fdb36f94a 100644 --- a/src/devices/cpu/nec/necdasm.cpp +++ b/src/devices/cpu/nec/necdasm.cpp @@ -8,6 +8,7 @@ */ #include "emu.h" +#include "nec_common.h" static const uint8_t *Iconfig; @@ -985,10 +986,9 @@ static void handle_modrm(char* s) disp16 = FETCHD16(); s += sprintf( s, "%s", shexstring((int32_t)disp16, 0, true) ); } - s += sprintf( s, "]" ); -} + s += sprintf( s, "]" );} -static char* handle_param(char* s, uint32_t param) +static void handle_param(std::ostream &stream, uint32_t param) { uint8_t i8; uint16_t i16; @@ -1000,139 +1000,138 @@ static char* handle_param(char* s, uint32_t param) switch(param) { case PARAM_REG8: - s += sprintf( s, "%s", nec_reg8[MODRM_REG1] ); + util::stream_format( stream, "%s", nec_reg8[MODRM_REG1] ); break; case PARAM_REG16: - s += sprintf( s, "%s", nec_reg[MODRM_REG1] ); + util::stream_format( stream, "%s", nec_reg[MODRM_REG1] ); break; case PARAM_REG2_8: - s += sprintf( s, "%s", nec_reg8[MODRM_REG2] ); + util::stream_format( stream, "%s", nec_reg8[MODRM_REG2] ); break; case PARAM_REG2_16: - s += sprintf( s, "%s", nec_reg[MODRM_REG2] ); + util::stream_format( stream, "%s", nec_reg[MODRM_REG2] ); break; case PARAM_RM8: case PARAM_RMPTR8: if( modrm >= 0xc0 ) { - s += sprintf( s, "%s", nec_reg8[MODRM_REG2] ); + util::stream_format( stream, "%s", nec_reg8[MODRM_REG2] ); } else { if (param == PARAM_RMPTR8) - s += sprintf( s, "byte ptr " ); - s += sprintf( s, "%s", modrm_string ); + util::stream_format( stream, "byte ptr " ); + util::stream_format( stream, "%s", modrm_string ); } break; case PARAM_RM16: case PARAM_RMPTR16: if( modrm >= 0xc0 ) { - s += sprintf( s, "%s", nec_reg[MODRM_REG2] ); + util::stream_format( stream, "%s", nec_reg[MODRM_REG2] ); } else { if (param == PARAM_RMPTR16) - s += sprintf( s, "word ptr " ); - s += sprintf( s, "%s", modrm_string ); + util::stream_format( stream, "word ptr " ); + util::stream_format( stream, "%s", modrm_string ); } break; case PARAM_I3: i8 = FETCHD(); - s += sprintf( s, "%d", i8 & 0x07 ); + util::stream_format( stream, "%d", i8 & 0x07 ); break; case PARAM_I4: i8 = FETCHD(); - s += sprintf( s, "%d", i8 & 0x0f ); + util::stream_format( stream, "%d", i8 & 0x0f ); break; case PARAM_I8: i8 = FETCHD(); - s += sprintf( s, "%s", shexstring((int8_t)i8, 0, false) ); + util::stream_format( stream, "%s", shexstring((int8_t)i8, 0, false) ); break; case PARAM_I16: i16 = FETCHD16(); - s += sprintf( s, "%s", shexstring((int16_t)i16, 0, false) ); + util::stream_format( stream, "%s", shexstring((int16_t)i16, 0, false) ); break; case PARAM_UI8: i8 = FETCHD(); - s += sprintf( s, "%s", shexstring((uint8_t)i8, 0, false) ); + util::stream_format( stream, "%s", shexstring((uint8_t)i8, 0, false) ); break; case PARAM_IMM: i16 = FETCHD16(); - s += sprintf( s, "%s", hexstring(i16, 0) ); + util::stream_format( stream, "%s", hexstring(i16, 0) ); break; case PARAM_ADDR: addr = FETCHD16(); ptr = FETCHD16(); - s += sprintf( s, "%s:", hexstring(ptr, 4) ); - s += sprintf( s, "%s", hexstring(addr, 0) ); + util::stream_format( stream, "%s:", hexstring(ptr, 4) ); + util::stream_format( stream, "%s", hexstring(addr, 0) ); break; case PARAM_REL16: /* make sure to keep the relative offset within the segment */ d16 = FETCHD16(); - s += sprintf( s, "%s", hexstring((pc & 0xFFFF0000) | ((pc + d16) & 0x0000FFFF), 0) ); + util::stream_format( stream, "%s", hexstring((pc & 0xFFFF0000) | ((pc + d16) & 0x0000FFFF), 0) ); break; case PARAM_REL8: d8 = FETCHD(); - s += sprintf( s, "%s", hexstring(pc + d8, 0) ); + util::stream_format( stream, "%s", hexstring(pc + d8, 0) ); break; case PARAM_MEM_OFFS: switch(segment) { - case SEG_PS: s += sprintf( s, "ps:" ); break; - case SEG_DS0: s += sprintf( s, "ds0:" ); break; - case SEG_DS1: s += sprintf( s, "ds1:" ); break; - case SEG_SS: s += sprintf( s, "ss:" ); break; + case SEG_PS: util::stream_format( stream, "ps:" ); break; + case SEG_DS0: util::stream_format( stream, "ds0:" ); break; + case SEG_DS1: util::stream_format( stream, "ds1:" ); break; + case SEG_SS: util::stream_format( stream, "ss:" ); break; } i16 = FETCHD16(); - s += sprintf( s, "[%s]", hexstring(i16, 0) ); + util::stream_format( stream, "[%s]", hexstring(i16, 0) ); break; case PARAM_SREG: - s += sprintf( s, "%s", nec_sreg[MODRM_REG1] ); + util::stream_format( stream, "%s", nec_sreg[MODRM_REG1] ); break; case PARAM_SFREG: i8 = FETCHD(); - s += sprintf( s, "%s", nec_sfreg[i8] ); + util::stream_format( stream, "%s", nec_sfreg[i8] ); break; case PARAM_1: - s += sprintf( s, "1" ); + util::stream_format( stream, "1" ); break; - case PARAM_AL: s += sprintf( s, "al" ); break; - case PARAM_CL: s += sprintf( s, "cl" ); break; - case PARAM_DL: s += sprintf( s, "dl" ); break; - case PARAM_BL: s += sprintf( s, "bl" ); break; - case PARAM_AH: s += sprintf( s, "ah" ); break; - case PARAM_CH: s += sprintf( s, "ch" ); break; - case PARAM_DH: s += sprintf( s, "dh" ); break; - case PARAM_BH: s += sprintf( s, "bh" ); break; + case PARAM_AL: util::stream_format( stream, "al" ); break; + case PARAM_CL: util::stream_format( stream, "cl" ); break; + case PARAM_DL: util::stream_format( stream, "dl" ); break; + case PARAM_BL: util::stream_format( stream, "bl" ); break; + case PARAM_AH: util::stream_format( stream, "ah" ); break; + case PARAM_CH: util::stream_format( stream, "ch" ); break; + case PARAM_DH: util::stream_format( stream, "dh" ); break; + case PARAM_BH: util::stream_format( stream, "bh" ); break; - case PARAM_AW: s += sprintf( s, "aw" ); break; - case PARAM_CW: s += sprintf( s, "cw" ); break; - case PARAM_DW: s += sprintf( s, "dw" ); break; - case PARAM_BW: s += sprintf( s, "bw" ); break; - case PARAM_SP: s += sprintf( s, "sp" ); break; - case PARAM_BP: s += sprintf( s, "bp" ); break; - case PARAM_IX: s += sprintf( s, "ix" ); break; - case PARAM_IY: s += sprintf( s, "iy" ); break; + case PARAM_AW: util::stream_format( stream, "aw" ); break; + case PARAM_CW: util::stream_format( stream, "cw" ); break; + case PARAM_DW: util::stream_format( stream, "dw" ); break; + case PARAM_BW: util::stream_format( stream, "bw" ); break; + case PARAM_SP: util::stream_format( stream, "sp" ); break; + case PARAM_BP: util::stream_format( stream, "bp" ); break; + case PARAM_IX: util::stream_format( stream, "ix" ); break; + case PARAM_IY: util::stream_format( stream, "iy" ); break; } - return s; } -static void handle_fpu(char *s, uint8_t op1, uint8_t op2) +static void handle_fpu(std::ostream &stream, uint8_t op1, uint8_t op2) { switch (op1 & 0x7) { @@ -1145,28 +1144,28 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fadd dword ptr %s", modrm_string); break; - case 1: sprintf(s, "fmul dword ptr %s", modrm_string); break; - case 2: sprintf(s, "fcom dword ptr %s", modrm_string); break; - case 3: sprintf(s, "fcomp dword ptr %s", modrm_string); break; - case 4: sprintf(s, "fsub dword ptr %s", modrm_string); break; - case 5: sprintf(s, "fsubr dword ptr %s", modrm_string); break; - case 6: sprintf(s, "fdiv dword ptr %s", modrm_string); break; - case 7: sprintf(s, "fdivr dword ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fadd dword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "fmul dword ptr %s", modrm_string); break; + case 2: util::stream_format(stream, "fcom dword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fcomp dword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fsub dword ptr %s", modrm_string); break; + case 5: util::stream_format(stream, "fsubr dword ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fdiv dword ptr %s", modrm_string); break; + case 7: util::stream_format(stream, "fdivr dword ptr %s", modrm_string); break; } } else { switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fadd st(0),st(%d)", op2 & 0x7); break; - case 1: sprintf(s, "fcom st(0),st(%d)", op2 & 0x7); break; - case 2: sprintf(s, "fsub st(0),st(%d)", op2 & 0x7); break; - case 3: sprintf(s, "fdiv st(0),st(%d)", op2 & 0x7); break; - case 4: sprintf(s, "fmul st(0),st(%d)", op2 & 0x7); break; - case 5: sprintf(s, "fcomp st(0),st(%d)", op2 & 0x7); break; - case 6: sprintf(s, "fsubr st(0),st(%d)", op2 & 0x7); break; - case 7: sprintf(s, "fdivr st(0),st(%d)", op2 & 0x7); break; + case 0: util::stream_format(stream, "fadd st(0),st(%d)", op2 & 0x7); break; + case 1: util::stream_format(stream, "fcom st(0),st(%d)", op2 & 0x7); break; + case 2: util::stream_format(stream, "fsub st(0),st(%d)", op2 & 0x7); break; + case 3: util::stream_format(stream, "fdiv st(0),st(%d)", op2 & 0x7); break; + case 4: util::stream_format(stream, "fmul st(0),st(%d)", op2 & 0x7); break; + case 5: util::stream_format(stream, "fcomp st(0),st(%d)", op2 & 0x7); break; + case 6: util::stream_format(stream, "fsubr st(0),st(%d)", op2 & 0x7); break; + case 7: util::stream_format(stream, "fdivr st(0),st(%d)", op2 & 0x7); break; } } break; @@ -1181,14 +1180,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fld dword ptr %s", modrm_string); break; - case 1: sprintf(s, "??? (FPU)"); break; - case 2: sprintf(s, "fst dword ptr %s", modrm_string); break; - case 3: sprintf(s, "fstp dword ptr %s", modrm_string); break; - case 4: sprintf(s, "fldenv word ptr %s", modrm_string); break; - case 5: sprintf(s, "fldcw word ptr %s", modrm_string); break; - case 6: sprintf(s, "fstenv word ptr %s", modrm_string); break; - case 7: sprintf(s, "fstcw word ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fld dword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "??? (FPU)"); break; + case 2: util::stream_format(stream, "fst dword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fstp dword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fldenv word ptr %s", modrm_string); break; + case 5: util::stream_format(stream, "fldcw word ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fstenv word ptr %s", modrm_string); break; + case 7: util::stream_format(stream, "fstcw word ptr %s", modrm_string); break; } } else @@ -1196,41 +1195,41 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "fld st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fld st(0),st(%d)", op2 & 0x7); break; case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - sprintf(s, "fxch st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fxch st(0),st(%d)", op2 & 0x7); break; - case 0x10: sprintf(s, "fnop"); break; - case 0x20: sprintf(s, "fchs"); break; - case 0x21: sprintf(s, "fabs"); break; - case 0x24: sprintf(s, "ftst"); break; - case 0x25: sprintf(s, "fxam"); break; - case 0x28: sprintf(s, "fld1"); break; - case 0x29: sprintf(s, "fldl2t"); break; - case 0x2a: sprintf(s, "fldl2e"); break; - case 0x2b: sprintf(s, "fldpi"); break; - case 0x2c: sprintf(s, "fldlg2"); break; - case 0x2d: sprintf(s, "fldln2"); break; - case 0x2e: sprintf(s, "fldz"); break; - case 0x30: sprintf(s, "f2xm1"); break; - case 0x31: sprintf(s, "fyl2x"); break; - case 0x32: sprintf(s, "fptan"); break; - case 0x33: sprintf(s, "fpatan"); break; - case 0x34: sprintf(s, "fxtract"); break; - case 0x35: sprintf(s, "fprem1"); break; - case 0x36: sprintf(s, "fdecstp"); break; - case 0x37: sprintf(s, "fincstp"); break; - case 0x38: sprintf(s, "fprem"); break; - case 0x39: sprintf(s, "fyl2xp1"); break; - case 0x3a: sprintf(s, "fsqrt"); break; - case 0x3b: sprintf(s, "fsincos"); break; - case 0x3c: sprintf(s, "frndint"); break; - case 0x3d: sprintf(s, "fscale"); break; - case 0x3e: sprintf(s, "fsin"); break; - case 0x3f: sprintf(s, "fcos"); break; + case 0x10: util::stream_format(stream, "fnop"); break; + case 0x20: util::stream_format(stream, "fchs"); break; + case 0x21: util::stream_format(stream, "fabs"); break; + case 0x24: util::stream_format(stream, "ftst"); break; + case 0x25: util::stream_format(stream, "fxam"); break; + case 0x28: util::stream_format(stream, "fld1"); break; + case 0x29: util::stream_format(stream, "fldl2t"); break; + case 0x2a: util::stream_format(stream, "fldl2e"); break; + case 0x2b: util::stream_format(stream, "fldpi"); break; + case 0x2c: util::stream_format(stream, "fldlg2"); break; + case 0x2d: util::stream_format(stream, "fldln2"); break; + case 0x2e: util::stream_format(stream, "fldz"); break; + case 0x30: util::stream_format(stream, "f2xm1"); break; + case 0x31: util::stream_format(stream, "fyl2x"); break; + case 0x32: util::stream_format(stream, "fptan"); break; + case 0x33: util::stream_format(stream, "fpatan"); break; + case 0x34: util::stream_format(stream, "fxtract"); break; + case 0x35: util::stream_format(stream, "fprem1"); break; + case 0x36: util::stream_format(stream, "fdecstp"); break; + case 0x37: util::stream_format(stream, "fincstp"); break; + case 0x38: util::stream_format(stream, "fprem"); break; + case 0x39: util::stream_format(stream, "fyl2xp1"); break; + case 0x3a: util::stream_format(stream, "fsqrt"); break; + case 0x3b: util::stream_format(stream, "fsincos"); break; + case 0x3c: util::stream_format(stream, "frndint"); break; + case 0x3d: util::stream_format(stream, "fscale"); break; + case 0x3e: util::stream_format(stream, "fsin"); break; + case 0x3f: util::stream_format(stream, "fcos"); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1245,14 +1244,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fiadd dword ptr %s", modrm_string); break; - case 1: sprintf(s, "fimul dword ptr %s", modrm_string); break; - case 2: sprintf(s, "ficom dword ptr %s", modrm_string); break; - case 3: sprintf(s, "ficomp dword ptr %s", modrm_string); break; - case 4: sprintf(s, "fisub dword ptr %s", modrm_string); break; - case 5: sprintf(s, "fisubr dword ptr %s", modrm_string); break; - case 6: sprintf(s, "fidiv dword ptr %s", modrm_string); break; - case 7: sprintf(s, "fidivr dword ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fiadd dword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "fimul dword ptr %s", modrm_string); break; + case 2: util::stream_format(stream, "ficom dword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "ficomp dword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fisub dword ptr %s", modrm_string); break; + case 5: util::stream_format(stream, "fisubr dword ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fidiv dword ptr %s", modrm_string); break; + case 7: util::stream_format(stream, "fidivr dword ptr %s", modrm_string); break; } } else @@ -1260,18 +1259,18 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "fcmovb st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovb st(0),st(%d)", op2 & 0x7); break; case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - sprintf(s, "fcmove st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmove st(0),st(%d)", op2 & 0x7); break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: - sprintf(s, "fcmovbe st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovbe st(0),st(%d)", op2 & 0x7); break; case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - sprintf(s, "fcmovu st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovu st(0),st(%d)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } @@ -1287,14 +1286,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fild dword ptr %s", modrm_string); break; - case 1: sprintf(s, "??? (FPU)"); break; - case 2: sprintf(s, "fist dword ptr %s", modrm_string); break; - case 3: sprintf(s, "fistp dword ptr %s", modrm_string); break; - case 4: sprintf(s, "??? (FPU)"); break; - case 5: sprintf(s, "fld tword ptr %s", modrm_string); break; - case 6: sprintf(s, "??? (FPU)"); break; - case 7: sprintf(s, "fstp tword ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fild dword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "??? (FPU)"); break; + case 2: util::stream_format(stream, "fist dword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fistp dword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "??? (FPU)"); break; + case 5: util::stream_format(stream, "fld tword ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "??? (FPU)"); break; + case 7: util::stream_format(stream, "fstp tword ptr %s", modrm_string); break; } } else @@ -1302,27 +1301,27 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "fcmovnb st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovnb st(0),st(%d)", op2 & 0x7); break; case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - sprintf(s, "fcmovne st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovne st(0),st(%d)", op2 & 0x7); break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: - sprintf(s, "fcmovnbe st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovnbe st(0),st(%d)", op2 & 0x7); break; case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - sprintf(s, "fcmovnu st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcmovnu st(0),st(%d)", op2 & 0x7); break; - case 0x22: sprintf(s, "fclex"); break; - case 0x23: sprintf(s, "finit"); break; + case 0x22: util::stream_format(stream, "fclex"); break; + case 0x23: util::stream_format(stream, "finit"); break; case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - sprintf(s, "fucomi st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fucomi st(0),st(%d)", op2 & 0x7); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: - sprintf(s, "fcomi st(0),st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fcomi st(0),st(%d)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1337,14 +1336,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fadd qword ptr %s", modrm_string); break; - case 1: sprintf(s, "fmul qword ptr %s", modrm_string); break; - case 2: sprintf(s, "fcom qword ptr %s", modrm_string); break; - case 3: sprintf(s, "fcomp qword ptr %s", modrm_string); break; - case 4: sprintf(s, "fsub qword ptr %s", modrm_string); break; - case 5: sprintf(s, "fsubr qword ptr %s", modrm_string); break; - case 6: sprintf(s, "fdiv qword ptr %s", modrm_string); break; - case 7: sprintf(s, "fdivr qword ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fadd qword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "fmul qword ptr %s", modrm_string); break; + case 2: util::stream_format(stream, "fcom qword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fcomp qword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fsub qword ptr %s", modrm_string); break; + case 5: util::stream_format(stream, "fsubr qword ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fdiv qword ptr %s", modrm_string); break; + case 7: util::stream_format(stream, "fdivr qword ptr %s", modrm_string); break; } } else @@ -1352,24 +1351,24 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "fadd st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fadd st(%d),st(0)", op2 & 0x7); break; case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - sprintf(s, "fmul st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fmul st(%d),st(0)", op2 & 0x7); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: - sprintf(s, "fsubr st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fsubr st(%d),st(0)", op2 & 0x7); break; case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - sprintf(s, "fsub st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fsub st(%d),st(0)", op2 & 0x7); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: - sprintf(s, "fdivr st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fdivr st(%d),st(0)", op2 & 0x7); break; case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - sprintf(s, "fdiv st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fdiv st(%d),st(0)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1384,14 +1383,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fld qword ptr %s", modrm_string); break; - case 1: sprintf(s, "??? (FPU)"); break; - case 2: sprintf(s, "fst qword ptr %s", modrm_string); break; - case 3: sprintf(s, "fstp qword ptr %s", modrm_string); break; - case 4: sprintf(s, "frstor %s", modrm_string); break; - case 5: sprintf(s, "??? (FPU)"); break; - case 6: sprintf(s, "fsave %s", modrm_string); break; - case 7: sprintf(s, "fstsw word ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fld qword ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "??? (FPU)"); break; + case 2: util::stream_format(stream, "fst qword ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fstp qword ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "frstor %s", modrm_string); break; + case 5: util::stream_format(stream, "??? (FPU)"); break; + case 6: util::stream_format(stream, "fsave %s", modrm_string); break; + case 7: util::stream_format(stream, "fstsw word ptr %s", modrm_string); break; } } else @@ -1399,21 +1398,21 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "ffree st(%d)", op2 & 0x7); break; + util::stream_format(stream, "ffree st(%d)", op2 & 0x7); break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: - sprintf(s, "fst st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fst st(%d)", op2 & 0x7); break; case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - sprintf(s, "fstp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fstp st(%d)", op2 & 0x7); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: - sprintf(s, "fucom st(%d), st(0)", op2 & 0x7); break; + util::stream_format(stream, "fucom st(%d), st(0)", op2 & 0x7); break; case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - sprintf(s, "fucomp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fucomp st(%d)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1428,14 +1427,14 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fiadd word ptr %s", modrm_string); break; - case 1: sprintf(s, "fimul word ptr %s", modrm_string); break; - case 2: sprintf(s, "ficom word ptr %s", modrm_string); break; - case 3: sprintf(s, "ficomp word ptr %s", modrm_string); break; - case 4: sprintf(s, "fisub word ptr %s", modrm_string); break; - case 5: sprintf(s, "fisubr word ptr %s", modrm_string); break; - case 6: sprintf(s, "fidiv word ptr %s", modrm_string); break; - case 7: sprintf(s, "fidivr word ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fiadd word ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "fimul word ptr %s", modrm_string); break; + case 2: util::stream_format(stream, "ficom word ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "ficomp word ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fisub word ptr %s", modrm_string); break; + case 5: util::stream_format(stream, "fisubr word ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fidiv word ptr %s", modrm_string); break; + case 7: util::stream_format(stream, "fidivr word ptr %s", modrm_string); break; } } else @@ -1443,26 +1442,26 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) switch (op2 & 0x3f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - sprintf(s, "faddp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "faddp st(%d)", op2 & 0x7); break; case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - sprintf(s, "fmulp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fmulp st(%d)", op2 & 0x7); break; - case 0x19: sprintf(s, "fcompp"); break; + case 0x19: util::stream_format(stream, "fcompp"); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: - sprintf(s, "fsubrp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fsubrp st(%d)", op2 & 0x7); break; case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - sprintf(s, "fsubp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fsubp st(%d)", op2 & 0x7); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: - sprintf(s, "fdivrp st(%d), st(0)", op2 & 0x7); break; + util::stream_format(stream, "fdivrp st(%d), st(0)", op2 & 0x7); break; case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - sprintf(s, "fdivp st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fdivp st(%d)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1477,29 +1476,29 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) handle_modrm( modrm_string ); switch ((op2 >> 3) & 0x7) { - case 0: sprintf(s, "fild word ptr %s", modrm_string); break; - case 1: sprintf(s, "??? (FPU)"); break; - case 2: sprintf(s, "fist word ptr %s", modrm_string); break; - case 3: sprintf(s, "fistp word ptr %s", modrm_string); break; - case 4: sprintf(s, "fbld %s", modrm_string); break; - case 5: sprintf(s, "fild qword ptr %s", modrm_string); break; - case 6: sprintf(s, "fbstp %s", modrm_string); break; - case 7: sprintf(s, "fistp qword ptr %s", modrm_string); break; + case 0: util::stream_format(stream, "fild word ptr %s", modrm_string); break; + case 1: util::stream_format(stream, "??? (FPU)"); break; + case 2: util::stream_format(stream, "fist word ptr %s", modrm_string); break; + case 3: util::stream_format(stream, "fistp word ptr %s", modrm_string); break; + case 4: util::stream_format(stream, "fbld %s", modrm_string); break; + case 5: util::stream_format(stream, "fild qword ptr %s", modrm_string); break; + case 6: util::stream_format(stream, "fbstp %s", modrm_string); break; + case 7: util::stream_format(stream, "fistp qword ptr %s", modrm_string); break; } } else { switch (op2 & 0x3f) { - case 0x20: sprintf(s, "fstsw aw"); break; + case 0x20: util::stream_format(stream, "fstsw aw"); break; case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - sprintf(s, "fucomip st(%d)", op2 & 0x7); break; + util::stream_format(stream, "fucomip st(%d)", op2 & 0x7); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: - sprintf(s, "fcomip st(%d),st(0)", op2 & 0x7); break; + util::stream_format(stream, "fcomip st(%d),st(0)", op2 & 0x7); break; - default: sprintf(s, "??? (FPU)"); break; + default: util::stream_format(stream, "??? (FPU)"); break; } } break; @@ -1507,7 +1506,7 @@ static void handle_fpu(char *s, uint8_t op1, uint8_t op2) } } -static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) +static void decode_opcode(std::ostream &stream, const NEC_I386_OPCODE *op, uint8_t op1 ) { int i; uint8_t op2; @@ -1516,7 +1515,7 @@ static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) { case TWO_BYTE: op2 = FETCHD(); - decode_opcode( s, &necv_opcode_table2[op2], op1 ); + decode_opcode( stream, &necv_opcode_table2[op2], op1 ); return; case SEG_PS: @@ -1526,14 +1525,14 @@ static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) segment = op->flags; op2 = FETCH(); if (Iconfig) op2 = Iconfig[op2]; - decode_opcode( s, &necv_opcode_table1[op2], op1 ); + decode_opcode( stream, &necv_opcode_table1[op2], op1 ); return; case PREFIX: - s += sprintf( s, "%-8s", op->mnemonic ); + util::stream_format( stream, "%-8s", op->mnemonic ); op2 = FETCH(); if (Iconfig) op2 = Iconfig[op2]; - decode_opcode( s, &necv_opcode_table1[op2], op1 ); + decode_opcode( stream, &necv_opcode_table1[op2], op1 ); return; case GROUP: @@ -1541,7 +1540,7 @@ static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) for( i=0; i < ARRAY_LENGTH(group_op_table); i++ ) { if( strcmp(op->mnemonic, group_op_table[i].mnemonic) == 0 ) { - decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 ); + decode_opcode( stream, &group_op_table[i].opcode[MODRM_REG1], op1 ); return; } } @@ -1549,7 +1548,7 @@ static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) case FPU: op2 = FETCHD(); - handle_fpu( s, op1, op2); + handle_fpu( stream, op1, op2); return; case MODRM: @@ -1557,29 +1556,29 @@ static void decode_opcode(char *s, const NEC_I386_OPCODE *op, uint8_t op1 ) break; } - s += sprintf( s, "%-8s", op->mnemonic ); + util::stream_format( stream, "%-8s", op->mnemonic ); dasm_flags = op->dasm_flags; if( op->param1 != 0 ) { - s = handle_param( s, op->param1 ); + handle_param(stream, op->param1); } if( op->param2 != 0 ) { - s += sprintf( s, "," ); - s = handle_param( s, op->param2 ); + util::stream_format( stream, "," ); + handle_param(stream, op->param2); } if( op->param3 != 0 ) { - s += sprintf( s, "," ); - s = handle_param( s, op->param3 ); + util::stream_format( stream, "," ); + handle_param(stream, op->param3); } return; handle_unknown: - sprintf(s, "???"); + util::stream_format(stream, "???"); } -int necv_dasm_one(char *buffer, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table) +int necv_dasm_one(std::ostream &stream, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table) { uint8_t op; Iconfig = decryption_table; @@ -1593,10 +1592,19 @@ int necv_dasm_one(char *buffer, uint32_t eip, const uint8_t *oprom, const uint8_ if (Iconfig) op = Iconfig[op]; - decode_opcode( buffer, &necv_opcode_table1[op], op ); + decode_opcode( stream, &necv_opcode_table1[op], op ); return (pc-eip) | dasm_flags | DASMFLAG_SUPPORTED; } +int necv_dasm_one(char *buffer, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table) +{ + std::ostringstream stream; + int result = necv_dasm_one(stream, eip, oprom, decryption_table); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} + CPU_DISASSEMBLE( nec ) { return necv_dasm_one(buffer, pc, oprom, nullptr); diff --git a/src/devices/cpu/nec/v25.cpp b/src/devices/cpu/nec/v25.cpp index 6c19555718c..ebce1dbaa90 100644 --- a/src/devices/cpu/nec/v25.cpp +++ b/src/devices/cpu/nec/v25.cpp @@ -44,6 +44,7 @@ typedef uint32_t DWORD; #include "v25.h" #include "v25priv.h" +#include "nec_common.h" const device_type V25 = &device_creator; const device_type V35 = &device_creator; @@ -413,8 +414,6 @@ void v25_common_device::execute_set_input(int irqline, int state) offs_t v25_common_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) { - extern int necv_dasm_one(char *buffer, uint32_t eip, const uint8_t *oprom, const uint8_t *decryption_table); - return necv_dasm_one(buffer, pc, oprom, m_v25v35_decryptiontable); }