1 pontos por GN⁺ 2025-12-12 | 1 comentários | Compartilhar no WhatsApp
  • Uma versão portada exclusivamente para PlayStation (PSX) com base no projeto de decompilação de Super Mario 64 para Nintendo 64
  • Inclui grandes modificações adaptadas ao hardware do PS1, como suporte à vibração DualShock, conversão para matemática de ponto fixo e otimizações de renderização
  • Adiciona melhorias de desempenho, como pré-processador gráfico, compressão de texturas e otimização de memória de animações
  • Há vários bugs conhecidos, como controle de câmera incompleto, problemas de colisão e crashes e impossibilidade de compilar a música
  • Um experimento de portabilidade entre plataformas de um jogo clássico, sendo um caso relevante para desenvolvimento em consoles legados e pesquisa em engenharia reversa

Visão geral do projeto

  • Este código é um fork da versão completamente decompilada de Super Mario 64 (J/U/E/SH), voltado apenas para PSX e PC (para depuração)
    • Builds para Nintendo 64 não são mais suportadas
    • No momento, só é possível compilar a ROM da versão americana (US)
  • A build do jogo não inclui os assets originais, sendo necessário extrair os assets de uma ROM legítima

Principais recursos

  • Adição de gráficos compatíveis com DualShock™, imitando a indicação original “Rumble Pak Compatible”
  • Suporte tanto a sinais analógicos de vibração para o motor grande do DualShock quanto a sinais digitais para o motor pequeno
  • Implementação de soft float de baixa precisão para PSX, minimizando a perda de desempenho em operações de ponto flutuante
  • Substituição de código por matemática de ponto fixo, usando vetores e matrizes inteiros de 16 bits, padrão no PSX
  • Simplificação e reescrita do render graph walker
  • Subdivisão de polígonos (até 2x) para reduzir problemas com polígonos grandes
  • Conversão de RSP display lists para um formato customizado via JIT, acelerando o processamento
  • Pré-processador de display lists para remover comandos desnecessários e otimizar meshes
  • Compressão das animações do Mario (580.632 → 190.324 bytes) e colocação direta na VRAM
  • Adição de profiler customizado e codificador de texturas 4bpp
  • Substituição por sombras hexagonais levando em conta as limitações de transparência do PSX
  • (Planejado) rotação da câmera com o analógico direito e reescrita do subsistema Goddard

Problemas conhecidos

  • Árvores flutuando, algumas animações não funcionam ou causam crash
  • Impossibilidade de compilar a música, efeitos sonoros ausentes ou com som incorreto
  • Controle de câmera incompleto, crash ao entrar em certos níveis
  • Falha ao carregar a sequência final, Lakitu não aparece, pole não funciona
  • Tempos de carregamento longos por causa do carregamento individual de texturas, distorção de texturas devido às limitações do PSX
  • O pré-processador gráfico precisa de melhorias, erros de renderização em algumas texturas, tela de título incompleta, menu de pausa não funciona

Como compilar

Linux

  • Instale a toolchain mipsel-none-elf-gcc e depois faça o clone do repositório
  • Coloque o arquivo baserom.us.z64 no diretório raiz
  • (Opcional) Adicione arquivos .wav da trilha sonora (0~37) na pasta .local
  • Ao executar make, uma imagem ISO será gerada (build/us_psx/sm64.us.iso)
  • A versão de benchmark (make BENCH=1) gera apenas ELF/EXE, sem ISO, e requer PSX com 8 MB de RAM

Windows (não testado)

  • Instale o MSYS2 e configure os pacotes mingw-w64
  • Instale mipsel-none-elf-gcc e faça o clone do repositório sm64-psx
  • Coloque o arquivo baserom.us.z64 e execute make
  • Os artefatos de build serão gerados no mesmo caminho do Linux

Solução de problemas

  • Se o gcc não for reconhecido, verifique se o ambiente correto do MSYS2 está sendo executado
  • Se o baserom.us.z64 estiver ausente, confira a localização do arquivo
  • Se o Makefile não for encontrado, verifique o caminho do diretório
  • Em caso de erro de pacote, atualize com pacman -Syu e pacman -Su
  • Para confirmar se o mipsel gcc está funcionando, use o comando mipsel-none-elf-gcc -v
  • Ao trocar de plataforma, é necessário recompilar as ferramentas com make -C tools clean

Estrutura do projeto

  • actors: comportamento de objetos, layouts geométricos, display lists
  • assets: animações e dados de demo
  • src: código-fonte principal em C do jogo (áudio, engine, jogo, menus, port etc.)
  • textures, text, levels: dados gráficos e de fases
  • tools: ferramentas de build
  • lib: inclui código do SDK do N64

Contribuição

  • Pull Requests são bem-vindos
  • Antes de mudanças grandes, é recomendado abrir uma Issue e discutir primeiro

1 comentários

 
GN⁺ 2025-12-12
Comentários do Hacker News
  • Se você gostou desse port, talvez também ache interessante o projeto que reimplementa totalmente o SM64 no GBA
    Ver vídeo no YouTube

    • Como aqui é o HN, isso precisa ser mencionado. Esse port para GBA foi escrito em Rust
      Artigo relacionado: The Impossible Port – Super Mario 64 on the Game Boy Advance
    • Interessante. Fico curioso se o GBA daria conta de uma versão light estilo Minecraft
      Parece que também combinaria bem com o N64, e algum dia quero arrumar um SummerCart64 para testar
    • Alguém sabe onde está o código-fonte desse projeto? Parece que foi removido
    • É impressionante, mas pessoalmente acho meio difícil de olhar
      Ainda assim, é realmente incrível que tenham conseguido terminar
  • É uma conquista realmente impressionante
    Eu tinha os dois consoles na época, e ver esse port me faz perceber de novo como o N64 capturava bem aquela vibe de “SGI em casa” em 1996
    Ainda lembro vividamente do impacto de ver Mario 64 pela primeira vez num N64 importado do Japão
    Isso me faz lembrar do ecossistema variado de jogos daquela época, quando títulos como Wipeout no PSX seguiam por um caminho bem diferente

  • Dizem que “Tessellation (até 2x)” reduz o problema dos polígonos grandes, mas no vídeo a distorção de textura ainda é bem forte
    Talvez 2x não seja suficiente, ou então seja preciso refazer a geometria das fases

    • Eu também percebo a distorção de textura, mas não vejo aquele tremido da geometria típico dos jogos de PS1
      Provavelmente porque estão fazendo operações de ponto flutuante via software, então perspective-correct mapping deve pesar demais no frame rate
    • No momento, quase não há pré-processamento nos polígonos das fases
      Quando isso for implementado mais à frente, os polígonos grandes devem ser subdivididos, o que também resolverá o problema do limite das coordenadas de textura
    • Até nos problemas conhecidos está escrito que “a tessellation não é suficiente”
      Ainda permanece aquela aparência bruta do 3D inicial da era PS1
  • Fiquei curioso se há algum vídeo de execução ou capturas de tela. Entendo por que não está no GitHub

  • Muita gente está reclamando da distorção de textura, mas ainda assim isso é um trabalho realmente impressionante

  • Não dá para deixar de mencionar o Kaze
    Ele vem otimizando o Mario 64 de várias formas há anos, e vale muito a pena acompanhar se você se interessa pela interseção entre jogos retrô e programação
    Canal do Kaze no YouTube

    • Num vídeo postado em agosto, ele analisou o quanto o Mario 64 desperdiça RAM, e foi ali que mencionou pela primeira vez a possibilidade de um port para PS1
      Eu não imaginava que isso se tornaria realidade tão rápido
      Ver vídeo relacionado
    • Ele é realmente incrível (e sarado)
      Se existir alguém com o nível de conhecimento do Kaze sobre PS1, talvez um projeto como Mario 32 também seja possível
  • Ultimamente houve uma explosão de projetos de decompilação, e fiquei curioso sobre o motivo

    • O principal motivo é o avanço das ferramentas que dão suporte à decompilação com correspondência exata de bytes 1:1
      Um exemplo bem representativo é o decomp.me
      Essas ferramentas permitem reconstruir código que corresponde exatamente ao binário original, o que ajuda novos projetos a começarem rapidamente
      O surgimento de camadas de portabilidade que imitam as APIs dos SDKs dos consoles também contribuiu
      Ainda assim, é preciso um esforço enorme, inclusive para reproduzir comportamentos anômalos de toolchains antigas a fim de obter correspondência perfeita
    • Talvez seja porque a IA tornou a decompilação mais fácil
    • Pode ser simplesmente por causa da IA
    • O fato de mais gente estar usando o Ghidra também teve impacto
  • Recentemente também saiu um port para Dreamcast, e Star Fox 64 e Mario Kart 64 também foram portados para várias plataformas
    Lista relacionada: awesome-game-decompilations

    • O port de Star Fox 64 também acabou de ser concluído
  • Uma pena não ter capturas de tela

  • “Finalmente, Super Mario 32