Historia del Open PS2 Loader

Hace unos días me dio por acordarme del open ps2 loader y la de años que han pasado desde aquello y se me ocurrió la idea de hacer un artículo en la web contando un poco la historia de sus inicios y hasta donde ha llegado a día de hoy.

Antecedentes

Antes de que la idea de Open PS2 Loader existiera, ya había gente en el foro de psx-scene trabajando en sacarle partido al HDD de la PS2. El 1 de marzo de 2005 el usuario Krevnik anunció un proyecto open source para sustituir al producto comercial HDLoader. Cuidando especialmente el no utilizar ningún componente del propio HDLoader. Puso a disposición, además, un servidor CVS con el código fuente.

HDLoader era una aplicación comercial que permitía, en las PS2 que admitieran disco duro interno con el adaptador de red, instalar los juegos desde el lector de DVD al disco interno y jugar desde el mismo. Así mismo aparecieron versiones parcheadas del software que podían ser ejecutadas en PS2 modificadas.

Interfaz original de USB Advance
Interfaz de USB Advance

Más tarde apareció un software similar a HDLoader pero para discos externos, este se llamaba USB Extreme (versión comercial) o USB Advance (versión crackeada). El funcionamiento es similar, pero instalando los juegos en un disco externo por USB. Debido a que la PS2 tiene un USB 1.1 que tiene una velocidad de lectura menor que el lector de DVD, algunos juegos presentaban problemas de carga y pausas en las cinemáticas.

Ver el hilo original del proyecto en psx-scene.com

En 2006 Krevnik se retira y el desarrollo sigue por parte de romz que trabajó en la parte de la emulación de CDVD y el soporte de DVD9. También aparece Polo35 trabajando en el reemplazo de MCMAN para la implementación de memory cards virtuales almacenadas en el disco duro.

La última versión de este proyecto fue HD Project v1.081. La parte de cargar juegos desde el disco duro nunca llegó a funcionar bien del todo, pero el emulador de memory card sí que funcionaba.

Inicio – Búsqueda de compatibilidad de USB Advance en PS3

Todo empezó el 2 de noviembre de 2008, cuando un usuario de elotrolado.net me sugirió que le echara un vistazo al USB Advance a ver si podía hacer que funcionara en la PS3. Como se puede ver en la publicación que hice en su día:

Todo empezo el 02 de noviembre del 2008 cuando un usuario de elotrolado.net me sugirio que le echara un vistazo al USB ADVANCE a ver si podia hacer que funcionara en la PS3. Al principio no le hice mucho caso al tema pero al final me propuse el reto de conseguirlo y no pare de investigar hasta que lo conseguí :D

Para el 21 de enero de 2009 ya tenía una solución funcionando que llamé “USB Loader”, podemos ver la noticia de portada de elotrolado.net, “Carga de juegos de PS2 desde USB en PS3 japonesas”.

Portada de elotrolado.net con la noticia del 21 de enero de 2009
Portada de elotrolado.net, 21 de enero de 2009

Funcionaba solo en PS3 JAP retrocompatibles por hardware (20GB/60GB), con un vídeo tutorial que aportó fidillo. Ocho días después, el 29 de enero, otra noticia extendía el soporte a PS3 PAL retrocompatibles, “Carga de juegos de PS2 desde USB en PS3 PAL retrocompatibles”.

A partir de ese hallazgo, comencé a realizar modificaciones sobre la aplicación con el objetivo de ampliar compatibilidad y publiqué una especie de software que aplicaba modificaciones sobre el ejecutable de USB Advance, así como su código fuente en Google Code y el hilo del anuncio en psx-scene.com.

USB Loader 0.3 RC1, versión ya parcheada
USB Loader 0.3 RC1

Nacimiento del proyecto open source

Para septiembre de 2009 ya había dejado de lado el parchear la aplicación de USB Advance y en su lugar construí una interfaz estilo XMB aunque seguía utilizando los drivers del USB Advance. Paralelamente había una versión alternativa que utilizaba los módulos de jimmikaelkael.

Open USB Loader Project - Beta 0.41 available

This project is an adaptation of the HD Project source code for loading games in USB Advance format.

Now there are two projects:

OpenUsbLd_USBA: using two IRX of the original USB Advance…

  • MSD.IRX - Mass driver/ISO image reading
  • CDVDMAN.IRX - Cdvdman/cdvdfsv replacement

And OpenUsbLd: using CDVDMAN/CDVDFSV replacement + ISOFS by jimmikaelkael

This CDVDMAN is incomplete and needs some work.

Any collaboration and feedback are appreciated.

Ver el hilo fundacional en psx-scene.com

En el hilo la gente empezó a probar compatibilidad de juegos y aparecieron personas como SP193 y Polo35 haciendo aportes técnicos. Además, Polo35 adjuntó el código fuente de una versión inédita de HD Project 2.0.

Consolidación y cambio de nombre a Open PS2 Loader

Logo original de Open PS2 Loader, época psx-scene.com

En octubre ya era un proyecto hecho y derecho, con repositorio público en Bitbucket. Para su versión 0.5 se le agregó soporte para la carga de juegos por red usando el protocolo SMB. Se acabó llamando Open PS2 Loader porque su funcionalidad iba más allá de la carga por USB. Su arquitectura estaba diseñada separando la interfaz de la funcionalidad para que así cualquiera pudiese crear su propio frontend.

Inicialmente la carga de juegos por SMB no funcionaba en la PS3 así que diseñamos una aplicación debug con la que los usuarios podrían ejecutar pruebas y enviarnos logs para analizarlos. De esta forma, en enero de 2010 conseguimos localizar la incompatibilidad y extender la funcionalidad también a las PS3.

El proyecto siguió creciendo y se fue ampliando con nuevas funcionalidades: Polo35 agregó la funcionalidad de IGR (In-Game Reset, reinicio rápido mediante una combinación de botones), y más tarde el soporte de memory cards virtuales en el que también trabajaba. También se integró GSM (que permite forzar modos de vídeo en los juegos), un proyecto aparte creado por dlanor y doctorxyz.

Para entonces yo llevaba tiempo fuera del proyecto, lo mío es más el cacharreo y la prueba y error y el proyecto estaba siendo llevado por personas con bastante más nivel que yo en mi opinión así que dejé que la vida siguiese su curso.

Empezó como un parche de USB Advance para que funcionara en la PS3

Después de que estudiase su funcionamiento pasó a ser una interfaz gráfica que aun utilizaba los drivers del USB Advance.

Finalmente, gracias al trabajo de la scene acabó siendo un launcher de juegos de PS2 open source que permite cargarlos desde un disco USB, el HDD interno e incluso por LAN.

El 8 de junio de 2011 el fundador de psx-scene vendió el sitio web y los nuevos dueños dejaron el foro a su suerte, y la gente se trasladó al nuevo psx-place.com (fundado en 2014 por un antiguo moderador de psx-scene.com) donde sigue habiendo aportaciones al proyecto.

En este punto yo ya estaba totalmente desconectado del proyecto, pero recibí un email de doctorxyz pidiéndome migrar el proyecto de Bitbucket a GitHub. Ese mismo día hice la migración del repositorio y le agregué a él y a EL_Patas como colaboradores.

I asked ifcaro for doing this, and he kindly accepted and imported the repo from Bitbucket to Github.
The point is, Github has more features than Bitbucket, more people use it, it gives more visibility to OPL. Therefore, more chances to get newer contributors to the project, longer life to OPL and PS2 Scene.
[…] Hey, even PS2SDK is on Github!

Yo la verdad no entiendo cómo, siendo un proyecto open source donde cualquiera puede hacerse un fork, siguieron trabajando sobre mi repositorio, pero bueno así fue hasta que el 22 de mayo de 2020 me escribió un email julian uy pidiéndome mover el repositorio a la organización ps2homebrew que es donde se encuentra ahora y donde debería estar.

Después de más de cinco años sin una versión oficial, el 6 de enero de 2021 se publicó la versión 1.0.0 con caché de lista de juegos, soporte de mandos DualShock 3/4 vía PADEMU, idiomas por USB/HDD/SMB, y numerosos fixes de compatibilidad. El 9 de septiembre de ese mismo año llegó v1.1.0: añadió un servidor NBD en sustitución del antiguo HDL server y amplió aún más los métodos para cargar juegos dando soporte experimental para FireWire/i.LINK y MX4SIO.

Estado actual

Logo actual de Open PS2 Loader, diseño de Berion

La versión v1.1.0 (2021) sigue siendo la última “estable” con nombre oficial; v1.2.0 lleva en beta continua desde 2023-2024, generando builds numeradas automáticamente en cada merge.

Repositorio oficial en GitHub

En 2024, KrahJohlito (“Krah”) desarrolló uOPL — un fork basado en una beta de v1.2.0, “backporteado” a una versión más estable de PS2SDK, buscando más estabilidad que la rama oficial. Se publicó el 2 de enero de 2025 en psx-place.com, con soporte multi-USB, HDD interno vía ATA (acceso a sector crudo, sin pasar por el esquema de partición propietario de Sony), UDPBD, menú de favoritos, Coverflow, y la posibilidad de cargar el núcleo Neutrino por juego. Krah se tomó un descanso del desarrollo poco después, y el recurso pasó de etiquetarse “[POC]” a “[Abandoned]” y luego “[Archive]”.

Logo de uOPL

El 10 de febrero de 2025 nace ps2homebrew/wOPL (“Double Unofficial Open PS2 Loader”) como continuación de uOPL — esta vez alojado directamente bajo la organización oficial. Hoy wOPL es el fork más activo con 52 estrellas.

Logo de wOPL

Copyright 2013, Ifcaro & jimmikaelkael
Copyright 2024, KrahJohilto
Copyright 2025-2026 chasebochamp
Copyright 2025-Present, Wolf3s and Ripto

Hay más forks vivos en este momento: RiptOPL, otro fork independiente; E2OPL, que añade soporte de sistema de archivos EXT2 sobre la base de v0.9.3; OPL MMCE, centrado en emuladores de memory card como el SD2PSX; y X2P, que empezó como broma de April Fools’ que pretendía ser un emulador de Xbox clásica — y resultó ser una versión modificada del OPL. Otro fork, llamado OPL Grimdoomer, añadió soporte de exFAT y GPT para el disco duro interno y sus mejoras acabaron fusionándose al proyecto oficial en v1.2.0.

Parece mentira que hayan pasado casi 18 años desde que empecé a cacharrear con el USB Advance para que funcionara en la PS3. Es increíble lo lejos que ha llegado un proyecto que empezó como un simple parche de compatibilidad.

Parche para la versión de PlayStation 1 de Rayman para agregar caracteres

Todo comenzó cuando buscando parches de traducciones para juegos de PS1 descubrí que existía una traducción al español del Rayman 1. Me la descargué y cuando fui a probarla vi que faltaban los caracteres acentuados y la ñ. A mí personalmente no me molesta que las palabras no estén acentuadas pero que no esté la ñ sí que me chirria. Observé también en la web de la traducción que solicitaban ayuda para eliminar el selector de idioma y como hacía mucho tiempo que no trabajaba en ningún proyecto me propuse echarle un vistazo.

Traducción original

Me descargo el plugin https://github.com/lab313ru/ghidra_psx_ldr para el ghidra y con la ayuda de emuladores descubro fácil que función es la que muestra el selector de idioma. Al resultarme tan sencillo me quedé con ganas de más y me puse a investigar como poder meter, aunque sea la letra ñ. También me puse en contacto con SuiKaze Raider para comentarle que había realizado el parche de selección de idioma y para pedir algo de información sobre el formato de los ficheros de recursos del juego.

SuiKaze Raider me comenta que existen 3 tamaños de letra, la pequeña que es la más utilizada, la mediana y la grande que es la que menos se utiliza. Y me comenta su idea de eliminar la fuente grande y utilizar ese hueco para crear los caracteres extra. De primeras intento buscar una solución más sencilla y reemplazar solo algunos caracteres de los que ya existen, pero no hay suficientes para la ñ y las vocales acentuadas.

Fuentes mediana y grande
Fuente pequeña

Después de un análisis más profundo conseguí extraer las texturas y con una información clave que me pasó SuiKaze Raider, extraje la información de los sprites correspondientes a los distintos caracteres. Lo que si pude comprobar es que en la textura de la fuente pequeña había mucho espacio entre las letras y que se podían juntar sin que esto afecte al resultado dejando espacio para meter los nuevos caracteres. Aun con esto, todavía falta parchear el programa para poder relacionar de alguna forma los textos con los sprites nuevos.

Visor de texturas

Debido a que la asociación de caracteres con sus correspondientes sprites está metida a pelo en el código, realizar un parche no es tan sencillo como el de eliminar el selector de idioma. Empiezo a meter recortes en el código para mostrar nuevos sprites y lo consigo, aunque de una forma un poco inestable.

Una vez conseguido, me dispongo a desarrollar una aplicación para poder gestionar las texturas, los sprites y sus propiedades de forma más directa y así no perder tiempo editando manualmente los ficheros binarios. El resultado de este trabajo lo puedes encontrar en https://github.com/ifcaro/RAY.

Editor de sprites

Con la ayuda de esta aplicación pude continuar en el parcheo del ejecutable para el tema de la asociación de caracteres con sprites. Después de pensar formas de realizar este parche llego a la conclusión de que va a ser necesario eliminar la fuente grande. Y empiezo a trabajar en la siguiente solución.

Como las fuentes están en la tabla de sprites en el siguiente orden: pequeña, grande, mediana. Decido eliminar la grande y mover un poco hacia arriba la mediana dejando un poco de espacio después de la pequeña y de la mediana para añadir ahí los caracteres nuevos. También modifico en el código una de las condiciones para agregar una asociación secuencial de bytes con sprites en los huecos que he dejado.

Editor de textos

Aunque creo que con este parche se pierde uno de los sprites originales, a cambio nos permite añadir hasta un máximo teórico de 23 sprites nuevos. Con esto se confirma la posibilidad de hacer una traducción con acentos y sobre todo con ñ aunque a cambio perdemos la fuente grande.

DESCRIPCION DEL PARCHE

En resumen, los parches aplicados al final son los siguientes:

EXE

0x0000ec04 0x0000ec08 0x0000ec54 0x0000ec580x80131404 0x80131408 0x80131454 0x801314581c 80 04 3c 94 66 84 34 1c 80 04 3c 94 66 84 34Parche para mover el literal OK
0x0001f4480x80141c4830 15 21 24Ancho letra pequeña
0x0001f4680x80141c68d4 15 21 24Ancho letra mediana
0x000206500x80142e5001 00 07 34Forzar la fuente media si se quiere pintar la grande
0x00021e9c 0x00021ea0 0x00021eb80x8014469c 0x801446a0 0x801446b81c 80 04 3c 54 66 84 34 00 00 00 00Mover el literal de GO!
0x0002c2980x8014ea98b1 ff 85 24Agregar caracteres
0x0002c3540x8014eb5419 00 42 24Mover fuente media
0x0003b93c 0x0003b9400x8015e13c 0x8015e1401c 80 04 3c 74 66 84 34Mover literal PERFECT
0x0005a8880x8017D08800 00 00 00Eliminar el selector de idioma
0x0009ed300x801c1530….Nueva ubicación para los anchos de las fuentes
0xa3e540x801c6654 Nueva ubicación para el literal GO
0xa3e740x801c6674 Nueva ubicación para el literal PERFECT
0xa3e940x801c6694 Nueva ubicación para el literal OK

Parches aplicados en el ejecutable del juego

RAY.XXX

En la tabla de sprites, se eliminan los que corresponden a la fuente grande y se mueven los de la fuente mediana hacia arriba dejando hueco después de cada fuente para los caracteres que se necesitan añadir.

Actualmente, el equipo de Tomb Raider Translations Spain esta trabajando en la creación de una fuente multiidioma para, haciendo uso de este parche, realizar una traducción en varios idiomas de Rayman 1.

Liberado el código fuente de Ps2ImageViewer

A causa de una cosa en la que he estado trabajando últimamente he tenido que recurrir al código del Ps2ImageViewer. Como el código estaba en vb.net y bastante desordenado, lo que he hecho es portar el código a una aplicación nueva escrita en C#. La funcionalidad debería ser la misma, aunque he eliminado la asociación de las extensiones de archivo.

Puedes verlo en https://github.com/ifcaro/Ps2ImageViewer

Ifcaro's Tetris versión Web

Tetris versión webComo hace mucho tiempo que no actualizo la página y parece que no estoy haciendo nada (la verdad es que no estoy haciendo gran cosa en tema de proyectos personales) he pensado voy a coger el código fuente del tetris que hice en 2008 y lo voy a compilar con emscripten para hacer una versión web.

Primer problema, parece que no tengo guardado el código fuente original en ningún sitio así que me pongo a buscar como loco restos del desarrollo. Pensaba que estaba construido como el código del iRPGM que se podía compilar tanto para pc como para ps3 y que estaría guardado en la misma carpeta pero ni rastro.

Cuando ya iba a abandonar el proyecto encuentro en una carpeta con desarrollos de ps3 un código fuente del tetris de ps2 que había sido ligeramente modificado en un intento de hacerlo compilar para la ps3. Solamente tenía el código de la lógica del juego. Si quería hacer un port tendría que reescribir toda la parte de graficos, sonido e input.

Después de pensar un poco si me merecía la pena todo ese trabajo decido ponerme a ello. Me descargo la última versión de SDL y me dispongo a crear un proyecto de Visual Studio con un código base para una aplicación SDL para Windows. Cuando ya funciona el código de ejemplo comienzo a portar el código que recuperé del tetris original y a reescribir las partes que faltan utilizando SDL.

Una vez tengo una versión básica del dibujado y el input necesito recopilar los recursos (imágenes y sonidos) y al igual que perdí el código fuente original tampoco tengo los assets. Decido ‘hackear’ la versión de PC para extraer la imagen de fondo y descubro que esta no fue hecha en C sino en BlitzBasic (en aquella época yo aún no sabía C jaja). Después de intentar varios métodos al final consigo extraer el png original de la imagen de fondo. Los sonidos los extraigo de la versión de PS2 y la fuente la rehago utilizando un generador de fuentes para BMFont. Con esto ya tengo todo lo que necesito para completar la versión de tetris en SDL.

Mientras pruebo el funcionamiento observo que la jugabilidad no es que sea muy buena de modo que decido intentar mejorarla un poco antes de pasar a construir la versión web con emscripten.

Finalmente comienzo con el proyecto inicial que era compilar una versión wasm del tetris mediante el compilador emscripten. Es cierto que la primera vez que compile el proyecto no tenía aun soporte para sonido, eso lo deje para lo último. Indicando al compilador em++ que tiene que utilizar SDL me compila una versión que funciona regular. Esto se debe a que el juego tiene algunos bucles a la hora de esperar respuesta del usuario y eso es incompatible con la forma de funcionar de emscripten así que hago algunos arreglillos para eliminar estos bucles y reemplazarlos por una funcionalidad similar.

A la hora de meter los efectos de sonido me decido por la librería SDL_mixer que se supone que te facilita la vida para estas tareas. En la versión PC todo fue bien, pero a la hora de compilar con emscripten no hay manera de que compile en Windows así que me toca abrirme una máquina virtual con Linux para compilar el SDL_mixer. Además, para no subir un mp3 a la web decido utilizar un formato tipo ‘tracker’ que en PC no me supone ningún problema, pero no para la versión web como descubrí después.

Perdí bastante tiempo intentando compilar una versión de SDL_mixer con soporte para trackers y cuando al final lo consigo resulta que los sonidos se oyen bien pero la música en formato tracker se oye fatal (por eso supongo que venía deshabilitado por defecto) así que decido buscar por internet alguna librería en javascript para reproducir este formato de música. Utilizando una clase wrapper en javascript para comunicar el programa en C con la librería externa consigo al fin reproducir música con éxito.

Con esto doy por finalizada la versión web del tetris aunque aún se podrían mejorar muchas cosas.

Qubix para PlayStation

Portada de QubixSiempre he querido programar un juego de PSX. Hace años hice un sencillo tetris para la PS2 y tiempo después comencé a portar un motor para juegos rpg que estaba haciendo a la PS3 aunque se quedó sin terminar.

Pero para la PlayStation 1 no había hecho nada, así que me propuse portar algún juego sencillo. Los candidatos eran Qubix y otro juego que tengo terminado pero no he publicado por vaguería.

El elegido fue Qubix porque es bastante sencillo y a la vez hace uso del 3d, el otro juego es un puzzle en 2d con muchos niveles mientras que en este juego solo hay que conseguir mejores puntuaciones.

Una vez decidido, comencé a preparar el entorno de desarrollo. Descargué el SDK de PSXDEV.net. Instalé una máquina virtual con Windows 2000 aunque no era necesario pero no quería tener problemas de compatibilidad ni tener que modificar el SO principal. Aun así, trabajaba con el Eclipse en el SO principal, accediendo al código fuente mediante carpetas compartidas. La máquina virtual solo se utilizaba para compilar y para utilizar Photoshop 3 para crear las imágenes TIM.

Como no tengo ninguna forma de ejecutar software en la PSX sin grabarlo en un CD (mi PSX no tiene puerto paralelo), he utilizado un emulador durante el desarrollo para acabar testeándolo en mi PSX, PSP y PS3. Junto con el emulador hay un pequeño programa que se queda escuchando por un puerto la orden de lanzarlo. De este modo, puedo compilar y lanzar el programa de forma automatizada de la forma más parecida posible a utilizar PS2LINK en la PS2 por el cable de red.

Esquema del entorno de desarrollo

El juego consiste en girar un cubo que tiene cada cara de un color y una lista de colores que van apareciendo por cada movimiento incorrecto. Si el color que está mirando a cámara es el mismo que el primero de la lista este se elimina. El objetivo es realizar el mayor número de movimientos sin que se llene la cola.

Video de YouTube

He creado 3 paquetes diferentes.

QUBIX.ISO - Imagen ISO para grabar en CD o ejecutar en un emulador de PSX. Qubix.zip - Formato EBOOT.PBP para ejecutar en una PSP Qubix.pkg - Formato PKG para ejecutar en una PS3