Die Bedeutung einiger Befehle aus dem Hagensoft EPROM V1.21 war mir bisher unbekannt und so habe ich so lange alle Möglichkeiten durchprobiert bis mir der Sinn jedes Befehls klar wurde. Geholfen hat mir dabei ein COMAL 80 Cartridge und ein 16kByte-Eprom, in das die angehängte Datei hagensoft1.21+8kFF.crt gebrannt wurde. Die Beschreibung beginnt mit den Matrix-Befehlen, die kaum Rätsel aufgaben. Aber danach wurde es spannend und bei EDGE auch schön wie die beiden Bilder zeigen. Die mächtigsten und hilfreichsten Befehle dürften EVAL, LEARN und EXECUTE am Ende der Beschreibung sein. Ich habe zu jedem Befehl ein kleines Beispiel-Programm erstellt und in hagensoft.zip als D64-Datei angehängt.
Code
- Hagensoft V1.21 Pakete
- PACKAGE DEUTSCH
- ----------------
- Dieses Paket wird automatsich gestartet und gibt die Fehler in deutscher Sprache aus.
- PACKAGE MATRIX
- --------------
- use matrix
- Für die Bechreibung wird angenommen, das drei Array-Variablen angelegt wurden. z.B. mit
- DIM a(2,2), b(2,2), c(2,2)
- PROC MATPUT(a(,), b(,))
- entspricht a := b
- Die Elemente der Matrix a bekommen den Wert der entsprechenden Elemenete der Matrix b zugewiesen.
- Beide Matrizen müssen gleich groß sein.
- PROC MATADD(a(,), b(,), c(,))
- entspricht c := a + b
- Die Elemente der Matrix c bekommen die Summe der entsprechenden Elemenete der Matrixen a und b zugewiesen.
- Alle drei Matrizen müssen gleich groß sein.
- PROC MATSUB(a(,), b(,), c(,))
- entspricht c := a - b
- Die Elemente der Matrix c bekommen die Differenz der entsprechenden Elemenete der Matrixen a und b zugewiesen.
- Alle drei Matrizen müssen gleich groß sein.
- PROC MATCOM(r, a(,), s, b(,), c(,))
- entspricht c := r * a + s * b
- Als Zwischenergebnise werden alle Elemente der Matrix a mir r multipliziert und alle Elemente der Matrix b mir s multipliziert. Die Elemente der Matrix c bekommen die Summe der entsprechenden Elemenete dieser Zwischenergebnise zugewiesen.
- Alle drei Matrizen müssen gleich groß sein.
- PROC MATNULL(a(,))
- entspricht a := 0
- Alle Elemenete der Matrix a bekommen den Wert 0 zugewiesen. So ist es auch direkt nach dem DIM.
- PROC MATUNIT(a(,))
- entspricht a:= Einheitsmatrix
- Die Elemente der Matrix a bei denen der Spaltenindex gleich dem Zeilenindex ist bekommen den Wert 1 zugewiesen, alle anderen den Wert 0.
- Zum Beispiel a(1,1):=1; a(2,2):=1; a(3,3):=1; usw.
- PROC MATMULT(a(,), b(,), c(,))
- entspricht c := a * b
- Die Werte der Elemente der Matrix c werden wie folgt ermittelt:
- c(x,y) := Die Summe aller a(x,i) * b(i,y) mit i := 1 bis zur Spaltenzahl von a.
- Die Matrix a muß soviele Spalten haben wie die Matrix b Zeilen hat.
- Die Matrix c muß soviele Zeilen haben wie die Matrix a und soviel Spalten wie die Matrix b.
- PROC MATTRANS(a(,), b(,))
- entspricht b := transponierte Matrix a
- Die Werte der Elemente der Matrix b werden wie folgt ermittelt:
- b(x,y) := a(y,x)
- Die Matrix a muß soviele Spalten haben wie die Matrix b Zeilen hat.
- Die Matrix b muß soviele Spalten haben wie die Matrix a Zeilen hat.
- FUNC DETMAT(a(,))
- entspricht Ergebnis:= Determinante der Matrix a
- siehe https://de.wikipedia.org/wiki/Determinante
- Die Matrix a muß genau so viele Spalten wie Zeilen haben (quadratisch).
- FUNC NULLMAT(a(,))
- entspricht a = 0 ?
- Das Ergebnis ist 1 wenn alle Elemente der Matrix a den Wert 0 haben, sonst 0.
- FUNC EQMAT(a(,), b(,))
- entspricht a = b ?
- Das Ergebnis ist 1 wenn alle Elemente der Matrix a den gleichen Wert haben wie die entsprechende Elemente der Matrix b, sonst 0.
- Beide Matrizen müssen gleich groß sein.
- PACKAGE DUMP802
- ---------------
- use dump802
- PROC DUMP(INT)
- Erzeugt einen Hardcopy-Ausdruck des Grafikbildschirm auf einen MPS-802-Matrixdrucker. (ungetestet)
- PACKAGE HAGENSOFT
- -----------------
- use hagensoft
- FUNC MEMORY$(r)
- Liefert einen 5 Zeichen langen String der die 5 Bytes der internen Darstellung der Zahl r enhält.
- s$:=MEMORY$(0.5)
- PRINT ORD(s$(1));ORD(s$(2));ORD(s$(3));ORD(s$(4));ORD(s$(5))
- siehe https://www.c64-wiki.de/wiki/Flie%C3%9Fkommaarithmetik
- PROC PALETTE(neu, alt)
- Ersetzt im gesamten Textbildschirm die Zeichenfarbe alt durch neu.
- PROC EDGE
- Enthält der Hires-Grafikbildschirm ausgefüllte Flächen so läßt EDGE nur deren Ränder stehen. So lassen sich z.B. aus ausgefüllten überlappenden Kreisen deren Umrisse erzeugen. Auch größere Schriftzeichen sehen nach EDGE cool aus.
- PROC SYMBOLS
- Listet die PROC und FUNC der mittles use aktivierten Pakete auf sowie die globalen Variablen.
- PROC GETSHAPE(Musternummer,x,y)
- Legt einen 16 mal 16 Pixel großen Bildausschnitt des Hires Grafikbildschirm als Sprite-Muster ab. Die Musternummen kann zwichen 0 und 31 liegen. Mit den Koordinaten x und y wird die obere linke Ecke des Bildausschnitt bestimmt. Ist das Sprite mit diese Musternummer gerade sichtbar so ändern sich sein aussehen nach GETSHAPE sofort.
- PROC BDRAW(i(,))
- Zeichnet im Hires-Bildschirm eine Bezierkurve durch die übergebenen Koordinaten. Dabei reicht die x-Achse bis ca. 9050 und die y-Achse bis ca. 4580, grade so als ob automatisch ein window-Befehl abgesetzt wurde:
- window(1,5000,1,3000)
- siehe https://de.wikipedia.org/wiki/B%C3%A9zierkurve
- PROC ELLIPSE(x, y, xRadius, yRadius, Winkel)
- Zeichnet im Hires-Bildschirm eine Ellipse mit dem Mittelpunkt x, y. Sie ist zwei mal xRadius breit und zwei mal yRadius hoch wenn der Winkel 0 beträgt. Ein Winkel größer 0 dreht die Ellipse gegen den Uhrzeigersinn.
- PROC EVAL(f$)
- Diese Procedure evaluiert die übergebene Formel, das heißt es wird Wert errechnet und einer Variable zugewiesen. So kann ein Programm den Anwender nach der auszuwertenden Formel fragen und sie berechnen ohne das sie als Teil des Programmes hinterlegt werden muß. Typische Anwedungfälle sind Nullstellensuche und numerische Integration. Die Formel kann auch rechts vom Gleichheitszeichen Variablen enthalten. Diese muß es beim Aufruf von EVAL allerdings alle bereits geben.
- Ein einfaches Beispiel ist
- EVAL("a=56*9")
- PRINT a
- Falls es die Variable a noch nicht gibt wird sie von EVAL angelegt.
- PROC LEARN(f$)
- Diese Procedure macht das gleiche wie EVAL, allerdings nur den 1. Teil: Sie übersetzt (parst) die Formel und speichert sie in einem internen Format ab. Zu diesem Zeitpunkt muß es die Variablen in der Formel noch nicht geben.
- LEARN funktioniert nur innerhalb eines Programm, nicht als interaktives Kommando.
- PROC EXECUTE
- Diese Procedure ist der 2. Teil von EVAL. Eine mit Hilfe von LEARN vorbereitete Formel kann mittels EXECUTE beliebig oft ausgewertet werden, auch mit veränderten Werten in den Variablen rechts vom Gleicheitszeichen. Das dürfte dann genau so schnell sein als wenn die Formel fest im Programm eingebaut wäre.
- EXECUTE funktioniert nur innerhalb eines Programm, nicht als interaktives Kommando. Zwischen LEARN und EXECUTE darf EVAL nicht verwendet worden sein, sonst liefert EXECUTE kein Ergebnis.