OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / emu86.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/emu86.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/emu86.c
new file mode 100644 (file)
index 0000000..3135734
--- /dev/null
@@ -0,0 +1,1336 @@
+\r
+#include "core.h"\r
+\r
+//x86\83G\83~\83\85\83\8c\81[\83^\r
+//\89¼\91z86\83\82\81[\83h\82ð\97\98\97p\82·\82é\82Ì\82ª\93ï\82µ\82»\82¤\82È\82Ì\82Å\81A16bit\83R\81[\83h\82Ì\82Ý\91Î\89\9e\82Å\97Ç\82¢\82©\82ç\81A\r
+//CPU\82Æ\93¯\93\99\82Ì\93®\8dì\82ð\82·\82é\83G\83~\83\85\83\8c\81[\83^\81[\82ð\8dì\82é\81B\r
+//\83\81\83\82\83\8a\82Ö\82Ì\91S\8c \83A\83N\83Z\83X\82ª\89Â\94\\82Å\82 \82é\82±\82Æ\82ª\91O\92ñ\81B\r
+\r
+uchar *Emulator_x86_RegNames[] = {\r
+       "AX",\r
+       "CX",\r
+       "DX",\r
+       "BX",\r
+       "SP",\r
+       "BP",\r
+       "SI",\r
+       "DI"\r
+};\r
+\r
+uchar *Emulator_x86_SRegNames[] = {\r
+       "ES",\r
+       "CS",\r
+       "SS",\r
+       "DS",\r
+       "FS",\r
+       "GS",\r
+       "xx",\r
+       "xx"\r
+};\r
+\r
+uchar *Emulator_x86_ByteRegNames[] = {\r
+       "AL",\r
+       "CL",\r
+       "DL",\r
+       "BL",\r
+       "AH",\r
+       "CH",\r
+       "DH",\r
+       "BH"\r
+};\r
+\r
+void Emulator_x86_Initialize(Emulator_x86_Environment *env)\r
+{\r
+       env->EFLAGS.eflags                      = 0x00000002;\r
+       env->EIP                                = 0x0000fff0;\r
+\r
+       env->CR0.cr0                            = 0x60000010;\r
+       env->CR2                                = 0x00000000;\r
+       env->CR3.cr3                            = 0x00000000;\r
+       env->CR4.cr4                            = 0x00000000;\r
+\r
+       env->SReg[OPCODE_SREG3_ES].selector     = 0x0000;\r
+       env->SReg[OPCODE_SREG3_ES].base         = 0x00000000;\r
+       env->SReg[OPCODE_SREG3_ES].limit        = 0xffff;\r
+       env->SReg[OPCODE_SREG3_ES].type         = AR_PRESENT + AR_TYPE_DATA_RW + AR_TYPE_ACCESSED;\r
+       env->SReg[OPCODE_SREG3_CS]              = env->SReg[OPCODE_SREG3_ES];\r
+       env->SReg[OPCODE_SREG3_SS]              = env->SReg[OPCODE_SREG3_ES];\r
+       env->SReg[OPCODE_SREG3_DS]              = env->SReg[OPCODE_SREG3_ES];\r
+       env->SReg[OPCODE_SREG3_FS]              = env->SReg[OPCODE_SREG3_ES];\r
+       env->SReg[OPCODE_SREG3_GS]              = env->SReg[OPCODE_SREG3_ES];\r
+\r
+       env->GReg[OPCODE_REG_EAX]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_ECX]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_EDX]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_EBX]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_ESP]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_EBP]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_ESI]               = 0x00000000;\r
+       env->GReg[OPCODE_REG_EDI]               = 0x00000000;\r
+\r
+       env->GDTR.base                          = 0x00000000;\r
+       env->GDTR.limit                         = 0xffff;\r
+\r
+       env->IDTR.base                          = 0x00000000;\r
+       env->IDTR.limit                         = 0xffff;\r
+\r
+       env->now_opcode                         = 0x00;\r
+       env->operation_end                      = False;\r
+       env->operation_32bit                    = False;\r
+\r
+       return;\r
+}\r
+\r
+uint Emulator_x86_Execute(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_Put_EmulationInformation(env, "Emulator-x86:EIP=0x%08X ", env->EIP);\r
+\r
+       env->operation_prefix_lock_repeat = OPCODE_PREFIX_NONE;\r
+       env->operation_prefix_segment = OPCODE_SREG3_DS;\r
+       env->operation_prefix_opsize = OPCODE_PREFIX_NONE;\r
+       env->operation_prefix_addrsize = OPCODE_PREFIX_NONE;\r
+\r
+       for(; !env->operation_end; ){\r
+               env->now_opcode = Emulator_x86_FetchCode(env, 1);\r
+               Emulator_x86_Put_EmulationInformation(env, "opcode=0x%02X ", env->now_opcode);\r
+\r
+               if(0x40 <= env->now_opcode && env->now_opcode <= 0x47){ /*INC FullReg*/\r
+                       Emulator_x86_Operation_INC_RegOnly(env);\r
+\r
+               } else if(0x48 <= env->now_opcode && env->now_opcode <= 0x4F){  /*DEC FullReg*/\r
+                       Emulator_x86_Operation_DEC_RegOnly(env);\r
+\r
+               } else if(0x50 <= env->now_opcode && env->now_opcode <= 0x57){  /*PUSH FullReg*/\r
+                       Emulator_x86_Operation_PUSH_RegOnly(env);\r
+\r
+               } else if(0x58 <= env->now_opcode && env->now_opcode <= 0x5F){  /*POP FullReg*/\r
+                       Emulator_x86_Operation_POP_RegOnly(env);\r
+\r
+               } else if(0xB0 <= env->now_opcode && env->now_opcode <= 0xB7){  /*MOV ByteReg*/\r
+                       Emulator_x86_Operation_MOV_To_ByteReg(env);\r
+\r
+               } else if(0xB8 <= env->now_opcode && env->now_opcode <= 0xBF){  /*MOV FullSize*/\r
+                       Emulator_x86_Operation_MOV_To_Reg_FullSize(env);\r
+\r
+               } else if(env->now_opcode == 0x1B){     /*SBB Gv, Ev*/\r
+                       Emulator_x86_Operation_SBB_Gv_Ev(env);\r
+\r
+               } else if(env->now_opcode == 0x1E){     /*PUSH DS*/\r
+                       Emulator_x86_Push_SReg_To_Stack(env, OPCODE_SREG3_DS);\r
+                       env->operation_end = True;\r
+\r
+               } else if(env->now_opcode == 0x1F){     /*POP DS*/\r
+                       Emulator_x86_Pop_SReg_From_Stack(env, OPCODE_SREG3_DS);\r
+                       env->operation_end = True;\r
+\r
+               } else if(env->now_opcode == 0x26){     /*ES Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_ES;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:ES)");\r
+\r
+               } else if(env->now_opcode == 0x2E){     /*CS/BranchNotTaken Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_CS;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:CS)");\r
+\r
+               } else if(env->now_opcode == 0x31){     /*XOR Eb, Gb*/\r
+                       Emulator_x86_Operation_XOR_Eb_Gb(env);\r
+\r
+               } else if(env->now_opcode == 0x36){     /*SS Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_SS;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:SS)");\r
+\r
+               } else if(env->now_opcode == 0x3B){     /*CMP Gv, Ev*/\r
+                       Emulator_x86_Operation_CMP_Gv_Ev(env);\r
+\r
+               } else if(env->now_opcode == 0x3C){     /*CMP AL*/\r
+                       Emulator_x86_Operation_CMP_AL(env);\r
+\r
+               } else if(env->now_opcode == 0x3E){     /*DS/BranchTaken Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_DS;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:DS)");\r
+\r
+               } else if(env->now_opcode == 0x60){     /*PUSHA/PUSHAD*/\r
+                       Emulator_x86_Operation_PUSHA(env);\r
+\r
+               } else if(env->now_opcode == 0x61){     /*POPA/POPAD*/\r
+                       Emulator_x86_Operation_POPA(env);\r
+\r
+               } else if(env->now_opcode == 0x64){     /*FS Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_FS;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:FS)");\r
+\r
+               } else if(env->now_opcode == 0x65){     /*GS Prefix*/\r
+                       env->operation_prefix_segment = OPCODE_SREG3_GS;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:GS)");\r
+\r
+               } else if(env->now_opcode == 0x66){     /*OperandSize Prefix*/\r
+                       env->operation_prefix_opsize = OPCODE_PREFIX_OPERAND_SIZE;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:OperandSize)");\r
+\r
+               } else if(env->now_opcode == 0x67){     /*AddressSize Prefix*/\r
+                       env->operation_prefix_addrsize = OPCODE_PREFIX_ADDRESS_SIZE;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:AddressSize)");\r
+\r
+               } else if(env->now_opcode == 0x6A){     /*AddressSize Prefix*/\r
+                       Emulator_x86_Operation_PUSH_Ib(env);\r
+\r
+               } else if(env->now_opcode == 0x74){     /*JE rel8*/\r
+                       Emulator_x86_Operation_Jcc_JE_rel8(env);\r
+\r
+               } else if(env->now_opcode == 0x75){     /*JE rel8*/\r
+                       Emulator_x86_Operation_Jcc_JNE_rel8(env);\r
+\r
+               } else if(env->now_opcode == 0x89){     /*MOV Ev, Gv*/\r
+                       Emulator_x86_Operation_MOV_Ev_Gv(env);\r
+\r
+               } else if(env->now_opcode == 0x8A){     /*MOV Byte*/\r
+                       Emulator_x86_Operation_MOV_To_ByteReg_Gb_Eb(env);\r
+\r
+               } else if(env->now_opcode == 0x8D){     /*LEA*/\r
+                       Emulator_x86_Operation_LEA(env);\r
+\r
+               } else if(env->now_opcode == 0x8E){     /*MOV SegReg*/\r
+                       Emulator_x86_Operation_MOV_To_SegReg(env);\r
+\r
+               } else if(env->now_opcode == 0x8F){     /*POP Ev*/\r
+                       Emulator_x86_Operation_POP_Ev(env);\r
+\r
+               } else if(env->now_opcode == 0xA1){     /*MOV eAX, Ov*/\r
+                       Emulator_x86_Operation_MOV_eAX_Ov(env);\r
+\r
+               } else if(env->now_opcode == 0xA3){     /*MOV Ov, eAX*/\r
+                       Emulator_x86_Operation_MOV_Ov_eAX(env);\r
+\r
+               } else if(env->now_opcode == 0xC3){     /*near RET*/\r
+                       Emulator_x86_Operation_RET_Near(env);\r
+\r
+               } else if(env->now_opcode == 0xCD){     /*INT n*/\r
+                       Emulator_x86_Operation_INTn(env);\r
+\r
+               } else if(env->now_opcode == 0xE2){     /*LOOP Jv*/\r
+                       Emulator_x86_Operation_LOOP_Jv(env);\r
+\r
+               } else if(env->now_opcode == 0xE6){     /*OUT AL*/\r
+                       Emulator_x86_Operation_OUT_AL(env);\r
+\r
+               } else if(env->now_opcode == 0xE8){     /*CALL near*/\r
+                       Emulator_x86_Operation_CALL_Near_Relative(env);\r
+\r
+               } else if(env->now_opcode == 0xEB){     /*JMP short*/\r
+                       Emulator_x86_Operation_JMP_rel8(env);\r
+\r
+               } else if(env->now_opcode == 0xF0){     /*LOCK Prefix*/\r
+                       env->operation_prefix_lock_repeat = OPCODE_PREFIX_LOCK;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:LOCK)");\r
+\r
+               } else if(env->now_opcode == 0xF2){     /*REPNE/REPNZ Prefix*/\r
+                       env->operation_prefix_lock_repeat = OPCODE_PREFIX_REPNE_REPNZ;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:REPNE/REPNZ)");\r
+\r
+               } else if(env->now_opcode == 0xF3){     /*REP/REPE/REPZ Prefix*/\r
+                       env->operation_prefix_lock_repeat = OPCODE_PREFIX_REP_REPE_REPZ;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Prefix:REP/REPE/REPZ)");\r
+\r
+               } else if(env->now_opcode == 0xFB){     /*STI*/\r
+                       Emulator_x86_Operation_STI(env);\r
+\r
+               } else if(env->now_opcode == 0xFC){     /*CLD*/\r
+                       Emulator_x86_Operation_CLD(env);\r
+\r
+               } else{\r
+                       Emulator_x86_Put_EmulationInformation(env, "Unknown OperationCode.\n");\r
+                       return 0xFFFFFFFF;\r
+               }\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "\n");\r
+\r
+       env->operation_end = False;\r
+\r
+       return 0;\r
+}\r
+\r
+uint Emulator_x86_Execute_Auto(Emulator_x86_Environment *env)\r
+{\r
+       uint i;\r
+\r
+       for(i = 0; ; i++){\r
+               if(Emulator_x86_Execute(env) == 0xffffffff){\r
+                       break;\r
+               }\r
+       }\r
+       return i + 1;\r
+}\r
+\r
+int Emulator_x86_Put_EmulationInformation(Emulator_x86_Environment *env, const uchar format[], ...)\r
+{\r
+       int i;\r
+       uchar s[256];\r
+\r
+       i = vsnprintf(s, sizeof(s), format, (uint *)(&format + 1));\r
+       SerialPort_Send(s);\r
+\r
+       return i;\r
+}\r
+\r
+uint Emulator_x86_FetchCode(Emulator_x86_Environment *env, uint bytes)\r
+{\r
+       uint data;\r
+       uint i;\r
+\r
+       data = 0;\r
+       for(i = 0; i < bytes; i++){\r
+               data |= (*((uchar *)Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_CS, env->EIP)) << (i << 3));\r
+               Emulator_x86_InstructionPointer_Increment(env);\r
+       }\r
+\r
+       return data;\r
+}\r
+\r
+void Emulator_x86_InstructionPointer_Increment(Emulator_x86_Environment *env)\r
+{\r
+       env->EIP++;\r
+       if(!env->operation_32bit){\r
+               env->EIP &= 0x0000ffff;\r
+       }\r
+       return;\r
+}\r
+\r
+uint Emulator_x86_Get_EffectivePhysicalAddress(Emulator_x86_Environment *env, uint sreg, uint offset)\r
+{\r
+       uint addr;\r
+\r
+       addr = 0;\r
+\r
+       if(sreg > 5){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid SReg).");\r
+               return 0;\r
+       }\r
+\r
+       if(env->operation_32bit){       /*32-bit addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit mode is not implemented.");\r
+       } else{ /*16-bit addressing*/\r
+               addr = (env->SReg[sreg].selector << 4) + offset;\r
+       }\r
+       return addr;\r
+}\r
+\r
+uint Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(Emulator_x86_Environment *env, uint mrm)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint offset;\r
+       uint address;\r
+\r
+       modrm.modrm = mrm;\r
+       offset = 0;\r
+       address = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg only*/\r
+                       Emulator_x86_Put_EmulationInformation(env, "Not Address, From Register.");\r
+                       return 0;\r
+               } else{ /*From MemoryAddress*/\r
+                       if(modrm.bit.RM == OPCODE_RM16_ADDR_BX_SI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBX, True);\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_ESI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_BX_SI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBX, True);\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EDI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_BX_DI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBP, True);\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_ESI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_BP_SI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBP, True);\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EDI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_SI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_ESI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_DI){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EDI, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_MOD00_ADDR_DISP16){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBP, True);\r
+                       } else if(modrm.bit.RM == OPCODE_RM16_ADDR_BX){\r
+                               offset += Emulator_x86_MoveFromGReg(env, OPCODE_REG_EBX, True);\r
+                       }\r
+                       if(modrm.bit.Mod == OPCODE_MOD_INDEXONLY){\r
+                               if(modrm.bit.RM == OPCODE_RM16_MOD00_ADDR_DISP16){\r
+                                       offset = Emulator_x86_FetchCode(env, 2);\r
+                               }\r
+                       } else if(modrm.bit.Mod == OPCODE_MOD_INDEX_AND_DISP_BYTE){\r
+                               offset += Emulator_x86_FetchCode(env, 1);\r
+                       } else if(modrm.bit.Mod == OPCODE_MOD_INDEX_AND_DISP_FULL){\r
+                               offset += Emulator_x86_FetchCode(env, 2);\r
+                       }\r
+                       offset &= 0x0000ffff;\r
+                       address = Emulator_x86_Get_EffectivePhysicalAddress(env, env->operation_prefix_segment, offset);\r
+                       Emulator_x86_Put_EmulationInformation(env, "(Address Generated %s:0x%X = [0x%X])", Emulator_x86_SRegNames[env->operation_prefix_segment], offset, address);\r
+               }\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit mode is not implemented.");\r
+       }\r
+\r
+       return address;\r
+}\r
+\r
+void Emulator_x86_MoveToGReg(Emulator_x86_Environment *env, uint reg, uint data, uint fullsize)\r
+{\r
+       if(reg > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg).");\r
+               return;\r
+       }\r
+\r
+       if(fullsize){\r
+               if(env->operation_32bit){       /*DoubleWord*/\r
+                       env->GReg[reg] = data;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveToE%s:0x%X)", Emulator_x86_RegNames[reg], data);\r
+               } else{ /*Word*/\r
+                       env->GReg[reg] &= 0xffff0000;\r
+                       env->GReg[reg] |= 0x0000ffff & data;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveTo%s:0x%X)", Emulator_x86_RegNames[reg], data);\r
+               }\r
+       } else{ /*Byte*/\r
+               if(reg < 4){    /*Low*/\r
+                       env->GReg[reg] &= 0xffffff00;\r
+                       env->GReg[reg] |= 0x000000ff & data;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveTo%s:0x%X)", Emulator_x86_ByteRegNames[reg], data);\r
+               } else{ /*High*/\r
+                       reg -= 4;\r
+                       env->GReg[reg] &= 0xffff00ff;\r
+                       env->GReg[reg] |= 0x0000ff00 & (data << 8);\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveTo%s:0x%X)", Emulator_x86_ByteRegNames[reg + 4], data);\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+uint Emulator_x86_MoveFromGReg(Emulator_x86_Environment *env, uint reg, uint fullsize)\r
+{\r
+       uint data;\r
+\r
+       if(reg > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg).");\r
+               return 0;\r
+       }\r
+\r
+       if(fullsize){\r
+               if(env->operation_32bit){       /*DoubleWord*/\r
+                       data = env->GReg[reg];\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveFromE%s:0x%X)", Emulator_x86_RegNames[reg], data);\r
+               } else{ /*Word*/\r
+                       data = env->GReg[reg];\r
+                       data &= 0x0000ffff;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveFrom%s:0x%X)", Emulator_x86_RegNames[reg], data);\r
+               }\r
+       } else{ /*Byte*/\r
+               if(reg < 4){    /*Low*/\r
+                       data = env->GReg[reg];\r
+                       data &= 0x000000ff;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveFrom%s:0x%X)", Emulator_x86_ByteRegNames[reg], data);\r
+               } else{ /*High*/\r
+                       reg -= 4;\r
+                       data = env->GReg[reg];\r
+                       data &= 0x0000ff00;\r
+                       data = data >> 8;\r
+                       Emulator_x86_Put_EmulationInformation(env, "(MoveFrom%s:0x%X)", Emulator_x86_ByteRegNames[reg + 4], data);\r
+               }\r
+       }\r
+       return data;\r
+}\r
+\r
+void Emulator_x86_MoveToSReg(Emulator_x86_Environment *env, uint sreg, ushort selector)\r
+{\r
+       if(sreg > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid SReg).");\r
+               return;\r
+       }\r
+\r
+       if(env->operation_32bit){       /*32-bit Segmentation*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit mode is not implemented.");\r
+       } else{ /*16-bit Segmentation*/\r
+               env->SReg[sreg].selector = selector;\r
+               Emulator_x86_Put_EmulationInformation(env, "(MoveTo%s:0x%X)", Emulator_x86_SRegNames[sreg], selector);\r
+       }\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Push_Data_To_Stack(Emulator_x86_Environment *env, uint data, uint size_dword)\r
+{\r
+       void *addr;\r
+\r
+       if(env->GReg[OPCODE_REG_ESP] < 4){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(No More Stack).");\r
+               return;\r
+       }\r
+       if(size_dword){ /*DoubleWord*/\r
+               Emulator_x86_MoveToGReg(env, OPCODE_REG_ESP, env->GReg[OPCODE_REG_ESP] - 4, True);\r
+               addr = (void *)Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]);\r
+               *((uint *)addr) = data;\r
+       } else{ /*Word*/\r
+               Emulator_x86_MoveToGReg(env, OPCODE_REG_ESP, env->GReg[OPCODE_REG_ESP] - 2, True);\r
+               addr = (void *)Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]);\r
+               *((ushort *)addr) = data;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "(PushTo[0x%08X]:0x%X)", Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]), data);\r
+\r
+       return;\r
+}\r
+\r
+uint Emulator_x86_Pop_Data_From_Stack(Emulator_x86_Environment *env, uint size_dword)\r
+{\r
+       uint data;\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "(PopFrom[0x%08X]:", Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]));\r
+\r
+       if(size_dword){ /*DoubleWord*/\r
+               data = *((uint *)Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]));\r
+               Emulator_x86_MoveToGReg(env, OPCODE_REG_ESP, env->GReg[OPCODE_REG_ESP] + 4, True);\r
+       } else{ /*Word*/\r
+               data = *((ushort *)Emulator_x86_Get_EffectivePhysicalAddress(env, OPCODE_SREG3_SS, env->GReg[OPCODE_REG_ESP]));\r
+               Emulator_x86_MoveToGReg(env, OPCODE_REG_ESP, env->GReg[OPCODE_REG_ESP] + 2, True);\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "0x%X)", data);\r
+\r
+       return data;\r
+}\r
+\r
+void Emulator_x86_Push_eIP_To_Stack(Emulator_x86_Environment *env)\r
+{\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               env->EIP &= 0x0000ffff;\r
+               Emulator_x86_Push_Data_To_Stack(env, env->EIP, False);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Push IP[0x%X])", env->EIP);\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_Push_Data_To_Stack(env, env->EIP, True);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Push EIP[0x%X])", env->EIP);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Pop_eIP_From_Stack(Emulator_x86_Environment *env)\r
+{\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               env->EIP = Emulator_x86_Pop_Data_From_Stack(env, False);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Pop IP[0x%X])", env->EIP);\r
+       } else{ /*32-bit*/\r
+               env->EIP = Emulator_x86_Pop_Data_From_Stack(env, True);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Pop EIP[0x%X])", env->EIP);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Push_eFLAGS_To_Stack(Emulator_x86_Environment *env)\r
+{\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               env->EFLAGS.eflags &= 0x0000ffff;\r
+               Emulator_x86_Push_Data_To_Stack(env, env->EFLAGS.eflags, False);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Push FLAGS(0x%X))", env->EFLAGS.eflags);\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_Push_Data_To_Stack(env, env->EIP, True);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Push EFLAGS(0x%X))", env->EFLAGS.eflags);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Pop_eFLAGS_From_Stack(Emulator_x86_Environment *env)\r
+{\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               env->EFLAGS.eflags = Emulator_x86_Pop_Data_From_Stack(env, False);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Pop FLAGS(0x%X))", env->EFLAGS.eflags);\r
+       } else{ /*32-bit*/\r
+               env->EFLAGS.eflags = Emulator_x86_Pop_Data_From_Stack(env, True);\r
+               Emulator_x86_Put_EmulationInformation(env, "(Pop EFLAGS(0x%X))", env->EFLAGS.eflags);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Push_SReg_To_Stack(Emulator_x86_Environment *env, uint sreg)\r
+{\r
+       //16bit/32bit\r
+\r
+       if(sreg > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid SReg).");\r
+               return;\r
+       }\r
+\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               Emulator_x86_Push_Data_To_Stack(env, env->SReg[sreg].selector, False);\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_Push_Data_To_Stack(env, env->SReg[sreg].selector, True);\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "(Push %s(0x%X))", Emulator_x86_SRegNames[sreg], env->SReg[sreg].selector);\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Pop_SReg_From_Stack(Emulator_x86_Environment *env, uint sreg)\r
+{\r
+       //16bit/32bit\r
+\r
+       if(sreg > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid SReg).");\r
+               return;\r
+       }\r
+\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               Emulator_x86_MoveToSReg(env, sreg, Emulator_x86_Pop_Data_From_Stack(env, False));\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_MoveToSReg(env, sreg, Emulator_x86_Pop_Data_From_Stack(env, True));\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "(Pop %s(0x%X))", Emulator_x86_SRegNames[sreg], env->SReg[sreg].selector);\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_To_Reg_FullSize(Emulator_x86_Environment *env)\r
+{\r
+       uint imm;\r
+\r
+       imm = Emulator_x86_FetchCode(env, 2);\r
+\r
+       Emulator_x86_MoveToGReg(env, env->now_opcode - 0xB8, imm, True);\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "MOV %s, 0x%X", Emulator_x86_RegNames[env->now_opcode - 0xB8], imm);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_To_SegReg(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+\r
+       if(modrm.bit.Mod == OPCODE_MOD_REGISTER){\r
+               Emulator_x86_MoveToSReg(env, modrm.bit.Reg, Emulator_x86_MoveFromGReg(env, modrm.bit.RM, True));\r
+               Emulator_x86_Put_EmulationInformation(env, "MOV %s, %s", Emulator_x86_SRegNames[modrm.bit.Reg], Emulator_x86_RegNames[modrm.bit.RM]);\r
+       } else{\r
+               addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+               Emulator_x86_MoveToSReg(env, modrm.bit.Reg, *((ushort *)addr));\r
+               Emulator_x86_Put_EmulationInformation(env, "MOV %s, [0x%X]", Emulator_x86_SRegNames[modrm.bit.Reg], addr);\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_To_ByteReg(Emulator_x86_Environment *env)\r
+{\r
+       uchar imm8;\r
+\r
+       imm8 = Emulator_x86_FetchCode(env, 1);\r
+\r
+       Emulator_x86_MoveToGReg(env, env->now_opcode - 0xB0, imm8, False);\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "MOV %s, 0x%X", Emulator_x86_ByteRegNames[env->now_opcode - 0xB0], imm8);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_INTn(Emulator_x86_Environment *env)\r
+{\r
+       //16-bit only\r
+\r
+       uchar intn;\r
+       Emulator_x86_FarPointer *vector;\r
+\r
+       intn = Emulator_x86_FetchCode(env, 1);\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "INT 0x%X", intn);\r
+\r
+       vector = (Emulator_x86_FarPointer *)(intn << 2);\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "[0x%X:0x%X] = [0x%X]", vector->selector, vector->offset, (vector->selector << 4) + vector->offset);\r
+\r
+       Emulator_x86_Push_eFLAGS_To_Stack(env);\r
+       env->EFLAGS.bit.IF = False;\r
+       env->EFLAGS.bit.TF = False;\r
+       env->EFLAGS.bit.AC = False;\r
+       Emulator_x86_Push_SReg_To_Stack(env, OPCODE_SREG3_CS);\r
+       Emulator_x86_Push_eIP_To_Stack(env);\r
+\r
+       Emulator_x86_MoveToSReg(env, OPCODE_SREG3_CS, vector->selector);\r
+       env->EIP = vector->offset;\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_LEA(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint disp;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+\r
+       if(!env->operation_32bit){\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){\r
+                       Emulator_x86_Put_EmulationInformation(env, "LEA Invalid.");\r
+               } else{\r
+                       disp = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       disp -= (env->SReg[env->operation_prefix_segment].selector << 4);\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.Reg, disp, True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "LEA %s, 0x%X", Emulator_x86_RegNames[modrm.bit.Reg], disp);\r
+               }\r
+       } else{\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit mode is not implemented.");\r
+       }\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_CALL_Near_Relative(Emulator_x86_Environment *env)\r
+{\r
+       short relative_addr;\r
+       uchar sign;\r
+\r
+       sign = False;\r
+\r
+       relative_addr = Emulator_x86_FetchCode(env, 2);\r
+\r
+       if(relative_addr < 0){\r
+               sign = True;\r
+               relative_addr = -relative_addr;\r
+       }\r
+\r
+       Emulator_x86_Push_eIP_To_Stack(env);\r
+\r
+       if(sign){\r
+               env->EIP -= (uint)relative_addr;\r
+       } else{\r
+               env->EIP += (uint)relative_addr;\r
+       }\r
+\r
+       if(!env->operation_32bit){\r
+               env->EIP &= 0x0000ffff;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "near CALL 0x%X", env->EIP);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_PUSHA(Emulator_x86_Environment *env)\r
+{\r
+       uint Temp;\r
+       uint i;\r
+\r
+       Temp = env->GReg[OPCODE_REG_ESP];\r
+\r
+       if(env->operation_32bit){       /*PUSHAD*/\r
+               Emulator_x86_Put_EmulationInformation(env, "PUSHAD");\r
+               for(i = 0; i < 4; i++){\r
+                       Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, i, True), True);\r
+               }\r
+               Emulator_x86_Push_Data_To_Stack(env, Temp, False);\r
+               for(i = 5; i < 8; i++){\r
+                       Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, i, True), True);\r
+               }\r
+       } else{ /*PUSHA*/\r
+               Emulator_x86_Put_EmulationInformation(env, "PUSHA");\r
+               for(i = 0; i < 4; i++){\r
+                       Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, i, True), False);\r
+               }\r
+               Emulator_x86_Push_Data_To_Stack(env, Temp, False);\r
+               for(i = 5; i < 8; i++){\r
+                       Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, i, True), False);\r
+               }\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_POPA(Emulator_x86_Environment *env)\r
+{\r
+       int i;\r
+\r
+       if(env->operation_32bit){       /*POPAD*/\r
+               Emulator_x86_Put_EmulationInformation(env, "POPAD");\r
+               for(i = 7; i > 4; i--){\r
+                       Emulator_x86_MoveToGReg(env, i, Emulator_x86_Pop_Data_From_Stack(env, True), True);\r
+               }\r
+               Emulator_x86_Pop_Data_From_Stack(env, True);\r
+               for(i = 3; i > -1; i--){\r
+                       Emulator_x86_MoveToGReg(env, i, Emulator_x86_Pop_Data_From_Stack(env, True), True);\r
+               }\r
+       } else{ /*POPA*/\r
+               Emulator_x86_Put_EmulationInformation(env, "POPA");\r
+               for(i = 7; i > 4; i--){\r
+                       Emulator_x86_MoveToGReg(env, i, Emulator_x86_Pop_Data_From_Stack(env, False), True);\r
+               }\r
+               Emulator_x86_Pop_Data_From_Stack(env, False);\r
+               for(i = 3; i > -1; i--){\r
+                       Emulator_x86_MoveToGReg(env, i, Emulator_x86_Pop_Data_From_Stack(env, False), True);\r
+               }\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_To_ByteReg_Gb_Eb(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg only*/\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.Reg, Emulator_x86_MoveFromGReg(env, modrm.bit.RM, False), False);\r
+                       Emulator_x86_Put_EmulationInformation(env, "MOV %s, %s", Emulator_x86_ByteRegNames[modrm.bit.Reg], Emulator_x86_ByteRegNames[modrm.bit.RM]);\r
+               } else{ /*From MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.Reg, *((uchar *)addr), False);\r
+                       Emulator_x86_Put_EmulationInformation(env, "MOV %s, [0x%X]", Emulator_x86_ByteRegNames[modrm.bit.Reg], addr);\r
+               }\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit mode is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_CMP_AL(Emulator_x86_Environment *env)\r
+{\r
+       CPU_EFlags eflags;\r
+       uint imm;\r
+\r
+       imm = Emulator_x86_FetchCode(env, 1);\r
+\r
+       eflags.eflags = asm_Emulator_x86_Get_EFlags_Compare(Emulator_x86_MoveFromGReg(env, OPCODE_REG_BYTE_AL, False), imm);\r
+       env->EFLAGS.bit.CF = eflags.bit.CF;\r
+       env->EFLAGS.bit.PF = eflags.bit.PF;\r
+       env->EFLAGS.bit.AF = eflags.bit.AF;\r
+       env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+       env->EFLAGS.bit.SF = eflags.bit.SF;\r
+       env->EFLAGS.bit.OF = eflags.bit.OF;\r
+       Emulator_x86_Put_EmulationInformation(env, "CMP AL, 0x%X (CF:%d PF:%d AF:%d ZF:%d SF:%d OF:%d)", imm, env->EFLAGS.bit.CF, env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_Jcc_JE_rel8(Emulator_x86_Environment *env)\r
+{\r
+       char relative_addr;\r
+       uchar sign;\r
+       uint new_eip;\r
+\r
+       sign = False;\r
+       relative_addr = Emulator_x86_FetchCode(env, 1);\r
+       new_eip = env->EIP;\r
+\r
+       if(relative_addr < 0){\r
+               sign = True;\r
+               relative_addr = -relative_addr;\r
+       }\r
+       if(sign){\r
+               new_eip -= (uint)relative_addr;\r
+       } else{\r
+               new_eip += (uint)relative_addr;\r
+       }\r
+\r
+       if(!env->operation_32bit){\r
+               new_eip &= 0x0000ffff;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "JE 0x%X ", new_eip);\r
+\r
+       if(env->EFLAGS.bit.ZF){\r
+               Emulator_x86_Put_EmulationInformation(env, "Taken.");\r
+               env->EIP = new_eip;\r
+       } else{\r
+               Emulator_x86_Put_EmulationInformation(env, "NotTaken.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_INC_RegOnly(Emulator_x86_Environment *env)\r
+{\r
+       uint operand;\r
+       CPU_EFlags eflags;\r
+\r
+       if((env->now_opcode - 0x40) > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg From OpCode).");\r
+       }\r
+\r
+       operand = Emulator_x86_MoveFromGReg(env, env->now_opcode - 0x40, True);\r
+       Emulator_x86_MoveToGReg(env, env->now_opcode - 0x40, operand + 1, True);\r
+\r
+       eflags.eflags = asm_Emulator_x86_Get_EFlags_Increment(operand);\r
+       env->EFLAGS.bit.PF = eflags.bit.PF;\r
+       env->EFLAGS.bit.AF = eflags.bit.AF;\r
+       env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+       env->EFLAGS.bit.SF = eflags.bit.SF;\r
+       env->EFLAGS.bit.OF = eflags.bit.OF;\r
+       Emulator_x86_Put_EmulationInformation(env, "INC %s (PF:%d AF:%d ZF:%d SF:%d OF:%d)", Emulator_x86_RegNames[env->now_opcode - 0x40], env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_JMP_rel8(Emulator_x86_Environment *env)\r
+{\r
+       char relative_addr;\r
+       uchar sign;\r
+       uint new_eip;\r
+\r
+       sign = False;\r
+       relative_addr = Emulator_x86_FetchCode(env, 1);\r
+       new_eip = env->EIP;\r
+\r
+       if(relative_addr < 0){\r
+               sign = True;\r
+               relative_addr = -relative_addr;\r
+       }\r
+       if(sign){\r
+               new_eip -= (uint)relative_addr;\r
+       } else{\r
+               new_eip += (uint)relative_addr;\r
+       }\r
+\r
+       if(!env->operation_32bit){\r
+               new_eip &= 0x0000ffff;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "JMP 0x%X", new_eip);\r
+\r
+       env->EIP = new_eip;\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_RET_Near(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_Pop_eIP_From_Stack(env);\r
+       Emulator_x86_Put_EmulationInformation(env, "near RET to 0x%X", env->EIP);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_PUSH_RegOnly(Emulator_x86_Environment *env)\r
+{\r
+       if((env->now_opcode - 0x50) > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg From OpCode).");\r
+       }\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               Emulator_x86_Put_EmulationInformation(env, "PUSH %s", Emulator_x86_RegNames[env->now_opcode - 0x50]);\r
+               Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, env->now_opcode - 0x50, True), False);\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_Put_EmulationInformation(env, "PUSH E%s", Emulator_x86_RegNames[env->now_opcode - 0x50]);\r
+               Emulator_x86_Push_Data_To_Stack(env, Emulator_x86_MoveFromGReg(env, env->now_opcode - 0x50, True), True);\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_XOR_Eb_Gb(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+       CPU_EFlags eflags;\r
+       uint dest_op, source_op;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+       dest_op = 0;\r
+       source_op = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               source_op = Emulator_x86_MoveFromGReg(env, modrm.bit.Reg, True);\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg*/\r
+                       dest_op = Emulator_x86_MoveFromGReg(env, modrm.bit.RM, True);\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.Reg, dest_op ^ source_op, True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "XOR %s, %s", Emulator_x86_RegNames[modrm.bit.RM], Emulator_x86_RegNames[modrm.bit.Reg]);\r
+               } else{ /*MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       dest_op = *((ushort *)addr);\r
+                       Emulator_x86_Put_EmulationInformation(env, "XOR [0x%X], %s", addr, Emulator_x86_RegNames[modrm.bit.Reg]);\r
+                       *((ushort *)addr) = dest_op ^ source_op;\r
+               }\r
+               eflags.eflags = asm_Emulator_x86_Get_EFlags_XOR(dest_op, source_op);\r
+               env->EFLAGS.bit.CF = False;\r
+               env->EFLAGS.bit.PF = eflags.bit.PF;\r
+               env->EFLAGS.bit.AF = eflags.bit.AF;\r
+               env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+               env->EFLAGS.bit.SF = eflags.bit.SF;\r
+               env->EFLAGS.bit.OF = False;\r
+               Emulator_x86_Put_EmulationInformation(env, " (CF:%d PF:%d AF:%d ZF:%d SF:%d OF:%d)", env->EFLAGS.bit.CF, env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_DEC_RegOnly(Emulator_x86_Environment *env)\r
+{\r
+       uint operand;\r
+       CPU_EFlags eflags;\r
+\r
+       if((env->now_opcode - 0x48) > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg From OpCode).");\r
+       }\r
+\r
+       operand = Emulator_x86_MoveFromGReg(env, env->now_opcode - 0x48, True);\r
+       Emulator_x86_MoveToGReg(env, env->now_opcode - 0x48, operand - 1, True);\r
+\r
+       eflags.eflags = asm_Emulator_x86_Get_EFlags_Decrement(operand);\r
+       env->EFLAGS.bit.PF = eflags.bit.PF;\r
+       env->EFLAGS.bit.AF = eflags.bit.AF;\r
+       env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+       env->EFLAGS.bit.SF = eflags.bit.SF;\r
+       env->EFLAGS.bit.OF = eflags.bit.OF;\r
+       Emulator_x86_Put_EmulationInformation(env, "DEC %s (PF:%d AF:%d ZF:%d SF:%d OF:%d)", Emulator_x86_RegNames[env->now_opcode - 0x48], env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_eAX_Ov(Emulator_x86_Environment *env)\r
+{\r
+       uint offset;\r
+       uint addr;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               offset = Emulator_x86_FetchCode(env, 2);\r
+               addr = Emulator_x86_Get_EffectivePhysicalAddress(env, env->operation_prefix_segment, offset);\r
+               Emulator_x86_MoveToGReg(env, OPCODE_REG_EAX, *((ushort *)addr), True);\r
+               Emulator_x86_Put_EmulationInformation(env, "MOV AX, [0x%X]", addr);\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_Ov_eAX(Emulator_x86_Environment *env)\r
+{\r
+       uint offset;\r
+       uint addr;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               offset = Emulator_x86_FetchCode(env, 2);\r
+               addr = Emulator_x86_Get_EffectivePhysicalAddress(env, env->operation_prefix_segment, offset);\r
+               *((ushort *)addr) = Emulator_x86_MoveFromGReg(env, OPCODE_REG_EAX, True);\r
+               Emulator_x86_Put_EmulationInformation(env, "MOV [0x%X], AX", addr);\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_OUT_AL(Emulator_x86_Environment *env)\r
+{\r
+       uint port;\r
+\r
+       port = Emulator_x86_FetchCode(env, 1);\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "OUT 0x%X, AL(Not implemented)", port);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_CMP_Gv_Ev(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+       uint op0, op1;\r
+       CPU_EFlags eflags;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               op0 = Emulator_x86_MoveFromGReg(env, modrm.bit.Reg, True);\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg*/\r
+                       op1 = Emulator_x86_MoveFromGReg(env, modrm.bit.RM, True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "CMP %s, %s", Emulator_x86_RegNames[modrm.bit.Reg], Emulator_x86_RegNames[modrm.bit.RM]);\r
+               } else{ /*MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       op1 = *((ushort *)addr);\r
+                       Emulator_x86_Put_EmulationInformation(env, "CMP %s, [0x%X]", Emulator_x86_RegNames[modrm.bit.Reg], addr);\r
+               }\r
+               eflags.eflags = asm_Emulator_x86_Get_EFlags_Compare(op0, op1);\r
+               env->EFLAGS.bit.CF = eflags.bit.CF;\r
+               env->EFLAGS.bit.PF = eflags.bit.PF;\r
+               env->EFLAGS.bit.AF = eflags.bit.AF;\r
+               env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+               env->EFLAGS.bit.SF = eflags.bit.SF;\r
+               env->EFLAGS.bit.OF = eflags.bit.OF;\r
+               Emulator_x86_Put_EmulationInformation(env, " (CF:%d PF:%d AF:%d ZF:%d SF:%d OF:%d)", env->EFLAGS.bit.CF, env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_LOOP_Jv(Emulator_x86_Environment *env)\r
+{\r
+       char relative_addr;\r
+       uchar sign;\r
+       uint new_eip;\r
+       uint operand;\r
+\r
+       sign = False;\r
+       relative_addr = Emulator_x86_FetchCode(env, 1);\r
+       new_eip = env->EIP;\r
+\r
+       operand = Emulator_x86_MoveFromGReg(env, OPCODE_REG_ECX, True);\r
+       Emulator_x86_MoveToGReg(env, OPCODE_REG_ECX, operand - 1, True);\r
+\r
+       if(relative_addr < 0){\r
+               sign = True;\r
+               relative_addr = -relative_addr;\r
+       }\r
+       if(sign){\r
+               new_eip -= (uint)relative_addr;\r
+       } else{\r
+               new_eip += (uint)relative_addr;\r
+       }\r
+\r
+       if(!env->operation_32bit){\r
+               new_eip &= 0x0000ffff;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "LOOP 0x%X", new_eip);\r
+\r
+       if(0 == operand - 1){\r
+               Emulator_x86_Put_EmulationInformation(env, "(NotTaken)");\r
+       } else{\r
+               Emulator_x86_Put_EmulationInformation(env, "(Taken)");\r
+               env->EIP = new_eip;\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_POP_Ev(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg only*/\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.RM, Emulator_x86_Pop_Data_From_Stack(env, False), True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "POP %s", Emulator_x86_RegNames[modrm.bit.RM]);\r
+               } else{ /*From MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       *((ushort *)addr) = Emulator_x86_Pop_Data_From_Stack(env, False);\r
+                       Emulator_x86_Put_EmulationInformation(env, "POP [0x%X]", addr);\r
+               }\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return; \r
+}\r
+\r
+void Emulator_x86_Operation_POP_RegOnly(Emulator_x86_Environment *env)\r
+{\r
+       if((env->now_opcode - 0x58) > 7){\r
+               Emulator_x86_Put_EmulationInformation(env, "\nEmulator-x86:Internal Error(Invalid GReg From OpCode).");\r
+       }\r
+       if(!env->operation_32bit){      /*16-bit*/\r
+               Emulator_x86_Put_EmulationInformation(env, "POP %s", Emulator_x86_RegNames[env->now_opcode - 0x58]);\r
+               Emulator_x86_MoveToGReg(env, env->now_opcode - 0x58, Emulator_x86_Pop_Data_From_Stack(env, False), True);\r
+       } else{ /*32-bit*/\r
+               Emulator_x86_Put_EmulationInformation(env, "POP E%s", Emulator_x86_RegNames[env->now_opcode - 0x58]);\r
+               Emulator_x86_MoveToGReg(env, env->now_opcode - 0x58, Emulator_x86_Pop_Data_From_Stack(env, True), True);\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_Jcc_JNE_rel8(Emulator_x86_Environment *env)\r
+{\r
+       char relative_addr;\r
+       uchar sign;\r
+       uint new_eip;\r
+\r
+       sign = False;\r
+       relative_addr = Emulator_x86_FetchCode(env, 1);\r
+       new_eip = env->EIP;\r
+\r
+       if(relative_addr < 0){\r
+               sign = True;\r
+               relative_addr = -relative_addr;\r
+       }\r
+       if(sign){\r
+               new_eip -= (uint)relative_addr;\r
+       } else{\r
+               new_eip += (uint)relative_addr;\r
+       }\r
+\r
+       if(!env->operation_32bit){\r
+               new_eip &= 0x0000ffff;\r
+       }\r
+\r
+       Emulator_x86_Put_EmulationInformation(env, "JNE 0x%X ", new_eip);\r
+\r
+       if(!env->EFLAGS.bit.ZF){\r
+               Emulator_x86_Put_EmulationInformation(env, "Taken.");\r
+               env->EIP = new_eip;\r
+       } else{\r
+               Emulator_x86_Put_EmulationInformation(env, "NotTaken.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_STI(Emulator_x86_Environment *env)\r
+{\r
+       env->EFLAGS.bit.IF = True;\r
+       Emulator_x86_Put_EmulationInformation(env, "STI");\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_SBB_Gv_Ev(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+       uint op0, op1;\r
+       CPU_EFlags eflags;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               op0 = Emulator_x86_MoveFromGReg(env, modrm.bit.Reg, True);\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg*/\r
+                       op1 = Emulator_x86_MoveFromGReg(env, modrm.bit.RM, True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "SBB %s, %s(CF:%d)", Emulator_x86_RegNames[modrm.bit.Reg], Emulator_x86_RegNames[modrm.bit.RM], env->EFLAGS.bit.CF);\r
+               } else{ /*MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       op1 = *((ushort *)addr);\r
+                       Emulator_x86_Put_EmulationInformation(env, "SBB %s, [0x%X](CF:%d)", Emulator_x86_RegNames[modrm.bit.Reg], addr, env->EFLAGS.bit.CF);\r
+               }\r
+               eflags.eflags = asm_Emulator_x86_Get_EFlags_Subtract_with_Borrow(&op0, op1, env->EFLAGS.bit.CF);\r
+               Emulator_x86_MoveToGReg(env, modrm.bit.RM, op0, True);\r
+               env->EFLAGS.bit.CF = eflags.bit.CF;\r
+               env->EFLAGS.bit.PF = eflags.bit.PF;\r
+               env->EFLAGS.bit.AF = eflags.bit.AF;\r
+               env->EFLAGS.bit.ZF = eflags.bit.ZF;\r
+               env->EFLAGS.bit.SF = eflags.bit.SF;\r
+               env->EFLAGS.bit.OF = eflags.bit.OF;\r
+               Emulator_x86_Put_EmulationInformation(env, " (CF:%d PF:%d AF:%d ZF:%d SF:%d OF:%d)", env->EFLAGS.bit.CF, env->EFLAGS.bit.PF, env->EFLAGS.bit.AF, env->EFLAGS.bit.ZF, env->EFLAGS.bit.SF, env->EFLAGS.bit.OF);\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_MOV_Ev_Gv(Emulator_x86_Environment *env)\r
+{\r
+       Emulator_x86_OperationCode_ModRM modrm;\r
+       uint addr;\r
+       uint op1;\r
+\r
+       modrm.modrm = Emulator_x86_FetchCode(env, 1);\r
+       addr = 0;\r
+\r
+       if(!env->operation_32bit){      /*16-bit Addressing*/\r
+               op1 = Emulator_x86_MoveFromGReg(env, modrm.bit.Reg, True);\r
+               if(modrm.bit.Mod == OPCODE_MOD_REGISTER){       /*Reg*/\r
+                       Emulator_x86_MoveToGReg(env, modrm.bit.RM, op1, True);\r
+                       Emulator_x86_Put_EmulationInformation(env, "MOV %s, %s", Emulator_x86_RegNames[modrm.bit.RM], Emulator_x86_RegNames[modrm.bit.Reg]);\r
+               } else{ /*MemoryAddress*/\r
+                       addr = Emulator_x86_Get_EffectivePhysicalAddress_FromModRM(env, modrm.modrm);\r
+                       *((ushort *)addr) = op1;\r
+                       Emulator_x86_Put_EmulationInformation(env, "MOV [0x%X], %s(0x%X)", addr, Emulator_x86_RegNames[modrm.bit.Reg], op1);\r
+               }\r
+       } else{ /*32-bit Addressing*/\r
+               Emulator_x86_Put_EmulationInformation(env, "32-bit addressing is not implemented.");\r
+       }\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_PUSH_Ib(Emulator_x86_Environment *env)\r
+{\r
+       //16bit/32bit?\r
+       uint imm8;\r
+\r
+       imm8 = Emulator_x86_FetchCode(env, 1);\r
+       Emulator_x86_Push_Data_To_Stack(env, imm8, env->operation_32bit);\r
+       Emulator_x86_Put_EmulationInformation(env, "PUSH 0x%X", imm8);\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r
+\r
+void Emulator_x86_Operation_CLD(Emulator_x86_Environment *env)\r
+{\r
+       env->EFLAGS.bit.DF = False;\r
+       Emulator_x86_Put_EmulationInformation(env, "CLD");\r
+\r
+       env->operation_end = True;\r
+\r
+       return;\r
+}\r