summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-11-16 17:57:04 -0500
committer Nathan Woods <npwoods@mess.org>2016-11-16 18:04:50 -0500
commitd1e67f2c87b9ae4ef6d097cbed6807fcbd9ad31a (patch)
tree739907063d8591417b3c3c0fd4b45deb408f5b81 /src/devices/cpu
parentdc4086847a8aa57a3cbf8271c9692e664d213d28 (diff)
Changed the NEC disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/nec/nec_common.h1
-rw-r--r--src/devices/cpu/nec/necdasm.cpp427
2 files changed, 218 insertions, 210 deletions
diff --git a/src/devices/cpu/nec/nec_common.h b/src/devices/cpu/nec/nec_common.h
index c5be3f85651..4356214a302 100644
--- a/src/devices/cpu/nec/nec_common.h
+++ b/src/devices/cpu/nec/nec_common.h
@@ -3,6 +3,7 @@
#include <stdint.h>
+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 0500b9e52b6..e3fdb36f94a 100644
--- a/src/devices/cpu/nec/necdasm.cpp
+++ b/src/devices/cpu/nec/necdasm.cpp
@@ -986,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;
@@ -1001,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_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_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: 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)
{
@@ -1146,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;
@@ -1182,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
@@ -1197,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;
-
- 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;
-
- default: sprintf(s, "??? (FPU)"); break;
+ util::stream_format(stream, "fxch st(0),st(%d)", op2 & 0x7); 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: util::stream_format(stream, "??? (FPU)"); break;
}
}
break;
@@ -1246,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
@@ -1261,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;
}
}
@@ -1288,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
@@ -1303,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;
@@ -1338,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
@@ -1353,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;
@@ -1385,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
@@ -1400,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;
@@ -1429,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
@@ -1444,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;
@@ -1478,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;
@@ -1508,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;
@@ -1517,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:
@@ -1527,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:
@@ -1542,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;
}
}
@@ -1550,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:
@@ -1558,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;
@@ -1594,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);