- Una versión portada exclusivamente a PlayStation (PSX), basada en el proyecto de decompilación de Super Mario 64 para Nintendo 64
- Incluye modificaciones importantes adaptadas al hardware de PS1, como soporte de vibración DualShock, conversión a matemáticas de punto fijo y optimización de renderizado
- Agrega funciones de mejora de rendimiento como preprocesador gráfico, compresión de texturas y optimización de memoria para animaciones
- Existen múltiples errores conocidos, como controles de cámara incompletos, problemas de colisión y crasheos, y la imposibilidad de compilar la música
- Un experimento de portabilidad entre plataformas para un juego clásico, con valor como caso de estudio en desarrollo para consolas legacy e investigación de ingeniería inversa
Resumen del proyecto
- Este código es un fork de la versión completamente decompilada de Super Mario 64 (J/U/E/SH), orientado solo a PSX y PC (para depuración)
- Ya no se da soporte a las compilaciones para Nintendo 64
- Por ahora, solo se puede compilar la ROM de la versión estadounidense (US)
- La compilación del juego no incluye los recursos originales; se requiere extraer los assets desde una ROM legítima
Funciones principales
- Se añadió un gráfico de compatibilidad con DualShock™, imitando el indicador original de “Rumble Pak Compatible”
- Soporta tanto señal analógica de vibración para el motor grande de DualShock como señal digital para el motor pequeño
- Implementación de soft float de baja precisión para PSX, minimizando la caída de rendimiento en operaciones de punto flotante
- Sustitución del código por matemáticas de punto fijo, usando vectores y matrices enteras de 16 bits, estándar en PSX
- Simplificación y reescritura del render graph walker
- Subdivisión de polígonos (hasta 2x) para mitigar problemas con polígonos grandes
- Conversión JIT de las RSP display lists a un formato personalizado para mejorar la velocidad de procesamiento
- Preprocesador de display lists para eliminar comandos innecesarios y optimizar meshes
- Compresión de animaciones de Mario (580,632 → 190,324 bytes) y colocación directa en VRAM
- Se añadieron un profiler personalizado y un codificador de texturas 4bpp
- Se reemplazó la sombra por una sombra hexagonal, considerando las limitaciones de transparencia de PSX
- (Planeado) rotación de cámara con el stick analógico derecho y reescritura del subsistema Goddard
Problemas conocidos
- Árboles flotantes, algunas animaciones no funcionan o causan crasheos
- No se puede compilar la música, faltan efectos de sonido o suenan mal
- Control de cámara incompleto, crasheos al entrar en ciertos niveles
- Fallo al cargar la secuencia final, Lakitu no aparece, las poles no funcionan
- Tiempos de carga largos por carga individual de texturas, distorsión de texturas por limitaciones de PSX
- El preprocesador gráfico necesita mejoras, errores de renderizado en algunas texturas, pantalla de título incompleta, el menú de pausa no funciona
Cómo compilar
Linux
- Instala el toolchain
mipsel-none-elf-gcc y luego clona el repositorio
- Coloca el archivo
baserom.us.z64 en el directorio raíz
- (Opcional) Agrega archivos
.wav de la banda sonora (0~37) en la carpeta .local
- Al ejecutar
make, se genera una imagen ISO (build/us_psx/sm64.us.iso)
- La versión de benchmark (
make BENCH=1) genera solo ELF/EXE sin ISO y requiere una PSX con 8MB de RAM
Windows (no verificado)
- Instala MSYS2 y configura los paquetes
mingw-w64
- Instala
mipsel-none-elf-gcc y clona el repositorio sm64-psx
- Coloca el archivo
baserom.us.z64 y ejecuta make
- El resultado de la compilación se genera en la misma ruta que en Linux
Solución de problemas
- Si gcc no es reconocido, verifica si se ejecutó el entorno incorrecto de MSYS2
- Si falta
baserom.us.z64, revisa la ubicación del archivo
- Si no se encuentra el Makefile, verifica la ruta del directorio
- Si hay errores de paquetes, actualiza con
pacman -Syu y pacman -Su
- Para comprobar que mipsel gcc funciona, valida con el comando
mipsel-none-elf-gcc -v
- Al cambiar de plataforma, es necesario recompilar las herramientas con
make -C tools clean
Estructura del proyecto
actors: comportamiento de objetos, layouts geométricos, display lists
assets: datos de animación y demos
src: código fuente C principal del juego (audio, motor, juego, menús, port, etc.)
textures, text, levels: datos gráficos y de niveles
tools: herramientas de compilación
lib: incluye código del SDK de N64
Contribuciones
- Se aceptan Pull Requests
- Antes de cambios importantes, se recomienda abrir un Issue y discutirlo
1 comentarios
Comentarios en Hacker News
Si te gusta este port, quizá también te interese un proyecto que reimplementa por completo SM64 en GBA
Ver video en YouTube
Artículo relacionado: The Impossible Port – Super Mario 64 on the Game Boy Advance
También parecería encajar bastante bien en N64, y algún día me gustaría conseguir un SummerCart64 para experimentar
Aun así, terminarlo es realmente impresionante
Es un logro realmente asombroso
Antes tuve ambas consolas, y al ver este port vuelvo a sentir lo bien que el N64 capturaba en 1996 esa sensación de “SGI en casa”
Todavía recuerdo el impacto de ver Mario 64 por primera vez en una N64 japonesa de importación
Me hace pensar en el panorama tan diverso de videojuegos de aquella época, cuando juegos como Wipeout en PSX evolucionaban en otra dirección
Dicen que “Tessellation (máximo 2x)” reduce el problema de los polígonos grandes, pero en el video la distorsión de texturas sigue siendo fuerte
Quizá 2x no sea suficiente, o habría que rehacer la geometría de los niveles
Supongo que como están haciendo las operaciones de punto flotante por software, el perspective-correct mapping le pegaría duro al framerate
Cuando lo implementen más adelante, planean dividir los polígonos grandes para resolver también el problema de los límites de coordenadas de textura
Sigue quedando esa sensación tosca del 3D temprano de la era PS1
Me pregunto si hay video de ejecución o capturas de pantalla. Entiendo por qué no está en GitHub
Enlace de YouTube
Enlace de YouTube
Mucha gente se queja de la distorsión de texturas, pero aun así esto es un trabajo realmente impresionante
No se puede dejar de mencionar a Kaze
Lleva años optimizando Mario 64 de distintas maneras, y si te interesa la intersección entre videojuegos retro y programación, vale totalmente la pena verlo
Canal de YouTube de Kaze
No imaginaba que se volvería realidad tan rápido
Ver video relacionado
Si hubiera alguien en PS1 con el nivel de conocimiento de Kaze, quizá también sería posible un proyecto como Mario 32
Últimamente han explotado los proyectos de decompilación, y me da curiosidad saber por qué
Una herramienta representativa es decomp.me
Estas herramientas permiten reconstruir código que coincide exactamente con el binario original, lo que hace posible arrancar nuevos proyectos con rapidez
También ha ayudado la aparición de capas de portabilidad que imitan las API de los SDK de consolas
Aun así, hace falta un esfuerzo enorme, como reproducir comportamientos anómalos de toolchains antiguos para lograr coincidencia perfecta
Hace poco también salió un port para Dreamcast, y Star Fox 64 y Mario Kart 64 han sido llevados a varias plataformas
Lista relacionada: awesome-game-decompilations
Qué pena que no haya capturas de pantalla
“Por fin, Super Mario 32”