Unterprogrammebibliothek: Sieger mit Maske
In dieser Ausgabe wird zum erstenmal ein Gewinner unseres Programmierwettbewerbs »Unterprogrammbibliothek« vorgestellt. Das Programm »Maske« bietet eine komfortable Routine zur Eingabe und Programmierung von Bildschirmmasken.
Die Anzahl der eingegangenen Unterprogramme und deren unterschiedliche Thematik machte eine Bewertung natürlich nicht einfach. Wenn Ihr Programm diesmal nicht vorgestellt wird, so bedeutet das keine Abqualifikation. Damit Sie als Leser aber auch in den Genuß umfangreicherer Unterprogramme kommen, werden wir gelegentlich zusätzlich zu unserem »Unterprogramm des Monats« andere interessante Einsendungen veröffentlichen.
Der Autor dieses Programms ist ein waschechter Berliner. Jacques Effenberg ist 35 Jahre alt und von Beruf Maschinenschlosser. Im März 1983 kaufte er sich einen C 64. Nachdem er sich ein knappes Jahr mit Basic versuchte, stieg er auf Assemblerprogrammierung um, weil er mit Maschinensprache viele Probleme besser lösen konnte. Zum Programm selbst:
Das Programm Maske hat die Aufgabe, die Programmierung von Bildschirmmasken zu vereinfachen. Der erste Befehl erstellt horizontale und vertikale Linien. Die an den Schnittstellen benötigten Zeichen werden vom Programm ermittelt und eingesetzt. Der zweite Befehl löscht vom Benutzer definierte Felder in der Bildschirmmaske. Der dritte Befehl dient dazu, Text an bestimmte Stellen des Bildschirms zu drucken. Das Maschinenprogramm liegt im Speicherbereich von 49152 bis 50539. Eigene Fehlermeldungen und das Listen der Basic-Zeile in der der Fehler vorkommt, erleichtern dem Benutzer die Arbeit.
Parameterübergabe, Fehlermeldungen
1) Linien zeichnen
Der Befehl für Linien zeichnen wird in Basic wie folgt programmiert:
SYS 49152, Richtung, Zeile, Spalte, Länge, Farbe
1a) Richtung
Für eine horizontale Linie geben Sie eine 0 und für eine vertikale Linie eine 1 ein. Bei einer Zahl größer als 1 meldet sich der Computer mit der Fehlermeldung:
Richtung Wert zu groß (0 bis 1) in:
und listet die Zeile Ihres Basic-Programms.
1b) Zeile
Die Zeilenangabe liegt im Bereich von 1 bis 25. Bei Werten von kleiner als 1 oder größer als 25 lautet die Fehlermeldung:
Zeilenwert kleiner 1 oder größer 25 in:
und die Basic-Zeile wird gelistet.
1c) Spalte
Die Werte für die Spaltenangabe liegen im Bereich von 1 bis 40 und Werte kleiner als 1 oder größer als 40 ergeben die Fehlermeldung:
Spaltenwert kleiner 1 oder größer 40 in:
sowie eine Anzeige der Zeile.
1d) Die Länge kann im Bereich von 1 bis 40 für horziontale Linien und für vertikale Linien im Bereich von 1 bis 25 liegen. Werte, die nicht in diesem Zahlenbereich liegen, führen zu der Fehlermeldung:
Länge Linie zu klein oder zu groß in:
Wollen Sie zum Beispiel eine horizontale Linie zeichnen, mit dem Spaltenwert 20 und geben als Länge einen Wert von 22 an, so führt das zur Meldung:
Spalte + Länge Linie größer 40 in:
da der Bereich von 40 möglichen Spalten überschritten wird.
Eine vertikale Linie zum Beispiel ab Zeile 10 und mit der Länge 17 würde die Fehlermeldung:
Zeile + Länge Linie größer 25 in:
ergeben, da das Ergebnis von 10 + 17 den möglichen Bereich von 25 Zeilen überschreitet. In allen drei Beispielen erfolgt ein LISTen der Basic-Zeile.
1e) Farbe
Für die Farbwerte würden Zahlen im Bereich von 0 bis 15 in Frage kommen. Werte größer als 15 führen zu keiner Fehlermeldung.
2) Felder löschen
Um bestimmte Bereiche auf dem Bildschirm zu löschen, müssen Sie den Befehl:
SYS50083, abZeile, bisZeile, Spalte, Länge eingeben.
2a) abZeile, bisZeile
Wollen Sie zum Beispiel die ersten fünf Zeilen auf Ihrem Bildschirm komplett löschen, müßte der Befehl wie folgt aussehen:
SYS 50083,1,5,1,40
also ab Zeile 1 bis Zeile 5, ab Spalte 1 und 40 Zeichen lang. Ist nur eine Zeile zu löschen, dann ist der Wert ab Zeile gleich dem Wert bis Zeile.
Geben Sie zum Beispiel für ab Zeile 10 und bis Zeile 2 ein, so erfolgt die Fehlermeldung:
Zeile 1 ist größer als Zeile 2 in:
sowie ein Listen der Basic-Zeile.
2b) Zahlenbereich
Für die Bereichsangabe gelten die Werte aus Absatz 1, sowie bei Überschreitungen auch die Fehlermeldungen.
3) Print
Für die gezielte Ausgabe eines Textes auf dem Bildschirm lautet der Befehl:
SYS 50242, Zeile, Spalte, Farbe, ”Text”
3a) Zeile, Spalte, Farbe
Alle unter Absatz 1 beschriebenen Zahlenbereiche für die Angabe bei Zeile, Spalte, Farbe gelten auch hier. Ebenso treffen auch die dort erwähnten Fehlermeldungen bei einer Bereichsüberschreitung zu.
3b) "Text”
Hier kann all das stehen, was Sie auf dem Bildschirm ausgeben wollen.
Ein Beispiel:
SYS 50242,1,20,2,”Probe”
es wird in diesem Fall in der ersten Zeile ab Spalte 20 das Wort »Probe« in roter Farbe auf dem Bildschirm ausgegeben. Sie könnten auch vorher im Programm festlegen, daß D$ = ’’Probe” ist, schreiben dann SYS 50242,1,20,2, D$ und erhalten das gleiche Ergebnis.
Hatten Sie vor diesem Befehl eine grüne Cursorfarbe, dann wird, nach dem Ausgeben des Wortes »Probe« in roter Farbe, Ihre Cursorfarbe wieder grün sein.
4) Erklärungen zum DATA-Programm
4a) Programmablauf
In Zeile 1000 werden nach der Dimensionierung der Variablen P die 116 Prüfsummen für das Maschinenprogramm in P(I) eingelesen. Jede Prüfsumme ist das Ergebnis einer Addition von zwölf DATA-Werten. Die Variable SP addiert die Prüfsummen. Zeile 1130 überprüft die Gesamtsumme und gibt bei einer Differenz die Meldung »Fehler Prüfsumme« aus. Das Programm wird beendet.
Das Maschinenprogramm wird ab Zeile 1140 eingelesen und gespeichert. Die Variablen S und SI addieren und ZI zählt die DATA-Werte.
Ist ZI = 12 wird in Zeile 1160 die Variable S mit der jeweiligen Prüfsumme P (PI) verglichen. Ist S ungleich P (PI), verzweigt das Programm zur Zeile 1210.
In Zeile 1190 wird SI mit der Gesamtsumme aller DATAs verglichen. Bei einer Differenz ergibt sich ein Fehler in der letzten DATA-Reihe. Es kommt zur Ausgabe der Meldung »Fehler letzte Reihe DATA«.
Sind alle Werte richtig eingegeben, wird in Zeile 1200 nach der Meldung »OK« das Programm beendet. Beim Einlesen von DATA-Zeilen notiert sich der Interpreter die abzuarbeitende Zeilennummer in den Speicherstellen 63 und 64 der Zeropage. War in Zeile 1160 die Summe von 12 DATA-Werten und die Prüfsumme P (PI) ungleich, so wird in Zeile 1210 die Zeilennummer in der der Fehler auftrat in Z$ festgehalten.
Dann wird der Bildschirm gelöscht und in Zeile 1240 die Meldung »Fehler in Zeile« Z$ ausgegeben. In den Zeilen 1250 bis 1260 wird der Befehl »LIST« und die Zeilennummer in den Tastaturpuffer gePOKEt. Dazu kommt in Zeile 1270 noch der Befehl »RETURN« und in der Speicherstelle 198 wird dem Interpreter mitgeteilt, wieviel Stellen im Tastaturpuffer belegt sind.
Nach dem Befehl »END« in Zeile 1280 und der Ausgabe von »READY« befindet sich der Computer in einer Warteschleife, in der auch die Speicherstelle 198 abgefragt wird. Da der Wert in 198 größer als 0 ist, arbeitet der Interpreter jetzt den Tastaturpuffer in folgender Reihenfolge (zum Beispiel bei Fehler in Zeile 1290) ab:
Speicher 631 Wert 76 = L
Speicher 632 Wert 105 = i (L + Shift i = Kurzzeichen für LIST)
Speicher 633 Wert 49 = 1
Speicher 634 Wert 50 = 2
Speicher 635 Wert 57 = 9
Speicher 636 Wert 48 = 0
Speicher 637 Wert 13 = Return
also LIST 1290 und die Zeile mit dem Fehler wird gelistet.
4b) Programmverbindung
Haben Sie alle DATA-Werte richtig eingegeben und der Computer hat sich nach einiger Zeit mit »OK« wieder gemeldet, so können Sie jetzt die Zeilen 1000 bis 1280 löschen. Dann geben Sie die folgende Zeile ein: 1280 FOR I = 49152 TO 50539:READ X : POKE I, X:NEXT:NEW
und speichern das Programm ab.
Wenn Sie das Programm in Zukunft benutzen, dann wird nach dem Einlesen des Maschinenprogramms in den Speicherbereich 49152 bis 50539 das DATA-Programm gelöscht, und Sie haben den ganzen Basic-Speicher für Ihr eigenes Programm zur Verfügung.
Sind Sie Besitzer eines Diskettenlaufwerkes, dann können Sie in der Zeile 1280 statt »NEW« den Befehl LOAD ”…”,8 schreiben, und das DATA-Programm lädt nach dem Einlesen der DATA-Zeilen Ihr eigenes Programm gleich nach.
Zwischen ”…” muß der Name Ihres Programms stehen. Wenn Sie diese Variante wählen, dann muß aber die erste Zeile Ihres eigenen Programms wie folgt aussehen:
10 POKE 45, PEEK (174): POKE 46, PEEK (175): CLR
Durch diese Lösung wird das DATA-Programm auch gelöscht und Ihr Programm wird gleich nachgeladen und startet sich selbst.