In der „PC AMSTRAD INTERNATIONAL 8/89" wurde der folgende Artikel abgedruckt.
Ein gelungenes Projekt zur Darstellung von Grafiken am JOYCE.

Pixeleien

Der Bildschirmaufbau des JOYCE

Warum sich abgeben mit 720 x 256 Pixel? Da existiert doch die GSX (Graphic System Extension) von DR, und die kümmert sich neben Bildschirm auch um Drucker und Plotter. 15 Byte mehr RAM und Einblick in die Software-Innereien sollten einen kurzen Exkurs schmackhaft machen. Nur eine geringe Speicherplatzreduktion (1 kByte) und etwas Maschinen-Code, und jeder der 184.320 Pixel kann aus BASIC oder Turbo Pascal angesprochen werden.

Der JOYCE-Bildschirm wird von 32 Feldzeilen (256 Pixelzeilen) mal 90 Feldspalten (720 Pixelspalten) aufgebaut. Feldzeile 32 ist Statuszeile und wird nicht gescrollt. Bildschirmspeicher und Roller-RAM (B600H bis B7FFH) befinden sich in Bank 0 (s. Artikel von M. Anton im JOYCE-Sonderheft 1/87). Das Roller-RAM ist zeilenweise aufgebaut und adressiert immer das erste Byte einer Pixelzeile (Pixelspalte 0 bis 7). Dabei ist die erste Roller-Ram-Adresse (B600H+B601H) für Pixelzeile 0 (ganz oben), und die letzte Adresse (B7FEH+B7FFH) für Pixelzeile 255 (ganz unten) zuständig.

Seltsamerweise muß jeder Adresse noch die Adresse der ersten Pixelzeile der betreffenden Feldzeile quasi als Offset hinzuaddiert werden. Das heißt, die Adresse für Pixelzeile 0 erhält man durch Additon des Inhaltes (B600H+B601H) plus Inhalt (B600H+B601H), Adresse für Pixelzeile eins durch Inhalt (B602H+B603H) plus Inhalt (B600H+B601H), und so weiter, Adresse für Pixelzeile 8 durch Inhalt (B610H+B611H) plus Inhalt (B610H+B611H), Adresse für Pixelzeile neun durch Inhalt (B612H+B613H) plus Inhalt (B610H+B611H), und so weiter.
Abb1: Der Bildschirmaufbau des JOYCE im Überblick
In horizontaler Richtung codiert das adressierte Byte acht Pixel (links beginnend). Alle acht Bytes weiter im Bildschirmspeicher folgt die Adresse für die rechts anschließenden Pixel.
Damit sind Bildschirmspeicher und Zeichensatzspeicher (Bank null von B800H bis BFFFH) in ihrem Aufbau identisch. Listing 1 ist ein kurzes Beispielprogramm, um den kompletten Zeichensatz in die Bildschirmmitte einzublenden.
Wie bei jedem Zugriff auf den Bildschirmspeicher darf auch die Routine für die xy-Pixelansteuerung nicht im Bereich von 4000H bis BFFFH stehen. Sie würde sich selbst bei der Bankumschaltung den Boden unter den Füßen wegziehen. Die Einrichtung einer RSX (Resident System Extension) erschien uns am sinnvollsten. Mit ihr wird der TPA (Transient Program Area) erniedrigt, um darüber freien Speicherplatz im Common-Bereich (in C000H bis FFFFH erfolgt kein Bankswitching) zu schaffen. Obwohl die eigentliche xy-Ansteuerungsroutine nur zirka 50 kByte lang ist, benötigt eine einzelne RSX mindestens 1 kByte (RSX_Loader + 1 Page). Um den aktiven Status der RSX zu erkennen, wurde die BDOS-Funktion Nr. 10 (Read Console Buffer) umgeleitet und so das Betriebsystemprompt geändert. Sollte diese BDOS-Erweiterung einmal stören (wir hatten bisher keine Probleme), kann sie ohne großen Aufwand in GRAF.ASM (Listing 2) entfernt werden:

ftest: mov a,c

ersetzen durch

ftest: jmp next

Die RSX GRAF.ASM ist für einen 8080-Assembler geschrieben und kann mit RMAC bearbeitet werden.
Von GRAF.Z80 (siehe Listing 3), der Grafikroutine, wird bei Aufruf die TPA-Größe kontrolliert. Falls sie den TPA im COMMON-Bereich vorfindet, wird die eigentliche xy-Ansteuerung (Bereich von BAS_IN bis PRHEX) nach TPA + 020H kopiert. Andernfalls erfolgt eine Fehlermeldung. Der Parameterübergabe (BAS_IN, TUR_IN) folgt die Prüfung auf gültige x- und y-Werte. x-Werte größer 255 und y-Werte größer 719 werden ignoriert. Bankswitching und Berechnung der richtigen Speicherplatzadresse mit Inhalt schließen an. Mit dem Rücksprung nach CP/M steht nun die Grafikroutine zur Anwendung bereit.
Listing 4 ist ein kurzes Turbo-Pascal-Demo-Programm. Die Adresse für die "external procedure" (F230H) gibt GRAF.COM bei Aufruf an. Sie muß bei geänderter Speicherkonfiguration (zum Beispiel mehrere RSX) angepaßt werden. Um 'wilde' Aufrufe, die mit großer Wahrscheinlichkeit ins 'land of no return' führen, zu vermeiden, empfiehlt es sich, eine Prüfprozedur (procedure memtest in demo.pas) am Anfang einzubinden. Bei erfolgreicher Installation von GRAF.COM und Compilierung/Start von DEMO.PAS sollte Abb. 6 auf dem Bildschirm erscheinen. Mit RSXOFF.Z80 (Listing 5) kann die Grafikroutine aus dem Speicher wieder herausgenommen werden. Der TPA wird um die letzte RSX angehoben. Alte und neue TPA-Grenzen werden angezeigt. Zusammengefaßt das Vorgehen zum Übersetzen der Quelltexte:

RMAC GRAF.ASM
LINK GRAF ÄOPÜ
REN GRAF.RSX=GRAF.PRL
Z80 GRAF.Z80
HEXCOM GRAF
GENCOM GRAF GRAF
Z80 RSXOFF HEXCOM RSXOFF

(Z80 steht für Z80-Assembler)
Es stehen dann zur Verfügung:

GRAF.COM: richtet xy-Ansteuerung als RSX ein
RSXOFF.COM: löscht die angehängte RSX
(Clemens Bitter/rs)
Diese Programme sind in Assembler und in Turbo Pascal geschrieben. Um mit dem Turbo-Pascal-Programm arbeiten zu können, benötigen Sie den Turbo-Pascal-Compiler. Bei den Assembler-Programmen verfahren Sie so, wie es im Text beschrieben ist. Auf der Databox stehen Ihnen selbstverständlich alle Programme lauffähig zur Verfügung.

Eingescanned von Werner Cirsovius
Juli 2003
© DMV-Verlag