Telas do speccy no MSX – parte 1

tbzscmcb-1_abertura.png

Há algum tempo, lá pelo  final de 2014 para ser mais preciso, resolvi converter telas do ZX Spectrum (ou speccy) para o MSX. Então estudei sobre como era a organização da memória de vídeo deles, como eram codificadas as cores, criei uma rotina de visualização e aí me empolguei e baixei algumas telas do ZX-Art para fazer algo “legal”.

Mas meu algo “legal” ficou tão complicado de implementar que a inspiração acabou antes de conseguir concluí-lo, daí deixei tudo de lado por um tempo e recentemente resolvi mexer no código para pegar uma rotina e aproveitei para, finalmente, fazer algo prático com ela — mas nada de “legal” desta vez. 🙂

Esta primeira parte não tem código, é apenas um resumo sobre como é a organização das memórias de vídeo nos dois computadores, a diferença nas paletas de cores e qual minha solução para compatibilizá-las.

A organização da memória de vídeo

Se o hardware é tão parecido não deve ser complicado converter as telas, certo? Mais ou menos! Ambos os computadores possuem a mesma resolução (256×192), o mesmo número de cores (16), codificam a tela em tabelas separadas e acabaram as semelhanças, todo o resto é diferente…

Tabelas de padrões

Em ambos os casos 1 byte codifica um conjunto horizontal de 8 pixels, cada bit 1 indica o uso de uma cor e cada bit 0 o de outra (isto é definido pela tabela de atributos). Considerando uma resolução de 256×192 pixels a tabela de padrões ocupará 6144 bytes — (256÷8)·192 — da memória RAM ou VRAM. E a diferença está justamente na forma como elas estão organizadas.

No ZX Spectrum há 192 blocos de 32 bytes que correspondem a cada uma das linhas da tela — os pixels das colunas de 0 a 7 no 1º byte, de 8 a 15 no 2º byte e seguindo assim até as colunas 248 a 255 no 32º byte.Mas as linhas não estão organizadas de forma sequencial, a tela está dividia em três grandes áreas com 64 linhas — começando em 0, 64 e 128 — e em cada terço as linhas são indexadas da seguinte forma: 0, +8, +16, +24, +32, +40, +48, +56, +1, +9, +25, +33, +41 etc e terminando com as linhas +39, +47, +57 e +63. Confuso? Um pouco.

No blog do Dean Belfield há uma explicação bem mais detalhada sobre como é o leiaute da memória de vídeo. Ele foi justamente criado para facilitar, entre outras coisas, o desenho dos caracteres na tela já que o speccy não tem um modo texto.

No lado do MSX a tela está dividida em 768 blocos com tamanho de 8×8 pixels, eles ocupam 8 bytes cada um e estão dispostos da esquerda para a direita e de cima para baixo. No 1º octeto estão os pixels de (0,0)-(7,7), no 2º os de (8,0)- (8,7), no 33º os de (0,8)-(7,15) e no 768º os pixels de (248,184)-(255,191).

Esta organização em quadradinhos aliada com o fato de cada um deles também ser indexado pela tabela de nomes é utilizado pelo VDP para implementar o modo texto da SCREEN 1.

Tabelas de atributos

A função dela é indicar que cores utilizar na tela para cada bit 0 ou 1 da tabela de padrões.

A tabela de atributos do ZX Spectrum tem 768 bytes que colorem um conjunto de 8×8 pixels com uma cor de frente (ink) para bit 1, uma de fundo (paper) para bit 0 e ainda define atributos para intensidade da cor de frente (bright) e a alternância periódica dos atributos de frente e fundo (flash):

7 6 5 4 3 2 1 0
flash bright paper ink

Ela está disposta da esquerda para a direita e de cima para baixo.

No MSX ela é bem maior, tem 6144 bytes, e cada entrada tem a função de colorir um conjunto de 8 pixels correspondente (de mesmo índice) da tabela de padrões com uma cor de frente (foreground) para o bit 1 e uma de fundo (background) para  o bit 0:

7 6 5 4 3 2 1 0
foreground background

Ou seja, a diferença é bem mais do que reorganização na ordem dos dados, a informação armazenada é diferente — só lembrando que não existe nada parecido com o flash nos MSX.

(¹) Quase todos os modos de vídeo monocromáticos são codificados assim.

As paletas de cores

Ambos os computadores dispõe de 16 cores² mas isto não significa que necessariamente elas sejam as mesmas cores. O ZX Spectrum tem um conjunto 8 cores produzidas de um RGB de 3 bits (na verdade GRB) e com um bit extra para sinalizar o aumento da luminosidade (“bright”) apenas nos bit 1 — algo que parece um pouco com as cores do modo texto no padrão CGA só que sem o marrom! 🙂

Cor L % Nome L % Nome
0 0 000 preto 1 0000 preto
1 0 001 azul 1 001 azul claro
2 0 010 vermelho 1 010 vermelho claro
3 0 011 magenta 1 011 magenta claro
4 0 100 verde 1 100 verde claro
5 0 101 ciano 1 101 ciano claro
6 0 110 amarelo 1 110 amarelo claro
7 0 111 cinza 1 111 branco

No MSX as 16 cores disponíveis correspondem a um conjunto definidos pela Texas Instruments no projeto do VDP:

Cor Nome  Cor Nome
0 t r a n s p a r e n t e³ 8 vermelho
1 preto 9 vermelho claro
2 verde 10 amarelo ouro
3 verde claro 11 amarelo claro
4 azul escuro 12 verde escuro
5 azul 13 magenta
6 vermelho escuro 14 cinza
7 ciano 15 branco

Exceto pelo preto e o branco as demais cores não tem uma correspondência direta nos dois sistemas, isto é, não são os mesmos tons de amarelo, azul, verde ou vermelho e ainda faltam tons adicionais para ciano e magenta.

Aliás fica fácil notar as diferenças quando se comparadas as telas de carregamento de um jogo do ZX Spectrum:

tbzscmcb-1_chase_hq_speccy

Com a mesma tela “convertida” para a versão do MSX:

tbzscmcb-1_chase_hq_msx

Repare que alguns detalhes foram simplesmente removidos. Aliás, poucas são as conversões onde se teve o trabalho de se utilizar as cores disponíveis no MSX ou mesmo uma tabela de atributos maior.

Criando novas cores

E já que as cores não são iguais — diria que por muito pouco são quase parecidas — resolvi transcrever as cores do ZX Spectrum em um MSX utilizando cores sólidas quando o bit de bright está desligado e uma mescla de cores (alternando cores nas linhas pares e ímpares) quando ligado.

tbzscmcb-1_paleta-de-cores

Além de produzir o segundo tom de magenta e de ciano este truque também preservou a relação entre tons claros e escuros da paleta original do ZX Spectrum e o resultado, após a conversão, é  algo bem próximo com a versão original.

tbzscmcb-1_chase_hq

Ou ao menos contendo a mesma quantidade de cores. 🙂

(²) Na verdade ambos tem na prática 15 cores e não 16.

(³) A cor transparente tem a função mesclar o sinal gerado pelo VDP com o de uma fonte externa de vídeo (câmera de vídeo, outro VDP etc) e na ausência desta é usada a mesma cor da borda.

E por enquanto…

Aliás, com tantas diferenças na organização da memória de vídeo, nos atributos e até mesmo nas cores disponíveis fica-se surpreso com a quantidade de jogos convertidos diretamente do ZX Spectrum para o MSX — no caso conversões literais sem uso dos recursos da máquina destino — e, ao mesmo tempo, fica fácil entender a baixa qualidade de alguns deles.

Na próxima parte vou tratar da estrutura do arquivo que contém as telas (o SCR), como carregá-lo em MSX-BASIC e como fazer o mesmo em assembly com as rotinas de acesso ao disco do MSX-DOS.

Até!

Anúncios

2 comentários sobre “Telas do speccy no MSX – parte 1

  1. Pingback: Telas do speccy no MSX – parte 2 | giovannireisnunes

  2. Pingback: Telas do speccy no MSX – parte 3 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s