1 puntos por GN⁺ 2025-12-12 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-12-12
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

    • Como esto es HN, hay que mencionarlo sí o sí: este port para GBA está escrito en Rust
      Artículo relacionado: The Impossible Port – Super Mario 64 on the Game Boy Advance
    • Interesante. Me pregunto si la GBA podría con una versión ligera estilo Minecraft
      También parecería encajar bastante bien en N64, y algún día me gustaría conseguir un SummerCart64 para experimentar
    • ¿Alguien conoce el código fuente de este proyecto? Parece que lo borraron
    • Está genial, pero en lo personal me cuesta un poco verlo
      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

    • Yo también noto la distorsión de texturas, pero no veo el temblor de geometría típico de los juegos de PS1
      Supongo que como están haciendo las operaciones de punto flotante por software, el perspective-correct mapping le pegaría duro al framerate
    • Por ahora casi no hay preprocesamiento en los polígonos de los niveles
      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
    • En los problemas conocidos también se indica explícitamente que “la tessellation no es suficiente”
      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

  • 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

    • En un video que subió en agosto analizó cuánto desperdicia RAM Mario 64, y fue ahí cuando mencionó por primera vez la posibilidad de un port para PS1
      No imaginaba que se volvería realidad tan rápido
      Ver video relacionado
    • Es realmente increíble (y además musculoso)
      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é

    • La razón principal es la mejora del tooling que permite decompilación con coincidencia exacta 1:1 a nivel de bytes
      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
    • Tal vez la IA ha hecho más fácil la decompilación
    • Quizá simplemente sea por la IA
    • También ha influido que más gente use Ghidra
  • 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

    • El port de Star Fox 64 también acaba de completarse
  • Qué pena que no haya capturas de pantalla

  • “Por fin, Super Mario 32