Na realidade, o ZX Spectrum não tem um cristal de 3.5MHz; tem um cristal de 14MHz, que é dividido em 2 para dar um sinal de 7MHz à ULA, e a ULA por sua vez divide-o a metade para dar o sinal CLK ao Z80A.
No entanto, o que significa isto em tempo de execução de instruções código máquina ou tempo real?
Ao nível de programação de código máquina Zilog Z80, chamamos a estes impulsos ciclo máquina, sendo que temos então T 3500000 estados destes por segundo.
Ou seja, 1T = 3500000 / 1 ; 1T é também aproximadamente igual a 0.29 micro-segundos.
Os ciclo máquina são a unidade mais pequena (de medida de tempo) que se lida ao nível do Z80A, e a que nos interessa focar mais de momento. Existe também o ciclo de instrução, que é composto por vários estados T.
O ciclo de instrução de um particular opcode (operação código máquina do Z80), define as operações a baixo nível que são realizadas e quantos T gastam por cada particular opcode. Uma vez que o Z80 é um microprocessador relativamente antigo que não tem optimizações de execução simultânea de instruções, é possível, portanto calcular os T gastos por uma instrucção sabendo o que esta faz, e que efeito de tempo produz na execução de software ao nível do processador.
Por exemplo:
LD A,B -> Gasta 1T de ciclo M1 +3T de acesso de memória, uma vez que só tem 1 byte opcode -> aproximadamente 1.16 microsegundos
LD A,2 -> 7T, 1T de ciclo M1 + 3T de acesso à memória para opcode + 3T para obter argumento -> aproximadamente 2.03 microsegundos
As tabelas de instruções oficiais da datasheet da Zilog (e não só), listam os opcodes totais que cada instrução gasta. Estas tabelas são úteis para:
- Optimizações de código;
- Para escrever código para medir tempo, como carregamento de cassetes, efeitos multi-cores, ou geração de som através do altifalante - já que o ZX Spectrum não tem um relógio / chip de PIT (programmable interval timer);
- Para escrever profilers e emuladores.
A título de exemplo, para demonstrar a importância da gestão de estados T, um 0 em binário, em cassette tem 855T (aprox. 248 microsegundos) pulses, e um 1, 1710T (aprox. 496 microsegundos).
Nem tudo é linear em termos de clocking de CPU no Z80A, no ZX Spectrum.
A ULA varre a RAM para mostrar o ecrã em tempo real em cada 1/50 de segundo, e tem acesso privilegiado à RAM. No caso do Z80 solicitar um acesso à RAM dos primeiros 16KB que a ULA calcule que vai acontecer em simultâneo com um acesso da ULA, a ULA deixa de dar impulsos ao pino de CLK do Z80A, o que pode acontecer durante o que seriam 6T a 9T, deixando nesse período o Z80 à espera de um sinal para continuar a sua operação normal. Isto em Spectrums 48K de issue 3 para a frente, inclusive. Nos issues 1 e 2, o Z80 é suspenso durante a fase de update do ecrã; isto implica que por exemplo, o ZX Spectrum não apresenta comportamentos idênticos ao 48K, e que são abusados em jogos, tal como o floating bus.
Isto é o que se define como contended memory no ZX Spectrum, e é essa a razão para se recomendar que rotinas sensíveis a tempo, como turbo loaders, e rotinas de música, não sejam colocadas nos primeiros 16KB de RAM. No entanto, nos modelos de Spectrum 16KB, não havia outra alternativa.
Iremos falar mais da ULA e da geração vídeo no ZX Spectrum em próximo artigos.
Sem comentários:
Enviar um comentário