Incrementando o Tetris do MSX1

tetris-msx_abertura

Para quem esteve fora deste mundo nos últimos 35 anos, Tetris é um puzzle criado por Alexey Pajitnov em 1984 quando trabalhava na Academia de Ciências de Moscou na antiga URSS e que de tão viciante rapidamente se espalhou pelos demais institutos de pesquisa da capital soviética, pelos países do Leste Europeu e, finalmente, pelo tal do “bloco ocidental” lá pelo final do ano de 1987 , onde foi tanto sucesso de vendas como também um caso de tribunal envolvendo licenciamentos  e sublicenciamentos, todos ilegais, e que foi desenrolado no primeiro semestre de 1989.

Há duas versões oficiais de Tetris para os MSX, a primeira desenvolvida pela Mirrorsoft¹ e preguiçosamente baseada na do ZX Spectrum 128 e a outra, exclusiva para a linha MSX2, lançada no mercado japonês pela Bullet-proof Software². A versão da Mirrosoft foi a primeira encarnação do jogo com o qual tive contato e junto com a do Game Boy as que mais joguei.

Mas sempre a considerei meio mal feia e assim, inspirado pelo episódio de número 124 do Retrocomputaria (parte A e parte B), resolvi fazer algo que sempre achei necessário e tive vontade, dar uma repaginada na versão de Tetris do MSX1! 😀

(¹) Na verdade todas as versões lançadas por ela foram desenvolvidas pela Rowan Software, inclusive as para computadores de 16-bit.

(²) Cujo proprietário é atualmente um dos “donos” do Tetris junto com o Alexey através da The Tetris Company LLC.

TL;DR Vá até o final para saber onde baixar os arquivos.

Os arquivos do jogo

O jogo é composto por cinco arquivos e, como usei a versão que trouxe originalmente de fita cassete, mantive os nomes originais limitados a seis caracteres.

  • TETRIS.BAS
  • TETRI1 (tela de abertura/carregamento)
  • TETRI2 (músicas do jogo)
  • TETRI3 (tela do jogo em si)
  • TETRI4 (programa)

O primeiro arquivo apenas carrega os demais e executa o jogo. A tela de abertura é um executável independente que copia para a VRAM as tabelas de padrões (desenhos) e atributos (cores) e servia apenas para você ter alfo para ver na tela. As músicas do jogo são apenas carregada na RAM e o mesmo acontece com a tela do jogo. Por último o programa é carregado é executado automaticamente, iniciando o jogo.

Enquanto os identificava, que chamou a atenção o fato de que o arquivo contento as músicas tinha cerca de 12 KB, algo estranho já que o jogo tem somente três músicas, a que toca durante a partida, a quando o jogo acaba a a da tela dos recordes. E verificando os endereços de memória onde cada bloco é carregado,constatei que mais da metade da música era sobreposta pelo tela do jogo e o código propriamente ditos.

Resolvi cortar o conteúdo extra (e inútil) e o arquivo foi reduzido para mais da metade! Interessante que esta era a versão que carregava no MSX via fita cassete, ou seja, o jogo podia ser carregado em 5/6 do tempo… :-/

Alterando os gráficos

Os modos de vídeo do ZX Specrum e do MSX são parecidos mas iguais e algumas conversões até mesmo esqueciam que o MSX tinha 16 cores disponíveis e usavam apenas 8 nelas.

Tela de abertura

A tela de abertura original não é uma tela de MSX e sim uma adaptação da mesma tela do ZX Spectrum:

Por ser originária do speccy ela tem 6144 bytes de padrões, como o MSX, mas apenas 768 bytes para atributos (duas cores para cada bloco de 8×8 pixeis) porém a solução mais fácil foi logo deixá-la também com 6144 bytes, mesmo que isto significasse replicar a informação desnecessariamente. E aqui percebi que outro 1/6 do tempo de carga também poderia ter sido economizado, ou seja, 1/3 do tempo total… 😦

Resolvi recriar esta tela, aproveitando os elementos da imagem original mas melhorando um pouco o efeito de gradiente do céu, a imagem foi (re)desenhada no Gimp mas colorizada diretamente no MSX usando um programa muito feio em MSX-BASIC (quase um trabalho manual).

tetris-msx_nova-abertura

Algo interessante é que resolvi usar apenas 192 bytes para a tabela de atributos, isto é, cada linha da imagem tem a mesma informação de cor que se repete 32 vezes na tela (192×32=6144).

Tela do jogo

O arquivo que contém a tela do jogo também é uma imagem do speccy só que diferente da primeira ela tem os exatos 6912 bytes do formato SCR com seus 6144 bytes para a tabela de padrões e os 768 bytes para a de atributos — só o leiaute dos bytes que, felizmente, está organizado como na VRAM do MSX.

A principal diferença entre elas está na versão do speccy ter um padrão de fundo (que atrapalha um pouco mas também identifica a fase que se está jogando) e há ainda uma leve desarrumação dos elementos na versão do MSX, além do deslocamento da área onde estão as peças em 8 pixeis para a direita. Motivo? Sei lá! 🙂

Daí segui com o tema “painel de controle”, melhorando um pouco os detalhes.

tetris-msx_nova-arena-e-editor

 E assim como a tela de abertura ela foi desenhada no Gimp e colorizada diretamente no MSX, a tela em questão é do editor de atributos que escrevi, também em MSX-BASIC, para ajudar na tarefa.

Fontes de caracteres

O jogo usa a SCREEN1 para as telas de seleção da fase e de recordes e a SCREEN2 para o jogo em si. Fuçando no código³ reparei que ele parecia ter uma rotina única de escrita de todo o jogo e que usava a CHPUT (0x00A2), escrita em modo texto, e GRPPRT (0x008D), escrita em modo gráfico, dependendo do modo de vídeo.

Logo seria possível trocar a fonte de caracteres do jogo apenas mudando CGPNT (0xF91F), o ponteiro da tabela de caracteres. Esta variável de ambiente usa três bytes, um com o ID do SLOT e os outros dois com o endereço inicial da tabela. O endereço inicial era o mais fácil mas como saber de um jeito seguro qual o ID da RAM? Para a maioria dos casos o valor é 3 mas isto não é algo que se pode garantir com 100% de certeza, logo, ao invés de escrever uma rotina para “achar onde está a RAM” resolvi pesquisar um pouco e descobri que o MSX-DOS já faz isto para mim e o valor fica armazenado em RAMAD3 (0xF344).

Daí bastou importar a fonte de caracteres do speecy, adicionar alguns glifos e pronto!

Sim, eu sei que esta mudança inviabilizou o uso desta versão do jogo em fita cassete mas… «insira sua resposta aqui».

Mas os números no placar não mudaram com a alteração e, além do mais, havia algo estranho pois o zero exibido não era cortado como o padrão armazenado na ROM, parecia mais com o “O” maiúsculo. O motivo era o fato dele ter um padrão próprio e usando outra rotina de escrita. E já que a fonte original do jogo é mais bonita mas com números não lá muito legíveis, optei por apenas “engordar” o padrão já existente.

(³) Algo que havia me prometido não fazer!

Alterando o carregador

E para encerrar, o novo carregador ganhou novas funcionalidades pois além de carregar os blocos do disco o carregados ganhou novas responsabilidades:

  1. Replicar 192 bytes contendo os caracteres de moldura para o lugar que o jogo os procura e assim manter o arquivo com 1024 bytes ao invés de quase 2048;
  2. Alterar o ponteiro da fonte de caracteres da ROM para o endereço da RAM onde está a nova fonte;
  3. “Engordar” o padrão dos números usados no placar do jogo e
  4. Claro, carregar os arquivos e executar o jogo.

Bom ressaltar que nenhuma alteração foi feita no código do programa em si, apenas imagens foram alteradas.

Finalizando…

Algo que realmente achei pode poderia modificar com certa facilidade mas que no final percebi que não era bem assim foi o formato dos blocos pois achei que eles só mexeriam na tabela de atributos da VRAM pois era a coisa mais simples de se fazer mas, não era bem isso e então os blocos permanecem como quadrados de 8×8 pixeis.

Outra coisa não mexida foi um bug curioso na rotina que exibe o número de linhas, acontece que quando se chega na 100ª linha o que aparece na tela é “1  ” (os zeros são substituídos por espaços) e este comportamento se repete até completar a 111ª linha quando a exibição do zero volta ao normal e volta a se repetir com a 200ª linha.

tetris-msx_bug-da-100a-linhal

Isto não acontece na versão de speccy do jogo mas aparece na versão para Amstrad CPC (não pude testar mas algo me diz que na versão de Amstrad PCW possa acontecer o mesmo). Interessante nunca ter reparado neste bug.

A nova versão está disponível para download, tanto em um ZIP contendo os novos arquivos como também em uma imagem de disco e estão disponíveis no repositório git deste blog. Mas, se preferir, você pode rodá-lo através do navegador web usando o WebMSX.

Bom jogo (ao menos visualmente melhorado) e até!

Um comentário sobre “Incrementando o Tetris do MSX1

Os comentários estão desativados.