Frage

Ich entwickle derzeit einen Emulator für den guten alten Gameboy, und ich bin mit einigen Problemen konfrontiert, wie einige grundlegende Bediencodes implementiert werden müssen.

jetzt implementiere ich die und den operationen; Die ersten (0xa0 -> 0xa3; 0xa6 & 0xa7) sind ziemlich unkompliziert, aber die Operationen für die Register H, L sind etwas anders.

Sie können den Dokumentationsuntergang des Z80 unter diesem Link herunterladen: um0080.pdf (Seite 172)

Hier sind einige Beispiele, um zu zeigen, was ich meine (mit Pseudo-Code) und im Grunde was ich tue:

und a, h (Beachten Sie das Bitverschiebungen)

generasacodicetagpre.

und a, l (Beachten Sie das Bitmaskieren)

generasacodicetagpre.

Ich kenne alle Bit-Operationen und ich weiß, was sie tun, aber es scheint, dass ich nicht herausfinden kann, warum sein Bedürfnis so tun muss. Ich habe einige Theorien (korrigiere mich, wenn ich falsch liege: -)):

Was ich bereits verstanden habe, ist, dass die Register H und L grundsätzlich das Register HL sind, das ein 16-Bit-Register ist. Da die CPU / Bus nur 8-Bit-Operationen umgehen kann, muss er aufgeteilt werden; oder desto mehr logischer Vorschlag: Seit seinem einzigen Register sind die Werte von H und L im Register maskiert und müssen einfach voneinander getrennt werden (höher / untere Nabble?).

Ich wäre zutiefst dankbar, wenn jemand das mir klarer machen kann, weil ich nur noch mehr Hintergrundwissen haben möchte (wie all dieses Zeug intern funktioniert), so dass es mir sehr wichtig ist, dass ich weiß, was ich mache.

War es hilfreich?

Lösung

als Kommentare haben darauf hingewiesen, dass die Tatsache, dass die Implementierung, die Sie gefunden haben, die H und L zusammengearbeitet, als die 16-Bit-Entität HL registriert und dann das in H durch Verschieben von rechts und in l durch Maskierung abzweifelte, ist rein eine Implementierung spezifisch.

Das Original Z80 verfügt über eine 4-Bit-Alu (siehe SHIMA-Kommentare ab Ende Seite 9 in Dieses Transkript eines Computerverlaufs-Museums-Panels ), also würde es eigentlich (i) und den niedrigen vier Bits von L und dem Akkumulator; dann (ii) und die hohen vier Bits von l und des Akkumulators. Es ist jedoch seine Register als diskrete 8-Bit-Entitäten ausgesetzt, so dass die interne Implementierung vollständig ausgeblendet ist.

hl wird als Registerpaar bezeichnet, da zwei Register zusammengefügt werden, um eine 16-Bit-Menge zu erstellen. Das Ignorieren der Schatten- und Indexregister hat das ursprüngliche Z80 tatsächlich drei davon - HL, BC und DE. BC und de überleben in der CPU des Gameboys als alternative Paare zur indirekten Beladung (z. B. Opcode 0x1a - Ld A, (BC)) und für 16-Bit-Arithmetik (z. B. 0x09 HL, BC) und haben einige andere Anwendungen auf a Z80.

sp und PC werden im Allgemeinen als unteilbare 16-Bit-Register angesehen (jedoch können Sie sie natürlich teilen, indem Sie sie in den Speicher speichern und die Bytes individuell zurücklesen, und AF existiert, um zu drücken und zu knallen, aber f ist ein solches Special Fall, dass AF ist nicht besonders nützlich als 16-Bit-Ganzzahl.

kurze Zusammenfassung dann: Sie haben dann keine Probleme mit dem Verständnis, wie Opcodes umgesetzt werden muss, lediglich, wie sie von einem bestimmten Autor implementiert wurden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top