terça-feira, 27 de maio de 2025

Matrix - Raining Code para o TRS-Color

Tempos atrás, depois de fazer o Raining Code para o MSX, portei para o ZX81 e para o TRS-80, o que ocorreu com certa facilidade, porque todos utilizam o Z80 como processador e, assim, só precisava fazer as devidas adaptações para o hardware de vídeo.

Aí pensei: fazer esse programa para o TRS-Color seria muito legal, porque ele tem um modo de alta resolução (256x192), como o MSX, em duas cores (verde e preto). Além disso, até onde eu sei, ninguém havia feito ainda, ao menos em alta resolução. 

Só que minha falta de intimidade com o assembly 6809 foi, há dois anos atrás, uma barreira insuperável e acabei engavetando o projeto. Na época tentei portar o código, traduzindo as instruções e endereços do Z80 para o 6809. Minha abordagem do problema não ajudou, pelo contrário, apenas complicou.

Recentemente, resolvi retomar e cheguei à conclusão que a única maneira de avançar com o programa era retroceder. Assim, em vez de tentar portar o código do Z80 para o 6809, resolvi recomeçar do zero, de maneira que ia escrevendo o código aos poucos, ao tempo que ia aprendendo melhor o assembly do 6809. Depois de uma certa relutância inicial, meu cérebro finalmente sintonizou comunicação com o 6809 e a partir daí a programação fluiu. Tomei como lição que tentar traduzir a implementação diretamente do Z80 para o 6809 é um equívoco e que o melhor é focar no algoritmo, ou seja, partir de um nível de abstração mais elevado, para daí iniciar a nova implementação. Isso permite o uso mais adequado das peculiaridades de uma linguagem sem a interferência das técnicas de implementação da outra.

O processo

Comecei "importando" os caracteres alfanuméricos e katakana de uma ROM japonesa do MSX. Infelizmente não arrumei uma maneira de fazer isso diretamente, porque não há compatibilidade de arquivos entre o MSX e o TRS-Color, tampouco encontrei maneira de importar os dados via emulador. O jeito foi fazer à mão. Janela do openMSX de um lado, com o meu editor (não publicado) fornecendo as informações byte a byte dos caracteres, janela do Xroar do outro, anotando os dados em linhas data no Color Basic. Com muita paciência fui fazendo aos poucos e até que finalmente tinha o resultado na tela:

 

Resultado do teste dos caracteres na tela do Color, no modo RG6.

  

Minha ferramenta de edição no MSX, de onde obtive os dados dos caracteres.

Dados dos caracteres em hexadecimal. 

Fiz ainda um pequeno ajuste, já que os caracteres do MSX são justificados do lado esquerdo e apareciam "colados" com a margem esquerda da tela do Color, o que me incomodou, esteticamente. A solução foi um deslocamento de bits para a direita. O BASIC não tem instrução de deslocamento de bits, é verdade, mas a matemática básica salva: para deslocar bits de um número binário para a direita é só tomar o valor inteiro do número dividido por dois. Uma pequena rotina deu conta fazer isso com os 736 bytes dos 92 caracteres que utilizei.

Depois foi questão de elaborar o programa em si para manipular os dados na tela. Fiz isso utilizando o Disk Edtasm 6309, ferramenta nativa do Color, como montador para o 6809.

Todos os efeitos das outras versões foram reproduzidos: cada coluna tem um delay para iniciar a descida dos caracteres e o seu apagamento; quatro velocidades diferentes para a escrita e apagamento dos caracteres, sorteadas a cada reinício de cada coluna; e finalmente, caracteres já escritos são sobrescritos por caracteres aleatórios (seriam "patches" na Matrix?). Para destacar o primeiro caractere que vai descendo pela tela em cada coluna, utilizei o velho truque deslocamento de bits para gerar o caractere bold. Poderia ter utilizado os caracteres bold pré-processados, mas acabei programando a geração dos mesmos on the fly.

Acredito que o resultado ficou muito bom, um pouco atrás apenas da versão para MSX, cuja coluna descendente tem 3 tons de verde além do caractere branco como destaque.

DownloadMatrix-TRS-Color.dsk

  



The Matrix has you.


quarta-feira, 7 de maio de 2025

Demo do Color Clube Brasil - TRS-Color

Fazia tempos que não fazia nada para o Color. Desde o Color Poker, mergulhei profundamente no universo do Z80 e fiz um bocado de coisas no MSX, algumas outras no TK-85 (ZX81) e ainda um par de coisas para o TRS-80.

Há alguns anos eu adquiri um CP-400, igual àquele que foi o primeiro computador que tive, lá em 1985. Mas acabei não usando muito, porque começou a apresentar um problema de vídeo. Até que esses dias resolvi finalmente arrumar e, ele novo de novo, de tão bom que ficou me animou a fazer alguma coisa para rodar nele.

Inspirado no efeito de abertura dos episódios do canal do 8-Bit Guy, resolvi fazer algo do gênero para o Color, que na realidade já tinha feito no MSX e depois para o TK 85 há algum tempo. 

Primeiro fiz uma tela em homenagem ao Clube Color Brasil (grupo do Facebook) utilizando o modo semigráfico (e bastante colorido) do Color para poder utilizar o efeito em cima dela. Ou melhor, na realidade, a tela vai surgindo a partir do efeito. Em seguida, joguei mais um efeito de troca de cores e finalmente um scroll up para recomeçar o efeito inicial. Olha aí:

 


 

O Assembly 6809

Apesar da minha experiência com o Color BASIC do TRS-Color, o assembly da CPU Motorola 6809 era para mim um mistério. Mas sempre tive muita curiosidade, até para conhecer as diferenças em relação ao assembly Z80. Então lá fui eu apreender "uma nova língua". O montador que uso é o Disk EDTASM++ (ferramenta nativa).  A vantagem de usar esse montador é que ele é muito similar ao EDTASM para o TRS-80, no qual já tenho alguma experiência, já que fiz versões do Matrix e do Doom Fire para TRS-80 (todos disponíveis aqui no blog).

Para o assembly, meu guia tem sido o didático TRS-80 Color Computer Assembly Language Programming, do Willian Barden Jr. Utilizei também outros materiais esparsos, de maior profundidade técnica, que me ajudaram a compreender como o SAM e o VDG interagem e, especificamente, como é feita a seleção dos modos gráficos em baixo nível. Se alguém for se aventurar, não se esqueça de que além de setar os registradores do modo gráfico escolhido, é preciso também definir o offset das páginas gráficas. De nada.

A diferença entre o assembly do 6809 para o do Z80 é substancial, tendo o 6809 mais recursos e flexibilidade. Para além do conjunto de instruções e sua sintaxe, levei um tempo para me acostumar com a notação que diferencia o endereçamento direto e indireto e com o prefixo obrigatório "$" para hexadecimal, que nunca utilizei com o Z80. Pode parecer bobagem, mas de início essa diferença de notação me dificultava bastante a leitura do que estava na tela. Meu cérebro, desde os 15 anos, estava acostumado com endereçamento indireto indicado de forma muito clara com parênteses, somado ao fato de que eu uso o sufixo "H", e não o prefixo "$", para notação de hexadecimais.

Mas enfim, o programinha simples serviu muito bem como iniciação. Logo faço algo um pouco mais complexo.

Download da imagem do disco: CCB-Demo.dsk

Para carregar: LOADM "CCBDEMO.BIN"

Para executar: EXEC

Para sair: segure a tecla BREAK 

Matrix - Raining Code para o TRS-Color

Tempos atrás, depois de fazer o Raining Code para o MSX, portei para o ZX81 e para o TRS-80, o que ocorreu com certa facilidade, porque tod...