OSDN Git Service

SimpleHTMLEditorを追加。
[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
deleted file mode 100644 (file)
index 3135734..0000000
+++ /dev/null
@@ -1,1336 +0,0 @@
-\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