diff --git a/README.md b/README.md
index 0440ee4..c16790c 100644
--- a/README.md
+++ b/README.md
@@ -14,11 +14,13 @@ The executable is ready to use. However, you will need read AND write permission
 
 ## Supported controllers
 
-### Physical
+### Physical (input)
 
+- One-handle controller for PC (DGC-255)
+- Two-handle controller for PC (DGOC-44U)
 - One-handle controller for Nintendo Switch (ZKNS-001)
 
-### Emulated
+### Emulated (output)
 
 - Two-handle controller for PC (DGOC-44U)
 - Two-handle controller for Sony PlayStation (SLPH-00051)
@@ -27,6 +29,6 @@ The executable is ready to use. However, you will need read AND write permission
 
 ## Notes
 
-When emulating console controllers, an emulated Sony PlayStation 3 controller is used for easier mapping. On RetroArch, everything works out of the box.
+When emulating console controllers, an emulated Sony PlayStation 3 controller is used for easier mapping. On RetroArch, everything should work out of the box.
 
 _Densha de GO! 64_ requires connecting the controller to Port 3 and enabling **Independent C-button Controls**.
diff --git a/ddgo-converter/gamepads/physical.py b/ddgo-converter/gamepads/physical.py
index 7002f93..f68f81d 100755
--- a/ddgo-converter/gamepads/physical.py
+++ b/ddgo-converter/gamepads/physical.py
@@ -10,6 +10,8 @@ def create_gamepad(vid, pid, name):
             return SwitchGamepad(vid, pid, name)
         case 0x054c, 0x0268:
             return ClassicGamepad(vid, pid, name)
+        case 0x0ae4, 0x0003:
+            return PCGamepad(vid, pid, name)
     return PhysicalGamepad(vid, pid, name)
 
 class PhysicalGamepad:
@@ -18,6 +20,7 @@ class PhysicalGamepad:
         UNKNOWN = 0
         CLASSIC = 1
         SWITCH = 2
+        PC = 3
 
     def __init__(self, vid, pid, name):
         super().__init__()
@@ -278,3 +281,83 @@ class ClassicGamepad(PhysicalGamepad):
                 return input_events
         except OSError:
             return [InputEvent(InputEvent.EventType.ERROR, None)]
+
+class PCGamepad(PhysicalGamepad):
+
+    def __init__(self, * args):
+        super().__init__(* args)
+        self.type = self.GamepadType.PC
+        self.config = []
+        self.device = self._get_device()
+
+    def start(self):
+        try:
+            self.device.grab()
+        except:
+            return
+
+    def stop(self):
+        try:
+            self.device.ungrab()
+        except:
+            return
+
+    def read_input(self):
+        select([self.device], [], [], 5)
+        try:
+            event = self.device.read_one()
+            input_events = []
+            if event is not None:
+                if event.type == evdev.ecodes.EV_KEY:
+                    match event.code:
+                        case 289:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_A))
+                        case 288:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_B))
+                        case 290:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_C))
+                        case 291:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_D))
+                        case 292:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_SELECT))
+                        case 293:
+                            input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_START))
+                if event.type == evdev.ecodes.EV_ABS and event.code == evdev.ecodes.ABS_X:
+                    match event.value:
+                        case 0xB9: # EMG
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 9))
+                        case 0xB5:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 8))
+                        case 0xB2:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 7))
+                        case 0xAF:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 6))
+                        case 0xA8:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 5))
+                        case 0xA2:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 4))
+                        case 0x9A:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 3))
+                        case 0x94:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 2))
+                        case 0x8A:
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 1))
+                        case 0x79: # N
+                            input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 0))
+                if event.type == evdev.ecodes.EV_ABS and event.code == evdev.ecodes.ABS_Y:
+                    match event.value:
+                        case 0x81: # N
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 0))
+                        case 0x6D:
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 1))
+                        case 0x54:
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 2))
+                        case 0x3F:
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 3))
+                        case 0x21:
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 4))
+                        case 0x00: # P5
+                            input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 5))
+                return input_events
+        except OSError:
+            return [InputEvent(InputEvent.EventType.ERROR, None)]
\ No newline at end of file