Homebrew de Atari 2600: fazendo jogos para um console de 1977
O Atari 2600 é um dos consoles mais antigos para os quais ainda se fazem jogos, e talvez o mais esquisito deles. Não tem frame buffer, não tem tiles, quase não tem memória, e o chip gráfico não sabe nada sobre a imagem inteira, só sobre a linha que está desenhando naquele instante. Mesmo assim, todo ano aparecem jogos novos para ele, escritos por gente que se diverte com o desafio de fazê-lo funcionar. Este guia explica como o console funciona, por que programá-lo não se parece com nenhuma outra máquina, quais ferramentas os desenvolvedores usam hoje e como jogar os homebrews da FredyGames, incluindo para que servem todas aquelas chaves no console.
Um console de 1977
A Atari lançou o Video Computer System, ou VCS, em 1977. Ele passou a se chamar Atari 2600 em 1982 e continuou à venda, em vários redesenhos, por bem mais de uma década. No Brasil, o Atari também marcou época e ficou na memória de muita gente. Ele foi projetado numa época em que memória era caríssima, e os engenheiros deixaram a lista de peças tão curta quanto podiam. Três chips fazem quase todo o trabalho:
- A CPU é um MOS 6507, versão reduzida do 6502 que também equipou o NES e muitos computadores pessoais. Roda a cerca de 1,19 MHz e só enxerga 8 KB de memória, dos quais o cartucho fica com uma janela de 4 KB.
- O chip RIOT fornece toda a RAM do console, 128 bytes, além de um temporizador e das entradas dos joysticks e das chaves do console.
- A TIA (Television Interface Adaptor) gera a imagem e o som.
Para ter uma ideia do que são 128 bytes: este parágrafo é bem maior que isso. Toda variável de um jogo de 2600, do placar à posição de cada inimigo, precisa caber nesse espaço, junto com a pilha do processador.
Correndo atrás do feixe
Na maioria dos consoles, o jogo monta uma imagem na memória e o hardware de vídeo a envia para a televisão. O 2600 não consegue fazer isso, porque não há memória nem de longe suficiente para guardar uma imagem. Em vez disso, a TIA desenha o que os seus registradores indicam no exato momento em que o feixe de elétrons da TV passa por cada ponto da tela. Se o programa quer que a próxima linha seja diferente, precisa mudar esses registradores enquanto o feixe está a caminho. Em inglês isso se chama racing the beam, "correr atrás do feixe", expressão que também deu título a um livro de 2009 de Nick Montfort e Ian Bogost sobre o console.
O tempo é apertado. O processador tem 76 ciclos por linha, e a maioria das instruções leva de dois a seis ciclos, então só cabem algumas dezenas de instruções por linha. Um quadro NTSC tem 262 linhas: algumas de sincronismo vertical, cerca de 37 de apagamento vertical antes da imagem, 192 linhas visíveis e cerca de 30 de overscan depois. A lógica do jogo, ler o joystick, mover inimigos, checar colisões, precisa caber nos intervalos de cima e de baixo, porque a parte visível é gasta alimentando a TIA.
O que a TIA consegue desenhar é igualmente limitado:
- Um playfield, um padrão de baixa resolução com 40 blocos na largura da tela, em geral com a metade direita espelhando ou repetindo a esquerda. Paredes, labirintos e cenários saem dele.
- Dois players, sprites de apenas oito pixels de largura, que podem ser esticados ou copiados ao longo da linha.
- Dois mísseis e uma bola, blocos simples de cor que podem ser alargados um pouco.
A lista acaba aí. Todo o resto que aparece num jogo de 2600, uma fileira de inimigos, um placar, uma tela de título caprichada, é o programador reaproveitando esses poucos objetos, trocando forma, cor e posição linha a linha. Jogos com muitos objetos costumam piscar, desenhando parte deles num quadro e o resto no seguinte.
Kernels: o coração de todo jogo
O código que roda durante a parte visível do quadro se chama kernel. É um laço com tempo milimetricamente calculado que, linha após linha, carrega os gráficos certos na TIA e reposiciona objetos, contando ciclos para que cada mudança aconteça no momento exato. Escrever um bom kernel é a arte central da programação de 2600. Um jogo pode ter kernels diferentes para partes diferentes da tela: um para a área de jogo, outro para o placar embaixo.
Dois jogos do site mostram o que isso significa na prática. Snakes, de Robin Sergeant, refaz o clássico jogo da cobrinha para uma máquina com 128 bytes de RAM, e o autor conta como cada segmento do corpo da cobra precisou caber num único byte. 2048 2600, de Carlos Duarte do Nascimento, espreme o quebra-cabeça inteiro, tabuleiro incluído, num cartucho de 2 KB.
Os cartuchos também podem crescer. A troca de bancos (bank switching) permite que o cartucho alterne blocos de programa na janela de 4 KB, e algumas placas acrescentam RAM extra. Ms Snake! usa um cartucho de 32 KB com RAM extra, o que abre espaço para a sua grande tela de título animada.
batari Basic ou assembly?
Há dois caminhos principais para escrever um jogo de 2600 hoje, e o nosso catálogo tem bastante dos dois.
Assembly com o DASM. A maior parte do trabalho sério no 2600 é escrita direto em assembly de 6502, o que dá ao programador controle sobre cada ciclo. O DASM, um macro assembler gratuito, é a ferramenta padrão há anos, e os arquivos de cabeçalho de referência da comunidade são feitos para ele. AStar, Spider Web e Terra7 são escritos em assembly, e como os três têm licença copyleft, as ROMs que servimos foram montadas pela FredyGames a partir do fonte dos autores com o DASM, e esse fonte fica hospedado junto de cada jogo. Cyloid, Dungeon Deck e Snakes também foram escritos em assembly de 6502.
batari Basic. Criado por Fred Quimby, conhecido na comunidade como batari, é uma linguagem parecida com BASIC que compila o jogo para assembly, que o DASM então transforma em cartucho. Ela traz kernels prontos, então dá para desenhar um playfield e mover dois sprites sem contar um único ciclo. O preço é a flexibilidade: os kernels padrão decidem como a tela pode ser, e ideias mais ambiciosas acabam exigindo assembly. O batari Basic trouxe muita gente nova para o desenvolvimento no 2600, e há jogos muito bons feitos com ele, como Berta And Butterflies, Bounstryk, Pipes 2600 e Ms Snake!.
Seja qual for o caminho, os desenvolvedores testam em emuladores. O Stella, o emulador de 2600 mais conhecido, tem um depurador detalhado que mostra a posição do feixe, a contagem de ciclos e os registradores da TIA, o que torna o trabalho com kernels bem menos sofrido do que nos primeiros tempos do hobby.
A comunidade homebrew
O homebrew de 2600 começou nos anos 1990, quando entusiastas passaram a documentar o hardware e trocar descobertas em listas de e-mail. Hoje o centro da cena é a AtariAge, cujos fóruns abrigam as discussões de desenvolvimento e que também fabrica cartuchos físicos de muitos homebrews. O AStar, por exemplo, tem uma edição em cartucho com 24 fases; a edição livre que está na FredyGames é um lançamento separado, com oito fases feitas para ela.
Essa mistura de lançamentos livres e comerciais é típica. Muitos desenvolvedores de 2600 vendem cartuchos, alguns publicam o código-fonte e outros fazem as duas coisas. A FredyGames só hospeda jogos que os autores lançaram sob licenças que permitem redistribuir, inclusive num site com anúncios; o guia sobre como verificamos as licenças explica por quê. Cursos e game jams também trazem gente nova: Dungeon Deck foi escrito em 2025 para uma disciplina de programação de Atari 2600, e Berta And Butterflies venceu um concurso de programação polonês em 2024.
Joysticks, chaves e como o nosso player os mapeia
O joystick do 2600 tem uma alavanca e um único botão. O próprio console tem uma fileira de chaves que os jogos leem como se fossem controles, e muitos homebrews dão a elas funções novas.
| Tecla | Atari 2600 | O que costuma fazer |
|---|---|---|
| Setas ou WASD | Joystick esquerdo | mover |
| Espaço ou V | Botão do joystick esquerdo | atirar, confirmar |
| I J K L | Joystick direito | segundo jogador |
| B | Botão do joystick direito | botão do segundo jogador |
| Enter | Game Reset | começar ou reiniciar a partida |
| Backspace | Game Select | escolher um modo de jogo |
| F1 | Chave de dificuldade esquerda | alterna entre B e A |
| F3 | Chave de dificuldade direita | alterna entre B e A |
| P | — | pausa (do emulador) |
As chaves de dificuldade eram originalmente um handicap para cada jogador: a posição A era mais difícil, a B mais fácil. O nosso player começa com as duas em B, e cada toque em F1 ou F3 vira uma delas. Os autores de homebrew as usam de jeitos criativos:
- Em Berta And Butterflies, F1 alterna entre o modo iniciante e o avançado na tela de título.
- Em Spider Web, pôr qualquer uma das chaves em A deixa os insetos e o mata-moscas mais rápidos.
- Em Bounstryk, uma chave em A entrega aquele jogador ao computador, então F3 permite jogar sozinho contra a máquina.
- Em AStar, cada toque em F1 desfaz o último movimento, e F3 liga ou desliga o esmaecimento entre as fases.
Game Select e Game Reset eram o jeito de escolher um modo e começar uma partida antes de existirem menus. Muitos homebrews ainda os usam: em Dungeon Deck, Backspace escolhe a dificuldade na tela de título e permite fugir de uma sala durante o jogo; em 2048 2600, alterna entre um e dois jogadores. A chave de cor/preto e branco do console não está mapeada no nosso player, então os jogos que a usam para pausar são pausados com P.
Não há estados salvos para o 2600 aqui. Como no console de verdade, a partida dura enquanto você continuar jogando, e os recordes ficam guardados até você fechar a página. O nosso player roda os jogos em NTSC, o padrão de TV americano que a maioria dos homebrews usa. Para gamepads e outras dicas práticas, veja jogando jogos retrô no navegador.
Um passeio pelos nossos jogos de Atari 2600
A lista completa está na página da plataforma Atari 2600. Alguns destaques:
- AStar é um quebra-cabeça deslizante em que Bob só para quando bate em algo, e um bloco móvel é o único jeito de fazê-lo parar onde você precisa. Cada fase tem uma meta de movimentos calculada por um programa resolvedor, e terminar todas dentro da meta é um desafio de verdade.
- Spider Web põe você no lugar de uma aranha que defende a sua teia: atordoe os insetos com seda, coma-os para recuperar vida e fuja do mata-moscas, em vinte fases com uma música que acelera.
- Terra7 é um shooter horizontal com uma missão clara: derrubar 250 invasores para carregar um satélite de defesa, enquanto resgata os astronautas que passam à deriva.
- Bounstryk é um jogo de bola um contra um que junta uma bola que nunca perde velocidade com os empurrões do hóquei de mesa, para dois jogadores ou contra o computador.
- Dungeon Deck transforma a exploração de masmorra num baralho de 45 cartas com monstros, espadas, escudos e poções. É um joguinho tenso de contas e sacrifícios.
- Berta And Butterflies é um jogo de reflexo no espírito dos portáteis de LCD do começo dos anos 1980, com uma elefanta que pega borboletas em quatro posições.
- 2048 2600 acrescenta um modo para dois jogadores que o quebra-cabeça original nunca teve, e Pipes 2600 pede que você monte o encanamento antes que a água chegue ao fim.
Por onde começar
Para ver o que um assembly cuidadoso consegue tirar dessa máquina, comece por Spider Web ou Terra7. Se prefere pensar, AStar e Dungeon Deck ocupam uma noite inteira. Para duas pessoas no mesmo teclado, experimente Bounstryk. E para comparar o 2600 com os consoles que vieram depois, leia homebrew de NES: por onde começar e homebrew da Sega hoje, ou volte ao básico com o que é homebrew?.