Author: aandrejevic
Date: Sun Aug 28 02:00:10 2016
New Revision: 72481

URL: http://svn.reactos.org/svn/reactos?rev=72481&view=rev
Log:
[NTVDM:BIOS]
Properly implement INT 15h, AH = 86h.


Modified:
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c

Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c?rev=72481&r1=72480&r2=72481&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c    [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c    [iso-8859-1] 
Sun Aug 28 02:00:10 2016
@@ -327,14 +327,31 @@
              * See Ralf Brown: http://www.ctyme.com/intr/rb-1525.htm
              * for more information.
              */
-            LARGE_INTEGER TimeOut;
-            TimeOut.QuadPart = MAKELONG(getDX(), getCX()) * -10LL;
-
-            // HACK: For now, use the NT API (time in hundreds of nanoseconds).
-            NtDelayExecution(FALSE, &TimeOut);
-
-            /* Clear CF */
-            Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+
+            static ULONG CompletionTime = 0;
+
+            /* Check if we're already looping */
+            if (getCF())
+            {
+                if (GetTickCount() >= CompletionTime)
+                {
+                    /* Stop looping */
+                    setCF(0);
+
+                    /* Clear the CF on the stack too */
+                    Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+                }
+            }
+            else
+            {
+                /* Set the CF on the stack */
+                Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
+
+                /* Set the completion time and start looping */
+                CompletionTime = GetTickCount() + (MAKELONG(getDX(), getCX()) 
/ 1000);
+                setCF(1);
+            }
+
             break;
         }
 


Reply via email to