[ros-diffs] [tkreuzer] 45464: [X86EMU] Beginning of a real mode x86 emulator for BIOS calls.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat Feb 6 20:13:54 CET 2010


Author: tkreuzer
Date: Sat Feb  6 20:13:54 2010
New Revision: 45464

URL: http://svn.reactos.org/svn/reactos?rev=45464&view=rev
Log:
[X86EMU]
Beginning of a real mode x86 emulator for BIOS calls.

Added:
    branches/ros-amd64-bringup/reactos/lib/x86emu/   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c   (with props)
    branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.h
      - copied, changed from r45254, branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/x86emu.h
    branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild   (with props)

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Sat Feb  6 20:13:54 2010
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,12 @@
+
+VOID
+FORCEINLINE
+Opcode_3D_CMP(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    USHORT Value;
+
+    Value = *(USHORT*)(IntructionPointer + 1);
+    VmState_CMP16(VmState, VmState->Registers.Eax, Value);
+    VmState_AdvanceIp(VmState, 3);
+    DPRINT("CMP AX, 0x%x\n", Value);
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/op_cmp.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,39 @@
+
+VOID
+FORCEINLINE
+Opcode_E9_JMP16(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    SHORT Offset;
+
+    Offset = *(PSHORT)(IntructionPointer + 1);
+    DPRINT("JMP %04x\n", VmState->Registers.Ip + Offset + 3);
+    VmState_AdvanceIp(VmState, Offset + 3);
+}
+
+VOID
+FORCEINLINE
+Opcode_75_JNZ8(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("JNZ %04x\n", VmState->Registers.Ip + IntructionPointer[1] + 2);
+
+    if (!VmState->Registers.Eflags.Zf)
+    {
+        VmState_AdvanceIp(VmState, IntructionPointer[1] + 2);
+    }
+    else
+        VmState_AdvanceIp(VmState, 2);
+}
+
+VOID
+FORCEINLINE
+Opcode_74_JZ8(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("JZ %04x\n", VmState->Registers.Ip + IntructionPointer[1] + 2);
+
+    if (VmState->Registers.Eflags.Zf)
+    {
+        VmState_AdvanceIp(VmState, IntructionPointer[1] + 2);
+    }
+    else
+        VmState_AdvanceIp(VmState, 2);
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/op_jump.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,45 @@
+
+VOID
+FORCEINLINE
+Opcode_BB_MOV(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    USHORT Value;
+
+    Value = *(USHORT*)(IntructionPointer + 1);
+    VmState->Registers.Bx = Value;
+    VmState_AdvanceIp(VmState, 3);
+    DPRINT("MOV BX, 0x%x\n", Value);
+}
+
+VOID
+FORCEINLINE
+Opcode_8E_MOV(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    MODRM ModRm;
+    UCHAR Value;
+
+    ModRm.Byte = IntructionPointer[1];
+
+    if (ModRm.mod == 3)
+    {
+        DPRINT("MOV ??, ??\n", IntructionPointer[2]);
+        Value = VmState_GetVal8(VmState, ModRm);
+        // ...
+        VmState_AdvanceIp(VmState, 2);
+        return;
+    }
+    DPRINT1("UNKNOWN\n");
+}
+
+VOID
+FORCEINLINE
+Opcode_89_MOV(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    MODRM ModRm;
+    USHORT Value;
+
+    ModRm.Byte = IntructionPointer[1];
+    Value = VmState_GetRegVal16(VmState, ModRm);
+
+    VmState_AdvanceIp(VmState, 2);
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/op_mov.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,110 @@
+
+
+VOID
+FORCEINLINE
+Opcode_9C_PUSHF(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("PUSHF\n");
+    VmState_Push(VmState, VmState->Registers.Eflags.Short);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_9D_POPF(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("POPF\n");
+    VmState->Registers.Eflags.Short = VmState_Pop(VmState);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_1E_PUSH_DS(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("PUSH DS\n");
+    VmState_Push(VmState, VmState->Registers.SegDs);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_1F_POP_DS(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("POP DS\n");
+    VmState->Registers.SegDs = VmState_Pop(VmState);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_06_PUSH_ES(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("PUSH ES\n");
+    VmState_Push(VmState, VmState->Registers.SegEs);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_07_POP_ES(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("POP ES\n");
+    VmState->Registers.SegEs = VmState_Pop(VmState);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_60_PUSHA(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    USHORT OrigSp;
+    DPRINT("PUSHA\n");
+
+    OrigSp = VmState->Registers.Sp;
+    VmState_Push(VmState, VmState->Registers.Ax);
+    VmState_Push(VmState, VmState->Registers.Cx);
+    VmState_Push(VmState, VmState->Registers.Dx);
+    VmState_Push(VmState, VmState->Registers.Bx);
+    VmState_Push(VmState, OrigSp);
+    VmState_Push(VmState, VmState->Registers.Bp);
+    VmState_Push(VmState, VmState->Registers.Si);
+    VmState_Push(VmState, VmState->Registers.Di);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_61_POPA(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    USHORT OrigSp;
+    DPRINT("POPA\n");
+
+    VmState->Registers.Di = VmState_Pop(VmState);
+    VmState->Registers.Si = VmState_Pop(VmState);
+    VmState->Registers.Bp = VmState_Pop(VmState);
+    OrigSp = VmState_Pop(VmState);
+    VmState->Registers.Bx = VmState_Pop(VmState);
+    VmState->Registers.Dx = VmState_Pop(VmState);
+    VmState->Registers.Cx = VmState_Pop(VmState);
+    VmState->Registers.Ax = VmState_Pop(VmState);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_55_PUSH_BP(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("PUSH BP\n");
+    VmState_Push(VmState, VmState->Registers.Bp);
+    VmState_AdvanceIp(VmState, 1);
+}
+
+VOID
+FORCEINLINE
+Opcode_xx_POP_BP(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    DPRINT("POP BP\n");
+    VmState->Registers.Bp = VmState_Pop(VmState);
+    VmState_AdvanceIp(VmState, 1);
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/op_stack.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,108 @@
+
+UCHAR
+FORCEINLINE
+VmState_GetRegVal8(PX86_VM_STATE VmState, MODRM ModRm)
+{
+    PUCHAR Pointer;
+
+    Pointer = (PUCHAR)&VmState->Registers + RegisterTable[0][ModRm.reg];
+    return *Pointer;
+}
+
+UCHAR
+FORCEINLINE
+VmState_GetRegVal16(PX86_VM_STATE VmState, MODRM ModRm)
+{
+    return VmState->IndexedRegisters[ModRm.reg].Word;
+}
+
+
+VOID
+FORCEINLINE
+VmState_EnablePrefix(PX86_VM_STATE VmState, ULONG Prefix)
+{
+    //DPRINT("_EnablePrefix\n");
+}
+
+VOID
+FORCEINLINE
+VmState_ClearPrefixes(PX86_VM_STATE VmState)
+{
+    //DPRINT1("_ClearPrefixes\n");
+}
+
+FORCEINLINE
+VOID
+VmState_AdvanceIp(PX86_VM_STATE VmState, SHORT Advance)
+{
+    VmState->Registers.Ip += Advance;
+}
+
+FORCEINLINE
+VOID
+VmState_SetIp(PX86_VM_STATE VmState, USHORT Value)
+{
+    VmState->Registers.Ip = Value;
+}
+
+FORCEINLINE
+PCHAR
+VmState_GetIp(PX86_VM_STATE VmState)
+{
+    return (PCHAR)VmState->MemBuffer + 
+           VmState->Registers.ShiftedCs +
+           VmState->Registers.Eip;
+}
+
+FORCEINLINE
+VOID
+VmState_Push(PX86_VM_STATE VmState, USHORT Value)
+{
+    PUSHORT StackPointer;
+    //DPRINT1("Pushing %x %x %x\n", Value, VmState->Registers.ShiftedSs, VmState->Registers.Sp);
+    StackPointer = (PVOID)((PCHAR)VmState->MemBuffer + 
+                           VmState->Registers.ShiftedSs +
+                           VmState->Registers.Sp); // FIXME: overflow
+    *StackPointer = Value;
+    VmState->Registers.Sp--;
+}
+
+FORCEINLINE
+USHORT
+VmState_Pop(PX86_VM_STATE VmState)
+{
+    PUSHORT StackPointer;
+    //DPRINT1("Popping %x\n", Value);
+    StackPointer = (PVOID)((PCHAR)VmState->MemBuffer + 
+                           VmState->Registers.ShiftedSs +
+                           VmState->Registers.Sp);
+    VmState->Registers.Sp--;
+    return *StackPointer;
+}
+
+UCHAR
+FORCEINLINE
+VmState_GetVal8(PX86_VM_STATE VmState, MODRM ModRm)
+{
+    return 0;
+}
+
+FORCEINLINE
+VOID
+VmState_CMP8(PX86_VM_STATE VmState, UCHAR Value1, UCHAR Value2)
+{
+    VmState->Registers.Eflags.Zf = ((Value1 - Value2) == 0);
+    VmState->Registers.Eflags.Cf = ((Value1 - Value2) > Value1);
+    VmState->Registers.Eflags.Sf = ((CHAR)(Value1 - Value2) < 0);
+    VmState->Registers.Eflags.Of = ((CHAR)(Value1 - Value2) > (CHAR)Value1);
+}
+
+FORCEINLINE
+VOID
+VmState_CMP16(PX86_VM_STATE VmState, USHORT Value1, USHORT Value2)
+{
+    VmState->Registers.Eflags.Zf = ((Value1 - Value2) == 0);
+    VmState->Registers.Eflags.Cf = ((Value1 - Value2) > Value1);
+    VmState->Registers.Eflags.Sf = ((SHORT)(Value1 - Value2) < 0);
+    VmState->Registers.Eflags.Of = ((SHORT)(Value1 - Value2) > (SHORT)Value1);
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/vmstate.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,299 @@
+/*
+ * PROJECT:         x86 CPU emulator
+ * LICENSE:         GPL, See COPYING in the top level directory
+ * FILE:            lib/x86emu/x86emu.c
+ * PURPOSE:         
+ * PROGRAMMERS:     Timo Kreuzer (timo.kreuzer at reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <x86emu.h>
+//#define NDEBUG
+#include <debug.h>
+
+#undef DPRINT
+#define DPRINT DbgPrint
+
+/* GLOBALS *******************************************************************/
+
+static const ULONG RegisterTable[3][8] =
+{
+    {
+        FIELD_OFFSET(X86_REGISTERS, Al),
+        FIELD_OFFSET(X86_REGISTERS, Cl),
+        FIELD_OFFSET(X86_REGISTERS, Dl),
+        FIELD_OFFSET(X86_REGISTERS, Bl),
+        FIELD_OFFSET(X86_REGISTERS, Ah),
+        FIELD_OFFSET(X86_REGISTERS, Ch),
+        FIELD_OFFSET(X86_REGISTERS, Dh),
+        FIELD_OFFSET(X86_REGISTERS, Bh),
+    },
+    {
+        FIELD_OFFSET(X86_REGISTERS, Ax),
+        FIELD_OFFSET(X86_REGISTERS, Cx),
+        FIELD_OFFSET(X86_REGISTERS, Dx),
+        FIELD_OFFSET(X86_REGISTERS, Bx),
+        FIELD_OFFSET(X86_REGISTERS, Sp),
+        FIELD_OFFSET(X86_REGISTERS, Bp),
+        FIELD_OFFSET(X86_REGISTERS, Si),
+        FIELD_OFFSET(X86_REGISTERS, Di),
+    },
+    {
+        FIELD_OFFSET(X86_REGISTERS, Eax),
+        FIELD_OFFSET(X86_REGISTERS, Ecx),
+        FIELD_OFFSET(X86_REGISTERS, Edx),
+        FIELD_OFFSET(X86_REGISTERS, Ebx),
+        FIELD_OFFSET(X86_REGISTERS, Esp),
+        FIELD_OFFSET(X86_REGISTERS, Ebp),
+        FIELD_OFFSET(X86_REGISTERS, Esi),
+        FIELD_OFFSET(X86_REGISTERS, Edi),
+    }
+};
+
+/* INLINE FUNCTONS ***********************************************************/
+
+#include "vmstate.h"
+#include "op_cmp.h"
+#include "op_stack.h"
+#include "op_jump.h"
+#include "op_mov.h"
+
+VOID
+FORCEINLINE
+Opcode_E8_CALL16(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    SHORT Offset;
+
+    Offset = *(PSHORT)(IntructionPointer + 1) + 3;
+    DPRINT("CALL %x\n", VmState->Registers.Ip + Offset);
+    VmState_Push(VmState, VmState->Registers.Ip + 3);
+    VmState_AdvanceIp(VmState, Offset);
+}
+
+VOID
+FORCEINLINE
+Opcode_80(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    MODRM ModRm;
+    UCHAR Value;
+    
+    ModRm.Byte = IntructionPointer[1];
+
+    if (ModRm.reg == 7)
+    {
+        /* We have an 8 bit CMP */
+        DPRINT("CMP ??. 0x%x\n", IntructionPointer[2]);
+        Value = VmState_GetVal8(VmState, ModRm);
+        VmState_CMP8(VmState, Value, IntructionPointer[2]);
+        VmState_AdvanceIp(VmState, 3);
+        return;
+    }
+    DPRINT1("UNKNOWN\n");
+}
+
+VOID
+FORCEINLINE
+Opcode_F3_REP(PX86_VM_STATE VmState, PCHAR IntructionPointer)
+{
+    UCHAR ByteVal;
+    
+    ByteVal = IntructionPointer[1];
+    switch (ByteVal)
+    {
+        case 0x6C: /* REP INSB */
+        case 0x6D: /* REP INSW/D */
+        case 0xAC: /* REP LODSB */
+        case 0xAD: /* REP LODSWDQ */
+        case 0xA4: /* REP MOVSB */
+        case 0xA5: /* REP MOVSW/D/Q */
+        case 0x6E: /* REP OUTSB */
+        case 0x6F: /* REP OUTSW/D */
+        case 0xAA: /* REP STOSB */
+        case 0xAB: /* REP STOSW/D/Q */
+            break;
+    }
+
+}
+
+
+
+
+
+VOID
+NTAPI
+x86Emulator(PX86_VM_STATE VmState)
+{
+    PCHAR InstructionPointer;
+    UCHAR ByteVal;
+
+//    x86EmuInitializeState();
+    
+    for (;;)
+    {
+        InstructionPointer = VmState_GetIp(VmState);
+        ByteVal = *InstructionPointer;
+        
+        DPRINT("%04x:%04x  %02x  ", VmState->Registers.SegCs, VmState->Registers.Eip, ByteVal);
+
+        switch (ByteVal)
+        {
+            case 0x06: /* PUSH ES */
+                Opcode_06_PUSH_ES(VmState, InstructionPointer);
+                break;
+
+            case 0x07: /* POP ES */
+                Opcode_07_POP_ES(VmState, InstructionPointer);
+                break;
+
+//            case 0x14: /* ADC AL, imm8 */
+//                VmState_AdvanceIp(VmState, 2);
+//                break;
+
+            case 0x15: /* ADC AX, imm16 */
+                //_OpcodeADC16(&VmState->Registers.Al, WORD(&InstructionPointer[1]));
+                VmState_AdvanceIp(VmState, 3);
+                break;
+
+            case 0x1E: /* PUSH DS */
+                Opcode_1E_PUSH_DS(VmState, InstructionPointer);
+                break;
+
+            case 0x1F: /* POP DS */
+                Opcode_1F_POP_DS(VmState, InstructionPointer);
+                break;
+
+            case 0x26: /* Force ES segment */
+            case 0x2e: /* Force CS segment */
+                VmState_EnablePrefix(VmState, PREFIX_SEGMENT_CS);
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0x36: /* Force SS segment */
+                VmState->Registers.ShiftedMs = VmState->Registers.ShiftedSs;
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0x37: /* AAA */
+
+            case 0x3D: /* CMP (E)AX, imm16/32 */
+                Opcode_3D_CMP(VmState, InstructionPointer);
+                break;
+
+            case 0x3E: /* Force DS segment */
+                VmState->Registers.ShiftedMs = VmState->Registers.ShiftedDs;
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0x3F: /* AAS */
+                VmState_AdvanceIp(VmState, 1);
+                break;
+
+            /* 0x40 ... 0x4F are REX prefixes */
+
+            case 0x55: /* PUSH BP */
+                Opcode_55_PUSH_BP(VmState, InstructionPointer);
+                break;
+
+            case 0x60: /* PUSHA */
+                Opcode_60_PUSHA(VmState, InstructionPointer);
+                break;
+
+            case 0x61: /* POPA */
+                Opcode_61_POPA(VmState, InstructionPointer);
+                break;
+
+            case 0x64: /* Force FS segment */
+            case 0x65: /* Force GS segment */
+
+            case 0x66: /* Operand size override */
+                VmState_EnablePrefix(VmState, PREFIX_SIZE_OVERRIDE);
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0x67: /* Address size prefix */
+                VmState_EnablePrefix(VmState, PREFIX_ADDRESS_OVERRIDE);
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0x74: /* JZ */
+                Opcode_74_JZ8(VmState, InstructionPointer);
+                break;
+
+            case 0x75: /* JNZ */
+                Opcode_75_JNZ8(VmState, InstructionPointer);
+                break;
+
+            case 0x80: /* ... */
+                Opcode_80(VmState, InstructionPointer);
+                break;
+
+            case 0x89: /* MOV regmem16, reg16 */
+                Opcode_89_MOV(VmState, InstructionPointer);
+                break;
+
+            case 0x8E: /* MOV seg, reg16 */
+                Opcode_8E_MOV(VmState, InstructionPointer);
+                break;
+
+            case 0x9C: /* PUSHF */
+                Opcode_9C_PUSHF(VmState, InstructionPointer);
+                break;
+
+            case 0x9D: /* POPF */
+                Opcode_9D_POPF(VmState, InstructionPointer);
+                break;
+
+            case 0xBB: /* MOV BX, imm16 */
+                Opcode_BB_MOV(VmState, InstructionPointer);
+                break;
+
+            case 0xCF: /* IRET */
+                DPRINT("IRET\n");
+                return;
+
+            case 0xD4: /* AAM */
+                /* Check for D4 0A */
+
+            case 0xD5: /* AAD */
+                /* Check for D5 0A */
+
+            case 0xE8:
+                Opcode_E8_CALL16(VmState, InstructionPointer);
+                break;
+
+            case 0xE9: /* JMP off16 */
+                Opcode_E9_JMP16(VmState, InstructionPointer);
+                break;
+
+            case 0xF0: /* LOCK (ignored) */
+                DPRINT("LOCK ");
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0xF2: /* REPNZ/REPNE */
+                DPRINT("REPNE ");
+                VmState_EnablePrefix(VmState, PREFIX_REP);
+                VmState_AdvanceIp(VmState, 1);
+                continue;
+
+            case 0xF3: /* REP */
+                Opcode_F3_REP(VmState, InstructionPointer);
+                break;
+
+
+            default:
+                DPRINT("Unknown opcode 0x%x\n", ByteVal);
+                VmState_AdvanceIp(VmState, 1);
+                //x86EmuRaiseException(EXCEPTION_INVALID_OPCODE, ByteVal);
+                //return;
+        }
+
+        /* Clear prefixes and continue with next intruction */
+        VmState_ClearPrefixes(VmState);
+
+//ResetMs:
+        VmState->Registers.ShiftedMs = VmState->Registers.ShiftedDs;
+
+    }
+}

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.c
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.h (from r45254, branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/x86emu.h)
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.h?p2=branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.h&p1=branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/x86emu.h&r1=45254&r2=45464&rev=45464&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/x86emu.h [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.h [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,3 +1,10 @@
+
+
+#ifndef _X86EMU_H_
+#define _X86EMU_H_
+
+#include <ntifs.h>
+#include <ntndk.h>
 
 typedef union
 {
@@ -219,3 +226,5 @@
 VOID
 NTAPI
 x86Emulator(PX86_VM_STATE VmState);
+
+#endif

Added: branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild?rev=45464&view=auto
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild (added)
+++ branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild [iso-8859-1] Sat Feb  6 20:13:54 2010
@@ -1,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<module name="x86emu" type="staticlibrary">
+	<define name="_X86BIOS_" />
+	<include base="x86emu">.</include>
+	<file>x86emu.c</file>
+</module>

Propchange: branches/ros-amd64-bringup/reactos/lib/x86emu/x86emu.rbuild
------------------------------------------------------------------------------
    svn:eol-style = native




More information about the Ros-diffs mailing list