Amateur(funk)computer AC1 - 40th anniversary

Projekt picoAC1

Motivation

In der Ausgabe 12/1983 der Zeitschrift Funkamateur startete eine Artikelreihe zum Selbstbau eines Computers, die einiges Aufsehen erregte. In dieser und zehn weiteren Ausgaben im Folgejahr wurden Konzept, Aufbau und Inbetriebnahme des Amateurfunkcomputers AC1 beschrieben.
Im Osten unseres Landes stellten Computer zu dieser Zeit die Ausnahme dar. In der Industrie vereinzelt vorhanden, waren sie jedoch als Privatperson ohne Beziehungen nicht beschaffbar.
Allerdings tat sich einiges in der Bauteilproduktion. Die Z80-Reihe von Zilog wurde geklont und war im Handel erhältlich. Auch die notwendige Peripherie war beschaffbar. Auf diese Bedingungen war das AC1-Projekt ausgelegt.

Unter Federführung von Frank (heute DL7UFH) wurde ein Konzept erstellt, eine Platine entworfen und ein Betriebssystem zur Verfügung gestellt. Auf Grund der Marktlage waren einige Kompromisse in der Hardware-Ausstattung erforderlich.
Von den Platinen wurden schätzungsweise 6000 - 10000 Stück produziert, sodass man davon ausgehen kann, dass einige tausend Exemplare zum Laufen gebracht wurden.
Wer damals dabei war, wird sich an den stolzen Moment erinnern, als zum ersten Mal der Cursor blinkte.

In den folgenden Jahren wurde die Hardware erweitert und Software geschrieben. Viele weitere Artikel erschienen dazu im Funkamateur.
Zahlreiche Treffen und Veranstaltungen fanden speziell zu diesem Thema statt, um Ideen und Software unter die Leute zu bringen. Ich glaube mich zu erinnern, dass man damals noch richtig miteinander redete.

Mit der Wende eröffneten sich neue Perspektiven und die Prioritäten änderten sich. Die meisten AC1 sind ins persönliche Museum und später vielleicht auf den Müll gewandert.
Das Wissen, das wir uns in diesen Jahren angeeignet haben, dürfte aber vielen den Einstieg in die neue Zeit erleichtert und das weitere Leben geprägt haben.

Es gab aber auch Enthusiasten, die das Projekt weiter verfolgt haben. So erschien zum 25-jährigen Jubiläum der AC2010 im völlig neuen Design und 2017 wurde die fast originale Leiterplatte noch einmal neu aufgelegt.
Einen sehr guten Überblick über die Entwicklung bis heute bietet die Webseite von Johann ac1-info.de.

Nach 40 Jahren haben wir überlegt, wie ein kompatibler AC1 heute aussehen könnte. Daraus ist dieses Projekt entstanden.
Jeder, der sein Wissen auffrischen und den Schuhkarton mit Kassetten vom Dachboden holen möchte, ist herzlich eingeladen mitzumachen. Den Enkeln bietet sich die Möglichkeit, einem Prozessor auf Augenhöhe und mit natürlicher Intelligenz zu begegnen.

Aufbau und Inbetriebnahme sollten an einem Wochenende möglich sein. Die Bauelementekosten liegen bei etwa 80€.

Aber eines muss klar sein: In Puncto Rechenleistung kann auch ein modernisierter AC1 den aktuellen Plattformen und Mikrocontrollern nicht das Wasser reichen.

Viel Spaß und Erfolg wünschen
Frank DL7UFH & Jörg DL7VMD

Konzept

Folgende Mindestanforderungen soll der Retro-AC1 erfüllen:

  • Kompatibilität durch Verwendung von Zilog-Komponenten CPU, PIO, CTC
  • voll ausgebauter Speicher, 64k EPRom & RAM
  • CP/M-fähig
  • Micro-SD-Karte als Massenspeicher
  • Anschluss von USB-Tastatur und VGA-Monitor
  • Stromversorgung über 5V-USB-C-Steckernetzteil
  • Einplatinenlösung, max. 25% der ursprünglichen Größe
  • Verwendung aktuell handelsüblicher Bauelemente
  • Aufbau mit Lötstation möglich (Ü65-tauglich)

Bei der Renovierung des Konzeptes wurden die einzelnen Funktionsblöcke des AC1 betrachtet. Basis war der Ausbaustandstand von 1989/90 mit dem Betriebssystem Monitor V3.1.

system Die Bestandssoftware soll eine kompatible Umgebung vorfinden. Daher wird der Rechnerkern im Grundsatz aus dem Ur-AC1 übernommen.
Der Zilog-Prozessor und die zugehörigen Peripheriebausteine sind selbst nach über 40 Jahren noch im Handel erhältlich. In der Typenreihe Z84C sind CPU, PIO und CTC in CMOS-Technik mit Taktfrequenzen bis 10 MHz verfügbar.

Der gesamte adressierbare Speicherbereich wird mit einem EPROM und einem SRAM ausgebaut. Durch die Reduzierung auf nur zwei Speicherbausteine wird der Platzbedarf des Kerns deutlich verringert.

Knapp die Hälfte des Ur-AC1 nahm die Bildschirmsteuerung ein. Das Konzept dieses Blockes wurde grundlegend überarbeitet und die gesamte Funktionalität in einen Raspberry Pico ausgelagert.
Anders als im damaligen AC1, in dem ein Teil des Arbeitsspeichers im Multiplexverfahren sowohl von CPU als auch von der VideoUnit (VDU) genutzt wurde, steht nun der Bereich im Arbeitsspeicher allein der CPU zur Verfügung.
Der neue picoVDU kann Adress- und Datenbus mitlesen und wird getriggert, sobald zu schreibende Bilddaten auf dem Bus anstehen. Diese speichert der picoVDU und erzeugt so einen Spiegel des BWS.
Alle weiteren Prozesse zur Bildschirmausgabe laufen Pico-intern ab. Im Resultat wird ein VGA-kompatibles Signal mit 640x480 Pixeln bei ca. 60Hz ausgegeben. Zur Anzeige kann ein beliebiger VGA-Monitor genutzt werden.
Die Bezeichnung "Bildwiederholspeicher" entspricht nun nicht mehr der Funktion, soll aber der alten Zeiten willen beibehalten werden.

Ein weiterer großer Brocken im Ur-AC1 war die Tastaturlogik. Hier kann nichts grundsätzlich neues erfunden werden, da es Anwenderprogramme gibt, die die parallele Schnittstelle (PIO A) direkt abfragen. Bis zu diesem Port muss alles beim Alten bleiben.
Die steuernde Tastaturlogik übernimmt ein zweiter Pico. Da er hauptsächlich mit Ein-/Ausgaben beschäftigt wird, hat er die Bezeichnung picoIO erhalten.
Als Tastatur kann eine beliebige USB-PC-Tastatur genutzt werden.

Als Massenspeicher dient eine Mico-SD-Karte. Sie ist FAT32/exFAT-formatiert und kann auch am PC geschrieben und gelesen werden.
An der PIO lässt sich zwar noch über PIO-PB 6/7 ein externes Kassetten-IF anschließen, um bspw. die alten Schätze zu retten, eine sinnvolle Alternative zur SD-Karte stellen Kassetten aber nicht mehr dar.

Der picoIO übernimmt sowohl die Taktversorgung als auch die Resetlogik des Z80. Beide Funktionen werden später näher beschrieben.

Außerdem kann ein RTC-Modul angeschlossen werden. Dies ist sinnvoll, um Dateien mit der korrekten Uhrzeit zu speichern. AC1-Anwendungen, die diese Funktion nutzen, existieren bisher nicht.

Bei der Suche nach einem geeigneten Controller fiel die Wahl auf den Raspberry Pico, da er verfügbar und preiswert ist. Für die geplanten Funktionalitäten sind SW-Bibliotheken vorhanden und bei uns bestand zum Projektstart Basiswissen in dieser Technik. Programmiert werden die beiden Pico mit dem Pico-SDK in C.
Die aktuellen Binaries sind im Repository abgelegt. Das Flashen der Pico ist für jeden Anwender einfach möglich.

Klarer Nachteil der Pico ist der unterschiedliche Logikpegel zum Z80. Der Rechnerkern kommt zwar an den meisten Eingängen mit dem 3.3V-Pegel des Pico zurecht. Die 5V-Ausgänge dürfen dem Pico jedoch nicht direkt angeboten werden. Hier sind Pegelwandler notwendig.

Die beiden Pico sind auch Namensgeber des Projektes: picoAC1

Zu guter Letzt sollte noch die Stromversorgung erwähnt werden. Die Netzteile mussten im alten AC1 mit den Aufgaben wachsen. 25 bis 30W, die letztendlich in Wärme umgesetzt wurden, dürften keine Seltenheit gewesen sein. Der Haushaltslüfter von AKA-Elektrik war festes Zubehör so manchen Rechners.
Da im picoAC1 die Schaltkreise in CMOS-Technik ausgeführt sind und die beiden Pico auch recht sparsam agieren, kommt die Grundplatine mit weniger als 0,5 Watt aus. Die 5V-Versorgung erfolgt aus einem Steckernetzteil über eine USB-C-Buchse auf der Grundplatine.

In den nächsten Kapiteln wird näher auf Details der Schaltung eingegangen. Wer sich erst einmal einen Überblick verschaffen möchte, kann diesen Teil überfliegen oder gleich zum praktischen Teil springen.

Schaltung und Z80-Kern

Schaltbild_AC1
Die Schaltung des Rechnerkerns mit CPU, PIO, CTC und Speicher entspricht im Grundsatz dem von Zilog vorgegebenen Standard. Die Funktionsweise kann der sehr ausführlichen Doku zum Ur-AC1 entnommen werden.

Auf einige Besonderheiten soll an Hand des Schaltbildes eingegangen werden.


Speicher-Adresslogik

Der Z80 kann 64kBytes Speicher adressieren. Diesen Bereich müssen sich EPROM und RAM teilen.
Bei der Adressierung werden zwei Modi unterschieden:

AC1 - Modus
CP/M - Modus

Nach einem Reset befindet sich der Rechner im AC1-Modus. Das Betriebssystem erwartet dabei folgende Speicheraufteilung:

0000H ... 0FFFH - EPROM Monitor, ggf Minibasic
1000H ... 17FFH - RAM Bildwiederholspeicher (BWS)
1800H ... 18FFH - RAM Systemzellen
1900H ... FFFFH - RAM Arbeitsspeicher

Dem Schaltbild kann entnommen werden, dass sowohl EPROM als auch SRAM deutlich höhere Speicherkapazitäten aufweisen. Dies hat zwei Gründe. Zum einen sind ICs mit passenden Kapazitäten kaum noch beschaffbar und wenn, dann nicht bezahlbar. Zum anderen sind größere Speicher flexibler einsetzbar.

Beim EPROM kann im picoAC1 zwischen 27C64, 27C128, 27C256 oder 27C512 gewählt werden. Die Pinbelegung dieser Typen ist ähnlich. Die Differenzen sind per Jumper auf der Platine anzupassen.
Die höhere Kapazität wird genutzt, um mehrere Monitorvarianten in den 4k-Bereich des Systems einzublenden.
Die CPU adressiert den EPROM über A0 .. A11. Die Adresseingänge A12 und A13 werden über GPIO 14/15 des picoIO gesteuert. In der Initialisierungsphase werden beide auf Low gesetzt. Damit ist der untere 4k-Bereich des EPROMs aktiviert.
Per Funktionstasten sind die GPIO schaltbar, womit sich insgesamt vier 4k-Blöcke mit unterschiedlichen Monitorvarianten einblenden lassen. Beim 27C64 sind es nur zwei Blöcke, da dort A13 nicht vorhanden ist.

Als SRAM wird ein 128 kBytes-Typ eingesetzt. Hier sind keine Variationen möglich. Durch die Verwendung von zwei 64k-RAM-Blöcken lässt sich der CP/M-Modus relativ einfach realisieren.

Die zentrale Schaltstelle in der Adresslogik bildet der BCD-Decoder U5 mit dem OR-Gatter U6D und dem D-Flip-Flop U8A. Im AC1-Modus bleibt U8A dauerhaft inaktiv und beeinflusst den Decoder nicht.
Bei Speicherzugriffen decodiert U5 die anliegende Adressinformation der CPU in 2k-Schritten. Wird der EPROM adressiert ist an U5 entweder O0 oder O1 low und aktiviert damit den EPROM über dessen /CE-Eingang. Auf der gleichen Leitung wird der SRAM über seinen (nicht invertierenden) CS-Eingang deaktiviert.
In allen anderen Adressbereichen bleiben O0 und O1 des U5 hight, der SRAM wird über seinen CS freigegeben und der EPROM über /CE gesperrt.
Zusammen mit den CPU-Signalen /MREQ, /RD, /WR und der Diodenmatrix am Ausgang von U5 wird die Speicherlogik im AC1-Modus geregelt.
Innerhalb des RAM-Bereiches wird über O2 des Decoders gemeldet, dass der BWS adressiert wird. Eine Verknüpfung mit /WR signalisiert der Video-Unit, dass zu schreibende Bilddaten auf dem Bus bereitstehen.

Soweit die Adresslogik im AC1-Modus - alles ganz einfach ! Nun kommt die CP/M-Kompatibilität ins Spiel.

Das Betriebssystem CP/M läuft im oberen RAM-Bereich. Zur Initialisierung wird es im AC1-Modus dorthin geladen, angesprungen und übernimmt das Kommando über das System. Im gesamten Adressbereich von 0000H bis zur Betriebssystemgrenze erwartet CP/M frei verfügbaren RAM. Es duldet weder den EPROM ab 0000H noch den Bildwiederholspeicher ab 1000H.
Zur Ausblendung des EPROM wird der D-Flip-Flop U8A über einen Out-Befehl gekippt. Dessen /Q-Ausgang wird low, womit alle Ausgänge von U5 H-Pegel führen. Damit wird der EPROM dauerhaft deaktiviert und sämtliche Speicherzugriffe erfolgen im RAM. Damit wäre das Problem des EPROM gelöst.
Beim Ausblenden des BWS kommt der zweite 64k-Block des SRAM ins Spiel. Vor jeder Zeichenausgabe wird U8A wieder in Grundstellung gesetzt, was wiederum den Decoder U5 aktiviert. Wird nun durch CP/M das Zeichen in den Speicherbereich 1000H - 17FFH geschrieben, zieht der Decoder seinen Ausgang O2 auf low und sorgt dafür, dass die Bilddaten in den "unteren" 64k-Block des SRAM geschrieben werden.
Danach wird U8A wieder aktiviert.

Der RAM-Arbeitsspeicher befindet sich also im "oberen" und der BWS im "unteren" 64-k-Block des SRAM. So werden Kollisionen vermieden und die Funktion sichergestellt.
Erwähnt werden muss noch, dass auch der 2k-Bereich 1800H ... 1FFFH in den unteren SRAM-Block gekippt wird. Das bewirkt, dass der System-RAM des AC1 vor dem Überschreiben durch CP/M gerettet wird und ein sauberer Rücksprung vom CP/M in den AC1-Modus möglich wird.

Im Grunde trifft die Aufteilung des SRAM auch auf den AC1-Modus zu. Hier ist es aber ein reines HW-Verhalten, bedingt durch die CP/M-Kompatiblität. Aus Sicht der CPU und des Betriebssystems handelt es sich im AC1-Modus um einen durchgehenden Speicherbereich.


IO-Adresslogik

Die Logik zur Adressierung der Peripherie wird aus U4, U6A und U6B gebildet. Jedem IO-Baustein werden vier 8Bit-Adressen zugeordnet.

IOSEL0:  00H .. 03H - CTC Grundplatine
IOSEL1:  04H .. 07H - PIO Grundplatine
IOSEL2:  08H .. 0BH - Erweiterung Systembus 
IOSEL3:  0CH .. 0FH - Erweiterung Systembus
IOSEL4:  10H .. 13H - NC
IOSEL5:  14H .. 17H - NC
IOSEL6:  18H .. 1BH - NC
IOSEL7:  1CH .. 1FH - CP/M - Umschaltung
Am Systembusstecker stehen IOSEL2/3 für Erweiterungen, bspw eine zweite PIO, zur Verfügung. Sollten weitere IO-Adressen am Systembus benötigt werden, können diese aus A0 .. A7 in Verknüpfung mit /IOREQ gebildet werden.


Systemtakt

Der Systemtakt der Z80-ICs wird vom picoIO an GPIO21 bereitgestellt. Basis ist der picointerne 48MHz-USB-Oszillator. Es sind beliebige ganzzahlige Teilerverhältnisse programmierbar. Die Takterzeugung ist hardwarebasiert und hat keinen Einfluss auf die Rechenleistung des Pico.

Der Clockeingang des Z80 stellt spezielle Anforderungen. Lt. Datenblatt muss die Spannung bei H-Pegel min. Vcc-0,6V, also 4,4V betragen. Er lässt sich damit nicht direkt vom Pico ansteuern.
Zur Pegelwandlung ist der zweite D-Flip-Flop U8B zwischengeschaltet. Als Nebenwirkung muss der picoIO die doppelte Frequenz liefern.

Der Ur-AC1 wurde mit 2MHz getaktet. In späteren Ausbaustufen waren mit neuen Prozessoren auch 4MHz möglich.
Beim picoAC1 sind folgende Taktftrequenzen wählbar: 2 / 4 / 6 / 8 MHz.
Nach einem Reset des picoIO wird GPIO21 mit 4MHz initialisiert. Durch den nachgeschalteten 2:1 Teiler ergibt dies einen Systemtakt von 2MHz. Die anderen Taktraten sind per Funktionstasten wählbar.
Unter mehreren Aspekten muss der 8MHz-Takt jedoch als experimentell angesehen werden.


Resetlogik

Die Resetlogik des picoAC1 agiert in zwei Ebenen. Ein Reset des Gesamtsystems erfolgt sowohl durch den Reset-Taster auf der Grundplatine, als auch durch "PowerOn". Dabei werden beide Pico frisch initialisiert. Der picoIO gibt für 100µs einen Low-Impuls an GPIO20 aus und resettet damit den Z80-Kern in der darunter liegenden Ebene.
Manuell kann ein Z80-Reset jederzeit durch die Tastenkombination Strg+Alt+Entf ausgelöst werden. Dies beeinflusst die darüber liegende Pico-Ebene nicht.

Aus Pinmangel hat Zilog der PIO keinen eigenen Reseteingang spendiert. Das Rücksetzen dieses IC erfolgt mit der Signalkonstellation: /M1=L /RD=H /IOREQ=H , die im normalen Programmablauf nicht vorkommt.
Im picoAC1 wird dazu /M1 an der PIO durch Q3 während des Reset auf Low gezogen. GPIO19 liefert dazu einen inversen Reset.
Im Alt-AC1 gab es eine ähnliche Schaltung, nur wurde hier der H-aktive /M1 direkt an der CPU kurzgeschlossen. Das war nicht ganz sauber. Schadensmeldungen sind uns aber nicht zu ohren gekommen.
Im picoAC1 liegt in der /M1-Leitung ein 1k-Schutzwiderstand (R17) und Q3 direkt am PIO-Eingang. Eine Kontrolle am Oszi zeigte, dass R17 keinen signifikanten Einfluss auf die Form von /M1 hat.
Bei Erweiterungsboards mit PIO muss dieser Reset separat generiert werden.

Video-Unit

picoVDU
Die Videounit (VDU) des picoAC1 hat keine Gemeinsamkeiten mit der Bildaufbereitung des alten AC1. Dies ist aus Gründen der Kompatibilität auch nicht notwendig, da keine Rückwirkungen auf den Z80-Kern bestehen. Es ist lediglich der Speicherinhalt des BWS auf dem Bildschirm darzustellen.
Die VDU greift nicht mehr auf den RAM des Arbeitsspeichers zu, sondern spiegelt die BWS-Daten in einem 2k-Array im picoVDU.
In der Skizze ist der Ablauf dargestellt, den man sich dreistufig, von links beginnend vorstellen kann. Der Pico verfügt über zwei Kerne, die unabhängig voneinander arbeiten (Core 0/1).

Teil der VDU sind die 74HCT03 U9 - U13. Hauptaufgabe dieser ICs ist die Pegelwandlung mit den zugehörigen Pullup-Widerständen. Zur Einsparung von GPIO multiplexen sie Adress- und Dateninformationen auf gemeinsame Pico-Eingänge.


Phase 1

In einer kurzen Endlosschleife in Core 0 wird fortwährend der Zustand des GPIO-Bit 13 abgefragt. Sobald die CPU auf den BWS zugreift, zieht der Adressdecoder U5 seinen Ausgang O2 auf low. Wenn während dieses Zustandes die CPU auch /WR nach low zieht, wird der Ausgang des OR-Gatters U6C low. Damit wird dem picoVDU über GPIO 13 signalisiert, dass Daten in den Bildwiederholspeicher geschrieben werden.
Es wäre naheliegend, mit diesem Ereignis einen Interrupt auszulösen. Die Bearbeitungszeit bis zum Ansprung einer Interrupt-Service-Routine beträgt jedoch mehrere hundert Nanosekunden. Bis dahin sind Adress- und Datenbus längst wieder ungültig.
Daher wird GPIO13 gepollt. Dies erfolgt im 50ns-Takt (in Worten: Zwanzig Millionen mal je Sekunde).

Sobald low an GPIO13 erkannt wird, werden die Adressbits A0..A10 eingelesen. Dies erfolgt unmittelbar, da die Adressmultiplexer bereits am Ende des letzten Zyklus aktiviert wurden.
Die Adressinformation wird gespeichert, der Adressmultiplexer deaktiviert und der Datenmultiplexer aktiviert. Auf Grund der Gatterlaufzeiten, stehen die Daten an den Ausgängen nicht sofort zur Verfügung. Der Pico wartet 24ns, liest den Datenbus ein, speichert den Zustand und deaktiviert den Multiplexer.
Adressen und Daten sind während eines Rechnertaktes zzgl. einiger 10ns gültig. Bei 2MHz sind das 500ns, kein Problem. Beim 8MHz-Takt muss das Einlesen in 125ns erledigt sein. Wenn man bedenkt, dass im ungünstigen Fall schon 50ns beim Pollen verloren gehen können, wird das Ganze sportlich.

Nachdem Adresse und Daten zwischengespeichert sind, muss das Zeichen im Array abgelegt werden. Die 03er Gatten negieren die Informationen vor dem Einlesen. Die Adresse wird dadurch "zurückgedreht", sodass das Zeichen links/oben in Zelle 0 des Arrays abgelegt wird. Die Daten werden vor dem Speichern bitweise negiert.

Das Array des Spiegel-BWS ist 16 Bit breit. In das low-Byte wird das Zeichen geschrieben und zusätzlich Bit15 als Flag für den nachfolgenden Prozess gesetzt.

Danach wird der Adress-Mux für den nächsten Zyklus aktiviert und gewartet bis der Schreibzyklus beendet ist, indem GPIO13 auf H-Pegel gepollt wird.

Im Worst-Case kann nach drei CPU-Takten der nächste Schreibvorgang folgen.


Phase 2

In einer Endlosschleife in Core1 wird der Spiegel-BWS nach gesetztem Flags (Bit15) durchsucht. Dies kennzeichnet ein neues Zeichen an dieser Position und damit Ungültigkeit der bisher dargestellten Pixel.
Aus dem gewählten Zeichengenerator (ZG) wird das darzustellende Zeichen geholt und jedes Bit an der zugehörigen Position im Pixelarray gesetzt. Bei einer "1" im ZG wird dabei die Zeichenfarbe gesetzt und bei einer "0" die Hintergrundfarbe.
Anschließend wird das Flag rückgesetzt, damit das Zeichen im nächsten Schleifendurchlauf nicht erneut bearbeitet wird.

Dieser Prozess läuft asynchron zum Prozess in Phase 1. Während die Verzögerung bei einzelnen darzustellenden Zeichen für das Auge nicht wahrnehmbar ist, treten bspw. beim Scrollen des gesamten BWS-Inhaltes sichtbare Sprünge auf.


Phase 3

Dieser Prozess läuft komplett in der VGA-Bibliothek des Autors Van Hunter Adams. Hieraus ist in den picoVDU der Graphic-Kern eingebunden. Der Rest seines Repositories beinhaltet Beispielanwendungen.

Zur Darstellung ist ein Pixelarray mit 153600 Bytes in der Bibliothek reserviert. Die Größe resultiert aus der Anzahlt der VGA-Pixel: 640*480 = 307200. Ein Pixel hat eine Datenbreite von 3 Bit. Jeweils 2 Pixel werden in einem Byte gespeichert, wobei 2 Bit ungenutzt bleiben. Hieraus ergibt sich die feste Größe von 153.6 kBytes.

In einem Prozess in Core 1 werden die Pixel in ihrer Darstellungsreihenfolge in einen DMA-Channel geschrieben. Die PIO-Logik des Pico sorgt für ein zeitgerechtes Auslesen und setzen der GPIO für die RGB- und Synchronsignale.
Bei den PIO handelt es sich um eigenständige, programmierbare Hardwareeinheiten des Pico mit denen Schnittstellen nachgebildet werden. Es sind 2 Blöcke mit je 4 PIO-State-Machines vorhanden. Der VGA-Treiber benutzt den Block 0. Programmiert werden die PIO in Assembler.
Hierbei ist bemerkenswert, dass der Arbeitsspeicher nur maximal 32 Befehle aufnehmen kann, also die komplette Aufbereitung des VGA-Signals in 32 Schritten erledigt wird. Der Arbeitsspeicher wird dabei voll ausgenutzt.


Zeichengeneratoren und Darstellung

Im Alt-AC1 steckte ein ROM / EPROM in dem die Zuordnung der Pixel zu jedem der 256 darstellbaren Zeichen festgelegt war, bei einem Raster von 6 Spalten x 8 Zeilen. Bei 64 Zeichen mal 32 Zeilen ergibt das eine Darstellung von 384 x 256 Pixeln. Der analoge BAS-Ausgang "matschte" das in etwa auf die verfügbare Bildfläche.

Am VGA-Ausgang hat das zur Folge, dass nur etwa ein Drittel der Fläche zur Darstellung genutzt wird. Der Zeichengenerator ist als Array in der picoVDU-SW eingebunden. Eine Skalierung wäre unter Berücksichtigung der Rechenleistung des Pico nur in ganzzahligen Schritten möglich. Bereits der Faktor 2 ist aber schon nicht mehr darstellbar.
Für größere Darstellungen wurden von unserem Chef-Designer Jürgen (immer noch ohne Rufzeichen), zwei zusätzliche ZG mit gleicher Darstellung, aber höherer Auflösung erstellt.
Per Funktionstasten sind folgende Einstellungen wählbar:

  Zeichen    Fläche     Tastenkombination  Bemerkung
   6 x  8    384 x 256   Alt + F5           ZG des Ur-AC1
   9 x 12    576 x 384   Alt + F6		
  10 x 14    640 x 448   Alt + F7
Über AltGr sind die entsprechenden Auflösungen mit dem SCCH-Zeichensatz einstellbar.

Der ZG 9x12 wird beim Systemstart als default festgelegt. Er sollte bei allen VGA-Monitoren funktionieren. In der 10x14-Darstellung kann es an den Rändern zu Problemen kommen.


Farben

Der Alt-AC1 kannte nur hell und dunkel. Die Darstellung wurde durch den Monitor bestimmt. Spätere AC1-Varianten ermöglichten farbige Darstellungen, dies jedoch unter Aufgabe der HW-Kompatiblität.

Im picoAC1 sind farbige Darstellungen als Abfallprodukt des VGA-Treibers möglich. Für Zeichen- und Hintergrundfarbe kann aus 8 möglichen Farben (3 Bit) gewählt werden. Eine dynamische bzw. zeichenweise Farbzuordnung ist weiterhin nicht möglich. Folgende Farben stehen zur Verfügung:

 0 - schwarz
 1 - rot
 2 - grün
 3 - gelb
 4 - blau
 5 - magenta
 6 - cyan
 7 - weiss
Gesteuert wird die Farbdarstellung auf der Kommandozeile des AC1 mit dem Kennbuchstaben "c", bspw:
 c 3:4:7
Dies bewirkt gelbe Schrift auf blauem Hintergrund. Der dritte Parameter ist optional und zeichnet einen weißen Rahmen um die Darstellungsfläche. Weglassen dieses Arguments zeichnet einen schwarzen Rahmen.

Die Farbdarstellung ist kein wirkliches Feature, kann aber etwas Abwechslung fürs Auge bringen. Auch für nichtlineare Geschmacksrichtungen ist so einiges dabei.

Sowohl die manuelle Auswahl des ZG als auch der Farben wird dem picoVDU via I2C-"PICOM"-Schnittstelle übermittelt.

Peripherie

IO_Skizze

Ein zweiter Raspberry Pico, der picoIO, übernimmt weitere Funktionen in der Peripherie des Z80-Kerns. Takterzeugung, Reset und die EPROM-Block-Adressierung wurden bereits erläutert.
In diesem Abschnitt geht es um Tastatureingaben, Massenspeicher, Systemzeit und die internen Kommunikationskanäle.
In der Skizze sind die unterschiedlichen Spannungszonen zu beachten.



Tastaturlogik

Im Alt-AC1 wurde als Tastatur genutzt, was man hatte oder auftreiben konnte. Dementsprechend vielfältig waren die Tastaturelektroniken. Allen gemeinsam ist die Schnittstelle zum PIO-Port A.
An Bit 0..6 liegt der ASCII-Code des einzugebenden Zeichens, an Bit 7 der Tastaturstatus (H-aktiv).
Dieses Verhalten muss auch im picoAC1 erhalten bleiben, da einige Anwenderprogramme direkt auf diese Schnittstelle zugreifen.

Gesteuert wird die Ausgabe an GPIO 0..7 des picoIO. Grundsätzlich wäre es möglich, die Pico-Ausgänge direkt mit den PIO-Eingängen zu verbinden. Da aber nicht auszuschließen ist, dass ein Anwenderprogramm den Port A als Ausgang setzt, sind zum Schutz Levelshifter zwischengeschaltet.
Ein 4-fach-LVS U19 wurde extra für diesen Zweck projektiert, zwei freie Bit aus dem vorhandenen LVS U7 genutzt und schließlich für zwei Bit lediglich ein Schutzwiderstand vorgesehen. Nicht ganz übersichtlich, es erfüllt aber seinen Zweck.
Der Einsatz der LVS hält die Möglichkeit offen, einen weiteren bidirektionalen Kommunikationskanal zwischen Z80 und picoIO zu schalten.

Als Eingabegerät dient eine normale USB-PC-Tastatur. Verbunden wird sie über den USB-Anschluss des picoIO. Eine direkte Anschaltung ist jedoch nicht möglich, da an der USB-Buchse des picoIO keine Betriebsspannung anliegt. Die 5V werden an der USB-A-Buchse auf der Grundplatine zugeführt. Es ist ein kurzes Adapterkabel zwischen der Micro-USB-Buchse und J8 anzufertigen. D8 schützt die Schaltung vor unzulässiger Spannungszuführung über die USB-A-Buchse.

Sobald die Tastatur als HID-Device durch den Treiber erkannt wird, leuchtet die Onboard-LED die picoIO. Auch Tests mit verschiedenen drahtlosen Tastaturen waren erfolgreich. Tastaturen, die am PC versuchen Treiber nachzuladen, werden hier nicht funktionieren.

Als Tastaturtreiber ist die Tiny-USB-Lib , die Bestandteil des Pico-SDK ist, ins Programm eingebunden. Ein Tastendruck löst ein Ereignis aus, das auf Anwenderprogrammebene abgefragt und ausgewertet wird. Übergeben wird ein der Taste zugeordneter Scancode und ein Set von Modifikatoren (Strg, Shift, Alt..).

SD-Card-Interface

Das Kassettentonbandgerät hat als Massenspeicher ausgedient. An seine Stelle tritt die Micro-SD-Karte. Selbst "kleine" Karten dürften mehr Daten aufnehmen, als jemals Programme für den AC1 geschrieben wurden.
Wer seinen Schuhkarton mit den alten Schätzen wiederbeleben möchte, kann aber noch ein externes Kassetten-IF an PIO-PB6/7 anstecken. Die Monitorroutinen "S" und "L" sind weiterhin verfügbar.

Das SD-Card-Shield ist per SPI-IF mit dem picoIO verbunden. Master ist der Pico. Die Taktfrequenz beträgt 12.5MHz. Funktionstests mit verschiedenen Karten liefen erfolgreich. Zwei Uralt-Typen, die am PC funktionierten, haben jedoch am picoIO den Dienst verweigert. Hier brachte auch die drastische Herabsetzung des SPI-Taktes keine Änderung. Evtl. unterstützen diese Karten kein SPI. In diesem Fall hilft nur probieren.

Die Software basiert auf der generischen FatFs-Bibliothek von Elm Chan, die auch für Kompatibilität mit dem PC sorgt.
Die Anpassung an den Raspberry Pico stammt von carlk3, die bis auf kleine Änderungen in die picoIO-SW eingebunden wurde.

Die Datenübertragung mit dem Z80 erfolgt seriell über PIO-PB4/5. Diese Schnittstelle wurde ZCOM getauft. Die Funktionsweise wird in einem späteren Kapitel beschrieben.

Die SD-Karten werden am PC mit FAT32 oder exFAT formatiert. Andere Formate wurden nicht getestet. Hinweise zur Bedienung sind in der Beschreibung zur Monitorerweiterung zu finden.


Real-Time-Clock

Der Pico bringt zwar von Hause aus eine interne Echtzeituhr mit, die jedoch nicht batteriegepuffert ist und bei jedem Bootvorgang neu gestartet wird. Zur Übernahme der korrekten Zeit, lässt sich ein RTC-Modul DS3231 (5pol.) anstecken. Die Kommunikation läuft über einen I2C-Kanal des picoIO. Nach jedem Booten wird die aktuelle Zeit am Modul abgefragt und die Pico-interne Uhr gesetzt.
Genutzt wird die interne Zeit durch die FatFS-Bibliothek beim Speichern von Dateien.
Das RTC-Modul muss nicht zwingend für die Funktion des picoAC1 vorhanden sein. Die Uhr kann auch nach jedem Start per Hand gestellt werden oder man lebt einfach mit dem falschen Dateidatum.
Die Programmierung der Zeit erfolgt auf der AC1-Kommandozeile in GMT, s. Beschreibung der Monitorerweiterung.


ZCOM - Kommunikation Z80 <--> picoIO

Die Datenkommunikation zwischen Z80(PIO) und dem picoIO läuft über eine synchrone, serielle Verbindung. Vorbild ist die I2C-Schnittstelle, durch Verzicht auf Overhead jedoch stark vereinfacht.

Master ist der Z80. Die Z80-PIO gibt an PB5 den Takt vor, der an GPIO9 des Pico empfangen wird. Daten werden zwischen PB4 und GPIO8 bidirektional nach einem proprietären Protokoll ausgetauscht. Picoseitig bildet der PIO-Block 0 mit seinen SM0 (Empfang) und SM1 (Senden) die Schnittstelle zum Pico-Core 1.

Die Kommunikation wird grundsätzlich vom Z80 angestoßen. Je Flankenwechsel des Taktes wird ein Datenbit übertragen. Daten sind immer zu 8 Bit organisiert. Ein Byte startet mit Bit 0 an der L/H-Flanke der Taktleitung.
Dies sind die Grundlagen. Alles Weitere ist abhängig vom auszuführenden Befehl.

Die Übertragungsgeschwindigkeit richtet sich nach der Befehlsabarbeitung im Z80. Das Speichern von 32kB dauert bei 8MHz ca. 3 Sekunden.

picoVDU Im Bild ist am Beispiel des Kommandos "t" der grundsätzliche Ablauf bei einem Rechnertakt von 2MHz dargestellt. Dieser lässt sich in vier Phasen unterteilen.
Kanal A (gelb) zeigt die Taktleitung, auf der ausschließlich der Z80 sendet. Kanal B (blau) stellt die bidirektionale Datenleitung dar. Im Ergebnis liefert der picoIO eine Zeichenkette mit aktuellem Datum/Uhrzeit (25Bytes).


Phase 1
  Z80 sendet 32bit Masterkey zur Identifikation
  Z80 sendet Kommando "t *"
Phase 2  
  Richtungswechsel Datenleitung (Z80 = Rx / picoIO = Tx)
  Z80 sendet verzögerte Takte
  Befehlsbearbeitung im Pico (hier: Bereitstellung Ergebnisstring)
  picoIO sendet 4 Takte Daten "low"
Phase 3  
  picoIO sendet Synchronbyte 0x55
Phase 4
  picoIO sendet Zeichenkette "UTC: 2024-01-14*14:11:06:04" 0x00  

Die anderen Kommandos unterscheiden sich in Phase 1 und 4 durch die Menge der zu übertragenden Daten und in Phase 2 durch die Bearbeitungszeit im Pico.
Sollte der picoIO nach 3000 Flankenwechseln (Taktleitung) die Befehlsbearbeitung nicht abgeschlossen haben und damit kein Synchronbyte senden, geht die Verbindung in einen TIMEOUT.


PICOM - Kommunikation picoIO <--> picoVDU

Beide Pico kommunizieren über eine I2C-Schnittstelle nach gängigem Protokoll. Master ist der picoIO.
Dem picoVDU werden hierüber Anweisungen zur Darstellung, wie Auswahl des Zeichengenerators und der Farben übermittelt.

Stromversorgung

Der picoAC1 benötigt eine 5V-Spannungsversorgung. Die Zuführung erfolgt über die USB-C-Buche U20 auf der Grundplatine.
In unseren Musteraufbauten haben wir Stromaufnahmen von etwa 80mA gemessen. Dazu kommen ca. 10mA für die Tastatur. Drahlose Tastaturen genehmigen sich einige mA mehr. Der SD-Karte wird nachgesagt, dass Spitzen bis zu 100mA möglich sind.
Setzt man insgesamt 500mA an, bleiben Reserven für Erweiterungen und ein USB-C-Netzteil sollte damit nicht überfordert sein.
Das Netzteil sollte nicht intellegent sein. Das spart Nerven bei der Fehlersuche. Ein Steckernetzteil des Raspberry Pi4 wäre hier die richtige Wahl.

Die 3.3V erzeugt der Pico onboard mit einem DC/DC-Converter für den Eigenbedarf und seine Umgebung. An Pin36 des Pico können bis zu 300mA entnommen werden.
Die Transistoren Q1 und Q4 schützen vor Konflikten auf der 5V-Leitung, falls die Pico im gesteckten Zustand und eingeschaltetem Gerät per USB mit dem PC verbunden werden. Das Anlegen von 5V an der USB-Buchse des Pico bewirkt das Sperren des jeweiligen Transistors. Damit wird der Pico vom Rest der 5V-Versorgung getrennt.

Durch die Zuführung der 5V an Pin39 des Pico wird dessen USB-Buchse nicht mit Spannung versorgt. Daher ist es nicht möglich die Tastatur direkt anzustecken. Dies erfolgt über die USB-A-Buche J3. Hier wird die Spannung über D8 zugeführt, die eine versehentliche Rückwärtsspeisung verhindert.

Aufbau

In diesem Kapitel werden Hinweise zum Aufbau und zur Beschaffung der Leiterplatte gegeben. Der Umfang dieser Beschreibung kann es mit dem Original von 1983-85 nicht aufnehmen. Dies ist aber auch nicht notwendig, da im picoAC1 weniger Fehler möglich sind.


Leiterplatte

Die Leiterplatte des Alt-AC1 hatte eine Grundfläche von 250x300mm. Tagelanges bohren und nächtelanges löten waren die Hauptarbeiten beim Aufbau.
Die Bauelemente des picoAC1 finden auf einer Fläche von 160x100mm Platz. Bei Auftragsfertigern lassen sich Platinen bestellen, die gebohrt und durchkontaktiert geliefert werden. Damit waren unsere Testaufbauten nach 4 bis 8 Stunden betriebsfertig.

Als Hersteller der Musterplatinen haben wir uns für die Firma JLCPCB entschieden. Der Bestellvorgang ist simpel und die Firma produziert und liefert zu einem unglaublich günstigen Preis.
Wer es probieren möchte, sollte ein Benutzerkonto anlegen, sich anmelden, die Gerberdaten als zip-File hochladen und dem Bestellvorgang folgen. Die voreingestellten Daten ergeben sich aus den Gerberfiles und können übernommen werden. Ein paar persönliche Daten muss man natürlich auch nach China liefern. Klar, die Leiterplatten sollen ja zuhause ankommen. Nachteil ist die Mindestbestellmenge von 5 Stück. Es ist mit einer Lieferzeit von etwa zwei Wochen zu rechnen.
Die Gesamtkosten für fünf Platinen incl. Versand und Zoll lagen im Sep 2023 bei 22€.
Alternativ lassen sich andere Auftragsfertiger auch in Europa finden.

Auch wenn der picoAC1 ein tolles Gerät ist, wird niemand fünf Stück aufbauen wollen. Um überzählige Platten loszuwerden, bietet sich das Robotron-Forum an. Dabei setzen wir voraus, dass die Abgabe zum Selbstkostenpreis erfolgt.

Einige Grundplatinen sind aus der letzten Bestellung übrig. Falls noch jemand Bedarf hat, bitte eine kurze Info an die Projekt-Mailadresse.


Bauelemente

Stückliste
Bei der Auswahl der Bauelemente wurde auf gute Handhabbarkeit geachtet. Größtenteils kommen Schaltkreise im DIL-Gehäuse und Bauelemente mit Drahtanschlüssen zum Einsatz.
Um die angestrebte Leiterplattengröße einzuhalten, musste jedoch auf einige SMD zurück gegriffen werden. Das Rastermaß von 1.27mm wird dabei nicht unterschritten.
In der Tabelle sind die benötigten Beiteile zusammengefasst und Bezugsmöglichkeiten vorgeschlagen. Leider haben wir keinen Händler gefunden, der alles in seinem Sortiment führt.
Subboards wie Levelshifter und USB-C-Shield sind bei Amazon in Familienpackungen oft günstiger erhältlich. Der direkte Anbieter wechselt allerdings häufig. In der Spalte Bemerkungen ist ein Suchtext angegeben, der zum Ziel führen kann.

Es bestehen keine wirtschaftliche Abhängigkeiten zwischen den vorgeschlagenen Firmen und unserem Projektteam !

Für die Zilog-Komponenten kamen in den Musteraufbauten 6MHz und 10MHz-Versionen zum Einsatz. Dabei zeigte sich, dass auch die 6MHz-Varianten bei 8MHz Systemtakt ihren Dienst verrichteten. Eine Garantie gibt es dafür allerdings nicht.
Es ist nicht auszuschließen, dass Experimente mit 10 oder 12MHz folgen. Daher sind die 10MHz-Varianten zu empfehlen.

Als EPROM kommen 27C64, 27C128, 27C256 oder 27C512 in Frage. Falls der IC mit dem  picoBurner programmiert werden soll, scheidet der 27C512 aus. 27C256 und 27C512 sind handelsüblich.
Auch ein EEPROM 29C256 wurde erfolgreich getestet. Diese Teile sind allerdings neu nicht mehr beschaffbar.
Achtung: Es werden auch PROMs unter der Bezeichnung OTP-EPROM (One-Time-Programmable) angeboten. Das Schnäppchen wird so schnell zum Elektronikschrott. Ein Blick in das Datenblatt vermeidet Fehlkäufe.

Alle Logik-Schaltkreise kommen aus der 74HCT-Familie. Die 74HCT03 werden in der Gehäuseform SO14 benötigt, alle anderen in DIL14 bzw DIL16.

Die Raspberry Pico können in Normalausführung oder H-Variante mit vormontierten Stiftleisten eingesetzt werden. Beide Pico müssen steckbar montiert werden, d.h. passende Buchsenleisten werden benötigt.

lp_top lp_dwn
Aus den Fotos oben ist zu entnehmen, welche Modulbauformen zum Layout passen. Speziell sind dies 4-fach Levelshifter, SD-Shield, RTC und auf der Rückseite das USB-C-Modul.

Zur Verbindung der USB-Buche des picoIO ist ein kurzes Adapterkabel anzufertigen. Das ist am einfachsten aus einem überzähligen Micro-USB-Datenkabel hergestellt. D-(2) und D+(3) ausklingeln und eine 2-pol. Buchsenleiste anlöten.

Über die Anschlussleisten J4 und J5 werden die verfügbaren Ports von PIO und CTC nach außen geführt. Im Muster sind Stiftleisten eingebaut. An diesen Stellen können auch Buchsenleisten eingesetzt werden.


Verzichtbares oder nice to have

Nicht alle Bauelemente werden zur Inbetriebnahme des picoAC1 benötigt. Einige können bei Bedarf nachgerüstet und andere komplett weggelassen werden. Im Schaltbild von links beginnend:

J2 Steckverbinder f. Erweiterungen
Dieser Steckverbinder sollte erst eingebaut bzw. gelötet werden, wenn dafür Bedarf besteht und die Bauform klar ist.

RN2 Widerstandsnetzwerk, Datenbus pullup
Allgemeine Regeln besagen, dass CMOS-Eingänge nicht floaten dürfen. Dies passiert aber auf dem Datenbus, wenn die CPU keine Daten schreibt oder anfordert. RN2 zieht daher die Datenleitungen auf H-Potential. In den Mustern hat sich gezeigt, dass diese Pullup-R zur Funktion nicht erforderlich sind und sich bei Übertaktung sogar negativ auswirken können. Es ist zu empfehlen, RN2 auf eine passende Fassung zu setzen, um nach Bedarf entscheiden zu können.

D3, R11, Q2
D3 zeigt den Haltzustand der CPU an. LEDs ergeben nur Sinn, wenn sie im Gehäuse nach außen geführt sind. Die Notwendigkeit muss individuell entschieden werden.

D7, R15
D7 zeigt den Betriebsmodus (AC1 an | CP/M aus) an, s.o..

R5, R6, R7 Spannungsteiler, VGA-Ausgang
In den ersten Musteraufbauten wurden die Längswiderstände R2, R3, R4 mit 100Ω bemessen. Damit lag Vss an den RGB-Pins bei 1.2V. Die Querwiderstände R5, R6, R7 sollten zum einen den Normpegel von 0.7V herstellen und zum anderen die Ausgangsstufen an die Leitungsimpedanz anpassen.
Dabei zeigte sich jedoch eine hohe Belastung der GPIO-Ausgänge. Daher wurden R2, R3, R4 auf 220Ω erhöht. Der Normpegel wird damit erreicht, sodass R5, R6, R7 nicht eingebaut werden sollten.
Eine Verschlechterung der Bildqualität durch die Fehlanpassung konnte subjektiv nicht festgestellt werden.

RTC Echtzeituhr
An J9 kann ein RTC-Modul DS3231 gesteckt werden. Zur Inbetriebnahme ist das Modul nicht erforderlich. Bei Verwendung ist auf kompatible Pinbelegung und 3.3V Betriebsspannung zu achten.

J10, J11, J12, J13 Debug-GPIO
Über die genannten Jumper sind freie GPIO des picoVDU und des picoIO herausgeführt. Diese werden derzeit zum debugen der Pico-SW verwendet, bleiben also im normalen Betrieb offen.
In späteren Anwendungen können diese Ports Steuerungsaufgaben übernehmen.


Zusätzliches

Bei Verwendung der SCCH-Monitore ist es erforderlich, den PIO-Port B2 über einen Pullup-R auf H-Pegel zu ziehen. Hierzu kann bspw. ein 10kOhm-Widerstand über J5 Pin 9 und 12 gejumpert werden. PB2 nutzen die SCCH-Monitore, um mit Low in einen Grafik-Eingabe-Modus umzuschalten. Da der Pegel am offenen PIO-Eingang nicht definiert ist, kann es zu fehlerhaften Tastatureingaben kommen.

Die Run-Eingänge der Pico (Pin30) zeigen sich empfindlich gegenüber Spannungsspitzen, die bspw. bei kurzzeitigen Masseberührungen entstehen. Das Antippen einer Massefläche mit einem Schraubendreher kann zum Auslösen eines Resets eines oder beider Pico führen. Dies ist abhängig von der Umgebung und bestehenden, festen Masseverbindungen zum Gerät.
Zur Minderung dieses Effektes können die Run-Eingänge mit zusätzlichen Scheiben-C gegen Masse bedämpft werden. Hierzu kann bspw. ein 100nF-C über den alternativen Reset-Taster SW2 gelötet werden. Subjektiv bessere Ergebnisse lassen sich mit Kondensatoren erzielen, die auf der Oberseite der Pico zwischen Pin30 (Run) und Pin28 (GND) gelötet werden. Bauelemente im Huckepackverfahren haben schließlich eine lange Tradition im AC1.


Bestückung

Bevor der Lötkolben angeworfen wird, sollten vielbeinige Bauelemente auf ihre Passgenauigkeit geprüft werden. Negative Erfahrungen gab es mit der VGA-Buchse. Ggf. müssen die beiden äußeren Reihen in Richtung Mittelreihe gebogen werden.

Beim Einsetzen der ICs bzw Fassungen ist auf die Ausrichtung jedes Bauteils zu achten !

Als erstes werden die SMD-Bauteile auf der Unterseite gelötet. Danach folgt das USB-C-Shield. Zum besseren Halt sollte es mit Sekundenkleber auf der Leiterplatte befestigt werden. Beide Flächen aufrauen, Shield an den Bohrlöchern zentrieren und verkleben.
Nach dem Löten lohnt es schon einmal, die 5V-Spannung und deren Polarität zu prüfen. Nachdem das SD-Shield auf der Oberseite montiert ist, sind die Lötstellen des USB-Shield nicht mehr zugänglich !

Danach folgen die Bauteile auf der Oberseite. Es wird empfohlen, alle ICs auf Fassungen zu setzen. Beim Einlöten der Fassungen von PIO und SRAM sollten die Toleranzen der Bohrungen ausgenutzt und auf den größtmöglichen Abstand der beiden Elemente geachtet werden. Auch RN2 sollte auf eine 9-polige Reihe gesteckt werden.
Picos, SD-Shield und Levelshifter werden mit den zugehörigen Stiftleisten bestückt. Der 3-polige Anschluss an der Kopfseite des Pico muss nur zum Anschluss eines Debuggers beschaltet werden.
Nicht steckbar, sondern direkt gelötet werden die beiden Levelshifter U7, U19 und das SD-Shield U18. Die Rahmen der Stiftleisten sorgen für das richtige Höhenmaß.

Zum Schluss werden die VGA-Buchse und anschließend die Buchsenleisten der Pico gelötet. Zur korrekten Ausrichtung hat es sich bewährt dabei einen Pico zu stecken.

Steckbare Bauelemente sollten erst während der Inbetriebnahme stufenweise eingesetzt werden.

Den Aufbau hat Gerd mit einigen Fotos dokumentiert, die man sich anschauen sollte, bevor es ans Werk geht.

Inbetriebnahme

Die zur Inbetriebnahme benötigten Dateien sind im Projekt-Repository auf Codeberg.org zu finden. Benötigt werden:

- der AC1 - EPROM
- die Pico-Firmware

Pico Flashen

Die Picos müssen zum Flashen nicht gesteckt sein. Falls sie auf dem Board stecken, ist die Stromversorgung des picoAC1 vorher zu trennen. Ansonsten lässt sich der Pico im nachfolgenden Schritt nicht in den Flashmodus versetzen.

Am Pico die BOOTSEL-Taste drücken, anschließend das Board per USB-Kabel mit dem PC verbinden und BOOTSEL wieder freigeben. Auf dem Desktop öffnet sich ein Fenster des Dateimanagers. Der Pico verhält sich nun wie ein USB-Stick.
Per Drag & Drop das passende File ins Fenster ziehen. Danach schließt sich der Dateimanager. Fertig !

Alternative Reihenfolge, um bei gestecktem Pico in den Flashmodus zu gelangen:
Pico mit dem PC verbinden --> BOOTSEL-Taste drücken --> RESET-Taste auf der Grundplatine kurz drücken --> BOOTSEL wieder freigeben.
Aber auch hier wird empfohlen, den AC1 zuvor von der StrV zu trennen.

Der Vergleich mit einem USB-Stick ist hier allerdings stark vereinfacht. Im Dateimanager wird nicht der Programmspeicher des Pico angezeigt, sondern nur ein virtuelles Verzeichnis mit zwei Infodateien. Das UF2-File wird nach dem Kopieren Pico-intern zerlegt und in den Flash-ROM geschrieben. War dies erfolgreich, wird die neue Firmware nach dem anschließenden Reboot ausgeführt.
Bei der nächsten Flash-Prozedur wird wieder nur das oben beschriebene Fenster angezeigt, ohne einen Hinweis darauf, dass bereits eine Firmware im Flash gespeichert ist.


EPROM brennen

Auf EPROMs stößt man in modernen Projekten nicht mehr. Dementsprechend dünn dürfte die persönliche Infrastruktur sein. Wer noch einen Brenner hat oder jemanden kennt, ist fein raus.
Neue Brenner sind im Versandhandel bestellbar. Damit würde das Projektbudget allerdings weit überschritten. Und man sollte sich fragen, ob sich die Anschaffung lohnt.

Wie ein EPROMer mit Hilfe eines Pico, zweier Levelshifter, einiger diskreter Bauteile und vieler Drahtverbindungen aufgebaut werden kann, ist auf der Seite picoBurner beschrieben. Hiermit könnte aber das Zeitbudget von einem Wochenende überschritten werden.

Und eines soll nicht verschwiegen werden, EPROMs müssen vor dem Wiederbeschreiben gelöscht werden.

Wer keine Möglichkeit sieht, die Probleme zu lösen, fragt mal im Robotron-Forum nach oder schickt eine email an unsere Projektadresse.


Inbetriebnahmephasen

Die Inbetriebnahme sollte schrittweise erfolgen, um Fehler gezielter suchen zu können. Es ist sinnvoll, die Stromaufnahme in der jeweiligen Phase zu messen. Perfekt wird das Ganze mit einem geeigneten Labornetzteil und Strombegrenzung.
Die angegebenen Stromaufnahmen können nur als Richtwerte angesehen werden. Durch die stufenweise Bestückung kommt es zu floatenden CMOS-Eingängen, die zu undefinierten Schaltzuständen und schwankenden Stromaufnahmen führen.


Schritt 1

Im ersten Inbetriebnahmeschritt sollten sich keine steckbaren Bauelemente auf dem Board befinden. So lässt sich, ohne größeren Schaden befürchten zu müssen, Spannung anlegen und an den Fassungen messen.
Stromaufnahme: ca. 4 - 10mA


Schritt 2

rst38 Im nächsten Schritt (spannungsfrei !) werden die 74HCT-ICs, die Pico und die CPU gesteckt. Für diesen Test muss RN2 installiert sein, um 0xFF auf dem Datenbus zu simulieren.
Letzte Chance zu prüfen, ob alle ICs richtig gedreht sind !
Dann das VGA-Kabel anschließen und Versorgungsspannung anlegen.
Auf dem Monitor sollte nebenstehendes Muster erscheinen. Die CPU liest den Befehlscode FFh (RST38), spring zur Adresse 38h und schreibt 0039h auf den Stack. Der Stackpointer wird dekrementiert und mit dem nächsten Befehl wieder FFh gelesen, usw.
Damit funktionieren schon mal die CPU und beide Pico.
Stromaufnahme: ca. 65mA


Schritt 3

Der picoAC1 ist wieder spannungsfrei. Jetzt wird der EPROM gesteckt. Die Jumper J6 und J7 sind entsprechend des verwendeten EPROM-Types zu setzen. Die Belegung ist dem Schaltbild zu entnehmen.
Nun werden SRAM und PIO gesteckt. Zwischen beiden geht es etwas eng zu. Hier stimmen die Gehäusemaße bei Kicad nicht mit der tatsächlichen Welt überein. Es kann helfen, beide IC gleichzeitig zu stecken, dabei aber alle Pins im Auge behalten.
Zum Schluss noch die CTC stecken. Diese ist gegenüber den anderen "dicken" ICs um 180° gedreht !
Auch wenn ich damit nerve: Prüfen, ob alle ICs richtig gesteckt sind !

Nach Anlegen der Spannung sollte die Monitorausschrift und der blinkende Cursor zu sehen sein.
Stromaufnahme: ca. 70mA


Schritt 4

Im letzten Schritt wird die USB-Buchse des picoIO mit der Stiftleiste J8 verbunden und die Tastatur angesteckt. Auf dem picoIO muss nach kurzer Zeit die Onboard-LED leuchten. Ist das nicht der Fall, sollte die Polarität des Adapters geprüft, ggf. gedreht und der Reset-Taster betätigt werden. Wenn das nicht hilft, funktioniert vielleicht eine andere Tastatur.
Nun sollte der picoAC1 auf Tastenanschläge reagieren.
Stromaufnahme:
- ca. 75mA (kabelgebundene Tastatur)
- ca. 90mA (USB-Dongel drahtlose Tastatur)

Bedienung

Die Bedienung des picoAC1 erfolgt per Tastatur auf zwei Bedienebenen.


picoIO-Ebene

Einige Tastenkombinationen sind als Systemkommandos festgelegt. Diese werden auf picoIO-Ebene abgefangen und dort verarbeitet. Hiermit lassen sich bspw. die Betriebssystemvariante, der Zeichengenerator und die Taktfrequenz auswählen. Auch der Z80-Reset ist eines der Systemkommandos. Die Bedienmöglichkeiten sind in diesem Arbeitsblatt zusammengefasst.
Bei den Auswahltasten (Strg und Shift) wird zwischen linker und rechter Taste unterschieden.
Die Auswahl und Zuordnung der Funktionen ist im picoIO vorgegeben. Zur Änderung muss der Quelltext angepasst und eine neue Firmware gebaut werden.

Alle Tastencodes, die bis dahin nicht ausgefiltert wurden, werden zur Übersetzung in AC1-ASCII-Code weitergereicht. Die 104 Zeichentasten einer Standardtastatur können mit verschiedenen Modifikatoren (Auswahltasten) kombiniert werden. Hierfür stehen Shift, Strg und Alt|AltGr zur Verfügung. Modifikatoren können nur einzeln, nicht kombiniert angewandt werden.
Hieraus ergeben sich 416 mögliche Zeichen, von denen aber nur max 128 (7Bit) an die PIO des AC1 weitergereicht werden können.

Im picoIO ist zur Übersetzung eine Default-Tabelle eingebaut, die die Standardbelegung und einige Sonderfälle abdeckt.
Bereits bei den Musteraufbauten zeigte sich, dass nicht alle Monitorvarianten, Tastaturlayouts und persönlichen Vorlieben unter einen Hut zu bringen sind. Daher kann optional eine eigene Tabelle auf der SD-Karte angelegt werden. Die Vorgehensweise ist im Repository unter Keyboard beschrieben.

In einem abschließenden Filter wird das ASCII-Zeichen in Abhängigkeit vom CapsLock-Status geändert. Bei aktiver Funktion werden die Buchstaben A-Z, zzgl. der SCCH-Umlaute in Kleinbuchstaben bzw umgekehrt gewandelt.

Der so erzeugte ASCII-Code wird mit gesetztem Bit7 an PIO-A gelegt. Es besteht die Auswahlmöglichkeit zwischen dem üblichen Dauersignal solange die Taste gedrückt ist und einem Einzelimpuls bei aktivierter ScrollLock-Funktion. Letzteres ist sinnvoll bei höheren Taktraten und Autorepeat durch das Anwenderprogramm.


AC1-Ebene

Ab hier funktioniert alles, wie beim AC1 gewohnt, unterscheidet sich jedoch nach der gewählten Monitorvariante. ( Hinweis: Als Monitor bezeichneten wir damals das Betriebssystem. )
Ab 16kB EPROM lassen sich vier unterschiedliche Versionen unterbringen. In unseren Muster-EPROM haben wir den Original-Monitor mit pico-Erweiterung, das Original mit Minibasic und zwei SCCH-Forks eingebunden. Alternative Zusammenstellungen kann jeder nach eigenen Vorlieben bauen. Der AC1 ist und bleibt ein Bastelrechner.

Die klassische Bedienung des AC1 bleibt erhalten und wird in der Pico-Erweiterung fortgeführt. Auf der Kommandozeile wird ein Befehl durch einen Einzelbuchstaben/-zeichen eingeleitet. Es können je nach Befehl bis zu drei Argumente als 1-4-stellige Hexzahlen (Großbuchstaben) und eine Zeichenkette folgen. Eine Zusammenstellung der Bedienung des Ur-AC1 ist in diesem Arbeitsblatt zu finden.

Der Monitor 2 bietet zusätzlich den alten Mini-Basic-Interpreter im ROM. Dabei muss allerdings auf die picoAC1-Bedienung verzichtet werden. Ein Arbeitsblatt zum Minbasic ist im Repository hinterlegt.

Weitere Informationen zu den SCCH-Forks (Monitor 3 & 4) muss man im Netz suchen. ac1-info ist hierfür ein guter Einstieg. Beide Forks sind nicht an die Schnittstellen des picoAC1 angepasst. Es wird bspw. keine SD-Karten-Unterstützung angeboten. Programme, die speziell für SCCH-Computer entwickelt wurden, werden nur eingeschränkt bzw. nicht laufen.

Die Kommandos und Schnittstellen zum picoAC1 sind in Monitorvariante 1 im EPROM-Bereich ab 0800h untergebracht. Hierfür musste das MBasic weichen, das sich aber über das externe Kommando "Z" in den RAM laden und dort ausführen lässt.
Die Bedienung orientiert sich am Ur-AC1. Kommandos werden durch einen Kleinbuchstaben eingeleitet, gefolgt von Argumenten und einer Zeichenkette.

Das Ganze ist und bleibt vermutl. eine Baustelle, sodass hin und wieder der EPROMer bemüht werden muss. Der aktuelle Stand der Erweiterungsfunktionen ist im Repository beschrieben.
Die erweiterten Kommandos kommunizieren mit dem picoIO über die ZCOM-Verbindung. Daher ist es notwendig, dass in Eprom und Pico zueinander kompatible Versionen laufen. Dies gilt im Weiteren auch für picoIO und picoVDU.
Wir sind bemüht, im Repository, die jeweils aktuellen und kompatiblen Ausgaben bereitzustellen.

Gehäuse

Die nackte Platine bietet erhebliches Kurzschlusspotential. Daher sollte das Ganze in ein Gehäuse gepackt werden. Hier ist Individualität gefragt. Ob die Hebelbank oder der 3D-Drucker bemüht wird, hängt von den persönlichen Möglichkeiten ab.
Beim Alt-AC1 mit seiner enormen Leistungsaufnahme war zumindest für den Funkamateur ein Metallgehäuse Pflicht. Die Störstrahlung vor allem im KW-Bereich war sonst nicht in den Griff zu bekommen.
Der picoAC1 verhält sich in dieser Hinsicht deutlich moderater. Ein Betrieb der offenen Platine während eines Fielddays zeigte keine Auffälligkeiten. Hier war nur der VGA-Monitor heftiger Kritik ausgesetzt.
Auch die Wärmeableitung ist nun kein Thema mehr, das beim Gehäuseentwurf berücksichtigt werden muss.

Für die Grundplatine wurde ein 3D-Modell mit der freien Version des Onlinetools OnShape entworfen. Die Free-Version schreibt ausdrücklich "For non-commercial use only" vor. Eine gewinnbringende Gehäuseproduktion nach diesem Modell ist damit ausdrücklich untersagt.

Die stl-Dateien der einzelnen Bauteile sind im Projekt-Repository auf Codeberg.org zu finden. Diese lassen sich slicen und ins gcode-Format des eigenen Druckers übertragen.
Wer bei OnShape angemeldet ist, kann das Projekt forken und nach eigenen Wünschen anpassen.

Gedruckt wurden unsere Muster mit einem I3Mk3S der Firma Prusa. Als Material kam PETG zum Einsatz. Die Druckzeit für alle Bauteile betrug etwa 16 Stunden je Gehäuse.

Das Ganze ist nur als Vorschlag anzusehen, nicht als Standard.

case_pluged case_open case_muster

onshape_case_open onshape_case_pcb onshape_case_closed

Über andere Vorschläge würden wir uns freuen.

Ein (Zwischen-) Fazit

Die Idee zum picoAC1 entstand im Frühsommer 2023. Der 40. Jahrestag des ersten Artikels im Funkamateur stand bevor und es stellte sich die Frage, wie wir diesen Anlass feiern wollen. Wie auch bei manch anderen Dingen in der Menschheitsgeschichte war ein wenig Gerstensaft bei der Entscheidungsfindung hilfreich. Nach ein paar Tagen individueller Konzeptarbeit haben wir unsere Ideen übereinandergelegt und konnten in großen Teilen Deckungsgleichheit feststellen.

Anfangs war unklar, ob sich die VGA-Ausgabe realisieren lässt. Ein erster Versuchsaufbau zeigte aber schnell, dass die Bibliothek von V.Hunter Adams hervorragend zu unserem Konzept passt. Das Mitlesen der Bilddaten auf dem Z80-Bus stellt derzeit noch den Flaschenhals bei der Taktfrequenz dar. Anfangs waren 4MHz angestrebt, die durch Optimierung auf 8MHz angehoben werden konnten. Das Ende der Fahnenstange ist aber noch nicht erreicht. Ein SW-Umbau der Eingangsstufe des picoVDU von Pollingbetrieb auf eine PIO-Statemachine dürfte einiges an Leistungsschub bringen, sodass andere Komponenten zum Flaschenhals werden.

Bei Software und Bedienung haben wir uns bemüht, so dicht am Original zu bleiben wie möglich. Die Wiedererkennung sollte gegeben sein.
Ein CP/M und das 8k-Basic sind mittlerweile an die neue HW angepasst und stehen im Repository zum Download bereit. Hier wurde im Besonderen die SD-Karte als Massenspeicher integriert.
Es wird weitere Versionen des Monitors und der Pico-Firmwaren geben. Ggf wird auch einmal der Monitor V3.1 überarbeitet.

Im Repository versuchen wir AC1-Anwender-SW zusammenzutragen, die damals allgemein verfügbar war. Bei vielen Programmen sind Herkunft und Autor unbekannt. Sollte jemand Einwände gegen eine Veröffentlichung haben, bitte eine Info über unsere Projekt-Email-Adresse. Bei berechtigtem Interesse werden wir die Daten löschen.

Konstruktive Kritik, vielleicht auch Zustimmung nehmen wir gern über unsere Projekt-Emailadresse entgegen. Auch an Fehlermeldungen, wenn möglich reproduzierbar, sind wir interessiert.
Auf Hinweise, wie "Das hätte man doch auch ganz anders machen können", hier vorab die Standardantwort: "Ja, das könnte man tun, nur zu ...".

Zum Schluss möchten wir allen danken, die uns bei dem Jubiläumsprojekt unterstützt und nicht gleich ausgelacht haben. Besonderer Dank für sachdienliche Hinweise und das Testen von Hard- und Software gilt Rolf(DG3RW), Johann (DO1JSP), Gerd (LE) und Jürgen(Berlin), der auch die Zeichengeneratoren entworfen und angepasst hat, sowie der Redaktion der Zeitschrift Funkamateur.

nach oben