static void ConvertProLineJoystick(IController c, InputState s)
		{
			s.ClearAllInput();
			ConvertConsoleButtons7800(c, s);
			ConvertDirections(c, s, 0);
			ConvertDirections(c, s, 1);
			s.RaiseInput(0, MachineInput.Fire, c["P1 Trigger"]);
			s.RaiseInput(0, MachineInput.Fire2, c["P1 Trigger 2"]);
			s.RaiseInput(1, MachineInput.Fire, c["P2 Trigger"]);
			s.RaiseInput(1, MachineInput.Fire2, c["P2 Trigger 2"]);
		}
		static void ConvertDriving(IController c, InputState s)
		{
			s.ClearAllInput();
			ConvertConsoleButtons(c, s);
			ConvertTrigger(c, s, 0);
			ConvertTrigger(c, s, 1);
			s.RaiseInput(0, drvlut[(int)c.GetFloat("P1 Driving")], true);
			s.RaiseInput(1, drvlut[(int)c.GetFloat("P2 Driving")], true);
		}
		static void ConvertBoosterGrip(IController c, InputState s)
		{
			s.ClearAllInput();
			ConvertConsoleButtons(c, s);
			ConvertDirections(c, s, 0);
			ConvertDirections(c, s, 1);
			// weird mapping is intentional
			s.RaiseInput(0, MachineInput.Fire, c["P1 Trigger"]);
			s.RaiseInput(0, MachineInput.Fire2, c["P1 Trigger 2"]);
			s.RaiseInput(1, MachineInput.Fire2, c["P1 Trigger 3"]);
			s.RaiseInput(1, MachineInput.Fire, c["P2 Trigger"]);
			s.RaiseInput(2, MachineInput.Fire2, c["P2 Trigger 2"]);
			s.RaiseInput(3, MachineInput.Fire2, c["P2 Trigger 3"]);
		}
		static void ConvertKeypad(IController c, InputState s)
		{
			s.ClearAllInput();
			ConvertConsoleButtons(c, s);
			for (int i = 0; i < 4; i++)
			{
				string ps = string.Format("P{0} ", i + 1);
				s.RaiseInput(i, MachineInput.NumPad1, c[ps + "Keypad1"]);
				s.RaiseInput(i, MachineInput.NumPad2, c[ps + "Keypad2"]);
				s.RaiseInput(i, MachineInput.NumPad3, c[ps + "Keypad3"]);
				s.RaiseInput(i, MachineInput.NumPad4, c[ps + "Keypad4"]);
				s.RaiseInput(i, MachineInput.NumPad5, c[ps + "Keypad5"]);
				s.RaiseInput(i, MachineInput.NumPad6, c[ps + "Keypad6"]);
				s.RaiseInput(i, MachineInput.NumPad7, c[ps + "Keypad7"]);
				s.RaiseInput(i, MachineInput.NumPad8, c[ps + "Keypad8"]);
				s.RaiseInput(i, MachineInput.NumPad9, c[ps + "Keypad9"]);
				s.RaiseInput(i, MachineInput.NumPadMult, c[ps + "KeypadA"]);
				s.RaiseInput(i, MachineInput.NumPad0, c[ps + "Keypad0"]);
				s.RaiseInput(i, MachineInput.NumPadHash, c[ps + "KeypadP"]);
			}
		}
		static void ConvertTrigger(IController c, InputState s, int p)
		{
			string ps = string.Format("P{0} ", p + 1);
			s.RaiseInput(p, MachineInput.Fire, c[ps + "Trigger"]);
		}
		static void ConvertDirections(IController c, InputState s, int p)
		{
			string ps = string.Format("P{0} ", p + 1);
			s.RaiseInput(p, MachineInput.Up, c[ps + "Up"]);
			s.RaiseInput(p, MachineInput.Down, c[ps + "Down"]);
			s.RaiseInput(p, MachineInput.Left, c[ps + "Left"]);
			s.RaiseInput(p, MachineInput.Right, c[ps + "Right"]);
		}
		static void ConvertConsoleButtons7800(IController c, InputState s)
		{
			s.RaiseInput(0, MachineInput.Reset, c["Reset"]);
			s.RaiseInput(0, MachineInput.Select, c["Select"]);
			s.RaiseInput(0, MachineInput.Color, c["Pause"]);
		}
		static void ConvertConsoleButtons(IController c, InputState s)
		{
			s.RaiseInput(0, MachineInput.Reset, c["Reset"]);
			s.RaiseInput(0, MachineInput.Select, c["Select"]);
			s.RaiseInput(0, MachineInput.Color, c["BW"]);
			s.RaiseInput(0, MachineInput.LeftDifficulty, c["Left Difficulty"]);
			s.RaiseInput(0, MachineInput.RightDifficulty, c["Right Difficulty"]);
		}