From df8eab9483a3b697a70446062e139e95c402674b Mon Sep 17 00:00:00 2001
From: Ian C <ianc@noddybox.co.uk>
Date: Tue, 22 May 2012 22:05:17 +0000
Subject: Added some base source files for the joystick and joystick test.

---
 Native/EmuKeyboardDesigner/EmuKeyboardDesigner.suo | Bin 51712 -> 51712 bytes
 WindowsPhone/JoystickTest.sln                      |  32 ++++
 .../JoystickTest/JoystickTest/Background.png       | Bin 0 -> 12776 bytes
 WindowsPhone/JoystickTest/JoystickTest/Game.ico    | Bin 0 -> 4286 bytes
 WindowsPhone/JoystickTest/JoystickTest/Game1.cs    | 103 ++++++++++++
 .../JoystickTest/JoystickTest/JoystickTest.csproj  | 107 +++++++++++++
 .../JoystickTest/JoystickTest/PhoneGameThumb.png   | Bin 0 -> 3176 bytes
 WindowsPhone/JoystickTest/JoystickTest/Program.cs  |  21 +++
 .../JoystickTest/Properties/AppManifest.xml        |   6 +
 .../JoystickTest/Properties/AssemblyInfo.cs        |  36 +++++
 .../JoystickTest/Properties/WMAppManifest.xml      |  37 +++++
 .../JoystickTestContent.contentproj                |  40 +++++
 WindowsPhone/KeyboardTest.suo                      | Bin 47616 -> 48128 bytes
 .../Noddybox.Emulation.Xna.Joystick.csproj         |  80 ++++++++++
 .../Properties/AssemblyInfo.cs                     |  36 +++++
 .../JoystickDriver.cs                              | 177 +++++++++++++++++++++
 .../JoystickState.cs                               |  43 +++++
 17 files changed, 718 insertions(+)
 create mode 100644 WindowsPhone/JoystickTest.sln
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Background.png
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Game.ico
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Game1.cs
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/JoystickTest.csproj
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/PhoneGameThumb.png
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Program.cs
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Properties/AppManifest.xml
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Properties/AssemblyInfo.cs
 create mode 100644 WindowsPhone/JoystickTest/JoystickTest/Properties/WMAppManifest.xml
 create mode 100644 WindowsPhone/JoystickTest/JoystickTestContent/JoystickTestContent.contentproj
 create mode 100644 WindowsPhone/Noddybox.Emulation.Xna.Joystick/Noddybox.Emulation.Xna.Joystick.csproj
 create mode 100644 WindowsPhone/Noddybox.Emulation.Xna.Joystick/Properties/AssemblyInfo.cs
 create mode 100644 src/Noddybox.Emulation.Xna.Joystick/JoystickDriver.cs
 create mode 100644 src/Noddybox.Emulation.Xna.Joystick/JoystickState.cs

diff --git a/Native/EmuKeyboardDesigner/EmuKeyboardDesigner.suo b/Native/EmuKeyboardDesigner/EmuKeyboardDesigner.suo
index c832963..72f0139 100644
Binary files a/Native/EmuKeyboardDesigner/EmuKeyboardDesigner.suo and b/Native/EmuKeyboardDesigner/EmuKeyboardDesigner.suo differ
diff --git a/WindowsPhone/JoystickTest.sln b/WindowsPhone/JoystickTest.sln
new file mode 100644
index 0000000..f0a0b38
--- /dev/null
+++ b/WindowsPhone/JoystickTest.sln
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010 Express for Windows Phone
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JoystickTest", "JoystickTest\JoystickTest\JoystickTest.csproj", "{A709A813-BB79-4D69-B698-9EAD2FC58ADF}"
+EndProject
+Project("{96E2B04D-8817-42C6-938A-82C39BA4D311}") = "JoystickTestContent", "JoystickTest\JoystickTestContent\JoystickTestContent.contentproj", "{0EDE15C8-F99E-45C6-837A-D35607A9DC10}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Noddybox.Emulation.Xna.Joystick", "Noddybox.Emulation.Xna.Joystick\Noddybox.Emulation.Xna.Joystick.csproj", "{0DFFE208-C204-4E95-8D09-7A0C08F06680}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Windows Phone = Debug|Windows Phone
+		Release|Windows Phone = Release|Windows Phone
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Debug|Windows Phone.ActiveCfg = Debug|Windows Phone
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Debug|Windows Phone.Build.0 = Debug|Windows Phone
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Debug|Windows Phone.Deploy.0 = Debug|Windows Phone
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Release|Windows Phone.ActiveCfg = Release|Windows Phone
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Release|Windows Phone.Build.0 = Release|Windows Phone
+		{A709A813-BB79-4D69-B698-9EAD2FC58ADF}.Release|Windows Phone.Deploy.0 = Release|Windows Phone
+		{0EDE15C8-F99E-45C6-837A-D35607A9DC10}.Debug|Windows Phone.ActiveCfg = Debug|Windows Phone
+		{0EDE15C8-F99E-45C6-837A-D35607A9DC10}.Release|Windows Phone.ActiveCfg = Release|Windows Phone
+		{0DFFE208-C204-4E95-8D09-7A0C08F06680}.Debug|Windows Phone.ActiveCfg = Debug|Windows Phone
+		{0DFFE208-C204-4E95-8D09-7A0C08F06680}.Debug|Windows Phone.Build.0 = Debug|Windows Phone
+		{0DFFE208-C204-4E95-8D09-7A0C08F06680}.Release|Windows Phone.ActiveCfg = Release|Windows Phone
+		{0DFFE208-C204-4E95-8D09-7A0C08F06680}.Release|Windows Phone.Build.0 = Release|Windows Phone
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Background.png b/WindowsPhone/JoystickTest/JoystickTest/Background.png
new file mode 100644
index 0000000..4af7a5f
Binary files /dev/null and b/WindowsPhone/JoystickTest/JoystickTest/Background.png differ
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Game.ico b/WindowsPhone/JoystickTest/JoystickTest/Game.ico
new file mode 100644
index 0000000..8cff41e
Binary files /dev/null and b/WindowsPhone/JoystickTest/JoystickTest/Game.ico differ
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Game1.cs b/WindowsPhone/JoystickTest/JoystickTest/Game1.cs
new file mode 100644
index 0000000..a5f8be3
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/Game1.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Audio;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.GamerServices;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using Microsoft.Xna.Framework.Input.Touch;
+using Microsoft.Xna.Framework.Media;
+
+namespace JoystickTest
+{
+    /// <summary>
+    /// This is the main type for your game
+    /// </summary>
+    public class Game1 : Microsoft.Xna.Framework.Game
+    {
+        GraphicsDeviceManager graphics;
+        SpriteBatch spriteBatch;
+
+        public Game1()
+        {
+            graphics = new GraphicsDeviceManager(this);
+            graphics.PreferredBackBufferWidth = 480;
+            graphics.PreferredBackBufferHeight = 800;
+
+            //graphics.SupportedOrientations = DisplayOrientation.Portrait;
+
+            Content.RootDirectory = "Content";
+
+            // Frame rate is 30 fps by default for Windows Phone.
+            TargetElapsedTime = TimeSpan.FromTicks(333333);
+
+            // Extend battery life under lock.
+            InactiveSleepTime = TimeSpan.FromSeconds(1);
+        }
+
+        /// <summary>
+        /// Allows the game to perform any initialization it needs to before starting to run.
+        /// This is where it can query for any required services and load any non-graphic
+        /// related content.  Calling base.Initialize will enumerate through any components
+        /// and initialize them as well.
+        /// </summary>
+        protected override void Initialize()
+        {
+            // TODO: Add your initialization logic here
+
+            base.Initialize();
+        }
+
+        /// <summary>
+        /// LoadContent will be called once per game and is the place to load
+        /// all of your content.
+        /// </summary>
+        protected override void LoadContent()
+        {
+            // Create a new SpriteBatch, which can be used to draw textures.
+            spriteBatch = new SpriteBatch(GraphicsDevice);
+
+            // TODO: use this.Content to load your game content here
+        }
+
+        /// <summary>
+        /// UnloadContent will be called once per game and is the place to unload
+        /// all content.
+        /// </summary>
+        protected override void UnloadContent()
+        {
+            // TODO: Unload any non ContentManager content here
+        }
+
+        /// <summary>
+        /// Allows the game to run logic such as updating the world,
+        /// checking for collisions, gathering input, and playing audio.
+        /// </summary>
+        /// <param name="gameTime">Provides a snapshot of timing values.</param>
+        protected override void Update(GameTime gameTime)
+        {
+            // Allows the game to exit
+            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
+                this.Exit();
+
+            // TODO: Add your update logic here
+
+            base.Update(gameTime);
+        }
+
+        /// <summary>
+        /// This is called when the game should draw itself.
+        /// </summary>
+        /// <param name="gameTime">Provides a snapshot of timing values.</param>
+        protected override void Draw(GameTime gameTime)
+        {
+            GraphicsDevice.Clear(Color.CornflowerBlue);
+
+            // TODO: Add your drawing code here
+
+            base.Draw(gameTime);
+        }
+    }
+}
diff --git a/WindowsPhone/JoystickTest/JoystickTest/JoystickTest.csproj b/WindowsPhone/JoystickTest/JoystickTest/JoystickTest.csproj
new file mode 100644
index 0000000..37cdf3e
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/JoystickTest.csproj
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{A709A813-BB79-4D69-B698-9EAD2FC58ADF}</ProjectGuid>
+    <ProjectTypeGuids>{6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Windows Phone</Platform>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>JoystickTest</RootNamespace>
+    <AssemblyName>JoystickTest</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+    <XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
+    <XnaPlatform>Windows Phone</XnaPlatform>
+    <XnaProfile>Reach</XnaProfile>
+    <XnaCrossPlatformGroupID>83ae46ff-59aa-4c3e-b3d8-8d5a22f8f846</XnaCrossPlatformGroupID>
+    <XnaOutputType>Game</XnaOutputType>
+    <XnaRefreshLevel>1</XnaRefreshLevel>
+    <WPTombstoneEnabled>false</WPTombstoneEnabled>
+    <XapFilename>$(AssemblyName).xap</XapFilename>
+    <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
+    <XnaWindowsPhoneManifestTemplate>Properties\WMAppManifest.xml</XnaWindowsPhoneManifestTemplate>
+    <TileImage>Background.png</TileImage>
+    <TileTitle>JoystickTest</TileTitle>
+    <SupportedCultures>
+    </SupportedCultures>
+    <ApplicationIcon>Game.ico</ApplicationIcon>
+    <Thumbnail>PhoneGameThumb.png</Thumbnail>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Windows Phone' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Windows Phone\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;WINDOWS_PHONE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <XnaCompressContent>false</XnaCompressContent>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Windows Phone' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Windows Phone\Release</OutputPath>
+    <DefineConstants>TRACE;WINDOWS_PHONE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <XnaCompressContent>false</XnaCompressContent>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Xna.Framework" />
+    <Reference Include="Microsoft.Xna.Framework.Game" />
+    <Reference Include="Microsoft.Xna.Framework.Graphics" />
+    <Reference Include="Microsoft.Xna.Framework.GamerServices" />
+    <Reference Include="Microsoft.Xna.Framework.Input.Touch" />
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Net" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AppManifest.xml">
+      <XnaPlatformSpecific>true</XnaPlatformSpecific>
+    </None>
+    <None Include="Properties\WMAppManifest.xml">
+      <XnaPlatformSpecific>true</XnaPlatformSpecific>
+    </None>
+    <Compile Include="Program.cs" />
+    <Compile Include="Game1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Game.ico" />
+    <Content Include="PhoneGameThumb.png">
+      <XnaPlatformSpecific>true</XnaPlatformSpecific>
+    </Content>
+    <Content Include="Background.png">
+      <XnaPlatformSpecific>true</XnaPlatformSpecific>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Noddybox.Emulation.Xna.Joystick\Noddybox.Emulation.Xna.Joystick.csproj">
+      <Project>{0DFFE208-C204-4E95-8D09-7A0C08F06680}</Project>
+      <Name>Noddybox.Emulation.Xna.Joystick</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\JoystickTestContent\JoystickTestContent.contentproj">
+      <Name>JoystickTestContent</Name>
+      <XnaReferenceType>Content</XnaReferenceType>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" />
+  <!--
+      To modify your build process, add your task inside one of the targets below and uncomment it. 
+      Other similar extension points exist, see Microsoft.Common.targets.
+      <Target Name="BeforeBuild">
+      </Target>
+      <Target Name="AfterBuild">
+      </Target>
+    -->
+</Project>
\ No newline at end of file
diff --git a/WindowsPhone/JoystickTest/JoystickTest/PhoneGameThumb.png b/WindowsPhone/JoystickTest/JoystickTest/PhoneGameThumb.png
new file mode 100644
index 0000000..a45f4db
Binary files /dev/null and b/WindowsPhone/JoystickTest/JoystickTest/PhoneGameThumb.png differ
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Program.cs b/WindowsPhone/JoystickTest/JoystickTest/Program.cs
new file mode 100644
index 0000000..561b942
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/Program.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace JoystickTest
+{
+#if WINDOWS || XBOX
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        static void Main(string[] args)
+        {
+            using (Game1 game = new Game1())
+            {
+                game.Run();
+            }
+        }
+    }
+#endif
+}
+
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Properties/AppManifest.xml b/WindowsPhone/JoystickTest/JoystickTest/Properties/AppManifest.xml
new file mode 100644
index 0000000..a955232
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/Properties/AppManifest.xml
@@ -0,0 +1,6 @@
+<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+>
+    <Deployment.Parts>
+    </Deployment.Parts>
+</Deployment>
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Properties/AssemblyInfo.cs b/WindowsPhone/JoystickTest/JoystickTest/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..3964eea
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("JoystickTest")]
+[assembly: AssemblyProduct("JoystickTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyCopyright("Copyright ©  2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type. Only Windows
+// assemblies support COM.
+[assembly: ComVisible(false)]
+
+// On Windows, the following GUID is for the ID of the typelib if this
+// project is exposed to COM. On other platforms, it unique identifies the
+// title storage container when deploying this assembly to the device.
+[assembly: Guid("6080bdbc-f325-4187-9cbc-48004ab2bbf9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
\ No newline at end of file
diff --git a/WindowsPhone/JoystickTest/JoystickTest/Properties/WMAppManifest.xml b/WindowsPhone/JoystickTest/JoystickTest/Properties/WMAppManifest.xml
new file mode 100644
index 0000000..7d3295b
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTest/Properties/WMAppManifest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.1">
+  <App xmlns="" ProductID="{6080bdbc-f325-4187-9cbc-48004ab2bbf9}" Title="JoystickTest" RuntimeType="XNA" Version="1.0.0.0" Genre="Apps.Normal" Author="" Description="" Publisher="">
+    <IconPath IsRelative="true" IsResource="false"></IconPath>
+    <Capabilities>
+      <Capability Name="ID_CAP_NETWORKING" />
+      <Capability Name="ID_CAP_LOCATION" />
+      <Capability Name="ID_CAP_SENSORS" />
+      <Capability Name="ID_CAP_MICROPHONE" />
+      <Capability Name="ID_CAP_MEDIALIB" />
+      <Capability Name="ID_CAP_GAMERSERVICES" />
+      <Capability Name="ID_CAP_PHONEDIALER" />
+      <Capability Name="ID_CAP_PUSH_NOTIFICATION" />
+      <Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
+      <Capability Name="ID_CAP_IDENTITY_USER" />
+      <Capability Name="ID_CAP_IDENTITY_DEVICE" />
+
+      <!-- Windows Phone OS 7.1 Capabilities -->
+      <Capability Name="ID_CAP_ISV_CAMERA" />
+      <Capability Name="ID_CAP_CONTACTS" />
+      <Capability Name="ID_CAP_APPOINTMENTS" />
+    </Capabilities>
+    <Tasks>
+      <DefaultTask Name="_default"/>
+    </Tasks>
+    <Tokens>
+      <PrimaryToken TokenID="JoystickTestToken" TaskName="_default">
+        <TemplateType5>
+          <BackgroundImageURI IsRelative="true" IsResource="false"></BackgroundImageURI>
+          <Count>0</Count>
+          <Title></Title>
+        </TemplateType5>
+      </PrimaryToken>
+    </Tokens>
+  </App>
+</Deployment>
+
diff --git a/WindowsPhone/JoystickTest/JoystickTestContent/JoystickTestContent.contentproj b/WindowsPhone/JoystickTest/JoystickTestContent/JoystickTestContent.contentproj
new file mode 100644
index 0000000..4ae643c
--- /dev/null
+++ b/WindowsPhone/JoystickTest/JoystickTestContent/JoystickTestContent.contentproj
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{0EDE15C8-F99E-45C6-837A-D35607A9DC10}</ProjectGuid>
+    <ProjectTypeGuids>{96E2B04D-8817-42c6-938A-82C39BA4D311};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
+    <OutputPath>bin\$(Platform)\$(Configuration)</OutputPath>
+    <ContentRootDirectory>Content</ContentRootDirectory>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|Windows Phone'">
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|Windows Phone'">
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup>
+    <RootNamespace>JoystickTestContent</RootNamespace>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.EffectImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.FBXImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.TextureImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.XImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.AudioImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline.VideoImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
+  <!--  To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/WindowsPhone/KeyboardTest.suo b/WindowsPhone/KeyboardTest.suo
index 9d8aa7e..cf0b493 100644
Binary files a/WindowsPhone/KeyboardTest.suo and b/WindowsPhone/KeyboardTest.suo differ
diff --git a/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Noddybox.Emulation.Xna.Joystick.csproj b/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Noddybox.Emulation.Xna.Joystick.csproj
new file mode 100644
index 0000000..bd97932
--- /dev/null
+++ b/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Noddybox.Emulation.Xna.Joystick.csproj
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{0DFFE208-C204-4E95-8D09-7A0C08F06680}</ProjectGuid>
+    <ProjectTypeGuids>{6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Windows Phone</Platform>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Noddybox.Emulation.Xna.Joystick</RootNamespace>
+    <AssemblyName>Noddybox.Emulation.Xna.Joystick</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+    <XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
+    <XnaPlatform>Windows Phone</XnaPlatform>
+    <XnaProfile>Reach</XnaProfile>
+    <XnaCrossPlatformGroupID>20897ae2-4e23-452c-9b11-3a423d7ecaae</XnaCrossPlatformGroupID>
+    <XnaOutputType>Library</XnaOutputType>
+    <XnaRefreshLevel>1</XnaRefreshLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Windows Phone' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Windows Phone\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;WINDOWS_PHONE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <XnaCompressContent>false</XnaCompressContent>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Windows Phone' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Windows Phone\Release</OutputPath>
+    <DefineConstants>TRACE;WINDOWS_PHONE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <XnaCompressContent>false</XnaCompressContent>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Xna.Framework" />
+    <Reference Include="Microsoft.Xna.Framework.Game" />
+    <Reference Include="Microsoft.Xna.Framework.Graphics" />
+    <Reference Include="Microsoft.Xna.Framework.GamerServices" />
+    <Reference Include="Microsoft.Xna.Framework.Input.Touch" />
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Net" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\src\Noddybox.Emulation.Xna.Joystick\JoystickDriver.cs">
+      <Link>JoystickDriver.cs</Link>
+    </Compile>
+    <Compile Include="..\..\src\Noddybox.Emulation.Xna.Joystick\JoystickState.cs">
+      <Link>JoystickState.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" />
+  <!--
+      To modify your build process, add your task inside one of the targets below and uncomment it. 
+      Other similar extension points exist, see Microsoft.Common.targets.
+      <Target Name="BeforeBuild">
+      </Target>
+      <Target Name="AfterBuild">
+      </Target>
+    -->
+</Project>
\ No newline at end of file
diff --git a/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Properties/AssemblyInfo.cs b/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..747acbc
--- /dev/null
+++ b/WindowsPhone/Noddybox.Emulation.Xna.Joystick/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Noddybox.Emulation.Xna.Joystick")]
+[assembly: AssemblyProduct("Noddybox.Emulation.Xna.Joystick")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyCopyright("Copyright ©  2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type. Only Windows
+// assemblies support COM.
+[assembly: ComVisible(false)]
+
+// On Windows, the following GUID is for the ID of the typelib if this
+// project is exposed to COM. On other platforms, it unique identifies the
+// title storage container when deploying this assembly to the device.
+[assembly: Guid("570d1cb2-07b0-4b3d-bf45-d387c7aeb817")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
\ No newline at end of file
diff --git a/src/Noddybox.Emulation.Xna.Joystick/JoystickDriver.cs b/src/Noddybox.Emulation.Xna.Joystick/JoystickDriver.cs
new file mode 100644
index 0000000..f0d2b63
--- /dev/null
+++ b/src/Noddybox.Emulation.Xna.Joystick/JoystickDriver.cs
@@ -0,0 +1,177 @@
+// This file is part of the Noddybox.Emulation C# suite.
+//
+// Noddybox.Emulation is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Noddybox.Emulation is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Noddybox.Emulation.  If not, see <http://www.gnu.org/licenses/>.
+//
+// Copyright (c) 2012 Ian Cowburn
+//
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Input.Touch;
+
+namespace Noddybox.Emulation.Xna.Joystick
+{
+    /// <summary>
+    /// Displays and drives the joystick.  Unlike the keyboard this is not
+    /// not done event driven, but as a clasic Joystick interface.
+    /// </summary>
+    public class JoystickDriver
+    {
+        #region Private data
+
+        private Texture2D backgroundImage;
+        private Texture2D joystickImage;
+        private Texture2D buttonImage;
+        private Vector2 position;
+        private JoystickState state;
+
+        #endregion
+
+        #region Private members
+
+        #endregion
+
+        #region Public properties
+
+        /// <summary>
+        /// Get the current state of the joystick and fire buttons.
+        /// </summary>
+        public JoystickState State {get {return state;}}
+
+        #endregion
+
+        #region Public members
+
+        /// <summary>
+        /// Updates the keyboard.  Note that this will consume all the key press events.
+        /// </summary>
+        public void Update()
+        {
+            foreach (TouchLocation t in TouchPanel.GetState())
+            {
+            //    int x = (int)t.Position.X;
+            //    int y = (int)t.Position.Y;
+            //    int f = 0;
+            //    KeyState key = null;
+
+
+            //    if (t.State == TouchLocationState.Pressed)
+            //    {
+            //        for(f = 0; f < keymapSize && key == null; f++)
+            //        {
+            //            if (keymapPos[f].Contains(x, y))
+            //            {
+            //                key = keymapState[f];
+            //            }
+            //        }
+
+            //        if (key != null)
+            //        {
+            //            key.TouchId = t.Id;
+
+            //            if (key.IsSticky)
+            //            {
+            //                key.IsPressed = !key.IsPressed;
+            //            }
+            //            else
+            //            {
+            //                key.IsPressed = true;
+            //            }
+
+            //            if (KeyEvent != null)
+            //            {
+            //                KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed});
+            //            }
+            //        }
+            //    }
+            //    else if (t.State == TouchLocationState.Released)
+            //    {
+            //        for(f = 0; f < keymapSize && key == null; f++)
+            //        {
+            //            if (keymapState[f].TouchId == t.Id)
+            //            {
+            //                key = keymapState[f];
+            //            }
+            //        }
+
+            //        if (key != null)
+            //        {
+            //            if (!key.IsSticky)
+            //            {
+            //                key.IsPressed = false;
+
+            //                if (KeyEvent != null)
+            //                {
+            //                    KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed});
+            //                }
+            //            }
+            //        }
+            //    }
+
+            //    // If no key handled, pass on the event
+            //    //
+            //    if (key == null && keymapState.Where(r => r.TouchId == t.Id).Count() == 0)
+            //    {
+            //        if (TouchEvent != null)
+            //        {
+            //            TouchEvent(this, new TouchLocationEventArgs() {Location = t});
+            //        }
+            //    }
+            }
+        }
+
+        /// <summary>
+        /// Draw the keyboard
+        /// </summary>
+        /// <param name="spriteBatch"></param>
+        public void Draw(SpriteBatch spriteBatch)
+        {
+            //spriteBatch.Draw(image, position, Color.White);
+
+            //for(int f = 0; f < keymapSize; f++)
+            //{
+            //    if (keymapState[f].IsPressed)
+            //    {
+            //        spriteBatch.Draw(overlay, keymapPos[f], new Color(200, 200, 0, 25));
+            //    }
+            //}
+        }
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="graphics">The graphics device to associate textures with.</param>
+        /// <param name="backgroundImage">The image for the joystick background.</param>
+        /// <param name="joystickImage">The image for the joystick knob.</param>
+        /// <param name="buttonImage">The image for a joystick button.</param>
+        /// <param name="position">Where to draw and offset the joystick to.</param>
+        public JoystickDriver(GraphicsDevice graphics, Texture2D backgroundImage, Texture2D joystickImage, Texture2D buttonImage, Vector2 position)
+        {
+            this.backgroundImage = backgroundImage;
+            this.joystickImage = joystickImage;
+            this.buttonImage = buttonImage;
+            this.position = position;
+            this.state = JoystickState.None;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/Noddybox.Emulation.Xna.Joystick/JoystickState.cs b/src/Noddybox.Emulation.Xna.Joystick/JoystickState.cs
new file mode 100644
index 0000000..97219bc
--- /dev/null
+++ b/src/Noddybox.Emulation.Xna.Joystick/JoystickState.cs
@@ -0,0 +1,43 @@
+// This file is part of the Noddybox.Emulation C# suite.
+//
+// Noddybox.Emulation is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Noddybox.Emulation is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Noddybox.Emulation.  If not, see <http://www.gnu.org/licenses/>.
+//
+// Copyright (c) 2012 Ian Cowburn
+//
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Input.Touch;
+
+namespace Noddybox.Emulation.Xna.Joystick
+{
+    /// <summary>
+    /// Defines the state of the joystick.
+    /// </summary>
+    public enum JoystickState
+    {
+        None  = 0x00,
+        Up    = 0x01,
+        Down  = 0x02,
+        Left  = 0x04,
+        Right = 0x08,
+        Fire1 = 0x10,
+        Fire2 = 0x20,
+        Fire3 = 0x40,
+        Fire4 = 0x80
+    }
+}
-- 
cgit v1.2.3