• Nenhum resultado encontrado

5 A Arquitetura do Atar

6.4 Módulo TIA

A construção do módulo TIA foi baseada no documento Stella Programmer’s Guide (WRIGHT, 1979), o principal livro fonte para programadores do Atari. Este documento contém uma descrição em alto nível de cada componente do TIA, assim como dicas de como utilizar suas funções num software Atari – também há tabelas de registradores, possíveis configurações, e seu significado. O diagrama de blocos deste módulo é exibido na figura 22.

Um contador horizontal monitora a atual localização do pixel na scanline. Ajustes para a linha de vídeo são carregados nos registradores de objetos da tela, e a lógica de pixel usa estes registradores para selecionar a tonalidade de cor correta para cada pixel. Assim como no módulo RIOT, linhas de habilitação nos registradores são conectadas à entrada de endereços para atualizar seletivamente os registradores, enquanto o valor do registrador de saída é selecionado por meio de um multiplexador.

O bloco de lógica de geração de pixels tem a função de testar se um objeto na tela está ou não dentro de um pixel. Os objetos podem ser esticados por um fator de 2 ou 4, e podem ser duplicados de algumas formas ao longo da tela. Este módulo recebe como entradas a posição do pixel, a posição do objeto, a sua largura, parâmetros para a sua duplicação, e gráficos do mesmo.

As posições do pixel e do objeto são testadas para garantir que o pixel pode ser incluído no objeto. Em seguida, a posição do objeto é subtraída da posição do pixel, fornecendo um índice para os pixels do objeto. Este índice do objeto é deslocado e comparado com uma tabela de máscaras para garantir que uma cópia do objeto apareça nesta posição. Finalmente, o índice do objeto é comparado com o gráfico do objeto, para se decidir se este pixel deve ser "aceso". Se estes três testes tiverem resultados positivos, o módulo fornece uma saída de '1'.

A figura 23 mostra o bloco do subsistema TIA no Quartus II, com seus pinos de entrada dispostos no seu lado esquerdo, e os pinos de saída, no lado direito.

O pino A representa a entrada dos 6 bits menos significativos provenientes do barramento de endereços. O Pino Din representa a entrada de 8 bits, proveniente do barramento de dados. Também estão presentes os pinos CS, CS_n e R_W_n, de propósito idêntico aos pinos de mesmo nome, presentes no chip RIOT. Em seguida vêm os pinos MASTERCLK, que recebe como entrada o clock de pixel, e CLK2, entrada para o clock de barramento. Por fim, a entrada de 2 bits Ilatch é utilizada para receber dados dos botões de cada joystick do Atari; e o pino RES_n, responsável por receber as requisições para reset do chip.

Entre os pinos de saída do módulo TIA, estão presentes Dout, representando os 8 bits do barramento de dados; RDY, responsável por habilitar e desabilitar a operação do processador; HSYNC, responsável pela sincronização horizontal do sinal de vídeo;

HBLANK, cuja função é enviar os sinais de vazio horizontal ao módulo NTSC; VSYNC, responsável pela sincronização vertical de vídeo; VBLANK, responsável pelos sinais de

vazio vertical; e COLOROUT, saída de 8 bits responsável pela representação das cores na tela.

Outro pino que merece ser mencionado, o ldump, de 4 bits, pode atuar tanto como entrada quanto como saída, e é responsável por tratar os eventos de um tipo especial de joystick fabricado para o Atari, chamado paddle controller, baseado em um capacitor variável conectado a um botão giratório. Embora o suporte a este tipo especial de joystick não tenha sido implementado, este pino foi incluído de modo a facilitar a sua adaptação posteriormente.

Entre os diversos conjuntos de registradores presentes neste módulo, vale destacar os registradores dos objetos da tela, sendo eles: registrador de jogadores, responsáveis por armazenar posições, tamanhos, cores, movimentos e gráficos para ambos os jogadores; os registradores de mísseis, responsáveis por armazenar suas posições e movimentos, além de habilitar a sua utilização; e os registradores da bola, que armazenam a sua posição, cor, movimento e tamanho, além de habilitá-la no jogo.

Além dos registradores citados, há vários outros, responsáveis pelas mais diversas funções desempenhadas pelo módulo TIA, como por exemplo: registradores de sinais de controle de vídeo (VSYNC, VBLANK, etc.); registradores de E/S, responsáveis por receber informações dos joysticks; registradores de cor, que armazenam a cor de cada pixel sendo desenhado na tela; e o registrador de saída de dados, responsável por armazenar os 8 bits de dados a serem enviados para os pinos de saída.

O bloco do contador horizontal é responsável por indexar cada um dos 228 pixels da scanline atual, incrementando a contagem à medida que o pixel corrente tem o seu processamento concluído. Uma vez que a contagem atinja o valor 227, o contador é zerado e o processo se inicia novamente, podendo ser prematuramente reiniciado caso o chip receba um sinal de reset. É interessante observar que pedidos de reset via software precisam sofrer um atraso de 3 ciclos do chip TIA, já que o processador 6507 opera a uma freqüência 3 vezes menor do que este. O seguinte trecho de pseudocódigo ilustra o comportamento do contador horizontal:

para cada pulso de clock faça se (reset) então

hCont = 0;

hContReset[3:1] = 0;

senão

se (hContReset[3]) OU (hCont = 227) então hCont = 0; senão hCont = hCont + 1; fim-se hContReset[3:1] = hContReset[2:0]; fim-se fim-para

A lógica de HSYNC / HBLANK é responsável por verificar se o valor corrente do contador horizontal está em determinada faixa, a fim de habilitar ou não os sinais de sincronização ou de vazio horizontal do vídeo, dependendo do caso.

Os blocos de lógica de pixel têm a função realizar, para cada pixel e objeto da tela, testes baseados nos registradores de objetos, a fim de determinar se determinado objeto da tela deve aparecer naquele pixel sendo processado. Os resultados de todos os testes são enviados a outro bloco lógico, que irá escolher qual objeto exibido tem maior prioridade (no caso de um ou mais objetos se localizarem no mesmo pixel), e colorir o pixel com a cor do objeto selecionado. Na seqüência, os trechos de pseudocódigo que tratam destes blocos são exibidos:

para cada pixel da tela faça para cada objeto faça

se (objeto está no pixel) então define_prioridade_objeto(); fim-se

fim-para fim-para ...

para cada mudança de prioridade faça se (maior_prioridade = player0) então cor_do_pixel = cor_do_player0; senão

... fim-se fim-para

É o bloco de lógica de colisão que verifica se alguma das 15 possíveis colisões entre os objetos da tela ocorreu. Uma colisão é constatada quando mais de um objeto habilitado para colisão se encontra no pixel sendo atualmente processado. Então, o

respectivo bit do latch de colisão é elevado para o nível lógico ‘1’, de modo que o software possa realizar o seu tratamento.

O latch WSYNC é responsável por paralisar o processador até o início da próxima scanline. Conforme já mencionado, este procedimento é necessário para sincronizar o processador com o chip TIA, uma vez que o primeiro está defasado numa razão de 3 em relação ao segundo. Este comportamento pode ser visto no algoritmo a seguir:

para cada mudança em (hCont, wSyncReset) faça se (hCont = 3) então

wSync = 0; senão

se (wSyncReset) E (hCont > 5) então

wSync = 1;

fim-se fim-se fim-para

De modo análogo ao módulo RIOT, o bloco de lógica de controle tem a função de coordenar o funcionamento do módulo TIA a cada pulso de clock. Este bloco trata as requisições de reset, realiza as operações do chip quando o mesmo estiver habilitado, e multiplexa as suas saídas, de modo que os sinais de vídeo possam ser recebidos pelo conversor NTSC.

No documento 2007.1TCC 03111166 0 Eder Santana Freire (páginas 52-56)

Documentos relacionados