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
|
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:
- 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.
- 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.
- 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.
Aqui os resultados do meu teste (TK90X):
ResponderExcluir1)
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).
Valeu, José Roberto.
ExcluirPelo 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.
Para o primeiro teste usei uma lupa próxima à tv e ajustei brilho/contraste para melhor percepção.
ResponderExcluirRealmente a borda superior é muito 'estreita' no tk.
Verificarei os próximos testes ;)