lunes, 16 de septiembre de 2019

Adaptadores V-USB en juegos modernos, ¡Invoco a Xoutput y a ViGEM en modo de ataque!

Hola, ¿Cómo les va? Espero que estén muy bien y bienvenidos sean de nuevo a este espacio de sano debraye y espectacular entretenimiento. Ha pasado ya mucho tiempo desde la ultima actualización y si bien los proyectos nunca se detienen, no ha surgido mucho material para compartir en este espacio.

En el ambito personal las cosas van caminando, lo cual ya es mucha ganancia. Cuando tenemos un poco de rato libre lo dedicamos a jugar un poco con la computadora y a aprovechar la conveniencia de las consolas portátiles. Recientemente desempolvé mi leal Nintendo DSi XL, ya que fue descubierto un exploit en la aplicación de la cámara fotográfica que posibilita a todas las consolas DSi que tengan instalada la ultima versión de firmware poder instalar la aplicación Unlaunch (que nos permite tener un bootloader personalizado) y el HiyaCFW (que nos permite sacarle mucho provecho a la consola).

Para la instalación del CFW, la mejor referencia que hay en internet es este sitio, que nos indica paso por paso el proceso partiendo desde una DSi en estado "stock" (sin modificaciones). Entre las ventajas que nos brinda tener el CFW instalado en la consola es que se arranca desde una emuNAND, por lo que se reduce drasticamente el riesgo de "brickear" o inutilizar la consola por estar experimentando con aplicaciones. Además nos permite arrancar juegos y aplicaciones desde la tarjeta SD, por lo que ya no se depende del uso una Flashcard (muchas de las cuales tienen un infame "Timebomb"). Para mayor estabilidad en el uso del CFW se recomienda usar una memoria SD de 2GB, o en su defecto si contamos con una más grande (nos referimos a memoria SD amable lector), crear una partición en ella de 2GB. Suena tentador colocar una memoria gigante (32 GB en adelante) para llenarla con aplicaciones y con copias de seguridad perfectamente legales de los juegos que hemos comprado, sin embargo he notado que el lanzador de aplicaciones que soporta memorias de tamaño superior a 2GB suele ser muy lento, además de que suele dar errores aleatorios con algunos temas, a veces se traba al invocar el NDS Bootstrap (el lanzador de aplicaciones NDS) y suele dar muchos problemas con las aplicaciones DSi. Otra ventaja del CFW es que permite arrancar algunos juegos de GBA haciendo uso del lanzador incluido en el firmware de la consola lo cual es una gran adición, considerando que la DSi ya no cuenta con Slot 2 y no puede cargar cartuchos de GBA.

Para jugar con la computadora suelo emplear un control de Xbox 360, debido a que es ergonómico para una gran variedad de juegos y el protocolo xinput definitivamente se ha consolidado como el estandar de facto en los juegos, al punto que ya la gran mayoría de los juegos ponen las indicaciones de los botones con los colores y las formas que se encuentran en los controles de Xbox 360 y de Xbone (siempre le llamaré a esa consola Xbone, no Xbox One y aludiendo al que fue su infame slogan no oficial antes de su lanzamiento, "Deal with it" X_x).

Durante mucho tiempo una de mis grandes pasiones fueron los controles de consolas y la posibilidad de poder adaptarlos a los dispositivos donde me resultaban de más utilidad. En este blog (este espacio antes de cambiarnos de dirección) compartí algunos adaptadores para conectar diferentes controles a consolas y a USB, utilizando el modo HID (Human Interface Device) implementado por la biblioteca V-USB para los microcontroladores AVR.

Comenté en estas líneas hace muchos ayeres que mi primer acercamiento a conectar controles de consolas en la computadora ocurrió por allá del año 2000, gracias a los drivers DirectPad Pro que conocí en algunas homepages de emulación. Esos drivers quedaron obsoletos en Windows NT/2000/XP, en donde la alternativa fueron los drivers PSXPad. Posteriormente estos adaptadores cayeron en desuso debido a la desaparición del puerto paralelo LPT1 de la gran mayoría de las computadoras a partir de la segunda mitad de la década de 2000. Recientemente han resurgido las interfaces "legacy" y ya no es complicado encontrar tarjetas madre con uno (incluso dos) puertos paralelos, PCI estándar e incluso varios puertos seriales (una computadora que armé y presumí en este blog contaba con la nada despreciable cantidad de cuatro puertos seriales). A pesar del resurgimiento físico de los puertos seriales y paralelos, son pocas las aplicaciones modernas que cuentan con los drivers necesarios para sacarles provecho, los sistemas operativos Windows de 64 bits no brindan drivers nativos para el manejo de puertos seriales o paralelos y como ya se requiere que los drivers cuenten con una firma digital, suena complicado que los drivers tipo PSXPad funcionen en computadoras modernas.

Una alternativa surgió cuando fue accesible crear dispositivos USB con la ayuda de microcontroladores como los PIC o los AVR. Gracias a ello comenzó a ser posible la creación de diversos dispositivos compatibles con los sistemas Windows NT/2000/XP/Vista/7/8/9(ahh, este no, perdón)/10. En microcontroladores con hardware y stack USB es posible implementar dispositivos xinput y se puede recurrir a muchos de los recursos de la comunidad como son las bibliotecas LUFA para AVR e implementaciones puntuales como las del fightstick realizado con un Teensy o la implementación de Nesvera con un STM32. Estos proyectos están destinados a crear un dispositivo que la PC detecta como un control de Xbox 360 y se comunica con el protocolo xinput para tratar de tener una mejor compatibilidad con juegos y sistemas operativos modernos. La desventaja de estos dispositivos es que no se pueden utilizar en las consolas Xbox 360 o Xbone, ya que no cuentan con la circuitería de seguridad necesaria para comunicarse con esas consolas. A pesar de que son proyectos admirables, su aplicación está delimitada de forma exclusiva a la PC.

Actualmente ya no cuento con consolas de videojuegos (salvo PS3), por lo que mi enfoque ya es la PC y los dispositivos USB. La idea de poder utilizar controles de SEGA Genesis o Sega Saturn en algunos juegos modernos de PC es muy tentadora, por lo que estuve barajeando las distintas posibilidades que se me presentaban. Por una parte, ya es casi imperativo que la comunicación sea con el protocolo xinput, lo cual deriva en dos alternativas, software y hardware.

Las opciones por hardware ya las hemos repasado. Por cuestiones de costo, alcance y versatilidad la opción ganadora sería utilizar una tarjeta de desarrollo STM32 "Blue Pill" y un programador STM, entre ambos dispositivos el costo no rebasa los $7 USD. Incluso llegué a comprar esos ingredientes para ponerme manos a la obra, sin embargo el hecho de no encontrar mucha documentación para iniciar desde cero y "directamente en los fierros" del STM32 provocaron que el entusiasmo se esfumara. Otra alternativa más familiar era utilizar un Arduino Pro Micro con LUFA, pero el Arduino suele ser mucho más caro y limitado que el STM32.

Por software la opción preferida por muchas personas es el TocaEdit Xbox 360 Controller Emulator. Se trata de una aplicación en la cual se configura el mapeo que deseamos que un control DirectInput, MMsystem o RawInput tenga con respecto a un control de Xbox 360. El programa que genera una DLL y un archivo de configuración, los cuales se deben de copiar a la raiz de la aplicación en la cual deseamos que nuestro control simule un mando de Xbox 360. La ventaja de esta alternativa es que nos permite un ser muy especificos con las aplicaciones en las que se utilizará este emulador. La desventaja es que para cada aplicación o juego en el que deseamos que funcione, deberemos copiar los archivos necesarios y si nos vemos en la necesidad de cambiar de mando hay que reconfigurar y copiar de nuevo a cada aplicación los cambios.

Otras personas prefieren (y no me explico el porqué) utilizar controles de PS3 o PS4 y con ayuda del SCPServer logran que estos controles simulen en la PC un control de Xbox 360. Una opción menos conocida la representaba el programa Xoutput, que también utilizaba el SCPServer pero nos permitía mapear cualquier tipo de control (no solo del tipo DualShock), creaba un control virtual de Xbox 360 que funcionaba en todo el sistema. Este programa funcionaba muy bien pero tenía la desventaja de que no funcionaba el modo exclusivo, es decir, si una aplicación o juego soportaba tanto controles xinput como DirectInput, cada comando se detecta por duplicado (una vez por la interfaz xinput y otra por DirectInput) lo cual provocaba muchos conflictos.

Después descubrí un proyecto llamado ViGEM el cual no es un adaptador o mapeador como tal, sino un backend y una serie de drivers para emular dispositivos de juego en la PC. No cuenta con un instalador a la usanza (o sea, un cómodo Setup.exe) ni con una interfaz gráfica para su uso. En realidad es una herramienta especializada para desarrolladores y no está pensada para usuarios finales. Durante mucho tiempo visité de forma diaria la página del proyecto, esperando el día que en se lanzara un instalador y una interfaz de usuario amigable para usar el proyecto. El tiempo pasó y eventualmente surgió una prueba de concepto en la cual se vinculaba el uso de x360ce con ViGEM, en el cual se mapeaba un control USB y la computadora era capaz de verlo como un control de Xbox 360 en todas las aplicaciones. Fue una prueba de concepto muy prometedora, sin embargo nunca fue lanzado como algo de consumo para el usuario final.

Pasó el tiempo e inclusive llegué a olvidar ese proyecto. Sin embargo esta semana probé un juego llamado River City Girls (secuela del juego River City Ransom de NES). Se trata de un juego con mecánicas que aluden mucho a las de juegos de consolas de 8 y 16 bits, por lo que tuve el deseo de jugarlo con un control de SEGA Genesis. Estaba a punto de utilizarlo de forma directa con un adaptador que armé con un Attiny461, ya que el juego soporta controles DirectInput. Sin embargo decidí buscar una descarga del programa Xoutput para mapear el control y me encontré con un fork que utiliza ViGEM como backend en vez del SCPServer.

Despues de instalar los prerrequisitos, los drivers, ViGEM, Xoutput, configurar el HID Guardian y finalmente mapear el control funcionó a la perfección. El control de SEGA Genesis, conectado a la computadora a través de un simple y económico adaptador creado con V-USB y un Attiny461 es detectado por Windows como un control de Xbox 360, lo que abre muchas posibilidades para poder disfrutarlo con una amplia gama de juegos y emuladores, además de que nos ahorra el paso de mapear en la gran mayoría de aplicaciones.

El proceso de instalación detallado en la página de Github del fork de Xoutput es correcto y funciona a la perfección. Quizás es un poco engorroso, sobretodo la parte de instalar el HID Guardian, pues se requiere de la instalación manual del driver por medio de devcon y Powershell, pero el resultado sin lugar a dudas vale mucho la pena, sobretodo porque la faena de instalar y configurar Xoutput se debe de realizar sólo una vez y nos permite utilizar no sólo los controles y los adaptadores hechos con V-USB, sino cualquier tipo o clase de control original o genérico, inclusive el teclado de la PC.

He probado también con un control genérico con forma de mando de SEGA Saturn que mi amigo Dash "Shingo" Bandith me regaló algunos muchos meses y ha funcionado de maravilla. Esto además fue muy ventajoso, pues dicho control además de tener un mapeado muy extraño, no contaba físicamente con el botón 6 (mapeado a RB en el control de Xbox 360) lo que limitaba mucho su uso en los juegos o emuladores.

Pues bien, espero que esta sesión de debraye en la que simplemente les comparto este tip les haya agradado. En esta ocasión no comparto ligas directas a archivos, ya que se trata de proyectos que aun están en constante cambio y desarrollo, por lo que una revisión puede volver obsoletos los archivos y el proceso de instalación. Además espero que en el futuro cercano el proceso de instalación sea optimizado para ser más amigable con el usuario "de a pie", pues se trata de un proyecto de mucha utilidad. Literalmente, es un proyecto que le ha enseñado a nuestros viejos adaptadores hechos con V-USB, Atmegas y Attinys a hablar un nuevo idioma y los ha sacado de la obsolescencia para colocarlos de nuevo como opciones para el presente y el futuro.

Ha sido un placer saludarles, estamos en contact.

¡Feliz 2021! El retorno del debraye pandémico (Edición "Rompemuros").

Hola, ¿Cómo han estado? Espero que estén con bien, con buena salud y con muchas ganas de aburrirse una vez más con una ronda de debrayes. Es...