Hallo Freunde der gepflegten Masturbation, es wird Zeit eure alten Stängel herauszuholen um mal wieder damit zu spielen! Und ich meine natürlich auch die Damen unter uns, denn heute geht es selbstverständlich um unsere Joysticks!
Ich habe mir irgendwann vor längerer Zeit einen Gravis Analog Pro Joystick gekauft, weil ich damit ein Paar alte Spiele auf meinen Retro-Kisten zocken wollte. Natürlich ging es gut mit ganz alten Spielen, aber irgendwann habe ich mir bei GOG Wing Commander Prophecy geholt. Ich war ein großer Fan der Reihe damals und wollte es wieder Mal spielen, doch wie so viele hier kennen gilt meine Retro Sucht überwiegend den 486er und älteren Maschinen. Das heißt ich musste mir für Prophecy etwas überlegen. Kein Ding, das Spiel läuft mit OpenGL auf modernen Rechnern einfach super und sieht genau so, wie damals mit 3Dfx aus. Nur da gab es ein Problem, ich hatte keinen USB Joystick, nur so ein USB Gamepad, aber das ist einfach nicht das Richtige für so ein Spiel. Nun da kam ich auf die Idee einen Adapter basierend auf einem Arduino für den bereits erwähnten Gravis Analog Pro zu basteln. Die Erfahrung mit dem PS/2 Adapter hatte ich ja schon. Gesagt - getan und als der erste Prototyp einigermaßen lief, habe ich es creopard erzählt. Er war von der Idee begeistert und hat mir vorgeschlagen das ganze auszubauen und es der Öffentlichkeit zur Verfügung zu stellen. Ich fand das Thema sowieso spannend, hatte aber keine weiteren Joysticks, als den einfachen Analog Pro. Daraufhin hat mir creopard eine ganze Sammlung von Joysticks gespendet unter anderem ein GamePad und ein 3D Pro der glorreichen Microsoft Sidewinder Reihe. Spätestens dann war ich über beide Ohren drin.
Die Implementierung der generische Analog Joysticks mit 2-4 Buttons und 2-4 Achsen war kein Problem. Da kam mir der Sidewinder 3D Pro sehr gelegen, da der Joystick in Kompatibilitätsmodus einen CH FlightStick und einen ThrustMaster emulieren kann. So wurde die Unterstützung dieser Modelle auch schnell implementiert.
Als es dann dazu kam die digitalen Sidwinder Protokolle umzusetzen, kam es zu richtigen Herausforderungen. Es gibt im Netz mehrere Ansätze für die Sidewinder auf dem Arduino, aber die alle sind ziemlich so la la. Auf jeden Fall berichten alle von großen Schwierigkeiten mit Performance. Denn Sidewinder Joysticks schicken die Daten mit einem Clock-Puls von 5us. Viel zu schnell für Standard Arduino Funktionen zum lesen von Signalen. Nun ja, ich habe mich dann umgeschaut und letztendlich entsprach mir die Implementierung des Sidewinder Tribers im Linux Kernel am ehesten. Mit dem Code als Vorlage und entsprechendem Patent US5628686A gerüstet habe ich mich auf die Arbeit gestürzt. Um Performance Probleme zu lösen greifen sehr viele auf Assembler und schreckliche C-Macros zurück, was in einem nicht gerade pflegeleichtem Code ausartet. Sowas kann ich nicht verantworten Also wieder viel Dokumentation und Arduino Code gelesen und habe einige sehr kurze und einfach zu benutzende Klassen in purem C++ geschrieben als Ersatz für das übliche digitalRead(...) Gerümpel. Das Resultat läuft nun doppelt so schnell und reicht vollkommen um um die Daten vom Sidewinder zu verarbeiten. Der Rest war dann Fleißarbeit, es ging darum das besagte Patent zu verstehen und das Protokoll umzusetzen. Der Code sollte einfach zu verstehen sein und ist relativ gut dokumentiert, daher, falls jemand sich für Details interessiert, schaut es euch auf der Projektseite an. Auch, wenn ich vom Linux Code inspiriert wurde, ist meine Implementierung doch komplett neu.
Prinzipiell hat mein Adapter je einen Treiber für jede bisher unterstützte Art von Joysticks. Den richtigen Treiber kann man dann per Switch wählen, den Joystick in den Adapter stecken und den Adapter in den USB Port. Der Rechner sollte dann den Joystick automatisch erkennen und für alle Spiele, die neuen, die alten, DosBox, etc. verfügbar machen. Ich möchte mich nicht zu sehr wiederholen, daher schaut bitte auf der Projektseite, welche Features und Joysticks unterstützt werden.
Projekt Seite: