Update changes

dos2unix cleanup
This commit is contained in:
Stanislav Shwartsman 2003-12-24 20:44:39 +00:00
parent ab6b9c7dcb
commit fc1473cb8c
2 changed files with 380 additions and 374 deletions

View File

@ -32,6 +32,11 @@ Changes in 2.1 (November 27, 2003):
- 64-bit addressing support for x86-64 mode (Christophe Bothamy)
- implemented FCMOVcc instructions
- Disassembler
- replaced Bochs disassember. new table-based disassembler fully supports
all IA-32 instruction sets including FPU/MMX/XMM/SSE/SSE2/SSE3 opcodes.
More Details:
[+] Added emulation of AMD 3DNow! instructions set.
@ -239,6 +244,7 @@ Patches applied:
- these S.F. bugs were fixed
// CB : I ran the request on SF, these bugs have definitely been closed
// since 2.0.2). There might have been others, during 2.0 to 2.0.2 times
#859768 cpuid
#843433 cdrom.cc on MacOSX: wrong const names
#851331 .cvsignore files in tarball
#787005 Some MOV instructions are not implemented!!!

View File

@ -1,374 +1,374 @@
#include "disasm.h"
extern const char *general_16bit_reg_name[8];
extern const char *general_32bit_reg_name[8];
static const char *sreg_mod01_rm32[8] = {
"ds", "ds", "ds", "ds", "??", "ss", "ds", "ds"
};
static const char *sreg_mod10_rm32[8] = {
"ds", "ds", "ds", "ds", "??", "ss", "ds", "ds"
};
static const char *sreg_mod00_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ds", "ds", "ds"
};
static const char *sreg_mod01_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ss", "ds", "ds"
};
static const char *sreg_mod10_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ss", "ds", "ds"
};
static const char *sreg_mod00_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ds", "ds"
};
static const char *sreg_mod01_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ss", "ds"
};
static const char *sreg_mod10_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ss", "ds"
};
static const char *intel_index16[8] = {
"bx+si",
"bx+di",
"bp+si",
"bp+di",
"si",
"di",
"bp",
"bx"
};
static const char *index_name32[8] = {
"eax", "ecx", "edx", "ebx", "???", "ebp", "esi", "edi"
};
void disassembler::decode_modrm()
{
modrm = fetch_byte();
BX_DECODE_MODRM(modrm, mod, nnn, rm);
if (i32bit_addrsize)
{
/* use 32bit addressing modes. orthogonal base & index registers,
scaling available, etc. */
if (mod == 3) {
/* mod, reg, reg */
return;
}
else { /* mod != 3 */
if (rm != 4) { /* rm != 100b, no s-i-b byte */
// one byte modrm
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve32_mod0;
if (rm == 5) /* no reg, 32-bit displacement */
displacement.displ32 = fetch_dword();
break;
case 1:
/* reg, 8-bit displacement, sign extend */
resolve_modrm = &disassembler::resolve32_mod1;
displacement.displ32 = (Bit8s) fetch_byte();
break;
case 2:
/* reg, 32-bit displacement */
resolve_modrm = &disassembler::resolve32_mod2;
displacement.displ32 = fetch_dword();
break;
} /* switch (mod) */
} /* if (rm != 4) */
else { /* rm == 4, s-i-b byte follows */
sib = fetch_byte();
BX_DECODE_SIB(sib, scale, index, base);
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve32_mod0_rm4;
if (base == 5)
displacement.displ32 = fetch_dword();
break;
case 1:
resolve_modrm = &disassembler::resolve32_mod1_rm4;
displacement.displ8 = fetch_byte();
break;
case 2:
resolve_modrm = &disassembler::resolve32_mod2_rm4;
displacement.displ32 = fetch_dword();
break;
}
} /* s-i-b byte follows */
} /* if (mod != 3) */
}
else {
/* 16 bit addressing modes. */
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve16_mod0;
if(rm == 6)
displacement.displ16 = fetch_word();
break;
case 1:
/* reg, 8-bit displacement, sign extend */
resolve_modrm = &disassembler::resolve16_mod1;
displacement.displ16 = (Bit8s) fetch_byte();
break;
case 2:
resolve_modrm = &disassembler::resolve16_mod2;
displacement.displ16 = fetch_word();
break;
case 3:
/* mod, reg, reg */
return;
} /* switch (mod) ... */
}
}
void disassembler::print_datasize(unsigned mode)
{
switch(mode)
{
case B_MODE:
dis_sprintf("byte ptr ");
break;
case W_MODE:
dis_sprintf("word ptr ");
break;
case D_MODE:
dis_sprintf("dword ptr ");
break;
case V_MODE:
if (i32bit_opsize)
dis_sprintf("dword ptr ");
else
dis_sprintf("word ptr ");
break;
case Q_MODE:
dis_sprintf("qword ptr ");
break;
case O_MODE:
dis_sprintf("oword ptr ");
break;
case T_MODE:
dis_sprintf("tword ptr ");
break;
case X_MODE:
break;
};
}
void disassembler::resolve16_mod0(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod00_rm16[rm];
print_datasize(mode);
if(rm == 6)
{
dis_sprintf("[%s:0x%x]", mod_rm_seg_reg, (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve16_mod1(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_rm16[rm];
print_datasize(mode);
if (displacement.displ16)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
intel_index16[rm], (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve16_mod2(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_rm16[rm];
print_datasize(mode);
if (displacement.displ16)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
intel_index16[rm], (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve32_mod0(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = "ds";
print_datasize(mode);
if (rm == 5) { /* no reg, 32-bit displacement */
dis_sprintf("[%s:0x%x]", mod_rm_seg_reg, displacement.displ32);
}
else {
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod1(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_rm32[rm];
print_datasize(mode);
/* reg, 8-bit displacement, sign extend */
if (displacement.displ32)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
general_32bit_reg_name[rm], (unsigned) displacement.displ32);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod2(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_rm32[rm];
print_datasize(mode);
/* reg, 32-bit displacement */
if (displacement.displ32)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
general_32bit_reg_name[rm], (unsigned) displacement.displ32);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod0_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod00_base32[base];
print_datasize(mode);
dis_sprintf("%s:[", mod_rm_seg_reg);
if (base != 5)
dis_sprintf("%s+", general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
if (base == 5) dis_sprintf("+");
}
if (base == 5)
dis_sprintf("0x%x", (unsigned) displacement.displ32);
dis_sprintf("]");
}
void disassembler::resolve32_mod1_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_base32[base];
print_datasize(mode);
dis_sprintf("%s:[%s", mod_rm_seg_reg, general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("+%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
}
if (displacement.displ8)
dis_sprintf("+0x%x", (unsigned) displacement.displ8);
dis_sprintf("]");
}
void disassembler::resolve32_mod2_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_base32[base];
print_datasize(mode);
dis_sprintf("%s:[%s", mod_rm_seg_reg, general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("+%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
}
if (displacement.displ32)
dis_sprintf("+0x%x", (unsigned) displacement.displ32);
dis_sprintf("]");
}
#include "disasm.h"
extern const char *general_16bit_reg_name[8];
extern const char *general_32bit_reg_name[8];
static const char *sreg_mod01_rm32[8] = {
"ds", "ds", "ds", "ds", "??", "ss", "ds", "ds"
};
static const char *sreg_mod10_rm32[8] = {
"ds", "ds", "ds", "ds", "??", "ss", "ds", "ds"
};
static const char *sreg_mod00_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ds", "ds", "ds"
};
static const char *sreg_mod01_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ss", "ds", "ds"
};
static const char *sreg_mod10_base32[8] = {
"ds", "ds", "ds", "ds", "ss", "ss", "ds", "ds"
};
static const char *sreg_mod00_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ds", "ds"
};
static const char *sreg_mod01_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ss", "ds"
};
static const char *sreg_mod10_rm16[8] = {
"ds", "ds", "ss", "ss", "ds", "ds", "ss", "ds"
};
static const char *intel_index16[8] = {
"bx+si",
"bx+di",
"bp+si",
"bp+di",
"si",
"di",
"bp",
"bx"
};
static const char *index_name32[8] = {
"eax", "ecx", "edx", "ebx", "???", "ebp", "esi", "edi"
};
void disassembler::decode_modrm()
{
modrm = fetch_byte();
BX_DECODE_MODRM(modrm, mod, nnn, rm);
if (i32bit_addrsize)
{
/* use 32bit addressing modes. orthogonal base & index registers,
scaling available, etc. */
if (mod == 3) {
/* mod, reg, reg */
return;
}
else { /* mod != 3 */
if (rm != 4) { /* rm != 100b, no s-i-b byte */
// one byte modrm
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve32_mod0;
if (rm == 5) /* no reg, 32-bit displacement */
displacement.displ32 = fetch_dword();
break;
case 1:
/* reg, 8-bit displacement, sign extend */
resolve_modrm = &disassembler::resolve32_mod1;
displacement.displ32 = (Bit8s) fetch_byte();
break;
case 2:
/* reg, 32-bit displacement */
resolve_modrm = &disassembler::resolve32_mod2;
displacement.displ32 = fetch_dword();
break;
} /* switch (mod) */
} /* if (rm != 4) */
else { /* rm == 4, s-i-b byte follows */
sib = fetch_byte();
BX_DECODE_SIB(sib, scale, index, base);
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve32_mod0_rm4;
if (base == 5)
displacement.displ32 = fetch_dword();
break;
case 1:
resolve_modrm = &disassembler::resolve32_mod1_rm4;
displacement.displ8 = fetch_byte();
break;
case 2:
resolve_modrm = &disassembler::resolve32_mod2_rm4;
displacement.displ32 = fetch_dword();
break;
}
} /* s-i-b byte follows */
} /* if (mod != 3) */
}
else {
/* 16 bit addressing modes. */
switch (mod) {
case 0:
resolve_modrm = &disassembler::resolve16_mod0;
if(rm == 6)
displacement.displ16 = fetch_word();
break;
case 1:
/* reg, 8-bit displacement, sign extend */
resolve_modrm = &disassembler::resolve16_mod1;
displacement.displ16 = (Bit8s) fetch_byte();
break;
case 2:
resolve_modrm = &disassembler::resolve16_mod2;
displacement.displ16 = fetch_word();
break;
case 3:
/* mod, reg, reg */
return;
} /* switch (mod) ... */
}
}
void disassembler::print_datasize(unsigned mode)
{
switch(mode)
{
case B_MODE:
dis_sprintf("byte ptr ");
break;
case W_MODE:
dis_sprintf("word ptr ");
break;
case D_MODE:
dis_sprintf("dword ptr ");
break;
case V_MODE:
if (i32bit_opsize)
dis_sprintf("dword ptr ");
else
dis_sprintf("word ptr ");
break;
case Q_MODE:
dis_sprintf("qword ptr ");
break;
case O_MODE:
dis_sprintf("oword ptr ");
break;
case T_MODE:
dis_sprintf("tword ptr ");
break;
case X_MODE:
break;
};
}
void disassembler::resolve16_mod0(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod00_rm16[rm];
print_datasize(mode);
if(rm == 6)
{
dis_sprintf("[%s:0x%x]", mod_rm_seg_reg, (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve16_mod1(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_rm16[rm];
print_datasize(mode);
if (displacement.displ16)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
intel_index16[rm], (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve16_mod2(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_rm16[rm];
print_datasize(mode);
if (displacement.displ16)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
intel_index16[rm], (unsigned) displacement.displ16);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, intel_index16[rm]);
}
}
void disassembler::resolve32_mod0(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = "ds";
print_datasize(mode);
if (rm == 5) { /* no reg, 32-bit displacement */
dis_sprintf("[%s:0x%x]", mod_rm_seg_reg, displacement.displ32);
}
else {
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod1(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_rm32[rm];
print_datasize(mode);
/* reg, 8-bit displacement, sign extend */
if (displacement.displ32)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
general_32bit_reg_name[rm], (unsigned) displacement.displ32);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod2(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_rm32[rm];
print_datasize(mode);
/* reg, 32-bit displacement */
if (displacement.displ32)
{
dis_sprintf("%s:[%s+0x%x]", mod_rm_seg_reg,
general_32bit_reg_name[rm], (unsigned) displacement.displ32);
}
else
{
dis_sprintf("%s:[%s]", mod_rm_seg_reg, general_32bit_reg_name[rm]);
}
}
void disassembler::resolve32_mod0_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod00_base32[base];
print_datasize(mode);
dis_sprintf("%s:[", mod_rm_seg_reg);
if (base != 5)
dis_sprintf("%s+", general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
if (base == 5) dis_sprintf("+");
}
if (base == 5)
dis_sprintf("0x%x", (unsigned) displacement.displ32);
dis_sprintf("]");
}
void disassembler::resolve32_mod1_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod01_base32[base];
print_datasize(mode);
dis_sprintf("%s:[%s", mod_rm_seg_reg, general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("+%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
}
if (displacement.displ8)
dis_sprintf("+0x%x", (unsigned) displacement.displ8);
dis_sprintf("]");
}
void disassembler::resolve32_mod2_rm4(unsigned mode)
{
const char *mod_rm_seg_reg;
if (seg_override)
mod_rm_seg_reg = seg_override;
else
mod_rm_seg_reg = sreg_mod10_base32[base];
print_datasize(mode);
dis_sprintf("%s:[%s", mod_rm_seg_reg, general_32bit_reg_name[base]);
if (index != 4)
{
dis_sprintf("+%s", index_name32[index]);
if (scale)
dis_sprintf("*%u", 1 << scale);
}
if (displacement.displ32)
dis_sprintf("+0x%x", (unsigned) displacement.displ32);
dis_sprintf("]");
}