Z80 CP/M-Modul für Commodore C64

Einführung

Vor einiger Zeit wurde die Commodore CP/M Cartridge demontiert und neu aufgebaut. Dabei entstand die Idee, nicht nur diesen Adapter 1:1 nachzubauen, sondern eine neue Version zu entwickeln.

Eine Version, die nicht nur viel kleiner, sondern auch kompatibler ist. Und bei dieser Gelegenheit könnte man vielleicht das Ganze etwas schneller machen.

Die alte Cartridge lief mit knapp 4 MHz. Warum also nicht auf 8 MHz gehen, da der C64 genau diese Frequenz am Erweiterungsport mit dem DOT-Takt bereitstellt?

Kompatibilitätsprobleme

Über die Commodore CP/M Cartridge wurde bereits viel gesagt. Oft wird gelesen, dass der VIC schuld daran sei, dass diese Cartridge in neueren C64-Modellen nicht funktioniere.

Nach vielen Messungen und Tests lässt sich zumindest behaupten, dass es nicht der VIC an sich ist, der das Problem verursacht. Es war sogar möglich, die originale Cartridge mit ein paar Tricks auf jedem VIC zum Laufen zu bringen.

Der VIC spielt in diesem Problem eine Rolle, aber nur in Bezug auf die Takterzeugung. Nicht wegen fehlender Funktionen in den neueren Versionen.

Auch auf dem VIC-II läuft die Cartridge, wenn auch nicht in der Originalversion. Durch geschicktes Ersetzen verschiedener TTL-Komponenten in dieser Cartridge mit S/LS/ALS/HCT-Varianten kann die Cartridge tatsächlich auf jedem System betrieben werden, mit Ausnahme des Ultimate64-Boards.

Da all diese Varianten ein leicht unterschiedliches Timing haben, kann die Cartridge entsprechend zusammengesetzt werden. Das kann jedoch nicht das Ziel der Sache sein.

Übrigens kann auch die verwendete PLA einen Unterschied machen. Insbesondere bei Nachbauten funktioniert die Commodore Cartridge nicht stabil. Meistens hängt sich das Ganze im Boot-Prozess auf.

Dieses Verhalten wurde nicht weiter analysiert. Während der Tests wurde nur beobachtet, dass sich das Verhalten der Cartridge je nach verwendeter PLA änderte.

Die erste CPLD-Version

Die erste Version wurde mit lackiertem Kupferdraht und Steckbrett aufgebaut:

Erste Version

Und die Rückseite:

Die beiden Platinen wurden einfach zusammengesteckt.

Zunächst wurde die Commodore-Version in VHDL-Code übersetzt, allerdings ohne großen Erfolg.

Das CPLD ist viel schneller als die TTL-Komponenten. Dann wurde versucht, das Ganze so zyklusgenau wie möglich aufzubauen. Ein externer Oszillator für das CPLD wurde hinzugefügt, um das Ganze zu synchronisieren.

Damit konnte die 4-MHz-Version (die effektiv langsamer läuft) reproduziert werden. Allerdings auch mit allen Nachteilen, die die originale Cartridge hatte. Eigentlich sinnlos, wie festgestellt wurde.

Frequenzen

Natürlich wird nur der Z80 mit 4 MHz betrieben, später dann mit den erwähnten 8 MHz. Der C64 läuft weiterhin mit seinen 1 MHz. Das ändert sich nicht. Da nur die 6510 CPU ausgeschaltet wird, nicht aber der VIC, kann der Bus nicht schneller angesprochen werden.

In Bezug auf Speicherzugriffe wird die Z80 CPU also immer durch Wartezustände verlangsamt.

Das macht die Arbeit mit CP/M so langsam, weil am Ende alles über den C64-Bus mit einem Megahertz läuft.

Doppelte Geschwindigkeit ist nicht doppelt so schnell

Einige 8-MHz-NMOS-Typen des Z80 waren noch vorhanden. Also lag es nahe, das Ganze zumindest ein wenig zu beschleunigen.

CP/M kann nicht geändert werden und auch der C64-Speicherbus kann nicht verändert werden. Externer Speicher ist daher nicht möglich. Und mehr als 64k wären ohnehin nicht möglich, da das alte CP/M 2.2 nicht mehr als diese 64k adressieren konnte. Zumindest nicht standardmäßig.

Den CPU-Takt auf 8 MHz zu erhöhen würde bedeuten, mehr Wartezustände einzubauen. Daher würde diese Version, auch wenn sie doppelt so schnell getaktet ist, nicht doppelt so schnell laufen.

Allerdings machen sich die 8 MHz beim Kompilieren oder Berechnen bemerkbar. Oder bei allem anderen, wo nicht auf den Speicherbus zugegriffen werden muss.

Adrenalin für den Z80

Das Konzept für die 8-MHz-Version musste mehrfach verworfen werden. Es wurde schnell klar, dass die alte Version nicht einfach auf 8 MHz aufgerüstet werden konnte.

Zunächst wurde mit einem Zähler für die Wartezustände gearbeitet. Der Zähler wurde dann vom DOT-Takt und Phi2 gespeist.

Aber das erwies sich als nicht sehr sauber. Messungen zeigten, dass der Zähler sich immer wieder selbst zählte. Obwohl Phi2 von Phi0 abgeleitet wird und dieser wiederum vom DOT-Takt erzeugt wird, laufen sie auf lange Sicht nicht absolut synchron.

Bereits das Problem, dass das Tastverhältnis und die Periode der Rechtecksignale nicht exakt gleich sind, erzeugt „ungenaue“ Flanken. So passiert es ab und zu, dass der Zähler zu früh oder zu spät ausgewertet wird und somit das Ergebnis nicht stimmt.

Zuerst wurde an einen Fehler im CPLD gedacht. Dann wurde das Ganze mit einem 74LS197 nachgebaut. Und auch dort trat dieses Problem auf, wenn die Signale vom C64 genommen wurden.

Je länger der C64 läuft und je wärmer seine Komponenten werden, desto stärker wird dieser Effekt.

Leider fällt das auf den ersten Blick nicht auf. Wenn ein paar Sekunden mit dem Logikanalysator aufgezeichnet werden, hat man aufgrund der 8 MHz schon so viele Daten, dass es schwer zu finden ist.

Das Ganze passiert nicht ständig, sondern alle paar Sekunden. Dieses Problem wurde eher zufällig entdeckt.

Daher wurde dann der Zyklus genau mit Hilfe des /MREG-Signals des Z80 bestimmt. Also ob der Z80 sich gerade in T1, T2, T3 usw. befindet.

Und dann genau auf diese Zyklen reagieren und die Wartezustände je nach BA, R/W, I/O1 des C64 erzeugen.

Des Weiteren wurde das BA-Signal für das /BUSREQ-Signal zum Z80 genutzt. Das resultierende BUSACK-Signal wurde dann in die Steuerung zur Richtungsumschaltung des Adress- und Datenbusses eingebunden.

Allein die Nutzung des BA-Signals an mehreren Stellen erhöhte die Stabilität enorm.

Die erste Platine

Da immer wieder Probleme mit dem Prototypen auftraten, wurde beschlossen, das Ganze auf eine Platine zu bringen, um es zu testen. So entstand der zweite Prototyp:

Die Komponenten zum Umschalten des Datenbusses waren noch darauf. Denn am Anfang gab es Probleme, das richtige Timing zu finden. Aber im Laufe der Zeit wurden diese überflüssig.

Das erste Timing-Modell wurde verworfen. Durch das vollständige Redesign der Steuerung konnte auf einen externen Oszillator verzichtet werden.

Es stellte sich jedoch bald heraus, dass leider nicht daran gedacht wurde, dass weitere Messungen nötig sein würden. Ohne Erweiterungsport-Extender konnten wichtige Signale nicht mehr erreicht werden.

Daher musste eine neue Platine entworfen werden, die etwas weitsichtiger gestaltet wurde.

Zusätzlich wurde eine kleine Lochrasterplatine vorgesehen, um freie I/Os der CPLDs herauszuführen und leichter Signale abgreifen zu können. Allerdings wurde das meiste davon nicht mehr genutzt.

Designer-Platine

Da schon immer eine ungewöhnlichere Platine entworfen werden wollte, wurde diese „Designer-Version“ gewählt.

Anfangs bestand die Sorge, dass der Schlitz zu instabil sein könnte. Aber nach der Lieferung der Platinen konnte diese Sorge beruhigt werden. Bei einer Dicke von 1,6 mm ist diese feine Linie sehr stabil.

Inzwischen wurde die Firmware auf Version 0.5 weiterentwickelt und auf GitHub veröffentlicht.

Tests

Es wurden im Voraus einige Tests durchgeführt, soweit es möglich war. Leider standen nicht alle möglichen Boards zur Verfügung. Getestet wurden die folgenden Konstellationen:

  • ASSY-NO.250407 / ARTWORK-NO.251137 / REV.B
  • ASSY-NO.250407 / ARTWORK-NO.251137 / REV.C
  • ASSY-NO.250469 / PCB-NO.252311 / REV.4
  • ASSY-NO.250469 / PCB-NO.252311 / REV.B
  • SX-64 (Revision müsste überprüft werden)
  • Ultimate 64 Elite V1.3, Firmware 1.37, DolphinDOS Kernal

Zusätzlich wurden verschiedene VIC-Versionen und -Revisionen auf diesen Boards getestet.

Die Stabilität wird persönlich als recht hoch eingeschätzt. Abstürze während des Betriebs waren selten. Gelegentlich gab es beim ersten Booten einen Hänger.

Getestet wurde mit dem originalen Kernel, SpeedDOS Plus+ und JiffyDOS. Ein Floppy-Speeder wird definitiv empfohlen. Ohne macht CP/M keinen Spaß.

Im Internet wurde ein kleines Pascal-Programm gefunden, das eine Mandelbrot-Menge berechnet. Dieses wurde als eine Art Benchmark verwendet.

Die Zeiten sind wie folgt:

  • Commodore CP/M Cartridge: 7:16 (min:sec)
  • 8MHz Z80 Cartridge für C64: 3:50 (min:sec)

Bei CPU-Arbeiten ist die Karte wirklich fast doppelt so schnell.

Fazit

Wer schon immer CP/M auf dem C64 ausprobieren wollte, findet mit dieser Karte einen einfachen Einstieg. Die Anzahl der Komponenten ist überschaubar und auch der Preis der einzelnen Komponenten liegt weit unter dem, was gebrauchte Commodore-Cartridges kosten.

Die Stabilität wird etwa auf dem Niveau der Commodore-Version eingeschätzt. Es ist nicht einmal sicher, ob einige der Probleme nicht durch die Software, also CP/M 2.2, verursacht werden.

Es wurde auch überlegt, eine IEEE-488-Schnittstelle zu integrieren.

Jedoch wird inzwischen bezweifelt, ob dies einen Vorteil bringt. Denn das CP/M 2.2 von Commodore unterstützt nur Laufwerke, die vom Diskettenformat her mit der 1541 kompatibel sind. Wie z.B. die 2031.

Und bei Verwendung von JiffyDOS oder SpeedDOS wäre der Geschwindigkeitsvorteil der IEEE-488-Laufwerke nicht mehr vorhanden.

Wer sich generell für das Thema der Takte beim C64 interessiert, dem lege ich diesen Artikel nahe.

Download

Wie oben erwähnt, wurden alle relevanten Informationen und Dateien auf dem Codeberg-Konto bereitgestellt: Z80-Card für Commodore C64.

Es wäre sehr interessant, Feedback bezüglich der Kompatibilität mit anderen Boards zu erhalten. Nur dann könnte die Firmware entsprechend weiterentwickelt werden.

Update (10.04.2021)

Die Karte, als auch die Firmware ist nicht aktuell und noch sehr fehlerhaft. Die Karte wurde mittlerweile durch die Z80-Karte im gehäusefreundlichen Format ersetzt, die die aktuelle Firmware enthält, die auch den 8MHz Modus richtig unterstützt. Die hier gezeigt Karte war ursprünglich nur eine CPLD Version der Original Commodore CP/M Cartridge, die ich auf 8MHz gepimpt hatte. Die 4MHz Firmware läuft stabil und recht zuverlässig.

0 Comments
Älteste
Neueste
Inline-Feedbacks
Alle Kommentare anzeigen
Nach oben scrollen