Apesar do TK90X ser um clone muito próximo do ZX Spectrum, capaz de rodar grande parte dos programas do original britânico, sofre algumas incompatibilidades em hardware e em software.
Um dos problemas foi encontrado no OTLA, um projeto que permite carregamento de programas a velocidades muito altas em computadores clássicos. O carregamento rápido simplesmente não funciona no TK90X. Fabio Belavenuto resolveu investigar a fundo e chegou à conclusão que se devia à diferença de comportamento da porta 254.
O que se conhece por porta 254 é o endereço de entrada/saída destinado à comunicar-se com o ULA do TK90X. No modo de entrada serve para ler o teclado e o estado do sinal EAR oriundo do gravador cassete. As funções de cada bit desta porta são:
Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
Função como entrada (leitura) | não usado | EAR | não usado | teclado | ||||
Função como saída (escrita) | não usado | não usado | não usado | som | MIC | cor da borda |
Conectores EAR e MIC na parte traseira do TK90X. Foto: Leonardo Suárez. |
Uma das incompatibilidades conhecidas é a entrada EAR no bit D6. No ZX Spectrum este bit tem o mesmo valor que o último enviado para a saída MIC (bit D3), que é normalmente 0. No TK90X o circuito de entrada EAR é seguido por um amplificador com um transistor em configuração emissor comum que, na ausência de um sinal de áudio, não conduz e deixa o bit D6 estável no valor 1. Por isso programas que assumem este bit como sendo 0 simplesmente não funcionam. Existem soluções de hardware propostas para contornar este problema ou, alternativamente, modificar os próprios programas, como fiz com o jogo Samurai Warrior.
Menu do jogo que não funciona devido à porta 254 incompatível |
A terceira incompatibilidade foi descoberta recentemente, durante as investigações feitas por Fabio Belavenuto sobre OTLA, que não funciona no TK90X. O carregamento era interrompido assim que certas cores de PAPER eram colocados no vídeo. O Fabio descobriu que o carregamento rápido não funcionava por causa do bit D5 estar flutuante, isto é, não conectado à nada.
A princípio isto parece não afetar nada, pois os resistores pull-up do barramento de dados obrigam qualquer bit flutuante a assumir valor 1. Entretanto o ULA está sempre varrendo a região da RAM com dados de vídeo, para criar a imagem de TV em tempo real e, em certas condições, acaba deixando um sinal residual no barramento. Este sinal acaba "contaminando" o bit D5 flutuante. Os outros bits estão conectados e não sofrem do problema, a não ser que o diodo D1 não esteja na placa do TK90X, que deixaria o bit D7 flutuando.
A porta 254 pode pegar um resíduo de sinal deixado pelo ULA, quando este leu um valor de atributos situados nos endereços 22528 a 23295 (#5800 a #5AFF). Os atributos são valores de cores associados a cada conjunto de 8×8 pixels, com os seguintes nomes: INK, PAPER, BRIGHT e FLASH. Todos estes atributos são armazenados dentro de um byte, com a seguinte estrutura:
Se o bit mais significativo do PAPER (D5) for 0, o ULA pode acabar escrevendo este valor quando é feita leitura da porta 254. As cores de PAPER com esse bit em nível baixo são preto, azul, vermelho e magenta. Caso o diodo D1 esteja ausente, o bit D7 também pode ser afetado se o FLASH for 0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Atributo | FLASH | BRIGHT | PAPER | INK |
Se o bit mais significativo do PAPER (D5) for 0, o ULA pode acabar escrevendo este valor quando é feita leitura da porta 254. As cores de PAPER com esse bit em nível baixo são preto, azul, vermelho e magenta. Caso o diodo D1 esteja ausente, o bit D7 também pode ser afetado se o FLASH for 0.
Para saber qual o comportamento da porta 254 de seu computador, basta digitar e rodar o seguinte programa BASIC.
10 LET b=128: PRINT AT 10,0;
20 LET i=IN 254
30 IF i>=b THEN PRINT 1;: LET i=i-b: GOTO 50
40 PRINT 0;
50 LET b=INT(b/2): IF b THEN GOTO 30
60 GOTO 10
Na tela aparecem os 8 bits que são lidos da porta 254. No emulador após digitar o programa e rodar com LIST 10: GOTO 10, aparece na tela:
Os bits D0 a D4 permanecem 1 a não ser que uma tecla seja pressionada. O bit D6 fica estável em 0 e os bits D5 e D7 em 1. Este comportamento independe do valor de atributos da tela.
No meu TK90X, observei que o valor do D6 é 1, como já era esperado. Os valores de D5 e D7 dependem dos atributos presentes no vídeo, pois no meu equipamento já havia removido o diodo da placa. Se ambos os bits estão em 1 (FLASH 1 e PAPER>=4) para todos os atributos da tela, a leitura da porta 254 se mantém estável, com todos os bits igual a 1.
Porém quando FLASH for 0, o bit D7 lido oscila e de vez em quando aparece valor 0. Coisa semelhante ocorre quando PAPER<4, mas nesse caso é o bit D5 que oscila.
Agora fica possível entender o motivo do OTLA não funcionar. Este programa considera não somente o bit D6 (EAR) da porta 254, mas do byte inteiro. Com isto, qualquer oscilação acaba perturbando a leitura.
Convido os leitores a digitarem e rodarem o pequeno programa acima, para relatar os resultados aqui nos comentários.
Flávio, digitei aqui e o resulatdo foi: 11111111
ResponderExcluirA propósito, a listagem correta é a da imagem do emulador, certo ?
Pergunto isso pois há divergência na linha 30.
Valeu pelo aviso, José Roberto, corrigi a listagem.
ExcluirEm relação ao teste, você chegou a variar o PAPER? Em especial os valores entre 0 a 3 devem fazer com que o bit 5 oscilem.
Ahh...correto, com esses valores de paper, o bit oscilou entre 0 e 1.
ExcluirValeu pela explicação !
Aqui o teste em outro TK: 00111111
ResponderExcluir