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)