|
Wahrscheinlich einer der CP/M-Computer mit dem geringsten Hardwareaufwand. Mit nur 3+1 Schaltkreisen wurde einen lauffähigen CP/M-Computer mit RAM-Floppy entwickelt. Nur die CONSOLE (Monitor/Tastatur) wird über einen PC angeschlossen. |
Inhaltsverzeichnis1. Motivation und Zielstellung2. Grundidee des MINI80 3. Hardware 4. Software 5. Die CONSOLE - Anbindung an den PC 6. Der Betrieb ohne PC 9. Lizenz |
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.
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 gesammte Adressraum von 64KB wird nur von den Adressleitungen der Z80 CPU angesprochen und verwaltet.
Dadurch entfallen weitere Adress-Puffer und viele Adressleitungen.
Zwischen SRAM und Z80 CPU wird ein Latch (74HCT244) geschaltet, so dass die Z80 CPU nicht immer den Inhalt des RAMs bekommt, der wirklich drin steht.
Durch diesen Trick kann der SRAM zwar von der Z80 adressiert, dann aber beliebig manipuliert werden.
Die Z80 wird vom ATMEGA1284 getaktet und kann so jederzeit gestoppt werden (da die Z80 statisch arbeitet, kann man sie wirklich im Takt anhalten).
Auf diese Weise können Ein-Ausgabe-Operationen abgefangen und vom ATMEGA1284 abgearbeitet werden.
Der Start des CP/M Computers wird im Mini80 Overview näher beschrieben und verdeutlicht gut die Arbeitsweise.
Z80 CPU Reset auf 0 legen
einige Takte anlegen bis die Z80 intern alle Register zurückgesetzt hat (ich habe hier 100 Takte genommen)
Einschalten des Tri-State-Puffers zwischen Z80 CPU und SRAM
Z80 CPU Reset auf 1 legen (Reset aufheben)
jetzt so viele Takte erzeugen, bis die Z80 CPU die /RD Leitung aktiviert (auf 0 legt) um den ersten Befehl zu lesen (M1-Zyklus)
der SRAM ist jetzt durch die CPU (Adressleitungen A0 bis A15) und durch den ATMEGA 1284 (Adressleitungen A16 bis A18) vollständig adressiert
nun kann das erste Byte aus den Flasch-Speicher des ATMEGA 1284 in den SRAM kopiert werden
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
die Z80 führt den Befehl aus (macht nun eben - NICHTS -), inkrementiert die Adressleitung und möchte den nächsten Befehl lesen
die Punkte 5. bis 9. so lange wiederholen bis der gesammte Loader in den SRAM geladen wurde
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.
Für die Hardware werden folgende Komponenten benötigt:
ATMEGA1284 (oder ATMEGA644)
Z80 CPU
SRAM 512 KB (z.B. K6X4008C1Foder SM624008LLP55)
Latch 74HCT244
Quarzgenerator 18.432 MHz
USB-Serial-Adapter zur Kommunikation mit dem PC (CONIN, CONOUT, READ/WRITE LW:B)
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.zip
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 im Vorfeld nicht genau ermittelt werden, 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.
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.
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:
POWER.COM von Pavel Breder
RT.COM (ein eigenes zerstörungsfreies RAM-Test-Programm (in Assembler vor über 25 Jahren geschrieben))
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
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.
Als nächstes ist geplant, den Z80HWE ohne PC lauffähig zu machen. Dazu sind 3 Varianten in der Erprobung:
das CONSOLE-Programm auf einem RASPBERRYPI laufen zu lassen und über die serielle Schnittstelle die Kommunikation zum CP/M-Computer realisieren (ein erster Test lief erfolgreich)
ein eigenes LC-Display für dien CP/M-Computer zu nehmen (Test mit LCD-Modul LCM-5430-E vielversprechend aber Schnittstelle zum CP/M noch nicht gekärt)
einem Zusatzmodul mit ATMEGA 328 und einem VGA-Monitor (Test läuft, grundsätzlich mit wenig Aufwand möglich, Schnittstelle zum CP/M noch nicht gekärt)
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.