Author: hbelusca
Date: Thu May 14 21:13:07 2015
New Revision: 67726
URL: 
http://svn.reactos.org/svn/reactos?rev=67726&view=rev
Log:
[NTVDM]
- Add some early "return" after calls to EmulatorTerminate()
- Some VDDs rely on the fact that NTVDM calls ExitProcess on Windows when it is going to
quit, so let's do the same.
- Put port 61h (and 62h) support in ppi.c (programmable-peripheral-interface).
Added:
    trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.c   (with props)
    trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.h   (with props)
Modified:
    trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt
    trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
    trunk/reactos/subsystems/mvdm/ntvdm/dos/dem.c
    trunk/reactos/subsystems/mvdm/ntvdm/emulator.c
    trunk/reactos/subsystems/mvdm/ntvdm/emulator.h
    trunk/reactos/subsystems/mvdm/ntvdm/hardware/ps2.c
    trunk/reactos/subsystems/mvdm/ntvdm/memory.c
    trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.c
    trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.h
Modified: trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/CMak…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt  [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt  [iso-8859-1] Thu May 14 21:13:07
2015
@@ -24,6 +24,7 @@
     hardware/mouse.c
     hardware/pic.c
     hardware/pit.c
+    hardware/ppi.c
     hardware/ps2.c
     hardware/sound/speaker.c
     hardware/video/vga.c
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios…
==============================================================================
--- 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] Thu May 14
21:13:07 2015
@@ -454,7 +454,6 @@
     /* Stop the VDM */
     EmulatorTerminate();
-    return;
 }
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/dem.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dem.c       [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dem.c       [iso-8859-1] Thu May 14 21:13:07
2015
@@ -78,6 +78,7 @@
             {
                 /* We failed everything, stop the VDM */
                 EmulatorTerminate();
+                return;
             }
             break;
Modified: trunk/reactos/subsystems/mvdm/ntvdm/emulator.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/emul…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/emulator.c      [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/emulator.c      [iso-8859-1] Thu May 14 21:13:07
2015
@@ -28,9 +28,10 @@
 #include "hardware/keyboard.h"
 #include "hardware/mouse.h"
 #include "hardware/pic.h"
+#include "hardware/pit.h"
+#include "hardware/ppi.h"
 #include "hardware/ps2.h"
 #include "hardware/sound/speaker.h"
-#include "hardware/pit.h"
 #include "hardware/video/vga.h"
 #include "vddsup.h"
@@ -41,8 +42,7 @@
 LPVOID  BaseAddress = NULL;
 BOOLEAN VdmRunning  = TRUE;
-static BOOLEAN A20Line   = FALSE;
-static BYTE Port61hState = 0x00;
+static BOOLEAN A20Line = FALSE;
 static HANDLE InputThread = NULL;
@@ -149,7 +149,6 @@
     /* Stop the VDM */
     EmulatorTerminate();
-    return;
 }
 VOID EmulatorTerminate(VOID)
@@ -179,36 +178,6 @@
 {
     DPRINT1("NTVDM: BOP_DEBUGGER\n");
     DebugBreak();
-}
-
-static BYTE WINAPI Port61hRead(USHORT Port)
-{
-    return Port61hState;
-}
-
-static VOID WINAPI Port61hWrite(USHORT Port, BYTE Data)
-{
-    // BOOLEAN SpeakerStateChange = FALSE;
-    BYTE OldPort61hState = Port61hState;
-
-    /* Only the four lowest bytes can be written */
-    Port61hState = (Port61hState & 0xF0) | (Data & 0x0F);
-
-    if ((OldPort61hState ^ Port61hState) & 0x01)
-    {
-        DPRINT("PIT 2 Gate %s\n", Port61hState & 0x01 ? "on" :
"off");
-        PitSetGate(2, !!(Port61hState & 0x01));
-        // SpeakerStateChange = TRUE;
-    }
-
-    if ((OldPort61hState ^ Port61hState) & 0x02)
-    {
-        /* There were some change for the speaker... */
-        DPRINT("Speaker %s\n", Port61hState & 0x02 ? "on" :
"off");
-        // SpeakerStateChange = TRUE;
-    }
-    // if (SpeakerStateChange) SpeakerChange(Port61hState);
-    SpeakerChange(Port61hState);
 }
 static VOID WINAPI PitChan0Out(LPVOID Param, BOOLEAN State)
@@ -466,21 +435,18 @@
     /* Initialize DMA */
     DmaInitialize();
-    /* Initialize the PIC, the PIT, the CMOS and the PC Speaker */
+    /* Initialize PIC, PIT, CMOS, PC Speaker and PS/2 */
     PicInitialize();
+
     PitInitialize();
-    CmosInitialize();
-    SpeakerInitialize();
-
-    /* Set output functions */
     PitSetOutFunction(0, NULL, PitChan0Out);
     PitSetOutFunction(1, NULL, PitChan1Out);
     PitSetOutFunction(2, NULL, PitChan2Out);
-    /* Register the I/O Ports */
-    RegisterIoPort(CONTROL_SYSTEM_PORT61H, Port61hRead, Port61hWrite);
-
-    /* Initialize the PS/2 port */
+    CmosInitialize();
+    SpeakerInitialize();
+    PpiInitialize();
+
     PS2Initialize();
     /* Initialize the keyboard and mouse and connect them to their PS/2 ports */
Modified: trunk/reactos/subsystems/mvdm/ntvdm/emulator.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/emul…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/emulator.h      [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/emulator.h      [iso-8859-1] Thu May 14 21:13:07
2015
@@ -71,10 +71,6 @@
     return Result;
 }
-/* System I/O ports */
-#define CONTROL_SYSTEM_PORT61H  0x61
-
-
 enum
 {
     EMULATOR_EXCEPTION_DIVISION_BY_ZERO,
Added: trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/hard…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.c  (added)
+++ trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.c  [iso-8859-1] Thu May 14 21:13:07
2015
@@ -0,0 +1,85 @@
+/*
+ * COPYRIGHT:       GPL - See COPYING in the top level directory
+ * PROJECT:         ReactOS Virtual DOS Machine
+ * FILE:            ppi.c
+ * PURPOSE:         Programmable Peripheral Interface emulation -
+ *                  i8255A-5 compatible
+ * PROGRAMMERS:     Hermes Belusca-Maito (hermes.belusca(a)sfr.fr)
+ *
+ * NOTES: - Most of its functionality as keyboard controller is replaced
+ *          by the PS/2 controller.
+ *        - This controller is here only for having ports 61h and 62h working.
+ */
+
+/* INCLUDES *******************************************************************/
+
+#define NDEBUG
+
+#include "ntvdm.h"
+#include "emulator.h"
+#include "ppi.h"
+
+#include "hardware/pit.h"
+#include "hardware/sound/speaker.h"
+
+#include "io.h"
+
+/* PRIVATE VARIABLES **********************************************************/
+
+/*static*/ BYTE Port61hState = 0x00; // Used in emulator.c
+static     BYTE Port62hState = 0x00;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+static BYTE WINAPI PpiReadPort(USHORT Port)
+{
+    if (Port == PPI_PORT_61H)
+        return Port61hState;
+    else if (Port == PPI_PORT_62H)
+        return Port62hState;
+
+    return 0x00;
+}
+
+static VOID WINAPI Port61hWrite(USHORT Port, BYTE Data)
+{
+    // BOOLEAN SpeakerStateChange = FALSE;
+    BYTE OldPort61hState = Port61hState;
+
+    /* Only the four lowest bytes can be written */
+    Port61hState = (Port61hState & 0xF0) | (Data & 0x0F);
+
+    if ((OldPort61hState ^ Port61hState) & 0x01)
+    {
+        DPRINT("PIT 2 Gate %s\n", Port61hState & 0x01 ? "on" :
"off");
+        PitSetGate(2, !!(Port61hState & 0x01));
+        // SpeakerStateChange = TRUE;
+    }
+
+    if ((OldPort61hState ^ Port61hState) & 0x02)
+    {
+        /* There were some change for the speaker... */
+        DPRINT("Speaker %s\n", Port61hState & 0x02 ? "on" :
"off");
+        // SpeakerStateChange = TRUE;
+    }
+    // if (SpeakerStateChange) SpeakerChange(Port61hState);
+    SpeakerChange(Port61hState);
+}
+
+static VOID WINAPI Port62hWrite(USHORT Port, BYTE Data)
+{
+    Port62hState = Data;
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+VOID PpiInitialize(VOID)
+{
+    /* Register the I/O Ports */
+    // Port 0x60 is now used by the PS/2 controller
+    RegisterIoPort(PPI_PORT_61H, PpiReadPort, Port61hWrite);
+    RegisterIoPort(PPI_PORT_62H, PpiReadPort, Port62hWrite);
+    // Port 0x63 is unused
+}
+
+/* EOF */
Propchange: trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/hard…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.h  (added)
+++ trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.h  [iso-8859-1] Thu May 14 21:13:07
2015
@@ -0,0 +1,26 @@
+/*
+ * COPYRIGHT:       GPL - See COPYING in the top level directory
+ * PROJECT:         ReactOS Virtual DOS Machine
+ * FILE:            ppi.h
+ * PURPOSE:         Programmable Peripheral Interface emulation -
+ *                  i8255A-5 compatible
+ * PROGRAMMERS:     Hermes Belusca-Maito (hermes.belusca(a)sfr.fr)
+ */
+
+#ifndef _PPI_H_
+#define _PPI_H_
+
+/* DEFINES ********************************************************************/
+
+#define PPI_PORT_61H    0x61
+#define PPI_PORT_62H    0x62
+
+extern BYTE Port61hState;
+
+/* FUNCTIONS ******************************************************************/
+
+VOID PpiInitialize(VOID);
+
+#endif // _PPI_H_
+
+/* EOF */
Propchange: trunk/reactos/subsystems/mvdm/ntvdm/hardware/ppi.h
------------------------------------------------------------------------------
    svn:eol-style = native
Modified: trunk/reactos/subsystems/mvdm/ntvdm/hardware/ps2.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/hard…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/hardware/ps2.c  [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/hardware/ps2.c  [iso-8859-1] Thu May 14 21:13:07
2015
@@ -201,7 +201,7 @@
             {
                 /* Stop the VDM */
                 EmulatorTerminate();
-                break;
+                return;
             }
         }
     }
@@ -230,6 +230,7 @@
                     {
                         /* CPU disabled - Stop the VDM */
                         EmulatorTerminate();
+                        return;
                     }
                     /* Update the A20 line setting */
Modified: trunk/reactos/subsystems/mvdm/ntvdm/memory.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/memo…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/memory.c        [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/memory.c        [iso-8859-1] Thu May 14 21:13:07
2015
@@ -13,9 +13,6 @@
 #include "ntvdm.h"
 #include "emulator.h"
 #include "memory.h"
-
-/* Extra PSDK/NDK Headers */
-#include <ndk/mmfuncs.h>
 /* PRIVATE VARIABLES **********************************************************/
Modified: trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/ntvd…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.c [iso-8859-1] Thu May 14 21:13:07 2015
@@ -542,7 +542,8 @@
     /* Quit the VDM */
     DPRINT1("\n\n\nNTVDM - Exiting...\n\n\n");
-
+    /* Some VDDs rely on the fact that NTVDM calls ExitProcess on Windows */
+    ExitProcess(0);
     return 0;
 }
Modified: trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/ntvd…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/ntvdm.h [iso-8859-1] Thu May 14 21:13:07 2015
@@ -35,6 +35,7 @@
 #define NTOS_MODE_USER
 #include <ndk/kefuncs.h>
+#include <ndk/mmfuncs.h>
 #include <ndk/obfuncs.h>
 #include <ndk/rtlfuncs.h>
 #include <ndk/rtltypes.h>