A rotina de scroll do Parsec no MSX

parsecmsx-1_abertura

O jogo Parsec é um Shoot’em Up¹ desenvolvido por Jim Dramis and Paul Urbanus para o computador TI 99/4A da Texas Instruments e lançado em cartucho no ano de 1982. Nele você controla uma espaçonave que precisa se defender durante 16 fases de ondas sucessivas de ataque, ao mesmo tempo que precisa mantê-la devidamente abastecida (há áreas próprias para isto) e, claro, se entender com a inércia que torna sua movimentação pela tela um pouco complicada.

Opcionalmente, o jogo suporta o módulo de síntese de voz, Speech SynthetizerPHP1500, para a reprodução de mensagens como “Press fire to begin.“, “Nice shooting.“, “Warning! Time to refuel.” etc… do “computador de bordo” da nave.

Foi o primeiro jogo do TI 99/4A a utilizar o modo de vídeo GRAPHICS 2 — a SCREEN 2 dos MSX — e implementa uma rotina de scroll ponto a ponto que faz o cenário deslizar indefinidamente no decorrer da partida. Foi justamente por conta desta rotina de scroll que resolvi olhar com atenção para ele e tentar implementá-la no MSX.

E tudo isto foi há pouco mais de 4 anos…

(¹) Particularmente gosto mais do termo Mata Marcianos, usado pelos espanhóis. 🙂

O resultado final

 

 

O resultado final, até cheguei a mostrá-lo para algumas pessoas e até cogitei prosseguir o trabalho e portar o jogo para MSX mas acabei descartando a ideia. Motivo? Há uma explicação mais detalhada no final.

O código fonte

Indo direto ao ponto, a rotina está disponível lá no meu repositório do GitHub para “trechos interessantes” de código para computadores clássicos…

parsecmsx-1_boot

Até recriei a tela de inicialização dos TI 99/4A… 🙂

Para montá-lo use:

$ pasmo Parsec_Demo.asm parsec.bin

E, para facilitar a vida de quem só quer testar o programa, tanto o binário já montado como também uma imagem de disco estão disponíveis por lá.

Alguns detalhes

O programa utiliza o cenário de fundo do jogo e o sprite da espaçonave do jogo, extraídos diretamente do cartucho, como também a fonte de caracteres do próprio TI 99/4A retirada da ROM do sistema.

Rotina de scroll

A tabela de nomes foi reorganizada para deixá-la pseudo linear, formando 32 colunas de 4 caracteres (32 bytes) e assim facilitar o trabalho da rotação do cenário; o mesmo truque que usado naquele truque com o VDP tempos depois.

parsecmsx-1_pseudolinear

Tabela de nomes do 3º terço, organizada de forma pseudo linear.

Olhando o código fonte é possível descobrir que na verdade o scroll acontece de dois em dois pontos² e que é feito através dos deslocamentos da primeira coluna em dois bits para a esquerda e da coluna vizinha seis bits para a direita e da junção do resultado substituindo o conteúdo da primeira.

parsecmsx-1_rotacionando

Isto é repetido por 32 vezes para executar a rotação completa da tela e como a rotina trabalha com os padrões que estão em RAM e não na VRAM é possível fazer a transição entre os sete cenários de fundo que estão disponíveis no jogo — esta demonstração só utiliza dois deles — copiando o padrão para ser o vizinho da 32ª coluna.

As estrelas

Isto era opcional mas acabei implementando, as estrelas ficam no primeiro e segundo terços da tela (onde efetivamente acontece o jogo) e a tabela de atributos foi preenchida da seguinte maneira:

  • Linha 0 : 0xE1 (cinza)
  • Linha 1 : 0x41 (azul escuro)
  • Linha 2 : 0x91 (vermelho claro/laranja)
  • Linha 3 : 0xA1 (amarelo ouro)
  • Linha 4 : 0x71 (ciano)
  • Linha 5 : 0xD1 (magenta)
  • Linha 6 : 0x21 (verde)
  • Linha 7 : 0x61 (vermelho escuro)

Como só as cores foram mexidas a tela continua sendo somente um fundo preto e a lógica para criar e animar as estrelas nela é a seguinte:

  • Sorteio e armazeno 32 posições aleatórias da VRAM entre os endereços 0 e 4095 (os dois primeiros terços da tela) e lá sorteio uma das oito primeiras potências de 2 (1, 2, 4, 8, 16, 32, 64 ou 128). Ao escrever estes valores na VRAM um ponto acende na tela.
  • Para cada endereço da VRAM sorteado, leio seu conteúdo e o multiplico por dois — na verdade o valor com ele mesmo: 2+2=4, 4+4=8, 16+16=32 — o que equivale a rotacionar este 1 bit — assim a estrela anda 1 ponto para a esquerda.
  • Se o valor resultante for 0 (128+128=0), decremento o endereço da VRAM em 8 e altero o valor para 1 — e a estrela segue seu caminho mais um ponto para a esquerda.
  • Se o endereço da VRAM for a coluna 0, ele é somado com 248 ao endereço — assim a estrela reaparece novamente do lado direito da tela completando a rotação.

Aliás, este código é configurável para até 255 estrelas simultâneas na tela.

(²) Por questões de performance pois não recorri a nenhum tipo de otimização como fazer a cópia dos dados para a VRAM atrelado-a à interrupção do VDP ou mesmo escrever diretamente os dados acessando diretamente as portas de E/S.

(³) Não me recordo o motivo desta ordem mas acho que é o mesmo que acontece no jogo.

Finalizando…

Lembrando Isto é mais uma demonstração e como dito acima até cogitei em escrever uma versão do jogo para MSX, mapeei a ordem dos inimigos, a pontuação e até o roteiro de cada uma das 16 fases mas acabei desistindo da ideia. Por que? Simples, apesar de revolucionário para o TI 99/4A, é um jogo datado e replicá-lo ipsis litteris acabaria em mais do mesmo e “aproveitar” para modernizá-lo acabaria produzindo um jogo diferente com o mesmo nome — daí, melhor seguir seu próprio roteiro.

Mas se alguém “que não pensa como eu” estiver interessado em prosseguir com o trabalho e trazer Parsec para o MSX, além deste código aqui posso ainda disponibilizar minhas anotações sobre o funcionamento do jogo, basta pedir!

Anúncios

2 comentários sobre “A rotina de scroll do Parsec no MSX

  1. Prezado Giovanni, parabéns pelo artigo. Me lembrou do efeito de scroll presente no “100 dicas” (pg. 59), neste conforme vai-se adicionando elementos (mais naves, controle por joystick e etc.) no código em BASIC o scroll perde a suavidade/continuidade, dando saltos. De repente um caso a ser estudado. Permita-me também uma pequena correção, em vez de “shot’ em up” é ;’shoot’ em up”. Abraços!

    Curtir

Os comentários estão desativados.