8 *** Verzeichnis der Beispielprogramme
Die Beispiele wurden mit dem GST-Macro-Assembler assembliert und erprobt mit den Roms JS, MGG, MF und MINERVA 1.82.
Im Verzeichnis ist eine Kurzbeschreibung angegeben.Alle auf Discette beigefügten Programme und Tabellen, ohne die erläuternden Texte, sind frei verwendbar. Nutzung beliebiger Art und Weitergabe sind gestattet, sofern dies ohne geforderte oder erbettelte Gegenleistung geschieht.
8.1 ** Inhalt
Die Beispielprogramme werden ständig überarbeitet und ergänzt.
- .1.1 Microdrive-Steuerung "MDVtest"
- 1. Demonstration der Steuerung durch die Hardwareregister.
- 2. Einrichten neuer Fehlermeldungen. Parametervorgabe.
- .1.2 Microdrive-Steuerung "MDV"
Die Funktionen obigen Basic-Programms in Processor-Code.- .2 Jobs im Selbstaufruf "The Self Cloning Program"
Einrichten eines wiederholt und aus sich selbst heraus aufrufbaren Jobs. IPC-Kommando für den Tongenerator.- .3 Timer-Interrupt "ASO"
Timer als Stoppuhr und zur Bildschirmabschaltung.
Wiederrufbare Interrupteinfügung und IPC-Abfrage.- .4 Basic-Parameter "DFV"
Basic-Befehle zur Prüfung und Definition von Parametern. Führt Name Table sowie Vectoren BP.LET und RI.EXECB vor.- .5 Device-Handler "STAK"-Device
Handler und einige grundlegende Basic-Befehle dazu.
In wesentlich erweiterter Form sind sie auch in der IO2-Sammlung enthalten.
8.2 ** Kurzbeschreibung der Programme
8.2.1.1 "MDVtest_prg" Basic-Programm
mit den Proceduren:
- MDV_TEST
Test von Signalaufbereitung und Tonköpfen.- MDV_START(x)
Das angegebene Laufwerk einschalten.- MDV_STOP
Alle Laufwerke abschalten.- SET_ERRMS(x,y)
Stellt Tabelle neuer Meldungen zusammen. Version{x} und Filename{y} optional, als Beispiel für Vorgabewerte mit TK2 in Basic.8.2.1.2 "MDV_bin", "MDV_asm"
Enthält codiert die Funktionen von MDV_START und MDV_STOP. Erklärungen im Assemblertext. Nicht aus Basic aufrufbar.
8.2.2 "MCLONE" , "MCLONE_asm"
Nach Adrian Dickens' "The Self Cloning Program" {1}.Erprobt mit/ohne TK2, mit/ohne PIF, alles in JS, MGG, MF, MINERVA 1.82. Dabei ist nur nach Aktivierung aus einem PIF-Menu Vorsicht geboten, wenn die Jobs gelöscht oder zum Button gemacht werden sollen. Offensichtlich sind hier dessen Grenzen erreicht.
Nach Aufruf mit EXEC "MCLONE" werden ausgehend von der Bildmitte kleine Blöcke von 4x3 Punkten Größe zu verschiedenfarbigen Linien zusammengefügt. Dies erledigt für jede Linie ein eigener Job. Dabei besteht er nur aus dem Header und einer Sprunganweisung in den einmal eingerichteten Programmblock. Bei Erreichen des Bildrandes, auch bei einem anderen Fehler, gibt der jeweilige Job sich selbst die Priorität Null und inaktiviert sich so. Ist keiner der Jobs mehr tätig, beendet sich das gesamte Programm selbst, nachdem es alle anderen seines Zweiges aufgelöst hat.Solch ein Job, der außer den notwendigsten spezifischen Daten ohne ein Programm im eigenen Codebereich betrieben werden kann, heißt beim QL "Clone". Das Verfahren des "Cloning" wird anhand dieses Beispiels dargestellt. Gleichzeitig werden die Vorteile reentrant augebauter Programme deutlich, denn nur diese lassen auch in solch extremer Form die Mehrfachnutzung zu.
Der Job kann in beiden Farbmodi des QL betrieben werden (MODE 4, MODE 8), wobei die Farbwirkung in MODE 8 natürlich vielfältiger ist. Wegen der nur schwer erkennbaren Beendigung schließt sich ein Piepton an, womit zugleich ein Muster der Aktivierung des Tongenerators vorliegt.Hinweis:
Gelegentlich startet das Programm, ohne sichtbare Linien zu zeichen, es beendet sich u.U. auch sehr schnell wieder. Das ist kein Fehler. Bedingt durch die Abfrage einer Zufallszahl sind die Ergebnisse unterschiedlich. Mitunter werden auch weit über 100 Jobs eingerichtet.
8.2.3 "ASO_bin", "ASO_asm"
Neben der Parameterübergabe und der Nutzung eines Vorgabewertes, wenn diese fehlt oder ungültig war, ist in erster Linie hier ein Beispiel für Aufbau, Aktivierung und Stillegen einer Interrupt-Routine gegeben. Während deren Abarbeitung bleiben alle Interrupts eingeschaltet. Dies soll vermeiden, daß das System bei einem Fehler jeglichem weiteren Zugriff entzogen wird. Darum ist besonderes Kriterium die kürzest mögliche Laufzeit, womit zugleich der verschachtelte Aufruf derselben Routine auszuschließen ist. Bedingt durch die Speicherung der Timervariablen und des Linkblocks ist der Code nicht Rom-tauglich.
- TICK[(nn)]
Stoppuhr lesen und ggf. neu stellen: Funktion mit optionalem Parameter. Es wird erst der aktuelle Zählerstand ermittelt. Dann wird ggf. der Zähler auf den Wert der übergebenen Zahl (lange Integer) eingestellt. Nun erfolgt nach Umwandlung in eine f.p.-Zahl die Rückgabe des gelesenen Zählerstandes als Funktionswert.- TICK$[(nn)]
Gibt einen String zurück, der im Unterschied zu TICK die verstrichene Zeit nach Tagen, Stunden, Minuten und Sekunden mit Bruchteilen zu 20 ms enthält. Die Bewertung entspricht TICK.- AS_OFF
Uhr und Tatstaturüberwachung ganz ausschalten.- AS_ON
Dto., beim alten Zählerstand einschalten, s. u.- AS_SET(nn)
Zeitbegrenzung festlegen, sonst s. AS_ON- Eine optionale Zahlenangabe (lange Integer) setzt das Zeitintervall bis zum Abschalten der Bildausgabe fest. Null bewirkt AS_OFF. Ohne Parameter s. AS_ON.
- AS_ON
Bildabschaltung aktivieren Die angegebene Wartezeit oder ein Vorgabewert von ca. 5 Minuten wird übernommen. Die Überwachung beginnt.- AS_OFF
Bildabschaltung abstellen Das Bild bleibt im aktuellen Zustand und wird von nun an nicht mehr automatisch abgeschaltet.- AS_UNLK
Zeitkontrolle und Zähler stillegen Durch Herausnehmen aus der System-Liste wird die ganze Interruptroutine stillgelegt. Die beiden Zähler behalten den augenblicklichen Stand bei.- AS_LNK
Interruptroutine in das System einfügen Ohne Einfluß auf die sonst eingestellten Werte wird die Interruptbehandlung in das System eingefügt. Die beiden Timer sind nun (wieder) arbeitsfähig.- SCN(nn)
Durch Parameterangabe Bild ein-/ausschalten Ermöglicht die Bildschirmkontrolle durch ein Programm. Aufruf ohne Parameter schaltet das Bild ein, ebenfalls die Angabe einer Zahl =/= 0. Übergabe einer undefinierten Variablen, sonst eines Namen oder der Zahl 0, schalten den Bildschirm ab.8.2.4 "DFV_bin", "DFV_asm"
Ausführliche Beschreibung der Vorgehens findet sich im Assemblertext. Insbesondere die Typ-Einteilung der Variablen wird hier gezeigt:
- DEFVAL var,val
Procedur zur Definition nach Vorgabe. Die Variable {var} erhält den Wert der Vorgabe {val} zugewiesen, wenn sie nicht definiert ist. Ist {val} selber undefiniert oder nicht auf den Typen von {var} zu bringen, erfolgt ggf. Fehlerabbruch.- DEFVAL%{var,val}
Funktion mit Rückgabe eines Typ-/Fehlercodes. In der Arbeitsweise identisch mit DEFVAL. Dazu wird ein Code entsprechend den Vorgängen dabei zurück-gegeben. Fehlerabbruch erfolgt demgemäß nicht. Return Vorgang 0 Vorgabe wurde eingesetzt > 0 Variable ist bereits definiert < 0 Fehlerangabe gemäß der Codierung- NOVAL%{var}
Funktion mit Flag 1 bei undefiniertem Parameter. Analyse einheitlich wie bei den anderen Befehlen.- ISVAL%{var}
Funktion mit Flag 1 bei definiertem Parameter. Wie NOVAL%.- PARM%{parm.liste}
Funktion zur Angabe der Parameteranzahl. Gibt die Anzahl definierter Parameter bis zum ersten Undefinierten aus der übergebenen Liste an. {var} ist hierbei eine beliebige Variable nicht oder einfach dimensioniert. {val} kann außerdem auch ein direkt angegebener Wert oder ein Ausdruck sein.8.2.5 "STAK_bin", "STAK_asm"
STAK{_nn} ist der Name eines Device mit optionaler Angabe seiner Pufferlänge als Zahl nach dem Unterstrich. Die Zahl gibt die Anzahl speicherbarer f.p.-Zahlen an. Die Datenablage ist als Stack organisiert, d.h., die zuletzt abgelieferte Zahl ist die zuerst Lesbare. Setzen des Typen erlaubt auch andere Datenformate. Das Beispiel gibt einige Basic-Befehle an, die für Standardformate des Basic gelten (f.p. und Integer). Genaueres steht im Assemblertext.
Die Rückgabe der Funktionen kann immer auch zur Prüfung eines Kanals herangezogen werden. ERR.NJ kommt zurück, wenn er nicht zum Stack-Device gehört. Besonders ST_DEPTH ist geeignet, da weder zusätzliche Parameter ausgewertet werden, noch eine Veränderung in den Daten erfolgt.
- ST_DEPTH [#kanal]
Funktion, Belegte Stacktiefe oder Fehlercode.- ST_DROP [#kanal [, anzahl%]] Procedur Stackposten wegnehmen, Vorgabe 1 Posten. Auch negative Parameter sind möglich. Damit kann der Stackpointer auf beliebige Position gerückt werden.
- ST_LEN [#kanal]
Funktion, Holt definierte Kapazität oder Fehlercode.- ST_POP [#kanal]
Funktion, holt jüngste Eintragung oder Fehlercode.- ST_PUSH [#kanal [, parameter(-liste)]]
Procedur, Ablage (mehrerer) Zahlen.- ST_SWAP [#kanal]
Procedur, Vertauschen der zwei jüngsten Zahlen.- ST_TYP [#kanal [, länge%]]
Funktion, Aktuelle Einzellänge, ggf. neu setzen. Vorgabe für den Basic-Kanal ist #4, wenn keine Nummer angegeben wurde.- STKUNLK
Procedur zum Entfernen des Handlers Nur zum Test, Aufruf vor Neudefinition. Dabei müssen unbedingt zuvor alle Kanäle des zu erntfernenden Handlers geschlossen werden.