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.
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:
Enviar um comentário