[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 22 Jun 2013 01:41:51 +0000 (01:41 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 22 Jun 2013 01:41:51 +0000 (01:41 +0000)
Improve keyboard IRQ performance.
Add debug output to measure number of instructions per second.

svn path=/branches/ntvdm/; revision=59279

subsystems/ntvdm/CMakeLists.txt
subsystems/ntvdm/ntvdm.c
subsystems/ntvdm/ntvdm.h

index 3145102..48c9c80 100644 (file)
@@ -12,6 +12,6 @@ list(APPEND SOURCE
 add_executable(ntvdm ${SOURCE})
 set_module_type(ntvdm win32cui UNICODE)
 target_link_libraries(ntvdm softx86 softx87)
-add_importlibs(ntvdm msvcrt user32 kernel32)
+add_importlibs(ntvdm msvcrt user32 kernel32 ntdll)
 add_dependencies(ntvdm softx86 softx87)
 add_cd_file(TARGET ntvdm DESTINATION reactos/system32 FOR all)
index d1a2fa8..9344891 100644 (file)
@@ -8,6 +8,8 @@
 
 #include "ntvdm.h"
 
+#define NDEBUG
+
 BOOLEAN VdmRunning = TRUE;
 LPVOID BaseAddress = NULL;
 LPCWSTR ExceptionName[] =
@@ -57,6 +59,7 @@ INT wmain(INT argc, WCHAR *argv[])
     INT i;
     BOOLEAN PrintUsage = TRUE;
     CHAR CommandLine[128];
+    DWORD CurrentTickCount, LastTickCount = 0, Cycles = 0, LastCyclePrintout = 0;
     LARGE_INTEGER Frequency, LastTimerTick, Counter;
     LONGLONG TimerTicks;
 
@@ -133,7 +136,10 @@ INT wmain(INT argc, WCHAR *argv[])
     /* Main loop */
     while (VdmRunning)
     {
-        /* Get the current time */
+        /* Get the current number of ticks */
+        CurrentTickCount = GetTickCount();
+        
+        /* Get the current performance counter value */
         QueryPerformanceCounter(&Counter);
         
         /* Get the number of PIT ticks that have passed */
@@ -144,11 +150,23 @@ INT wmain(INT argc, WCHAR *argv[])
         for (i = 0; i < TimerTicks; i++) PitDecrementCount();
         LastTimerTick = Counter;
         
-        /* Check for console input events */
-        CheckForInputEvents();
+        /* Check for console input events every millisecond */
+        if (CurrentTickCount != LastTickCount)
+        {
+            CheckForInputEvents();
+            LastTickCount = CurrentTickCount;
+        }
         
         /* Continue CPU emulation */
         EmulatorStep();
+        
+        Cycles++;
+        if ((CurrentTickCount - LastCyclePrintout) >= 1000)
+        {
+            DPRINT1("NTVDM: %d Instructions Per Second\n", Cycles);
+            LastCyclePrintout = CurrentTickCount;
+            Cycles = 0;
+        }
     }
 
 Cleanup:
index c2c8c44..04b4ecc 100644 (file)
@@ -14,6 +14,7 @@
 #include <conio.h>
 #include <assert.h>
 #include <stdarg.h>
+#include <debug.h>
 
 /* DEFINES ********************************************************************/