LCD Display für den ZX81

Das LCD ist mit die größte Erweiterung, die ich im Rahmen des ZX96 Projektes für den ZX81 entwickelt habe. Das LCDIF ist nicht einfach nur ein Ersatz für den Monitor, sondern es stellt noch eine Reihe weiterer Funktionen zur Verfügung, die den ZX81 deutlich aufwerten.

Das Konzept:

Der wichtigste Ansatzpunkt war vornherein klar: das LCD muß völlig unabhängig vom ZX81 arbeiten. Es ist ein Ansteckmodul, das keinerlei Eingriffe im ZX81 erfordert und das auch nicht durch besondere Zusatzprogramme vom ZX81 aus bedient werden muß. Damit sind Beeinträchtigungen von Programmen ausgeschlossen. Dabei ist es nicht gerade einfach, vom Busstecker aus auf das Fernsehbild des ZX81 zuzugreifen. Erinnern wir uns aber: das Bild ist in einem eigenen Speicherbereich innerhalb des BASIC-RAMs abgelegt, dem sog. DFILE. Die Lage des DFILEs ist zwar veränderlich, die jeweilige Ablegeadresse ist in den Systemvariablen gespeichert. Der Ansatz ist daher, von außen auf das RAM zuzugreifen. Alle Versuche, den ZX81 mittels /BUSRQ kurzzeitig "abzulenken" schlugen fehl. So entstand schließlich das Konzept des Dual-RAMs. Dabei wird außen ein weiteres RAM parallel zum BASIC-RAM des ZX81 betrieben, dieses RAM kann jedoch durch Treiber komplett vom ZX81 abgekoppelt werden.

Das LCDIF ist nun ein separater, am ZX81 angesteckter Z80 Rechner. Alle Zugriffe auf das Dual-RAM müssen daher synchronisiert werden, um Datenverluste zu verhindern. Dazu haben Schreibzugriffe vom ZX81 aus den Vorrang. Lesezugriffe vom ZX81 braucht man nicht und diese sind daher auch nicht möglich. Sobald beide CPUs auf das Dual-RAM zugreifen, wird die CPU das LCDIFs mittels WAIT solang gebremst, bis der ZX81 den Refreshzyklus ausführt. Die Zeit des Refreshtaktes reicht für einen vollen Zugriff durch das LCDIF aus, da dessen CPU immerhin mit 8 MHz rennt.

Damit haben wir eine Kopie des gesamten Basic-RAMs, auf die jederzeit zugegriffen werden kann ohne daß der ZX81 überhaupt etwas davon merkt! Das LCDIF muß nun nur noch das DFILE suchen und die Daten soweit aufbereiten, daß das LCD-Panel damit angesteuert werden kann.

Displayansteuerung:

Dazu befindet sich auf dem LCDIF ein weiteres RAM, in dem stets ein komplettes Pixelbild (immerhin 9,6 kB!) gespeichert ist. Die Ausgabe einer Pixelzeile an das LCD erfolgt mit einer ähnlich trickreichen Logik, wie sie auch der ZX zum Aufbau des Fernsehbildes nutzt: eine NMI-Routine endet mit einem JP(HL), bei dem HL größer als 8000hex, damit A15=high und M1=low ist. Diesen Zustand erkennt eine Logik und setzt den Datenbus der CPU auf low, wodurch die CPU nur noch NOP-Befehle ausführt und lediglich den Adreßbus weiterzählt. In diesem Modus greift sich ein Latch die aus dem RAM kommenden Pixeldaten und gibt sie als halbe Bytes an das Panel aus. Da das Panel 640 Pixel hat und wir für den ZX81 nicht einmal 320 Pixel brauchen, kann die vertikale Auflösung durch simples Parallelschalten jeweils zweier Datenleitungen am LCD halbiert werden. Das Display wird damit also mit nur 4 Bit angesteuert. Die 8 Bit aus dem RAM werden dazu mit dem Refreshtakt der CPU in zweimal 4 Bit zerlegt. Im Ergebnis dessen ergibt sich auch eine brauchbare Bildfrequenz für das LCD. Die Zeilenauflösung wird von 480 auf 240 herabgesetzt, indem einfach jede Pixelzeile zweimal an das Panel geschickt wird. Am Zeilenende wird ein INT erzeugt, wodurch die CPU den NOP Modus verläßt und in das System ROM zurückspringt. Gleichzeitig wird ein Zähler zurückgesetzt, der nach einer einstllbaren Zeit (z.B. 256 CPU-Takten) wieder einen NMI auslöst und damit die Ausgabe der nächsten Pixelzeile bewirkt.

Firmware:

Die Firmware des LCDIF muß neben den schon gezeigten NMI und INT Routinen nur noch das DFILE lokalisieren, in Pixel umrechnen und diese entsprechend verschachtelt im RAM ablegen. Dafür steht nur die Zeit zwischen den NMIs zur Verfügung.

Weitere Funktionen und der mysteriöse "Task":

Wie schon bekannt, hat ein LCD 240 Zeilen, das ZX-Bild jedoch nur 192. Damit bleibt unterhalb des ZX-Bildes noch ein Platz für 6 Zeilen. Hier werden einige Statusmeldungen durch das LCDIF plaziert: ob der ZX im SLOW oder FAST Modus läuft, wieviel Speicherplatz im Basic noch frei ist und eine zunächst rätselhafte Task-Adresse. Der erste Knaller des LCDIFs: das Display zeigt immer ein Bild, egal ob der ZX im FAST oder im SLOW arbeitet! Und nun zum "Task". Wie bekannt, sind einige Zellen im Bereich der Systemvariablen des ZX81 noch ungenutzt. Das LCD liest nun ständig eine bestimmte Adresse und wertet diese als "Task" aus. Damit lassen sich bestimmte Funktionen am LCDIF aktivieren, indem vom ZX aus einfach auf diese Adresse ein POKE gemacht wird. Es wäre nun eine Reihe von Sachen vorstellbar, die das LCDIF ungesehen vom ZX im Hintergrund anstellen könnte. Für den Anfang kann mit Task z.B. auf die Darstellung eines HiRes-Bildes gewechselt werden. Die Taskadresse selbst kann verändert werden. Und man kann das LCDIF anweisen, sich ein Maschinenprogramm aus dem ZX81 RAM zu holen, dieses an seine Systemschleife anzuhängen und ständig mit abzuarbeiten. Damit kann man z.B. den Zustand weiterer Systemzellen überwachen oder auch das LCDIF komplett umprogrammieren! Hacker freut euch...

Es gibt noch eine ganze Menge mehr zum LCD, Interessenten fragen bitte bei mir an. Natürlich läßt sich das LCDIF auch für andere Rechner anpassen, am Spectrum ist dies bereits realisiert. Hier noch ein paar Sachen, die für den Nachbau interessant sind:
Schaltplan 219 kB
Platinenfoto 38 kB
ROM-Image des LCDIF  
Technische Details zu LCDs  


last updated 07/01, Kai Fischer, ZX-TEAM

mailto: kai.fischer