segunda-feira, 4 de novembro de 2019

3.5MHz no ZX Spectrum, o que significa?

No ZX Spectrum, consta das especificações deste computador um processador Z80A a funcionar a 3,5MHz. Existe um pino dedicado do chip Z80A (CLK) que recebe um sinal de aprox. 3,5MHz por segundo.


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 ), 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.                                 
O ZX Spectrum tem 50 interrupts por segundo, pelo que a cada aproximadamente 70000 estados T, temos um  sinal  de interrupt (no caso do Spectrum 48K são exactamente 69888T).

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:

Publicar um comentário