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.