quinta-feira, 19 de dezembro de 2019

Os registos do Z80

Em vários artigos, já temos mencionado de passagem o processador Z80 e os respectivos registos. Chegou a altura de os mencionarmos.

O Z80 é um processador com um bus de dados de 8 bits, e um bus de endereços de 16 bits. O bus de endereços é usado quer para acessos a memória, ou para instruções de I/O.


Os registos do Z80 são:

PC - program counter - endereço da instrução C/M a ser executada;
SP - stack Pointer - endereço do stack LIFO;

HL - dedicado a lidar com endereços de memória
DE - registo auxiliar de 16 bits
BC - registo para contadores e I/O.

WZ (também conhecido como MEMPTR) - cache intermédio de operações de 16 bits. O comportamento deste registo foi apenas compreendido por volta do ano 2000 e pouco, e sua compreensão é essencial para emular um Z80 a 100%. Não é acessível directamente, apenas influencia o output das flags não documentadas nos opcodes BIT b,(HL).

HL',DE',BC',AF',WZ' - conjunto de registos alternativos de variáveis do Z80 (shadow registers). HL',DE',BC' acessíveis apenas através da instrução EXX e o AF' pela instrução EX AF,AF'.

IX - registo para apontar para posições de memória indexadas
IY  - registo auxiliar para apontar para posições de memória indexadas (no ZX Spectrum convém evitar alterar o IY em rotinas C/M que façam uso de determinadas rotinas da ROM)

Os registos HL,DE,BC também podem ser usados nas suas componentes 8 bits, nomeadamente H,L,D,E,B e C. Do AF pode-se usar o A, sendo que o F só é acessível em operações de stack (POP e PUSH) e pela instrução EX AF,AF´. Em respeito aos registos IX e IY, também se pode usar as partes mais significativas e mais significativas destes, mas só com instruções não documentadas.

A - O registo A, é usado em operações aritméticas e de manipulação de bits de 8 bits.

F - Armazenamento do estado de operações do Z80. Os bits do registo F correspondem às flags S,Z,X,H,Y,P / V,N,C. As X e Y, são flags não documentadas pela Zilog, as outras são respectivamente Sign, Zero, Half-Carry, Parity/oVerflow, subtractioN, e Carry (a falar noutro artigo).

I - o registo I é usado como vector da parte alta de rotinas de interrupts, em modo 2. Falamos disso em Interrupts no Z80A/ZX Spectrum

R - o registo R é usado como registo auxiliar de refrescamento de memória. O seu comportamento está documentado, e era (é) abusado para rotinas de encriptação ou efeitos de ecrã.

Q -  Em CPUs Z80 NMOS / Zilog, é um cache que indica se as flags foram alteradas ou não, na última instrução. É um registo interno não acessível, afecta no output das instruções SCF e CCF as flags não documentadas.

Notas para iniciados:
  • ao lidar em assembly com os registos HL,DE,BC,A, ou H,L,D,E,B,C, estes podem ser considerados como uma espécie de variáveis de uma linguagem de alto nível, com usos mais ou menos especializados. 
  • Uma vez que os registos de CPU são limitados, para guardar variáveis, também se pode (e deve-se) usar posições de RAM.
  • mexer numa variável de 8 bits que seja parte de uma de 16 bits, afecta o valor da de 16 bits e vice-versa
  • O IY em ZX Spectrum deve ser mantido a $5C3A. As rotinas da ROM restauram o HL' a $2758 ao voltar ao BASIC.
  • O A, HL, BC, DE  são registos de uso geral, o A',HL',BC',DE' alternativos / shadow, o F flags, o IX e YI registos de indexamento, e os restantes registos, registos de uso especifico.
Notas gerais:

As flags não documentadas X  e Y, têm de ser correctamente emuladas, há software que depende do correcto funcionamento destas flags (Nodes of Yesod, por exemplo). Só emulando (parcialmente) o registo WZ, é que é se consegue emular estas flags a 100%.

Existem dúvidas que o WZ' (shadow) exista.

O IY pode ser alterado, desde que não se use calls da ROM e em adição se escreva um handler / wrapper de interrupts em IM 2.

O R ao ser incrementado pela CPU, só incrementa os 7 bits inferiores, o bit 7 mantêm-se sempre a 1 ou 0.

Ver: The amazing Zilog Z80
        Zilog Z80
        Z80 logical architecture

PS: note-se que dado o que se tem que explicar das flags do F, isso justifica ficar num artigo à parte.

Sem comentários:

Publicar um comentário