sexta-feira, 13 de junho de 2014

Caracteres de 6 bits

O demo BR?-TK-HUE! foi um excelente exercício de programação assembly no TK90X, que me rendeu aprendizados preciosos. Se prestar atenção na fonte dos caracteres rolando (scroll) na tela em magenta, pode-se perceber que é mais estreita que o padrão do BASIC.


A fonte da ROM do TK90X - gravada a partir do endereço 15616 (#3D00) - é constituída por caracteres de 8×8 pixels. A matrix representando os pixels é armazenada em 8 bytes, sendo que a posição horizontal é dada pelos bits 0 a 7 e a vertical, pelos bytes 0 a 7.

Bit 7 6 5 4 3 2 1 0
Sub-linha 0 Byte 0 0 0 0 0 0 0 0 0
Sub-linha 1 Byte 1 0 1 1 1 1 1 0 0
Sub-linha 2 Byte 2 0 1 0 0 0 0 1 0
Sub-linha 3 Byte 3 0 1 0 0 0 0 1 0
Sub-linha 4 Byte 4 0 1 1 1 1 1 0 0
Sub-linha 5 Byte 5 0 1 0 0 0 1 0 0
Sub-linha 6 Byte 6 0 1 0 0 0 0 1 0
Sub-linha 7 Byte 7 0 0 0 0 0 0 0 0

Os caracteres usados na rotina de scroll do demo são mais estreitos, com 6×8 pixels. Se fosse criar uma nova fonte para os 96 caracteres ASCII, seriam necessários 768 bytes de RAM. Julguei este consumo de memória excessivo e resolvi usar outra abordagem. Na verdade, a técnica descrita a seguir foi baseado no capítulo 6 do livro "Machine code sprites and graphics for the ZX Spectrum: a complete guide to sprite coding" de John Durst (acessível neste link).

Para converter um caractere de 8 para 6 bits, a solução é óbvia: basta descartar dois bits, o que pode ser feito facilmente com as instruções de deslocamento e rotação de bits do Z80. Como os caracteres do TK90X possuem espaçamento dos dois lados, poderia ser removido um deles, o bit 0 ou 7. Faltaria então remover somente mais um bit mas, qualquer que seja, acaba descartando parte do caractere. No livro citado, sugere-se remover o bit 4 que, especialmente para letras maiúsculas, não deforma tanto os caracteres, exceto as letras I, T e Y:


Observa-se ainda que os algarismos também ficam bons, exceto por 1 que fica assimétrico e 7, que é cortado.

Se for removido o bit 1, as letras minúsculas ficam melhores, exceto por b:


Além disso, este é o melhor formato possível para o Y, embora fique meio baixinho. A solução neste caso, não muito elegante, é alterar diretamente um dos bytes desta letra.

A remoção do bit 6 resulta formato melhor para vários dos símbolos, os algarismos 1 e 7 e as letras I e b:


Finalmente, 0 e N, por terem uma linha oblíqua, somente fica bons se for removido o bit 2:


Elaborei a sub-rotina MakeChr6, disponível no código fonte "BR-TK-HUE-P2.asm", que faz um modelo de caractere 6×8 a partir do modelo da ROM, descartando o bit 7 e um outro bit, a escolher entre 1, 2, 4 ou 6. Somente no caso da letra Y é feita uma modificação adicional no byte 1 para aumentar sua altura. O resultado fica quase perfeito:


a não ser pelos símbolos & e ©, mas como não são tão importantes, foram deixados como estão. Na figura, a parte superior mostra os caracteres processados pela rotina e, na inferior, os originais da ROM. Na minha opinião, os caracteres 6×8 são mais agradáveis aos olhos.

A título de esclarecimento, caracteres de dimensão 6×8 não são algo inédito, pois há as bem conhecidas rotinas que imprimem de 40 a 42 colunas. O que considero como algo novo é o fato de não usar uma matriz extra de caracteres, economizando centenas de bytes de RAM.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.