Question

Je développe actuellement un émulateur pour le bon vieux gameboy et je suis confronté à certains problèmes de comprendre comment certains codes de fonctionnement de base doivent être mis en œuvre.

en ce moment, je suis en train de mettre en œuvre les opérations et les opérations; Les premiers (0xa0 -> 0xa3; 0xa6 et 0xa7) sont assez simples, mais les opérations et les opérations des registres H, l sont un peu différents.

Vous pouvez télécharger la documentation du Z80 sous ce lien: um0080.pdf (page 172)

Voici quelques exemples pour montrer ce que je veux dire (avec pseudo-code) et essentiellement ce que je fais:

et a, h (notez le bit-shifting)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;

et a, l (notez le masquage bit)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;

Je connais toutes les opérations bit et je sais ce qu'ils font, mais il semble que je ne puisse pas comprendre pourquoi il faut être fait comme ça. J'ai des théories (corrigez-moi si je me trompe: -)):

Ce que j'ai déjà compris, c'est que les registres H et L sont fondamentalement le registre HL, qui est un registre 16 bits. Étant donné que la CPU / bus ne peut gérer que des opérations de 8 bits, il doit être écarté; Ou la suggestion plus logique: étant donné que son seul registre, les valeurs de H et L sont masquées dans le registre et ils doivent simplement être séparés les uns des autres (nibble plus bas / inférieur?).

Je serais profondément reconnaissant si quelqu'un peut me faire plus clair pour moi parce que je veux juste avoir encore plus de connaissances en arrière-plan (comment tout ce genre de choses fonctionne en interne), donc c'est très important pour moi que je sais ce que je fais.

Était-ce utile?

La solution

Comme les commentaires ont souligné, le fait que la mise en œuvre que vous avez trouvée stocke les registres H et L ensemble en tant qu'entité de 16 bits HL puis décompose que dans H en changeant à droite et en l en masquant est purement une implémentation. spécifique.

L'original Z80 a un ALU 4 bits (voir les commentaires de Shima à partir du bas de la page 9 dans Cette transcription d'un panneau de musée d'historique de l'ordinateur ) de sorte que ce serait (i) et les quatre bits bas de L et l'accumulateur; puis (ii) et les quatre bits élevés de L et de l'accumulateur. Cependant, il expose ses registres comme des entités discrètes 8 bits afin que la mise en œuvre interne soit entièrement cachée.

HL s'appelle une paire d'enregistrements car il s'agit de deux registres pris ensemble pour faire une quantité de 16 bits. Ignorer les registres de l'ombre et de l'index, l'original Z80 en fait trois de ces - HL, BC et DE. C.-B. et de survivre dans le processeur de Gameboy comme paires alternatives pour le chargement indirect (tels que OPCODE 0x1a - LD A, (BC)) et pour l'arithmétique de 16 bits (par exemple, 0x09 ajouter HL, BC) et avoir quelques autres utilisations sur un Z80.

SP et PC sont généralement considérés comme des registres 16 bits indivisibles (bien entendu, bien sûr, vous pouvez les diviser en les stockant en mémoire et en lisant les octets de retour individuellement) et af existez pour pousser et faire sauter mais F est une si spéciale. cas que l'AF n'est généralement pas particulièrement utile en tant qu'oeur entier de 16 bits.

résumé abrégé alors: vous n'avez pas de problèmes de compréhension de la manière dont les opérations doivent être mises en œuvre, simplement comment elles ont été mises en œuvre par un auteur particulier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top