Mario Mario Mario Mario - Super Mario Bros: Mario Brothers / Characters - TV Tropes
Super Mario Bros: Mario Brothers / Characters - TV Tropes

Como funciona a engenharia reversa de ROMs de Mario e o que todo mundo deixa passar

Trabalhar com ROMs de Super Mario Bros. no NES não é só abrir no emulador e mexer nos endereços de memória. A estrutura do jogo foi projetada para caber em 32 KB de cartucho, o que significa que os programadores da Nintendo literalmente cortaram qualquer coisa que pudesse ser otimizada depois. O código de movimentação do Mario ocupa cerca de 400 bytes, o sprite do inimigo Goomba gasta apenas 16 bytes por frame na RAM, e o algoritmo que controla a física de pulo é compartilhado entre todos os personagens — Mario, Luigi, Toad e Yoshi no SMB3 usam o mesmo bloco de sub-rotinas de movimento, apenas com valores diferentes nas tabelas de configuração. Eu já passei duas semanas tentando corrigir um bug em que o Mario atravessava certos blocos de tijolo em níveis gerados proceduralmente por uma ferramenta de hacking que eu estava usando. O problema não era no código do sprite do personagem. Era a tabela de colisão do bloco que tinha um byte sobrescrito incorretamente pelo patcher — o endereço $0F no setor de dados do bloco estava apontando para o flag de "quebrável" em vez do flag de "sólido". A correção foi editar manualmente o byte no hex editor. A ferramenta de geração automática não detectava esse erro porque ela verificava apenas se o bloco existia, não se os flags estavam coerentes entre si.

o que realmente significa mario mario mario mario no contexto de desenvolvimento

Quando alguém repete "mario" quatro vezes num contexto técnico, geralmente está se referindo à redundância intencional que aparece em alguns projetos de ROM hacking — níveis customizados que copiam mecânicas originais sem entender por que elas funcionam. O jogo original tem uma série de variáveis globais que se sobrepõem: a pontuação, o tempo do nível e o número de vidas compartilham o mesmo espaço de memória em certos momentos porque o processador 6502 do NES é limitado a 256 bytes de RAM diretamente endereçável. Quem fazROM hacks sem entender isso acaba criando níveis onde coletar moedas zera o timer ou morrer acidentalmente reseta a pontuação do jogador anterior. O assembler 6502 que você vai precisar dominar não é tão complexo quanto parece. A maior parte do código de Mario usa instruções como LDA, STA, CMP, BCC, JSR e RTL. O mais importante é entender o processo de cálculo de página — se você carrega um valor com LDA $XXXX,Y e o resultado transborda o limite da página atual, o 6502 não faz carry automático para a próxima página, e o próximo opcode será lido do endereço errado. Isso causa crashes silenciosos que levam horas para diagnosticar porque o jogo simplesmente para de responder sem nenhuma mensagem de erro visível.

Tabelas de indexação são outro ponto onde a maioria dos hacks dá errado. O SMB original usa tabelas espalhadas por toda a ROM — a tabela de sprites está no final do banco 0, a de tiles do mapa está distribuída em diferentes setores, e a de música e som está num formato proprietário que usa comandos de 2 bytes por nota. Se você quiser adicionar um novo inimigo ou uma nova mecânica, não basta copiar um sprite existente e mudar os valores. Você precisa garantir que a tabela de colisão tenha entradas para cada frame de animação, que a tabela de pathing do inimigo aponte para coordenadas válidas dentro do espaço do nível, e que o engine de rendering não tente carregar mais de 8 sprites na mesma linha — o NES limita o sprite per line a 8, e exceder isso causa flickering que torna o jogo injogável em telas com muitos objetos. O emulador FCEUX com o debugger integrado é a ferramenta mais útil para esse trabalho. Você pode parar a execução em qualquer momento, inspecionar o conteúdo de cada registrador, ver o valor de qualquer endereço de memória em tempo real, e traçar chamadas de sub-rotina. Eu recomendo começar configurando um breakpoint no endereço $0163 — é o endereço que armazena o número de vidas — e observar o que acontece quando o Mario morre. Você vai ver o valor sendo decrementado, o flag de invencibilidade sendo ativado, e o sprite do personagem sendo movido para fora da tela antes do reset do nível. Esse fluxo leva exatamente 60 frames no modo PAL e 60 frames no modo NTSC, mas o timing é diferente porque o PAL roda a 50 Hz e o NTSC a 60 Hz. Se você está desenvolvendo para um público internacional, testar nos dois modos é obrigatório.

👉 Clique no botão abaixo para saber mais sobre o assunto!

A ferramenta NESmaker e o SMW Open Source Engine são opções mais acessíveis do que editar assembly puro, mas elas impõem limitações estruturais que podem frustrar quem quer fazer algo fora do padrão. O NESmaker usa um sistema de tiles e sprites pré-definido — você não pode ter um sprite com mais de 8x8 tiles ou usar paletas personalizadas sem modificar o source code. O SMW Open Source Engine, voltado para Super Mario World no SNES, permite mais flexibilidade mas exige conhecimento de ASM e de como o processador 65816 do SNES gerencia modos endereçados em 16 bits. Se você está começando, usar o FCEUX com o source code do NES SCM (NES Super Mario hacking tool) disponível em repositórios públicos no GitHub. Um problema recorrente que ninguém menciona é a questão do bank switching. Cartuchos de NES com mais de 32 KB usam switches de banco para mapear diferentes partes da ROM em endereços fixos de memória. O SMB usa mapper 0 (NROM) que não faz bank switching — tudo cabe num único banco. Mas jogos posteriores como Super Mario Bros. 3 usam o mapper 7 (UNROM) com múltiplos bancos de 16 KB cada. Se você estiver trabalhando em um hack para SMB3, precisa entender como o bit de controle no endereço $8000 alterna entre os bancos, e quais endereços de cada banco estão reservados para o código do jogo versus dados estáticos. Um erro aqui pode corromper a ROM inteira durante o carregamento, e o emulador simplesmente vai mostrar uma tela preta sem nenhum log de erro útil.

O som é outra área onde há muita desinformação. O chip de áudio do NES (Ricoh 2A03) tem 4 canais: dois ondas quadradas, uma onda dente de serra, um ruído e um DMC para amostras de baixa qualidade. A música tema do Mundo 1-1 foi composta com duas ondas quadradas — uma tocando a melodia principal e outra fazendo o contraponto — enquanto o DMC carrega samples de bateria sintetizados. Se você quiser adicionar uma nova música, não adianta tentar usar os 4 canais como se fosse um sintetizador moderno. Cada canal tem limitações específicas: a onda quadrada permite apenas duty cycle de 12.5%, 25%, 50% ou 75%, o que significa que os harmônicos possíveis são extremamente restritos. O ruído não é aleatório — ele usa um LFSR de 15 bits com um divisor de frequência fixo, então os padrões de ruído são repetitivos após um ciclo de 32767 samples.

download e recursos práticos

O FCEUX está disponível gratuitamente em fceux.com e funciona em Windows, macOS e Linux. O source code do NES SCM pode ser encontrado no GitHub procurando por "nes scm super mario hacking". Para SMW, o projeto Super Mario World Hacker Community mantém tutoriais atualizados em smwhc.com. Não há um "programa oficial" da Nintendo para edição de ROMs — qualquer ferramenta que você encontrar na internet é de desenvolvimento comunitário. A comunidade de speedrunning também é uma fonte útil de conhecimento técnico. Análises frame a frame de runs recordes mostram exatamente como os desenvolvedores originais manipularam bugs como a técnica de warping de warp zones, o delay de input que permite buffers de pulo, e o glitch de sobreposição de sprites que permite passar através de certos blocos. Entender esses mecanismos não é só curiosidade — é necessário para criar hacks que não quebrem a jogabilidade de forma imprevisível.

Se você está considerando publicar um hack, leia atentamente os termos de uso da Nintendo. A empresa tem sido relativamente permissiva com ROM hacks não comerciais que não usam assets originais protegidos por direitos autorais além do necessário para a paródia ou transformação crítica, mas qualquer distribuição comercial resulta em cease and desist letter. O caso do Super Mario Bros. Movie em 2023 mostrou que a Nintendo monitora ativamente projetos que usam sua marca de forma comercial, mesmo em contextos de fãs. O tempo médio para criar um hack funcional do zero, partindo do zero conhecimento de assembly, é de 6 a 12 meses de estudo autodidata. Quem já tem experiência com programação em C ou Python pode reduzir esse prazo para 3 a 5 meses porque a lógica de controle de fluxo e estruturas de dados é transferível. O gargalo principal não é a ferramenta — é o entendimento do hardware do NES, que foi projetado numa época em que cada byte de memória custava dinheiro real e cada ciclo de CPU era contabilizado.