R800 (CPU) - R800 (CPU)

R800

Der R800 ist die Zentraleinheit des MSX Turbo-R -Heimcomputers . Der R800 wurde von der ASCII Corporation aus Japan entworfen und von Mitsui & Co., Ltd. gebaut . Das Ziel war eine moderne und Pipeline- CPU-Binärdatei, die mit dem Z80 und damit mit der MSX-Software kompatibel ist und gleichzeitig die Kompatibilität mit älterer MSX Z80- basierter Hardware gewährleistet .

Kompatibilität

Während der Entwicklung des MSX Turbo R hat die ASCII Corporation verschiedene Prozessoren als Kandidaten in Betracht gezogen, die sowohl mit dem Z80 kompatibel als auch nicht kompatibel sind. Zu dieser Zeit erforschte und entwickelte Kazuya Kishioka ( 岸 岡 和 也 ) , ein Mitarbeiter des Unternehmens, einen ASIC , der eine Hochgeschwindigkeitsversion des Z80 war und weitgehend auf die MSX-Architektur zugeschnitten war.

Aus Gründen der Softwarekompatibilität mit älterer MSX-Software verwendet der R800 denselben Befehlssatz wie der Z80, mit nur geringfügigen, aber nützlichen Ergänzungen wie 8x8-Bit- und 16x16-Bit-Multiplikationsbefehlen namens MULUB ( 8-Bit ) und MULUW ( 16-) Bit ). Außerdem wurden viele der undokumentierten Z80-Anweisungen offiziell gemacht, einschließlich aller Opcodes für Anweisungen, die sich mit IX und IY als 8-Bit-Register befassen (IXH, IXL, IYH, IYL).

Da der R800 nicht direkt auf dem Z80 basiert, sondern aus der Z800- Familie stammt, fehlen ihm einige der anderen undokumentierten Z80-Funktionen. Beispielsweise nehmen die in den Bits 3 und 5 des F-Registers dargestellten undokumentierten Flags nicht dieselben Werte wie in Z80 an (was dazu führt, dass ZEXALL- Tests fehlschlagen ), und der häufig als SLL bezeichnete undokumentierte Opcode ist nur ein Alias ​​des SLA-Befehls.

Hardwareänderungen

Da es sich um ein viel neueres Design handelt, war die R800-Implementierung natürlich ganz anders als die alte Z80. Die Änderungen ähnelten den Z800- , Z280- , Z380- und eZ80- Linien von Z80-kompatiblen Prozessoren. Das ursprüngliche Z80 verwendet intern eine ungewöhnliche 4-Bit-ALU-Hardware, eine Lösung, die tatsächlich mit ähnlichen CPUs konkurrieren kann, wenn eine vollständig festverdrahtete 8-Bit-ALU-Logik verwendet wird (z. B. der unmittelbare Vorläufer Intel 8080 ). Die R800-Designer implementierten jedoch eine vollständige 16-Bit- ALU , um mit der Pipeline-Ausführung Schritt zu halten. Anweisungen wie ADD HL, BC, die auf dem Z80 11 Taktzyklen benötigen, können in einigen Situationen auf nur einem Buszyklus (1-2 Takte) auf dem R800 ausgeführt werden, da diese ALU in voller Breite Pipelining ermöglicht. Die maximale CPU- Taktrate dieses neuen MSX betrug 14,32 MHz - viermal so schnell wie die ursprüngliche 3,57-MHz-Geschwindigkeit des älteren MSX, während der Bustakt auf 7,16 MHz erhöht wurde. Der Datenbus blieb 8-Bit, um die Kompatibilität mit alter Hardware aufrechtzuerhalten.

Opcodes abrufen

Zusätzliche Änderungen wurden an der Art und Weise vorgenommen, wie die CPU Opcodes abruft . Der ursprüngliche Z80 verwendet zwei Zyklen, um eine einfache Anweisung wie OR A abzurufen, sowie zwei Zyklen zum Aktualisieren. In der MSX-Architektur wird ein zusätzlicher Wartezustand ausgegeben. Eine Überprüfung des Abrufmechanismus in einer typischen MSX-Umgebung hilft bei der Erklärung des R800:

  • Z80, Zyklus 1: Stellen Sie die höheren 8-Bit-Adressen ein
  • Z80, Zyklus 2: Stellen Sie die unteren 8-Bit-Adresse ein
  • Z80, Zyklus 3: Wartezustand
  • Z80, Zyklus 4: Aktualisieren, Teil 1
  • Z80, Zyklus 5: Aktualisieren, Teil 2

Da die meisten Implementierungen von MSX RAM- Speicher verwenden, der in einem 256 × 256-Byte-Block angeordnet ist, sind zwei Zyklen erforderlich, um die Adresse für den Abruf festzulegen. Der R800 vermeidet dies, indem er sich an den letzten bekannten Zustand der höheren 8-Bit erinnert. Wenn sich der nächste Befehl in denselben 256-Byte-Grenzen befindet, werden die höheren 8-Bit nicht gesetzt und ein Zyklus wird gespeichert. Beim Z80 zerstören die Aktualisierungszyklen jedoch die Informationen auf den höheren Bits, sodass eine Problemumgehung erforderlich war.

Die im R800 verwendete Lösung bestand darin, ganze RAM-Blöcke zu aktualisieren, anstatt bei jedem ausgegebenen Befehl eine RAM-Zeile zu aktualisieren. Alle 30 μs wird die CPU für 4 μs angehalten, diesmal wird ein RAM-Block aktualisiert. Da zwischen den Abrufanweisungen keine Aktualisierung erfolgt und der Wartezustand aufgrund schnellerer RAM-Chips entfernt wird, können einfache Anweisungen mit nur einem Zyklus ausgegeben werden. Dieser Zyklus wäre Zyklus 2 im obigen Z80-Beispiel; Zyklus 1 wird optional und wird nur ausgegeben, wenn das Programm eine 256-Byte-Grenze überschreitet.

Externe Hardware

All dies gilt nur für den schnellen RAM, der beim MSX Turbo-R verwendet wird. Externe Hardware, die über Kassettensteckplätze verbunden ist, verwendet ähnliche Timings wie Z80. Nicht einmal das interne ROM von Turbo-R ist schnell genug für dieses Abrufschema, sodass zusätzliche Chips auf dem Turbo-R den Inhalt des ROM in den RAM spiegeln können, um ihn schneller laufen zu lassen.

Verweise

Weiterführende Literatur