029
10.08.2026, 23:01 Uhr
Early8Bitz
|
Man muss hier unterscheiden zwischen Bugs der CPU, also Verhalten, welches der Hersteller verbindlich beschreibt, welches aber so nicht zutrifft; und undokumentierten Eigenschaften, welche die CPU aufweist, die der Hersteller aber nicht beschreibt oder gar zusichert und wofür er letzlich dann auch nicht gerade stehen muss.
Schauen wir mal den letzteren Punkt an. Die Gruppe der undokumentierten Eigenschaften sind im wesentlichen a) zusätzliche Maschinenbefehle b) Offizielle Maschinenbefehle, die über weitere Opcodes ausgeführt werden können. c) Vorhersagbares Verhalten von Flags, die in der Befehlsbeschreibung als "unknown" bezeichnet sind d) Zugriff auf einzelne interne Zustände (Flagbits 3 und 5)
Beispiele: a) Shift Left Logical Befehlsgruppe CB 30...CB 37 8-Bit-Zugriff auf obere und untere Hälfte von IX und IY b) NEG: Offizieller Opcode ED 44, aber auch ED 4C, ED 54, ED 64 und weitere RETN: Offizieller Opcode ED 45, aber auch ED 55, ED 65, ED 6D und weitere c) Parity/Overflow-Flag bei OUTI/OTIR/OUTD/OTDR: Offiziell "unknown", real "The parity of ((((HL) + L) & 7) xor B)" d) Spieglung der Bits 3 und 5 von A bei bestimmten Operationen ins Flagregister Spieglung der Bits 3 und 5 des internen W-Registers (bzw. Bits 11 und 13 von MEMPTR)
Eine Frage ist, hat Zilog bei der Entwicklung der Z80-CPU von diesen Dingen gewusst, sie evtl. sogar bewusst designed, oder sind es "Abfallprodukte" des Befehlsdecoders? Die Opcodes werden statisch in einem PLA decodiert. Dieses wäre evtl. wesentlich komplexer und möglicherweise langsamer geworden, wenn man alle nicht in der Befehlsbeschreibung verbindlich dokumentierten Befehle oder Dopplungen hätte ausschließen müssen.
Wenn Zilog von Anfang an von diesen Eigenschaften gewusst hat (Spekulation!), warum wurden die dann nicht Bestandteil der Befehlsbeschreibung?
a) Gerade die zusätzlichen Opcodes bieten ja eine Menge Potential zur Optimierung von Programmcode, sei es, die Programmgröße zu reduzieren oder die Performance der Programme zu erhöhen. Ich könnte mir vorstellen, dass sich Zilog für Weiterentwicklungen der Z80-CPU diese Opcodes frei halten wollte für neue/zusätzliche Befehle oder dass bei möglicherweise vorgesehenen Optimierungen des Befehlsdecoders (zu der es nicht kam), diese undokumentierten Befehle unter den Tisch gefallen wären. Und keiner hätte Zilog dafür zur Rechenschaft ziehen können.
Beim Z180 erzeugen alle nicht dokumentierten Z80-Befehle einen Trap. Z80-Software, die diese Befehle beinhaltet, wird auf einem Z180 zum Absturz führen.
b) Die Existenz mehrerer Opcodes, die den gleichen Befehl ausführen, hat eher akademischen Character, da die CPU dadurch ja nicht mehr leistet, besser oder schneller wird. Würde mann diese Dopplungen in den offiziellen Befehlssatz aufnehmen, brächte man die Assembler-Bauer in Bedrängnis, denn die Mnemonic "NEG" kann nun mal entweder nur zu "ED 44" oder nur zu "ED 4C" oder nur zu "ED 54" usw. übersetzt werden. Keiner hätte einen Vorteil davon, zwischen mehreren "NEG"s zu wählen. Ein Teil der ED-Opcodes, die Z80-Befehle doppeln, sind z.B. beim Z180 durch andere Befehle belegt (MULT).
c) In obigen Beispiel zu c) sieht man, dass das Parity-Flag zwar determiniert gesetzt wird, man erkennt aber auch, dass bei Verschiebung des Datenfeldes, welches mit OUTI/OTIR/OUTD/OTDR ausgegeben wird, auf eine andere Speicheradresse (z.B. bei Programmänderung) das Ergebnis der Flagbeeinflussung ein anderes sein wird, weil die Lage des Datenfeldes (Register L) mit in das Ergebnis eingeht. Ein Programmierer könnte also das Parity-Flag in seinem Programm nicht vorraussagen und nutzbringend auswerten, da er normalerweise nicht weiß, wo das Ausgabedatenfeld vom Compiler/Assembler/Linker im Speicher platziert wird. "unknown" ist da schon die bessere Wahl in der Befehlsbeschreibung als obige Formel.
d) Auch die Spiegelung von Bits bestimmter Register in die Flagbits 3 und 5 ist eher akademischer Natur, da sich daraus keine Vorteile bei der Entwicklung realer Programme ableiten lassen. Auf Bit 3 und 5 von A hat man ohnehin Zugriff, und die beiden Bits aus W bzw. MEMPTR erlauben bestenfalls Forensikern, ein wenig ins Innere der CPU zu schauen.
Fazit: Außer der Nutzung nicht dokumentierter Befehle (außerhalb von Anwendungen der kritischen Infrastruktur) ist die Beschäftigung mit den undokumentierten Eigenschaften der CPU was für technisch Interessierte, bringt aber sonst keinen Nutzen im produktiven Umfeld. -- Gruß Ralf
Ist ein alter Schaltkreis ein Schaltgreis? |