Grafik mit Turbo Pascal

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Grafik mit Turbo Pascal

Beitrag von bbock »

Hallo Joyce-Freunde,

wer gern direkt auf der Joyce programmieren möchte, für den ist Turbo Pascal eine gute Wahl um schnell zu guten Ergebnissen zu kommen. Dazu benötigt man zuerst natürlich den Compiler, genauer Turbo Pascal 3.01A für CP/M. Wer das Programm noch nicht hat, der kann es (kostenlos) aus dem Internet laden, z.B. über die folgenden Links:

http://techtinkering.com/2013/03/05/tur ... under-cpm/
http://www.z80.eu/pas-compiler.html

Verglichen mit späteren Turbo Pascal Versionen, die nicht mehr für CP/M erschienen sind, hat der Compiler erstaunlich wenige Optionen und ist daher recht übersichtlich. Dennoch benötigt man eine Anleitung:

http://bitsavers.informatik.uni-stuttga ... _Dec88.pdf

Doppelseitig auf 80g DIN A4 Papier ausgedruckt ergibt das einen Stapel von ca. 1,5cm Höhe, aber es lohnt sich.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Wenn man das Programm erfolgreich auf eine CP/M-Diskette kopiert und anschließend gestartet hat, dann fragt Turbo Pascal zunächst "Mit Fehlermeldungen? (Y/N)". Ein Druck auf "Y" lädt die Fehlermeldungsdatei TURBO.MSG; in der Folge erscheint bei einem Compile-Fehler nicht nur eine Fehlernummer, die man erst in der Anleitung nachschlagen muss, sondern zusätzlich die Fehlermeldung im Klartext. Allerdings benötigt die Option zusätzlichen Speicher und man kann für größere Projekte Hauptspeicher sparen, indem man auf die Klartextfehlermeldungen verzichtet.

Nach Auswahl der Fehlermeldungen-Option erscheint das Hauptmenü, das aus nur 11 Menüpunkten besteht. Die invertierten Buchstaben rufen den entsprechenden Menüpunkt auf.

Als erstes sollte man das Arbeitslaufwerk wählen, auf dem Turbo Pascal standardmäßig Dateien sucht und ablegt (üblicherweise A: oder B: oder die Ramdisk M:). Man gibt nur den Laufwerksbuchstaben an ohne den Doppelpunkt.

Turbo Pascal verwaltet zwei Dateien: die aktuelle Arbeitsdatei (work file), die geöffnet wird, wenn man den Editor aufruft, und die Hauptdatei, bei der der Compile-Vorgang beginnt. Das ist die Datei mit der "PROGRAM"-Zeile. Meist bestehen Turbo Pascal Projekte aus mehreren Dateien. Eine ist die besagte Hauptdatei, die anderen sind Include-Dateien, die per Compiler-Direktive zur Hauptdatei hinzugeladen werden. So ist eine gewisse Modularisierung möglich.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Für den ersten Test mag folgendes Programm dienen:

Code: Alles auswählen

program HelloWorld;
begin
	writeln('Hello world!');
end.
Im Hauptmenü drückt man [W] und gibt bei "Work file name:" den Dateinamen "test" ein. Turbo Pascal ergänzt automatisch ".PAS" zum Dateinamen, wenn man die Extension weglässt. Da eine Datei dieses Namens nicht geladen werden kann, zeigt Turbo Pascal "New file" an. Dann drückt man auf [E] für den Editor und tippt das Programm ein. Anschließend drückt man auf [STOP] zum Verlassen des Editors, dann auf [S] für Save zum Speichern der Datei.
Ein Druck auf [C] startet den Compiler und wenn man alles richtig gemacht hat, dann erscheint eine Information zur Speicherbelegung (Code / Free / Data). Mit [R] für Run kann man das Programm nun starten.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Das Arbeiten mit der Turbo Pascal Umgebung ist darauf optimiert mit möglichst wenig Tastendrücken auszukommen. Ich finde, man gewöhnt sich recht schnell an die IDE.
In der Anleitung wird natürlich ausführlich beschrieben, welche Tastenkombinationen für welche Editor-Funktionen zuständig sind. Allerdings gibt es ein paar Besonderheiten bei der Joyce zu beachten. Meine ersten Erfahrungen möchte ich für einen schnellen Einstieg hier ausführen:
Anmerkung: Statt [Ctrl] drückt man bei der Joyce auf [ALT]
  • Editor beenden - [STOP] oder [ALT]+[C]
  • Zeile löschen - [ALT]+[Y]
  • Num Lock an/aus - [ALT]+[FORM] (die 0 auf dem Ziffernblock)
  • Page Down - [ALT]+[#]
  • Page Up - [FORM] oder [ALT]+[R]
  • Scroll Down - [ALT]+[<]
  • Scroll Up - [ALT]+[SHIFT]+[<]
  • Insert / Overwrite - [ALT]+[V]
  • Dateianfang - [ALT]+[Q] [R] oder [ALT]+[ß] oder [ALT]+[0]
  • Dateiende - [ALT]+[Q] [C]
  • Zeilenanfang - [ALT]+[S]
  • Zeilenende - [ALT]+[D]
  • Bildschirmanfang - [ALT]+[E]
  • Bildschirmende - [ALT]+[X]
  • Blockanfang - [ALT]+[K] [ B] oder [ALT]+[1]
  • Blockende - [ALT]+[K] [K] oder [ALT]+[2]
  • Block löschen - [ALT]+[K] [Y]
  • Find - [ALT]+[Q] [F]
  • Replace - [ALT]+[Q] [A]
  • Repeat Find - [ALT]+[L]
Noch eine Bemerkung zu den Pascal-Quelltexten:
  • Eckige Klammern werden bei deutscher Tastatureinstellung als Ä und Ü angezeigt. Das funktioniert zwar, sieht aber recht merkwürdig aus. Anstelle von [ und ] kann man auch (. und .) verwenden, was wesentlich besser lesbar ist.
  • Als Ersatz für geschweifte Klammern { } sollte man (* und *) verwenden.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Vieles von dem, was ich hier ausführen werde, stammt ursprünglich u.a. aus dem "DMV-Sonderheft 2/87". Der Artikel ist im internen Bereich von joyce.de zu finden: Klubinterna > Werners CP/M Seiten > ... hier geht's zu Werners CP/M Seiten ... > Firmware > Turbo-Grafik für den JOYCE. Ich habe die Dateien überarbeitet und z.T. korrigiert.

Um Grafik auf den Joyce-Bildschirm zu zaubern, beginnen wir ganz klein: mit dem Zeichnen eines einzelnen Punkts bzw. Pixels. In vielen BASIC-Derivaten gibt es dafür einen PLOT-Befehl; den haben wir in Turbo Pascal leider nicht verfügbar. Also müssen wir ihn uns selbst "basteln", und das geht nur mit Maschinencode. Diese Arbeit wurde bereits für uns erledigt: Die Datei KERNEL.INC enthält die Prozedur plot(x, y, m), wobei die drei Parameter folgende Bedeutung haben:
  • x = x-Koordinate (0 - 719)
  • y = y-Koordinate (0 - 256)
  • m = Modus (0 = set, 1 = reset, 2 = invert)
Außerdem enthält KERNEL.INC noch weitere Basisbefehle:
GraphInit ist unverzichtbar; damit wird der Maschinencode für die plot-Prozedur initialisiert.
Screen_On und Screen_Off schalten den Grafikbildschirm ein bzw. aus
ShowCursor und HideCursor schalten den Textcursor ein bzw. aus
Die Funktion DotColor ist das Pendant zu plot: mit ihr kann man abfragen, ob ein Punkt gesetzt ist oder nicht
Symbol und Hex_Symbol dienen dem Erzeugen benutzerdefinierter Zeichen
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Lasst uns mit einem kleinen Beispielprogramm anfangen, das ein paar Punkte zufällig auf dem Bildschirm verteilt (10.000 Stück, um genau zu sein):

Code: Alles auswählen

program random_dots;

(*$I kernel.inc*)

var x, y, i: integer;

begin
    GraphInit;
    ClrScr; HideCursor;

    randomize;

    for i:=0 to 10000 do begin
        x:=random(720);
        y:=random(256);
        plot(x,y,0);
    end;
    repeat until keypressed;

    ShowCursor; ClrScr;
end.
Wichtig ist das Einbinden der Datei KERNEL.INC mit Hilfe der Compiler-Direktive; das "$I" steht für "Include File". Außerdem dürfen wir auf gar keinen Fall den Aufruf von GraphInit vergessen, sonst erleben wir einen hübschen Absturz...
Der Bildschirm wird mit ClrScr ("clear screen") gelöscht und der Textcursor wird per HideCursor versteckt, damit er nicht stört.
Mit randomize wird der Zufallszahlengenerator initialisiert; die Funktion random erzeugt Zufallszahlen im Bereich von 0 bis zur angegebenen Obergrenze - 1; d.h. die x-Koordinate wird zufällige Werte von 0 - 719 annehmen, die y-Koordinate von 0 - 255. Damit decken wir den gesamten Bildschirm ab. Die Prozedur plot rufen wir im Modus 0 auf, d.h. der Punkt wird gesetzt.
Die for-Schleife wird 10.000 mal durchlaufen, so dass 10.000 Punkte gezeichnet werden. Dabei kann es natürlich vorkommen, dass ein Punkt an Koordinaten gezeichnet wird, wo bereits zuvor ein Punkt gezeichnet wurde. Es können im Ergebnis also weniger als 10.000 Punkte auf dem Bildschirm zu sehen sein.
Damit das Bild nicht gleich wieder verschwindet, warten wir in der repeat-until-Schleife auf einen Tastendruck. Schließlich zeigen wir den Textcursor wieder an und löschen den Bildschirm.
Grafik1.zip
Das Beispielprogramm und KERNEL.INC
(1.96 KiB) 1625-mal heruntergeladen
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Während KERNEL.INC sich im wesentlichen mit einzelnen Punkten befasst, bietet die Grafikbibliothek GRAPHLIB.INC darauf aufbauend höhere Funktionen zum Zeichnen von Linien, Kreisen, etc.
GRAPHLIB.INC ist in Pascal geschrieben und benötigt ein zuvor inkludiertes KERNEL.INC. Folgende Prozeduren sind implementiert:
  • line(x1,y1,x2,y2,modus) - Zeichnet eine Linie von (x1,y1) nach (x2,y2); der Modus entspricht dem von plot aus KERNEL.INC
  • box(x_links, y_oben, x_rechts, y_unten, modus) - Zeichnet ein Rechteck
  • square(x, y, breite) - Zeichnet ein Quadrat; die Koordinaten markieren die linke obere Ecke
  • ellipse(x_center, y_center, radius_x, radius_y, modus) - Zeichnet eine Ellipse
  • circle(x_center, y_center, radius, modus) - Zeichnet einen Kreis
  • plot_marker(x, y, marker, modus) - Zeichnet ein Marker-Symbol
  • poly_plot(number_of_points, koord, modus) - Zeichnet viele Punkte auf einmal
  • poly_marker(number_of_points, koord, marker, modus) - Zeichnet viele Marker-Symbole auf einmal
  • poly_line(number_of_points, koord, modus) - Zeichnet viele Linien auf einmal
  • poly_fill(number_of_points, koord, modus) - Zeichnet gefüllte Flächen
Wir wollen uns zu Beginn mit den wichtigsten Befehlen vertraut machen, indem wir mit line und circle ein kleines Haus malen:

Code: Alles auswählen

program Haus(input,output);

(*$I KERNEL.INC*)
(*$I GRAPHLIB.INC*)

VAR ch : CHAR;

BEGIN
    GraphInit;
    ClrScr; HideCursor;

    line( 80,224, 80,128,0);
    line( 80,128,240, 64,0);
    line(240, 64,400,128,0);
    line(400,128,400,224,0);
    line(400,224, 80,224,0);

    line(400,224,640,192,0);
    line(640,192,640, 96,0);
    line(640, 96,400,128,0);

    line(640, 96,480, 32,0);
    line(480, 32,240, 64,0);

    circle(240,128,40,0);

    READ(kbd,ch);
    ShowCursor; ClrScr;
END.
Die beiden Dateien KERNEL.INC und GRAPHLIB.INC werden inkludiert - die Reihenfolge ist hier wichtig! Dann wird die Grafik initialisiert, der Bildschirm gelöscht und der Textcursor versteckt. Nun kann das Haus mit mehreren line- und einem circle-Befehl gezeichnet werden. Der Read-Befehl wartet auf einen Tastendruck; schließlich wird der Textcursor wieder angezeigt und der Bildschirm abermals gelöscht.

Hier sind die drei notwendigen Dateien als ZIP-Datei:
Grafik2.zip
Ein Haus zeichnen
(4.75 KiB) 1679-mal heruntergeladen
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Kommen wir nun zu den Demo-Programmen von o.g. Seite aus den Klubinterna, zunächst zu DEMO1:

Das Programm zeigt einige der Grafik- und Sound-Möglichkeiten:
  • "Pyramide" zeigt Grafik neben Text und demonstriert Liniengrafik mit s_box aus SIMPLE.INC.
  • "Sinus" zeichnet eine Sinuskurve samt Koordinatensystem.
  • "Zeichen" malt Smileys und zeigt die Verwendung benutzerdefinierter Sonderzeichen.
  • "Flash" lässt den Bildschirm blinken und erzeugt Piepstöne.
  • "Noise" erzeugt andere Geräusche und demonstriert play aus SOUND.INC.
  • Das Laden des Testbildes funktioniert noch nicht - mangels Testbilddatei... Das werde ich aber bei Gelegenheit nachreichen.
Die Datei GRAFIK3.ZIP enthält alle notwendigen Dateien. Viel Spaß beim Ausprobieren!
Grafik3.zip
DEMO1
(4.57 KiB) 1793-mal heruntergeladen
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Heute schauen wir uns mal an, wie der in Pascal implementierte Bresenham-Algorithmus arbeitet. Dazu setzen wir alle Pixel des Bildschirms, indem wir mit Hilfe der Prozedur line aus GRAPHLIB.INC 720 vertikale Linien zeichnen. Das Programm Linetest (linetst1.pas) ist zusammen mit den benötigten Include-Dateien in der Datei Grafik4.zip enthalten.
Grafik4.zip
Bresenham-Test
(4.99 KiB) 1641-mal heruntergeladen
Atemberaubend, diese Geschwindigkeit, nicht wahr? :)

Hier könnte natürlich per Assembler-Optimierung noch einiges herausgeholt werden. Und das Zeichnen insbes. von horizontalen Linien könnte noch erheblich optimiert werden: Es können im wesentlichen jeweils 8 Punkte auf einmal gezeichnet werden, indem 255 in den Grafikspeicher geschrieben wird (die Ränder der Linie müssen dann gesondert behandelt werden).
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Grafik mit Turbo Pascal

Beitrag von bbock »

Hier noch eine schöne Demo, die die Möglichkeiten der kleinen Grafikbibliothek recht gut zeigt:
  • Lissajous-Figuren (die kannte man früher eher vom Oszilloskop)
  • Linienarten mit verschiedenen Linien-Mustern
  • Die Grundformen: Recheck, Quadrat, Ellipse und Kreis und Vielecke mit Poly_Line und Poly_Fill
  • Füllmuster (Pattern_Fill)
  • Marker (Plot_Marker)
  • XY-Grafik mit Point_Arrays
Grafik5.zip
Demo
(9.38 KiB) 1743-mal heruntergeladen
Es wäre noch anzumerken, dass die Include-Dateien für eigene Projekte gekürzt werden können, wenn bestimmte Funktionen nicht genutzt werden. Das spart kostbaren Speicher und ist für die Realisierung mancher Projekte unumgänglich. In GRAPHLIB.INC kann z.B. auch der Typ point_array verkleinert werden. Möchte man z.B. nur Figuren mit max. 5 Punkten zeichnen, dann kann der erste Indexbereich auf 0..4 (statt 0..250) geändert werden.
Antworten