Sistema gráfico - Estrutura e funcionamento
Memória - DMA - Planos e elementos gráficos - Outras funcionalidades
O VDP tem um espaço de endereçamento próprio dentro da área de memória do CPU. Este espaço está dividido em partes de 8 bytes, das quais 4 são utilizadas para a programação e controlo do VDP (ports Data e Control), e as restantes para guardar a posição do raio da televisão e para comunicação com o PSG.
Como foi referido no parágrafo anterior, o VDP é programado a partir das ports Data e Control. A port Data faz operações de leitura e escrita nas memórias controladas pelo VDP e a port Control programa os 23 registos do VDP e lê um registo especial - registo de estado - que, como o nome indica, permite observar vários estados do VDP e do que está a ser mostrado no ecrã.
____________________________
O sistema gráfico comporta os seguintes tipos de memória RAM:
VRAM (VIDEO RAM) O VDP está ligado a 64 Kbytes de Video RAM. Esta pode ser acedida como 65535 bytes ou como 32768 words de 16 bits através da port Data. Serve para guardar toda a informação gráfica, desde dados dos padrões e dos planos de scroll a tabelas de nomes de sprites e planos.
CRAM (COLOUR RAM)
O VDP contém um chip de RAM de 64x9 bits chamado de CRAM. É acedido como 64 words de 16 bits através da port Data. Isto permite um total de 512 cores, com a possibilidade de 64 estarem na CRAM, o que na prática corresponde a 4 paletas de 16 cores num dado momento no ecrã. A primeira cor de cada paleta (cor 0) é transparente ou seja, não é desenhada.
Outro chip de memória dentro do VDP, com um espaço de 40 words de 10 bits. É acedido como 40 words de 16 bits. Armazena um máximo de 20 valores diferentes de scroll vertical (a velocidade Y de um dado elemento do plano) para cada um dos planos de scroll A e B.
____________________________
O VDP pode mover informação a alta velocidade da memória do CPU para a VRAM, CRAM e VSRAM em vez do CPU, tirando-o fora do bus e fazendo ele próprio o acesso à memória, processo esse chamado de DMA. Existem 3 modos de acesso DMA (e aqui VRAM designa tanto a VRAM como a CRAM e a VSRAM):
- Memória para VRAM -> transferência de dados que se encontram no espaço de endereçamento do CPU para a VRAM;
- VRAM Fill -> escreve repetidas vezes um dado valor em vários endereços sequenciais da VRAM;
- VRAM Copy -> copia dados contidos na VRAM
O CPU pára durante este tipo de acesso, mas o Z80 continua a funcionar enquanto não precisar de aceder ao espaço de memória do 68K.
O DMA é bastante rápido durante o processo de Blanking (período em que nada é actualizado no ecrã), aproximadamente o dobro da velocidade de acesso do 68K, mas durante o período em que o o ecrã está a ser actualizado, chamado de Active Display Period, a velocidade é a mesma que a do CPU.
____________________________
Como já tinha sido referido, o VDP controla 4 planos: BACKGROUND, SCROLL A/WINDOW, SCROLL B, e SPRITE. Em cada um destes planos são desenhados os elementos gráficos do jogo, cuja unidade básica é chamada de padrão. Cada padrão corresponde a um bloco de 8x8 ou 16x16 (modo de interlace 2) pixels com 15 cores (na verdade são 16 mas, como já foi referido, a cor 0 é transparente). Estes podem ser armazenados em qualquer local da VRAM e o seu tamanho varia entre 32 e 64 bytes, dependendo se ele é um bloco de 8x8 ou de 16x16.
As imagens a seguir, retiradas do jogo Sonic 3 recorrendo ao emulador Genecyst, são um exemplo que mostra como estão definidos os planos. Note-se que o plano Window não é mostrado aqui. Isso é referido mais adiante. O plano Background corresponde ao fundo preto das imagens.
Planos de Scroll
Existem 2 planos de scroll, o A e o B, e um outro chamado Window. Cada um dos planos é maior do que a área visível, o que permite a sua movimentação nas coordenadas X e Y. A movimentação nas coordenadas X é feita com base numa tabela guardada em memória chamada de tabela de scroll horizontal e a movimentação nas coordenadas Y é feita com base nos valores da VSRAM. A diferença entre os valores de scroll dos dois planos A e B cria efeitos de paralaxe, ou seja, oferece um efeito 3D de movimento em que o que está mais longe se move a uma velocidade menor do que o que está mais perto.
No exemplo anterior, o plano B era movimentado a uma velocidade menor que os planos A e Sprite, ajudando assim a criar a ilusão de movimento e o efeito de paralaxe.
Os três planos são geridos através de um array bi-dimensional de células (cada uma com um tamanho variável), ou words de 16 bits. Nestes campos são definidos o nome do padrão, a sua rotação vertical e/ou horizontal, a paleta de cores utilizada e a prioridade.
E o que é a prioridade? Esta indica qual a ordem de precedência da célula em relação às outras (à frente ou atrás de) ao ser desenhada. A precedêcia é esta, por ordem crescente: Background Plano B (baixa prioridade) Plano A (baixa prioridade) Sprite (baixa prioridade) Plano B (alta prioridade) Plano A (alta prioridade) Sprite (alta prioridade)
Um bom exemplo disto pode ser encontrado nas imagens anteriores, em que o plano Background pode ser visto atrás dos restantes planos como um fundo preto, e em que o plano B é utilizado como cenário de fundo para a acção do jogo, enquanto que o plano A, desenhado à frente destes dois, é o terreno em que a personagem do jogo se desloca. Também é visível a diferença de prioridade entre as folhas e o texto do plano Sprite e o resto dos elementos, o que indica que estes elementos têm uma prioridade mais alta.
O plano Window é um pouco diferente dos outros dois. Ele nem sempre é utilizado ao longo dos jogos (como pôde ser visto no exemplo dado) e pode ser considerado como um substituto do plano A em certas condições. Ele tem precedência sobre o plano A e este não aparece onde o plano Window estiver localizado.
O plano Background é utilizado apenas para cores de fundo.
Sprite
Ao contrário dos planos anteriores, o plano Sprite não ocupa todo o ecrã. Aliás, existem certas condições em que o VDP pode ser forçado a parar de desenhar sprites. Uma dessas condições é a passagem do nº limite de sprites no ecrã (64 na resolução de 320x224 e 80 na de 320x240). Outras condições são o nº limite de sprites numa linha do ecrã ou ainda o nº limite de pixels referentes a sprites na mesma linha, limites que também mudam consoante a resolução. Tudo isto se deve a limitações de memória.
Toda a informação dos sprites é guardada numa região da VRAM chamada tabela de atributos de sprites. Esta tabela tem um tamanho de 640 bytes e cada entrada tem 8 bytes. Ela funciona como uma lista ligada, que começa no sprite 0, em que um dos campos da tabela, o campo link, indica o index do próximo sprite a ser desenhado. Se o link estiver a 0 então este é o último sprite a ser desenhado. Pode ocorrer que alguns dos sprites não façam parte da lista, apesar de estarem incluídos na tabela.
Os sprites estão posicionados num espaço virtual de 512x512 pixels. A área visível começa na posição 128x128 e tem um tamanho igual à resolução utilizada (256x224 ou 320x224). Sendo assim, é possível que haja sprites que estão fora da área visível total ou parcialmente, o que é conveniente para os programadores já que podem mandar desenhar o sprite todo e não apenas certas partes consoante o necessário. Os sprites que estão localizados fora da área visível também entram nas contas das condições de paragem do VDP.
____________________________
Shadow e Hi-light
Estes dois modos permitem um maior número de cores no ecrã. Estas cores adicionais são escolhidas com base na prioridade dos planos ou sprites e quando certos pixels de um sprite estão por cima de pixels pertencentes a um plano. O Hi-light corresponde a ter os valores de uma paleta divididos por 2 e adicionados a um branco de meia intensidade (valores RGB 128,128,128), enquanto que o Shadow equivale a dividir as cores de uma paleta por 2.
Existem 2 modos de interlace. O modo 1 é o modo de interlace básico, com o tamanho dos padrões a manter-se nos 8x8, mas apenas 1 em cada 2 linhas são desenhadas. No modo 2, também só 1 em cada 2 linhas é desenhada, mas o tamanho dos padrões aumenta para 16x16, o que na prática se verifica por um aumento da resolução para o dobro. Este 2º modo apresenta alguns problemas ao ser utilizado na resolução de 320x240 do sistema PAL.
Detecção de colisões
No registo de estado existe um bit que devolve o valor 1 quando existem pixels não-transparentes de sprites diferentes que estão a ocupar o mesmo espaço. Isto é utilizado por poucos jogos, já que nos jogos mais recentes existem vários sprites no ecrã que "colidem" uns com os outros, o que faz com que seja preferível utilizar a detecção de colisões por software.
Rotação horizontal e vertical
Nas definições de cada padrão, seja ele de um plano ou de um sprite, existe a possibilidade de fazer uma rotação de 180º em qualquer um dos planos. Esta funcionalidade permite guardar espaço em memória, sendo que por exemplo, no caso de um novo padrão ser uma cópia simétrica de um outro que já está a ser utilizado, basta definir na tabela de sprites ou de plano que o sprite a ser mostrado num dado sítio é um que já lá está, mas com o valor dos bits de rotação horizontal e/ou vertical diferentes.
|