Zitat
Lassen sich diese Register mit Opcodes auslesen/beschreiben?
Was heißt da oben im Text "forgotten"? Wer hat die vergessen?
Nein, die lassen sich nicht auslesen, beschrieben werden sie indirekt, wenn du bestimmte Befehle ausführst.
So etwa bei LD A,(adresse). Nach dem der Z80 den Opcode gelesen hat, "weiß" er, dass er eine Speicherstelle auslesen und den Inhalt in A ablegen soll. Die nächsten zwei Bytes des Befehls bilden diese Adresse.
Der Z80 kann nun aber den Speicher nur byteweise lesen und benötigt zur Bildung dieser 16-Bit-Speicheradresse daher ein Register(-paar), wo diese Werte abgelegt werden können, bevor beide 8-Bit-Werte die Adresse bilden können, aus welcher der Wert für das A-Register gelesen werden soll.
Dafür kommt kein vorhandenes Register in Frage, und der PC darf in dieser Zeit auch nicht geändert werden, sonst verändert er sich, bevor er das zweite Adressbyte lesen kann.
Wo werden W und Z verwendet? Überall dort, wo eine Adresse gebildet werden muss, aber kein herkömmliches Registerpaar die Adresse bildet - wie etwa bei ld (hl), a. Wenn ich über die Befehlsliste drüberfliege, sehe ich da auf die Schnelle:
ld (NN),dd
ld dd,(NN)
ld (NN),a
ld a,(NN)
out (N),a
in a,(N)
NN = 16-Bit-Adresse
dd = HL, DE, BC, SP
Zudem gehören dazu noch alle ret-Befehle (ret, ret c, reti, retn), alle call-Befehle, alle jp-Befehle außer wahrscheinlich jp (hl), vermutlich alle jr-Befehle und rst-Befehle sowie djnz.
Wahrscheinlich habe den einen oder anderen Befehl übersehen.
Im übrigen steht das in etwas ausführlicher Form in der "Programmierung des Z80" von Rodney Zaks. Der legt seinen Beispielen allerdings den 8080 zugrunde, was als Vorgänger zum Z80 zwar passt. Leider gibt es keine genaue vollständige interne Darstellung des Z80. Deswegen hoffe ich auf das Visual6502-Projekt, das ja auch den Z80 mal komplett entschlüsseln wird.
"forgotten" steht hier nur dafür, dass diese Register für die Z80-Programmierung keine Rolle spielen und daher schnell vergessen wird, sie zu erwähnen.
MaV