terça-feira, 1 de maio de 2012

Temporização de vídeo do TK90X (parte 2)

Em continuação à postagem anterior, darei instruções de uso do programa de teste e alguns resultados que obtive. 


Instruções

Após carregamento, o próprio programa fornece algumas instruções de uso. Para sair dessa tela, basta pressionar alguma tecla. Será então pedida a frequência de clock do computador sob teste. Entre o valor 3.575611 para o TK90X, 3.5 para ZX Spectrum de 16 ou 48 kB e Pentagon e 3.54690 para Spectrum de 128 kB.

O programa entrará na tela com a rotina de temporização propriamente dito. Como já foi explicado, a rotina aguarda por uma interrupção mascarável com a instrução HALT, define a cor da borda como vermelha e aguarda um intervalo de tempo antes de mudar a borda para ciano. A aparência ficaria como na tela abaixo, tirado do emulador Fuse.


Counter refere-se ao número de instruções NOP empregados para definir a pausa. Seu valor pode ser aumentado em diferentes passos através das teclas Q, W e E, ou diminuído apertando A, S e D. Delay é o intervalo de tempo entre as duas instruções OUT que definem a cor da borda, isto é, o período em que a borda permanece vermelha. O delay é medido em número de estados T (recíproco da frequência de clock do Z80) e em microssegundos (µs, milionésimos de segundo).

Ou aumento do delay faz com que a parte vermelha da borda aumente, exceto quando ultrapassa o período das interrupções (16667 µs para TK90X, 20000 µs para Spectrum) em que ocorrerá forte cintilação (quem tem predisposição à epilepsia deve tomar cuidado!).

Alguns resultados
Teste 1: zona oculta do topo da tela

Há um tempo inicial durante a geração do quadro de imagem que não é visível na tela da TV. Para medir este tempo, o melhor é ir diminuindo o delay para fazer o vermelho da borda diminuir, até sobrar a menor parte visível. No emulador, sobra somente um pedaço vermelho no canto superior esquerdo (emulação do Spectrum 48):


Entretanto na vida real a coisa não é tão simples assim, pois o tubo de TV apresenta uma geometria curva:

Uma leve linha vermelha meio cintilante aparecia na imagem, porém não consegui registrar com a minha câmera fotográfica (puxa, agora que eu vi que aparece o reflexo da luz entrando pela sacada). Eu acredito que o tamanho dessa zona oculta dependa do televisor empregado. A propósito, o meu é um Philco TP-1454 com tubo CRT de 16 14 polegadas.
A tabela abaixo sumariza os resultados obtidos no emulador e no TK90X real:


Spectrum 48 (Fuse)
Spectrum 48 NTSC (Fuse)
Spectrum 128 (Fuse)
Pentagon 128 (Fuse)
TK90X
Clock/MHz
3.5
3.5
3.5469
3.5
3.575611
Counter
2006
662
1966
2897
1398
Delay/T-states
8043
2667
7883
11607
5611
Delay/µs
2298.0
762.0
2222.5
3316.3
1569.2

Teste 2: última posição da borda acima da tela principal
Neste teste ajustou-se o delay na última posição à direita visível. Um aumento pequeno no delay após esta posição não é visível, pois ultrapassa o limite da margem direita. A figura do emulador e a foto da tela do TK90X seguem abaixo.


Fica evidente que o espaço acima da área principal da tela é bem pequena no TK90X, portanto acaba inviabilizando o funcionamento do programa como o Rotatrix, que a usa para exibir efeitos.


Os resultados obtidos estão sumarizados na tabela abaixo.

Spectrum 48 (Fuse)
Spectrum 48 NTSC (Fuse)
Spectrum 128 (Fuse)
Pentagon 128 (Fuse)
TK90X
Clock/MHz
3.5
3.5
3.5469
3.5
3.575611
Counter
3333
1989
3316
4224
1939
Delay/T-states
13351
7975
13283
16915
7775
Delay/µs
3814.6
2278.6
3745.0
4832.9
2174.5

O TK90X gasta 2164 T ou 605,3 µs desde a primeira parte visível do topo da tela, até chegar a esta última posição.

Teste 3: primeira posição visível à esquerda da tela.
A varredura da tela é feita da esquerda para a direita. Entre a última posição horizontal da linha (situado na margem direita) e a primeira posição da próxima linha, existe um período de tempo em que nada é exibido (retraço horizontal). Para ter uma estimativa deste tempo, foi medido o delay em que aparece um traço vermelho à esquerda:


Na figura acima, com emulador, o pequeno traço ficou visível. No TK90X, apesar de não ter ficado nítido na foto, foi possível perceber claramente um traço que ficava piscando entre vermelho e ciano:



Os resultados obtidos estão sumarizados na tabela abaixo.

Spectrum 48 (Fuse)
Spectrum 48 NTSC (Fuse)
Spectrum 128 (Fuse)
Pentagon 128 (Fuse)
TK90X
Clock/MHz
3.5
3.5
3.5469
3.5
3.575611
Counter
3350
2006
3335
4241
1956
Delay/T-states
13419
8043
13359
16983
7843
Delay/µs
3834.0
2298.0
3766.4
4852.3
2193.5

O período de retraço no TK90X gira ao redor de 68 T ou 19,0 µs.


Existe uma imprecisão nas medidas de tempo porque só se pode variar o delay em múltiplos de 4 T. Existem alguns outros fatores que também diminuem a precisão. A lista dos fatores que consigo imaginar são:
  1. Já foi citado que o uso de NOP para definir o delay cria uma granularidade de 4 T. Para obter a menor granularidade possível (1 T), dever-se-iam empregar instruções com 5, 6 e 7 T de ciclo. Não é  muito difícil de implementar, mas dá mais trabalho.
  2. Eventual colisão de acesso ao barramento de dados entre Z80 e ULA. Penso ter minimizado ao máximo esta possibilidade, pois a rotina fica toda na RAM alta e não há modificação na área de vídeo durante a medição de tempo. Talvez ocorra somente nas duas instruções OUT e talvez logo após aceitação de interrupção por HALT. 
  3. A instrução OUT não é executada logo após o HALT, pois executa-se antes a rotina em 56 (#38). Eu acho que se não se pressionar nenhuma tecla, o tempo gasto pela referida rotina será reprodutível. Entretanto o ideal seria criar uma rotina de interrupção própria, a ser usada no Modo de Interrupção 2, pois seria possível saber todas as temporizações envolvidas com maior exatidão.

Por outro lado é necessário investigar a reprodutibilidade dos resultados entre um computador e outro e entre diferentes aparelhos de televisão. Toda ajuda será bem vinda, agradeço àqueles que puderem fazer os testes e relatar aqui na seção dos comentários. Também seria interessante a ajuda de alguém que conheça bem o funcionamento de televisores, pois meus conhecimentos são bem superficiais.

Com certeza este assunto merecerá mais postagens no futuro.

3 comentários:

  1. Aqui os resultados do meu teste (TK90X):

    1)
    Counter = 1342
    Delay = 5387
    Delay = 1506.5957

    2)
    Counter = 1940
    Delay = 7779
    Delay = 2175.5722

    3)
    Counter = 1955
    Delay = 7839
    Delay = 2192.3526

    Uso uma TV Philips (antiga).

    ResponderExcluir
    Respostas
    1. Valeu, José Roberto.
      Pelo que entendi, o primeiro teste depende muito da geometria da TV, seria essa a causa da discrepância com meus valores. Os demais estão bem próximos.
      Relato mais 3 testes (4 a 6) em postagem subsequente, se puder dar uma olhada seria bom.

      Excluir
  2. Para o primeiro teste usei uma lupa próxima à tv e ajustei brilho/contraste para melhor percepção.
    Realmente a borda superior é muito 'estreita' no tk.

    Verificarei os próximos testes ;)

    ResponderExcluir

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