sábado, 21 de abril de 2012

Incompatibilidades da porta 254

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 outra incompatibilidade conhecida está relacionada com o bit D7 que, no TK90X, tem valor 0 devido ao famoso diodo D1 que o liga ao pino 10 do ULA. No Spectrum o valor deste bit é 1. Para aumentar o grau de compatibilidade deve-se remover este diodo, providência esta que já vem tomada de fábrica para o TK95.

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:

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.

4 comentários:

  1. José Roberto - jrr_tk9022 de abril de 2012 12:13

    Flávio, digitei aqui e o resulatdo foi: 11111111
    A propósito, a listagem correta é a da imagem do emulador, certo ?
    Pergunto isso pois há divergência na linha 30.

    ResponderExcluir
    Respostas
    1. Valeu pelo aviso, José Roberto, corrigi a listagem.

      Em 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.

      Excluir
    2. José Roberto - jrr_tk9022 de abril de 2012 13:19

      Ahh...correto, com esses valores de paper, o bit oscilou entre 0 e 1.
      Valeu pela explicação !

      Excluir
  2. José Roberto - jrr_tk9022 de abril de 2012 12:36

    Aqui o teste em outro TK: 00111111

    ResponderExcluir

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