Engenharia reversa no GBA: Vamos esticar a ponte! — Parte 1

Bruno Macabeus
4 min readJul 2, 2019

--

Essa postagem faz parte da série intitulada Engenharia Reversa num jogo de Gameboy Advance. Leia a introdução aqui.

Se você gosta desse conteúdo, você deve gostar dos cursos da Code Crafters. Aprenda sobre fazer seu próprio BitTorrent, SQLite, e outras coisas divertidas. Se inscreva usando meu link para me pagar um café!

Bem, o nosso objetivo é criar um editor de fases, certo? Nossa, isso é algo complexo e tem um milhão de coisas para fazer… Mas vamos partir pelo mais óbvio: vamos criar nossos tiles!

Algo importante num projeto de engenharia reversa é “buscar padrões e repetí-los”. É mais fácil apenas repetir um padrão do que simplesmente criar ou apagar algo. Ou seja, ao invés de simplesmente “criar tiles” do nada, vamos partir de algo mais simples: vamos somente “repetir os tiles” de forma a “esticar alguma estrutura da fase”. Algo que facilita o nosso trabalho é ter uma parte prática da fase com uma estrutura a ser esticada. Ou seja, algum lugar onde os tiles sejam regulares (sequência de vários tiles iguais), onde seja vazio ao lado, além de também ser fácil perceber que houve uma mudança.
Desse modo, na primeira fase há uma parte especialmente prática para isso, que é onde há uma ponte flutuante.

Uma das ferramentas do no$gba, o Vram Viewer (acesse pela tecla F5), é útil exatamente para esse nosso trabalho. Nele conseguimos ver as diferentes visões do background da fase. No Gameboy Advance, há os BG 0, BG 1, BG 2 e BG 3. Perceba que na aba BG 0 fica a imagem de background mais ao fundo, a do céu azul, e o painel do jogador, enquanto no BG 1 fica as imagens em segundo plano do fundo, e o BG 3 tem nada.
O que realmente importa para nós está no BG 2, que é onde conseguimos ver os tiles “andáveis”.

Imagem exibindo a ferramenta Vram Viewer do no$gba, na seção de onde está a ponte da qual esticaremos

Ao passar o mouse em um tile, obtemos várias informações a respeito dele. Apesar de exibir vários dados, há somente dois realmente importante para nós, que são:

  • Tile No: é o número associado ao tile. Nesse exemplo dessa fase, todo tile com número 9B representa aquele pedaço específico da ponte, que é o canto esquerdo extremo. 9A representa o tile da parte contínua da ponte.
  • Map address: endereço da memória em que tile está armazenado. No caso, está no endereço 0600F1AD.

Opa, falei de um endereço da memória. E esse é um endereço é esperado, pois os endereços 06000000 e 06017FFF representam a seção denominada VRAM (Video RAM). Nessa seção, armazena-se o background, sprites — e como vimos, o tile map também!
O Gameboy Advance tem várias seções de memória, cada uma com diferentes finalidades e funcionalidades. Caso queira saber mais sobre elas, pode ler aqui, mas sempre que eu introduzir uma nova, falarei brevemente dela.

Então agora sabemos que por volta do endereço 0600F1AD fica o tile map que estamos visualizando. Interessante… Então vamos ver o que tem por aí.

Região da memória com o tilemap. Em destaque é o byte associado ao tile do canto superior esquerdo da ponte.

Legal! Conseguem visualizar a ponte nesses bytes? Perceba que 00 representa um tile vazio, enquanto os demais é algum tile que será exibido na tela. E essa sequência de bytes "9B 9A 9A …" são a nossa ponte! Então, será que bastaria esticar um pouco ela para conseguimos criar nossos tiles, isto é, ocupar os tiles à esquerda do 9B, seguindo o padrão? Vamos testar!

Região da memória após esticarmos os bytes associado à ponte.

Esticamos a ponte na memória, e como o GBA exibe o display com base nessa informação, vamos executar um frame no emulador (use o atalho Keypad /) para ver no que acontece…
E assim conseguimos ver que realmente conseguimos esticamos a ponte! Legal!!

GIF com dois frames do jogo, mostrando o resultado da modificação.

Porém, ao executar mais um frame, percebemos que a ponte voltou ao formato original… Hmm… como isso aconteceu? Como resolver?

Próxima postagem: Entendendo o sapeca DMA

--

--

No responses yet