No início deste ano, compartilhamos a história de como um NES clássico Tetris O jogador atingiu a “tela de eliminação” do jogo pela primeira vez, ativando um travamento após uma incrível performance de 40 minutos e 1.511 linhas. Agora, alguns jogadores estão usando essa tela de eliminação – e algumas manipulações complicadas de memória que ela permite – para codificar novos comportamentos em versões de Tetris rodando em hardware e cartuchos não modificados.
Cobrimos falhas semelhantes de “execução de código arbitrário” em jogos como Super Mário Mundo, Papel Máriov A Lenda de Zelda: Ocarina of Time no passado. E o método básico para introduzir código externo no NES Tetris foi teorizado publicamente desde pelo menos 2021, quando os jogadores estavam investigando o código descompilado do jogo. (HydrantDude, que se aprofundou Tetris travamentos no passado, também diz que a comunidade há muito tempo tem um método conhecido de forma privada sobre como assumir o controle total de Tetris‘BATER.)
Mas um vídeo recente da Displaced Gamers leva a ideia da teoria privada à execução pública, entrando em detalhes meticulosos sobre como obter o NES Tetris para começar a ler as tabelas de pontuação do jogo como instruções de código de máquina.
Diversão com portas de controlador
Assumindo uma cópia do NES Tetris é possível principalmente devido à maneira específica como o jogo trava. Sem entrar em muitos detalhes, um travamento no NES Tetris acontece quando o gerenciador de pontuação do jogo demora muito para calcular uma nova pontuação entre os frames, o que pode acontecer após o nível 155. Quando esse atraso ocorre, uma parte do código de controle é interrompida pela nova rotina de escrita de frames, fazendo com que ele salte para uma parte não intencional da RAM do jogo para procurar a próxima instrução.
Normalmente, essa interrupção inesperada faz com que o código salte para o início da RAM, onde os dados inúteis são lidos como código e geralmente levam a uma falha rápida. Mas os jogadores podem manipular esse salto graças a um capricho pouco conhecido na forma como Tetris lida com possíveis entradas ao executar na versão japonesa do console, o Famicom.
Ao contrário do Nintendo Entertainment System americano, o Famicom japonês apresentava dois controladores conectados à unidade. Os jogadores que quisessem usar controladores de terceiros poderiam conectá-los através de uma porta de expansão na parte frontal do sistema. O Tetris o código do jogo lê as entradas desta porta de controle “extra”, que pode incluir dois controladores NES padrão adicionais através do uso de um adaptador (isso é verdade mesmo que o Famicom tenha uma versão completamente diferente do Tetris do software à prova de balas).
Acontece que a área da RAM que Tetris usa para processar essa entrada extra do controlador também é usada para a localização da memória daquela rotina de salto que discutimos anteriormente. Assim, quando a rotina de salto for interrompida por uma falha, a RAM armazenará dados que representam os botões pressionados nesses controladores. Isso dá aos jogadores uma maneira potencial de controlar com precisão para onde vai o código do jogo após o travamento ser acionado.
Codificação na tabela de pontuações mais altas
Para o método de controle de salto do Displaced Gamers, o jogador deve manter pressionado “para cima” no terceiro controlador e para a direita, para a esquerda e para baixo no quarto controlador (essa última combinação requer alguns ajustes no controlador para permitir a entrada direcional esquerda e direita simultânea ). Fazer isso envia o código de salto para uma área de RAM que contém os nomes e pontuações da lista de pontuações mais altas do jogo, fornecendo uma superfície de RAM ainda maior que pode ser manipulada diretamente pelo jogador.
Ao colocar “(G”) na parte alvo da tabela de pontuação mais alta do Tipo B, podemos forçar o jogo a pular para outro área da tabela de pontuação, onde começará a ler os nomes e pontuações sequencialmente como o que Displaced Gamers chama de código “bare metal”, com as letras e números representando opcodes para a CPU NES.
Infelizmente, existem apenas 43 símbolos possíveis que podem ser usados na área de entrada do nome e 10 dígitos diferentes que podem fazer parte de uma pontuação alta. Isso significa que apenas uma pequena parte das instruções de opcode disponíveis no NES pode ser “codificada” na tabela de pontuação usando a superfície de ataque disponível.