80-Bus Journal

  

Juli​/​Aug.​/​September 1984 · Ausgabe 3

Grafik Routinen

von Clemens Ballarin

Grafik – Routinen mit Pascal MT+

Auch ich habe die Grafikkarte von Herrn Klaassen und Herrn Schulmeister aufgebaut, und sie funktioniert, nach Beseitigung einiger Fertigungsfehler, prima.

Ich fand die Aufloesung von 512 * 256 jedoch nicht ausreichend, auch stoerte mich das ‚krumme‘ Format, deshalb habe ich den Kontroller 9365 verwendet, trotz Warnungen vor stark flimmernden Bildern. Das leichte Flimmern faellt nicht auf, da ich keine Textverarbeitung sondern Grafik machen will (Ich verwende keinen Monitor mit langnachleuchtender Roehre: SANYO DM 2212).

Die Unterscheidung von Lese- und Schreibseite hat einen Schoenheitsfehler: Zur Unterscheidung wird das Signal BLK herangezogen, das ist jedoch nicht eindeutig, denn wird im Modus ‚high speed write‘ geschrieben, z. B. um den Schirm zu loeschen, so wird, da BLK aktiv ist, in die Leseseite geschrieben. Dies stoert genau dann, wenn man schnell in eine unsichtbare Seite schreiben will. Darum muesste zur Unterscheidung das invertierte DW-Signal benuetzt werden. Ich habe das allerdings noch nicht ausprobiert (Es koennen vielleicht Timingprobleme auftreten).

Apropos Timingprobleme: Ich empfehle, fuer IC 20 und IC 30 Schottky Typen zu verwenden, sonst koennen Fehler auftreten, wenn im ‚Fastmodus‘ invertiert wird.

Nun zum Programm selbst:

Es ist eigentlich eine Sammlung von Unterprogrammen zur Ansteuerung der Grafik, geschrieben in Pascal MT+. Da das Programm 400 Zeilen lang ist, waere das Eintippen zu muehselig. Es ist in MODULE-Form geschrieben, wird also getrennt zum Hauptprogramm compiliert und wird beim Linken an dieses angebunden. Das sieht dann so aus:

LINKMT GDEMO,GDPMOD,FPREALS,PASLIB/S
                  ^               ^           ^
    Hauptprogramm   |   wird von GDPMOD benoetigt
              Modul mit Grafikroutinen

Damit man im Hauptprogramm nicht alle Grafikroutinen als External definierten muss, wird dies in einem File namens GDPMOD.INC gemacht, und dies wird nach den Variablen- und vor den Prozedur- und Funktionsvereinbarungen in das Programm eingefuegt mit {$I GDPMOD.INC}.

Wer sich dafuer interessiert, schicke mir doch eine formatierte Diskette (im MC-CP/MMC-Format = ECMA 70 (Format der ersten drei Tracks beliebig) oder eine 8″ Diskette im IBM-Format (SD) und einen adressierten Freiumschlag.). Ich spiele das MODULE dann drauf und noch ein kleines Demonstrationsprogramm.

Der Ursprung des Bildes (0/0) liegt in der Mitte des Schirms, d. h. er ist folgendermassen aufgebaut:

-256/ 2550/ 255255/ 255
-256/ 00/ 0255/ 0
-256/-2560/-256255/-256

Nun ein paar Typenvereinbarungen:

DRAWMODE = (ERASE,DOMINANT,INVERT);

SECTORPOS  = (EN,NE,WN,NW,ES,SE,WS,SW);
SECTORPOS bestimmt die Lage eines Achtelkreises:
 
NWNE
WNEN
WSES
SWSE

PATTERN = (CONT,DOT,DASH,DOTDASH);
TTYPE = (NORMAL,TILTED,VERT,TILVERT);
STRING85 = STRING[85];
PICTURE = FILE OF BYTE;

Zu den Unterprogrammen im Einzelnen:

GWAIT:Wartet, bis GDP ready (Status-Register, Bit 2).
 
READPAGE(N: BYTE);
WRITEPAGE(N: BYTE):
Waehlt Lese- und Schreibseite aus (Port 9EH).
 
GCLEAR:Setzt GDP, Port 9E und 9F zurueck, loescht die Seiten 0 und 1.
 
G0N;
GOFF:Schaltet Grafik ein bzw. aus (Port 9F, Bit 7).
 
LPATTERN(P: PATTERN):
Waehlt Art der Linie (durchgezogen, etc.).
 
TEXTTYPE(T: TTYPE):
Waehlt Schriftart (z. B.: vertikal, kursiv, …).
 
CHARSIZE(X,Y: INTEGER):
Vergroesserung der Schrift.
 
TYPETEXT (X, Y: INTEGER; T: STRING85; AUTODEL: BOOLEAN):
Gibt Text aus. Wenn AUTODEL = TRUE ist, wird vorher der Schirm teilweise geloescht.
 
DRAWER;
ERASER;
INVERTER: Waehlen den entsprechenden Zeichenstift.
 
DOWN;
UP:Schreiber ’runter bzw. ’rauf.
 
ONSCREEN(X,Y: INTEGER): BOOLEAN;
Testet, ob auf dem Bildschirm.
 
DRAW(X,Y: INTEGER):
Setzt Punkt (X/Y).
 
PLOT (X, Y: INTEGER; COLOUR: DRAWMODE):
Wie DRAW, mit Auswahl und Runterfahren des Schreibers.
Seite 49 von 52