Z80 und
CP/M-Projekte
Ronald Daleske

Homepage Übersicht vorherige Seite Kontakt Impressum Warenzeichen

Z80HWE = Z80-Hardware-Emulator = CP/M Z80/µC Einplatinencomputer (2013/14)

Wahrscheinlich einer der CP/M-Computer mit dem geringsten Hardwareaufwand. Mit nur 3+1 Schaltkreise bekommt man einen lauffähigen CP/M-Computer mit RAM-Floppy realisiert. Nur die CONSOLE (Monitor/Tastatur) muss über einen PC realisiert werden.

Inhaltsverzeichnis

1. Motivation und Zielstellung
2. Grundidee des MINI80
3. Hardware
4. Software
5. Die CONSOLE - Anbindung an den PC
6. Der Betrieb ohne PC
9. Lizenz

1. Motivation und Zielstellung

Was kann man an einem Computer verbessern, der bereits viele Jahrzehnte alt ist und daher eine lange Entwicklungsgeschichte hinter sich hat?

Ein Ziel kann sein, den Hardwareaufwand (d.h. die Anzahl der benötigten Schaltkreise) immer weiter zu verringern.

Das hier vorgestellte Projekt entstammt der Idee des MINI80:

http://www.shaels.net/index.php/mini80

Beim MINI80 wird die Z80 durch einen Parallax Propeller Chip verwaltet (siehe Punkt 2. Grundidee). Beim hier vorgestellten Projekt soll der Parallax Propeller durch einen ATMEGA 1284 ersetzt werden.

Zusammen mit einem 512 KB SRAM, einer Z80 CPU und einem 74HCT244 entsteht ein CP/M 2.2 Computer mit batteriegepuferter RAM-Floppy. Über eine Serial-USB-Schnittstelle wird der CP/M-Computer mit einem PC verbunden. Dort läuft ein virtuelles Laufwerk, von dem man neue CP/M Dateien vom PC auf die RAM-Floppy kopieren kann (am besten standesgemäß mit POWER.COM). Die Consolen-Eingabe und -Ausgabe läuft (wie auch bei den anderen Projekten CPD2 CPD3 und CPD5) über das Programm CONSOLE.

2. Grundidee des MINI80

Ziel ist - wie oben schon erwähnt - den Schaltungsaufwand möglichst gering zu halten. Die Idee des MINI80 ist genial und soll hier kurz stichpunktartig zusammengefasst werden:

Der Start des CP/M Computers wird im Mini80 Overview näher beschrieben und verdeutlicht gut die Arbeitsweise.

  1. Z80 CPU Reset auf 0 legen

  2. einige Takte anlegen bis die Z80 intern alle Register zurückgesetzt hat (ich habe hier 100 Takte genommen)

  3. Einschalten des Tri-State-Puffers zwischen Z80 CPU und SRAM

  4. Z80 CPU Reset auf 1 legen (Reset aufheben)

  5. jetzt so viele Takte erzeugen, bis die Z80 CPU die /RD Leitung aktiviert (auf 0 legt) um den ersten Befehl zu lesen (M1-Zyklus)

  6. der SRAM ist jetzt durch die CPU (Adressleitungen A0 bis A15) und durch den ATMEGA 1284 (Adressleitungen A16 bis A18) vollständig adressiert

  7. nun kann das erste Byte aus den Flasch-Speicher des ATMEGA 1284 in den SRAM kopiert werden

  8. nach diesen Schreibvorgang in den SRAM wird auf den Datenbus ein 00H gelegt (NOP) und die Z80 CPU weiter getaktet, bis der Lesevorgang beendet ist

  9. die Z80 führt den Befehl aus (macht nun eben - NICHTS -), inkrementiert die Adressleitung und möchte den nächsten Befehl lesen

  10. die Punkte 5. bis 9. so lange wiederholen bis der gesammte Loader in den SRAM geladen wurde

  11. nun noch einmal ein RESET an die Z80 geben und den Loader damit starten

Der CP/M-Comuter kann nun mit Takten versorgt werden und normal arbeiten. Nach jedem Takt wird kurz kontrolliert, ob die /IORQ-Leitung aktiviert wurde (auf 0 geht). Dann wird der IO-Befehl abgefangen und über den ATMEGA 1284 ausgeführt.

In diesem Projekt wurde das eben beschriebene Prinzip des MINI80 noch wesentlich erweitert, um die Möglichkeit während des geladenen CP/M-Programms auf die Sektoren in der RAM-Floppy zugreifen zu können (mit einem JMP-Befehl und einem fiktiven Unterprogrammaufruf mit RET, um am Ende des Lesens oder Schreibens des adressierten Sektors, die alte CPU-Adresse wieder einzustellen.

3. Hardware

Für die Hardware werden folgende Komponenten benötigt:

Der Aufwand für die Verdrahtung ist so gering, dass man die Testschaltung an einem Wochenende hinbekommen sollte.

Mein erste CP/M Aufruf des Z80HWE erfolgte am 13.01.2014 um 19:38 Uhr !!!

Schaltplan PDF: Z80HWE.pdf

Schaltplan Eagle: Z80HWE.sch

4. Software

Die Software für den ATMEGA1284 wurde mit dem RONPAS-Compiler geschrieben. Der RONPAS-Compiler kann unter RONPAS - AVR© PASCAL-Compiler im Bereich "Programmier-Projekte Lazarus / Free Pascal" herunter geladen werden. Da es sich hier noch um eine Beta-Version handelt, kann keinerlei Garantie über den Erfolg der Nutzung gegeben werden (siehe Lizenzbedingungen).

Durch die komplexe Zusammenarbeit zwischen ATMEGA und Z80 konnte mann im Vorfeld nicht genau sagen, wie schnell letztendlich der CP/M-Computer sein wird.

Die gute Nachricht ist: Alle getesteten Programme (POWER, Turbo Pascal) starten unter einer Sekunde aus der RAM-Floppy. Einen fühlbaren Leistungsunterschied zum Projekt CPD5 (mit einem wesentlich höheren Hardwareaufwand) konnte ich nicht feststellen.


Wie kommen BIOS, BDOS und CCP in den RAM?

Unter 2. Grundidee des MINI80 wurde genau beschrieben, wie der Urloader durch ATMEGA und Z80 in den RAM geschrieben wird. Der Urloader kopiert nach dem Start das BIOS in den oberen Speicherbereich (wie in CP/M üblich). Der Urloader selbst wird wie gewohnt mit den üblichen CP/M-Programmen (M80, LINKMT) übersetzt. Die entstandene COM-Datei wird mit dem Programm COM2INC.exe in einen PASCAL-Quelltext (Byte-ARRAY) konvertiert. Dieses Byte-ARRAY kann dann der ATMEGA weiter verarbeiten.

BDOS und CCP werden ebenfalls mit den ASSEMBLER-Programmen übersetzt und dann vom BIOS mit dem JMP-RET-LOADER (siehe unten) in den RAM geladen.


Ist die RAM-Floppy an Anfang leer?

Beim Ersten Start des Z80HWE wird ein Test-Sektor außerhalb der RAM-Floppy auf E5H getestet. Sind die Speicherstellen mit E5H gefüllt, so geht das Start-Programm davon aus, dass die RAM-Floppy sauber initialisiert ist. Wenn nicht, so wird die gesammte RAM-Floppy mit E5H initialisiert und anschließend der Anfang der RAM-Floppy (DIR und die weiteren Sektoren) mit dem Byte-ARRAY "DISK_TXT.INC" geladen. Prinzipiell können hier so viele Programme in die RAM-Floppy vorgeladen weden, wie noch Speicher im FLASH-ROM des ATMEGAs frei ist.

Momentan werden nur 2 Programme geladen:

  1. POWER.COM von Pavel Breder

  2. RT.COM (ein eigenes zerstörungsfreies RAM-Test-Programm (in Assembler vor über 25 Jahren geschrieben))


Wie funktioniert der JMP-RET-LOADER

Wie der Boot-Loader in den RAM kommt, wurde bereits im MINI80-Projekt ausführlich beschrieben.

Wie wird aber ein beliebiger Sektor von der RAM-Floppy geladen, unter der Bedingung, dass CP/M danach an der gleichen Stelle weitermachen kann (zusätzliches Problem: der Sektor befindet sich außerhalb des Z80 Adressbereiches).

Hier die Lösung:

Am Besten erklärt sich das Herangehen, indem man sich ein Teil der READ-Routine aus dem CP/M ansieht.

Mit "CALL XLOCATE" wird aus den Daten Sektor und Spur die genaue Adresse in der RAM-Floppy errechnet. Sie wird im Register HL an das Unterprogramm "COPY_RAM_TO_SECTOR" übergeben. Die Nummer der RAM-Page wird im Register C übergeben.


Im Unterprogramm "COPY_RAM_TO_SECTOR" wird als Erstes der Code für dieses Unterprogramm übergeben (IORQ_RAM2ARR), damit der ATMEGA erfährt, was eigentlich getan werden soll. Danach wird die Nummer der RAM-Page übertragen. Der ATMEGA wählt danach die Adresse der RAM-Page aus (A16..A18). Zum Schluss wird ein Sprung auf die Adresse, die sich in HL befindet (also die vorher berechnete RAM-Adresse auf der frei geschalteten RAM-Page) durchgeführt.

Ab hier werden 128 Byte des RAMs (also der RAM-Floppy) gelesen und in ein Sektor-ARRAY im RAM des ATMEGAs geschrieben. An die Z80-CPU wird ständig ein NOP übergeben, so dass sie fleißig die Adresse Inkrementiert, ohne wirklich etwas zu tun. Nach den 128 Byte wird nun der Z80-CPU ein RET Befehl übergeben. Damit beendet sie die Abarbeitung des Unterprogramms "COPY_RAM_TO_SECTOR" und macht im aufrufenden Programm des READ-Unterprogramms mit "LD C,0" weiter.

Im Sektor-ARRAY des ATMEGAs ist nun der gewünschte Sektor aus der RAM-Floppy gespeichert. Dieser Sektor soll nun in den Z80 Speicherbereich an die DMA-Adresse. Die RAM-Page ist also immer 0 (CP/M 2.2 Adressbereich von 64K), die Adresse gleich (DMAAD).

Im Unterprogramm "COPY_SECTOR_TO_RAM" wird nun (ähnlich wie oben) der Sektor aus dem Byte-ARRAY in den RAM kopiert. Die Übertragung endet wieder mit einem RET. Damit ist der READ-Befehl abgearbeitet.


RONPAS Quelltexte für ATMEGA1284 und BIOS Quelltext für CP/M 2.2 mit Anbindung an die CONSOLE (Version 1.0): Z80HWE_und_BIOS_V1.0.ZIP


5. Die CONSOLE - Anbindung an den PC

Wie schon CPD2, CPD3, CPD5 kann auch Z80HWE über die USB-SERIAL-Verbindung mit dem PC kommunizieren. Für die ersten Tests ist dies eine einfache und schnell umzusetzende Lösung. Die Übertragung der Daten läuft am Besten mit 128000 Baud (bei höheren Baudraten gab es bei mir viele Fehlermeldungen).

Das Programm mit Quelltext wird unter CONSOLE im Bereich "Programmier-Projekte Lazarus / Free Pascal" beschrieben.


6. Der Betrieb ohne PC

Als nächstes ist geplant, den Z80HWE ohne PC lauffähig zu machen. Dazu sind 3 Varianten in der Erprobung:


9. Lizenz

Creative Commons Lizenzvertrag
Diese(s) Werk bzw. Inhalt von Ronald Daleske steht unter einer Creative Commons Namensnennung-Nicht-kommerziell 3.0 Deutschland Lizenz.


keine Mängelgewähr

DIESE SOFTWARE WIRD VOM URHEBERRECHTSINHABER "OHNE MÄNGELGEWÄHR" BEREITGESTELLT. ALLE AUSDRÜCKLICHEN ODER STILLSCHWEIGENDEN GEWÄHRLEISTUNGEN, EINSCHLIESSLICH DER STILLSCHWEIGENDEN GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT UND EIGNUNG FÜR EINEN BESTIMMTEN ZWECK (JEDOCH NICHT DARAUF BESCHRÄNKT), WERDEN AUSGESCHLOSSEN. DER URHEBERRECHTSINHABER IST IN KEINEM FALL UND NACH KEINER HAFTUNGSTHEORIE (SEI ES AUF VERTRAGSBASIS, AUF DER BASIS STRENGER HAFTUNG ODER UNERLAUBTER HANDLUNGEN, EINSCHLIESSLICH FAHRLÄSSIGKEIT) FÜR BELIEBIGE VERURSACHTE DIREKTE, INDIREKTE, ZUFÄLLIGE, BESONDERE, EXEMPLARISCHE SCHÄDEN ODER FOLGESCHÄDEN (EINSCHLIESSLICH, JEDOCH NICHT BESCHRÄNKT AUF BESCHAFFUNG VON ERSATZPRODUKTEN ODER -LEISTUNGEN, NUTZUNGSAUSFALL, DATEN- UND GEWINNVERLUST ODER GESCHÄFTSAUSFALL) HAFTBAR, DIE AUFGRUND DER VERWENDUNG DIESER SOFTWARE ENTSTEHEN KÖNNEN. DIES GILT AUCH, WENN AUF DIE MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDE.


THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



Homepage Übersicht vorherige Seite Kontakt Impressum Warenzeichen