* F6 * pre(!)-79-standard experimental fig-forth * glossary * by .hpr'8/1995 *
* F6 * experimentelles Forth-System nach dem f.i.g.-Modell * von .hpr'8/1995 *

* >>   English explanations can be found by searching for the marker ">>".   *

This text is about 6700 lines of up to 80 chars, each, of plain QL-ascii
characters with no ctrl's other than lines terminating <lf>s - ASCII 10.

Characters above code 127 are
 "" ae = 128 & 160     "" oe = 132 & 164      "" ue = 135 & 167
 "" sz = 156           "" pi = 177            "" section symbol = 182
 "" my = 176           "" backquote = 159     "" division symbol = 187
 "" arrow down = 191   "" arrow up = 190

Der Text enthlt als Steuerzeichen nur <lf> - Code 10 - am Zeilenende und um-
fat ca. 6700 Zeilen zu max. 80 Zeichen Breite. Textende mit  eof  markiert.


              F6, Ausgabe 8.18, April 1998 - "final beta"
                Copyright (C) 1997 H.-Peter Recktenwald
                 Albestr. 21, D-12159 Berlin-Friedenau
                         Tel.: ++49 30 8520413
                     Inet: phpr@mail.geocities.com


                     ->  Teil 1 - EINFHRUNG
                              2 - GLOSSAR
                              3 - Referenzlisten


* QUELLEN

Die Originalversionen der F6-Sammlung sind in aktueller Form beim Autor gegen
bersendung zweier QL-formatierter HD-Disketten nebst Freiumschlag und in den
Archiven mit Namen F6... rsp GF6... im Internet zu erhalten:
        ftp://ftp.nvg.unit.no/pub/sinclair/ql/f6_forth/
evtl. auch bei (die Adresse kann sich gendert haben):
        ftp://ftp.taygeta.com/pub/forth/68000/misc
Stets auf jngstem Stand sind die Hinweise in:
        http://www.geocities.com/SiliconValley/Park/4410/qhpgf6.html

* >>> SOURCES

The most recent version of the F6 collection can always be obtained from the
author at no cost but for p&p + 2 QDOS-formatted HD diskettes or may be found
in the internet
        http://www.geocities.com/SiliconValley/Park/4410/qhpgf6.html
or fetched via
        ftp://ftp.nvg.unit.no/pub/sinclair/ql/f6_forth/


* VORBEMERKUNG

"nem geschenkten Barsch blickt man nicht ins Maul"; wer damit kein Problem hat
und in der Lage ist, die Arbeit anderer zu respektieren, ohne dabei gleich in
eine Identittskrise zu geraten, sowie eigenes Handeln auch selber zu verant-
worten, fr den ist der ganze Rechtskram, der hier vorangestellt ist, ziemlich
berflssig.
Weil aber, wenn man dem (beunruhigenden) Wortlaut der GNU-Lizenz glauben darf,
in einem immerhin nicht ganz unbedeutenden Lande der Erde "Juristen" und andere
unproduktive Existenzen unermdlich an Versuchen beteiligt sind, sich kostenlos
in Besitz von Gtern anderer zu versetzen, wobei ihnen offenbar kein noch so
perfider Dreh zu schmutzig oder zu dumm ist, sie sich nicht einmal entblden,
eine rein fiktive Handelstauglichkeit solch kostenlos verteilter Programme
einzuklagen, und sie anscheinend damit sogar noch "Recht" bekommen knnen, mu
dieses Zeug wohl sein, obwohl es mir absolut zuwider ist:

* RECHTLICHES

Programme und Texte in Zusammenhang mit dem F6-System unterliegen den Bedingun-
gen der GNU General Public License; zu Deutsch heit das, da die Gltigkeit
der vom Autor in deutscher Sprache formulierten und in "GNU-G_txt" beigefgten
GNU-Bedingungen vereinbart ist, ergnzt um die bereinkunft, da, insbesondere
fr den Urheberschutz, ausschlielich das Recht der Europischen Gemeinschaft
anwendbar ist, mit Gerichtsstand Berlin, und jede rechtsverbindliche Korres-
pondenz oder Auseinandersetzung in deutscher Sprache erfolgt. Mehr dazu s.u.

Ausdrcklich wird fr keinen Teil der F6-Sammlung irgendeine Eigenschaft zu-
gesagt. Das zum F6 Geschriebene stellt unverbindliche Hinweise dar, die aus
beilufigen Beobachtungen an dem experimentellen Systemaufbau des Verfassers
gewonnen wurden und darum nicht allgemein mageblich sind; dementsprechend
kommt KEINE GEWHRLEISTUNG in Betracht.

Die Nutzungserlaubnis in Gestalt der GNU-Lizenz wird auerdem nur unter der
Voraussetzung gegeben, da die Systembeschreibung gelesen und verstanden wurde,
welche Einschrnkung einzig der weiteren rechtlichen Sicherheit im Verhltnis
zwischen Nutzer und Autor dient.

Die Lizenz gilt fr die Weitergabe nur, sofern stets auch die vollstndigen
und originalgetreuen Quellen mitgegeben rsp gleichzeitig wahlfrei und kostenlos
zum Abruf bereitgehalten werden - Bereitstellung "auf Anfrage" gengt nicht!
"Originalgetreu" in diesem Sinne heit, da es nach Vernderungen wenigstens
durch geeignete Kennzeichnung jeder in der deutschen oder englischen Sprache
durchschnittlich sach- und schriftkundigen Person ohne fremde Hilfe mglich
sein mu, den Ursprungszustand eindeutig wiederherzustellen.

Niemandem ist es gestattet, die F6-Sammlung irgendwem vorzuenthalten, aus wel-
chem Grunde auch immer, insbes. sind fremde Embargo-Phantasien gegenstandslos.

Hier genannte Namen mgen Markenzeichen darstellen oder sonstwie geschtzt sein,
die Nennung irgendwelcher Namen bedeutet nicht, da sie frei von Rechten sind.

MIT DEM WEITERLESEN IST ANERKENNUNG OBIGER BEDINGUNGEN VERBUNDEN, wer damit
nicht einverstanden ist, hat die einfache Mglichkeit, hier abzubrechen.

* >>> PREFACE

I'd like to dispense with all that "legal" stuff. If you have no problems to
yourself taking the resonsibility for what you do, and if it doesn't violate
your self-consciousness to respecting the work of other people, this "legal"
part is not necessary at all. I'd feel I had to include these words only to
prevent those who always try to letting others work for them at no cost and
those who try to putting the responsibility for their own dullness to other
people. If that does not apply to yourself, pse, just take it with a smile...

* >>> legal stuff

Using anything concerning the F6 Forth System, and reading the texts, implies
the GNU Software License being agreed upon which accompanies the F6 system as
"GNU_txt", and no other than European Community Law being applicable, legal
actions being taken in Berlin, Germany, and in the german language, only.

With the exception of this preface and a some short explanations troughout the
glossary (re ">>") there is no authorized reference in another language than
german and not by the author himself, thus the GNU license is further restricted
to those who are capable of reading and (or, at least) understanding the F6
documentation - and did it. This restriction was made for safety of both the
user and himself, simply because the authors native language being german and
his otherwise limited capability to express himself. - Any translation done by
a native speaker of the other language concerned would be very welcome.

>> Some further english explanation can be found in "FORTH_txt".
>> The tables in the last quarter of this text may also help...
>> Other explanations can be found in the several "GF6UP.._txt" files.

Also the license does only apply if in a distribution of any part of the GF6
collection the complete and unchanged sources are freely available, it is NOT
sufficient just to keep them for special request in case someone might ask.

The author doesn't promise anything and thus there is NO WARRANTY AT ALL con-
cerning the F6 system. No responsibility will be taken for the consequences of
playing around while not exactly knowing what's going on, or executing risky
things purposely or accidentally.

Some people might need even that:
The author doesn't take the responsibility if you try drying your poodle in
the microvawe oven, even if that device was controlled by an F6 program, or
else... By using anything related to F6 you state to not taking the author nor
any other person liable for the results of whatever you do with those things.
If, while and when you are using F6 the license to do so was given to you under
the further condition that you are acting purposely, willingly and consciously.

No person nor (foreign, legal) institution may willingly exclude any other
person from obtaining the F6 collection, regardless of its home country or
any "embargoes" not set up or explicitely agreed to by the European Community.
This statement isn't meant to impose foreign legislation to other people, thus
those concerned should act as freely as their own knowledge will permit...

ANYONE WHO DOESN'T FULLY ACCEPT THE OBOVE MENTIONED CONDITIONS/STATEMENTS IS
NOT LICENSED TO USE ANY F6 RELATED INFORMATIONS/DATA AND MAY JUST STOP NOW.

The following text provides some very short english remarks; pse, refer to
"FORTH_txt" for further (but limited, still) descriptions of the F6 system.


* EINFHRUNG

Nun geht's deutschsprachig (und gemischt) weiter, denn englische Texte zu
4th gibt es mehr als genug, einschlielich des F6-Glossars in "FORTH_txt".

* Dieser Text
soll im wesentlichen alle im F6 definierten Worte mehr oder weniger kurzge-
fat auffhren und erklren. Weiter wird hier in groben Zgen das zugrunde-
liegende Programm(ier)modell erlutert, und zu einigen wenigen Themen finden
sich Beispiele, die insbes. die ber die Standardausstattung hinausgehenden
Eigenheiten nher darstellen. Schlielich gibt es noch ein paar Tabellen als
Hilfestellung zum Umgang mit diesem und zur bertragung in andere Systeme.

Wer die nun folgenden einfhrenden Worte berspringen will, sucht die Stelle
auf, die mit "F6WORDS_txt" markiert ist oder geht, wenn ihm die Grundzge und
Eigenheiten des F6-Systems vertraut sind, gleich zum "GLOSSAR".


* GNU - wozu?
Mit dem F6 sollte ein verllich dokumentierter und vollstndig durchschauba-
rer Forth-Kern speziell zum QL geschaffen werden, der auerdem auch die gngi-
ge Systemsoftware und seine Firm-/Hardware uneingeschrnkt zugnglich macht.
Dies wurde erreicht.
Um weitestgehenden Nutzen bei Wahrung eigener Rechte sicherzustellen, wurde
die GNU-Lizensierung gewhlt, deren Sinn neben der Erlaubnis zur kostenfreien
Nutzung, Weitergabe, sowie Anfertigung und Verbreitung(!) eigener Varianten zu
denselben Bedingungen auch darin besteht, vom Autoren entwickelte Konzepte der
Anwendung und Diskussion zugnglich zu machen und (begrndet durch weniger gute
Erfahrungen) die Urheberschaft klarzustellen.

* Rechte auf F6-Programme
Bedingt durch die Natur des "gefdelten" Forth ist es schwer, daraus verstnd-
liche Quellen-Texte zu gewinnen, besonders, wenn Programme mit {seal} geschtzt
wurden und/oder sie namenlose Worte enthalten; Disassembler jeder Art sind im
allgemeinen restlos berfordert. Damit sind Forth-Programme ganz unabhngig von
gewaltigen Worten zum (vermeintlichen/erhofften) Schutz eigener Rechte bereits
in sich selbst sehr sicher gegen unerwnschtes Ausspionieren ihrer Gestalt.

In seinem Originalzustand enthlt das F6-System keine Teile, die durch Rechte
anderer in der lizensierten Form der Verwendung eingeschrnkt wren, beliebige
Varianten des F6 sind demzufolge in derselben Weise frei verwendbar, Empfnger
von F6-Teilen brauchen sich ber womglich unbeabsichtigte Urheberrechtsverlet-
zungen darum keine Gedanken zu machen, und knnen sie bedenkenlos weitergeben.

Da im Sinne der GNU-Lizenz jedes compilierte und unabhngig als Job ausfhrba-
re F6-Programm ein auf dem F6 basierendes Erzeugnis ist, wird die Lizenz inso-
fern ergnzt, als Programme, die, auch mit Worten aus den beigefgten Dateien,
in den F6-Kern compiliert wurden, und damit NEUE EIGENSTNDIGE ANWENDUNGEN
bilden, vollstndig der VERFGUNG DURCH IHRE AUTOREN unterstellt sind, sofern
durch das betr. Programm auf diese Tatsache DEUTLICH HINGEWIESEN wird.

Solche eigenstndigen F6-Programme fallen demnach nicht automatisch unter die
GNU-lizensierte generelle Freigabe! Hier gelten ggf. die Vorbehalte ihrer Au-
toren. Kriterium fr "eigenstndige Programme" ist die Ausfhrbarkeit als ei-
genstndiger Job bei Unzugnglichkeit von Compiler wie auch Interpreter, beide
mssen dann gegen wahlfreien fr nicht durch das Programm selbst und zu seinem
Ablauf erforderlichen Zugriff gesperrt sein.

Die genannte Sperrung kann z.B. durch Prparation zum automatischen Start mit
auch im Fehlerfalle Rckkehr zum Programm(beginn) geschehen durch:
        ' anwendungswort cfa also hidden (quit) !
Hier ist es noch leicht mglich, den Schutz zu brechen. Um dies zu erschweren,
fhrt man weiter aus:
        definitions seal
wonach der automatische Programmstart nicht mehr gendert werden kann. Setzt
man weitere Vocabulare {current} und ruft dann {seal} auf, werden auch diese
leer erscheinen, und der Schutz gestaltet sich auerordentlich bestndig.
Dann kann das System als automatisch startendes Programm gesichert werden:
        w-save directory_programmname

Dabei soll die Restriktion auch nicht zu weit getrieben werden, denn was ein
"eigenstndiges Programm" ist, zeigt sich letztlich von selbst. In Grenzfllen
ist die o.g. Einschrnkung jedoch unbedingt entscheidend und strikt.
Ein Beispiel ist z.B. in "bh_scr" gegeben, wo zwar die interpretierte Eingabe
fr Berechnungen in der Buchungszeile vorgesehen ist, sowie fr einige andere
Servicefunktionen, und der Compiler dem automatischen Nachtragen nicht defi-
nierter Konten dient, das System aber stets in das Programm zurckkehrt.

* Warum Forth?
Forth hat die einzige(?) "lebende" Computersprache, und kennt keinerlei Ein-
schrnkungen. Was das Lernen vielleicht ein wenig erschwert, und im Umgang
damit dieselbe Sorgfalt erfordert, wie eine "richtige" Sprache eben auch,
dann aber Mglichkeiten erffnet, die sonst nur mit allergrtem Aufwand zu
realisieren scheinen - wie etwa selbsttig "lernende" Programmstrukturen.
Kurze und dennoch klare Dokumentation von Quelltexten ist allein schon deshalb
besonders einfach (und naheliegend), weil Aufrufnamen mit Ausnahme des Leerzei-
chens bei geringen Einschrnkungen alle (QL-)ASCII-Zeichen enthalten knnen,
geschwtzige Umschreibungen oder kryptische Abkrzungen darum unntig sind.
Beispiele dazu geben etwa die blichen Forth-Assembler (s.dort). Der natrliche
und ausnahmslos einheitliche Aufbau in aufrufbaren Worten und daraus zusammen-
gefgten Stzen, die ihrerseits wieder je zu einem solchen Wort werden, fhrt
von selbst zu berschaubar strukturierten modularen Programmen, deren einzelne
Teile sich leicht testen lassen und so schnell zuverlssige Programme ergeben.
Wer von angeblich "schlecht lesbaren" 4th-Programmen spricht, braucht sich nur
auf seine eigene Gestaltungsmglichkeit zu besinnen, denn hier gibt es nichts,
was nicht gendert werden knnte.
Die in gehufter Anordnung gelegentlich verwirrenden Stackoperatoren knnen mit
{stack} durch Listen ersetzt werden, deren Posten sich bersichtlich hinschrei-
ben lassen, und bei {stack:} als Wortdefinition mit erklrenden Namen versehen.

* OOP und Forth
Objektorientiertes Programmieren ist einerseits ein stark formalisiertes
Verfahren, ursprnglich aber ein aus dem natrlichen Vorgehen abgeleiteter
Begriff, der auf nahezu jede Lebenssituation bertragen werden kann. Es wird
damit eine Betrachtungs- und, daraus folgend, Programmierweise beschrieben,
die in ihren Grundzgen bereits ursprnglicher Bestandteil von Forth ist.

Durch Beibehalten der f.i.g.-4th-typischen Eigenschaft von Vocabularen als ohne
Ausnahme dem jeweiligen CURRENT-Vocabular untergeordneten Wortgruppen zum einen
und der Stack-Anordnung einer Kette einander in der Suchfolge nachgeordneter
Vocabulare ist fr einfache Mglichkeit der Kapselung gesorgt. Diese kann durch
abschlieende Wahl eines Wortnamen gleichlautend mit dem Vocabularnamen absolut
dicht gemacht werden. Da es keine Begrenzung fr die Vocabularanzahl gibt, und
weil unabhngig von der nur 16 Posten umfassenden Stackanordnung jedem Vocabular
selbst noch ein bevorrechtigter Nachfolger (in der Such-Ordnung) eingeprgt
werden kann, sind diese bei geringstem Aufwand und leicht berschaubarer
Bedienbarkeit eine brauchbare Entsprechung zu Objekten und sonstigen Systemen
der OOP-Formaldefinition. Die in 4th-Systemen meist fehlende Mglichkeit der
Vererbung auch der Ausfhrungsvorschriften eines Definitionswortes an ein neues
solches Wort ist im F6 bereits vorhanden. Damit sind alle Werkzeuge gegeben,
ohne jeden Zusatz auch formal die OOP zu betreiben.

* Warum "noch" ein Forth?
Die Antwort ist einfach: F6 ist konsequent und soweit irgend mglich auf den QL
mit seinen vielen besonderen Eigenheiten ausgerichtet, nutzt sie umfassend und
macht sie der Programmierung vollstndig und auf einfache Weise zugnglich.

* Das Besondere an diesem System?
Zum einen ist gem den GNU-Vereinbarungen das F6-System bis ins letzte Detail
offengelegt und dokumentiert, und es steht zur freien Verwendung. Zum andern
stehen Betriebssicherheit und Fehlertoleranz besonders im Vordergrund, die es
vornehmlich dem Anfnger erleichtern sollen, sich mit Forth anzufreunden.
Auerdem werden hierin einige Neuerungen(?) vorgestellt, wie z.B. die "Vererb-
barkeit" auch der Ausfhrungsvorschrift von Definitionsworten, u.v.m.

* Warum hrt man so wenig von Forth?
Oft stehen Geschwtzigkeit und Qualifikation in entgegengesetztem Verhltnis...

* Das F6-Forth spielt in (soweit dem Autor bekannt) jedem QL
Das F6-System wurde in QLs mit JM, JS, MGG und Minerva(1.93)-ROMs, zusammen
mit der Gold-Card (2.24/2.49), rsp der Trump-Card (mit TK2 2.21) betrieben,
und mit der QXL-Karte zum ibm-PC, derzeit mit den Varianten SMSQ 2.76 rsp.
SMSQ/E 2.85, sowie im Rahmen der Mglichkeiten auch mit den Software-Emulatoren
QLAY, QPC (Demo-Version) und UQLX. Es arbeitet in den genannten Systemen soweit
einwandfrei, als berall Editor, Assembler und Tasker erfolgreich compiliert
und ausprobiert wurden. Damit ist das F6 eine allen QDOS-compatiblen Systemen
seit JM gemeinsame Programm(ier)grundlage, wo kaum Rcksicht auf Versionen
genommen werden mu, es also problemlos transportable Programme ermglicht,
und deren Mglichkeiten nicht nur die des SBasic weit bertreffen.
Dem Autor dient das F6 seit langem in Form eines Programms zur Kontokorrent-
Buchfhrung. Damit ist vom einwandfreien Zustand des F6-Systems auszugehen.

Prfung im konkreten Falle bleibt dem Anwender rsp. Programmierer berlassen.
Insbes. bei den noch in Entwicklung begriffenen SMSQ-Varianten wird dazu ge-
raten, da eben deshalb allgemeingltige Aussagen nicht mglich sind.

Ein F6-Job belegt ca. 82K Bytes Speicher, womit er auch im nicht erweiterten QL
noch gut einsetzbar ist und den Betrieb weiterer kleinerer Programme erlaubt.
Soweit programmbedingt mglich, ist der Speicherbedarf auf ca. 35K reduzierbar.

Alle Beschreibungen beziehen sich auf den Zustand des Systems, wie es beim Autor
in Betrieb ist und bestmglich hierdurch weitergegeben wurde. Zusagen werden
dadurch nicht gemacht, womit eine eventuelle Garantieleistung sich von selbst
ausschliet, ebenso wie die Haftung fr Schden im Zusammenhang mit dem F6.

* Das F6-System

F6 ist ein verkettete Aufruf-Listen interpretierendes System. "Compiler" in-
sofern, als die zusammengestellen Codes Programmcode des "virtuellen Processors"
des f.i.g.-Modells sind, die nur durch vollstndiges Entfernen aus dem Speicher
gendert werden knnen, und durch einen "ueren Interpreter" aus Textquellen
zur Ausfhrung durch den extrem kurzen "inneren Interpreter" angelegt werden.

Der Programmcode besteht aus 16-Bit-Datenposten ("words") und ist darum recht
kompakt. Nach Beobachtungen des Autors lassen sich die ca. 45K Bytes freien
Programmbereichs durchaus mit einigen hundert K-Bytes so manch anderer Umge-
bung vergleichen. Auch, da das F6 bereits ein vollstndiges System darstellt,
wo nicht erst alles mgliche Zeugs aus "libraries" dazugeladen werden mu.
Fr groe Datenmengen lt sich das System um Definitionen ergnzen, durch die
Daten, Texte und weitere Stacks im umgebenden Speicher angelegt werden knnen,
soda nur fr Programme der 4th-Bereich benutzt werden mu, was den tatschlich
verfgbaren Speicherbereich und die mgliche Programmgre stark erweitert.
Auf volle 32-Bit-"Breite" wurde verzichtet, und damit auch auf das Compilie-
ren in Form direkt ausfhrbaren Codes: Insbes. bei "modernen" Processoren
ntzt es wenig, wenn dann heftig optimiert wird, aber die Adressierung weit
auseinanderliegender Teile notwendig dazu fhrt, da deren innere Verfahren
der Optimierung (in "caches") erheblich behindert werden ("localitt" eng
zusammenliegender Datenblcke ist meist wesentliches Kriterium). Dagegen ge-
langt der gesamte Code des F6 mit allen Datenreferenzen sehr bald in vollem
Umfang in diese besonders schnell betreuten Speicherbereiche, soda, je nach
Anwendung, ohne irgendwelche Sondermanahmen selbst die Geschwindigkeit Pro-
cessorcode-compilierender Systeme erreicht werden kann. Unabhngig vom verfg-
baren Speicher, "den man ja hat", und mit welcher Ausstattung sich vielleicht
auch prchtig renommieren lt, wird natrlich auch die Gesamtbelastung des
Systems durch die extrem kompakten Programme geringer und die solchermaen
freigehaltenen Bereiche stehen fr andere Aktionen zur Verfgung. Was gerade
beim so vortrefflich im Multitasking arbeitenden QL ein Argument sein sollte!

F6 steht dem F.I.G.-Modell nahe und ist um die wertvollen Bestandteile
der Nachfolge-Standards ergnzt; der ANS-Standard ist hier nur insofern
bercksichtigt, als die zur Erweiterung dahin ntigen Grundlagen gelegt
und die ANS-4TH Standard-Ergnzung zum nachtrglichen Compilieren vorbereitet
sind. Dagegen finden sich im F6 z.B. die erweiterte und mit (soweit bekannt)
allen Standards vertrgliche Vocabular-Ordnung in einem VOCABULARSTACK,
und LOCALE VARIABLE, die in keiner Weise mit den Programmiergepflogenheiten
irgendeines der Standards kollidieren. Nicht zu vergessen auch die bereits
erwhnte Mglichkeit der Weitergabe der Definitionsvorschrift eines Wortes.
Ein rudimentres Hilfstextsystem hnlich der "HYPERTEXT" benannten Funktion
anderer Systeme ist in Gestalt des Wortes {view} vorhanden - mehr s. dort.
"ENVIRONMENT-VARIABLE" existieren in Form von aus dem F6-System lesbaren
Werten der Variablen des SBasic, das als Job 0 ja stets vorhanden ist, in
sehr vielseitiger und leicht durchschaubarer Form. Auerdem sind die QL-
spezifischen Trap-Aufrufe fr Ein-/Ausgabe, Files, die Bildausgabe und zum
Rechnen mit FLIESZKOMMAZAHLEN vollstndig und in (wie zu hoffen) leicht be-
dienbarer Form vorhanden. Auch das POINTER INTERFACE (PIF) wird, sofern vor-
handen, problemlos zugnglich. Zugriff auf WINDOW MANAGER und HOTKEY SYSTEM
sind vorbereitet, teils auch bereits definiert. Daneben sei auch auf den Satz
Operatoren fr VIERFACHGENAUE (64/63-Bit-)INTEGER-Zahlen hingewiesen, und die
gesonderte bersichtsliste aller Rechenoperatoren gegen Ende dieses Textes.
Jeder F6-Job enthlt einen zu 20ms unabhngig Interrupt-getakteten TIMER.

Auch eine Form der direkten EINGABE und AUSFHRUNG von KONTROLLSTRUKTUREN ist
vorgesehen:
        100 BEGIN 1- dup WHILE dup . REPEAT
Solch eine Sequenz kann blicherweise (und in allen Standard-Systemen) nicht
direkt aus dem Eingabestrom ausgefhrt werden, sie mu compiliert sein und
steht erst mit einer Wortdefinition zur Verfgung. Da fr die Ausfhrung in
einem gefdelten Forth-System immer ein Aufrufkopf vorhanden sein mu, der
ber die Verwendung der ihm folgenden Daten entscheidet, ist es recht aufwen-
dig, die sofortige Ausfhrbarkeit zu installieren. Processorcode compilierende
Systeme haben dagegen diese Variante bereits in sich, dort stellt sie sogar
das einfachere Verfahren dar, ist dennoch aber in ausgefhrten Systemen kaum
zu finden. Im F6 gibt es nun einen Kompromi, der besonders beim Ausprobieren
einzelner Passagen immerhin einige Lstigkeit erspart:
        | 100 BEGIN 1- dup WHILE dup . REPEAT |
Eingeschlossen in die "|" Striche wird die Eingabe compiliert und sofort ausge-
fhrt, ohne Unterschied zum Aufruf eines standardmigen Forth-Wortes. Danach
ist der benutzte Dictionary-Bereich wieder frei. Die Debug-Einrichtung des F6
ist auch auf diesen Compile-Modus anwendbar, womit es im F6 auf besonders ein-
fache Weise mglich ist, ausnahmslos jede standardmige Wortfolge unter realen
Bedingungen zu prfen - insbes. Worte, die mit {word} oder {hld} arbeiten, lie-
fern im gewhnlichen interpretierenden Zustand selten brauchbare Ergebnisse.

F6-Jobs (Programme) sind wegen der erweiterbaren Code- und Datenbereiche NICHT
ROM-TAUGLICH. Demzufolge sind z.B. die ROM-simulierenden Hotkey-Aufrufe nicht
anwendbar (wie HOT_CHP u.dgl.) - die Processor-Caches bereiten keine Probleme.

Das F6-System ist nicht im strengen Sinne ein Standard-f.i.g.-System. Zwar
ist es aus der 68000-Standardinstallation hervorgegangen, die von Laurence
Reeves unternommen und u.a. dem Verfasser bergeben worden ist, doch wurden,
zum einen der Platzersparnis wegen, vor allem aber zur Verbesserung der Aus-
fhrungsgeschwindigkeit smtliche laufzeitbestimmenden Aufrufe direkt im Pro-
cessorcode ausgefhrt und liegen auerhalb des 4th-adressierbaren Bereichs.
Dazu gehren etwa die Arithmetik-Aufrufe und die Ermittlung von Zahlen, die
keine hi-level-Teile mehr enthalten, bis hin zum Anlegen eines Wortheaders.
Der Platzeinsparung dient auch eine groe Anzahl "namenlos" angelegter Worte.
Andere Worte werden zwar im Debug-Betrieb mit Namen hingeschrieben, sind aber
namentlich nicht aufrufbar. Sie haben nur zur leichteren Fehlersuche einen
Hilfs-Kopf erhalten, wegen Erreichens der Leistungsgrenze des GST-Assemblers
aber keine wirklichen Wort-Header, da bei deren Vorhandensein Fehler entste-
hen. Einen Verlust bedeutet dies insofern nicht, als es sich ausnahmslos um
Worte handelt, die als 'runtimes' bergeordneter Aufrufe compiliert werden.
Die inneren Gegebenheiten des F6 sind also mit den Standardhilfsmitteln wie
Decompiler etc. kaum analysierbar, unbeschadet dessen gibt es aber keinerlei
Einschrnkungen bei der Erstellung vllig standardgetreuer Programme.
Weiter war es Ziel dieser Installation, die spteren Standards mglichst um-
fassend zu bercksichtigen, zumindest aber deren Nachbildung zu erlauben.


Noch ein Wort zum Copyright:
Der Autor ist wahrlich nicht eiferschtig im Umgang mit von ihm selbst entwik-
kelten Vorgehensweisen, er legt auch keinen Wert auf excessive Namensnennung,
ihm ist der aufdringliche Personenkult in gewissen Bereichen der "Informatik"
eher zuwider - wo es sein mu, gengt ein ".hpr". Es wird aber dringend darum
gebeten, bei bernahme wenigstens nicht die eigene Urheberschaft zu behaupten.


* Fr den Anfang
.. der mglichst leicht gemacht werden soll, gibt es ein paar weitere Hilfen:

* "F6WORDS_txt"
ist die vorliegende Dokumentation mit grob eingeteilt folgendem Inhalt:
        Rechtliches
        Allgemeine Beschreibung des Systems
        Zur Gestalt dieser Dokumentation
        System-Interna
                Wortaufbau, Vocabularordnung, Speichereinteilung
        Hinweise fr den ersten Versuch
        Rechnen im F6-Sytem, Arithmetik und U.P.N. (...halb so schlimm!)
        Datenformat
        Besondere Einrichtungen
                Optimierung, Locale Variable, Tastatur-Programmabbruch
        Alphabetisches Verzeichnis der Worte im F6, geordnet nach
                Vocabularen, mit Beschreibung aller nicht-trivialen Aufrufe.
        Innerer Interpreter
        Betrachtungen zur Ausfhrungszeit-Optimierung
        Zusammenstellung aller Operatoren der Ganzzahlen-Arithmetik
        Liste der Worte fr QDOS-Kanle
        Liste der "user"-Variablen
        Liste der "immediate"-Worte
        Liste der "deferred" Worte
        Fehlercodierung und Systemmeldungen
        Als doppelte Integer adressierbare Systemdaten (zum Multitasking)
        Beschreibung ausgewhlter ergnzender Worte aus "forth_scr"
        Gegenberstellung hnlicher Worte verschiedener Forth-Varianten
                und einige Ersatzdefinitionen fr im F6 fehlende Operatoren
        Gegenberstellung f.i.g. <BUILDS und DOES> mit F79+ CREATE und DOES>
        Betriebssystemabhngige Fehler
        nderungen durch neue Versionen.


* Start
Vorteilhaft aber nicht erforderlich sind:
        LRESPR "ptr_gen"        ( das "pointer interface" ist sehr ntzlich
        LRESPR "hot_rext"       ( Hotkey-System, u.a. fr den Hotkey-Puffer
        LRESPR "history"        ( Command-Line-History zur bequemeren Eingabe
        LRESPR "pex32_byt"      ( PEX fr MODE und aktive Hintergrund-Fenster
        LRESPR "dvs_byt"        ( SBasic-Zugriff fr F6, fnf Zeichenstze
        LRESPR "jobkey_byt"     ( u.a. zur {break}-Tasten-Verwaltung
Die genannten Erweiterungen sind nicht Bestandteile der F6-Sammlung, fallen
somit nicht unter die GNU-Lizensierung. "pex", "dvs_byt", "jobkey_byt" und
die "history" (von 'Oktagon') drfen unverndert copiert und weitergegeben
werden, sofern dies kostenlos, vollstndig und ohne Vernderungen geschieht.

Dann:
        EX qf;".( 1000 Zeichen Forth-Text als Parameterstring zulssig )"
oder z.B. der Editor, gleich mit seinem Glossar:
        EX "f6ed";" using flp1_ed_gls_g 1 is scr edit"

Statt irgendwelcher obscurer "Optionen" oder "Schalter" erlaubt die Tatsache,
da ein f.i.g.-Forth-System stets einen Interpreter enthlt, die direkte Pro-
grammierung durch einen bergebenen Parameterstring. Man schreibt dort genau
den Text hin, der mit dem Job-Start ausgefhrt werden soll, so, wie er auch in
direkter Eingabe aussehen wrde. Einschrnkungen gibt es auer der Begrenzung
auf gut 1000 Zeichen Lnge nicht, selbst Wortdefinitionen sind zulssig.

Nach dem EX-Aufruf meldet sich das System mit der Versionskennung, dem Datum,
an dem der Kern assembliert wurde, der aktuellen qdos-Job-ID und der Gre des
verfgbaren Stack- und Dictionary-Speichers.

Auerdem erscheint eine Frequenzangabe, die die in einer Interrupt-kontrollier-
ten Zhlschleife ermittelte effektive Rechnertaktung wiedergibt. Dies ist nicht
die wirkliche CPU-Taktung, sondern ein ggf. durch Cache-Speicherung oder beson-
dere Betriebsarten entstandener Effektivwert, der in etwa die Effizienz der
zugrundeliegenden MPU beschreibt, vor allem aber die systemunabhngige Zeit-
steuerung entsprechender Programme untersttzen soll. Er wird anhand der fr
die 68008, 68000 rsp. 680x0-Processoren angegebenen Taktzeiten ermittelt.
Hierzu gibt es mit {set-cal} und {ti-cal} die Mglichkeit erneuter Calibrierung
und des Lesens eines erfahrungsgem recht genauen Einheitswertes bezogen auf
den Zeitraum einer Sekunde.

Anfangs ist das {forth}-Vocabular zugleich {current} und {context}.

Es ist ein gemeinsames Eingabe-/Prompt- und Ausgabefenster in QDOS-Standardmaen
oder in den whrend eines {w-save}-Aufrufs eingestellten Abmessungen geffnet.
Die fensterbezogenen Worte arbeiten standardmig mit dem {in-cons}-Kanal fr
Eingabe und Echo ("prompt"), mit {out-cons} fr die Ausgabe und {work} fr alle
Aufrufe des {qdos}-Vocabulars.
{out-cons} ist initial gleich {in-cons}, whrend {work} noch nicht geffnet ist.
{in-cons} ist gegen (versehentliches) Schlieen geschtzt.


* F6-Programmtexte
Wenngleich auch die (womglich ja nicht ganz ohne Grund) bewhrten Screenfiles,
oder "Blockfiles", die Grundlage fr F6-Programmtexte darstellen, wo keiner-
lei Steuerzeichen enthalten sind, und die darum in jeder nur denkbaren Umgebung
verarbeitet werden knnen, sind auch zum Laden aus gewhnlichen Textfiles Vor-
kehrungen getroffen worden. Hierzu gibt es das Wortepaar {chain} und {end}.
Auch diese Ladevorgnge lassen sich in kaum begrenzter Tiefe schachteln (eini-
ge Hundert). Gegenber dem Standardverfahren wird hier blicherweise fr jeden
einzelnen Aufruf eine eigene Quelle gewhlt, soda auch dem Laden ganzer Bib-
liotheken-Stapel oder, da es im Forth keinen Unterschied zwischen Programm- und
Kommandodateien gibt, der Ausfhrung verwickelter "Batch"-Dateien kaum Grenzen
gesetzt sind.

* Programme
Zur Nutzung unter denselben Bedingungen wie das F6-System sind die folgenden
Quelltexte beigefgt rsp. beim Autor erhltlich:
        "fig_scr"               Screen-Editor, nach Muster des f.i.g.-Editors,
>>>     "ed_gls" & "ed_gls_g"   Bedienungshinweise zum Editor (editor glossary).
        "f6asm_scr"             6800x-(Macro-)Assembler in Forth und fr Forth,
>>>     "as_gls" & "as_gls_e"   Kurzbeschreibung dazu (assembler glossary).
        "ansext_scr"            Ergnzung zum ANS-Standard,
>>>     "ansext_gls"            ANS glossary (englischsprachige Hinweise dazu).
        "f6z80_scr"             ein Z80-Disassembler,
        "f6a80_scr"             Cons, Vari und lo-level-Worte dazu,
        "f6a80_4th"             zum Laden mit {c-load} aus "f6z80_scr".
        "f6stak_scr"            Arbeitsdefinitionen fr Software-Stacks mit bis
        "f6stak_4th"            zu 256K Gre im auenliegenden Systemspeicher.
        "f6task_scr"            Einrichtung und Beispiele zum Multitasking
                                einzelner Worte innerhalb eines F6-Systems.
        "f6task_4th"            weiteres Beispiel fr {c-load}
        "f6hnoi_scr"            die "Trme von Hanoi" einmal mehr strapaziert.
        "f6bh"                  Kontokorrent-Buchfhrung mit
        "bh_scr"                Quelltext und
        "bh_gls"                Kurzanleitung dazu (KEIN Buchhaltungskurs!).

Die Screenfiles (mit Endung "_scr") lassen sich in der einfachsten Form smtlich
mit einem Aufruf nach diesem Muster compilieren:
        EX flp2_QF;"1 s-load flp2_"&screenfilename$

In einigen Fllen mssen hilfsweise weitere Screenfiles vorhanden sein:
        forth_scr               wird von allen o.g. Files bentigt, und
        f6asm_scr               zustzlich auch fr f6task_scr, falls das
                                aufrufende F6 den Assembler nicht schon enthlt.

Z.T. befinden sich die Quelltexte in einem experimentellen Entwicklungszustand,
insbesondere bei "bh_scr" bezgl. der zustzlichen Optimierungsvorgnge und der
Umstellung von DOES> auf ;DOES>, wo wegen noch anzupassender Stellen Fehler
mglich sind, deren Korrektur mangels akuten Bedarfs (das Programm selbst liegt
in bewhrter Form vor) weder durchgefhrt wurde noch in absehbarer Zukunft
(seitens des Autors) zu erwarten ist. Sie sollen vor allem als Beispiele dienen,
da sie smtlich Grundlage vom Autor benutzter Programme sind - insofern steht
ihre Einsatztauglichkeit auer Zweifel.
Wieweit der Einzelne etwas damit anfangen kann, bleibt ihm berlassen.


* Der Editor "f6ed" mit "ed_gls_g" und >>> "ed_gls"
wird in einem eigenen Glossar "ed_gls" (englisch) rsp "ed_gls_g" beschrieben,
welches im F6-Editor lesbar ist und von dort aus auch gedruckt werden kann.
Der F.I.G.-Typ-Editor zeichnet sich u.a. dadurch aus, da er ohne zustzlichen
Speicherbedarf die Bearbeitung von Files mit knapp 1M Bytes Lnge erlaubt, und
da dies auch ber das QDOS-Netzwerk selbst mit dem nicht erweiterten Standard-
Gert mglich ist. Die Arbeit kann auch bei groben "Unfllen" kaum je verloren-
gehen kann, da nderungen im Text (ohne merklichen Zeitverlust!) sofort in die
Datei bertragen werden.
In F6ED liegt ein mit dem Editor bereits fertigcompiliertes F6-System vor. Es
enthlt auch einen DIR-Befehl, womit es nicht allzu schwer sein wird, den ge-
suchten Text mit {edit} und Hinschreiben des Filenamen in den Editor zu holen.
Fr einen ersten Versuch gibt man z.B. ein:
        EX "flp1_f6ed";"using flp1_ed_gls_g 1 scr ! edit"
und erhlt dann alle weiteren Erklrungen. Sofern "msg_scr" oder "fig_scr" im
selben Laufwerk vorliegt, bernimmt der Editor eine kurze Hilfsseite, die mit
F1 abgerufen werden kann. Anfangs ist der Editor auf Schreibschutz gestellt,
welcher Zustand mit F10 (SHIFT/F5) umgeschaltet werden kann.

>>> English readers might just execute
        EX 'FLP1_F6ED';'using flp1_ed_gls 1 is scr edit'


* 6800x-Assembler "f6as"
F6AS ist ein Ein-Pass-Assembler in 4th-Notation mit allen Vorteilen, die solch
ein Assemblertyp bietet, erst recht in einem Forth-System. Bedingtes Assemblie-
ren sowie die Mglichkeit, beliebige Passagen als Macro zu definieren, sind na-
trliche Eigenschaften eines jeden Forth-Assemblers, ebenso die aus dem unver-
zglichen Codieren aller Assemblerpassagen bei einem Ein-Pass-Assembler folgende
sofortige Ausfhrbarkeit z.B. als Forth-Wort. Typbedingt knnen Vorwrtsreferen-
zen gewhnlich nicht aufgelst werden. Diese Einschrnkung wird weitgehend auf-
gehoben, da eine Vielzahl Strukturworte zum Codieren von Schleifen und Sprngen
innerhalb einer Assembler-Passage vorhanden sind, dazu locale und globale Labels
und die Mglichkeit, Referenzen durch Ausfhrung von {defer}ed Worten zu erset-
zen, oder sie ber Variable zu beliebig spterem Zeitpunkt aufzulsen.
Der gesamte Befehlssatz der 6800x-Processoren steht zur Verfgung, dazu einige
der erst ab 68020 verfgbaren Befehle. Ziele sind entweder 4th-Adressenbereich,
auenliegende Speicherblcke, oder Dateien - ggf. auch mehrere gleichzeitig.
In den 4th-Speicher assemblierte Passagen lassen sich mit {c-save} sichern und
mit {c-load} in andere F6-Programme (derselben Version) bernehmen, die den
Assembler dann nicht mehr enthalten mssen - was ca 11K Speicherplatz spart.
Nhere Beschreibung im Glossar "as_gls", im F6-Editor lesbar.


* "FORTH_txt"
enthlt das Glossar und Hinweise zur Gestalt des Systems in englischer Sprache.
>>> description of the less common F6 features and some hint to translating
    different standards forth programs to compile in F6 and vice versa.
>>> "ed_gls" contains a short explanation of the screen editor.

* "F6CHG_txt"
beschreibt in deutscher Sprache, was das F6 ber die Standards hinaus bietet,
gibt Beispiele, wozu diese Dinge ntzlich sein knnen, und enthlt die im Laufe
der Zeit hinzugewachsenen Ergnzungen in chronologischer Folge bis zur Version
8.08; alles sptere ist den jeweils zugehrigen GF6UP..-Texten zu entnehmen.
Auerdem ist dort ein Abri der Definitionen aus "forth_scr" gegeben.


* "forth_asm"
fr den (Quanta-)GST-Macro-Assembler tauglicher Quelltext des F6-Systems.
Jedoch kann es beim Assemblieren Schwierigkeiten geben:
Der Assembler scheint mit der F6-Quelle am Ende seiner Kapazitt angelangt.
Infolgedessen kann es bei ungengendem Speicherplatz zu vllig zusammenhang-
losen Fehlermeldungen kommen. Oft hilft dann schon ein DEL_DEFB, vielfach
kann es aber auch erforderlich werden, peu a peu alle anderen Programme zu
entfernen, oder den QL ganz neu und mit mglichst wenigen Zusatzprogrammen
zu starten. Im SMSQ/E bleiben die Versuche beim Speicherausbau mit "nur" 2M
selbst bei gut 1M freiem Platz mitunter jedoch vllig aussichtslos, dagegen
reichten beim Minerva-QL mit GC ca 600K freien Speichers stets aus.
Sollten irgendwelche nderungen an nur wenigen derart begrndbaren Fehler-
meldungen scheitern, bleibt als letzte Manahme das Entfernen einiger der
mit dem "create"-Macro angelegten Forth-Worte, die fr den eigenen Bedarf
nicht ntig sind, oder die ggf. als Hi-Level-Definitionen nachtrglich com-
piliert werden knnen. Ein guter - und ergiebiger - Kandidat hierfr ist
z.B. {vlist}, das berflssig ist, falls ohnehin das komfortablere {words}
geladen werden soll.
Als endgltige Lsung dieses Problems ist eine F6-Version in Arbeit, die
mit dem F6-Assembler erzeugt werden kann. Mehr darber zu gegebener Zeit.


* Quellen?
Das F6-System ist Resultat jahrelangen Umgangs mit den verschiedensten Forth-
Systemen. So mssen auch die ber die Standardbeschreibung hinausreichenden
Einrichtungen nicht unbedingt vollkommen eigenstndige Entwicklungen des Autors
sein, und es ist auch unwahrscheinlich, da hier lckenlos alle zugrundeliegen-
den Quellen genannt werden. "Lernen" mag man das nennen, und es dem Autor nach-
sehen, zumal nichts unreflektiert anderswoher einfach nur bernommen wurde.
Grundlagen, die schon ihres Alters wegen kaum mehr mit besonderen Einzelheiten
in Verbindung gebracht werden knnen, und in die gesamte Arbeit eingingen, sind
insbes. der 6502-Forth-Computer der "Wireless World", das "GRAphik FORTH" zum
(Ur-)"Apple", das beraus leistungsfhige Multitasking-Forth der (leider nicht
mehr aufsprbaren) "Skywave Software" als Betriebssytem zur Hardware des ZX81,
und das auf einem L.M.I.-Kern basierende Forth-System von "Computer One" zum QL.
Weitere Anregungen entstammen insbes. den Arbeiten von Wil Baden und Tom Almy.


* Zum Sytem

* Vocabularordnung

Werden die Vocabulare entsprechend dem f.i.g.-Modell benutzt, treten
keine Unterschiede auf. Insbes. setzt {:} das CONTEXT-Vocabular auf
CURRENT, {;} ndert daran nichts. Alle im Kern definierten Vocabulare
sind 'immediate' und neue Vocabulare werden wie alle anderen Worte
dem CURRENT-Vocabular zugeordnet.

Bezglich des F83-Modells ergeben sich neben den genannten f.i.g.-4th-
spezifischen Eigenheiten einige Unterschiede in der Vocabularordnung:
Das {root}-Vocabular ist von allen anderen Aktionen unabhngig stets
zugnglich, und es wird sptestens nach erfolgloser Suche als letztes
Vocabular durchsucht, bevor das System den Zahleninterpreter aufruft.
Der Vocabularstack unterteilt sich in einen sicheren und einen flch-
tigen Bereich. Letzterem sind die beiden jngsten Posten zugeordnet,
der Rest wird nur durch {only}, {also} oder {previous} beeinflut.

Die ersten beiden Posten bilden einen Stack fr sich, aus dem mit Nen-
nung eines Vocabulars der zweite Posten hinausfllt, der erste weiter-
geschoben und der neue Vocabularpointer an dessen Stelle gelangt.
Jedes {also} schiebt die Vocabulareintragungen im ganzen Stackbereich
eins hher, die lteste fllt nach Erreichen der Stackgrenze hinaus.
Die Folge {also} und Vocabularname wirkt sich damit identisch zu dem
vom F83 her gewohnten aus, soll eine Suchfolge jedoch gegen Vernde-
rungen gesichert werden, ist dazu ein zustzliches {also} erforder-
lich:
                forth also also
schiebt {forth} an die erste dauerhaft gesicherte Stelle im Vocabular-
Stack. Die beiden ersten Posten nehmen die jeweils zuletzt genannten
weiteren Vocabularnamen auf. Zwei solche flchtige Posten wurden vor
allem dazu eingerichtet, die f.i.g.-typische bertragung von CONTEXT
nach CURRENT bei Colondefinitionen zu ermglichen, ohne da dadurch die
eingestellte Suchfolge im Stack Stck fr Stck weitergeschoben wird
und schlielich ganz verschwindet.
Oft ist es auch recht hilfreich, wenn neben der festen Suchfolge fr
einzelne Worte das Vocabular gewechselt werden kann, ohne immer gleich
den ganzen Stack zu verndern.
Gegenber dem F83-Stil ist hier nur zu beachten, da immer die beiden
jngstgenannten Vocabulare zugnglich sind, und da das Sichern einer
Suchfolge im F6 als letztes ein zustzliches {also} erfordert.
Nach
                only forth also also
ist die Suchfolge
                forth forth forth
verzeichnet.
                qdos pif
stellt sie nun auf
                qdos pif forth
und mit
                editor
wird sie zu
                editor qdos forth
Die Wortsuche bricht mit der ersten unbesetzten Stelle im Vocabular-
Stack ab. Dies wird signalisiert durch den Wert $8000 und lt sich
zur befristeten Eingrenzung auf ein(e) Vocabular(gruppe) nutzen:
                only forth editor also qdos also pif also also fp also
legt die Suchfolge an:
                fp pif pif qdos editor forth
Soll nun ein Wort z.B. nur in {hidden} gesucht werden, schreibt man
                also hidden also
                $8000 context 2+ !
Danach kann die alte Ordnung ganz einfach restauriert werden mit
                previous previous
(was in diesem speziellen Fall anders auch kaum gelingen wird, da
hier kein Wort des Forth-Vocabulars mehr aufrufbar ist), ohne da
sie zu diesem Zeitpunkt bekannt sein mu.

{find} lt sich mittels seiner Grunddefinition auf eine Wortkette
        begrenzen, deren jngste NFA angegeben wird:
                " branch" 1+ ' hidden 4+ (find)


* Speichereinteilung:

Aufgrund der Adressierungsweise liegt der Bezugspunkt in der Mitte des
Forth-Bereichs, der dadurch von $-8000 bis $7fff reicht: Die "negative
Null" ist niedrigste Adresse, whrend die "wirkliche" Adresse 0 in der
Bereichsmitte liegt. Gewhnlich ist dies fr den Umgang mit dem System
vllig belanglos, da die direkte Adressierung durch eine Zahl normaler-
weise nicht vorkommt. Die relative Adressenlage wird bei Forth-Worten
ohnehin stets bercksichtigt. Lediglich bei Eingriffen in das System
(oder dessen Analyse) sind die Bezugspunkte zu beachten.

 ----------------------- absolute bereichsgrenze des F6-jobs
           .............  ggf. rest des parameterstring aus EX-aufruf
 4th-obergrenze -------- ende des vom forth aus adressierbaren bereichs
           .............  ggf. count.w und teil des EX..-parameterstring
           -------------  ende der kanal-id-tabelle
                         16 langwort-tabellenpltze
           limit          obergrenze blockpuffer, anfang kanal-id-tabelle
                         16 blcke zu 2+64+2 bytes: blocknummer, text, 2 nullen
           first          anfang des blockpuffers
                         256 bytes 'user-area' - werte der user-vari
           (u0)  ______
           (r0)
                         1088 bytes returnstack. 'abwrts' bauend,
                         170 bytes 'aufwrts' fr den terminal input buffer
           (tib)
           .............  ggf. platz der localen variablen
           (s0)
           .............
                          datenstack und freier dictionary-bereich;
                          im "leeren" F6 stehen ca 45K bytes zur verfgung
           .............
           pad            flchtiger puffer 80 bytes ber here
           here           erste freie stelle im dictionary
           .............
                          von forth-definitionen besetzter bereich,
                          4th-adressierbarer kern ca. 17K bytes
           .............
 4th-untergrenze ------- ab hier 'aufwrts' 64K 4th-adressenbereich
           codebereich    ca. 17K processorcode-routinen, die aus dem system
                          direkt angesprungen werden, von neuen forth-worten
                          gewhnlich nicht umittelbar adressierbar.
           .............
 jobanfang - qdos-header mit sprung in das 4th-system
 -----------------------


* Fr den ersten Versuch

Die im Text benutzten besonderen Bezeichnungen wurden bereits erlutert. Es
ist unbedingt sinnvoll, sie sich gut einzuprgen, da sie immer wieder auftau-
chen. Deren wiederholte deutschsprachige Um- oder Beschreibung wre allzu
aufwendig - und ist gnzlich ungebruchlich, soda fremde Texte ohne dieses
Wissen weitgehend unverstndlich blieben.

Vor dem - problemlosen und einfachen - Start eines F6-Jobs empfiehlt sich
als erstes, einen F6-Editor einzurichten, beigefgt mit Namen "f6ed". Ist
dieser installiert, etwa mit
        EX "flp2_f6ed"
gibt man ein
        edit <enter>
Es erscheint eine Eingabeanforderung, die den vollen Dateinamen irgendeines
"screenfile" erwartet. Die beigefgten ".._gls"-Files enthalten erklrende
Texte, die fr diesen Editor zurechtgemacht sind.

Weiter ist ein Blick auf die Beschreibung von {l-load} ratsam, das dem bequemen
Laden eigener oder der vordefinierten Worte aus beliebigen Screenfiles dient.
Es mu dazu nur das gewnschte Wort namentlich bekannt sein, und der Name des
die betr. Definition enthaltenden Screenfile. Damit enfllt die Notwendigkeit,
sich fr alle mglichen Teilbereiche die betr. Seitennummern zu merken, oder
bei Aufteilung auf mehrere Dateien die vielen dazu ntigen Filenamen.

Das Aufsuchen selbst einer Stelle an Ende einer sehr langen Datei geht recht
schnell, da die Suche immer nur eine Zeile je Seite (zu 16 Zeilen) zu berck-
sichtigen hat. Zustzlich kommt die interne Zwischenspeicherung des QDOS diesem
Verfahren sehr entgegen, denn sobald eine Datei einmal bis zum Ende gelesen
wurde, hat das System sie im Speicher, und solange dort keine greren Reser-
vierungen angefordert werden, ist dann kein direkter Zugriff auf das Laufwerk
erforderlich. Diese Vorgehen entspricht den Sotware-Caches anderer Systeme.

Vorgabe ist "flp2_forth_scr", wo dann der Filename fortgelassen werden kann.
Bei der Inbetriebnahme ist es evtl. noch erforderlich, die erweiterte
"library-load"-Funktion aus "forth_scr" nachzuladen. Dazu schreibt man ohne
einen Wortnamen z.B. hin
        L-LOAD flp1_forth_scr
wodurch die Erweiterung automatisch in das im Kern nur rudimentr definierte
L-LOAD bernommen wird. Nebenbei: Es ist immer der ganze Filename anzugeben,
einschlielich Laufwerk und Directory.

Soll nun etwa das Wort zur Einrichtung einer Commandline History aktiv gemacht
werden, mit Namen "history" beigefgt und dazu vorher mit z.B. LRESPR resident
zu laden, schreibt man
        L-LOAD history
oder, wenn die Quellendatei an einem anderen Ort liegt, als mit dem letztem
Filenamen bei L-LOAD angegeben,
        L-LOAD history devN_neuerFilename
wonach auerdem fr alle weiteren Aufrufe ohne Quellenangabe diese Datei gilt.

HINWEIS zur HISTORY:
Ab Version 8.12 wird diese "history" (die nichts mit dem gleichnamigen aber
erst viel spter nachgesetzten Device aus dem SMSQ/E, das nichts weiter ist,
als ein simples Device fr String-Stacks, gemein hat!) erkannt und beim Start
dem in-cons-Kanal mit 40 Zeilen Gre zugeteilt. Sie kann mit dem 4th-Wort
{history} aus "forth_scr" auch anderen Klen mitgegeben werden.


* Einheits-Datenformat und Rechnen im F6-System

Das zugrundeliegende Datenformat bezeichnet Gruppen zu 16 Bit, die in Schritten
zu 8-Bit-"Bytes" in ganzen Vielfachen je mit einer Adresseneinheit im Speicher
adressierbar sind. Alle Datenposten sind 16-Bit-Vielfache, mit Ausnahme der ab-
hngig von ihrer Verwendung "Byte", "char" oder "Zeichen" benannten 8-Bit-Bytes.
Zahlen werden "big endian" so im Speicher abgelegt, wie sie auch in den Forth-
Stacks erscheinen, d.h. je mit dem hherwertigen Anteil an niedrigerer Adresse.
Grundstzlich sind formatunabhngig
      ALLE SPEICHEROPERATIONEN AN BELIEBIGER, gerader oder ungerader, ADRESSE
zulssig; wo sie ausnahmsweise geradzahlig sein mssen, wird darauf hingewiesen.

Arithmetisch werden die Daten als vorzeichenbehaftete Ganzzahlen mit dem Vor-
zeichen im hchstwertigen Bit und der Darstellung negativer Werte im Zweier-
complement behandelt. Vorzeichenbit = 0 steht fr das positive Vorzeichen.

Um Konflikte mit dem Wertebereich zu vermeiden, ist der Absolutwert einer Zahl
mit nur gesetztem Vorzeichenbit die Null. Diese Operation ist nicht umkehrbar.

An einigen Stellen wird im System das "Einercomplement" eingesetzt. Die Rechen-
weise damit zeichnet sich u.a. dadurch aus, da jeder Zahl umkehrbar eindeutig
ihr Negatives zugeordnet ist, es also keinen Wert gibt, der nach Negation der-
selbe bleibt - wie das im Zweiercomplement bei der Null und der Zahl mit nur
gesetztem Vorzeichenbit (der "negativen Null") der Fall ist.

Wer einfach nur rechnen will, braucht sich um Begriffe wie "Zweiercomplement"
u.dgl. nicht weiter zu kmmern, denn das Rechnen vollzieht sich im F6 ganz in
gewohnter Weise. Auch die so oft als Sonderheit hervorgehobene Anordnung von
Zahlen im Stack und das Rechnen in der "umgekehrten polnischen Notation" sind
problemlos zu handhaben, wenn man sich an dem beim Kopfrechnen sinnvollen Ab-
lauf orientiert. Ebenso wird im Forth gerechnet - wie letztlich in nahezu jedem
anderen Rechenwerk, nur tritt das dort nicht so offen zutage.

Ein einfaches Beispiel, das jedem gelufig sein wird, und das zeigt, wie wenig
Ungewhnliches an dieser Art Notierung ist:

  Schriftlich:  1000            Forth:  1000    erste Zahl zum Stack
                2000                    2000    zweite
                3000 +                  3000    dritte
               -------                  + +     alle addieren
                6000                    6000    Ergebnis im Stack

Wegen des schrittweisen Abarbeitens zusammengehrender Zahlengruppen gibt es
in der U.P.N. keine Klammerung, die Operationen werden notendigerweise in
wohlgeordneter und damit auch leicht bersichtlicher Form hingeschrieben.
So vereinfachen sich besonders kompliziertere Rechnungen noch ganz enorm:
                   _________________
                  |   12 * 6        |
        12 + 5 *  |  -------- + 132
                 \|   12 - 6

entspricht der Kettenrechnung
        12 mit 6 multiplizieren, von 12 6 abziehen,
        das erste durch das zweite Ergebnis dividieren,
        132 addieren und daraus die Wurzel ziehen,
        das Ergebnis mit 5 multiplizieren und 12 addieren,
        hinschreiben.

In 4th lsen wir auf,             lassen rechnen,         haben im Stack
        12 * 6 = 72                     12 6 *                  72
        12 - 6 = 6                      12 6 -                  72 6
        72 / 6 = 12                          /                  12
        12 + 132 = 144                  132  +                  144
        sqrt(144) = 12                  sqrt                    12
        12 * 5 = 60                     5    *                  60
        60 + 12 = 72                    12   +                  72

und schreiben das Ergebnis mit dem Punkt-Kommando hin:
                                             .

Die rechts aufgefhrten Zwischenergebnisse gelangen bei dieser Anordnung ohne
besondere Manahmen automatisch anstelle der jeweiligen Operanden in den Stack,
soda am Schlu sofort das endgltige Ergebnis zur Verfgung steht. Die Folge
der Operationen ist dank ihrer besonderen Anordnung nun leicht in ein Wort ein-
zubauen, das als neu definierter Operator sie wie eine Rechenformel abarbeitet:
        : ausrechnen 2dup * -rot - / + sqrt * + ;
wobei auffllt, da keinerlei Zwischenspeicherung erforderlich ist, es sei denn,
man bewertet {2dup} und {-rot} derart. Da dafr beim Aufruf die Reihenfolge der
bergebenen Parameter eingehalten werden mu, ist eine allen Programmiersprachen
gemeinsame Eigenschaft, bedarf also keiner besonderen Bercksichtigung.
Lautet die "Formel"
                  ______________
                 |     d * e    |
        a + b *  | c + -------
                \|     d - e
gibt man ein
        a b c d e ausrechnen   <enter>
Einfacher geht es kaum!

Die Forth-Definition der Quadratwurzel ist nicht im Standard enthalten, und
fehlt auch im F6-Kern, da sie sich nicht als notwendig erwiesen hat, zumal
sie im Fliekomma-Vocabular ohnehin vorhanden ist. Unter dem Namen {qsqrt}
findet sich eine Definition dazu (nach Newton, damit leicht auch fr hhere
Wurzeln modifizierbar) fr vierfachgenaue Integer in "forth_scr".

Dabei wird eine weitere Strke von Forth mit seinen Vocabularen offenbar.
Gibt man den Fliekomma-Operatoren des FP-Vocabulars gleichlautende Namen
wie den Standardoperatoren im Forth-Vocabular (im F6 ist dies der Fall),
wird einfach durch Wechsel des Vocabulars die obige Formel als Fliekomma-
Operator compiliert:
        also fp definitions
        : ausrechnen 2dup * -rot - / + sqrt * + ;

Die genannten Integer-Posten entsprechen den %-Variablen im SBasic; die erwei-
terte Genauigkeit doppelter oder vierfacher "Integer" hat nur den entsprechend
greren Wertebereich zur Folge. Das Rechnen mit den auch im F6 verfgbaren
Fliekommazahlen weicht auer der 4th-blichen Datenanordnung nicht von den aus
dem SBasic des QL gewohnten Verfahren ab.

Mit Ausnahme der nach negativ unendlich rundenden Division bei vierfachgenauen
(64/63-Bit-)Integer-Zahlen wird in Richtung null gerundet. Damit sind dann auch
die vom ANS-Standard geforderten Varianten im F6 smtlich leicht darzustellen.

>> Unless stated MEMORY OPERATIONS generally do NOT need to be ALIGNED.
   Arithmetic data will be interpreted as signed magnitude two's complement.
   Numbers will be stored "big endian" in memory, as on the forth stacks.
   The +ve value of any format integer with only it's sign bit set is Zero.
   Division is "round to near zero", with the exception of the quad integer
   operations, involving {uqm/mod} or {qm/mod}, which are "floored" - and
   thus enable the ANS required basic different rounding mode implementations.


* Optimierung der Ausfhrungsgeschwindigkeit

Die beste Optimierung ist witzlos, wenn die Grundlage nicht mglichst optimal
gestaltet ist, und darum war diese vor allem Gegenstand der Bemhungen: Im Kern
sind von den etwa 1000 Worten nur ca. 100 als "colon"-Definitionen eingerichtet.
Darber hinaus sind im F6 als "threaded interpretive" Compiler, der "gefdelten
Code" interpretiert, und so hinsichtlich geringsten Speicherbedarfs bereits ein
optimiertes Verfahren darstellt, der Optimierung enge Grenzen gesetzt. Sie wird
im F6 hauptschlich durch zum Wortanfang hin gerichtete Zusammenfassung einzel-
ner Worte zu besonderen Operationen durchgefhrt, deren Laufzeitvorteil sich
insbes. bei kurzen Definitionen deutlich bemerkbar macht.

Betroffen sind davon die Varianten von IF, WHILE und UNTIL mit
      0= IF   0< IF   0> IF   0< 0= IF   0> 0= IF   -dup IF   -dup 0= IF
Dies hat seinen Sinn neben der Zeit- und Platz-Optimierung auch darin, da die
Complement-Operationen nicht smtlich mit eigenen Namen installiert werden mu-
ten, zumal sie in jedem Forth-System unterschiedlich (wenn berhaupt) vorhanden
sein knnen. - Varianten wie {?DUP-0=-IF}, die sich in manchen (angeblich ANS-
Standard-)Forth-Systemen tatschlich finden lassen, sind einfach nur grotesk.

Die fr das F6 gewhlte Methode fhrt bei einerseits der Schreibweise nach
einfachster Standardausstattung anderseits automatisch zu umfassender Nutzung
der verkrzenden zustzlichen Operationen. Ganz, ohne da ein Benutzer sich
lstige bis alberne "optimierte" Zusatzdefinitionen merken muss...
Vornehmlich als Debug-Information existieren aber auch im F6 fr die besonderen
Sprungbedingungen eigene, mit der fig-Bennung mglichst konsistente Wortnamen.

        .. (hi-level-worte) .. ;
End-Recursion rsp. bergang in andere Hi-Level-Worte:
Fhrt der letzte Aufruf innerhalb eines Wortes in eine "Colon-Definiton", und
liegt die Distanz innerhalb 32766 Bytes, so wird statt des abschlieenden {;}
ein Sprung dorthin compiliert, was eine <nest>/<un-nest>-Folge einspart.
Da der bergang zwischen Hi-Level-Worten systembedingt recht aufwendig ist,
kann hiermit ein erheblicher Zeitgewinn bei der Ausfhrung entstehen.

Folgende Worte des Forth-Vocabulars werden paarweise zu einer Operation zusam-
mengezogen, wenn zwei davon unmittelbar benachbart sind:
        i       r       r>      >r      rdrop

Zwei einfache Festwerte mit {lit} werden umgeordnet und zu {dlit} vereinigt,
und folgt auf {dlit} ein weiterer Festwert, so entsteht eine {flit}-Anordnung.

Fr die Addition eines Festwertes wird {+} zu {lit+} umgeordnet und zusammen-
gezogen. {lit+} ist ein besonderer Additionsaufruf, der das der Addition voran-
gehende {lit} ersetzt und dafr sorgt, da die Zahl bei Ausfhrung direkt in
den Stack addiert wird. Dies spart zwei Bytes Code und gut 40% des Zeitaufwandes
der gleichwertigen Kombination { zahl + } ein.
Constante entsprechender Wirkungsweise lassen sich mit CONS+, CONSM+ und 2CONS+
definieren, womit dann auch die Operationen M+ und D+ erfat werden knnen.

Und schlielich werden
        drop ;    2drop ;    
* Mehr?
Wer immer auf Unzulnglichkeiten in Programmen oder Texten stoen sollte, oder
sonst Fragen hat, wird gebeten, sich an den Autor zu wenden, der sich alle Mhe
geben wird, weiterzuhelfen.
        H.-Peter Recktenwald, D-12159 Bln, Albestr, 21
        tel. +46 (0)30 8520413, inet: phpr@mail.geocities.com


 einfhrung ende, folgt glossar "F6GLS_txt" 


* "F6GLS_txt" - Glossar

* Bezeichnungen, Angaben zur Notation:

4th             abgekrzt fur "FORTH"
ans             man wei ja nie...
             >> (most unlikely) some adaptation to the ANSI-standard proposal.
C1 lmi          Anpassung an das C1-LMI-Typ Forth.
             >> the lmi-style forth for the QL by "Computer One"
F6              Hinweis auf nicht in den bekannten Standardbeschreibungen ent-
                haltene Einrichtungen im F6-System; teils eigene Entwicklungen
                und hierdurch zur Diskussion gestellte Vorschlge des Autors.
             >> F6 special.
F6S             fr zustzlich vom Screenfile "forth_scr" compilierbare Worte.
             >> additional forth words may be compiled from "forth_scr".
F79             Dem ersten als solchem formulierten Standard entlehnt.
F83             Hinweis auf Herkunft aus verschiedenen F83-hnlichen Systemen.
             >> for 83-standard compliance, or taken from f83, 83-standard etc.
FIF             Einem "fifth"-System zum ibm-PC entlehnt,
                das unter der Autorenschaft "Click-Software" geht.
             >> "fifth", by Click Software.
H4              Ein Multitasking-System der "Skyvawe"-Software, H&H Husband,
                zum ZX81, dem u.a. einige Funktionsprinzipien entlehnt wurden.
             >> H & H Husband's multitasking Forth for the ZX81.
LR              nach der von L.Reeves eingerichteten f.i.g.-Standardinstallation
                fr den QL, insbes. die qdos-Kanal-Tabellen betreffend.

* Wort-Typen
integer         jeder 16-Bit-Wert, als Zahl im binren Zweiercomplement notiert,
                Wertebereich -32767 bis 32767, -32768 als "negative Null".
             >> 16-bit-value, signed magnitude two's complement number
double          32-Bit-Wert entspr. 'integer',
                Wertebereich -2^31+1 bis 2^31-1, entspr. +/- 2147.483687.
             >> 32-bit integer value
quad            64/63-bit-Integer, max. Bereich -2^63+1 bis 2^63-1,
                entspr. rund +/- 10^19, genau: +/- 9.223372.036854.775807.
fp              dezimale QL/QDOS-Fliekommazahl,
                Bereich ca. +/- 10^614 bei neunstelliger Genauigkeit.
             >> decimal QL/QDOS-format (44-bit) floating point number
cons            Constante allgemein
vari            Variable
qdos-string     String mit fhrendem Zhler-Wort, mu nur dann an geradzahliger
                Adresse stehen, wenn eine qdos-Operation daran vorgenommen wird.
             >> word counted string, at even address if qdos-operands involved.
4th-string      String mit fhrendem Zhler-Byte, dem "countbyte".
             >> byte counted string

   Notierung fr den Datenstack, ggf. mit Returnstack
        ( datenparameter rp: returnstackparm -- datenparm rp: retstackparm )
   Alternativposten werden durch "|" getrennt angegeben.
        ( sys: ... )
   Compilerdaten liegen gemeinsam mit anderen Posten im Datenstack.

* Art und Bezeichnungsweise der Datenposten
Zahl            ein Posten im Stack oder im Speicher
Festwert        in ein Forth-Wort compilierte nicht nderbare Zahl, die whrend
                dessen Ausfhrung zum Stack gelangt - s. auch "literal".
Wert            Bestand einer beliebigen Dateneinheit.
String          lckenlose Gruppe als Schriftzeichen interpretierbarer Bytes.
                Die meist vorzufindende Umschreibung "Zeichenkette" trifft nicht
                zu, da die Zeichen in keinerlei Zusammenhang miteinander stehen,
                "Zeichen-Strang" wre akzeptabel, ist aber ungebruchlich.
                Darum wird in diesem Text der "String" als Begriff beibehalten.
Byte            je Adresse spezifizerte Gruppe 8 aufeinanderfolgender Bits.
Zelle           beliebiger Ort zweier aufeianderfolgend adressierbarer Bytes.
Adresse         des Forth heit anderswo oft "Pointer". Die Speicheradressierung
                im Forth erfolgt blich ber solche auf die Referenzadresse des
                Systems bezogenen Verweise auf die eigentlichen Datenposten und
                erspart damit viele unntige Speicheroperationen.
                Der Klarheit halber wird in diesem Text zwischen "Pointern" als
                "4th-Adressen" und "wirklichen (32-Bit-)Adressen" unterschieden.
+ve             fr einen Wert ab Null,
-ve             fr einen Wert unter Null.
negative Null   Zahl, bei der nur das (hchstwertige) Vorzeichenbit gesetzt ist.
-ve zero     >> integer with only the sign bit (m.s.b.) set.
dadr1           wirkliche Speicheradresse als 'double'
             >> double true memory address (32-bit)
disp            "displacement", Abstand zu einem festliegenden Ort.
c1              8-Bit-Wert, wie 'integer'
             >> charcter value, in the range of 0 to 255, or -128 to 127.
{ccc}           Beliebige Folge (im F6) zulssiger Schriftzeichen
             >> Any number of consecutive characters.
n1              Integer-Posten im Stack, das Standardformat des F6-Systems
             >> standard F6 single cell content, signed single integer, 16-bit.
Cc              Integer mit Vorzeichenwert als Sprung-Bedingung
             >> condition code
d1              "double": Doppeltgenaue Integer (32 Bit)
q1              "quad": Vierfachgenaue Integer (63/64 Bit)
un1 ud1 uq1     vorzeichenlos bewertete Integer der entsprechenden Formate
             >> unsigned
f1              fp-Posten im Stack
             >> qdos-style floating point item
er              Fehlernummer
d.er            'double' Fehlernummer
ptr1            vorzeichenbehafteter 16-Bit-ptr relativ zur Adressierungsbasis.
             >> ptr into the forth addres space, single integer (signed 16-bit)
stg1            4th-Adresse eines 4th-Strings, stg1 zeigt auf sein Countbyte.
             >> ptr to a (byte counted) 4th-string
flg             Flagwert tf oder ff, auf andere Codierung wird hingewiesen.
ff              "false flag" mit dem Wert 0.
tf              "true flag" mit dem Wert 1 (nicht -1 der spteren Standards!)
             >> "true flag" is 1, not -1 of the more recent standards!

* Worteigenschaften
(I)             'immediate' word
(C)             compilierendes immediate-Wort; Compile-Stack danach notiert.
(D)             'deferred' word, gebildet mit {defer}.
(P)             benutzt {pad} als Hilfsspeicher
(iP)            (P) nur im interpretierenden Zustand oder bei Programmeingabe.
hi-level        Ebene reiner Forth-Definitionen, im Unterschied zu
lo-level        Ebene direkt ausfhrbarer Processorcodes.
primitive       Wort, das sofort in direkt ausfhrbaren Processorcode mndet.
runtime      1. Zeitpunkt der Ausfhrung eines Wortes, rsp.
             2. Kurz fr "runtime executive", die beim Aufruf eines Wortes aus-
                gefhrte WA, von einer bergeordneten Definition compiliert.
          >> 1. moment of actually executing a word in a program.
          >> 2. "runtime executive", code executing a compiled word at runtime;
                the execution behaviour determining part of a defining word.
state sensitiv  ist ein Wort, das abhngig vom in {state} notierten Systemzu-
                stand (compilierend/interpretierend) unterschiedlich arbeitet.
AQ              Hinweis auf den Atari-QL, es gilt dasselbe wie bei QX.
QX              speziell fr QXL/SMSQ. Anwendung im SMSQ/E wegen immer wieder
                neuer und nicht stndig berprfbarer Versionen u.U. unsicher.
                Gewissenhafte Prfung bei zumutbarem Aufwand war nur in der
                Version 2.76 des mit der QXL gelieferten SMSQ mglich.
             >> for QXL/SMSQ; thoroughly tested as all the F6 system, never-
                theless not necessarily safe with any versions of SMSQ/E.
IO2             Die betr. Aufrufe liefern brauchbare Ergebnisse nur, wenn das
                MEM-Device der IO2-Sammlung (vom Autor des F6) vorhanden ist.
             >> needs the MEM-device which may be loaded from "dvs_byt".
PC              "program counter" - Programmzhler, oder "personal computer".
PeZe            die garnichtmal so schlechte Kiste der "big blue", verdorben
                durch vorsteinzeitliche "Programmier"-Versuche...
PiQ             "Programmieren in QDOS", Beschreibung des Betriebssystems des
                (schwarzen!) QL, Systemdaten und Beispiele. Kann u.a. aus dem
                Internet oder gegen Freimschlag und zwei formatierte Disketten
                vom Autor bezogen werden.
PIF             Pointer Interface, Basisteil des "Extended Environment";
PEX             eine besonders fr MINERVA (und SMSQ) eingerichtete Ergnzung
                dazu fr die automatische Auffrischung des Fensterinhalts.
SBasic          weist auf das SuperBASIC des QL hin (und nichts anderes!).
TK2             Hinweis auf Aktionen, die nur im TK2-erweiterten System zum
                Erfolg fhren, gilt zugleich fr Trump-/Gold-Card u. QXL/SMSQ.

* Systematische Begriffe
t.o.s.          "top of stack" - zuerst errreichbarer Stackposten.
sys             Compiler-Kontrolldaten, vorbergehend im Datenstack.
             >> control data on stack while compiling.
dictionary      der durch Worte besetzte und zum Aufbau neuer Worte freie Be-
                reich. Er teilt sich nach dem letzten compilierten Wort in die
                flchtigen Arbeitsbereiche ab {here}, wohin der Interpreter die
                aus dem Eingabestrom isolierten Worte holt, und {pad} zur An-
                wender-Nutzung und einige wenige Stringoperationen auf, sowie
                dazwischen den Bereich zur Umwandlung von Zahlen in Ziffernfol-
                gen, und beherbergt zum Ende hin noch den Datenstack mit ggf.
                den Localen Variablen. - Im eigentlichen Sinne nur der bereits
                besetzte Teil des Forth-Speichers, der jedoch erweiterbar ist.
             >> space of 4th-words, free compiling memory and workspace.
screenfile      Klartextfile ohne Steuerzeichen von ohne Rest durch Seitengre
                (c/l * b/scr) teilbarer Lnge - Standardmig 1024 Bytes/Seite;
                der Name deutet auf die Darstellungsweise in Bildschirmseiten.
block           Die "screen" besteht aus Blcken mit einer systemabhngigen
                Anzahl Bytes, die einer Zweierpotenz entspricht.
                Im F6 hat eine "screen" 16 "block"s zu 64 Bytes Lnge.
             >> One screen is 16 blocks of 64 bytes - re below.

* Wortgestalt
{name}          Forth-Worte erscheinen im Text zwischen geringelten Klammern.
                Die Namen drfen im F6 alle Schriftzeichen bis zum  enthalten,
                entsprechend den (QL-)ASCII-Codes 33 bis 160, worin auch die
                kleingeschriebenen Umlaute enthalten sind, und das "". Inner-
                halb dieses Bereichs sind Gro- oder Kleinschreibung belanglos.
                Die anderen Zeichen werden zwar fehlerfrei verarbeitet und damit
                gebildete Worte spter auch erkannt, jedoch knnen mehrdeutige
                Namen entstehen: Das System prpariert sie so, da die gltigen
                Schriftzeichen mit gelschtem Bit 7 in die Wortheader bernom-
                men werden. Dadurch erhalten die Zeichen 128 bis 160 einen Code
                im Bereich 0 bis 32. Beim Lesen werden sie wieder restauriert.
                Die Zeichen ab 161 kommen dabei mit den gltigen Codes ab 33 zur
                Deckung und knnen nicht als verndert erkannt werden, soda die
                damit gebildeten Namen spter verflscht erscheinen und sie u.U.
                nicht eindeutig sind:
                        :  also fp pi previous ;
                wird angenommen, jedoch sind dann
                              und     1
                identisch. Was zeigt, da ein neues Wort {} die Constante {1}
                berdefiniert und je nach Vokabular unzugnglich machen kann.
             >> forth words in a description appear within curly brackets. Names
                may consist of any chars in the range of (QL-)ASCII 33 to 160,
                wherein whether being upper or lower cases doesn't matter. Any
                other chars might result to ambiguous names.

* Vorzugs-Verwendung fhrender rsp abschlieender Zeichen bei 4th-Namen {...}
- ...           fhrendes "-" deutet an, da das Wort eine Aktion Flag-abhngig
                ausfhrt, oder selber eine Flag liefert.
" ...           Variante der Operation {ccc} fr eine Folge von Schriftzeichen.
? ...           zumeist eine Prfoperation mit {abort} im Fehlerfalle.
2 ...           Stackoperation an allgemeinen doppelt-groen Posten
4 ...           dto., vierfache Postengre.
d ...           vorwiegend fr vorzeichenbehaftete 32-Bit-Zahlen; Arithmetik.
q ...           dto., vierfachgenaue Zahlen.
 ... "          Wort erwartet oder holt eine Folge von Schriftzeichen.
 ... .          Schreibt eine Zahl rsp ein Textstck (auch bei fhrendem ".").
 ... :          Definitionswort.
 ... ?          Liest Daten und schreibt davon abgeleitete Zahl oder Text.
 ... ]          Wort mit bergang in den Compile-Zustand.
   Diese Namensmarkierungen sind standardmig nicht immer konsequent benutzt,
   geben aber meist zuverlssige Hinweise auf die Funktionen der betr Worte.

   Begrenzungszeichen zwischen Worten ist das Leerzeichen, auerdem gilt die
   ascii-<nul> (chr$ 0) als unbedingte Begrenzung, die dazu noch eigene Akti-
   vitten auslst, da sie zugleich Name eines (wichtigen!) Forth-Wortes ist.
   Gleiche Bedeutung hat das Zeilenende, unabhngig von der Eingabequelle.

   Zahlenangabe ist in verschiedener Form unabhngig von {base} mglich:
        %101    binr           !123    quaternr
        &123    oktal           #123    dezimal
        123    duodezimal      $123    sedezimal
        {A      ein Zeichen-Code (ersetzt z.B. das ASCII des F83-Forth),
                gilt mit Ausnahme der Lnge 2 fr beliebig lange Strings.
        {AB     "AB" in den beiden Bytes einer Integer-Zahl
        \123    als fp-Zahl     \123%   Hundertstel einer fp-Zahl
   Negative Zahlen werden durch das Vorzeichen NACH dem Basis-Praefix markiert:
        $-123                   \-123%
   Dezimalbruchmarke in allen Zahlentypen (auch fp!) "." und "," gleichrangig.


* Der Wortaufbau entspricht dem f.i.g.-Modell:

* >> Wortheader allgemein
   [ 1 p s ccccc ][ name ][ link ][ doword ][ parameter ][ wa ][ wa ] ...
   nfa                   lfa    cfa      pfa
        Darin:
nfa     "namefield address" mit gesetztem hchstwertigem Bit (7),
  p     precedence-Bit (6), das den "immediate"-Status bestimmt,
  s     smudge-Bit (5), das den Wortheader fr {-find} sperrt oder freigibt
  c     und den fnf niederwertigen Bits als Zhler fr die Lnge des Namen.
name    bis zu 31 Schriftzeichen, gesetztes Bit 7 markiert das Ende.
        Die hchstwertigen Bits der Codes von 128 bis 160 werden vor Eintragen
        der Grenzenmarken gelscht und durch {id.} restauriert.
        Die nfa kann an ungerader Adresse liegen  - s. {create} - der Compiler
        justiert sie so, da die lfa geradzahlig unmittelbar anschliet.
lfa     "linkfield address"
        mit einem ptr, der auf den Vorgnger im selben Vocabular zeigt.
cfa     "codefield address" (auch: compilefield)
        weist auf direkt ausfhrbaren Processorcode, der die Art des Wortes
        bestimmt, und die Verwendung der ggf. folgenden Parameterliste.
pfa     "parameterfield address"
        Liste mit Daten entsprechend den Erfordernissen des Wortes
wa      "word address"
        Synonym fr cfa, bezeichnet eine Eintragung in der Parameterliste.

* frei definierte Worte

Die Standardform entsteht mittels <BUILDS .. .. DOES> und erzeugt den Aufbau
wie anschlieend am Beispiel der Vocabulare dargestellt. Alternativ kann auch
die in den spteren Forth-Typen eingefhrte Methode benutzt werden. Dazu dient
die Kombination CREATE .. .. ;DOES>, die das <dodoes> in das Definitionswort
bernimmt und stattdessen die CFA damit gebildeter Worte dorthin lenkt. Damit
unterscheidet sich deren Aufbau im Gegensatz zu o.a. Form insbes. bezglich
ihrer PFA nicht mehr von den Colon-Definitionen:

Mit <BUILDS .. DOES> aufgebaute Definitionsworte erzeugen:
                [name][lfa][dodoes][doword][wa...]

CREATE .. ;DOES> sorgt fr einen dem Standardaufbau entsprechenden Kopf:
                [name][lfa][doword][wa....]
                 nfa       cfa    pfa

* Vocabulare

Die Definition ist Standard-vertrglich (insofern, als deren Auswertung rein
systemspezifisch ist, und innerhalb compilierter Programme bedeutungslos) um
zwei Posten erweitert.
                                                             
   [name][lfa][dodoes][dovoc][vocnfa][voctop][voclink][search][ff]
                       pfa   $81A0  {latest}
    standard:
dovoc   {vocabulary} ist ein mit <BUILDS..DOES> erzeugtes Definitionswort.
vocnfa  das 1. Wort im Vocabular als Platzhalter mit dem Pseudo-Namen $81A0,
        der dem Leerzeichen entspricht und als Wort nicht vorkommen kann.
voctop  dessen "linkfield" hlt die nfa des jngsten Wortes des Vocabulars.
        Der Ptr auf diese Position gelangt beim Aufruf in den Vocabularstack.
voclink sein "codefield" verkettet ein Vocabular mit dem bis dahin jngsten,
        indem es auf dessen [voclink]-Position gerichtet wird und die eigene
        Adresse bei der Vocabulardefinition in die User-Vari {voc-link} gelangt.
    zustzlich:
search  die eingeprgte secundre Suchfolge, initial mit {current} besetzt.
ff      das niederwertige Byte dient als Flag fr fp-compilierende Vocabulare,
        das hherwertige Byte sperrt bei den {-find}-Varianten ein bereits
        durchsuchtes Vocabular fr die erneute Suche, soda mehrmaliges Vor-
        kommen in der Suchfolge keinen Einflu auf die Compilezeit hat, und
        Endlosschleifen durch das Secundrvocabular ausgeschlossen werden.

        Dank dieser Struktur ist es recht einfach, wie z.B. in {forget}, die
        gesamte Vocabularkette Wort fr Wort durchzugehen - und anzuzeigen:

             voc-link
             begin @ dup -0 -
             while dup 4- dup 2- nfa cr cr id. cr
              begin dup id. pfa lfa @ dup @ $81a0 = over -0= or until
             drop repeat drop

        Das Beispiel {vwords} in "forth_scr" ist auf diese Weise aufgebaut.
        Die Folge { pfa lfa } holt zunchst aus der Vocabulardefinition die
        nfa des jngsten Wortes, von wo ausgehend mit denselben Aufrufen
        die Kette dann zurck bis nach [vocnfa] fhrt. Gleichheit mit dem
        dort hilfsweise eingetragenen Ur-Namen ist Abbruchkriterium fr die
        Wortkette, whrend die Vocabularverkettung im F6 mit $8000 endet.
        $8000 ist auerdem Inhalt der ersten lfa des Systems im Wort {root}
        und mu darum in die Abfrage der inneren Schleife einbezogen werden.

        Das eingeprgte Secundrvocabular entspringt dem Versuch, ohne einen
        seiner Natur nach notwendig begrenzten Vocabularstack auszukommen, und
        die mgliche Suchfolge auf eine beliebig groe Anzahl Vocabulare auszu-
        dehnen. Obwohl das auch genau so der Fall ist, wurde die Stackstruktur
        zustzlich bernommen, da sie sich als sehr handlich erwiesen hat.
        Ntzlicher Nebeneffekt ist die fr die OOP erforderliche und hierdurch
        leicht mgliche fix eingeprgte Aufruf-Hierarchie.

        Mit beispielsweise nur CURRENT und beiden CONTEXT-Posten besetzt, etwa
                only forth definitions
                2nd-voc on
                hidden minerva
        sieht die eingeprgte Suchfolge mit den Vorgabedaten folgendermaen aus:
                hidden forth minerva fp qdos pif forth
        denn {hidden} hat das Secundrvocabular {forth}, das seinerseits kein
        weiteres Vocabular angibt, und {minerva} weist nach {fp}, dieses nach
        {qdos}, welches {pif} zum Secundrvocabular hat. Da {pif} auch wieder
        nach {forth} bergeht, endet die Kette damit.

Hinweis:
        Da im F6 die besonders schnelle, aber vorzeichenbehaftete 16-Bit-
        Offset-Adressierung fr den Processor benutzt wird, ist der Umgang
        mit der "Null" ein wenig heikel. In allen Fllen, die die Suche in
        Vocabularen betreffen, wird die wertmige Null durch die "negative
        Null" vorzeichenbehafteter 16-Bit-Zahlen ersetzt. D.h., wo sonst
        blicherweise etwa als Abbruchmarke eine Null steht, findet sich im
        F6 die $-8000, beispielsweise auch im Ur-"voclink", das den Ursprung
        aller im System vorhandenen Vocbulare (und Worte) kennzeichnet.
        Die in frheren Versionen auftretenden Probleme bei Worten nahe der
        4th-Adresse Null konnten damit nun auch restlos gelst werden.

* GLOSSAR

Im Systemkern sind etwa 1000 Worte definiert, die nun in alphabetischer
Folge und geordnet nach Vocabularen beschrieben werden.

Es gibt im Kern folgende Vocabulare:
        ROOT    FORTH   HIDDEN  QDOS    FP      EDITOR  PIF     ASM68
Mit nach Hinzuladen von L-LOAD und WORDS der jeweiligen Anzahl Worte:
        21      678     79      125     64      4       21      10

FORTH und ASM68 sind in ROOT definiert und knnen darum immer aktiviert werden.
HIDDEN, QDOS, FP und EDITOR sind Untervocabulare von FORTH, das darum zu deren
Aufruf in der CONTEXT-Suchfolge vorhanden sein mu.
PIF als Untervocabular von QDOS ist nur zugnglich, wenn auch QDOS dort einge-
reiht ist.
Alle Vocabulare, auch das Deferred-Wort {assembler}, sind "immediate" angelegt.

* Das FORTH-Vocabular:

Wenn bei Zahlen im Stack Integer- und Fliekommaposten angegeben werden, so
existiert dasselbe Wort auch im {fp}-Vocabular oder einem seiner Nachfolger,
wo es dann mit den bezeichneten fp-Posten arbeitet. Hier wird auf die beiden
Vocabularen gemeinsamen Worte hingewiesen, um Fehler vermeiden zu helfen.

!               ( n1 ptr -- ) ( f1 ptr -- )
                Zahl n1 an der Stelle ptr im 4th-Speicher eintragen.
!a              ( n1 ptr2 -- )                          F6      "store aligned"
                Integer n1 an GERADzahliger 4th-Adresse ptr2 ablegen.
             >> store integer n2 to even aligned ptr2
!csp            ( -- )
                aktuellen Stackptr in der User-Variablen {csp} sichern.
                Dient der Fehlerkontrolle beim Compilieren, darf nur im nicht-
                compilierenden Zustand fr andere Zwecke eingesetzt werden.
             >> save the current stackptr
!name           ( ptr1 n2 ptr3 -- )
                max. n2 Bytes Text mit 16-Bit-Zhler von ptr3 nach ptr1 bringen.
             >> store word counted text of up to n2 bytes from ptr3 to ptr1
!l              ( n1 adr2 -- )                          F6 / lmi
                Integer n1 an wirklicher Speicheradresse adr2 ablegen
             >> store integer n1 to true memory address dadr2
#               ( d1 -- d2 )                                    "sharp"
                teilt d1 durch die aktuelle Zahlenbasis, stellt die aus dem
                Rest gebildete Ziffer in {hld} dem im Aufbau begriffenen Zif-
                fernstring voran und belt den Divisionsrest d2 im Stack.
                Anwendung zwischen <# und #>. Mit {#} lassen sich beliebig
                formatierte Ziffernstrings definierter Lnge zusammenstellen,
                und mit {hold} darin auch andere Schriftzeichen unterbringen.
                        ( dn ) <# # # # # #> type
                schreibt die vier niederwertigen Ziffern der Zahl (dn) hin.
                Dieselbe Operation an quad-Zahlen wird mit {q#} ausgefhrt, die
                weiteren Operationen zur Ziffern-Umwandlung sind mit {l-load}
                aus "forth_scr" mit Hilfe des Suchwortes {q.} compilierbar.
#case           ( -- n1 )               compiled code   F6
                Index, mit dem ein Wort aus case: aufgerufen wurde; mu darin
                als erstes stehen, liefert sonst keine zuverlssigen Werte. Es
                wird der unvernderte Index angegeben, auch, wenn er ber eine
                der Grenzen hinausweist. Das erste oder letzte Wort einer Liste
                kann auf diese Weise berlaufende Werte gebndelt bernehmen
                und sie dann einzeln weiterbearbeiten. Innerhalb einer Worte
                ausfhrenden {case:}-Liste kann {#case} z.B. den Austausch von
                Stackposten vereinfachen:
                    case: char bl bl bl bl bl bl bl bl bl bl bl bl bl bl bl
                               bl bl bl bl bl bl bl bl bl bl bl bl bl bl bl
                               #case ;
                ersetzt die Steuercodes bis 31 durch Leerzeichen (Code 32) und
                lt den Rest unverndert.
             >> re-reads the case index when called 1st in a case:-indexed word
#tib            ( -- n1 )                               f83
                User-Vari, Anzahl der in der t.i.b.-Eingabe empfangenen Zeichen.
                Unterscheidet sich von {span} dadurch, da z.B. {query} zwar
                beide besetzt, {expect} sich aber nur auf {span} auswirkt.
             >> no. of chars fetched from the t.i.b.
#vocs           ( -- n1 )                               f83
                grtmgliche Anzahl Posten im Vocabularstack.
             >> max. no. of vocs which may be stacked in the search order.
#.              ( un1 -- )
                Zahl un1 vorzeichenlos dezimal ausgeben (hinschreiben).
             >> write the unsigned value of un1 to standard output {out-cons}
#>              ( ud1 -- ptr1 n2 )
                Ende der Umwandlung einer Zahl in einen Ziffernstring mit Rck-
                gabe der Lnge und des Ortes, wo der String zu finden ist. Der
                Ablagebereich wird durch jede Form der Zifferndarstellung (auer
                FP) sofort wieder berschrieben, darum ist u.U. Transport an ei-
                ne anderweitig nicht benutzte Stelle erforderlich:
                        ( dn ) <# #s #> pad 80 + 2dup c! 1+ swap cmove
                sichert den String fr die weitere Bearbeitung.
                Mit Hilfe local anzulegenden Speichers kann der Zahlenstring
                auch local erzeugt werden, wodurch dann jegliche Kollision mit
                den Zuweisungen des Systems ausgeschlossen ist - mehr s. {<#}.
#s              ( ud1 -- 0. )
                ud1 vollstndig in Ziffern umwandeln und die Zeichen an ggf.
                bereits ermittelte Zeichen anhngen - zwischen {<#} und {#>}.
                Immer wird mindestens eine Ziffer geschrieben, so lassen sich
                z.B. auch Zahlen einer gewissen Mindestlnge erzeugen:
                        ( dn ) <# # # # #s #> type
                schreibt eine wenigstens vierstellige Zahl hin, lngere Zahlen
                werden vollstndig ausgegeben, krzere auf vier Stellen mit
                fhrenden Nullen aufgefllt.
$>f             ( ptr1 -- f2 )                          F6 QDOS
                qdos-String von 4th-Adresse ptr1 als Fliekommazahl zum Stack.
                Setzt als fp-Signal {dpl} auf -2 und sichert den hchstwertigen
                Stackposten fr QDOS-Operationen gegen Exponentenfehler.
             >> convert the word counted string at ptr1 to a floating-pt-number
$.              ( un1 -- )
                Integer un1 vorzeichenlos sedezimal ausgeben.
             >> print un1 with {base} set to 16
%.              ( un1 -- )                              F6
                Integer un1 vorzeichenlos binr ausgeben.
             >> print un1 with {base} set to 2
&.              ( un1 -- )                              F6
                Integer un1 vorzeichenlos octal ausgeben.
             >> print un1 with {base} set to 8
(boot)          ( -- ptr )                              F6
                ptr auf einen Filenamen, der u.a. bei {s-load} benutzt wird,
                wenn dort ein Filename nicht zustzlich angegeben wurde.
             >> ptr to a filename used by {s-load}
(d#)            ( dn1 n2 -- ptr3 n4 )                   F6      8.16 => hidden
                Zahl dn1 abhngig vom Vorzeichenflag n2 in String der Lnge n4
                auf Position ptr3 umwandeln.
(dir)           ( -- ptr )                              F6
                ptr to a filename used by {s-load}
(ert)           ( -- ptr )                             (LR)     8.16 => hidden
                flag to dis-/enable error trapping
(exper)         ( -- )(D)                               F6
                Fehleraktion von {expect} und {query} zum Schutz gegen Verlust
                des Eingabekanals. Bei einem Fehler anders als err.bo(-5) werden
                in-cons und out-cons auf den Fensterkanal vom Jobstart gestellt.
                Revectorisierbar z.B. fr {chain} u.. Worte.
(file)          ( -- ptr )                              F6
             >> filename used by the editor and when {dr1} active.
(joker)         ( -- n1 )                               F6
                Constante, deren Wert einen Zeichencode reprsentiert, der
                bei den Stringvergleichsoperationen stets als gefunden gilt.
             >> constant determining a char. value which will be always found
                when comparing strings, defaulted to disabled by -1.
(line)          ( n1 n2 -- n3 n4 )
                Liefert Stringptr n3 und Lnge n4 der Zeile n1 in Seite n2
                des gerade gltigen Screenfile.
(prompt)        ( -- ptr ) User-Vari                    F6      8.16 => hidden
                Eingabeanforderung und entpr. Meldungen freigeben/unterbinden
(prt)           ( -- ptr )                              F6
                (File-)Name der Drucker-Ausgabe
             >> filename used for printer output
(r)             ( -- ptr )                              F6
                User-Vari, ptr auf den Code des Fllzeichens fr {.r} u. dgl.
(screen)        ( -- ptr )                              F6
                filename used by the editor, and when {dr0} active.
(update)        ( -- ptr )
                Schreibfreigabe fr {r/w}
(upper)         ( -- n1 )                               F6
                Maskierung fr die Aufrufe mit Zeichenvergleich bestimmt die
                Abhngigkeit von der Schreibweise: -33 nicht -1 beachten.
                Fehler, die durch diese einfache Maskierung entstehen knnen,
                betreffen (fast) nur Codes auerhalb des fr Schriftzeichen
                gltigen bereichs, welche darum zugunsten hherer Ausfhrungs-
                geschwindigkeit in Kauf genommen wurden.
(wcard)         ( -- n1 )                               F6 (vorlufig)
                Code fr ein "wildcard"-Zeichen, das bei {t=} und {tl=} eine
                Gruppe von Zeichen beliebiger Lnge ab 1 in dem zu suchenden
                String ersetzen kann. -1 als Vorgabe inaktiviert den Code.
                Mit (joker) und (wcard) steht eine vereinfachte Form des Text-
                vergleichs im UNIX-Typ zur Verfgung, wobei aber beide Einsatz-
                zeichen nicht auf die blichen "?" und "*" festgelgt sind, son-
                dern je nach Erfordernis beliebig codiert werden knnen.
             >> This, and {(joker)}, facilitates a simplyfied unix-like string
                search mode of {t=} and {tl=} where the char of {(wcard)} de-
                termines the unlimited groups of characters representing code
                which, rather than being just an "*" may be redefined to any
                other character to suit.
*               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )
*/              ( n1 n2 n3 -- n4 )
                Wie {*/mod}, ohne Rest. Einziger hi-level-Arithmetikaufruf, wird
                in der Form { */mod sdrop } geringfgig schneller ausgefhrt.
*/mod           ( n1 n2 n3 -- n4 n5 )
                Multiplikation n1 mit n2 und Division des doppeltgenauen
                Produkts durch n1 liefert Rest n4 und den Quotienten n5.
+               ( n1 n2 -- n3 )(C)  ( f1 f2 -- f3 )
                {+} des Forth-Vocabulars ist immediate und optimiert im Compile-
                betrieb nach einem einfachem Festwert (Literal) auf {LIT+}.
+!a             ( n1 ptr2 -- )                          F6
                n1 zum 16-Bit-Inhalt an geradzahliger 4th-Adresse ptr2 addieren.
+!l             ( n1 adr2 -- )                          F6
                n1 zum 16-Bit-Inhalt an Speicheradresse adr2 addieren.
+!              ( n1 ptr2 -- )
                n1 zum 16-Bit-Inhalt an 4th-Adresse ptr2 addieren
++              ( n1 n2 n3 -- n4 )                      F6
                Zusammenfassung zweier Additionen.
+-              ( n1 n2 -- n3 ) ( f1 n2 -- f2 )
                n1 rsp. f1 mit dem Vorzeichenwert von n2 multiplizieren.
+buf            ( ptr1 -- ptr2 n1 )
                Flag n1 = 0, wenn der in {prev} verzeichnete Blockpuffer mit dem
                durch den auf ptr1 folgenden mit ptr2 bezeichneten identisch ist.
+continue       ( n1 -- )(I)                            F6
                berspringt die nchsten n1 Zeilen beim Lesen eines Screenfile,
                Bei negativem n1 zhlt die Zeile des {+continue} mit.
+loop           ( n1 -- )(C)
                Abschlu einer Zhlschleife mit Angabe der Zhlstufung n1.
                Endlosschleifen z.B. durch 0 +LOOP werden abgefangen.
+nul            ( -- ptr )                              F6
                Adresse einer Speicherstelle, die den Wert 0 enthlt.
+origin         ( n1 -- ptr )
                liefert mit einem Index lt. f.i.g.-Modell einige Initiierungs-
                Daten fr den Systemstart und die Wiederherstellung bei {cold}
                und {warm}. Zunchst die Verwendungsdefinition fr F6-Kanle:
                        -7      gerade benutzter i/o-Kanal, vom System besetzt.
                        -6   14 dr0-Kanal,              {screen}
                        -5   15 dr1-Kanal,              {file}
                        -4    0 Standard-Eingabe,       {in-cons}
                        -3    1 Standard-Ausgabe,       {out-cons}
                        -2    2 user-i/o, Druckerausgabe, {prt}
                        -1    3 qdos-Arbeitskanal,      {work}
                f.i.g.-Modell Standard-Initiierungstabelle:
                         0      cold-Einsprung als ausfhrbarer Processorcode.
                         4      warm-Einsprung, dto.
                         8      .cpu Systemidentifikation
                        12      {last}-Initiierung
                        14      <bs> Zeichencode
                Bedingt durch die u.a. zum F6-Multitasking notwendige 32-Bit-
                Initiierung weichen die nchsten Posten von der f.i.g.-Vorgabe
                ab. Die blichen User-Vari knnen in gewohnter Weise verwandt
                werden, sie mssen jedoch bei Vernderungen, die nicht durch
                das System selbst gesteuert werden, auf Offset -2 die 32-Bit-
                Werte (ggf. vorzeichenerweitert) erhalten:
                        16      {up 2-}
                        20      {s0 2-}
                        24      {r0 2-}
                Standardmige 16-Bit Initiierungswerte
                        28      {tib}
                        30      {width}
                        32      {warning}
                        34      {fence}
                        36 32-Bit {dp 2-}
                        40      {voc-link}
                        42      {up} User-Vari Laufptr
                Zustzlich schlieen sich die 32-Bit-Posten an:
                        44      CON-Handler-Adresse
                        48      Original-CON-Handler, ggf. vor PIF-bernahme
                        52      Abstand der CON-Parametertabelle vom Anfang des
                                Kanal-Definitionsblocks, brcksichtigt das PIF.
                cdtque  56      Abstand cdt (A0 in extop) zur i/o-queue
                pifque  60      Adresse der PIF dummy-queue
                        64      th-entry, Einsprungadresse in das Thing-System
                        68      hk-thg, Aufrufadresse fr das "hotkey-thing"
                und als 16-Bit-Variablenwerte:
                        72      (quit) erste cfa fr den Systemstart
                        74      {ert}-Aktivierung/-Sperrung
                        76      Maus-Code fr {break} bei bernahme durch PIF
                        78      Abbruchcode von {break}
            >>> re [jdt] for more sytem related information
+text           ( ptr1 ptr2 -- )                        (F6) f.i.g.-Editor
                qdos-String von ptr2 an qdos-String auf ptr1 anhngen,
                beide Strings knnen auch an ungeraden Adressen stehen.
-               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )
-->             ( -- ) (I)
                Beim Laden nchste Seite im Screenfile aufsuchen. Dies wird bei
                zugnglichem {in-cons}-Fenster dort mit einem Punkt angezeigt.
                Auch innerhalb von Worten oder Listen ohne besondere Manahmen
                im Compilezustand zur Fortsetzung einer Definition verwendbar.
                Falls beim Seitenwechsel der Stack eine andere Anzahl Posten
                enthlt, als beim Eintritt, werden zur Kontrolle und ggf. leich-
                teren Fehleranalyse Seitennummer und Differenz hingeschrieben.
                Darf nicht am Schlu eines Screenfile stehen, denn dann wrde
                der Ladevorgang endlos fortgesetzt, weil EOF bei Screenfiles
                nicht als Fehler gilt, also auch nicht zum Abbruch fhrt. Das
                Signal zum Beenden des Ladevorganges ist bei diesem Filetyp mit
                {;s} immer explizite anzugeben - fr {chain} s. {end}.
-cache          ( flg -- er )                           F6 QX IO2
                Cache-Zustand entsprechend flg 1 ein- oder 0 ausschalten. Z.B.
                nach {cache}, um den damit gelesenen Zustand wiederherzustellen.
             >> Cache on (n1=true) or off (n1=0)
-compile        ( -- ) (C)                              F6 "state sensitive"
                "state"-abhngig Compilieren rsp. Ausfhren einer cfa., ersetzt
                        ... state @ IF compile ENDIF {forthword} ...
             >> compile "state sensitive", if state is set, else noop.
-count          (ptr1 -- ptr2 count)                    F6
                Liefert Countbyte und Anfangsadresse des Strings ab ptr1,
                unabhngig vom Typen als 4th- oder qdos-String, wobei beide
                max. 255 Zeichen lang sein drfen. Ersetzt
                        ( ptr1 ) count -dup 0= IF count ENDIF ( ptr2 count )
-cr             ( flg -- )                              F6
                Bei flg =/= 0 ein <cr> senden.
-dup            ( n1 -- n1 n1 | 0 -- 0 )
                {dup} nur bei n1 =/= 0, entspricht dem ?dup spterer Standards.
-exit           ( flg --) (C)                           F6
                Bedingtes Verlassen eines Wortes, steht fr
                        ... IF ;s ENDIF ...
                Optimiert zu {0=exit}, wenn {0=} vorangestellt ist; darf ohne
                zustzliche Vorkehrungen nicht auf {local}-Deklarationen folgen.
-find           ( -FIND name -- pfa cbyte flg | 0 )
                flg =/= 0 wenn {name} gefunden wurde, cbyte ist dann das Count-
                byte einschlielich der Flags zum Worttypen. Ist dem {find}
                spterer Standards insofern berlegen, als es neben dem Prece-
                dence-Bit (fr den "immediate"-Status) auch die anderen Kopf-
                daten verfgbar macht:
                        -find {name}    0= 0 ?error     \ prft Vorhandensein
                                        dup $40 and .   \ Precedence-Bit
                                        dup $20 and .   \ Smudge-Bit (Null)
                                            $1f and .   \ Lnge des Namen
                Bei geeignetem Header-Aufbau und entsprechendem Verfahren zur
                Wortsuche ist auch das hchstwertige Bit als Flag verwendbar.
-forget         ( -FORGET name -- )                     F6
                {forget} ohne Fehlerabbruch bei nicht vorhandenm Wort {name}.
                Das Wort wird nur im CONTEXT-Vocabular gesucht.
-leave          ( flg -- ) (C)
                NUR innerhalb DO.. ..LOOP / DO.. ..+LOOP zum Verlassen der
                Schleife bei flg =/= 0 mit nchstem Erreichen des Endpunktes.
-loc            ( -LOC name -- ptr ) (I)                F6
                Liefert den ptr einer Localen Variablen, welche mit einem
                einzelnen Buchstaben {name} zu bezeichnen ist.
-lword          ( -LWORD name -- flg )                  F6S
                flg =/= 0 wenn {name} das mit L-LOAD zu compilierende Wort ist.
-off            ( ptr -- )                              F6      "minus off"
                Schreibt eine "negative Null" nach ptr. Die $-8000 stellt im F6
                die niedrigste 4th-Adresse dar und ist bei der Suche in Vocabu-
                laren die Abbruchmarke.
-print          ( ptr --)                               F6
                Ersetzt
                        ( ptr ) count -dup 0= IF count ENDIF type ( -- )
-rot            ( n1 n2 n3 -- n3 n1 n2 )                F79
-scan           ( ptr1 n2 c3 -- ptr1 n4 )
                Im Bereich ab ptr1 der Lnge n2 vom Ende her nach demm Byte c3
                suchen, n4 als Bytenummer des gefundenen Zeichens zurckgeben:
                n4 zhlt ab 1, ist 0, wenn c3 nicht gefunden wurde.
-trailing       ( ptr count1 -- ptr count2 )
                <bl>s des String der Lnge count1 bei ptr vom Ende her kappen.
                Hierdurch wird nur der Zhler im Stack verndert - was fr die
                Ausgabe gengt; die Ursprungsdaten bleiben unberhrt.
-window         ( c1 -- flg )                           F6
                flg = 1 bei eigenem Fensterkanal ohne PIF, flg = 49 mit PIF.
-0              ( -- $8000 )                            F6
                Cons, "negative Null", fr alle vocabularbezogenen Aktionen,
                oder wo sonst der niedrigst mgliche Forth-Ptr bentigt wird.
-1              ( -- -1 )
                Integer- rsp. fp-Constante
-2              ( -- fp: -2 )
                NUR fp-Constante, darum Vorsicht bei {fp} in der Suchordnung!
                Eine andersartige Zahl compiliert man dann sicherheitshalber
                z.B. mit dem entsprechenden Basis-Paefix.
.(r)            ( count1 count2 -- count1 )             F6
                Justiert eine zu erwartende Stringausgabe der Lnge count1
                rechtsbndig in einem Feld der Lnge MAX( count1,count2 ),
                gezhlt ab der aktuellen Ausgabe-Position. Der Code fr das
                ggf. zum Auffllen benutzte Zeichen steht in {(r)}, kann also
                frei gewhlt werden - er gilt auch fr {.r} etc.
             >> Right-adjust to MAX( count1,count2 ) fieldwidth for an expected
                string output of count1 chars taken from {(r)}.
.cpu            ( -- )          4th-Systemkennung
.line           ( n1 n2 -- ptr count )
                ptr und lnge der Zeile n1 in Seite n2 des gerade benutzten
                Screenfile, holt die Daten ggf. zuerst in den Blockpuffer.
."              ." text"        (I)
                Durch " oder Zeilenende begrenzten Text fr die Ausgabe com-
                pilieren oder sofort nach {out-cons} senden.
.(              .( text)        (I)
                Durch ) oder Zeilenende begrenzten Text sofort hinschreiben,
                d.h. nach {out-cons} senden, auch whrend des Compilierens.
.r              ( n1 n2 -- )
                n1 rechtsbndig in ein Feld mindestens der Gre n2 schreiben.
.s              ( -- )                                  F6S
                Zahlenbasis & Anzahl Datenposten im Stack dezimal, und davon
                bis zu 31 Posten mit ihrem Wert zur aktuellen Basis anzeigen.
/mod            ( n1 n2 -- q3 r4 )
0=/=            ( n1 -- 1 | 0 )                         F6
                Wandelt einen Wert =/= 0 in den definierten Flagwert 1 um.
0max            ( n1 -- +n2 )                           F6
                Gibt bei positivem Wert n1 zurck, sonst Null.
0,              ( -- )
                integer 0 compilieren, entpricht { 0 , }.
0.              ( -- 0 0 )
                Doppeltgenaue Integer-Constante
0<              ( n1 -- flg ) ( f1 -- flg )
0=              ( n1 -- flg ) ( f1 -- flg )
0>              ( n1 -- flg ) ( f1 -- flg )
0 1 2 3 -1      ( -- cons ) ( -- fp-cons )
10*             ( n1 -- n1*10 )                         F6
16*             ( n1 -- n1*16 )                         F6
1abs            ( n1 -- n1 | ~n1 )                      F6
                Betrag einer als Einercomplement interpretierten Zahl.
                Dient auch der Prfung einer 32-Bit-Zahl auf 16-Bit-Wert:
                        : d->s 1abs abort" Betrag > 32K" ;
                        ( dn )  d->s  ( nn | abort )
1off            ( ptr -- )                              F6
                Byte an der Stelle ptr auf 0 setzen.
1on             ( ptr -- )                              F6
                Bit 0 des Byte an der Stelle ptr auf 1 setzen.
                Kann einen {defer}red-Vector deaktivieren; und mit
                        ( ptr ) 1+ dup 1on 1 toggle ( -- )
                lt er sich unabhngig vom alten Zustand freigeben.
1+              ( n1 -- n1+1 )
1-              ( n1 -- n1-1 )
2!a             ( dn1 ptr -- )                          F6
                Dopelte Integer an geradzahlige Adresse bringen.
             >> Store double to even aligned address.
2!l             ( dn1 dadr -- )                         F6
                Doppelte Integer an wirkliche Speicheradresse.
             >> Store double integer to true memory address.
2+!l            ( dn dadr -- )                          F6
                Doppelte Integer in den Speicher an Adresse dadr addieren.
2+!             ( dn ptr -- )                           F6
                Doppelte Integer in den Forth-Speicher bei ptr addieren.
2>rr            ( dn -- dn , rp: dn )                   F6 LR
                Doppelte Integer in den Returnstack copieren.
2>r             ( dn -- , rp: dn )
                Doppelte Integer in den Returnstack verlagern.
2@a             ( ptr -- dn )                           F6
                Doppelte Integer von geradzahliger Forth-Adresse ptr holen.
             >> Fetch double from even aligned 4th-ptr.
2@l             ( dadr -- dn )
                Doppelte Integer von wirklicher Speicheradresse
             >> Double from true memory address.
2and            ( dn1 dn2 -- dn1&dn2 )                  F6
2base+          ( dptr -- daddr )                       F6
                Doppelte Integer als Forth-Ptr wird wirkliche Speicheradresse.
2cons+          use: ( dn ) 2CONS+ name                 8.18
                exec: ( d1 -- d2 ) : d2:=d1+dn
2constant       use: ( dn ) 2CONSTANT name
                nderbar mit:
                        ( dn ) IS twoconsname
2drop           ( n1 n2 -- )
2dup            ( n1 n2 -- n1 n2 n1 n2 )
2off            ( ptr -- )                              F6
                32-Bit-Feld bei ptr lschen
2over           ( n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2 )
2over-          ( d1 d2 -- d1 d3 )                      F6 LR
                Zusammenziehung von { 2over d- }, liefert d3 = d2 - d1#
2pick           ( d1.. dm .. dn nm -- d1 .. dm .. dn dm )
                nm-ten Posten zum t.o.s. copieren.
2roll           ( d1.. dm .. dn +nm -- d1 .. dm+1 .. dn dm )
                nm-ten Posten zum t.o.s. und nm Posten eins hochrcken.
                ( d1.. dm .. dn -nm -- d1 .. dn dm .. dn-1 dm )
                Posten dn abheben und an Position nm einfgen.
2rot            ( n1 n2 n3 n4 n5 n6 -- n3 n4 n5 n6 n1 n2 )
2r>             ( rp: dn -- dn )
                Doppelte Integer vom Returnstack abheben.
2sdrop          ( n1 n2 n3 n4 -- n2 n4 )                F6
2sgn            ( dn1 -- 1 | 0 | -1 )                   F6
2swap           ( n1 n2 n3 n4 -- n3 n4 n1 n2 ) ( f1 f2 f3 f4 -- f3 f4 f1 f2 )
2variable       ( dn 2VARIABLE name )
2within         ( d1 d2 d3 -- d4 )                      F6
                d4 als d1, auf den Bereich d2 bis d3 begrenzt.
             >> Adjust dn1 to d4 such that d4 fits in the interval [d2,d3].
2within?        ( d1 d2 d3 -- flg )                     F83
                flg = 1 wenn d2 <= d1 < d3 (obere Grenze zhlt nicht mit).
2!              ( dn ptr -- )
2*              ( n1 -- n1*2 ) signed ( f1 -- f1*2 )
                vorzeichenbehaftete schnelle Verdopplung, fp mit -2 in {dpl}.
2+              ( n1 -- n1+2 )                          F6
2-              ( n1 -- n1-2 )                          F6
2/              ( n1 -- n1/2 ) signed ( f1 -- f1*2 )
                vorzeichenbehaftete schnelle Halbierung, fp mit -2 in {dpl}.
2@              ( ptr -- dn )
2@!             ( ptr1 ptr2 -- )                        F6
                32-Bit-Inhalt von ptr1 nach ptr2 bertragen.
2r              ( -- dn )
                Zwei Returnstackposten in den Datenstack copieren.
3*              ( n1 -- n1*3 )                          F6
3+              ( n1 -- n1+3 )                          F6
3-              ( n1 -- n1-3 )                          F6
4!l             ( qn dadr -- )                          F6
                Vierfachgenaue Integer an wirklicher Speicheradresse ablegen.
             >> Store quad integer to true memory address.
4@              ( ptr -- q1 )                           F6
                Vierfache Integer von ptr holen.
4@!             ( ptr1 ptr2 -- )                        F6
                Vier Zellen Inhalt von ptr1 nach ptr2 bertragen.
             >> Move quad contents from ptr1 to ptr2.
4@l             ( dadr -- qn )                          F6
4drop           ( n1 n2 n3 n4 -- )
4dup            ( n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2 n3 n4 )       F6
4pick           ( q1 .. qm .. qn nm -- q1 .. qm .. qn qm )       F6
                Damit z.B. ersatzweise:
                        : 4over 1 4pick ;
4roll           ( q1 .. qm .. qn +nm -- q1 .. qm+1 .. qn qm )    F6
                ( q1 .. qm .. qn -nm -- q1 .. qn qm .. qn-1 )
                Hiermit auch:
                        : -4rot -2 4roll ;
4rot            ( q1 q2 q3 -- q2 q3 q1 )                F6
4swap           ( q1 q2 -- q2 q1 )                      F6
4th-err         ( -- flg )                              F6
4th-id          ( -- did )                              F6
                QDOS-Job-ID des aufrufenden F6-Jobs
4!              ( q1 ptr -- )                           F6
4*              ( n1 -- n1*4 ) schnelle Multiplikation  F6
4+              ( n1 -- n1+4 ) schnelle Addition        F6
4-              ( n1 -- n1-4 ) schnelle Subtraktion     F6
4/              ( n1 -- n1/4 ) signed                   F6
5*              ( n1 -- n1*5 ) schnelle Multiplikation  F6
5+              ( n1 -- n1+5 )          Addition        F6
5-              ( n1 -- n1-5 )                          F6
6*              ( n1 -- n1*6 ) schnelle Multiplikation  F6
6+              ( n1 -- n1+6 )          Addition        F6
6-              ( n1 -- n1-6 )                          F6
7+              ( n1 -- n1+7 )                          F6
7-              ( n1 -- n1-7 )                          F6
8+              ( n1 -- n1+8 )                          F6
8-              ( n1 -- n1-8 )                          F6
:               ( -- ) ( : name -- )
                Der "Colon-Compiler" leitet eine Wortdefinition ein, legt den
                entsprechenden Header an, trgt ihn in das {current}-Vocabular
                ein und sperrt ihn zunchst fr die Wortsuche. {context} wird
                auf das {current}-Vocabular gesetzt, das bisherige zweite Voca-
                bular fllt aus der Suchfolge, falls es nicht mit {also} vorher
                in den sicheren Bereich des Vocabularstacks geschoben wurde.
;               ( -- ) oder ( sys: ptr 9 -- ) mit {local}s  (C)
                Abschlu einer Colondefinition mit Kontrolle der Stackbilanz
                und anschlieender Freigabe des Wortes fr die Vocabularsuche.
                Compiliert {;s} und ggf. davor die {local}-Freigabe.
                Optimierung durch
                {drop;} statt {;s}, falls dem {;} ein {drop} vorangestellt ist.
                Automatische Optimierung durch Compilieren eines Sprunges direkt
                in das letzte Wort, falls dies eine Colon-Definition ist.
                8.18: Zustzlich Zusammenfassung von
                { rdrop ; }             zu      {r;}    (dummy-namen)
                { rdrop rdrop ; }               {rr;}
                { 2drop ; }                     {dd;}
;code           ( -- ptr ) (C) ( -- )
                Abschlu der Bildungsvorschrift eines Definitionswortes und
                bergang in den lo-level-codierten Ausfhrungsteil. Beendet
                den Compilezustand, gibt den Wortheader fr {-find} frei und
                stellt {context} auf das Assemblervocabular ein. Einsetzbar
                wie {;does>} mit dem einzigen Unterschied, da die Ausfhrungs-
                vorschrift in lo-level-Code folgen mu. Da es keine weiteren
                Schutzmanahmen gibt, ist strikt auf ordentlichen Wortabschlu
                zu achten, z.B. durch Sprung nach [next].
;does>          ( -- ptr ) (C)(D) ( -- )                F6 C1 lmi F83+
                Das DOES> des F83 etc., nach CREATE zu verwenden. Mit {create}
                erzeugte Definitionen werden etwas schneller ausgefhrt und um
                eine Speicherzelle krzer angelegt. Jene wird vom DOES> des F83
                nicht mehr bentigt, da der Aufrufteil in die Rumtime-Definition
                selbst verlagert wurde, und die modifizierte cfa dorthin weist.
                {;does>} kann konfliktfrei mit jedem Wort gepaart werden, das
                einen Wortheader anlegt, soda einmal definierte Bildungsvor-
                schriften in darauf aufbauende neue Definitionsworte bernommen
                werden knnen. Man konstruiert mit {;does>} also allgemein
                        : eigenerName
                                CREATE Bildungsanweisung
                                ;DOES> ausfhrungsanweisung ;
                Wie auch bei der Konstruktion aus <BUILDS .. DOES> lt sich so
                ein Definitionswort als namensgebendes Wort, hier statt CREATE,
                in neuen Definitionsworten verwenden.
                Der cfa-Inhalt eines mit einer {;does>}-Definition erzeugten
                Wortes ist fr die sptere Wortanalyse bestimmbar:
                        0 constant n-cfa
                        : name CREATE ... ;DOES> [ here 4- is n-cfa ] ... ;
                Eine Besonderheit im F6 - die aber auch anderen Systemen nach-
                trglich mitgegeben werden kann - ist die "Vererbbarkeit" auch
                der Ausfhrungsanweisung. Dazu bedarf es zustzlicher Manahmen
                mit z.B. dem Wort {<with}, wie sie dort beschrieben sind.
                {;does>} ist ein deferred Wort, das vom System bedient wird,
                es sollte von Programmen auf keinen Fall verndert werden.
                Worte, die mit {;does>} gebildet wurden, knnen von {c-load} nur
                wie 'normale' 4th-Worte behandelt werden, die Anpassung innerer
                Aufrufe an vernderte Adressenlage ist im Gegensatz zu den Defi-
                nitionen mit dem standardmigen {does>} dort nicht mglich.
                {;does} enthlt auch einen {unsmudge}-Aufruf, soda danach das
                gerade im Aufbau befindliche Wort bereits gefunden werden kann.
;cdoes>         ( -- n1 ) (C) ( -- )                    F6
                wie ;DOES> jedoch bereits mit dem in ptr gelesenen Integerwert;
                auch hiernach ist das neue Definitionswort bereits auffindbar.
;s              ( -- )
                Zum Verlassen eines hi-level-Wortes (einer Colon-Definition)
                und in Screenfiles zum (vorzeitigen) Beenden des Ladevorganges.
                Darf ohne zustzliche Vorkehrungen nicht nach einer {local}-
                Deklaration stehen.
<               ( n1 n2 -- flg ) ( f1 f2 -- flg )
<builds         ( -- ) (C)
                Leitet den definierenden Teil eines Definitionswortes ein.
                An einem einfachen Beispiel aus dem SBasic erklrt:
                        LET cons% = 123
                Das Bildungsgesetz legt hier fest, da ein Name eingerichtet
                und irgendwie auffindbar gespeichert wird, soda daraus spter
                die ebenfalls eingerichtete Speicherstelle eindeutig auffind-
                bar wird. Die Ausfhrungsvorschrift legt fest, was mit dem
                Inhalt der identifizierten Speicherstelle geschehen soll, hier
                in einer Form, die die dort liegende Zahl verfgbar macht.
                Dasselbe sieht im Forth ganz hnlich aus:
                        123 CONSTANT cons%
                CONSTANT ist eine elementare Procedur, die im Processorcode
                definiert ist, und etwa so nachgebildet werden kann:
                        : CONSTANT <builds , does> @ ;
                Darin erzeugt <BUILDS den auffindbaren Namen, das Komma legt
                die Speicherstelle an und trgt den Wert ein; spter beim Auf-
                ruf holt @ die gespeicherte Zahl und bringt sie in den Stack.
<#              ( dn -- dn )
                Vorbereitung zur Umwandlung einer Zahl in Zifferndarstellung.
                Das System stellt die Ziffernstrings von { hld @ } ausgehend zu
                niedrigen Adressen hin zusammen. {hld} wird dabei anfangs durch
                {<#} auf {pad} eingestellt. Setzt man {hld 2-} als lange Integer
                unmittelbar danach auf eine andere 4th-Adresse um, sowie den
                ebenfalls doppeltgroen Posten {hld 2+} auf denselben Wert,
                so ergibt sich eine Mglichkeit, die Ziffern ohne Umspeichern
                sofort an einem sicheren Ort abzulegen.
                In "forth_scr" ist dazu mit {t.} ein Beispiel angegeben.
=               ( n1 n2 -- flg ) ( f1 f2 -- flg )
=/=             ( n1 n2 -- flg )                        F6      "not equal"
                Erzeugt Flagwert 0 oder 1; wird einfach nur ein von Null ver-
                schiedener Wert bentigt, gengt das etwas schnellere {-}.
>               ( n1 n2 -- flg ) ( f1 f2 -- flg )
>chan<          ( c1 c2 -- )                            F6
                Vertauschen der Tabellenpltze zweier offener(!) Kanle
>fount          ( n1 c2 -- )                            F6 bentigt dvs/IO2
                F6-Fensterkanal c1 den mit n1 codierten Zeichensatz zuweisen.
                Codie fr n1 s. {atne}, {bblu}, {hisc}, {losc}, u. -23: latin-1.
>loc            ( n1 -- )                               F6 (vorlufig)
                n1 Zellen "dynamische" Zuweisung eines localen Speicherblocks;
                richtet einen localen Speicherbereich von n1 Zellen ein, dessen
                Gre auch erst whrend der Programmausfhrung festgelegt werden
                mag, da die betr. Zahl im Stack bergeben wird. Der Aufruf kann
                mehrmals innerhalb eines Wortes stehen. Dabei dann zu beachten,
                da die Indexadressierung "mitwandert", alte Indices also um die
                entsprechende Postengre weitergezhlt gelten. Zum Compilieren
                der Local-Constanten-Adressierung mu whrend des Compilevor-
                ganges wenigstens irgendein Datenposten in den Stack gebracht
                und am Wortende wieder fortgenommen werden. Eigene oder Locale
                Variable bergeordneter Worte bleiben unverndert adressierbar,
                allein die Indices sind dafr entsprechend weiterzuzhlen:
                    \ a  c  e  g  i  k  m  o  q  s  u  w  y
                    \ 0  4  8  12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72
                    \ A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S
                Das Verfahren ist beim Stichwort {local} nher beschrieben.
>resolve        ( sys1 -- )                             C1
                Auflsen einer Vorwrtsreferenz nach aktuellem {here}.
>rr             ( n1 -- n1 rp: n1 )                     LR
                n1 in den Returnstack copieren.
>|<             ( n1 -- n2 n3 )                         F6
                n1 in Byte-Werte n2 (lsb) und n3 (msb) aufteilen. Ersetzt:
                        ( n1 ) 256 /mod ( n2 n3 )
><              ( n1 -- n2 )                            C1 lmi
                Bytes vertauschen
             >> swap bytes
>r              ( n1 -- rp: n1 ) ( f1 -- rp: f1 )
?comp           ( -- )
                abort, wenn nicht Compilezustand.
?csp            ( -- )
                abort, wenn die Stackbilanz nicht stimmt, d.h. der Wert in {csp}
                nicht mit dem aktuellen t.o.s. z.b. aus {sp@} bereinstimmt.
?error          ( flg n1 -- )
                Bei flg =/= 0 abort und die mit n1 codierte Fehlermeldung.
?esc            ( -- flg )                              F6
                flg = 1, wenn <esc> bettigt wurde, wartet nach Bettigen der
                <space>-Taste auf erneuten Tastendruck, sonst ohne Wartezeit.
?exec           ( -- )
                abort, wenn im Compilezustand.
?key            ( -- 0 | $8000 | +code | -code )        (F6)
                Wird standardgem ausgefhrt, liefert jedoch zustzlich bei
                ALT-Tasten den negativen Code, und $8000 bei {in-cons}-Fehler.
?loading        ( -- )
                abort, wenn nicht gerade von einem File geladen wird,
                Fehlersituation signalisiert durch 0 oder -ve Werte in {blk}.
?locals         ( -- n1 n2 )                            8.18
                n1 Anzahl Bytes und n2 Anzahl Blcke Localer Speicherbereiche.
?pairs          ( n1 n2 -- )
                abort, wenn n1 =/= n2.
?stack          ( -- )
                abort bei Grenzenberlauf des Datenstacks.
?terminal       ( -- flg )
                flg =/= 0 wenn ein Zeichen in der Eingabe bereitliegt.
@               ( ptr -- n1 ) ( ptr -- f1 )
                Inhalt der Speicherzelle ptr zum Stack holen.
@!              ( ptr1 ptr2 -- )        auch fp         F6
                Posten von ptr1 am Ort ptr2 eintragen.
                Austausch zweier Variabler:
                        ( ptr1 ptr2 ) 2dup @ >r >r @! 2r> ! ( -- )
@a              ( ptr -- n1 )                           F6
                n1 von geradzahliger 4th-Adresse lesen.
@l              ( dadr -- n1 ) ( dadr -- f1 )           F6
                Integer rsp. fp-Zahl von wirklicher Speicheradresse holen.
             >> Fetch single integer/fp from true memory address.
* A
a/drv           ( -- d1 )                               F6
                2Cons, Anzahl Zuweisungseinheiten im Datentrger
a/fre           ( -- d1 )                               F6
                2Cons, Anzahl freie Zuweisungseinheiten
a>h             ( c1 -- c2 )                            H4
                Einen Buchstaben als Ziffer interpretiert, sofern mglich,
                in seinen sedezimalen Zahlenwert umwandeln, liefert sonst -1.
abort"          ( flg ABORT" text" -- )
                abort und Ausgabe des mit " begrenzten Textes wenn flg =/= 0.
abort           ( -- )
abs             ( n1 -- +n2 )
                Betrag bilden, gibt n2 = 0 bei n1 = $8000 zurck.
accept          ( ptr n1 -- n2 )                        8.18 ANS
                Wie EXPECT, jedoch mit Rckgbe der empfangenen Anzahl Zeichen
                einschlielich der abschlieenden <nul>.
acl             ( -- ptr ) user-Vari                    8.18
acp             ( -- ptr ) user-vari                    8.18
again           ( -- ) (C) ( sys: ptr 1 -- )
                Abschlu einer endlosen Schleife.
align           ( n1 n2 -- n3 )                         F6
                Anzahl n2 niederwertige bits in n1 lschen.
             >> Clear n2 l.s. bits of n1
allot           ( n1 -- )
                n1 Bytes ab {here} im Dictionary reservieren.
and             ( n1 n2 -- n3 )
                Bktweise n1 && n2.
and!            ( n1 ptr -- )                           F6
                and-Verknpfung n1 mit dem Speicherinhalt bei ptr. Z.B. wird
                mit { -2 ptr and! } die Zelle bei ptr geradzahlig justiert.
anew            use: ANEW name                          8.18
                FORGET {name} und danach Anlegen eines NOOP-Wortes {name}.
ascii           ( -- c1 ) (I)                           (F83) F6S
                im F6 durch das pseudo-Zahlenprfix "{" ausgefhrt; im Screen-
                file angegeben, um Compatibilittsprobeleme mit F83 zu umgehen.
associative:    (I)                                     F6 (F83)
                Verwendung eigenstndig als Forth-Wort:
                        associative: {name} n1 n2 n3 .. nn ;
                oder innerhalb einer Colon-Definition:
                        ... associative: n1 n2 n3 .. nn ; ... ;
                Compiliert die Zahlenwerte n1... oder, falls 4th-Worte in die
                Liste eingetragen wurden, deren pfa (wie ' sie liefert). {;}
                beendet die Liste, andere immediate Worte werden ausgefhrt.
                So kann mit Hilfe von {-->} eine solche Liste auf den folgenden
                Screens mit insgesamt bis zu 16383 Posten fortgesetzt werden.
                Zahlen, von denen nicht sicher bekannt ist, ob sie im System als
                Constante definiert sind, werden zweckmig mit Basis-Praefix
                hingeschrieben. Es werden stets einfache Integer eingetragen,
                auch, wenn gerade das fp-Vocabular {context} sein sollte, darauf
                mu also keine Rcksicht genommen werden. In die derzeitige De-
                finition lassen sich Werte von auen bergeben durch:
                        : I, 3 roll , ; immediate
                        ( zahl )
                        associative: name erstezahl .. I, .. letztezahl ;
                Ausfhrung:
                        (nn -- associtative:-liste -- index)
                wo index die ab Null zhlende Nummer des Posten ist, der mit
                dem bergebenen Wert nn bereinstimmt, andernfalls geht die
                Anzahl Posten zurck, dem hchsten Index + 1 entsprechend.
                ndern einer Eintragung:
                        ( index nn ) IS asssociativename
atne            ( -- n1 )                               F6 & IO2
                Cons, Index fr einen mit {>fount} installierbaren Zeichensatz.
                QX/AQ: in den SMSQ-Varianten kann zu Fehlern kommen, insbes. bei
                der Bilddarstellung im Acht-Farben-Modus. Die IO2-Zeichenstze
                sind wegen ihrer 8-Bit-Breite nur in den Minerva-Systemen vllig
                problemlos, anderswo sollten sie vorher ausprobiert werden.
* B
b/alc           ( -- n1 )                               F6
                Cons, Bytes pro Zuweisungseinheit als ganzes Vielfaches der
                Anzahl Bytes pro Sector
b/buf           ( -- n1 )
                Cons, Daten-Bytes pro Blockpuffer.
                Konventionell mu die Anzahl einer Zweierpotenz entsprechen.
b/hed           ( -- n1 )                               F6
                Cons, Bytes Lnge der Fileheader
b/scr           ( -- n1 )
                Cons, Blcke pro (Editor-)Screen.
                Konventionell mu die Anzahl einer Zweierpotenz entsprechen.
b/sec           ( -- n1 )                               F6
                Cons, Bytes pro (Disketten-)Sector.
                Konventionell mu die Anzahl einer Zweierpotenz entsprechen.
base!           ( n1 -- )                               F6
                {base} mit n1 besetzen
base+           ( ptr -- dadr )                         F6
                Forth-ptr in doppeltgenaue wirkliche Speicheradresse umrechnen
base@           ( -- n1 )                               F6
                {base} lesen
base            ( -- ptr )
                User-Vari fr die Zahlenbasis im Forth-System
basic           ( ptr -- flg )                          F6
                ptr zeigt auf das count-Wort eines im SBasic (Job 0) bekannten
                Namen. Reprsentiert der eine residente Procedur, die ohne
                Parameter benutzt werden kann, so wird diese ausgefhrt. In
                allen anderen Fllen kann mit {a1l@} der Wertepointer, falls
                ein Variablenname angegeben war, sonst die Ausfhrungsadresse
                einer residenten Funktion oder die Zeilennummer einer SBasic-
                Definition gelesen werden. Stets liefert {a1l@} eine auf die
                Referenzadresse des F6 bezogene Zahl, die wirkliche Adresse
                erhlt man daraus mit {2base+}.
basicv"         ( BASICV" variname" -- dadr 0 | 0. tf ) F6S
                Holt den Werte-Pointer einer nicht DIMensionierten, sonst
                aber beliebigen SBasic-Variablen (des Jobs 0). Z.B:
                        basicv" e$"
                        0= IF 1 m+ count-l type-l
                           ELSE 2drop ENDIF
                Die ntige Vorsicht vorausgesetzt, knnen die SBasic-Variablen
                vom F6 auch verndert werden - bei Strings mu die Lnge im
                SBasic erhalten bleiben!:
                        basicv" e$" dup ?error
                                1 m+ count-l
                                " .hpr lt gren" count-w
                                rot min swap base+ rot cmove-l
bblu            ( -- n1 )                               F6
                Cons, Codierung fr einen Zeichensatz - s. {>fount}.
bclr            ( dn1 n2 -- dn3 )                       F6
                Mit n2 angegebene Bitnummer in dn1 lschen.
begin           ( -- ) (C) ( -- sys: ptr 1 )
                leitet eine einfache Wiederhol-Schleife ein.
bell            ( -- )                                  F6
                Bimmelt
bfclr           ( dadr1 ud2 -- )                        F6
                Mit ud angegebene Bitnummer in Bit-Feld ab dadr lschen.
                {L<I} liefert ggf. den bis dahin dort gltigen Bitwert.
bfset           ( dadr1 ud2 -- dn3 )
                Mit ud2 angegebene Bitnummer im Bitfeld ab dadr setzen.
                {L<I} liefert ggf. den bis dahin dort gltigen Bitwert.
bftst           ( dadr ud -- flg )                      F6
                Test Bit#(ud) im Feld ab Adresse dadr. flg = Bit-Wert 0 oder 1;
                dadr und ud vorzeichenlose doppelte Integer (2^31).
            >>> Test bit#(ud) in the bit field beginning in memory
blanks          ( ptr n1 -- )
                Anzahl n1 <bl>s nach ptr in den 4th-Speicher eintragen.
blk@            ( -- n1 )
                Inhalt der User-Variablen {blk}
block           ( n1 -- ptr ) (D)
blk             ( -- ptr ) User-Vari
                Aktuelle Screenfile-Blocknummer, Null zur t.i.b.-Eingabe.
bounds          ( n1 n2 -- n3 n1 )
                Legt n3 so an, da eine DO..LOOP von n1 ausgehend bis n3-1
                die Anzahl n2 Durchgnge zhlt, entspricht der Sequenz
                        over + swap
break           ( c1 -- )                               H4
                Erwartet den Tastencode zum bedingungslosen Programm-Abbruch.
                Dieselbe Taste zusammen mit ALT lst den Kaltstart aus - {cold}.
buffer          ( n1 -- ptr )
                Puffer fr den Block n1 zur Verfgung stellen.
bl              ( -- c1 )
                Cons, Zeichencode fr Leerzeichen
bs              ( -- )
                Position im Ausgabefenster um ein Zeichen zurcksetzen.
* C
c!l             ( n1 dadr -- )                          C1
                Byte n1 an wirklicher Speicheradresse dadr ablegen.
c->s            ( c1 -- n2 )
                Byte c1 vorzeichenbehaftet in Integer n2 erweitern.
c-find          ( ptr1 -- ptr2 c1 tf | ff )
                Wie {-find}, durchsucht jedoch nur die Wortkette, deren jngste
                nfa an der Stelle ptr1 eingetragen ist.
c/scr           ( -- n1 )
                Cons, Bytes pro (Editor-)Screen
c/l             ( -- n1 )
                Cons, Lnge einer (Editor-)Zeile
c@l             ( dadr -- n1 )                          C1
                Byte n1 von wirklicher Speicheradresse dadr holen.
cache-off       ( -- flg )                              QX IO2
                Ruft die SMSQ-Trap sms.cach zum Abschalten der Cache auf.
cache-on        ( -- flg )                              QX
                Entspr. cache-off, Cache Einschalten.
cache           ( -- flg )                              QX
                Liefert den aktuellen Einschalt-Zustand der Processorcache.
case:           (I)                                     H4
                Verwendung wie {associative:} eigenstndig oder innerhalb eines
                Hi-Level-Wortes. Compiliert cfa-s der angegebenen Forth-Worte
                solange, bis ein {;} angetroffen wird. Zahlen werden mit ihrem
                wirklichen Wert eingetragen.
             >> compiles:
                the 4th-words cfa or the number values if the word wasn't found
                in context and successfully was converted to a single integer.
                executes:
                        (index -- executing | nn)
                the indexed cfa will be executed if the list was built of all
                4th-words. If there was at least one number given when defining
                it will be handled as a list of integers to be pushed to the
                datastack corresponding to the indexed position, instead. Case
                numbers will then be returned by their true value and 4th-words
                by their cfa, ready to {execute}.
case?           ( n1 n2 -- | n1 ) (C)                  (!)
                        ... case? ... else case? ... endif endif ...
cc-4th          ( c1 -- n1 | exec )                     F83     8.16 => hidden
                case:-Liste zur Ausfhrung von Steuer-Codes.
cc4th           ( -- ptr j)                             (F83)   8.16 => hidden
                User-Vari mit ptr zur aktuellen case:-Liste fr die Ausfhrung
                von Control-Codes durch {ctrl}, initial mit {cc-4th} besetzt.
cfa             ( n1 -- n2 )
                Liefert in n2 die cfa, wenn n1 die pfa eines Wortes ist.
ch-id           ( c1 -- did | -1. )                     (LR)
                Liefert die QDOS-Kanal-ID did, wenn mit c1 die Nummer eines
                im F6 offenen Kanals bergeben wurde, sonst -1.
ch-num          ( did -- c1 | -1 )
                Liefert die hchste F6-Kanalnummer, in der der im F6 offene
                QDOS-Kanal did verzeichnet ist, sonst -1.
chp             ( c1 -- ptr )                           LR
                Speicherplatz der zu c1 gehrigen Kanalnummer, c1 von 0 bis 15,
clone-4th       ( -- )
                Aktive eigenstndige Copie des aufrufenden-F6-Jobs erzeugen.
close           ( c1 -- )                               LR
                Kanal c1 schlieen, keine Fehleraktion.
cls             ( -- )
                Mit {out-cons} bezeichnetes Bildschirmfenster lschen.
cmove-l         ( dadr1 dadr2 n3 -- )                   C1
cmove           ( ptr1 ptr2 n3 -- )
                Speicherbereich der Gre +n3 von Forth-ptr1 nach ptr2 nicht-
                berschreibend bertragen.
cmc             ( -- ptr )
                Cons, als Wort-Zhler bei der Code-Optimierung.
code+           ( n1 -- dn2 )
                wandelt den Abstand n1 zur Codebasis des F6-Jobs in wirkliche
                Speicheradresse um.
cold            ( -- )
                Nach {empty}.
compile         ( -- )
cons+           ( n1 CONS+ name )         => (  n2 name -- n1+n2 )
                Wert mit IS nderbar.   (8.18)
consm+          ( n1 CONS+ name )         => ( dn2 name -- n1+dn2 )
                Wet mit IS nderbar.    (8.18)
constant        ( n1 | f1 CONSTANT name ) => ( name -- n1 | f1 )
                fp-Constante setzen beim Aufruf {dpl} auf -2.
                nderung mglich mit:
                        ( nn | fn ) IS constantname
context         ( -- ptr )
                User-Vari, ptr zum ersten Such-Vocabular.
                Wird durch Nennung eines Vocabularnamen besetzt.
count-l         ( adr1 -- adr2 n3 )
                liefert den Inhalt der Zelle adr1 und die um eins weitergezhlte
                Adresse adr2.
count-w         ( ptr1 -- ptr2 n3 )
                z.b. 16-Bit-Zhler eines QDOS-String, ersetzt die Folge
                        2+ dup 2- @
count           ( ptr1 -- ptr2 c3 )
                liefert z.B. das Zhlerbyte von Forth-Strings; steht fr
                        1+ dup 1- c@
create          ( -- ) ( CREATE name )
                Legt einen Primitive-Wortheader an und leitet Definitionsworte
                im F79/F83-Stil ein, wozu es im F6 mit {;does>} gepaart wird.
csp!            ( -- )
                Restauriert den Stackpointer aus der Variablen {csp}.
csp             ( -- ptr )
                User-Vari zur Stack-Kontrolle beim Compilieren.
ctrl            ( n1...nx -- m1...mx flg | exec 0 )     / F83
                Ausfhrung eines Steuercodes mit unterschiedlichen Parametern.
current         ( -- ptr )
                User-Vari, enthlt den ptr zum aktuellen Definitionsvocabular.
c!              ( n1 ptr -- )
                Byte n1 an Forth-Adresse ptr eintragen.
c,              ( n1 -- )
                Byte n1 ins Dictionary eintragen, Dictionary-Ptr eins weiter.
c@              ( ptr -- n1 )
                Byte von Forth-Adresse lesen.
cr              ( -- ) (D)
                Nchsten Zeilenanfang aufsuchen.
* D
d$.             ( dn -- )                               F6
                Doppelte Integer sedezimal hinschreiben.
d+-             ( dn1 n2 -- dn3 )
                dn1 mit dem der Multiplikation dn1*n2 entsprechenden Vorzeichen
                versehen, d.h. dn1 negieren, wenn n2 negativ ist.
d->q            ( dn -- qn )  signed                    F6
                Vorzeichenbehaftetet Doppelte in Vierfache Integer wandeln.
d.r             ( dn1 n2 -- )
                dn1 in ein Feld der lnge n2 rechtsbndig hinschreiben.
d->s            ( d1 -- n1 | abort )                   (F6S)
                lt sich einschlielich berlaufkontrolle z.B. nachbilden:
                        : d->s 1abs -18 ?error ;
                sonst gengt einfach nur {drop}.
d/num           ( -- n1 )                               F6
                Cons, Devicenummer. Wie alle auf die Massenspeicher bezogenen
                Constanten wird sie nicht durch das System aktualisiert. Dies
                mu bei Bedarf z.B. nach dem Aufruf {xinf} mit Eintragung der
                daraus gewonnenen Daten geschehen (s. Beispiel in "fig_scr").
d/wpt           ( -- n1 )                               F6
                Cons, fr =/= 0 bei geschaltetem Schreibschutz.
d0<             ( dn -- flg )
d0=             ( dn -- flg )
d1+             ( dn -- dn+1 )
d2+     d4+                     wie d1+                 F6
d1-             ( dn -- dn+1 )
d2-     d4-                     wie d1-                 F6
                Mit Hilfe der CFA knnen weitere gleichartige Operatoren nach
                folgendem Muster definiert werden:
                        create d16- -2 allot ' d2+ cfa @ , -16 , unsmudge
d2*             ( ud -- ud*2 )
d2/             ( dn -- dn/2 )
d4*             ( ud -- ud*4 )                          F6
d4/             ( dn -- dn/4 )                          F6
d>f             ( dn -- fp )                            F6
dabs            ( dn -- +dn )
                Betrag bilden; gibt $8000.0000 als 0 zurck.
date$           ( -- ptr count )                        F6 QDOS
                Legt den Datumsstring zur weiteren Bearbeitung rsp. fr die
                Ausgabe mit {type} bereit.
             >> SBasic's DATE$ ready to {type}
day$            ( -- ptr count )                        F6 QDOS
db-on           ( -- n1 )                               F6
                Cons, Flag fr die debug- und Einzelschritt-Einrichtung, deren
                aktive Teile aus "forth_scr" geladen werden, z.B. durch
                        L-LOAD debugger flp1_forth_scr
                Mit einem Wert =/= 0 vor dem Compilieren wird der Einzelschritt-
                betrieb fr neue Worte oder den flchtigen Compilezustand vorbe-
                reitet. Nachdem die ergnzenden Debugger-Worte geladen wurden,
                knnen mit Werten von 1 bis 4 in {db-on} die prparierten Worte
                entsprechend abgearbeitet werden. Man ruft sie wie gewohnt auf
                und hat folgende zustzliche Tastenfunktionen:
                 <cursor hoch>
                        berspringt einen Schritt,
                 <cursor runter>
                        entfernt den oberen Stackposten,
                 <ctrl/esc>
                        schaltet zwischen Normal- und Debug-Betrieb um,
                 <esc>
                        suspendiert den Debugger und bricht ab; ggf. bergang
                        nach {quit}, wenn der Processor im Supervisor-Modus war.
                 <jede andere taste>
                        lst den nchsten Schritt aus.
                Negative Werte in {db-on} suspendieren den Debug-Betrieb, nicht
                aber das entsprechende Compilieren, und belassen die Tastatur-
                abfrage aktiv. Fr Worte wie {r+}, die auf die folgende WA zu-
                greifen, mu {db-on} zumindest befristet Null gesetzt werden,
                wie folgendes Beispiel klarmacht:
                        : name1 ... r+ execute ... ;
                        : name2 ... name1 bell ... ;
                Ruft man nun {name2} auf, fhrt dies u.a. auch {name1} aus, in
                dessen Rahmen die nchste WA ausgefhrt wird. Dies ist oft recht
                ntzlich, wenn ein allgemeiner Aufruf fr verschiedene Zwecke
                eingesetzt werden soll. Dem Debugger bleibt dies jedoch verbor-
                gen, und er fgt nach {name1} seine Arbeits-WA ein, die dann
                von {r+} flschlich gelesen wird, was zu Schden fhren kann.
                        : name2 ... [ db-on 0 is db-on ] name1 bell [ is db-on ]
                vermeidet solche Irrlufer. Mehr in "F6CHG_txt" u. "FORTH_txt".
dds             ( -- ptr )                              F6
                User-Vari, ptr zum hi-level-Einsprung in den Ausfhrungsteil des
                jngsten mit {;does>} gebauten Definitionswortes. Dient der
                Weitergabe der Ausfhrungsvorschrift neuer Definitionsworte.
ddup            ( n1 -- n1 n1 n1 )                      F6
decimal         ( -- )
default-is      ( name | -- )                           F6
                Einen Vector auf die Vorgabe-Aktion zurckstellen; ist auf
                weitere Worte anwendbar, die mit IS besetzt werden knnen
                und einen 16-Bit Datenposten beliebiger Art verarbeiten.
                Ntzlich auch, wenn ein Wort innerhalb eines Programms nur
                beim ersten Aufruf ausgefhrt werden soll, wie z.B. fr die
                Zuweisung einer Command-Line-History:
                        : (his) 80 swap history ;
                        defer   his
                        ' (his) is his          \ aktion beim ersten aufruf
                        ' drop cfa ' his !      \ ruhezustand des wortes
                und damit
                        ... 0 his default-is his ...
                womit nur beim ersten Aufruf eine History neu eingerichtet
                wird, und sie bei jedem neuen Aufruf unverndert bleibt.
             >> Re-assign a vector to it's default action.
defer           ( exec ) (C) ( DEFER name -- )          F83
                Vorwrtsreferenz einrichten, {name} kann spter mit {is} die
                gewnschte Aktion zugewiesen werden. Bis dahin, im Urzustand,
                fhrt {name} ein {noop} aus - welches zugleich auch "default"
                dieses Wortes ist (s.o.):
                        ' forthwort1 IS name            \ aufruf eintragen
                        ' forthwort2 cfa ' name 2+ !    \ default evtl. auch
                        ' forthwort  cfa dup ' name 2!  \ beide zugleich
                {defer}red-Definitionen sind abgesichert gegen Verlust der
                Codebasis durch {forget}. In einem solchen Fall wird die
                Vorgabe ausgefhrt, deren cfa auf ' name 2+ eingetragen ist.
                Liegt auch diese auerhalb des sicheren Bereichs, wird mit
                Fehlermeldung abgebrochen. Ungerade ptr deaktivieren einen
                {defer}red Aufruf und gelten nicht als Fehler, soda er mit
                {1on} und {toggle} stillgelegt rsp. freigegeben werden kann.
                Diese Form der Deaktivierung ist der Revectorisierung nicht
                nur deshalb vorzuziehen, weil die ursprngliche Aktion leicht
                zurckgewonnen werden kann, sondern auch, weil sie selbst
                gegenber dem sehr schnellen {noop} noch einen deutlichen
                Zeitgewinn bringt. Im Vergleich wurden in einer Schleife mit
                1.000.000 Durchgngen im SMSQ/E mit QXL gemessen:
                        leere Schleife                   4,1 s je Durchgang
                        Schleife mit {noop}              6,6
                        auf {noop} {defer}red Wort      11,2
                        Vector mit 1+ deaktiviert        8,1
depth           ( -- n1 )
                n1 gibt die Anzhl gerade vorhandener Stackposten an.
del             ( -- )                                  F6
                Im Ausgabefenster ein Zeichen zurckgehen und es lschen.
del-defb        ( --er )                                IO2/dvs_byt 8.18
                Aufruf der SBasic-Procedur aus TK2/GC/SMSQ.
digit           ( n1 -- n1 tf | ff )
                Liefert zustzlich den Flagwert 1, wenn n1 als Ziffer zur
                aktuellen Basis aus {base} gltig ist, ersetzt sonst n1 durch
                den Flagwert 0.
dliteral        ( -- dn )  (C)( dn -- )         - "state sensitive" -
                doppeltgenauer Festwert. Nheres s. {literal}.
dminus          ( dn1 -- -dn1 )
                Negation
dm*             ( ud1 ud2 -- uq3 )                      F6
                Multiplikation zweier Doppelter zu einer Vierfachen Integer.
do              ( n1 n2 -- ) (C) ( -- sys: ptr 3 )
                Leitet eine Schleife ein, die (n1-n2)-mal ausgefhrt rsp. bei
                (n1-n2) < 1 nur einmal durchlaufen wird.
                Der mit {i} lesbare Laufindex beginnt bei n2.
                                DO.. ..LOOP oder DO.. ..+LOOP
does>           ( -- ) (C)
                Leitet in einem Definitionswort den von den damit definierten
                neuen Worten auzufhrenden Teil ein. Darf nur bei Worten ein-
                gesetzt werden, die mit {<builds} aufgebaut werden. Fr die im
                F83 mit {create} bliche Paarung ist {;does>} zu verwenden.
                Nach {does>} ist das im Aufbau begriffene Wort fr {-find} noch
                nicht erkennbar.
dp              ( -- ptr ) User-Vari
                Dictionary-Pointer, wird beim Compilieren weitergezhlt.
                Die niedrigste 4th-Adresse ist $-8000, die hchste $7fff.
                Vorsicht:
                Wird der Inhalt von {dp} direkt durch ein Programm verndert,
                und besteht dabei die Mglichkeit der Vorzeichennderung, mu
                dem Dictionary-Ptr auf der Langwortadresse { dp 2- } die vor-
                zeichenerweiterte doppeltgenaue 4th-Adresse zugewiesen werden.
                Widrigenfalls verkehren sich die Manahmen zur Adressierungs-
                sicherheit in ihr Gegenteil, und das System bricht zusammen.
dpl@            ( -- n1 )                               F6
                Liefert den Inhalt der User-Variablen {dpl}
dpl             ( -- ptr )                              ( F6 fr fp-Zahlen )
                User-Vari, nach der Umwandlung eines Ziffernstring in eine Zahl
                wird hier die Position des (letzten) Dezimal-Kommas (-Punktes)
                verzeichent, gezhlt von der letzten Ziffer an. Steht das Zei-
                chen an letzter Position, enthlt {dpl} Null, fehlt es, steht
                dort -1. Fliekommazahlen werden mit -2 in {dpl} gemeldet.
dr0ch           ( -- c1 )                               F6
                Byte-Cons, F6-Kanalnummer des {screen}-Kanals.
dr1ch           ( -- c1 )                               F6
                Byte-Cons, F6-Kanalnummer des {file}-Kanals.
drop            ( n1 -- ) ( f1 -- )
drop;           ( n1 -- )                               F6
                Verbindung aus {drop} und {;s} wird ggf. durch {;} compiliert.
                Auch geeignet zum auerordentlichen Verlassen eines Wortes.
dr0             ( -- )                                  LR
                Erstes Massenspeichergert aktivieren, i/o durch {screen}.
                Setzt {offset} auf Null. Gltige Screens von 0 bis 16383;
                Screen Null kann nicht in den Interpreter geladen werden!
dr1             ( -- )                                  LR
                Zweites Massenspeichergert aktivieren, i/o durch {file}.
                Setzt {offset} auf 16384.
du<             ( ud1 ud2 -- flg )
dup             ( n1 -- n1 n1 ) ( f1 -- f1 f1 )
d*              ( d1 d2 -- d3 )                         F6
d+              ( d1 d2 -- d3 )
d-              ( d1 d2 -- d3 )
d.              ( d1 -- )
                Doppelte Integer hinschreiben.
d/              ( d1 d2 -- d3 )
d<              ( d1 d2 -- flg )
d=              ( d1 d2 -- flg )
* E
echo            ( ptr count -- )                        F6
                {type} in den {in-cons}-Kanal, wenn {prompt} =/= 0 ist. Ist c1
                nicht offen, geht die Ausgabe in das Ur-Fenster vom Job-Start.
editor          ( -- )  Vocabular
edif            ( -- c1 )                               F6
                Zum Editieren gerade gltige Kanalnummer, {screen} oder {file}.
edit            ( -- )                                  F6
                Wenn der Editor noch nicht geladen ist, wird versucht, ihn aus
                dem namentlich bei {(screen)} eingetragenen File zu compilieren.
                Danach, oder wenn er bereits vorhanden ist, erfolgt Aufruf des
                F6-Screen-Editors - Erluterungen dazu in "ed_gls".
else            ( -- ) (C) ( sys: ptr 2 -- ptr -2 )
emit-m          ( n1 c2 -- )                            F6
                'emit multiply' - Ausgabe der Anzahl n1 Zeichen c2.
emit            ( c1 -- )
                Zeichen c1 nach {out-cons} ausgeben.
empty-buffers   ( -- )
                Alle Blockpuffer mit <nul>-Bytes lschen.
empty           ( -- )                                  F6 F83
                Alle Definitionen jenseits der Grenze aus {fence} lschen.
enclose         ( ptr c1 -- ptr n1 n2 n3 )
                Eine von dem Zeichen c1 umschlossene Gruppe Zeichen eingrenzen.
                Dies ist der zentrale Aufruf aller Worte im F6-Kern, die ein
                Textstck holen. Anfangs ist c1 nicht erforderlich, es mssen
                ab der Stelle ptr jedoch wenigstens zwei unterschiedliche Zei-
                chen vorhanden sein, deren letztes mit dem Code c1. Fhrende
                Begrenzungszeichen werden bersprungen, erst nach einem davon
                unterschiedlichen Zeichen gilt es als Begrenzung. Leerstrings
                kommen also nicht vor. Vielfach als strend empfunden ist das
                zum einen fr {word} erforderlich, zum andern aber auch zur
                optisch gnstigeren Schreibweise etwa bei einer derartigen De-
                finition mit Vorteil nutzbar:
                        : string create 0 c, here [compile] " ...
                womit man dann schreiben kann:
                        string {name} "die Begrenzung umfat alle Zeichen"
                was sehr viel plausibler aussieht, als die (eigentlich korrekte)
                Schreibweise fr denselben Text:
                        string {name} die Begrenzung umfat alle Zeichen"
                Zurckgegeben wird der unvernderte ptr, der Abstand n1 zum
                ersten Zeichen =/= c1, der Abstand n2 zum danach ersten Zei-
                chen = c1 und in n3 der Abstand zu der Stelle, wo ein neues
                {enclose} angesetzt werden kann.
                n2-n1 ist die Lnge der eingegrenzten Zeichengruppe.
endif           ( -- ) (C) ( sys: ptr 2 -- )
enter           ( -- ) (C) ( -- sys: here 5 )           F6(!)
                Die Kombination {enter} mit {entry} bildet eine Struktur-
                Variante besonderer Effizienz:
                {enter} ist Startpunkt fr den unbedingten Einsprung in eine
                BEGIN-Schleifenstruktur an den mit {entry} bezeichneten Ort.
                Dies macht den unbedingten Rcksprung der Strukturen der Art
                BEGIN..WHILE..REPEAT berflssig und erlaubt bei schnellerer
                Ausfhrung vielseitigere Gestaltung durch Abschlu wahlweise
                mit WHILE..REPEAT, UNTIL oder AGAIN. Z.B.
                        BEGIN dup WHILE 1+ REPEAT
                wird ersetzt durch
                        ENTER BEGIN 1+ ENTRY dup 0= UNTIL
                Die Operation 0= zieht der Compiler des F6 mit UNTIL zu einem
                Sprung mit umgekehrter Bedingung zusammen, wodurch der zustz-
                liche Operator ohne Wirkung auf die Ausfhrungszeit bleibt.
             >> This is a new modification to the BEGIN..-loop structure of
                improved efficiency as it dispenses with the uncondional branch
                back to the loop entry. It also enables more flexibility as
                the loops may be terminated with any one of REPEAT (after an
                additional WHILE), nn UNTIL, or AGAIN, respectively.
entry           ( -- ) (C) ( sys: ptr 5 n1 n2 -- n1 n2 )  F6(!)
                Zielpunkt eines {entry}-Einsprunges:
                        ENTER BEGIN ... ENTRY .. WHILE .. REPEAT
                        ENTER BEGIN ... ENTRY .. cc UNTIL
                        ENTER BEGIN ... ENTRY .. .. AGAIN
                Einsprung mit einer Stackmanipulation auch hinter WHILE:
                        ENTER BEGIN ... WHILE .. [ 2rot 2swap ] ENTRY .. REPEAT
                Ein wenig verrckt:
                        cc IF n1 n2 2>r ENTER [ 2swap ] ENDIF
                                 n3 n4 DO ... [ 2swap ] ENTRY ... LOOP
                Es ist also lediglich darauf zu achten, da fr {entry} irgend-
                welche zwei Stackposten und die eigenen Parameter vorliegen.
                Der Einsprung kann damit an beliebiger Stelle stehen.
erase           ( ptr n1 -- )
                Im Forth-Speicher ab ptr Anzahl n1 <nul>-Bytes eintragen.
ernum           ( -- dn )                               F6
                Fehlercode nach einem der Aufrufe aus dem qdos-Vocabular -
                das sind die, die nicht in den Standardfenstern arbeiten.
                Wird nach den Lesen sofort wieder auf Null zurckgestellt.
                Zerstrungsfreies Lesen ist mglich mit:
                        ' ernum cfa @ 2+ base+ @l 2+ 2@
error           ( n1 -- )
                Schreibt die Fehlermeldung zum Code n1 und fhrt {warm} aus.
                Im Verlauf der Fehlerbehandlung wird vor dem Erreichen von
                {quit} eine Kette teils revectorisierbarer Worte ausgefhrt,
                die bedarfsweise auch auf andere Worte eingestellt werden
                knnen. Insbes. {(quit)} dient dabei dem automatischen Start
                und spteren stetigen Wiedereintritt in z.B. ein Programm.
                error (D)       fhrt [error] aus,
                [error]         bei warning > oder = 0 endet es
                                        in der Ausfhrung der cfa aus (quit).
                        (quit)          fhrt in den ueren Interpreter.
                                bei warning < 0 wird abort ausgefhrt
                        abort           ruft (abort) und (quit) auf:
                        (abort) (D)     ist initial mit einem headerlosen Wort
                                        zur Teil-Initiierung besetzt,
                        (quit)          schliet mit Ausfhrung der cfa ab,
                        quit            ist der uere Interpreter, und seine
                                        cfa steht initial in (quit).
ert             ( dn -- )                               LR
                Warmstart bei dn =/= 0.
even            ( n1 -- n2 )                            F6
                Gibt n1 geradzahlig abgerundet als n2 zurck.
             >> align n1 to n2 = n1 - (n1 mod 2)
even+           ( n1 -- n2 )                            F6
                Rundet geradzahlig auf.
             >> align n1 to n2 = n1 + (n1 mod 2)
execute         ( cfa -- )
                Der Aufruf eines Wortes ist gleichbedeutend mit
                        ' name cfa execute
expect          ( ptr n1 -- )(D)
                Erwartet Tastatureingabe in {in-cons} bis zum nchsten <enter>
                oder der maximalen Lnge n1 und bringt sie nach ptr.
                Die empfangene Lnge ist unmittelbar danach in {span} lesbar.
                Fehler werden durch {(exper)} so abgefangen, da bei Verlust
                des Eingabekanals die Fenstervorgabe vom Systemstart sowohl
                fr in-cons als auch fr out-cons eingetragen wird. Eingabe
                ist sowohl aus Dateien als auch aus Fensterkanlen mglich.
* F
f/n             ( -- n1 )                               F6
                Cons, Maximallnge fr einen Filenamen.
f>$             ( f1 -- ptr count )                     F6 QDOS
                fp-Zahl in Zifferntext umwandeln und zur weiteren Bearbeitung
                rsp fr {type} bereitlegen.
f>d             ( f1 -- d1 )                            F6
                Wandelt f1 in doppeltgenaue Intger um, liefert bei Bereichs-
                berschreitung entsprechende berlaufwerte ( $7fff.ffff oder
                $8000.0001 = $-7fff.ffff ) in den Stack.
f>q             ( f1 -- q1 )                            F6
                Umwandlung einer fp-Zahl f1 in eine Vierfache Integer,
                berlaufwerte entsprechend {f>d}.
fdelete         ( name -- ) (I) (iP)                    F6 LR
                Lscht das File name. Kann, wie auch die {fop-..}-Varianten,
                compiliert werden mit fest in das Wort eingabutem Filenamen
                        : wortname ...  ... fdelete filename ... ;
                mit Anforderung des Namen durch das neue Wort
                        : wortname ... ... [compile] fdelete ... ;
                oder in ein neues Compiler-Wort
                        : name ... compile [compile] fdelete ... ; immediate
                das seinerseits in den beiden ersten Varianten verwendbar ist.
fence           ( -- ptr )
                User-Vari, enthlt die absolute Untergrenze fr {forget}, die
                zur einwandfreien Funktion von {empty} und {cold} unbedingt
                eine lfa sein sollte, z.B.:
                        ' task lfa fence !
                Wurde {empty} mit gendertem {fence} oder {forget} unterhalb
                der zuvor gltigen Grenze aufgerufen, sind danach mit {safe!}
                die Initiierungsdaten fr {cold} und {warm} zu aktualisieren.
file            ( -- c1 )                               F6
                Position des ersten Editor- rsp. Load-Filekanals.
fill            ( ptr1 n2 c3 -- )
                Anzahl n2 Zeichen c3 nach Forthadresse ptr1 brigen.
first           ( -- ptr )
                Cons, ptr zum ersten Blockpuffer, beim Systemstart besetzt.
fld             ( -- ptr )
                User-Vari, frei verwendbar
fname"          ( ptr FNAME" filename" -- )             F6S
                Bringt einen mit " begrenzten String der maximalen Lnge aus
                {f/n} mit Zhler-Wort ("integer") nach ptr.
fop-dir         ( FOP-DIR name -- d.er ) (I) (iP)       F6 LR
                ffnet name als Directory-File.
                Weist die QDOS-ID bei Erfolg dem aktuellen {work}-Kanal zu.
fop-in          ( FOP-IN name -- d.er ) (I)  (iP)       F6 LR
                ffnet name als File zum Lesen.
                Weist die QDOS-ID bei Erfolg dem aktuellen {work}-Kanal zu.
fop-link        ( did FOP-LINK name -- d.er ) (I) (iP)  F6
                zur Verknpfung eines PIPE-Kanals (oder HIS der History von
                'oktagon') mit einem neuen Kanal.
                Weist die QDOS-ID bei Erfolg dem aktuellen {work}-Kanal zu.
                Eine interessante Nebenwirkung dieser Kanalverkettung ist
                auch die Mglichkeit, damit eine automatisch verwaltete Teilung
                von Prompt-/Eingabe- und Ausgabe-Fenster einzurichten:
                        " con_448x40a20x200" 0 ch-id 0 open-link
                erffnet ein nur fr die Eingabe zustndiges Fenster, das
                zugleich als "prompt"-Kanal dient, und lenkt die Standard-
                Ausgabe in den f6-Kanal 0, der nun nur die Ausgabe aufnimmt.
                Fr eine den SBasic-Fenstern hnliche Aufteilung lassen sich
                die Fenster dann z.B. mit {wmov} anordnen:
                        0 wmov ... <enter>   richtet Gesamtbereich ein
                        1 wmov ... <enter>   postiert darin das Eingabefenster
                        0 wmov ... <ESC>     justiert schlielich das Ausgabe-
                                             fenster so, da es sich mit dem
                                             Eingabebereich nicht berschneidet.
                Danach hat man einen von der eigentlichen Bildausgabe klar ge-
                trennten Eingabe- und Prompt-Bereich, der ohne jeden Programm-
                aufwand - und damit auch ohne Zeitverlust - betreut wird.
fop-new         ( FOP-NEW name -- d.er ) (I) (iP)       F6 LR
                ffnet einen Kanal zum hiermit neu eingerichteten File name.
                Weist die QDOS-ID bei Erfolg dem aktuellen {work}-Kanal zu.
fop-over        ( FOP-OVER name -- ) (I) (iP)           F6 LR
                Lscht ggf. das File name und fhrt dann {fop-new} aus,
                ist darum von TK2 oder Minerva unabhngig berall verwendbar.
                Weist die QDOS-ID bei Erfolg dem aktuellen {work}-Kanal zu.
fopen           ( FOPEN name -- d.er ) (I) (iP)         F6 LR
                ffnet einen Schreib-/Lese-Kanal nach name.
                Fr alle {fop..}-Varianten gilt:
                Falls {work} vor dem open-Versuch einen offenen Kanal reprsen-
                tiert, der nur dort verzeichnet ist, wird jener geschlossen.
                Dies geschieht der Ordnung halber, da dessen ID durch die neue
                Nummer berschrieben wird und danach nicht mehr greifbar ist.
                Bei Erfolg wird die neue QDOS-ID dem {work}-Kanal zugewiesen.
                Am Schlu der Aufrufe folgt ein { 0 paper }. Das ist stets un-
                schdlich, hat bei Fenstern aber zur Folge, da der Kanal ggf.
                sofort in die Verwaltung durch das PIF bernommen wird, was die
                andernfalls oft recht blen Fehlererscheinungen vermeidet. Diese
                Extratour ist Teil der Vorgabedefinition des vectorisierten Wor-
                tes {[fop]}, das den eigentlichen open-Aufruf enthlt, und wo
                sie bei Neudefinition ggf. auch fortgelassen werden kann.
forget-lk       ( -- ptr )
                User-Vari, im System zur Verkettung von {forget}-Aktionen.
forget          ( FORGET name -- | abort )
                Alles ab der Definition name aus dem Dictionary lschen und
                den betr. Bereich freigeben. {abort} wenn name nicht existiert.
                {forget} ist von der Vocabularordnung beim Aufruf unabhngig
                und arbeitet durch alle Vocabulare hindurch. Falls das betrof-
                fene Wort nicht im Context-Vocabular steht, kehrt der Aufruf
                zur Sicherheit stets mit {forth} als Context zurck; Vocabulare
                knnen problemlos mit {forget} ebenfalls entfernt werden.
                        fence @ top-nfa id.
                zeigt den Namen des letzten vor {forget} geschtzten Wortes an.
                In {forget} liegt die einzige Stelle des F6-Systems, an der die
                Caches der Processoren ab 68020 geschaltet werden. Dies dient
                fr sptere z.B. {defer}red oder lo-level-Aufrufe der sicheren
                Erkennung der Vernderungen durch den Processor. Nach auen hin
                tritt die vorbergehende Abschaltung nur mehr oder weniger zu-
                fllig in Erscheinung, wenn der mit {break} erzwungene Abbruch
                gerade in die Ausfhrung der entsprechenden {forget}-Passage
                fllt. Schdliche Folgen entstehen nicht, man kann die Caches
                aus jedem beliebigen Programm heraus sofort wieder aktivieren.
format          ( FORMAT name -- n1 n2 0 | er )         F6 LR
                Gibt die Anzahl formatierter und brauchbarer Sectoren zurck,
                bei einem Fehler nur den Fehlercode er.
fp-err          ( -- er )                               F6
                Fehlercode nach fp-Operationen, nach dem Lesen auf Null gesetzt.
ftest           ( FTEST name -- er )                    F6
                Prft, ob mit name ein lesbarer Kanal eingerichtet werden kann.
fp              ( -- ) (I)                              F6
                Vocabular fr Fliekomma-Operationen. Ist {fp} current, werden
                Zahlen stets im fp-Format ermittelt und ggf. compiliert, sofern
                sie nicht mit einem Zahlenpraefix versehen sind.
                In {fp} definierte neue Vocabulare - bei {fp} als context -
                'erben' die fp-compilierende Eigenschaft.
             >> Vocabulary compiling and operating on fp-numbers, as newly
                defined {fp}-sub-vocabularies also do.
* H
h>a             ( n1 -- c1 )                            H4
                liefert das sedezimale Ziffernzeichen entsprechend der Zahl n1
here            ( -- ptr )
                ptr ist der aktuelle Dictionary-Ptr, gelesen aus {dp}.
hex             ( -- )
                Stellt die sedezimale Zahlenbasis ein.
hidden          ( -- ) (I)                              F6 C1 F83
                Vocabular fr die eher heiklen Operationen zum Schutz gegen
                versehentlichen Aufruf, und fr Hilfsdefinitionen, die kaum
                allgemeine Anwendung haben, um die Wortsuche in den anderen
                Vocabularen nicht unntig zu verlangsamen.
hld?            ( -- flg )                               F6
                flg = 1 bei Erreichen der Bereichsgrenze zur Zifferndarstellung.
                Insbes. zur Kontrolle bei der quad-Umwandlung. Es bleibt stets
                noch gengend Platz, um ggf. durch einen voranzustellenden Ln-
                genzhler einen 4th- oder qdos-String zu erzeugen. Die Kontrolle
                wirkt nur bei Standardbesetzung von {hld} auf {pad} mit nach
                {here} wachsenden Strings, wie sie z.B. durch {<#} automatisch
                eingestellt wird. Wurden die Referenzposten ab { hld 2- } auf
                einen anderen Wert umgestellt, ist ggf. im Programm gesondert
                fr Einhaltung der Grenzen zu sorgen. Es wird Platz fr maximal
                66 Zeichen einschlielich evtl. des Lngenwortes bentigt.
hld             ( -- ptr )
                User-Vari, nach Umwandlung einer Zahl in die Ziffernschreibweise
                mit ptr zum Anfang des Ziffernstrings, der bis vor {pad} reicht.
                Der Posten { hld 2- } enthlt den vorzeichenerweiterten Wert.
                Bei Vernderung des Ptr von auen, z.B. durch ein Programm, ist
                stets der doppeltgenaue Wert einzutragen, zugleich mu dieselbe
                Zahl auch an die Stelle { hld 2+ } bergeben werden. Z.B.
                        ( d.zahl ) <# pad 100 + s->d 2dup hld 2- 4! #s #> type
                wodurch der Ziffernstring von { pad 100 + } an "abwrts" aufge-
                baut wird. Wird ein mit {>loc} reservierter Localer Speicherbe-
                reich hierzu benutzt, lassen dadurch sich jegliche Konflikte bei
                der Zahlenausgabe vollstndig ausschlieen.
hold            ( c1 -- )
                Fgt das Zeichen mit dem Code c1 in den im Aufbau befindlichen
                Ziffernstring an der aktuellen Position aus {hld} ein.
                Wird allgemein nur zwischen <# und #> benutzt.
* I
i               ( -- n1 ) (C) ( -- )
                Schleifenindex innerhalb einer DO..LOOP, identisch {r}.
i/o             ( -- c1 )                               F6
                Nummer des mit der jngsten Operation benutzten i/o-Kanals.
id.             ( nfa -- )
                Schreibt den zur angegebenen nfa gehrenden Namen eines Wortes
                hin. Immediate-Worte werden durch vertauschte Hintergrund- und
                Schriftfarbe hervorgehoben.
if              ( flg -- ) (C) ( -- sys: 2 )
                {if} wird vom Compiler optimiert, wenn ihm einer oder eine
                Kombination der Vergleichsoperatoren {0< 0= 0>} vorausgeht.
                Dies erspart neben dem oft erheblichen Zeitgewinn auerdem
                die Definition einer Unzahl spezieller Operatoren fr jeden
                der mglichen Vergleichszustnde und Postentypen, denn z.B.
                        ist     0< 0= IF        identisch mit  0>= IF
                und wird im F6 direkt als bedingter Sprung compiliert. Auch
                        hat        0= IF        kein krzeres quivalent, wird
                aber als besondere IF-Variante ebenfalls optimierend compiliert.
if-found        ( IF-FOUND name -- ) (I)                F6 (F83)
                Hilfe z.B. fr bedingte Aktionen beim Laden aus Screenfiles.
                Wurde {name} nicht gefunden, bleibt der Rest der Eingabezeile
                unbeachtet.
if-nfound       ( IF-NFOUND name ) (I)                  F6 (F83)
                Der Rest der betr. Eingabezeile rsp. des Blockes im Screenfile
                bleibt unbeachtet, wenn das Wort name bereits vorhanden ist.
if-true         ( flg IF-TRUE ) (I)                     F6
                Der rest der Zeile bleibt unbeachtet, wenn flg = 0 ist.
immediate       ( -- )
                Macht das jngste current-Wort zum Compiler-Wort, d.h. es
                wird "immediate" erklrt und damit stets sofort ausgefhrt.
in-cons         ( -- c1 )                               F6
                Nummer des Kanals der Standard-Tastatureingabe.
interpret       ( -- )
                Der Text in {source} wird Interpretiert ab der Stelle
                        source drop in @ +
                Das Textende lt sich u.a. ermitteln aus
                        source sdrop in @ 1- <
io-err          ( -- n1 )                               F6
                Fehlernummer bei einem i/o-Fehler der Standardfenster oder
                in den File-Operationen
io-time         ( -- ptr )                              F6
                User-Vari mit der Wartezeit fr i/o-Operationen. Wird im System
                benutzt, sollte sonst stets auf -1 belassen bleiben - s. {key}.
is-chan         ( c1 -- )                               F6
                QDOS-ID des aktuellen {work}-Kanals an F6-Kanal c1 bergeben.
is-his          ( c1 -- flg )                           F6
                flg=0 wenn der Fensterkanal c1 keine Command-Line-History hat,
                flg=1 bei gewhnlichen Fenstern, flg=-1 bei untauglichem Kanal.
is-ochan        ( c1 -- flg )                           F6
                flg = 1 wenn c1 einen eigenen Kanal des F6-Jobs reprsentiert.
is-open         ( c1 -- flg )                           F6
                flg = 1 wenn c1 einen offenen Kanal reprsentiert.
in              ( -- ptr ) User-Vari
                Enthlt den Interpreter-Laufptr als Abstand zum Text-Anfang.
inkey           ( +n1 | -1 -- c1 )                      F6
                unterscheidet sich von {key} nur durch Wartezeitangabe +n1 und
                Nutzung des {work}-Kanals, wenn der ein Fenster reprsentiert.
is              ( xx IS name ) (I)                      F6 F83 H4
                Werte-Zuweisung an verschiedenerlei Datenposten:
                       Wert        IS   Typ             {default-is}
                        pfa             defer           anwendbar
                      index pfa         case:
                         n1             variable        anwendbar
                         n1             user
                     n1 rsp. f1         constant        anwendbar
                      index n1          case:
                      index n1          associative:
                      index n1          range:
                        dn1             2variable
                        dn1             2constant
                Bei Variablen und Constanten ist die konventionelle Zuweisung
                mit Hilfe der zugehrigen Adresse und einem {!}-Operator sehr
                viel schneller, IS dagegen ist transportabel in andere Forth-
                Systeme, da dessen Definition dort leicht ergnzt werden kann,
                nicht aber die des {'}. Das hier benutzte IS kann problemlos
                identisch mit anderem Namen eingerichtet werden:
                        defer TO                immediate
                        ' is IS to  ' is cfa ' to 2+ !
                oder (geringfgig langsamer compilierend)
                        : TO [compile] IS ;     immediate
* J
j               ( -- n1 )
                Schleifenindex einer umgebenden zweiten DO..LOOP.
* K
keyrow          ( n1 -- n2 )                            F6 QDOS
                Gibt den Spalten-Code der QL-Tastatur der Reihe n1 zurck.
key             ( -- n1 )                               ( F6 erweitert )
                Wartet auf Tastenbettigung und gibt den zugehrigen Zeichen-
                code zurck. Zusammen mit ALT ist der Wert negativ, war kein
                Tatstaturkanal zugnglich, kommt $8000 ( 32768 ).
                Die Wartezeit wird von {io-time} bestimmt und kann damit gen-
                dert werden, ist spter aber unbedingt wieder zurckzustellen.
* L
lit+            ( -- ) (C)                              F6
                Mit grter Vorsicht zu verwenden, da vllig ungeschtzt:
                Darf nur compiliert werden, keinesfalls direkt aufgerufen!
                Vor einer Zahl compiliert modifiziert die Literal-Optimierung
                diese dann so, da sie sofort in den Stack addiert wird, also
                die Sequenz {n1 n2 +} durch diese gut 40% schnellere (und zwei
                Bytes Platz einsparende) Variante ersetzt. Man schreibt dazu
                        : name ... lit+ zahl ...
                was dem "normalen" Text gleichkommt
                        : name ... zahl + ...
                In der Optimierung wird durch den {+}-Compiler ein {lit} automa-
                tisch durch {lit+} ersetzt, wenn vor dem {+} ein Festwert steht.
l-load          (I) <= 8.16             (P)             F6 und F6S
                init: ( L-LOAD filename )               oder
                      ( 0 L-LOAD drop )
                load: ( L-LOAD forthwort )              oder
                      ( L-LOAD forthwort filename )
                "Library Load" zum Compilieren einzelner Worte aus Screenfiles.
                Die zweite Initiierungsvariante ist Beispiel fr den Aufruf,
                wenn ungewiss ist, ob die Initiierung schon vorher erfolgte.
                Da relativ aufwendig, und fr fertige Programme kaum je vonn-
                ten, wurde dieser Aufruf in das Screenfile ausgelagert, als zu-
                grundeliegende Definition ist S-LOAD (s.dort) im Kern vorhanden.
                Zum Auffinden des Wortes mu in der ersten Zeile der Seite, an
                der die gesuchte Definition beginnt, der Name mit fhrendem und
                abschlieendem Leerzeichen bei vorangestelltem Doppelpunkt ste-
                hen, ggf. auch als Kommentar:
                        ( : name1 : name2 und ggf. weiterer text )
                Bleibt er unverndert, kann der Filename fortgelassen werden.
                Bedingtes Compilieren wird zustzlich dadurch untersttzt,
                da {-lword} den gesuchten mit einem angegebenen Namen ver-
                gleicht und bei Erfolg als Flag 1 zurckgibt, sonst Null.
                Zur Kontrolle gibt der {l-load}-Aufruf zuerst seinen Filenamen
                aus, und am Ende den Namen des zuletzt compilierten Wortes.
                Die Files werden nur zum Lesen geffnet, soda auch Aufrufe im
                selben Quellenfile mit {l-load} mglich sind, oder mehrere F6-
                Jobs zur selben Zeit auf dieselbe Quelle zugreifen knnen.
                L-LOAD kann in ca. 30 Stufen geschachtelt aufgerufen werden:
                Es belegt im Returnstack die der Namenslnge des Aufruf-File
                zuzglich 11 entsprechende Anzahl Bytes, geradzahlig abgerundet.
           FEHLER: Regulre Fehlermeldung bei nicht gefundenem Wort ist err.ro,
                "Schreibschutz", weil intern ein Versuch zum normalen OPEN am
                bereits OPEN_IN-geffneten File scheitert, der standardmig
                als Hilfe dient, einen fehlerhaften Text zu editieren. Fehl-
                schlag gilt NICHT als Fehler, wenn {l-load} aus einem File auf-
                gerufen wurde, was das allein durch Vorhandensein (oder nicht)
                irgendwelcher Teile steuerbare Compilieren erlaubt, aber auch
                die Fehlermglichkeit unvollstndiger Programme birgt.
                Einige Beispiele zu L-LOAD finden sich u.a. in "fig_scr".
           HINWEIS: Mitunter gibt es Fehler beim Laden aus "WIN" bei den SMSQ-
                Varianten. Falls L-LOAD abbricht, gelingt es u.U. fortan nicht
                mehr, von "WIN" berhaupt noch einen Ladevorgang durchzufhren,
                selbst mit neu gestarteten Jobs blieb das oftmals aussichtslos.
                Dem hat in Version 2.57 gelegentlich DEL_DEFB abgeholfen.
                In {l-load} sind inzwischen weitgehende Vorkehrungen dagegen
                getroffen, die jedoch nicht immer helfen mssen.
l-mrg           ( -- ptr ) User-Vari                    F6
                Linker Rand bei der Bildausgabe, z.B. im Debugger.
l<i             ( -- dn1 )                              F6
                Gibt den jngsten Wert des Processor-Registers D0 zurck.
                Liefert nur compiliert sinnvolle Werte, die benutzt werden
                knnen, um z.B. das regulre Ende einer DO..LOOP vom Ende
                durch Verlassen mit LEAVE zu unterscheiden. Dieses Wort ist
                ganz und garnicht standardgem und drfte kaum bertragbar
                sein. Es sollte darum nur in Ausnahmefllen benutzt werden.
                Nheres hierzu in "FORTH_txt" rsp. hier am Schlu.
last            ( -- ptr )                              F79+
                User-Vari, enthlt die nfa der jngsten Definition im Sytem.
                Gegenber {latest} bietet dieses Wort die Sicherheit, da z.B.
                ein Verweis auf die gerade im Aufbau befindliche Definition
                auch wirklich die richtige Stelle trifft - wenngleich {current}-
                Wechsel whrend der Definitionsphase ein hchst unkonventionel-
                les (und sinnloses!) Vorgehen ist, so wird {latest} dann auf ein
                anderes Wort zeigen und die Referenz kann zu Fehlern fhren.
                        : name ... IF [ last @ pfa cfa , ] ENDIF ... ;
                beispielsweise fr eine "handgefertigte" Recursion.
latest          ( -- nfa )
                ist nfa des jngsten Wortes im {current}-Vocabular, entspricht
                        current @ @
                {latest} kann { last @ } sicher ersetzen, wenn es in ein Defi-
                nitionswort eingebaut wird, oder allgemein, wenn es einem Aufruf
                von {create} oder von Worten, die damit gebildet werden, folgt,
                und Referenz auf das gerade erzeugte neue Wort beabsichtigt ist.
leave           ( -- )
                Abbruch einer DO..LOOP am Ende des laufenden Durchganges. Dies
                wird durch berschreiben des Grenzwertes mit dem aktuellen Index
                erreicht; die Worte nach {leave} werden darum noch abgearbeitet.
lfa             ( pfa -- lfa )
limit           ( -- ptr )
                Cons, Obergrenze des Blockpuffer-Bereichs.
literal         ( -- n1 ) (C) ( n1 -- )         - "state sensitive" -
                Einfacher Festwert, compiliert {lit} und eine Zahl vom Daten-
                stack, im interpretierenden Betrieb ist das Wort inaktiv.
                Optimierung:
                Zwei aufeinanderfolgende Festwerte ordnet der Compiler als
                {dlit} mit quasi-doppeltem Festwert an. Damit ist z.B.
                        : dr? $40 $40 offset c@ and = ;
                deutlich schneller, als
                        : dr? $40 dup offset c@ and = ;
                und auerdem noch krzer, als
                        : dr? offset c@ $40 and $40 = ;
                Fr alle {literal}-Varianten gilt:
                Beim Compilieren wird die zugehrige Zahl sofort vom Stack
                genommen und in das gerade zu definierende Wort compiliert.
                Kam sie also von "auen" in das Wort hinein, mu sie zum Aus-
                gleich der Stackbilanz dupliziert werden. Man entfernt die
                Zahl dann nach erfolgtem Wortaufbau. Beim Aufruf liefert das
                compilierte {lit} die Zahl in den Datenstack. Z.B.:
                        here
                        : wodenn [ dup ] literal $. ;
                        drop
                {literal}s werden mit geringerem Zeitaufwand ausgefhrt, als die
                entsprechenden {constant}-Definitionen. Das Compilieren dauert
                etwas lnger, da Zahlen immer erst nach erfolgloser Wortsuche
                ermittelt werden. Sie bieten sich dort an, wo eine Zahl nach dem
                Compilieren nicht mehr gendert wird, sie nur selten vorkommt,
                und nicht von mehreren Stellen auf einen identischen Wert zuge-
                griffen werden mu.
lngbad          ( -- er )                               F6 IO2 Lightning
                Versucht den SBasic-Aufruf _lngBAD. Keine Fehleraktion, gibt
                stets den QDOS-Fehlercode zurck, 0 im Erfolgsfalle. Fehler-
                code 0 kann auch als zuverlssiger Hinweis auf Vorhandensein
                der "lightning"-Erweiterung ausgewertet werden.
l-ro            ( -- n1 )                               F6
                Cons, 1 fr {l-load} mit nur zum Lesen offenen Files, sonst 0.
load            ( +n1 -- ) (D)
                Beginnt das Compilieren vom offenen Screenfile ab Seite n1 mit
                n1 > 0, da vom Block 0 nicht geladen werden kann (tib-Eingabe).
                Beginn des Ladevorganges wird mit einem Doppelpunkt im Stan-
                dard-Eingabefenster {in-cons} - sofern zugnglich - angezeigt.
                LOAD belegt jeweils drei Posten im Returnstack, womit mehr als
                250 Stufen geschachtelter Ladevorgnge sicher aufrufbar sind.
                Fr aufeinander folgende Aufrufe oder Anzahl unterschiedlicher
                Files gibt es bei keiner der Lade-Varianten eine Begrenzung.
                Durch Re-Vectorisierung von {load} lt sich aus {l-load} mit
                einfachsten Mitteln ein VIEW-Aufruf als Hilfsfunktion zum An-
                sehen der aus Screenfiles compilierten Wortdefinitionen einrich-
                ten. Dieses {view} ist zum Nachladen in "forth_scr" definiert.
                Sollte der Vector einmal verdorben worden und nicht wiederher-
                stellbar sein, kann er notfalls mit der Vorgabe besetzt werden:
                        ' load 4+ dup ' load 2!
                Der Lade-Vorgang wird blicherweise mit {;s} ausdrcklich been-
                det, bricht aber auch selbsttig ab, sofern in der zuletzt gele-
                senen Seite weder {-->} steht, noch ein neues {load}-Kommando.
loc>            ( n1 -- )                                       F6
                Gibt den n1 Zellen groen Local-Bereich frei. Der Aufruf kann
                mehrmals innerhalb eines Wortes stehen. Auch gibt es keine Kon-
                flikte mit dem System, falls die Freigabe nicht alle reservier-
                ten Posten umfat. Einziger Schaden besteht u.U. darin, da der
                "vergessene" Bereich nur dann zuverlssig zurckzugewinnen ist,
                wenn die Anzahl verbliebener Local-Bytes bekannt ist. Gegen die
                Freigbe zu groer Bereiche sind Manahmen getroffen, die jedoch
                nur als letzte Rettung zum Schutz des Systems wirksam werden.
                ltere locale Bereiche und evtl. auch regulr im Datenstack ab-
                gelegte Posten knnen in solchen Fllen verlorengehen.
loc>stk         ( n1 ... nn -- {a|A} {b|B} ... {z|Z} n1 .. nn )
                Auerordentlich schnelle Form der bergabe in den Stack bei
                gleichzeitiger Freigabe der eigenen Local-Gruppe. Holt alle
                Locals zum Stack; dort bereits vorhandene Posten bleiben an
                unvernderter Position, die Locals werden danach angeordnet.
local           ( n1..nn LOCAL liste| -- ) (C) ( -- sys: ptr 9 ) F6
                ( LOCAL buchstabe -- n1 )(C)( -- )               F6
        Definition:
                Eine mit jedem Forth-System vllig konfliktfreie Form von bis zu
                26 mit einem einzelnen Buchstaben bezeichneten Localen Variablen
                je Colon-Definition. Sie werden angelegt durch z.B.
                        : name .. LOCAL abcd| ...
                fr einfache Integer, oder
                        : name .. LOCAL ABCD| ...
                fr Doppelte. Gemischte Schreibweise gilt als Kleinschreibung.
                Bei der Deklaration mu die Buchstaben-Liste mit einem "|" abge-
                schlossen werden, widrigenfalls knnen unkontrollierbare Fehler
                auftreten. Mehrere Listen im selben Wort sind nicht zulssig.
                Zwischen den Buchstaben und vor dem "|" knnen Leerzeichen ste-
                hen, sofern nur die Definition in derselben Zeile endet.
                Die Deklaration kann an beliebigem Ort erfolgen, es ist vllig
                belanglos, welche Operationen mglicherweise davor in den Stacks
                oder sonstwo im System vorgenommen wurden. Allein zum ordnungs-
                gemen Compilieren drfen in der Compilephase keine hierdurch
                hinterlassenen Daten im Stack vorhanden sein, da diese Tatsache
                als Hinweis zum Compilieren eines Leseaufrufs ausgewertet wird,
                und, weil die Deklaration selbst Steuerdaten zum Compilieren der
                Bereichsfreigabe am Wortende im Stack hinterlt. Man ordnet die
                Deklaration also an einer Stelle an, wo bis zum Wortende keine
                berschneidung mit einer IF-ENDIF-Struktur oder einer Schleife
                vorkommt; weiterer Vorkehrungen bedarf es nicht. Bedingtes Ein-
                richten ist wegen der Art der Freigabe problematisch, es wird
                darum durch diese einzige Beschrnkung (weitgehend) unterbunden.
                In gewisser Weise bedingt ist es jedoch problemlos nach dem
                hier beschriebenen Muster mglich, wenn sich evtl. vorzeitig zu
                verlassende Aufrufteile vor der Deklaration abspalten lassen.
                Danach eingerichtete Locale Variable gelten nur im verbleibenden
                Teil des Wortes, und sie werden immer ordentlich aufgelst, da
                dann das {;} am Schlu stets regulr erreicht wird.
                        : name .. .. IF .. LOCAL a| ..
                ist zur Deklaration ungeeignet (es wird ein fehlerhafter Lese-
                aufruf erzeugt), dagegen ist sie in der Form
                        : name .. -EXIT .. IF .. ENDIF .. LOCAL a| ..
                an BELIEBIGER Stelle zulssig; d.h. sie mu auerhalb jeglicher
                in Forth-Worten abgefater Sprungstruktur stehen.
        Ausfhrung:
                Fr die Ausfhrung gibt es weder Einschrnkungen noch Abweichun-
                gen gegenber gewhnlichen Constanten und bei Adressierung mit
                Hilfe des Wortes {-loc} auch nicht gegenber Variablen. So wer-
                den insbes. weder DO-LOOP-Konstruktionen noch irgendwelche Ope-
                rationen in beiden(!) Stacks beeinflut. Gerade diese Eigenheit
                kann innerhalb von Schleifen zu enormem Zeitgewinn fhren, der
                die weiter unten beschriebene und zunchst eher umstndlich an-
                mutende Initiierungsweise mehr als nur rechtfertigt.
                Die Parameter werden vom t.o.s. angefangen den Localen Variab-
                len in Reihenfolge ihrer Deklaration zugewiesen:
                        : test local abc| local a . local b . local c . ;
                        1 2 3  3 ndup  . . .  test
                schreibt
                        3 2 1 3 2 1
                Neben den eigenen Local-Posten sind auch die Localen Variablen
                bergeordneter Worte erreichbar. Sie werden um die Anzahl eige-
                ner Indices erhht adressiert, wodurch sich mit u.U. groem
                Laufzeitgewinn locale Parameterblcke an untergeordnete Aufrufe
                weitergeben lassen. Stehen beim Compilieren nicht schon irgend-
                welche Compilerdaten im Stack, mu das betr. Wort wenigstens
                durch eine leere Deklaration prpariert werden:
                        : name ... IF ... local A ...
                        : name [ 0 ] ... local A ... ... [ drop ] ;
                erzeugen Leseaufrufe. Stets sicher, aber weniger schnell in der
                Ausfhrung, schreibt man
                        : name ... LOCAL | ... IF ...
                Anwendungsbeispiele in den Label-Sortierfunktionen "f6z80_scr".
        Installation:
                Grundlage bilden einem Wort durch die Local-Deklaration in un-
                gebrochener Reihenfolge zugewiesene geschlossene Speicherblcke.
                Die Localen Variablen sind lediglich eine spezialisierte Form
                dieser Zuweisung, ergnzt um besondere Hilfsfunktionen. Darum,
                und wegen der Lage in einem Bereich, wo sie mit anderen System-
                erfordernissen nicht kollidieren, knnen smtliche Operationen,
                die etwa an einem mit {allot} reservierten Ort zulssig sind,
                auch 'local' vorgenommen werden. Alleinige Einschrnkung ist
                deren Localitt. Jede fixe Verkettung mit dem umgebenden System
                verbietet sich daher, alles andere ist frei nutzbar.
                Die localen Daten werden "oberhalb" des Stacks eingeordnet und
                dort vor dem System in einer ausnahmlos mit allen Forth-Opera-
                tionen vertrglichen Form verborgen. Dazu wird der Datenstack
                mit jeder {local}-Deklaration um die entsprechende Anzahl Pos-
                ten in Richtung niedrigerer Adressen verlagert. Die user-Vari
                {s0} bernimmt die neue Adresse fr den Stackanfang und bleibt
                damit weiterhin Ptr fr den leeren Datenstack, ist zugleich nun
                aber auch Basis des {local}-Bereichs im betr. Wort. hnlich den
                vom SBasic des QL her bekannten Localen Variablen knnen sie
                darum auch hier an untergeordnete Worte weitergereicht werden.
                Zuweisung und Freigabe werden mit Hilfe der in das Wort hinein-
                compilierten Festwerte verwaltet, soda keine zustzlich ord-
                nenden Daten ntig sind; dies ermglicht die Geschlossenheit des
                {local}-Bereichs und formatfreie mit z.B. den {user}-Variablen
                consistente durchgehende Adressierbarkeit aller {local}-Posten.
                Damit erffnet sich die sonst in Forth-Systemen unbekannte und
                nur mit hohem Aufwand nachzusetzende Mglichkeit der bergabe
                von (localen) Parametern unabhngig von der Stackverwendung und
                in gleichbleibender Form an die verschiedensten Unteraufrufe.
                Bestes Beispiel sind die Label-Definitionen des F6-Assemblers,
                wo dank geeigneter - und wenig komplizierter - Schutzvorkehrun-
                gen dort selbst temporre Forth-Worte angelegt werden knnen.
        Anwendung:
                Zum Reservieren rsp. Freigeben localen Speichers sind die Worte
                {ini-loc} und {end-loc} im hidden-Vocabular vorhanden - s.dort.
                Diese mssen insbes. bei vorzeitigem Verlassen eines Wortes mit
                {;s} etc. zur Bereichsfreigabe aufgerufen werden:
                        : name .. LOCAL ab| ..
                               .. IF .. [ 4 ] end-loc ;s ENDIF ..
                               .. restliche Worte ..    ;
                Die Vorteile der besonderen Installationsform im F6 erlauben
                uerst vielfltigen Einatz von Local-Posten:
                        : name LOCAL abcd| .. local A local a local b d= ..
                erzeugt den Flagwert 1, da doppeltgenaue Posten auch in ein-
                facher Gre gelesen werden knnen, und umgekehrt. Identisch:
                        : name LOCAL AB| .. -loc A 2@ -loc a @ -loc b @ d= ..
                {-loc} liefert den einer {variable}n entsprechenden 4th-ptr.
                Sollen einzelne Zellen von Doppelposten gelesen werden, ist
                dafr der Index zu verdoppeln; die z.B. in C abgelegten zwei
                einfachen Integer liest man mit { local e } und { local f }.
                Da die Variablen in einem kontinuierlichen Speicherbereich
                angelegt werden, kann dort ohne weiteres auch mit Strings oder
                Fliekommazahlen gearbeitet werden. Entsprechende Platzreser-
                vierung ist erforderlich und auch ohne Parameter u.a. dadurch
                mglich, da das Wort selbst vor der Deklaration die ntigen
                Platzhalter liefert:
                        : name ..worte.. 0. 0. 0. local ABC| ..
                bernimmt vom Datenstack nur die im Wort enthaltenen Zahlen.
                FP-Zahlen lassen sich z.B. eintragen und lesen:
                        : name                          also fp
                                pi 180 local ABC|
                                -loc a @
                                -loc d @        *
                                -loc a !                previous ;
                Es ist bei beliebigem Datenformat lediglich darauf zu achten,
                da eine ausreichende Anzahl Posten im Stack bereitliegt.
                In der Ausfhrungsphase sind Auflsen und (insbes.) Einrichten
                des localen Bereichs mit merklichem Zeitaufwand verbunden, der
                mit der Anzahl "normaler" Daten im Stack zunimmt - die Anzahl
                evtl. schon vorhandener Loacal-Gruppen bleibt ohne Einflu.
                Die zum Lesen bentigte Zeit ist mit {constant}en vergleichbar.
                Zugegebenermaen hat der Autor Locale Variable im 4th schlicht
                fr Quatsch gehalten (mit all den "standardgemen" Einschrn-
                kungen sind sie das in der Tat), doch zeigte sich, da neben
                dem bequemen Umgang damit die hier eingerichtete Form auerdem
                zu erheblichem Zeitgewinn fhren kann. Damit wird der Einsatz
                Localer Variabler unabhngig von allen grundstzlichen Erwgun-
                gen durchaus sinnvoll, besonders, wenn wiederholt umfangreiche
                Stackoperationen erforderlich wren, um die Daten zurechtzule-
                gen, oder wo die Lesbarkeit bergeordneter Posten von Nutzen
                ist. Selbst eine so kurze Passage, wie
                   LOCAL ABCD| .. DO .. local D ... LOCAL D .. LOOP ..
                ist bereits schneller, als
                   LOCAL ABCD| .. DO .. local D 2dup .. 2swap .. LOOP ..
                vorausgesetzt, da vor der Local-Deklaration nicht allzuviele
                zustzliche Datenposten im Stack vorhanden sind.
                bergeordnete Locale Variable indiziert man mit ihrem Index der
                Deklaration, erhht um dem grten Index im eigenen Bereich:
                        : name1 local | ... local A d$. ... ;
                        : name2 $9abc.def0 local A| .. local A d$. local B d$. ..
                        : name3 ... $1234.5678 local A| ... name1 .. name2 .. ;
                womit {name3} hinschreibt:
                        12345678 9abcdef0 12345678
                Die durch den Indexbuchstaben gegebene Adressierungs-Obergrenze
                bei {z} oder {Z} gilt einschlielich evtl. eigener Local-Posten.
                Fr eine nur mit bergeordnetet Localen Werten arbeitende Defi-
                nition wie {name1} ist die zeitraubende Verwaltung des eigenen
                Speicherbereichs (der Gre Null) unntig. Mit einem Eingriff
                in den Compiler lt sich deren Einbau unterdrcken:
                        : name1 ... [ 0 ] .. local A d$. ... [ drop ] ;
                Hier noch ein eher abartiges Beispiel, um auf die Folgen mehr-
                facher Eintragung gleicher Indices aufmerksam zu machen:
                        : name LOCAL ABCABC| ..
                legt dieselbe Dreiergruppe zweimal ab, deren "obere" Werte dann
                mit den Buchstaben D, E, F adressierbar sind. Es werden jedoch
                stets soviele Posten vom Stack entnommen, wie Local-Posten an-
                gegeben sind, auch bei gleichen Buchstaben. Das obige Beispiel
                erwartet also sechs doppelte Integer im Stack, wovon aber nur
                die oberen drei en bloc dupliziert und als Sechsergruppe dann
                in den Local-Bereich bertragen werden, die restlichen drei
                Posten im Stack werden anschlieend verworfen. Auf diese Weise
                kann die Local-Deklaration mit einer {drop}-Funktion vereinigt
                werden - was aus Laufzeitgrnden wohl weniger zu empfehlen ist.
                Sollte aufgrund eines Fehlers einmal die selbsttige Freigabe
                versagt haben, lt sich der Local-Bereich durch Reinitiierung
                radikal freigeben, entweder mit {cold}
                                safe!           ( ggf. bisherige Worte schtzen
                                cold
                oder direkt aus den Initiierungsdaten
                                28 +origin @ s->d s0 2- 2!
                bei intaktem System entsprechend
                                tib@ s->d s0 2- 2!
             >> Local variables may be defined up to 26 within each colon
                definition by (consecutive) letters, lower case (or mixed) de-
                noting single integer items, upper case for double integers.
                        : name LOCAL abc| .. local a . local A d. ..
                or      : name LOCAL  a b   c d   | ...
                i.e. any number of blanks acceptable if the definition doesnt't
                exceed the input line. The declaration is delimited by a "|"
                char and may not be placed in between of any branching words
                (like IF...ENDIF) or within a loop structure, which otherwise
                would lead to LOCAL compiling a false reading operation.
                Re "FORTH_txt" for a more elaborate description.
loop            ( -- ) (C) ( sys: ptr 3 -- )
losc            ( -- n1 )                               F6
                Kennzahl fr einen Zeichensatz - s. {>fount}.
* M
m>r             ( ptr1 n1 -- rp: n1*bytes )             F6
                holt die ggf. geradzahlig aufgerundete Anzahl n1 Bytes aus dem
                Forth-Speicher ab ptr1 in gleicher Anordnung zum Returnstack.
m>s             ( ptr1 n1 -- n1*bytes )                 8.18
                analog {m>r}.
max             ( n1 n2 -- n3 )
message         ( n1 -- )
                Gibt eigene (+n1) und QDOS-Systemmeldungen (-n1) aus.
mem             ( -- un1 )                              H4
                Freier dictionary-Bereich (vorzeichenlose 16-Bit-Zahl).
minerva         ( -- )                                  F6
                Vocabular, kann z.B. die besonderen Arithmetikaufrufe aufnehmen.
                ! Ab Version 8.08 entfllt dieses - ohnehin leere - Vocabular
                ! wegen der beschriebenen Probleme mit dem GST-Assembler
            >>> ! removed with vers. 8.08 due to GST-assembler problems.
minus           ( n1 -- -n1 )   negation
min             ( n1 n2 -- n3 )
move-mem        ( dadr1 dadr2 +n3 +n4 - dadr5 dadr6 )   F6     (berschreibend)
                Blocktransfer im Speicher von dadr1 nach dadr2 einer Anzahl n3
                Blcke der Lnge n4, gibt die weitergezhlten Adressen zurck.
mod             ( n1 n2 -- n3 )
                Divisionsrest
mt-inf          ( -- d1 d2 d3 )                         F6
                d1 Basis der Systemvariablen, d2 QDOS-Version, d3 eigener Job.
m*              ( n1 n2 -- d3 )                         (F6)
m+              ( d1 n2 -- d3 )
                Addiert einfache Integer n2 vorzeichenerweitert zu d1.
m+!             ( n1 ptr2 -- )                          F6
                Addiert einfache Integer n2 vorzeichenerweitert in doppelten
                Posten an der Stelle ptr2.
m/              ( d1 n2 -- n3 n4 )
                Double d1 durch single n2 mit single Rest n3 & Quotient n4.
m/mod           (d1 n2 -- n3 d4 )
                Teilt Doppelte Integer d1 durch einfache Integer n2, gibt
                einfachen Quotienten n3 und doppeltgenauen Rest d4 zurck.
* N
n>r             ( nn n1..nx m1 -- nn | rp: n1..nx )     F6
                Anzahl m1 Posten zum Returnstack bertragen.
name            ( NAME name -- ptr ) (I) (iP)           F6
                Bringt mit <bl> begrenzten String samt 16-Bit-Zhler nach ptr.
                ptr liegt im Compilezustand beim aktuellen HERE, ist sonst PAD.
ndrop           ( nn n1 .. nx m1 -- nn )                F6
                Anzah m1 Posten vom Stack entfernen oder -m1 Posten zufgen.
ndup            ( nn n1 .. nx m1 -- nn n1 .. nx n1 .. nx ) F6
                Gruppe von +m1 Posten duplizieren, -ve m1 wirkungslos.
new-chan        ( -- c1 | -1 )                          LR
                niedrigste freie F6-Kanalnummer oder -1
nfa             ( pfa -- nfa )
noop            ( -- )
nopdf           ( -- | 0. )                             F6
                Leere {defer}red Definition, fhrt {noop} aus, wird durch Auf-
                ruf { default-is nopdf } auf {0.} gestellt. Das Wort dient der
                Vectorisierbarkeit von Assembler-codierten und mit {c-save} zu
                sichernden Codepassagen. Mehr s.u. beim Assembler-Vocabular.
not             ( n1 -- n2 )
                Einercomplement, entspricht der Negation mit anschlieender Ver-
                minderung um Eins und kann oftmals auch zeitsparend eine solche
                Folge ersetzen. Fr quad-Integer definiert man z.B.:
                        : qnot qminus -1 qm+ ;  ( q1 -- ~q1 )
nr>             ( nn m1 rp: n1..nx -- nn n1..nx )       F6
                Anzahl m1 Posten vom Returnstack holen
nswap           ( nn n1 n2 .. nx-1 nx nm -- nn nx n2 .. nx-1 n1 ) F6
                Mit m1 bezeichneten und oberen Posten im Stack vertauschen.
number          ( ptr -- d1 | f1 | abort ) (D)          (F6)
                Fhrt {[number]} aus, bei Fehler anschlieend {?numerr}.
ni              ( n1 -- n2 )                            H4
                Holt den Schleifenindex der n1-ten nchstueren DO..LOOP.
* O
offset          ( -- ptr )
                User-Vari, hilfsweise zur Festlegung des aktuellen Screenfile.
off             ( ptr -- )                              F83
                Setzt den Integerposten am Ort ptr auf Null.
ok              ( -- )(D)                               79
                Tastatur-Bereitschaftsmeldung, re-vectorisierbar.
open-link       ( ptr did c1 -- d.er )                  F6
                - s. FOP-LINK -
open            ( ptr n1 c1 -- d.er )                   LR
                Kanal ffnen mit dem Namen auf ptr, open-Typ n1, ID an F6-Kanal
                c1 bergeben. Fr den open-Typ gelten die Codes der Qdos-Trap:
                        0       zum Lesen und Schreiben
                        1       nur Lesen, mehrfache Nutzung mglich
                        2       noch unbekanntes File neu einrichten
                        3       File neu einrichten (nur Minerva, TK2 u.dgl.)
                        4       Directory-File ffnen (nur TK2 u.dgl.)
                Wenn der Kanal c1 vorher bereits einen offenen Kanal reprsen-
                tiert, so wird dieser vor der neuen Zuweisung geschlossen.
                Hinweis: {fop-over} bentigt die erweiterte open-Codierung des
                TK2 o.dgl. nicht, da es das File durch die Verbindung {delet}
                mit folgendem {fop-new} erst nach Lschen desselben ffnet.
opt             ( -- ptr )                              F6
                Vari fr globale Freigabe und Sperrung der hi-level-Optimierung,
                jeder von Null verschiedene Wert bewirkt Freigabe.
os              ( -- ptr )                              F6
                User-Vari, vorbereitet fr die Code-Segmentierung
out-cons        ( -- c1 )                               F6
                F6-Kanalnummer des Standard-Ausgabekanals.
out             ( -- ptr ) User-Vari
                ptr auf Zhler der in den Standard-Ausgabekanal geschriebenen
                Zeichen, wird durch {cr} auf Null gesetzt, durch {bs} und {del}
                zurckgezhlt.
over-           ( n1 n2 -- n1 n3 )                      LR
                Zusammenziehung von { over - }, liefert n3 = n2 - n1
over            ( n1 n2 -- n1 n2 n1 )
on              ( ptr -- )                              (F83)
                Setzt den Integerposten am Ort ptr auf 1.
or              ( n1 n2 -- n3 )
                Bitweise OR
or!             ( n1 ptr -- )                           F6
                or-Verknpfung n1 mit dem Speicherinhalt bei ptr.
* P
pad             ( -- ptr )
perform         ( ptr -- exec )                         F6/F79+
                ptr zeigt auf eine cfa, die durch {perform} ausfhrt wird.
pfa             ( nfa -- pfa )
pick-4th        ( -- )                                  F6
                aufrufenden F6-Job aktivieren - PIF erforderlich.
pick            ( nn n1 .. nx m1 -- nn n1 .. nx n1 )    F79
                Copiert den m1-ten Posten zum t.o.s., ab Null zhlend.
prev            ( -- ptr )
prompt          ( c1 -- )                               F6
                emit in den {in-cons}-Kanal, sofern {(prompt)} =/= 0 ist. Ist c1
                nicht offen, geht die Ausgabe in das Ur-Fenster vom Job-Start.
* Q
q#              ( uq1 -- uq2 )                          F6
                Niederwertige Ziffer aus uq1 dem im Aufbau befindlichen Zahlen-
                string bei {hld} voranstellen, Rest als uq2 im Stack. Diese
                quad-Operation entspricht dem standardmigen "sharp", als zeit-
                bestimmender elementarer Aufruf zur Bildung eines Zahlenstring
                im Kern definiert; die restlichen Worte knnen mit { l-load q. }
                aus "forth_scr" geladen werden.
q+-             ( q1 n1 -- q2 )                         F6
                Vorzeichen von n2 auf q1 anwenden
q<              ( q1 -- flg )                           F6
qu<             ( q1 -- flg )                           F6
q0=             ( q1 -- flg )                           F6
q0<             ( q1 -- flg )                           F6
q>f             ( q1 -- f1 )                            F6
qabs            ( q1 -- q2 )                            F6
                Betrag von q1 bilden, die "negative Null" geht als 0 zurck.
q->d            ( q1 -- d1 | abort )                    F6
                kann z.B. definiert werden
                        : q->d 1abs swap 1abs or -18 ?error ;
q->s            ( q1 -- n1 | abort )                    F6
                kann z.B. definiert werden
                        : q->s q->d d->s ;
qdos            Vocabular                               F6
qm/mod          ( +q1 d2 -- q3 d4 )                     F6
                quad q1 durch double d2, liefert quad Rest q3, double Quotient
                d4. Die Ergebnisse sind "floored", werden nach negativ unendlich
                gerundet, wobei fr die Rechnung gilt:
                dividend   /  divisor   =   quotient * divisor + rest
                +ve             +ve             +ve             +ve
                +ve             -ve             -ve             -ve floor
                -ve             -ve             +ve             -ve
                -ve             +ve             -ve             +ve floor
                Bei negativem Quotienten entstehen durch die Rundung nach nega-
                tiv Unendlich fr den Rest gegenber der 'normalen' Rechenweise
                ungewohnte Resultate, die ggf. sich an ein paar Beispielen zu
                veranschaulichen empfohlen wird.
qminus          ( q1 -- -q1 ) negation                  F6
qm+             ( q1 n2 -- q3 )                         F6
                Addition n2 vorzeichenbehaftet zu q1.
qs*             ( q1 n1 -- q2 )                         F6
                quad mit single multiplizieren.
                Basisaufruf zur Umwandlung von Ziffernstrings in quad-Zahlen.
quad            (I) ( -- )                              F6
                Veranlat, da die nchste Zahl im quad-Typen geholt rsp. com-
                piliert wird. Dies ist unabhngig von einer Dezimalmarke und
                gilt nur fr die nchste in Eingabestrom gelesene Zahl. Wurde
                eine der elementaren Proceduren zur Umwandlung von Strings in
                Zahlen aufgerufen, mu dieser Zustand explizit durch {no-quad}
                abgeschaltet werden, im Standardaufruf {[convert]} geschieht
                dies automatisch mit Ausfhrung der {qlit}-Runtime.
                Schreibt man z.B.
                        quad 1000 10 qs*
                entsteht die quad-Zahl
                             10000
                die Deklaration wirkt sich also nur auf die erste Zahl aus.
                Da der Wert fr {dpl} in keinem Falle grer als 64 werden
                kann, wurden neben der Angabe der (Dezimal-)Bruchmarkierung in
                den niederwertigen 8 Bits smtlich gesetzte Bits des hherwerti-
                gen Byte bei stets ungesetztem Bit 7 als quad-Signal gewhlt.
                {dpl@} kann dafr dann Werte von $ff00 bis $ff40 annehmen, die
                von den anderen Mglichkeiten unterscheidbar sind:
                  | dpl@ range: $ff00 $ff41 $ff7f #-2 #-1 #0 33 ;
                        1 CASE? ." quad "    ELSE
                        3 CASE? ." quad ohne punkt & komma " ELSE
                        4 CASE? ." fp-Zahl " ELSE
                        5 CASE? ." Integer " ELSE
                        6 CASE? ." double  " ELSE
                          drop  ." Mll "    ENDIF ENDIF ENDIF ENDIF ENDIF  |
query           ( n1 -- )(D)
                Text aus der Standardeingabe bis <enter> oder max Anzahl n1
                nach t.i.b. holen, unmittelbar danach Anzahl Zeichen in {span}.
                Fehleraktion ist {(exper)} wie fr {expect}, s.dort.
quit            ( -- )
                Der uere Interpreter - sicherer Rckkehrpunkt bei Fehlern.
qxl             (D) ( -- flg )                          8.18
qxl?            ( --  tf | ff )                         8.18
                Vorgabe-Aktion von QXL, Flag = 1 in QXL/SMS-Systemen.
q+              ( q1 q2 -- q3 )                         F6
q-              ( q1 q2 -- q3 )                         F6
q=              ( q1 q2 -- flg )                        F6
* R
r               ( -- n1 ) ( -- f1 )
                Copie des jngsten Posten im Returnstack zum Datenstack.
                Im Forth-Vocabular ist {r} immediate und optimierend.
r/w             ( ptr n1 flg -- )
                bei flg = 0 Anzahl {b/buf} Bytes des Blocks Nummer n1 von ptr
                zum Screenfile schreiben, sonst lesen; eof ist kein Fehler.
r>m             ( ptr m1 rp: nn n1 .. nx -- rp: nn )    F6
                Anzahl m1 Bytes aus dem Returnstack in den Speicher nach ptr
                bertragen, geradzahlig aufgerundete Anzahl vom Returnstack
                entfernen.
range:          ( RANGE: n1 n2 ... nn ; )               F6(!)
                ( RANGE: name n1 n2 ... nn ;
                ( nx RANGE: n1 n2 .. nn ; -- index(nm) mit nm <= nx < nm+1 )
                Definition und Aufrufformen wie {associative:}.
                Aufruf liefert den Listenindex der Position der Zahl, die klei-
                ner oder gleich der bergebenen Zahl ist, sofern die nchste
                Zahl der Liste wenigstens um eins grer ist als jene, oder
                kein weiterer Listenposten folgt. Liegt die Zahl unterhalb des
                niedrigsten Listenposten, geht Null zurck, regulre Indices
                zhlen ab eins:
                        range: rtab 10 20 30 40 ;
                        9    rtab  ( => 0
                        10   rtab  ( => 1
                        39   rtab  ( => 3
                        1234 rtab  ( => 4
             >> executes much the like associative, giving the index of the
                range from the number below or equal to the parameter passed
                till the next higer list item which at least is one greater:
                        index(nn) where lower bound <= nn < next bound
                Returns zero on underflow, and the number of items on ovf.
rdrop           (I) ( -- rp: n1 n2 -- rp: n1 )          F6 & 8.18
                Einen Posten vom Returnstack entfernen.
                { rdrop rdrop } optimierend zum headerlosen Wort {2rdrop}.
recurse         ( -- ) (C)                              (F6)
                Selbstaufruf des in Definition befindlichen Wortes. Compiliert
                zur Sicherheit noch ein {?stack} vor die eigentliche Recursion.
                Ist dies entbehrlich, kann die Recursion leicht auch "von Hand"
                compiliert werden:
                        ... [ latest pfa cfa , ] ...
repeat          ( -- ) (C) ( sys: ptr 1 -- )
roll            ( nn n1 .. nx +m1 -- nn n1+1 .. nx n1 ) - auch fp, dabei m1
                ( nn n1 .. nx -m1 -- nn nx n1 .. nx-1 ) - immer als integer!
                m1-ten posten im Stack zum t.o.s. und alle Posten bis dahin
                eins hochlegen, bei m1 < 0 umgekehrt; Gesamtanzahl unverndert.
                VORSICHT bei FP: Der Posten m1 mu stets als Integer angegeben
                werden, im FP-Format kann es wegen Interpretation des Exponenten
                als Zhler durch Bereichsberschreitung zu blen Fehlern kommen.
root            ( -- )                                  F83
                Vocabular, enthlt nur das Minimum an Worten, das vorhanden
                sein mu, um das System in Betrieb zu nehmen. Neue Definitionen
                sollten hier nur sparsam und berlegt eingefgt werden. Zum ei-
                nen ist {root} quasi der Schlssel zum System, zum andern wird
                es bei erfolgloser Wortsuche zum Schlu unabhngig von der ein-
                gestellten Vocabularordnung immer auch durchsucht. Die im Kern
                vorhandenen 17 Worte fallen nicht merklich ins Gewicht, werden
                aber viele weitere Worte aufgenommen, kann sich die Compilezeit
                deutlich erhhen.
rot             ( n1 n2 n3 -- n2 n3 n1 ) ( f1 f2 f3 -- f2 f3 f1 )
row             ( -- ptr )                              F6
                User-Vari, Zeilenzhler bei der Ausgabe
rp!             ( -- )
                Returnstack mit dem Inhalt von {r0} re-initiieren.
rp@             ( -- ptr )
                Forth-Adresse des Returnstack-Ptr.
r#              ( -- ptr )
                User-Vari, im Editor Cursorposition in der aktuellen Screen.
r+              ( rp: ptr1 -- n1 rp: ptr2 )             F6
                Holt den Integerwert der Stelle, auf die der ptr im Returnstack
                zeigt und zhlt ihn zwei Bytes weiter. Ersetzt:
                        r> dup 2+ >r @
                Hiermit lassen sich Rahmenaufrufe zusammenstellen, hinter denen
                eine Parameterliste compiliert wird, die dann unterschiedliche
                Aktionen innerhalb dieses Rahmens ermglicht.
                Einige Anwendungen finden sich z.B. bei PRINTER in "forth_scr".
                Aufrufe eines ein {r+} enthaltenden Wortes drfen drfen NICHT
                mit aktiviertem DEBUGGER compiliert werden. Zumindest fr den
                Aufruf selbst und die mit ihm zu bergebenden Daten, die durch
                {r+} gelesen werden sollen, mu {db-on} auf Null gestellt sein.
r0              ( -- ptr )
                User-Vari, Initiierungswert fr den Returnstackptr.
r>              ( rp: nn n1 -- n1 rp: nn ) ( rp: nn f1 -- f1 rp: nn )
* S
s->d            ( n1 -- d2 )
                vorzeichenbehaftete Erweiterung
s->q            ( n1 -- q1 )                            nicht vorhanden
                kann leicht gebildet werden aus
                        ( n1 )  s->d ddup  ( q1 )
s-load          ( +n1 S-LOAD filename -- ) (P)          F6
                ( +n1 S-LOAD -- )
                Laden ab Screen n1, n1 > 0, des Screenfile {filename}.
                Das File wird zum mehrfach-Zugriff nur lesend geffnet und bei
                ordentlichem Abschlu geschlossen. Die zweite Variante (ohne
                Filenamen) arbeitet mit dem zuvor benutzten Screenfile, oder
                einem anderen nach (boot) gebrachten Namen. Dies kann zu einer
                der TK2-Devicevorgabe hnlichen Namensvorgabe benutzt werden:
                        ftest flp1_f6asm_scr
                        dup if-true drop ftest flp2_f6asm_scr
                        dup 0= if-true drop (boot) f/n pad !name 1 s-load
                        dup if-true message ;s
                        drop
                Sind diese Zeilen z.B. in scr 1 eines Screenfile eingetragen,
                wird der F6-Assembler entweder von flp1 oder von flp2 geladen.
                War nicht zu finden, bricht das Laden mit Fehlermeldung ab.
            HINWEIS: Falls es Fehler in SMSQ/QXL beim Laden von "win" gibt,
                helfen evtl die bei L-LOAD genannten Manahmen.
s>f             ( n1 -- f1 )                            F6
                Einfache Integer n1 nach fp-Zahl f1
s>m             ( ..nn n1..nx ptr mx -- ..nn )          8.18
                Anzahl mx Bytes vom Stack nach ptr bertragen, anschlieend
                Stackptr ggf. geradzahlig aufgerundet justieren.
safe!           ( -- )                                  F6
                lfa des Wortes am Dictionary-Ende in Fence eintragen, womit
                der gesamte aktuelle Systemaufbau gegen Verlust durch {cold}
                oder {forget} gesichert ist.
scan            ( ptr1 n1 c1 -- ptr2 n2 )               F83
                n1 Bytes langen Text ab ptr1 nach Zeichen c1 absuchen und die
                erste Position ptr2 sowie verbleibende Lnge n2 zurckgeben,
                an der das Zeichen c1 gefunden wurde. Das nchste Vorkommen
                desselben Zeichens findet mann dann z.B. mit
                        $ffff.0001 d+ ( c1 ) scan
                worin die double-Addition eine verkrtzte Form der Sequenz zum
                Weiterrcken auf das nchste Zeichen darstellt:
                        swap 1+ swap 1-
                Die zweite Stelle, die mit einem Zeichen ( c1 ) beginnt, findet
                man dagegen z.B. mit
                        ( ptr1 n1 c1 ) >rr scan r skip r> scan
screen          ( -- c1 )                               F6
                Standard-Kanalnummer fr (das erste) Screenfile.
scr             ( -- ptr )
                User-Vari, lfd. Screenfile-Seite
sdrop           ( n1 n2 -- n2 )                         F6
                F83/ANS auch: nip (oder schluck oder babybrei...)
sdup            ( n1 n2 -- n2 n1 n1 )                   F6
set-baud        ( n1 -- n2 )                            F6
                Setzt die Baud-Rate auf n1 und gibt den bis dahin gltigen
                Wert in n2 zurck, oder nur letzteres bei n1 = -1.
set-cal         ( -- )                                  F6
                Systemeigenen Zeit-Zhler (20ms je Einheit) calibrieren.
set-chan        ( did c1 -- )                           F6
                F6-Kanal c1 mit QDOS-ID did besetzen
set-work        ( did -- )                              F6
                {work}-Kanal mit did  besetzen
sgn             ( n1 -- -1 | 0 | 1 ) ( f1 -- flg )
shift           ( n1 n2 -- n3 n4 )                      (F6)
                n1 um Anzahl +n2 Bits nach links schieben, rsp -n2 Bits nach
                rechts. Resultat in n3 und aus n1 berlaufende Bits in n4;
                auch als vorzeichenlose Multiplikation mit einer Zweierpotenz
                bei Formaterweiterung single nach double interpretierbar.
                Beim Linksschieben kann ( n3 n4 ) als ( dn3 ) als doppeltge-
                naues Ergebnis der vorzeichenlosen Multiplikation der einfachen
                Integer n1 mit der n2-ten Zweierpotenz interpretiert werden.
                Ist n1 mit 1 angegeben, liefert {shift} die Zweierpotenz:
                        : d2^ 1 swap shift ;    ( n1 -- dn2 ( dn2 := 2^n1
sign            ( n1 d2 -- d2 )
                stellt das Vorzeichen entsprechend dem Wert n1 an den Anfang
                des gerade im Aufbau begriffenen Zifferstrings der Zahl d2;
                wird zwischen <# und #> benutzt. Der ausgewertete Integerposten
                n1 wird unabhngig vom bearbeiteten Zahlentyp der dritten Stel-
                le im Stack entnommen und entfernt. Die entsprechende hi-level-
                Definition lautet:
                        : sign rot 0< IF {- hold ENDIF ;
                {sign} ist darum auch fr quad-Zahlen geeignet, sofern nur der
                Flagposten davor an die richtige Stelle gebracht wurde:
                        >rr qabs <q# ... r> -rot sign ... q#>
skip            ( ptr1 n1 c1 -- ptr2 n2 )               F83
                n1 Bytes langen Text ab ptr1 nach Zeichen c1 absuchen und die
                erste Position ptr2 sowie verbleibende Lnge n2 zurckgeben,
                an der das gefundene Zeichen vom Code c1 abweicht - s. {scan}.
sltext          ( c1 -- ) (D)                           F6
                Holt einen mit dem Zeichen c1 begrenzten Text nach {pad}.
                Hilfsweise fr S-LOAD - und damit auch L-LOAD, um die Re-
                Vectorisierung fr letztgenannten Aufruf zu ermglichen.
                Initial mit {\name} besetzt.
smudge          ( -- )
                Freigabezustand der jngsten Definition im current-Vocabular
                umschalten. Nach {create} erforderlich, wenn das Wort auffind-
                bar (und ausfhrbar) gemacht werden soll, oder z.B. bei Fehler-
                abbruch whrend des Compilierens, um {forget} auf das jngste,
                wegen des Fehlers unvollstndige Wort anwenden zu knnen.
source          ( -- ptr n1 )                           F83 & 8.18
                Ort und verfgbare Lnge der aktuell geltenden Eingabe. ptr
                ist t.i.b. bei direkter Eingabe (blk null), ein Blockpuffer im
                Lade-Zustand, rsp die Werte aus {acp} und {acl} bei blk = -1.
sover           ( n1 n2 -- n2 n1 n2 )                   F6
                F83/ANS auch: tuck (doppelt wird dann bonni's ranch daraus(?)
spaces          ( n1 -- )
                Anzahl n1 <bl>s in das Ausgabefenster schreiben.
space           ( -- )
                Ein <bl> in das Ausgabefenster schreiben.
span            ( -- ptr )                              F79/F83
                User-Vari, hat die Lnge des jngsten von {expect} oder {query}
                aufgenommenen String.
sp!             ( -- )
                Datenstack auf den wert aus {s0} re-initiieren.
sp@             ( -- ptr )
                aktueller Stackpointer.
stack           ( STACK abc|aabbcc )( n1 n2 n3 -- n1 n1 n2 n2 n3 n3 ) F6 & FIF
                ( STACK ABC|CBAABC )( d1 d2 d3 -- d3 d2 d1 d1 d2 d3 )
                Anwendung in "f6chg_txt" ausfhrlich beschrieben, hier kurz:
                Universeller Stackoperator fr mit kleinen Buchstaben bezeich-
                nete einfache oder mit Grobuchstaben bezeichnete doppelte
                Integerposten; gemischte Listen gelten wie Kleingeschriebene.
                Die Posten werden in der vor dem "|" angegebenen Reihenfolge
                und Position (der letztgenannte Buchstabe entspricht dem t.o.s)
                dem Stack entnommen und in der danach angegebenen Folge dort
                wieder abgelegt. Die Darstellung entspricht damit genau der in
                der Beschreibung von Forth-Worten (diesem Text) blichen Form.
                Bis zu 26 verschiedene Posten knnen benannt werden, die Listen
                drfen insgesamt 62 Posten enthalten. Dient allein der besseren
                bersicht, konventionell hingeschriebene Stackoperationen werden
                mit wenigen Ausnahmen stets schneller abgearbeitet.
stack:          ( STACK: name srclist|dstlist )         F6 (FIF)
                Frei definierbarer Stackoperator nach dem Muster von {stack},
                mit dem innerhalb der dort genannten Grenzen jede beliebige
                Ablage-Ordnung als besonderer Operator definiert werden kann.
                Z.B., in bestem F83-Stil,
                        stack: nuck abc|cac
                wonach {nuck} dann die F83-Sequenz { nip tuck } ausfhrt, rsp.
                in Standard-Worten { swap drop swap over }.
state@          ( -- flg )                              F6
                Inhalt der Variablen {state}
state           ( -- ptr )                              (F6)
                User-Vari, bestimmt den Systemzustand compilierend oder
                interpretierend, im F6 auerdem den flchtigen compilieren-
                den Zustand zwischen "|"-Zeichen bei der direkten Eingabe.
stk>loc         ( n1 ... nn -- ) ( sys: -- ptr 9 )      F6S
                Auerordentlich schnell ausgefhrte Altternative zum Einrichten
                Localer Variabler bei bergabe smtlicher Daten vom Stack in
                den Local-Bereich.
swap            ( n1 n2 -- n2 n1 )
sysflg          ( -- d1 )                               F6 AQ QX
                Die Zahl d1 liefert in 4 Bytes einige System-Angaben:
                msw msbyte      -1 bei Processoren ab 68010, sonst 0
                    lsbyte      -2 SMSQ, -1 Atari-QL, 1 QDOS vor JS, 0 sonst
                lsw msbyte      Nationalitten-Kennbuchstabe des QDOS
                    lsbyte      -1 Minerva-System, 0 sonst
                Auerdem lassen sich mit Hilfe von {qsys+} einige Eigenheiten
                jngerer qdos-Abkmmlinge ermitteln, u.a.:
                    $a1 qsys+ c@l mit dem Processortypen
                       $0x       68000
                        1x       68010
                        2x       68020
                        3x       68030
                        4x       68040
                     $a7 csys+ c@l gibt Bildschirm- und Rechnertypen an:
                       %xxxxxxx1 Atari mit Blitter oder QL mit Hermes
                        001xxxxx Atari Monochrom
                        010xxxxx Atari E-4 Emulator
                        100xxxxx QVME Emulator-Karte
                        110xxxxx VGA-Bildschirm
                        xxx0000x Atari-ST
                        xxx0001x Atari-ST mit Uhr
                        xxx0011x Atari STE
                        xxx0100x Mega STE
                        xxx0101x GoldCard
                        xxx0110x Super-GC
                        xxx1100x Atari TT
                        xxx1110x QXL
s#              ( -- ) (P)                              F6
                Erwartet die mit <bl> oder <enter> begrenzte Eingabe einer Zahl.
s*              ( d1 n2 -- d3 | ovf )                   F6
s0              ( -- ptr )
                User-Vari mit dem Initiierungswert fr den Datenstackptr.
                Zugleich ggf. Basis der Localen Variablen.
s@              ( c1 -- ) (P)                           H4
                Erwartet einen mit dem Zeichen c1 oder <enter> begrenzten
                String und bringt ihn mit Byte-Count nach {pad}.
* T
task            ( -- )
                Leeres Wort, Colondefinition, markiert das Ende des F6-Kerns.
text            ( c1 -- ptr ) (I) (iP)                  f.i.g.-Editor
                Holt einen mit dem Zeichen c1 oder <enter> begrenzten String
                und gibt die Adresse seines Count-Word zurck. In direkter
                Eingabe wird dafr {pad} benutzt, sonst der Bereich ab {here}.
ti-cal          ( -- d1 )                               F6
                gibt den Kalibrierungswert des F6-Zeitzhlers zurck. Dieser
                entspricht der Anzahl Durchgnge einer im F6-System verankerten
                Zhlroutine innerhalb 50 20ms-Intervallen. Sie ist so aufgebaut,
                da der Processor ggf. nicht in den "loop"-Modus geht, lt aber
                die evtl. vorhandene Cache-Speicherung unberhrt und unbeachtet.
                Die unterschiedliche Ausfhrungstaktung der 68008- gegenber den
                anderen Processorvarianten ist bereits bercksichtigt, die beim
                Atari-QL mglichen besonderen Interruptintervalle jedoch nicht.
                Das Ergebnis ist die effektive Rechnertaktung/sec/10, die Zahl
                dient der Synchronisierung zeitabhngiger Vorgnge; wieweit die
                Taktung tatschlich damit bereinstimmt, hat demgegenber keine
                sonderliche Bedeutung, dieser Wert soll lediglich einen qualita-
                tiven berblick geben. Wegen der Vorgnge beim Jobaufbau des
                SMSQ/E wird die Startmeldung um eine Sekunde verzgert, damit
                sofort der wirkliche Wert zur Verfgung steht.
                Die Anzeige erscheint mit folgenden Faktoren in MHz umgerechnet:
                        ti-cal ( dn ) d* ( - zyklen/sek )
                1.      18.     Standard-QL
                                bei Werten, die nach 3. unter 8 MHz liegen.
                2.       8.     Atari-QL mit 68000, QXL und ab 68010,
                                alle, wo Pos. 3 einen Wert ab 23 MHz ergbe.
                3.      10.     Gold-Card-QL
                                bei Werten ab 8 MHz bis < 23 MHz.
tib             ( -- ptr )
                User-Vari, enthlt den ptr zum "terminal input buffer" - t.i.b.
                Nicht zu verwechseln mit tib des F83 etc. - s. Vergleichsliste.
tib-max         ( -- n1 )                               F6
                Maximal im t.i.b. erlaubte Eingabelnge. Wird nach der ersten
                Eingabe auf 171 reduziert, kann bei Beachtung der Grenze von
                1080 Bytes fr den gemeinsamen Bereich von Returnstack und
                t.i.b. erhht werden durch
                        ( zahl ) ' tib-max 2+ !
                Oder einmalig fr die unmittelbar folgende Eingabe (und damit
                nur im Programmverlauf nutzbar):
                        ( zahl ) is tib-max
                Jeder 4th-Aufruf belegt im Returnstack 2 Bytes, damit ist im
                allgemeinen, insbes. zu Testzwecken mit dem Debugger, der t.i.b
                risikolos auf das Doppelte, meist auch auf das Vierfache erwei-
                terbar, was die Eingabe sehr langer Testsequenzen ermglicht.
tib@            ( -- ptr )                              F6
                Inhalt von {tib}, Anfang des t.i.b.
tick            ( -- d1 )                               F6
                Augenblicklicher Stand des F6-Zeitzhlers in 20ms-Einheiten.
                Mit einem einfachen allgemeinen Aufrufrahmen lt {tick} sich
                sehr gut zur Ermittlung des Zeitbedarfs von Worten verwenden:
                   defer test
                   0. 2variable tnul
                   : ti-test !csp tick 2>r
                                       1000. DO 1000. DO test csp! LOOP LOOP
                                  tick 2r> d- tnul 2@ d-
                                  2dup 20 s* d. ' test @ 2+ nfa id. ;
                Zuerst den Zeitaufwand fr die leere Schleife eintragen:
                   ' noop is test       \ Wort fr die Null-Referenz, oder
                   ' task is test       \ um den hi-level-Kopf auszugleichen
                   ti-test  tnul 2+!    \ Leerdurchgang calibrieren
                Dann ein einfaches Beispiel:
                    : t1 2over 2over ;  \ hi-level fr {4dup}
                    ' t1 is test
                    ti-test
                    ' 4dup is test
                    ti-test
                Nach dem Durchgang erscheint die Zeit in Mikrosekunden fr den
                einzelnen Aufruf und es verbleibt die Anzahl 20ms-Einheiten
                fr den gesamten Test im Stack, z.B. fr die Ermittlung der
                Zeitdifferenz zweier Tests oder zur Ausgabe mit {time$}. Als
                Gedchtnissttze wird auerdem das aufgerufene Wort angezeigt.
tl=             ( dadr1 count1 dadr2 count2 -- flg )    F6
                Stringvergleich mit flg = 0 bei Gleichheit, -1 wenn der String
                bei dadr1 kleiner ist als der bei dadr2, andernfalls 1.
                Beachtung der Schreibweise kann durch Eintragen von -33 in die
                Constante {(upper)} abgeschaltet werden, -1 schaltet sie ein:
                Die Zeichencodes werden mit dem Wert and-verknpft. Da die so
                mglichen Fehler auerhalb der 7-Bit-Schriftzeichenbereiche
                liegen, wurde dieses einfache aber schnelle Verfahren gewhlt.
                Ein Code in {(joker)} gilt fr ein Zeichen im Vergleichsstring,
                das immer als gefunden zhlt, also fr den Vergleich nicht von
                Belang ist. Der ggf. in {(wcard)} eingetragene Code reprsen-
                tiert in gleicher Weise ein Zeichen, das eine ab 1 beliebig
                groe Gruppe beliebiger Zeichen reprsentiert (versuchshalber).
                Der im Sinne dieser Angaben "Vergleichsstring" steht bei dadr2.
                        {+ IS (wcard)
                        " 012345678" pad 100 + over 2+ cmove
                        pad 100 + -count " 01+5+8" -count t=
                gibt 0 fr Gleichheit beider Strings zurck.
to-chan         ( c1 c2 -- )                            F6
                QDOS-ID des F6-Kanals c1 dem F6-Kanal c2 zuweisen.
to-work         ( c1 -- )                               F6
                QDOS-ID des F6-Kanals c1 dem F6-Kanal {work} zuweisen.
toggle          ( ptr c1 -- )
                mit dem Byte c1 an der Stelle ptr eine eOR-Operation ausfhren.
top-nfa         ( ptr -- nfa | 0 )                      F6
                Hilfswort zur Ermittlung der jngsten nfa, die ungeachtet der
                Suchordnung noch im Dictionary-Bereich bis ptr liegt. Liefert
                z.B. in {forget} den Wert fr {last}, und wird neben {safe!}
                u.a. auch in {c-save} und {c-load} bentigt.
                        fence @ top-nfa id.
                zeigt den Namen des letzten vor {forget} geschtzten Wortes an.
traverse        ( ptr1 n1 -- ptr2 )
                Tastet den Speicher ab ptr1 bis zu einem Byte mit gesetztem
                hchstwertigem Bit ab. Richtung und Schrittweite werden mit n1
                dadurch bestimmt, da dieser Wert vor jedem Schritt zu ptr1
                addiert wird. n1 wird blicherweise mit 1 oder -1 angegeben.
type-l          ( dadr count -- )                       F6
                Gibt den count Bytes langen String ab der wirklichen Speicher-
                adresse dadr im Kanal {out-cons} aus. Es gilt 0 < count < 32K.
type            ( ptr count -- )
                Gibt den count Bytes langen String ab der Forth-Adresse ptr
                im Kanal {out-cons} aus. Es gilt 0 < count < 32K.
t=              ( ptr1 count1 ptr2 count2 -- flg )      F6
                Stringvergleich mit Forth-Adressen, sonst wie {tl=}.
* U
u+              ( dn1 un2 -- dn3 )                      c-load mit "f6a80_4th"
                Integer vorzeichenlos zu Double addieren. Ersetzt z.B.
                        : u+ -compile 0 -compile d+ ;   immediate
u/              ( un1 un2 -- un3 )
u/mod           ( un1 un2 -- un3 un4 )
                Division un1 durch un2 mit Rest un3 und Quotient un4
uc<             ( n1 n2 -- flg )                        F6
                Vorzeichenloser Vergleich nur der jeweils niederwertigen Bytes,
                entspricht z.b.
                        ( n1 n2 ) $00ff.00ff 2and <
ud*/mod         ( d1 d2 d3 -- d4 d5 )                   F6
                Multiplikation d1 mit d2 und Division des vierfachgenauen
                Zwischenergebnisses durch d3 liefert Rest d4 und Quotienten d5.
ud.r            ( ud1 n1 -- )
                Zahl ud1 rechtsbndig in Feld der Lnge n1 schreiben.
udm*            ( ud1 ud2 -- uq3 )                      F6
ud*             ( ud1 ud2 -- ud3 )
ud.             ( ud1 -- )
                Dopeltgenaue vorzeichenlose Zahl ud1 hinschreiben.
uq.             ( uq1 -- )                              F6S
                Vierfachgenaue vorzeichenlose Zahl uq1 hinschreiben.
um/mod          ( ud1 un2 -- un3 un4 )
                Vorzeichenlose Division mit Rest un3.
umax            ( un1 un2 -- un3 )
umin            ( un1 un2 -- un3 )
unsmudge        ( -- )                                  C1
                Wortheader zur Vocabularsuche freigeben; in {;does>} enthalten.
until           ( n1 -- ) (C) ( sys: ptr 1 -- )
                Bedingungen werden in derselben Weise optimiert, wie bei {if}.
update-off      ( -- )                                  F6
                Update-Flag des aktuellen Blocks lschen.
update          ( -- )
                aktuellen Block markieren, soda er vor dem berschreiben durch
                einen neuen Block, oder bei {flush}, zurckgeschrieben wird.
uq/mod          ( +q1 d2 -- d3 d4 )                     F6
uqm/mod         ( +q1 ud2 -- ud3 ud4 )                  F6
user            ( -- ptr ) (C) ( nn USER name )        (F6)
                Der Name steht fr eine Variablenart, bei der durch Umstellen
                eines Pointers ein ganzer Datensatz ausgetauscht werden kann.
                Dies ist die 4th-eigene Grundlage zum Multitasking, hnlich,
                wie z.B. auch die Basic-Jobs der Minerva verwaltet werden.
                Dazu sind alle die Systemgestalt bestimmenden Variablen und
                auch einige Aufrufe in diesem Bereich notiert. {up} enthlt den
                Laufptr in diesen Bereich, und {u0} zeigt auf den Anfang. Neue
                Datenposten werden dort mit {user} reserviert und erhalten Platz
                fr eine einfache Integer zugewiesen. Bei greren Posten zhlt
                man anschlieend {up} entsprechend weiter - und beachtet die Be-
                reichsgrenze von 256 Bytes, die vom System nicht berwacht wird!
                nn ist der 16-Bit-Index in den Wertespeicher; bei nn = -1 weist
                das F6-System der neuen Variablen den nchsten freien Index zu.
                        ' dp @ 2- user dp-l
                macht den Langwort-DP zugnglich. Alle {user}-Variablen zeigt:
                        also  forth selected wtyp base words
                        also hidden selected wtyp base words
                               root selected wtyp base words previous previous
using           ( USING filename )(I) (iP)              F83 C1 (lmi)
                filename wird zum Laden/Lesen/Schreiben oder Editieren geffnet
                und die Kanal-ID dem F6-Kanal {screen} zugewiesen. Ein vorher
                offener {screen}-Kanal wird ggf automatisch zuerst geschlossen,
                sofern er nicht in einem weiteren F6-Kanal verzeichnet ist:
                        using flp1_fig_scr      besetzt {screen} mit der ID.
                        using flp1_forth_scr    schliet "fig_scr" und ffnet
                                                erst dann den neuen Kanal.
                        screen file to-chan     {screen}-Kanal zugleich {file}.
                        using flp1_fig_scr      {screen} nun ID von "fig_scr",
                                                {file} weiterhin "forth_scr".
use             ( -- ptr )
                Ptr auf den augenblicklich benutzten Blockpuffer
u*              ( un1 un2 -- ud3 )                      F6
u.              ( un1 -- )
                vorzeichenlose Zahl un1 hinschreiben.
u0              ( -- ptr ) User-Vari
                Initiierungswert fr den Anfang des aktuellen User-Bereichs.
u<              ( un1 un2 -- flg )
up              ( -- ptr )
                User-Vari, hlt den Laufindex in den freien User-Bereich.
* V
variable        ( -- ptr ) (C) ( n1 VARIABLE name )
                Variable im f.i.g.-Forth erwarten einen Initiierungswert!
voc-link        ( -- ptr )
                User-Vari, Vocabularverkettung
vocabulary      ( -- ) (C) ( VOCABULARY name )
                wird im f.i.g.-Forth konventionell stets immediate deklariert.
                Mit seinem Aufruf wird das Vocabular {context}, das vorherige
                {context}-Vocabular wird in der Suchfolge eins weitergeschoben,
                wobei das bisherige zweite Vocabular daraus verschwindet. Es
                kann vorher durch {also} an den gesicherten Bereich bergeben
                werden, wo es dann solange bleibt, wie es nicht durch {only}
                zusammen mit allen anderen gelscht wird, oder es nach einer
                Anzahl {#vocs} Aufrufen von {also} auch dort hinausfllt.
                Entsprechend dem Vorgehen im f.i.g.-Forth werden Vocabulare im
                F6 wie alle neuen Worte dem CURRENT-Vocabular zugeordnet, soda
                Untervocabulare in beliebiger Schachtelungstiefe gebildet werden
                knnen, die nur aus ihrem unmittelbar bergeordneten Vocabular
                heraus zugnglich sind. Ein Beispiel mit {pif} aus {qdos}:
                        ONLY FORH PIF FORTH
                bricht bei PIF mit Fehlermeldung ab,
                        ONLY FORTH QDOS PIF FORTH
                legt die Suchfolge an
                        FORTH PIF
                Die eingeprgte secundre Suchfolge wird unabhngig von ihrem
                Freigabemodus initial auf das CURRENT-Vocabular eingestellt.
                Wird ein Vocabular mit {forget} o.. entfernt, ist anschlieend
                FORTH das CURRENT-Vocabular. War das Vocabular auch CONTEXT, so
                ist dann das Definitionsvocabular unbestimmt, es mu bei Bedarf
                neu angegeben werden.
                FP-Untervocabulare bernehmen die fp-Zahlen compilierende Eigen-
                schaft und reichen diese an ihre Untervocabulare weiter. Bei den
                im Screenfile gegebenen {turtle}-Aufrufen wirkt sich zustzlich
                eine Sicherheitsfunktion der Untervocabulareigenschaft aus:
                {turtle} als {fp}-Vocabular kann nur danach aufgerufen werden,
                was unbersehbar darauf aufmerksam macht, da die Graphikaufrufe
                fp-Zahlen in der Stackbergabe erfordern, und womit automatisch
                dafr Sorge getragen ist, da dieses Vocabular auch wirklich ak-
                tiviert wurde.
* W
<with           ( -- ) (C) ( <WITH name -- )            F6(!)
                Eine Ergnzung, die es erlaubt, gemeinsam mit seiner Bildungs-
                auch die Ausfhrungsvorschrift eines Definitionswortes weiter-
                zugeben. Die hierzu notwendigen Systemergnzungen knnen auch
                als hi-level-Code anderen Forth-Compilern mitgegeben werden.
                Eine Beispielkette dazu findet sich in "forth_scr".
                        : name <WITH cplname ... ;DOES> ... ;
                Darin kann cplname jedes beliebige Wort sein, das einen Namen
                holt und damit einen neuen Wortheader anlegt, egal, ob es die
                Definition mit <BUILDS oder mit CREATE aufbaut. In jedem Fall
                aber mu der Ausfhrungsteil mit ;DOES> oder ;CDOES> eingelei-
                tet werden - das standardmige f.i.g.-DOES> kann eine solche
                "vollstndige Erbfolge" nicht weiterreichen.
                        ' task dds !
                Nach Festlegen des Ur-Zustandes
                        : name0 <WITH <BUILDS ... ;DOES> ... ;
                gleichermaen auch
                        : name0 <WITH CREATE ... ;DOES> ... ;
                bildet man nun, nachdem {name0} wenigstens einmal benutzt wurde,
                ein weiteres Definitionswort, das seinerseits mit {name0} seine
                Definitionsphase einleitet,
                        : name1 <WITH name0 ... ;DOES> ... ;
                so verleiht dieser Aufbau den damit erzeugten Worten die Daten-
                struktur von name0 und die von name1 im Anschlu; beim Aufruf
                werden die Ausfhrungsteile zuerst von name0 und dann von name1
                durchlaufen. Um die Folge zu sichern, mu vor Bildung eines De-
                finitionswortes die Vorgngerdefinition einmal benutzt worden
                sein; wurden zwischendurch andere Definitionsworte gebildet, ist
                dies zu wiederholen. Das Probe-Wort kann sofort mit {forget}
                entfernt werden. Die Reihenfolge kann auch mitten in einer Kette
                aufgespalten werden, dazu braucht diese Procedur nur mit dem De-
                fionitionswort an der Abzweigstelle durchgefhrt zu werden. Was
                u.U. auch dann notwendig wird, wenn ein "fremdes" fortpflanzugs-
                fhiges {;does>} aufgerufen oder in ein Wort eingebaut wurde.
                Den definierten Ausgangszustend ohne Vorgnger schafft man mit
                        ' task dds !
                {<with} revectorisiert {;does>}. Solange der Vorgabeposten auf
                der pfa+2 unverndert bleibt, stellt {;does>} sich automatisch
                mit dem Aufruf sofort wieder auf die Standarddefinition zurck.
w-find          ( ptr1 -- ptr2 c3 flg | 0 )             F6
                Wenn ptr1 auf einen 4th- oder qdos-String zeigt, der einen
                in der aktuellen Suchfolge bekannten Namen enthlt, gehen pfa,
                count- u. Typenbyte mit flg = 1 zurck, sonst nur Null.
                {w-find} arbeitet identisch {-find}, es ermglicht aber neben
                dem direkten Aufruf vor allem auch den Einbau in ein Wort, ohne
                da der Aufruf, den es zu finden gilt, schon bekannt sein mu.
                Auerdem dient es innerhalb eines {c-save}-Blocks dem Aufruf von
                dort definierten Worten durch andere Worte in diesem Block, was
                sonst wegen der fehlenden Relocationsmglichkeit unzulssig ist.
w-forget        ( n1 -- )                               F6
                Wie {forget}, wenn n1 eine bekannte pfa ist, sonst keine Aktion,
                auch kein Fehlerabbruch.
w-save          ( W-SAVE filename ) (iP)                F6
                Sichert das F6-System in seinem aktuellen Zustand einschlielich
                der ueren Fensterabmessungen. Wird filename als Job gestartet,
                befindet sich das System im Forth-Vocabular, ist ansonsten mit
                dem Zustand, in dem es gsichert wurde, identisch.
warning         ( -- ptr )
                User-Vari mit einer Markierung zur Art der Fehlermeldungen.
warm            ( -- )
                Der Aufruf springt unmittelbar in die in Processorcode formu-
                lierte Initiierungsroutine zu der ein bis zu 4 Bytes lang co-
                dierter Sprung an der Stelle { 4 +origin } verzeichnet ist.
                Initial mit einem Warmstart besetzt, der die Systemdaten in
                definierten Zustand bringt, die i/o-Wartezeit auf -1 stellt
                und nach {quit} zurckkehrt. Der Datenstack bleibt erhalten.
wd-size         ( c1 -- ny nx nh nw tf | ff )           F6
                ff wenn c1 keinen Fensterkanal reprsentiert, sonst Fensterdaten
                Ursprung ny oben, nx links, Mae nw breit, nh hoch, tf gibt die
                Cursorbreite an; alles in Pixelmaen. In compilierter Form kann
                anschlieend mit {l<i} auch die Zeichenhhe gelesen werden.
while           ( n1 -- ) (C) ( sys: ptr 1 -- sys: ptr 4 )
                Bedingungen werden in derselben Weise optimiert, wie bei {if}.
                        BEGIN .. .. cc WHILE .. .. REPEAT
                Zulssige Variante im F6 auch
                        BEGIN .. .. cc WHILE .. .. cc UNTIL
width           ( -- ptr )
                User-Vari zur Lngenbegrenzung beim Compilieren von Wortnamen.
                Im F6 mglichst nicht kleiner als die grte benutzte Lnge zu
                setzen, dies wrde das Compilieren wesentlich verlangsamen, und
                als Preis fr die durch etwas genderten Namensvergleich enorm
                beschleunigte Wortsuche leider auch mitunter zu Fehlern fhren.
window          ( ny nx nh nw -- )                      F6
                Das mit {work} identifizierte Fenster mit den angegebenen Maen
                versehen, ohne border; Mae s. {wd-size}.
within?         ( n1 n2 n3 -- flg )                     F83
                flg = 1 wenn n2 <= n1 < n3
within          ( n1 n2 n3 -- n4 )                      F6
                justiert n1 auf den mit n2 und n3 (je einschlielich) begrenzten
                Bereich und liefert das Resultat als n4 zum Stack
wmov            ( c1 -- )                               F6
                Durch Bettigung der Cursortasten Verlagerung und nderung
                der Abmessungen des mit c1 identifizierten Fensters. Ist c1
                das Hauptfenster, und sind weitere Fenster offen, werden diese
                soweit mglich mitgenommen und ggf. in den Maen angepasst.
work-id         ( -- did )                              F6
                QDOS-ID des {work}-Kanals.
work-num        ( -- c1 )                               F6
                Hchste F6-Kanalnummer mit der QDOS-ID des {work}-Kanals.
word            ( c1 -- )
                mit dem Zeichen c1 begrenzten String aus dem Eingabestrom
                isolieren und mit fhrendem Countbyte nach {here} bringen.
                Bei c1 =<bl> gilt zum Ende hin auer der <nul> auch jedes
                andere Zeichen mit ASCII-Code < 32 als Textbegrenzung.
            >>> isolates a char (c1) enclosed countiguous text segment from the
                input stream, if c1=<bl> any character code =/= 0 and below 32
                will also be recognized as an end-delimiter.
work            ( -- c1 )                               F6 C1
                Arbeitskanal fr alle QDOS-Operationen, durch {to-work} knnen
                ihm beliebige andere Kanle zugewiesen werden (s. {set-work}).
                Standardkanal fr ausnahmslos alle i/o-Operationen des {qdos}-
                Vocabulars mit den Untervocabularen {pif} u. {minerva}.
                Auerdem Ziel fr die ID aus den open-Varianten.
wraps           ( n1 n2 n3 -- n4 )                      F6
                justiert wie {within}, setzt n4 jedoch bei berlauf auf die
                jeweils am anderen Ende gelegene Grenze.
wrds            ( -- )                                  F6S
                Leerer Operator fr {selected} zu WORDS aus "forth_scr"
wtyp            ( -- )                                  F6S
                Operator fr {selected} zu WORDS, der fr die Auswahl nach
                dem Typen eines danach anzugebenden Wortes sorgt:
                        forth selected wtyp base hidden words
                zeigt z.B. alle User-Variablen des {hidden}-Vocabulars an.
w=              ( ptr1 count ptr2 -- flg )             (F6)
                Standard-Stringvergleich identisch {-text} des f.i.g.-Editors,
                Vergleicht den String auf ptr1 der Lnge count mit dem bei ptr1.
w@              ( c1 -- ) (P)                           F6
                Holt einen String begrenzt mit dem Zeichen c1 oder durch
                <enter> aus der Eingabe und legt ihn mit count-word nach {pad}.
* X
xor             ( n1 n2 -- n3 )
                setzt n3 bitweise auf 1, wenn die entsprechenden Bits in n1
                und n2 ungleich sind, sonst auf 0.
xor!            ( n1 ptr -- )                           F6
                xor-Verknpfung n1 mit dem Speicherinhalt bei ptr.
* [ etc.
[compile]       ( -- ) (C) ( [COMPILE] name )
                "immediate" Worte werden durch Voranstellen von {[compile]}
                mit ihrer cfa compiliert wie gewhnliche Forth-Worte.
[fop]           ( n1 ptr2 -- derr ) (D)                 F6      8.16 => hidden
                Die zentrale Aktion aller {fop..}-Aufrufe. Ihr werden open-
                Typ n1 und ptr2 als ptr zum qdos-String des Filenamen im Stack
                bergeben, und sie mu den Fehlercode als double zurckgeben.
                Als "open-Code" gelten die D3-Werte fr die Qdos-Trap:
                        0       zum Lesen und Schreiben
                        1       nur Lesen, mehrfache Nutzung mglich
                        2       noch unbekanntes File neu einrichten
                        3  nur Minerva (und TK2): File neu einrichten
                        4  nur TK2 u.dgl.       : Directory-File ffnen
                {[fop]} ist deferred eingerichtet, und ermglicht damit etwa die
                automatische Gertevorgabe, durch die z.B. beim TK2 die fehlende
                Laufwerksbezeichnung ggf. nachgetragen wird. Gerade das fehlt im
                F6, um z.B. Irrlufer der Art "flp1_mdv2_.." zu vermeiden. Die
                Devicevorgabe nach TK2-Manier ist in "forth_scr" so beschrieben,
                da sie unabhngig vom TK2 nachgetragen und benutzt werden kann.
                Fr die Kanalverkettung z.B. zwischen PIPEs durch bergabe der
                ID als open-Code sind {open-link} rsp. {fop-link} vorgesehen.
[number]        ( ptr -- d1 ff | f1 ff | 1 ) (D)       (F6)
                Wie {number}, jedoch kein Abbruch bei einem Umwandlungsfehler.
                ptr zeigt auf das count-Byte eines aus Ziffernzeichen bestehen-
                den und mit wenigstens einem <bl> abgeschlossenen String. Das
                count-Byte wird nicht gelesen, bei (Teil-)Strings ohne Zhler
                wird darum einfach die Position vor dem Anfang als ptr angege-
                ben. Auer den ggf. durch {base} eingegrenzten gltigen Ziffern
                darf der String die Zeichen "," oder "." und am Anfang auch ein
                Zahlen-Affix enthalten. Bei fp-Zahlen sind zustzlich das "%"
                am Ende und ein "E" ggf. vor dem Exponenten zulssig und das
                abschlieende Leerzeichen ist nicht erforderlich.
                Werden diese Bedingungen nicht eingehalten, gibt der Aufruf
                den Flagwert 1 zurck, sonst die ermittelte doppelte Integer
                rsp. eine fp-Zahl. Der Zahlentyp steht in {dpl} - s.dort.
\name           ( c1 -- ) (P)                           F6 (C1)
                Holt einen mit <enter> oder dem Zeichen c1 begrenzten String
                mit word-Count nach {pad}.
\.              ( f1 -- )                               F6
                Zahl f1 unabhngig von {context} als fp-Zahl hinschreiben.
"               ( -- ptr ) (C) ( " text... ..ende" ) (iP)
                Einen mit " oder <enter> begrenzten String compilieren, beim
                Aufruf wird der ptr auf das Count-word zurckgegeben.
                " legt im interpretierenden Zustand den String nach {pad}
                und liefert sofort die Adresse zum Stack.
'               ( ' name -- pfa | abort ) (I)           "tick" - state sensitiv
                Im Unterschied zu spteren Standards holt das f.i.g.-"tick" die
                PFA von {name} als literal, dementsprechend ist es immediate und
                hat im Compile-Zustand selbst compilierende Funktion. Soll ein
                damit gebautes Wort spter eine pfa holen, ist [compile] voran-
                zustellen. Interpretierend liefert es die pfa in den Stack.
                HINWEIS: Das "tick" spterer Standards ist nicht immediate und
                holt mit der CFA die 4th-Adresse, die den ptr auf den den Wort-
                typ bestimmenden direkt ausfhrbaren Codeteil enthlt.
(               ( -- ) (I)
                Kommentar-Klammer, der folgende Text bleibt bis zum Zeilenende,
                einem <enter> oder der nchsten rechten Klammer unbeachtet.
*               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )         (fp: QDOS)
+               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )         (fp: QDOS)
,               ( n1 -- )
                16-Bit-Wert n1 in das Dictionary eintragen, Dictionary-Ptr
                um zwei Bytes weiterzhlen.
,,              ( dn1 -- )
                double {,}.
-               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )
.               ( n1 -- ) ( f1 -- )
                vorzeichenbehaftete Integer n1 oder fp-Zahl f1 hinschreiben.
/               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )
?               ( ptr -- )
                Inhalt der Speicherzelle ptr hinschreiben.
i               ( -- n1 )
                inneren Index einer DO..LOOP holen.
j               ( -- n1 )
                Index der ersten umgebenden DO..LOOP holen.
                Fr die weiteren Ebenen s. {ni}.
[               ( -- ) (I)
                Interpret-Klammer, bergang in den interpretierenden Zustand.
                Mit abschlieender Compile-Klammer {]} auch innerhalb einer
                Wort-Definition anwendbar, z.B. fr die Ermittlung von Fest-
                werten, die in das Wort eingebaut werden sollen. Der System-
                zustand unterscheidet sich dann in keiner Weise vom interpre-
                tierenden Zustand auerhalb einer Wort-Definition.
|               ( -- ) (I)                              F6
                Dieses Hilfsmittel zum Ausprobieren beliebiger Wortfolgen
                leitet den flchtigen Compile-Zustand ein rsp. schliet ihn ab.
                Eine im interpretierenden Zustand in "|" eingefate Sequenz
                wird compiliert, sofort ausgefhrt und unmittelbar danach wie-
                der freigegeben. Damit sind neben durch die Compilezeit unbe-
                lasteten genauen Zeitmessungen vor allem auch Strukturworte in
                direkter Eingabe ausfhrbar:
                        | tick 2>r 1000. DO 1000. DO LOOP LOOP tick 2r> d- d. |
                wre sonst nur als Wortdefinition mglich.
                Und ein Probeaufruf z.B. mit
                        bl word here count type probetext
                liefert immer nur den Text "type" und einen Fehler, wogegen
                        | bl word here count type | probetext
                das mit einer Colon-Definition vergleichbare Ergebnis zeigt,
                womit so mancher Versuch berhaupt erst durchfhrbar wird.
                {here} und damit auch {pad} liegen fr die Dauer der Ausfhrung
                einer solchen Wortfolge entsprechend hher, vorher nach {pad}
                bertragene Daten mssen also ggf. mit der zu jenem Zeitpunkt
                gltigen Adresse in diese Aufrufe bergeben werden.
                Auch Einzelschrittbetrieb ist mit diesen Sequenzen mglich.
                Die Compile- & Interpret-Klammern haben gegenber {|} Vorrang
                und drfen nicht gemeinsam damit verwandt werden.
\               ( -- )                                  F83
                Text nach dem "\" bleibt bis zum Ende der Zeile unbeachtet.
                Dient nur der Compatibilitt, da "(" aufgrund der Tatsache,
                da im F6 Block- und Zeilenlnge gleich sind, dasselbe leistet.
]               ( -- )
                Compile-Klammer, zum bergang in den compilierenden Zustand.


* FP-Vocabular
Fliekommazahlen sind im Forth zumeist berflssig, da das Standardvocabular
die Scalierungsoperatoren mit jeweils doppeltgenauem innerem Zwischenergebnis
hat. Auch ist die Arbeit damit zumeist entschieden langsamer. Sie lassen sich
jedoch oft einfacher handhaben, und weil sie im QDOS auerordentlich leicht
zugnglich sind, wurden ihre Operationen in einem eigenen Vocabular angegeben.
Die Genauigkeit ist allerdings mit nur neun Dezimalstellen recht gering, und so
werden in vielen Fllen die vierfachgenauen Integer vorzuziehen sein, die trotz
(dezimal) 18-stelliger Genauigkeit noch deutlich schneller verarbeitet werden.

Ist dieses Vocabular oder eines seiner Abkmmlinge CONTEXT, so werden Zahlen im
QDOS-Fliekommaformat erzeugt, fr Integer stellt man ein Basis-Praefix voran.
Die fp-Zahlen-erzeugende Eigenschaft ist im 11-ten Byte der Vocabulardefinition
festgelegt. Etwa mit { ' vocname 11 + $80 toggle } kann sie gesperrt oder frei-
gegeben werden - was ohne Ausnahme fr alle Vocabulare gilt.

Die Operationen mit bereits in FORTH-Vocabular aufgefhrten Namen haben auer
der Tatsache, da sie mit Fliekommazahlen im QDOS-Format arbeiten, dieselbe
Funktion wie dort. ber die Stackdarstellung hinaus werden sie darum hier nicht
erneut beschrieben. Flags haben Integer-Format. Die mit QDOS-Namen belegten und
"Q" markierten Worte rufen den Rechner-Vector des Betriebssystems auf, alle an-
deren sind vollstndig in mglichst optimaler Form im F6 codiert. Die Operatoren
zur Umwandlung von FP nach Integer und umgekehrt gehren zum Forth-Vocabular und
sind hier nur der bersicht halber mit aufgefhrt. Sie enthalten ebenfalls keine
QDOS-Aufrufe.

Im allgemeinen lassen sich die fp-Operationen auf beliebige Datenkonstellationen
anwenden. Um jedoch Fehler des QDOS abzufangen, die oft in Endlosschleifen enden
knnen, wird in einigen Fllen das hherwertige Exponentenbyte (entsprechend dem
hchstwertigen Stack- oder Speicherbyte) mit %00001111 AND-verknpft und grenzt
den Exponenten damit auf zulssige Werte ein. Allgemeine Datenposten werden dann
u.U. verflscht. Die betr. Operationen sind:
        Q                       alle hier als QDOS-Operationen markierten
                                Aufrufe haben am Ende(!) diese Maskierung,
                                um z.B. (versehentliche) Ausgabeversuche
                                nach einem Fehler abzusichern.
        ri-exec                 Vectoraufruf entsprechend den Q-Operationen.
        constant                bei der Werte-bergabe zum Stack.
        2*
        2/
        $>f                     (forth)
        [number]                (forth)
Dagegen kann {flit}, das diese Kontrolle nicht enthlt, und auch {dpl} unberhrt
lt, zuverlssig beliebige Dreifachposten compilieren. -2 in {dpl} signalisiert
fp-Posten bei reinen Zahlenwerten, {constant}en und nach {2*} sowie {2/}.

*               ( f1 f2 -- f3 )         Multiplikation          Q
+               ( f1 f2 -- f3 )         Addition                Q
-               ( f1 f2 -- f3 )         Subtraktion             Q
.               ( f1 -- )               Zahl hinschreiben      (Q)
*/              ( f1 f2 f3 -- f4 )      Verkettung f1*f2/f3     Q
+-              ( f1 n1 -- f2 )
-rot            ( f1 f2 f3 -- f3 f1 f2 )
-1      -2      Cons, mit -2 in {dpl}.
0<              ( f1 -- flg )
0=              ( f1 -- flg )
0>              ( f1 -- flg )
1/2     1/4     Cons, mit -2 in {dpl}.
2swap           ( f1 f2 f3 f4 -- f3 f4 f1 f2 )
2*              ( f1 -- f1*2 )          schnelle Verdopplung, setzt dpl := -2
2/              ( f1 -- f1/2 )          dto., Halbierung
>r              ( f1 -- rp: f1 )
>               ( f1 f2 -- flg )
<               ( f1 f2 -- flg )
abs             ( f1 -- f2 )            Betrag bilden           Q
acos            ( f1 -- f2 )            arcus cosinus           Q
acot            ( f1 -- f2 )            arcus tangens           Q
asin            ( f1 -- f2 )            arcus sinus             Q
atan            ( f1 -- f2 )            arcus tangens           Q
cmp             ( f1 f2 -- flg )        flg aus { f1 f2 - sgn }
constant        ( -- f1 ) (C) ( f1 CONSTANT name )
                Abweichend von den anderen {constant}-Definitionen wird mit dem
                Aufruf {dpl} besetzt, wo der Wert -2 eine fp-Zahl kennzeichnet.
                ' name liefert mit dem Parameterfeld den Ort, an dem der fp-Wert
                gespeichert ist, die pfa kann also wie der ptr einer Variablen
                verwandt werden; auerdem ist IS anwendbar.
cos             ( f1 -- f2 )            cosinus                 Q
cot             ( f1 -- f2 )            cotangens               Q
d>f             ( d1 -- f2 )(f)
                Double in fp-Zahl umrechnen, entspricht {float}, ist schneller.
drop            ( f1 -- )
dup             ( f1 -- f1 f1 )
exp             ( f1 f2 -- f3 )         exponentialfunktion     Q
f>d             ( f1 -- d1 )(f)         entsprechend {nlint}.
f>q             ( f1 -- q1 )(f)         quad, sonst wie {f>d}
float           ( n1 -- f1 )            Integer nach fp         Q
int             ( f1 -- n1 )            fp gekappt nach Integer Q
literal         ( -- f1 ) (C) ( f1 -- )
log10           ( f1 -- f2 )            log zur Basis 10        Q
ln              ( f1 -- f2 )            natrlicher logarithmus Q
neg             ( f1 -- f2 )            Negation                Q
nint            ( f1 -- n1 )            fp zur nchsten Integer gerundet  Q
nlint           ( f1 -- d1 )            fp zur nchsten doppelten Integer Q
                {f>d} ist schneller und vermeidet qdos/TK2-Fehler ab f1 > 2^29.
over            ( f1 f2 -- f1 f2 f1 )
pick            ( fn f1 .. fx m1 -- fn f1 .. fx fm )
pi              Cons, mit -2 in {dpl}.
q>f             ( q1 -- f2 )(f)         Quad nach fp.
ri-exec         ( +opcode -- ergebnis ) oder ( progptr variptr -nn -- ergebnis )
                Wird irgendeine negative Zahl als opcode angegeben, leitet dies
                einen QDOS-Rechneraufruf ein, der eine ab progptr codierte Fol-
                ge Rechenoperationen ausfhrt, zugleich mu dann auch variptr
                fr den in diesem Vectoraufruf verwalteten Variablenbereich an-
                gegeben sein. Die Codierung ist den einschlgigen QDOS-Dokumen-
                ten zu entnehmen (z.B. PiQ).
roll            {pick} und aufrcken in die copierte Position,
                negative Postennummer fr Rotieren in umgekehrter Richtung.
rot             ( f1 f2 f3 -- f2 f3 f1 ) entspricht { 2 roll }
r>              ( rp: f1 -- f1 rp: -- )
s>f             ( n1 -- f1 )(f)
                Einfache integer nach fp.
sin             ( f1 -- f2 )            sinus                   Q
sgn             ( f1 -- n1 )            n1=0 bei f1=0, sonst n1=f1/abs(f1)
sqrt            ( f1 -- f2 )            Wurzel                  Q
swap            ( f1 f2 -- f2 f1 )
tan             ( f1 -- f2 )            tangens                 Q
!               ( f1 ptr -- )
!l              ( f1 dadr -- )
/               ( f1 f2 -- f3 )         Division                Q
0  1  2  3      Cons, mit -2 in {dpl}.
=               ( f1 f2 -- flg )
@               ( ptr -- f1 )
@!              ( ptr1 ptr2 -- )        bertragung eines fp-Wertes
@l              ( dadr -- f1 )
^               ( f1 f2 -- f3 )         Potenzierung            Q


* EDITOR-Vocabular (das vollstndige Vocabular kommt mit "fig_scr")
Bei den hier genannten Worten zum Textvergleich wird zwischen Nichtbeachtung und
Beachtung der Schreibweise mittels der Constanten (upper) unterschieden, mit der
die einzelnen Zeichen vor dem Vergleich AND-verknpft werden.
Bei -1 hat (upper) keinen Einflu, bei 127 wird das hchstwertige Bit ausgeblen-
det, soda nur der einfache ASCII-Zeichensatz in den Vergleich eingeht und auch
die Markierungen der Wortnamen ohne Einflu bleiben, -33 dient durch Ausblenden
des Bit 5 (mit Nebeneffekten!) dem von der Schreibweise unabhngigen Vergleich.

flush           ( -- )
                Augenblicklich alle {update}-markierten Blcke sichern.
match           ( ptr1 n1 ptr2 n2 -- flg n3 )           f.i.g.-Editor
                Suche des Strings der Lnge n2 ab ptr2 im Bereich der Lnge n1
                ab ptr1. Bei Erfolg Rckgabe flg = 1 und Abstand n3 zu ptr1
                als der ersten Speicherstelle NACH dem gefundenen Text, sonst
                gehen flg = 0 und n3 mit dem Wert von n1 zurck.
                Entsprechendes an wirklichen Speicheradressen s.u. {s==}.
s=              ( n1 dadr1 n2 dadr2 -- flg )            F6
                Vergleich, flg = 1 wenn der String der Lnge n2 am Ort dadr1 im
                Speicher auf dadr2 vorhanden ist. n1 ist Code eines Zeichens,
                das immer als gefunden gilt und unbekannte Posten ersetzen kann.
                Soll kein "Joker"-Zeichen gelten, bergibt man n1 mit -1.
s==             ( n0 dadr1 n1 dadr2 n2 -- flg n3 )
                Stringsuche im Bereich der Lnge n2 ab dadr2 nach dem String auf
                dadr1 der Lnge n1 auf wirklichen Speicheradressen und mit einem
                Joker-Code in n0 (oder -1). n3 wie bei {match}.
text            ( c1 -- ptr )
                steht im Forth-Vocabular


* ROOT-Vocabular
Kann als einziges Vocabular nicht von der Suchfolge ausgeschlossen werden.
Hier sind darum die Worte definiert, die den Systemzugriff bestimmen, und
solche, die stets verfgbar sein mssen, rsp. deren von der brigen Voca-
bular-Konstellation unabhngiges Vorhandensein zweckmig ist.

2nd-voc         ( -- ptr )                              F6
                Vari, =/= 0 gibt Vocabular-spezifische Folge-Vocabulare frei.
                Im Vorgabezustand ist die secundre Suchfolge gesperrt.
also            ( -- ) (I)                              F83 modifiziert
                Schiebt die Suchfolge eins "hoch", d.h., der Vorgnger-CONTEXT
                wird in die gesicherte Suchfolge eingereiht und das aktuelle
                CONTEXT-Vocabular an zweite Position im Vocabularstack copiert.
                Die Behandlung des Vocabularstacks weicht im F6 etwas vom F83-
                Vorbild ab, vor allem zur Vereinbarkeit mit dem f.i.g.-Modell:
                Der Vocabularstack umfat zwei Bereiche, von denen der erste mit
                den jngsten zwei Posten vom zweiten miterfat wird.
                Der mit {also} gesicherte Bereich beginnt erst beim dritten in
                Folge aufgerufenen Vocabular, die beiden "unteren" Vocabulare
                werden in einem eigenen zweistufigen Stack mit jedem Aufruf au-
                tomatisch um einen Posten weitergeschoben, es sind also stets
                die beiden jngst aufgerufenen Vocabulare verfgbar. Der jeweis
                zweite Vorgnger fllt aus der Suchordnung hinaus.
                {also} schiebt smtliche Vocabulare eine Position 'hher', so-
                da dann das zweite Vocabular an dritte Position gelangt, wo es
                nicht mehr durch einen neuen Vocabularaufruf verschwinden kann.
                Die jngste Vocabulareintragung wird dupliziert, soda nun Platz
                fr ein danach genanntes Vocabular frei wird, um welches sich
                die Suchordnung dann erweitert.
                Mehrere {also} nacheinander bewirken gewhnlich nichts anderes,
                als da das jngste Vocabular von den {find}-Varianten entspre-
                chend oft durchsucht wird und sich die Compilezeit dadurch ohne
                jeden Nutzeffekt ganz enorm erhht. Im F6 wird dergleichen durch
                eine Markierung unterbunden, die whrend der Worsuche besetzt
                und verarbeitet wird. Gleichgltig, wie oft ein Vocabular in der
                Suchfolge erscheint, wird es nur einmal durchsucht, soda die
                Compilezeit von Mehrfacheintragungen unbeeinflut bleibt.
                Der erste, flchtige, Teilstack erlaubt es, die im f.i.g.-Forth
                bliche bertragung des Definitionsvocabulars in die Suchordnung
                zu bernehmen und gleichzeitig den vorher eingestellten Posten
                verfgbar zu halten, ohne da sie dadurch peu a peu am Ende
                ganz aus solchen Eintragungen besteht, da der Bereich oberhalb
                der beiden jngsten Posten unverndert bleibt.
                Das wre z.B. auch durch die {state}-abhngige Miterfassung des
                Current-Vocabulars (und bei der gewhlten Datenanordnung im 4th-
                Speicher eher besser) mglich; die Verfahrensweise resultiert
                aus anfnglichen Versuchen und, den mglichen Nutzen betrachtet,
                es lohnt deren nderung den Aufwand nicht. In der aktuellen Form
                gilt die bertragung NUR bei Colon-Definitionen - was durch die
                Auswertung von {state} allein ohnehin nicht zu erreichen wre.
                Ausfhrliche Beschreibung in "F6CHG_txt" rsp. "FORTH_txt".
asm68           ( -- )                                  F6
                Vocabular, initial dem Aufruf {assembler} zugewiesen
assembler       ( -- ) (D)(I)
                Deferred, vorgesehen fr unterschiedliche Assembler-Vocabulare.
blk+            ( -- n1 )                               F6
                n1 = -1 bei direkter Eingabe in t.i.b., 0 bei neuem Screenfile
                oder eine Zahl > 0 fr die nchste Blocknummer im Screenfile.
bye             ( -- )
                Verlassen des Forth-Systems, der F6-Job wird aufgegeben.
definitions     ( -- )
                Macht den CONTEXT zum CURRENT-Vocabular, dem die nun folgenden
                neuen Definitionen zugeordnet werden. Danach kann das vorige
                CURRENT-Vocabular mit {prevdef} wiederhergestellt werden.
forth           ( -- ) (I)
                Nach {root} das Stamm-Vocabular des Systems
h,              ( cfa -- ) (C)                                  F6
                Compiliert eine von auen(!) in eine Colon-Definition hineinge-
                reichte cfa, nimmt sie vom Stack & justiert {csp} entsprechend.
                {h,} eignet sich auch zum Einbau irgendeiner Zahl in den Code,
                die von auen bergeben wurde, und macht dann zustzliche Ma-
                nahmen zum Einhalten der Stackbilanz berflssig:
                        1234 : test 8766 lit+ H, 10000 = IF ." oke! " ENDIF ;
                Das {h,} ersetzt hier die Sequenz
                                      ... [ dup ] literal ... ;  drop
h;              ( -- ) oder ( ptr 9 -- ) (C)                    F6S
                Abschlu einer headerlosen Colon-Definition in den lteren F6-
                Versionen. Funktion identisch {;}, darum nicht mehr im Kern.
h]              ( H] name -- ptr ) (I)                          F6
                Leitet eine headerlose Colon-Definition ein. Der zurckgegebene
                ptr ist von den aufrufenden Worten spter als cfa zu verwenden.
                Die Platzeinsparung entspricht der ungeradzahlig aufgerundeten
                Lnge eines Namen + 3; auerdem belasten diese Worte die Suche
                beim Compilieren nicht, da sie fr {-find} nicht existieren.
                Ausfhrungszeitvorteile bieten die namenlosen Worte nicht.
                        H] " ein headerloses wort " -print H;
                        : probe ." aufruf: " H, ." wurde eingebaut " cr ;
                Soll solch ein Wort mehrfach compiliert werden, ist die cfa im
                Stack vorher z.B. mit {dup} entsprechend oft dort abzulegen.
                Sie kann aber auch in irgendeiner Hilfsvariablen/-Constanten
                zwischengespeichert und dann ganz "normal" mit dem Komma com-
                piliert werden:
                        H] ..irgendwas.. H;     is temp-cons
                        : probe ... [ temp-cons , ] ... ;
                Das bietet sich besonders dann an, wenn in einem Programm ohne-
                hin Constante definiert wurden, denen ihr eigentlicher Wert aber
                erst spter oder durch das Programm selbst zugewiesen wird.
no-search       ( -- ) (I)
                Vocabularspezifische zweite Suchfolge sperren.
only            ( -- ) (I)                              F83
                Alle Vocabulare aus der Suchfolge nehmen, nur {root} bleibt
                zugnglich, {current} wird nicht verndert.
prevdef         ( -- ) (I)                              F6
                voriges Definitionsvocabular wieder einsetzen. Benutzt eine ein-
                fache Variable, kann daher nur das unmittelbar vor dem jngsten
                {definitions} vohandene {current}-Vocabular wiederherstellen.
previous        ( -- ) (I)
                Die gesamte Suchfolge um das jngste Vocabular verkrzen.
rvoc            ( -- ) (I)                              F6
                Das zweite Vocabular an erste Stelle setzen, keine weiteren
                nderungen, der eigentliche Vocabularstack bleibt unberhrt.
search          ( SEARCH name ) (I)                     F6
                dem CONTEXT-Vocabular ein neues Secundrvocabular einprgen.
selected        ( SELECTED xxxx )                       F6S
                Modifiziert den nchsten Aufruf von {words} und beschrnkt die
                Ausgabe auf bestimmte Wortgruppen. Grundstzlich gelten die
                nach {selected} folgenden max. 7 Zeichen bis zum nchsten Leer-
                zeichen als alphabetisches Auswahlkriterium fr den Wortanfang
                der Ausgabe. Die Kriterien beim Textvergleich entprechen {t=}.
                Daneben gibt es Sondergruppen mit:
                selected imed           fr die "immediate"-Worte;
                selected prim           die Standard- und die mit Langwort-Ptr
                                        aufgerufenen Primitives;
                selected defn {name}    fat die Worte zusammen, deren pfa den-
                                        selben Inhalt wie {name} hat, z.B. also
                                        die Worte aus demselben Definitionswort;
                selected wtyp {name}    die Worte vom selben Typen wie {name}.
vlist           ( -- )
                Alle Worte des CONTEXT-Vocabulars nach {out-cons} schreiben.
                Immediate-Worte werden durch vertauschte Hintergrund- und
                Schriftfarben hervorgehoben.
words           ( -- )                                  F6S (F83)
                Wie {vlist}, jedoch alphabetisch sortiert und tabellarisch
                angeordnet. Der Aufruf kann mit {selected} modifiziert werden.
               ( -- ) (D) (I)                          (F6)
<nul>           Das "" wird von {id.} anstelle der ASCII-<nul> hingeschrieben,
                die den wirklichen Wortnamen bildet. Dieses Wort ist eines der
                wichtigsten in f.i.g.-Forth-Systemen: Die <nul> ist nicht nur
                absolutes Begrenzungszeichen, sondern auch aktives Wort. Da sich
                die Notwendigkeit, einen neuen Text zu holen und das Textende im
                allgemeinen decken, veranlat hier jeder Text selbst das System,
                an seinem Ende fr Nachschub zu sorgen oder nach {quit} zurck-
                zukehren, dem ueren Interpreter, wo weitere Eingaben erwartet
                werden. So wird es, indem es die laufende Kontrolle selbst ber-
                nimmt, vllig unabhngig von irgendeinem berwachenden Programm-
                rahmen. Das "neue" {refill} des ANS-Standard kommt der <nul>,
                deren Funktion im Laufe der Zeit verlorengegangen schien, schon
                wieder recht nahe, es fehlt lediglich der automatische Aufruf
                am Ende des aktuellen Zeichenstroms.
                Dadurch, da im F6 die <nul> auch mit Namen {} hingeschrieben
                werden kann, ist sie sehr leicht auch in neue Worte compilier-
                bar, was z.B. die Ersatzdefinition des genannten {refill} ohne
                irgendwelch Umstnde sofort ermglicht.


* HIDDEN-Vocabular                                      F6 F83 lmi
Viele der hier verzeichneten Worte sind selten fr Programmierer oder Anwender
sinnvoll einsetzbar. Andere erfordern tiefergehende Detailkenntnisse. Darum
sind hier nicht alle Aufrufe vollstndig beschrieben, es wird fr den Bedarfs-
fall auf den (kommentierten) Assembler-Quelltext verwiesen.

#user           ( -- n1 )                              (F6) F83
                Cons, Gre des gesamten User-Bereichs
(")             Runtime fr {"}
(+loop)         Runtime fr {+loop}
(.")            Runtime fr {."}
(;)             Runtime des optimierenden {;}           F6 8.16
(;code)         Runtime fr {;code}
(abort")        ( -- ) (D)                              F6
                Von {abort}-Varianten aufgerufen, fhrt initial nach {quit},
                auf entsprechende Anwendungs-Worte vectorisierbar.
(abort)         ( -- ) (D)                              F6
                Wird nach Lschen des Datenstacks von {abort} aufgerufen und
                fhrt die weitere Re-Initiierung durch: Stellt {dr0} ein,
                Zahlen dezimal, und nach evtl. ntigem bergang in den user-
                Modus des 680xx-Processors Hinschreiben der Systemkennung.
(bs)            ( -- c1 )                               F6
                Definiert den Zeichencode fr {bs}
(ctl)           ( -- ptr )                              F6
                Vari, 0 unterbindet die Aktionen von {ctrl}.
(debug)         ( -- ) inaktiv ( pfa -- ) mit debugger (D) F6
                Ausfhrender Debugger-Aufruf, wird ggf. vor jede cfa compiliert.
                In der Vorgabe mit $8001 besetzt und damit fr schnellstmgliche
                Abarbeitung de-aktiviert. Wird beim Compilieren des Debuggers
                auf ein Wort mit Prfung und Ausfhrung von {debug} gestellt.
(do)            Runtime von {do}, identisch {2>r}.
(exec)          Hilfsaufruf u.a. zu {clone-4th}.
(find)          ( ptr1 ptr2 -- pfa count tf | ff )
                Zentraler Aufruf von {-find}, der je ein einzelnes Vocabular,
                dessen jngste nfa als ptr2 angegeben wurde, nach dem N
                amen
                mit Countbyte ab ptr1 durchsucht. ptr2 kann eine beliebige nfa
                sein, von der an zu lteren Worten hin gesucht wird. (find)
                ist darum auch fr das Durchsuchen beliebiger anderer Listen
                geeignet, sofern die einzelnen Posten nur in derseben Weise
                wie Forth-Worte verkettet sind (s. ganz oben).
(loop)          Runtime von {loop}
(number)        ( d1 ptr1 -- d2 ptr2 )          F6 bis vers. 8.07
convert         ( d1 ptr1 -- d2 ptr2 )          dasselbe ab vers. 8.08 (fth)
                Accumuliert die Ziffern ab ptr1 in d1 bis zum ersten nicht in
                der aktuellen {base} als Ziffer gltigen Zeichen und gibt den
                Accu d2 samt der Adresse des Abbruchs ptr2 zurck.
(quit)          ( -- ptr )                              F6
                Ausfhrungs-cfa von {quit} und Hilfe zur Erzeugung selbsstarten-
                der F6-Programme. Die hier eingetragene cfa wird beim Start des
                F6-Jobs ausgefhrt und kann auf jedes Wort gestellt werden, das
                ein geschlossenes Programm ausfhrt - die "turnkey"-Anwendung.
                Automatisches Nachladen fehlender Definitionen:
                Beim Antreffen eines nicht vorhandenen Wortes wird die gewhn-
                liche Fehlerbehandlung durchlaufen, die normalerweise nach der
                Ausgabe eines Hinweistextes und Teil-Initiierung nach {quit}
                fhrt. Stellt man {(quit)} nun auf einen {l-load}-Aufruf ein,
                der den Namen von {here} bernimmt, kann jeder solcher Fehler
                automatisch das Laden eines unbekannten Wortes veranlassen. Um
                dies wirklich sinnvoll anwenden zu knnen, bedarf es ggf. noch
                der Entfernung des {latest} Wortes, in dem beim Compilieren
                solch ein Fehler auftrat, und es mu die Position im Eingabe-
                strom mit den dann erneut zu interpretierenden Text gesichert
                worden sein. All dies vorausgesetzt, bei einheitlicher Quelle
                fr nachzusetzende Definitonen, lt sich der Compiler soweit
                ausbauen, da er vllig selbstndig die fehlenden Definitionen
                einsammelt und nachtrgt.
+branch         ( flg -- )                              F6
                Runtime fr die Optimierung z.B. aus: 0< IF
                Bei Aufrufen aller {branch}-Varianten ist zu beachten, da die
                Sprungdistanz als vorzeichenbehaftete 16-Bit-Zahl bewertet wird.
                Ist also ein Aufruf 32K Bytes entfert, oder mehr, so darf er
                keinesfalls mehr direkt angesprungen werden, da die compilierte
                Distanz dann in die falsche Richtung weist. In solchen Fllen
                ist nur der standardmige Forth-Aufruf zulssig - was bei der
                automatischen Schluoptimierung selbsttig bercksichtigt wird.
-branch         ( flg -- )                              F6
                Runtime fr die Optimierung z.B. aus:  0= IF
0-branch        ( flg -- )                              F6
                Runtime fr die Optimierung z.B. aus: 0> IF
0<branch        ( flg -- )                              F6
                Runtime fr die Optimierung z.B. aus: 0< 0= IF
0>branch        ( flg -- )                              F6
                Runtime fr die Optimierung z.B. aus: 0> 0= IF
0branch         ( flg -- )                              F6
                Runtime fr IF
<cmove          ( ptr1 ptr2 n1 )
                Transportiert - ggf. berschreibend - n1 Bytes von ptr2 nach
                ptr1, ohne Aktion, wenn n1 nicht > 0 ist.
?0branch        ( flg -- flg | )                        F6
                Runtime fr die Optimierung, entspricht
                        -dup IF
?1branch        ( flg -- flg | )                        F6
                Runtime fr z.B. {case?}, entspricht
                        over = IF drop
?numerr         ( flg -- flg 0 )                        F6
                Zusammenfassung von
                        ( flg ) 0 ?error
back            ( ptr -- )
                Compiliert eine rckwrtsgerichtete Sprungdistanz in {here}.
branch          Runtime fr {else} und andere unbedingte Sprnge
clone-jdt       ( did -- did )(D)                       F6
                Letzte Aktion in {(exec)} unmittelbar vor der Job-Activierung.
                Vectorisiert auf {noop}, vorgesehen fr anwendungsbezogene
                Besonderheiten. Die Adresse der zugehrigen jdt kann mit {a2l@}
                gelesen werden, die dID des Jobs mu im Stack erhalten bleiben.
dataspace       ( -- ptr )                              F6
                Vari, Wert des mit {w-save} festgelegten Bereichs, der dem so
                erzeugten Job beim Aufruf fr Stacks, Puffer und Dictionary
                zugewiesen wird. Bei -1 ermittelt das System den grtmglichen
                Wert, mit anderen Zahlen ist die Zuweisung zur Verringerung des
                knftigen Speicherbedarfs reduzierbar. Der Wert von ca. 3000
                sollte jedoch nicht unterschritten werden, andernfalls wird es
                Stackfehler geben.
debug           ( pfa n1 -- ) exec )(D)                 F6S
                case:-Liste der Debug-Einrichtung, kann mit Anwenderdefinitionen
                in den freien Posten (5 bis 8) re-vectorisiert werden. Erhlt
                in n1 den Wert MAX( db-on,0 ), und eine pfa, die die ausfhren-
                den Worte vom Stack nehmen mssen. Davor wird db-on=0 ausgefil-
                tert, soda n1=0 nur bei negativen Werten von db-on vorkommt.
dlit            ( -- d1 )
                Runtime fr doppeltgenaue Festwerte.
doforget        ( cflg xflg nfa1 nfa2 -- cflg xflg nfa1 n3 ) (D) F6  8.18
                Anwender-definierbarer Vorspann in {forget}. Darf nfa1 mit der
                jngsten nfa des jngsten Vocabulars nicht ndern, und mu
                zumindest irgendeine Zahl n3 anstelle der nfa2 des Wortes, bis
                zu dem das Dictionary freigegeben werden soll, zurckgeben.
                Bei Erreichen von {doforget} steht bereits fest, da {fence}
                nicht erreicht wurde, und im QXL-System ist die Cache inaktiv.
                cflg = 0/1 Return-Wert von CACHE
                xflg =/= 0 als Abbruchflag zum vorzeitigen Verlassen der betr.
                FORGET-Variante ohne nderungen im Dictionary setzbar.
end-loc         (C)( sys: n1 -- )                       F6
                auerordentliche Freigabe des {local}-Bereichs, z.B. vor {;s},
                bentigt die Anzahl freizugebender Bytes, z.B.
                   : name local AB| .. IF .. [ 8 ] end-loc ;s ENDIF .. ;
                Der Eingriff "von Hand" in den Compiler wurde gewhlt, da, weil
                {end-loc} in den unterschiedlichsten Situationen vorkommen kann,
                die Lage der Systemdaten nicht vorhersagbar ist. In solch einer
                Situation ist es einfacher, die Anzahl Bytes direkt anzugeben.
flit            Runtime fr fp-Festwerte                F6
ini-loc         (C) ( sys: n1 -- )                      F6
                Reservierung von n1 Bytes localen Speichers, wie {end-loc}.
is-prt          ( c1 -- )
                Definition einer Kanalnummer als Druckerkanal
lit             Runtime fr einfache Festwerte
memvec          ( n1 -- dadr | -dn )                    F6
                n1 ist die Nummer eines Vectors im MEM-device der IO2-Sammlung,
                dessen Adresse zurckgegeben wird, negative Werte und Null sind
                nicht brauchbar, sie signalisieren einen Fehler.
                Fr die detaillierte Beschreibung der Vectoren wird auf die
                Dokumentation zur IO2-Sammlung (vom Autor des F6) verwiesen.
ocontext        ( -- ptr )                              F6
                User-Vari, bei {context}-Wechsel mit dem bisherigen ptr besetzt.
ocurrent        ( -- ptr )                              F6
                User-Vari, durch {definitions} mit dem bisherigen ptr besetzt.
qlit            Runtime fr quad-Festwerte
seal            ( -- )                                  (F83) F6
                Das aktuelle Definitionsvocabular wird abgeschlossen; es er-
                scheint nach dem Aufruf leer und ist so weiterverwendbar, als
                sei es gerade erst definiert worden.
t3do                                                    F6
                Runtime fr eine Anzahl Aufrufe der QDOS-trap #3
[convert]       ( ptr -- )                             (F6)
                Der Zahlenkonverter des Interpreters, holt den aktuellen
                Gegebenheiten entsprechend eine Zahl, falls der interpretierte
                Text nicht als Wort gefunden wurde. Im compilierenden Zustand
                werden zwei aufeinanderfolgende einfache {lit} umgeordnet und
                und mit {dlit} zu einer doppelten Integer zusammengefat, bei
                einer weiteren {lit} entsteht eine {flit}-Anordnung.
[cpl]           ( cfa -- cfa ) (D)                      F6
                Unmittelbar vor dem Eintragen einer cfa in das Dictionary
                aufgerufenes Wort, das frei ist fr Anwendungs-Aktionen.
[debug]         ( -- ) (C)                              F6
                Wird in {interpret} aufgerufen, wenn {db-on} nicht Null ist und
                compiliert dann {(debug)} vor jede cfa.
[error]         Initiale Aktion von {error}             F6
[find]          ( ptr -- ptr ) (D)                      F6
                Anwender-definierbarer Vorspann in {(-ffind)} als erste Aktion
                unmittelbar nach bergabe des Textes mit dem zu suchenden Namen,
                der mit seinem count-Byte bei ptr steht. Initial inaktiv.
[interpret]     ( pfa c1 -- pfa c1 seinem count-Byte ) (D) F6
                Anwender-definierbarer Vorspann in {interpret} nach erfolgrei-
                cher Wortsuche mit pfa des Wortes und seinem count-Byte c1, die
                beide unverndert weiterzugeben sind. Initial inaktiv.
[nul-pfa]       ( -- pfa )                              F6
                Cons, pfa des <nul>-Wortes, kann nach Umwandlung in CFA mit
                Komma compiliert werden und wird wie das <nul>-Wort ausgefhrt.
[nul]           ( -- cfa )                              F6
                Die initiale Aktion von <nul>


* QDOS-Vocabular                                        F6 QDOS

In diesem Vocabular finden sich nur QDOS- rsp. QL-spezifische Aufrufe, die
in vielen Fllen genaue Gegenstcke zu Aufrufen des SBasic sind. Abweichun-
gen gibt es insofern, als die Parameterangaben vorzugsweise auf die Erfor-
dernisse der QDOS-Traps ausgerichtet sind, was vor allem wesentlich verbes-
serte Laufzeiteigenschaften zur Folge hat.
Aktionen und Parameter-Erfordernisse sind den gngigen Dokumenten zum QDOS
zu entnehmen, oder z.B. dem "Programmieren in QDOS" vom Autor des F6. Doch
auch mit einiger Kenntnis des SBasic sollte die Programmierung nicht allzu
schwer sein, ein wenig Hilfe geben auch die unten gewhlten Bezeichnungen.
Die Namen stimmen mit den dort genannten QDOS-Bezeichnungen berein, womit
sie leicht auffindbar sind und sich hier detaillierte Angeben erbrigen.

* Trap #0 Processorzustand
Ntzlich fr alle Vorgnge, die ohne Unterbrechung - z.B. durch das Multi-
tasking des QDOS - en bloc ablaufen mssen, etwa die ser1/ser2-Bedienung bei
Minerva oder auch sonst in den hheren Baudraten. Ausnahmsweise auch, wenn
ein (mglichst kleiner) Programmteil besonders schnell ausgefhrt werden soll.

Der Aufruf wird durch die "chk"-exception mit Hilfe der QDOS-Trap-Umleitung
in einer fr alle 680xx-Processoren zulssigen Weise so dargestellt, da
Aufrufe zu beliebigem Zeitpunkt mglich sind, unabhngig vom Processortypen
und dem aktuellen Systemzustand. "Exception-handler" sind darum nicht erfor-
derlich, rsp. werden nicht aktiv - vor allem fr die Laufzeit vorteilhaft.
Fr die Paarung der Worte zur Status-Umschaltung gilt dieselbe Regel, wie
fr >R und R>, und mu strikt eingehalten werden. Die F6-Worte der Fehler-
Aktionen sorgen zwar fr gefahrlose Rckkehr, wird aber bei sonst einwand-
freiem Verlauf der Status nicht richtig geschaltet, geraten F6-Returnstack
und der QDOS-Systemstack durcheinander, was zu belsten Fehlern fhrt.

Einfache Regel:
Der Processorzustand mu am Ende eines Wortes derselbe sein, wie zu Anfang,
was im Wortinnern auerdem fr jede einzelne DO..LOOP gilt. Da Systemstack
und Return-Stack dieselben sind, drfen auch Returnstackoperationen nur paar-
weise benutzt werden, und sich NIE mit einem der Trap#0-Aufrufe berschneiden.

Vorsicht bei Recursion oder Datenablage im Returnstack:
Die nutzbare Stacktiefe im QDOS-Systemstack ist auf 256 Bytes begrenzt!
Das entspricht einer Forth-Schachtelung von 128 Aufrufen, aber bei z.B.
Ladevorgngen oder DO..LOOPs reduziert sich diese Zahl schon wesentlich,
da das F6-System dort auch Daten zwischenspeichert.

sr!             ( n1 -- )
                Statusregister mit dem 16-Bit-Wert n1 besetzen, auch zum
                Betriebsartenwechsel (user oder supervisor) verwendbar.
           HINWEIS: Es werden auch die Interrupt- und Trace-Bits besetzt!
sr@             ( -- n1 )
                Statusregister lesen.
trap0r          ( -- )
                bergang in den user-Modus.
trap0s          ( -- )
                bergang in den supervisor-Modus.
trap0           ( -- n1 )
                bergang in den supervisor-Modus, Rckgabe des alten Status.

* Trap #1 : Systemsteuerung (Managertraps)

activ           ( d.jobid prior execmode -- d.jobid )
alchp           ( d.len d.jobid -- dlen dadr )
baud            ( d.baud -- )
cjob            ( d.start d.datamem d.codemem d.jobid -- d.jobid )
free            ( -- d.maxmem )
frjob           ( d.jobid d.ernum -- )
ipcom           ( parmptr -- byte )
jinf            ( d.job1 d.job2 -- d.nxtjob d.ojob sus&priflg d.start )
mode            ( auflsung bildschirm -- a.alt b.alt )
prior           ( d.jobid d.prior -- )
rclck           ( -- d.date )
rechp           ( d.adr -- )
reljb           ( d.jobid -- d.jobid )
sclck           ( d.date -- )
susjb           ( d.jobid time -- d.jobid )
tra             ( d.chrtab d.msgtab -- )
scach           ( d.flag -- ) cache ein(1) aus(0) - nur im SMSQ aktiv

trap1a          ( d.A1 d.D3 d.D2 d.D1 opcode -- d.D1 )
trap1           ( d.D1 d.D2 opcode -- d.D1 )

* Trap #2 : Kanal-Zuweisung - alle Aufrufe im Forth-Vocabular vorhanden

delet           ( ptr -- )
formt           ( ptr -- )

* Trap #3 : i/o-Operationen
Alle Aufrufe der Trap #3 arbeiten mit dem {work}-Kanal, darum ist eine Kanal-
nummer als Parameter nicht vorgesehen. Die Wartezeit wird der User-Variablen
{io-time} entnommen und kann auerdem mit den weiter unten notierten Register-
Operatoren verndert werden. Fehlercode 0 steht fr ordnungsgemen Verlauf.
Kennzeichnung (G):
Die Graphik-Aufrufe belassen abweichend von der sonst strikt befolgten Regel
ihre Parameter im Stack. Grund ist die Ausfhrungsgeschwindigkeit. Da zumeist
mehrere solcher Aufrufe aufeinander folgen, und sie hufig die Vorgngerdaten
weiterverwenden, werden sie auf diese Weise wesentlich schneller abgearbeitet.
Sie arbeiten smtlich mit Fliekommazahlen.

arc             ( fxs fys fxe fye fa -- ... )(G)
                ..s Anfangs-, ..e End-Koordinaten, fa ffnungswinkel
at              ( zeile spalte -- )
bfill           ( y0 x0 hoch breit farbe -- )
border          ( breit farbe -- )
chenq           ( -- zeile spalte breit hoch )
clrbt           ( -- )
clrln           ( -- )
clrrt           ( -- )
clrsc           ( -- )
clrtp           ( -- )
csize           ( hoch breit -- )
curdis          ( -- )
cursen          ( -- )
edline          ( ptr1 maxlen -- ptr2 len ) vereinfachter Aufruf, ptr1 zeigt
                auf das count-Wort der Textvorgabe, len ist die max. Lnge.
                Zurck gehen ptr2 und len passend fr sofortiges {type}, d.h.
                ptr2 zeigt dann auf das erste Zeichen der Eingabe. Arbeitet
                im {in-cons}-Kanal an aktueller Cursorposition. Mit
                        in-cons work >chan< edline in-cons work >chan<
                kann bei Erhalt aller brigen Kanalzuweisungen auch dieses
                Wort auf den {work}-Kanal bezogen werden.
elips           ( fx fy fex frad1 frad2 -- ... )(G)
fbyte           ( -- c1 err )           c1 nur gltig bei err = 0
flash           ( flg -- )
fline           ( ptr len -- len err )
flood           ( flg -- )
fount           ( adr1 adr2 -- err )
fpos            ( -- d.fpos )
fscheck         ( -- err )
fsflush         ( -- )
fsload          ( d.adr d.len -- )
fsmkdr          ( -- )
fsrename        ( ptr -- )              nur mit Minerva oder TK2 - auer bei
                Minerva arbeitet die Trap nur an eigens dazu geffneten Kanlen.
fssave          ( d.adr d.len -- )
fstrunc         ( -- )                  nur mit Minerva oder TK2
                Lt sich mit der Kombination {headr} & {heads} nachbilden, wenn
                der Header mit der verkrzten Filelnge zurckgeschrieben wird.
fstrg           ( ptr len -- err )
fsvers          ( d.vernum -- )         Version lesen mit {d1l@}, nur TK2
gcur            ( ycpix xcpix ygpix xgpix -- ... ) (G) nicht fp
headr           ( ptr -- len err )      Lese-Lnge mit {d2w!} einzustellen.
heads           ( ptr -- len err )      immer 14 Bytes senden
ink             ( farbe -- )
line            ( fxs fys fxe fye -- ... ) (G)
mdinf           ( ptr -- gut frei err )
ncol            ( -- )
nrow            ( -- )
nl              ( -- )
panln           ( pixel -- )
panrt           ( pixel -- )
pan             ( pixel -- )
paper           ( farbe -- )
pcol            ( -- )
pend            ( zeit -- err )
pixp            ( ypix xpix -- )
point           ( fx fy -- .. )(G)
posab           ( d.fpos -- err )
posre           ( d.len -- err )
prow            ( -- )
pxenq           ( -- ypix xpix hoch breit )
recol           ( ptr -- )
sbyte           ( c1 -- )
scale           ( fmastab fx fy -- ... )(G)
scrbt           ( linien -- )
scroll          ( linien -- )
scrtp           ( linien -- )
setmd           ( flg -- )              flg mit der Zahl wie OVER zu bergeben
sstrg           ( ptr len -- err )
strip           ( farbe -- )
tab             ( spalte -- )
under           ( flg -- )
wdef            ( y0 x0 hoch breit border farbe -- )
xinf            ( ptr -- err )
                holt 64 Bytes der Medien-Definition nach ptr. Wegen eines
                Fehlers in einigen TK2-Versionen sollten fr die Ablage zur
                Sicherheit 100 Bytes freigehalten werden. Der F6-Aufruf
                arbeitet auch mit MDV-Laufwerken und unabhngig vom TK2.
            >>> This version does not depend on the TK2 being present,
                and it woks with any directory device, MDV inclusive.
                Due to an error in some versions of TK2 this call should
                work on a 100 bytes buffer to prevent system damage.

trap3           ( c1 -- )
                Arbeitet mit dem Kanal c1 und benutzt die zuvor mit den
                Registeroperatoren (s.u.) eingetragenen Werte.

* Registerzugriff bei Aufrufen der Trap #3              LR
* ..! zum Ablegen vor dem Aufruf, ..@ zum Lesen danach

a1l!    a1l@
a1w!    a1w@
a2l!    a2l@
a2w!
d0w!    d1b@
d1h!    d1h@
d1l!    d1l@
d1w!    d1w@
d2l!
d2w!
d3w!
sp!a1           Stackpointer auf F6-Referenz bezogen als A1.L vorlegen.

* nicht wiedereintrittstauglich, darum nur paarweise unverschachtelt aufzurufen:
d3t!            alte Wartezeitangabe sichern, neue festlegen.
d3r             alte Wartezeitangabe wiederherstellen.

* Varianten und besondere Systemaufrufe

[jdt]           ( -- ptr )
                Cons, liefert den ptr auf eine Adresse im F6 mit folgenden
                beim Job-Start ermittelten Kenndaten des umgebenden Systems:
                Alle nicht anders bezeichneten Posten enthalten Langwort-Werte.
                        disp    Bedeutung
                jdttab  0       Adresse der eigenen Job Definition Table
                procftb 4    .b -1 68010+, 0 sonst
                emuflag 5    .b -2 qxl, -1 emu, 1 vor JS, 0 sonst
                        6    .b qdos Version, Nationalitten-Kennbuchstabe
                miflag  7    .b -1 minerva, 0 sonst
                mtinftb 8       eigene Job-id
                        12      bereinigte (s.o. Pos. 6) QDOS-Versionsnummer
                sysvari 16      Basisadresse der Systemvariablen
                deftch  20      Standard-Fensterkanal (als Notfall-Vorgabe)
                        24      F6 Basispointer a6 = [bp]
                        28      (Verwendung
                refclon 32      bei f6-clone A6 des Besitzers
                wmanvec 36      Window-Manager Basisvector oder 0
                        40   .w (intern benutzte Flag)
                hishnd  42      Commandline-History Handler
                                initial -1, vom 1. Aufruf {is-his} besetzt.
call            ( d.A4 .. d.A0 d.D4 .. d.D0 dadr -- d.A4 .... d.D0 ) F6
                Allgemeiner Aufruf der Stelle dadr, setzt d7:=d0 und a5:=a3.
                Die 4th-Register (d6/d7/a3/a4/a5/a6) werden restauriert.
                Als Beispiel hierzu ist {is-his} auch in "forth_scr" definiert.
cdt             ( c1 -- d.adr flg | -1. -1 )                    F6
                flg = 49 bei PIF-aktivem Fenster, 1 ohne PIF, 0 anderer Kanal.
                Mit diesen Rckgabewerten ist es leicht, ohne besondere Vorkeh-
                rungen bei automatischer Bercksichtigung des PIF die Parameter-
                basis eines Fensterkanals zu bestimmen:
                        ( c1 ) cdt dup 0> IF 1- m+ ELSE d0= d0= ENDIF ( dn | 0 )
                was entweder diese Adresse liefert, oder einfachen flg-Wert 0;
                Fehlerbehandlung danach z.B. mglich mit
                        ( dn | 0 ) -dup 0= IF -15 error ENDIF ( dn | abort )
d>date          ( d.date -- ptr count )         Text mit Datum & Uhrzeit
d>day           ( d.date -- ptr count )         Text mit dem Tag
eof             ( -- flg )                      flg = 1 wenn eof erreicht ist,
eof?            ( -- flg )                      flg = 1 wenn ernum = -10 ist,
                      und {eof?} vor der Abfrage von {ernum} aufgerufen wurde.
                             .. sbyte eof? 1- ernum drop and dup ?error
                      schliet z.B. EOF aus dem Fehler-Abbruch aus.
flen            ( -- d.flen )
fstrg-l         ( d.adr len -- )
pif             ( -- )(I)                       Vocabular
poseof          ( -- )                          eof aufsuchen
sstrg-l         ( d.adr len -- )
-xstrip         ( c1 flg -- )
                flg =/= 0: Schrift- und Hintergrundfabe des Kanals c1 tauschen.
xstrip          ( c1 -- )
                wie {-xstrip}, stets ausgefhrt.

* PIF-Vocabular, Untervocabular von QDOS
Wenn das Pointer-I.F. nicht vorhanden ist, erscheint dieses Vocabular leer.

flim            ( -- ymin xmin maxhoch maxbreit )
lblb            ( ys xs ye xe d.blob d.patt -- )
outl            ( y0 x0 hoch breit set/mov -- ) "outline" ohne "Schatten"
pick-job        ( d.jobid -- )
pinf            ( -- d.pifvers d.wmanvec )
qflim           ( -- y x h b )
                identisch {flim} jedoch mit Standardvorgabe, wenn PIF fehlt.
rptr            ( y x tab 0 recordptr -- y x )
rpxl            ( y x d2-code -- farbe posn )
rspw            ( y x flg 0 ptr.mae d.saveadr -- )
spry            ( y x d(.w)pix d.blob d.patt -- y x )
sptr            ( ypix xpix flg -- y x )
svpw            ( y x 0/hoch&breit ptr.mae d.memadr -- d.saveadr )
swdf            ( d.adr -- )
wblb            ( y x d.blob d.pat -- )
wrst            ( d.adr flg -- )
wsav            ( d.adr d.len -- )
wspt            ( y x d.sprite -- )

* Hotkey-System

hot!            ( ptr len -- err )              String in den Hotkey-Puffer
hot@            ( ptr -n1 -- ptr len )          -n1 lfd. Nr. im Hotkey-Puffer
[th-entry]      ( -- ptr )
                Vari, mit Basisadresse des "Thing"-System-Einsprungs.
[wman]          ( -- ptr )
                Vari, mit Basisadresse des Window-Manager-Einsprungs.
                        [wman] 2@ 4 type-l
                schreibt die wman-Versionsnummer hin.

* Trap #4 : A6-relative Adressierbarkeit
Ein Trap#4-Aufruf steht nicht zur Verfgung, da in standardmigen QDOS-Jobs,
wie dem F6, der Wert des Registers A6 nur durch das Programm selbst verndert
werden kann und darum die fr die Trapaufrufe bentigten relativen oder wirk-
lichen Werte gefahrlos zusammengesetzt werden drfen.

* Trap 5 bis 15
Sind smtlich unbenutzt, werden aber von der Trap-Umleitung des F6 miterfat
und zu diesem Zweck auf ein RTE gelenkt. Mit eigenen Aufrufen besetzt sind:
CHK             Umschaltung in den Supervisor-Modus, Statusregister zum Stack.
ADDRESS ERROR   Abfangen von Adressierungsfehlern; systemabhngig.
Wie im einzelnen dies durchgefhrt wird, ist dem Assemblertext zu entnehmen.

* MINERVA-Vocabular (leer, rsp. seit Vers. 8.08 nicht mehr vorhanden)

* ASM68-Vocabular (Assembler in "f6asm_scr", Beschreibung in "as_gls")
Das Vocabular ist vorbereitet, ein vollstndiger 6800x-Macro-Assembler steht
in "f6asm_scr" zur Verfgung. Er nimmt ca. 10K in Anspruch, einschlielich
umfangreicher Hilfsaufrufe und Strukturworte werden daraus rund 16K. Fr
Anwendungen, die einzelne Assembler-codierte Passagen enthalten sollen, kann
mit Hilfe von {c-save} und {c-load} der Assembler spter fortgelassen werden,
soda dann nur der Platzbedarf fr die assemblierten Forth-Worte entsteht.
Fr den Anfang stehen hier die Ptr auf einige wichtige Stellen im System.
Sie sind etwas ausfhrlicher erlutert, um die Verbindung mit nachtrglichen
ergnzenden Definitionen zu erleichtern. Zur weitergehenden Dokoumentation
wird auf den Assembler-Quelltext verwiesen, das Glossar zum Assembler, und
viele Anwendungsbeispiele in "f6task_scr", "f6a80_scr" sowie "f6xco_scr".
Grundlage ist ein irgendwann Anfang der 90-er Jahre in die Hnde des Autors
gelangtes Derivat des 68000-Assemblers von Laxen & Perry, das fr das F6
vervollstndigt, stark erweitert und auch von Fehlern befreit wurde.

Als 4th-Register mssen bei neuen Processorcode-Aufrufen geschtzt werden:
Im F6 mit besonderer Verwendung:
                D2      bei Deferred-Aufrufen zur inneren Datenbergabe
        OS      D6      Segment Offset (reserviert)
        NX      A3      Einsprung in den Inneren Interpreter
        BP      A6      Basis-Ptr, Bezugspunkt fr 4th-Adressen
Gem dem f.i.g.-Modell bezeichnet und verwandt:
        US      D7      Offset rel. BP auf User-Area, Werte der User-Vari
            ("US" der Klarheit halber, da UP durch ein Forth-Wort besetzt ist)
        IP      A4      Instruction Ptr, der 4th-Programmzhler
        SP      A5      Datenstack
        RP      A7      Returnstack
Alle anderen Register knnen verndert werden, werden aber berschrieben.
Solange die folgenden erhalten bleiben, liefern sie die Informationen:
                D0      allgemeine Flag fr {l<i} - s. dort.
                D1      Case-Index fr {#case}
Der Innere Interpreter bei <next> verndert nur die folgenden Register:
         T      A1      u.a. zur Ermittlung der Aufrufadressen
         W      A2      u.a. Word Ptr, unmittelbar nach dem Aufruf Ptr in pfa,
                        kann bei Primitive-Definitionen stets sicher als Ptr
                        auf die der cfa folgenden Daten benutzt werden.
        IP      A4      Instruction Pointer (Programmzhler des Forth).
A1 und A2 knnen davor beliebig verwandt werden, A4 mu unberhrt bleiben.

* F6: Die [namen] liefern als Constante einige wichtige Stellen im System:
[docall]        ptr zum Einsprung in Subroutinen mit Return nach <next>
[docol]         ptr nach <docolon>, leitet hi-level-Definitionen ein.
[dodefer]       ptr nach <dodefer>, verlangt den ptr auf die cfa im W-Register.
[dojump]        cfa der Primitives mit auerhalb des 4th-adressierbaren Bereichs
                liegendem Programmcode.
[do;does]       Einsprung des Runtime-Aufrufs von {;does>} dosemidoes
                {;does>} fhrt das standardmige {(;code)} aus und compiliert
                vor den hi-level-Ausfhrungsteil den Sprung nach <dosemidoes>
                        jsr     dosemidoes-Z(BP)   (Z ist der BP-Bezugspunkt)
[donext]        Der Subroutinenaufruf des virtuellen 4th-Processors ist <next>
                mit dem 4th-ptr [donext]. Dort steht der innere Interpreter.
[dosemis]       4th-Ptr auf das rts-quivalent des f.i.g.-Modells.
[cprim]         2constant mit der d.adr eines Hilfsaufrufs fr Primitive-4th-
                Worte, die damit als gewhnliche Subroutine ausgefhrt werden.
                Beschreibung s.u., Hinweise zum F6 Assembler-Quelltext.
[cdefer]        entsprechend fr {defer}ed angelegte Worte.
* im Forth-Vocabular:
nopdf           ist eine {defer}red Definition im F6-Kern und kann als Referenz
                fr in Primitives eingebaute {defer}red-Aufrufe benutzt werden.
                Die betr. Stelle im Assemblercode relativ zum Blockanfang wird
                z.B. mit Hilfe eines Labels in eine Constante bergeben, durch
                die sich nach dem Einfgen eines Codeblocks mit {c-load} der
                Aufruf auf den wirklichen Vector justieren lt.
+nul            als Variable mit dem Inhalt 0 lt sich hnlich nutzen.


* Hi-/Lo-Level-Mix
Dem einfachen bergang zwischen Forth-Worten und Assembler-codierten Passagen
dienen {;c} und {code}, deren endgltige Definitionen in "f6asm_scr" stehen:
        : name ..forthworte.. ;c ..assemblercode.. code ..forthworte.. ;


* F6 Assembler-Quelltext
Alle ntigen Kommentare sind in "forth_asm" angegeben. Zum Aufbau von lo-level-
Routinen gibt es ein paar Hilfsmittel fr den Einbau anderer 4th-Aufrufe, auf
die hier hingewiesen werden soll. Dabei zu beachten, da dabei kein Register
gesichert wird, dies mu beim Aufruf selbst geschehen, wobei insbes. die oben
genannten Forth-Register nicht verndert werden drfen. Innerhalb der Prfgren-
zen (s. Assemblertext) drfen die Adressregister ab A3 auch nicht ungerade sein.

Forth: 2constant [cdefer] im Assembler-Voc.
Bei {defer}red Definitionen soll die Ausfhrungsroutine nie direkt angesprungen
werden, da sie jederzeit von einem Programm umgelenkt werden kann. Solche Worte
ruft man mit der Adresse des 4th-Ptr auf die betr. Routine auf:
                lea     deferred_pfa(pc),[w]
                jsr     Cdefer(pc)
Diese Form ist nur vorhanden, um den Einbau von {defer}ed Aufrufen in Codeteile
zu ermglichen. Die Ausfhrungszeit entspricht in etwa der Standard-Aufrufform.
Da bei gleichbleibenden Versionsnummern der auerhalb des Forth-Bereichs liegen-
de Code-Teil unterschiedliche Adressenlage aufweisen kann, empfiehlt sich im F6-
Assembler Lesen der relativen Adresse aus der PFA von {[cdefer]}. Der Aufruf ist
dann, solange dieselbe Versionsnummer zugrundeliegt, in derselben Weise unabhn-
gig von Vernderungen in den grundlegenden lo-level-Aufrufen, wie ein "normales"
Forth-Wort. Und nur so kann die betr. Codepassage mit {c-load} sicher geladen
werden - was grundstzlich auf smtliche Referenzen in den F6-Kern zutrifft.
      ' deferredword >PC   d(PC  W     lea,   \ 4th-ptr im codeblock relativ!
            [cdefer] 32Bit .l # D0 .l move,   \ langwort-disp nach 'auen'
                0 BP D0 .l d(Xi,PC     jsr,   \ deferred wort ausfhren & ret


Forth: 2constant  [cprim] im Assembler-Voc.
Normalerweise enden 4th-Primitives mit einem Sprung nach <next>. Um sie dann
als Subroutinen aus anderen Programmteilen aufrufen zu knnen, mu ihnen dies
fr den einen Aufruf "abgewhnt" werden. Dazu dient:
                lea     primitive_code(pc),[w]
                jsr     Cprim(pc)
Das W-Register mu dazu mit der Adresse besetzt werden, an der die aufzurufen-
de Routine steht. Inhalt von PFA oder CFA eines jene ausfhrenden 4th-Wortes
sind nur bedingt brauchbar, deren Aufruf fhrt je nach Worttyp evtl. zu Fehlern.


Constante und Variable unterscheiden sich nur in der Ausfhrungsvorschrift,
darum kann ihr Datenfeld auf dieselbe Weise adressiert werden:
        ' name
was sich besonders bei Assembler-codierten Worten vereinfachend bemerkbar macht:
        code: [inc]   ip )+ a1 move,   #1 # 2 a1 bp d(xi addq,   next;
erhht dann unabhngig vom Typen den Wert einer Constanten oder den Inhalt einer
Variablen um Eins. - Dieses Beispiel darf NUR COMPILIERT eingesetzt werden!


* Betrachtungen zur Ausfhrungszeit:
Zum Vergleich mit Assemblercode dient das Beispiel <next> und <semis>, das der
Paarung JSR und RTS entspricht, und als halbwegs reprsentativ angesehen werden
kann. Mageblich fr den Zeitbedarf kommt je namentlichem Aufruf ein [docol]
hinzu. Alle anderen Codeteile entsprechen Assembler-Aufrufen, soda bei dem sehr
geringen Aufwand des Inneren Interpreters das Verhltnis 4:1 fr Forth gegenber
optimiertem Assemblercode als verlliche "worst case"-Schtzung anzusehen ist.
Den mitunter genannten Faktor 1:3 bis 1:5 gegenber ausfhrbaren Code erzeugen-
den Compilern wird man nur beim Vergleich mit hchst ungeschickt aufgebauten
Systemen erzielen knnen, im F6 sicherlich nicht: Der Umbau des grten Teils
Colon-Definitionen des Kerns in direkt codierte Aufrufe ergab etwa doppelte
Geschwindigkeit, nennenswerte Steigerung ber den Faktor 2 hinaus wird kaum
zu erreichen sein. Oft wird aber ein spezielles lo-level-Wort noch sehr viel
schneller sein, als die gleichwertige Forth-Definition, wenn es gelingt, darin
die Funktion mehrerer hi-level-Worte zusammenzufassen.

Die Abschlu-Optimierung mit Sprung in eine Colen-Definition statt deren norma-
len Aufrufs und anschlieender Ausfhrung von {;s} spart die letzte [docol]-
[semis]-Paarung ein. Dem entspricht beim Processorcode die Einsparung der Adres-
sensicherung im Stack durch JSR mit einem RTS nach einer Subroutinenkette, wenn
stattdessen der letzte Aufruf durch einen einfachen Sprung erreicht wird. Eine
solche Kette wird bearbeitet wie ein Teil ein und desselben Wortes. Beispiel:
                F6                                      Assembler
                ... to-work ;                           JSR     to-work
                                                        RTS
wird optimiert zu
                ... branch [ ' to-work here - ,         JMP     to-work
            und im Forth-Programm um ber 50% schneller ausgefhrt.
Die Zeitersparnis macht sich besonders bei Aufrufketten aus vielen kurzen Colon-
Definitionen deutlich bemerkbar. Dort lohnt es sich, auf geeignete Wortanordnung
zu achten, damit diese Optimierungsform wirksam werden kann.

* Beispiel einer optimierenden hi-level-Definition
{&} fhrt in Infix-Notation die Verkettung zweier Bytewerte als gepackte Integer
aus, in der das erste Byte der Eingabe an hherwertiger Stelle angeordnet wird.
War die erste Zahl als {literal} compiliert, wird diese bereits wrend des Com-
pilevorganges mit der zweiten Verknpft und in der genderten Form fixiert, so-
da whrend der Ausfhrung des hiermit gebildeten Wortes keine Rechenoperationen
mehr anfallen. Der Code wird dadurch um 6 Bytes krzer, d.h. es wird kein zu-
stzliches Wort compiliert, und die Ausfhrungszeit reduziert sich auf weniger
als ein Viertel gegenber z.B. einer fhrenden Constanten. Man schreibt etwa
        .. #1 & 34 ..
im interpretierenden Betrieb oder in ein Wort compilierend. Die Definition:
: & depth state@ 0= < dup ?error -compile >< -find
  IF drop dup @ swap cfa @ [ ' 0 cfa @ ] literal -      \ 2. parm als cons
  ELSE here [number] -dup 0= IF 1abs ENDIF ENDIF        \ oder festwert
  abort" Zahl?" state@                                  \ oder fehler
  IF here 6- @ also hidden ' lit previous cfa =         \ code prfen
  IF here 4- @ >< or here 4- ! -2 allot ;s ENDIF ENDIF  \ ggf. optimierung
  [compile] literal -compile or ;          immediate    \ oder standardform
Dieses Wort wurde fr einen speziellen Anwendungszweck geschaffen und dient
hier nur als Beispiel. Seine Verwendung ist dadurch eingeschrnkt, da die
zweite Zahl nur eine Constante oder ein Festwert sein darf, Parameter oder
(Locale) Variable knnen an dieser Stelle nicht verarbeitet werden.


* Zusammenstellung der Worte zur Ganzzahlen-Arithmetik

* 1. Einfachgenaue Zahlen
+       ( n1 n2 -- n3 )                 n3=n1+n2
++      ( n1 n2 n3 -- n4 )              n4=n1+n2+n3
+!      ( n1 ptr -- )                           Addition n1 in den Speicher
+!l     ( n1 dadr -- )                          dto. an wirklicher Adresse
-       ( n1 n2 -- n3 )                 n3=n1-n2
*       ( n1 n2 -- n3 )                 n3=n1*n2
*/      ( n1 n2 n3 -- n4 )              n4=n1*n2/n3
*/mod   ( n1 n2 n3 -- n4 n5 )           n5=n1*n3/n3     n4 Divisionsrest
/       ( n1 n2 -- n3 )                 n3=n1/n2
/mod    ( n1 n2 -- n3 n4 )              n4=n1/n2        n3 Divisionsrest
mod     ( n1 n2 -- n3 )                 n3=n1-n2*(n1/n2)   Divisionsrest
u/      ( u1 u2 -- u3 )                 u3=u1/u2
u/mod   ( u1 u2 -- u3 u4 )              u4=u1/u2        u3 Divisionsrest
1+      ( n1 -- n2 )                    n2=n1+1
2+      3+      4+      5+      6+      7+      8+      entsprechend {1+}
1-      ( n1 -- n2 )                    n2=n1-1
2-      3-      4-      5-      6-      7-      8-      entsprechend {1-}
2*      ( n1 -- n2 )                    n2=n1*n2        Bit 15 bleibt Vorzeichen
3*      4*      5*      6*      10*     16*             entsprechend {2*}
2/      ( n1 -- n2 )                    n2=n1/2
4/      ( n1 -- n2 )                    n2=n1/4
abs     ( +n1 | -n1 -- +n1 )
1abs    ( n1 -- n2 )                    n2=+n1 oder Einercomplement bei -n1
min     ( n1 n2 -- n3 )                 n3 als kleinere Zahl von n1, n2
umin    ( u1 u2 -- u3 )                 u3 als absolut kleinere Zahl von u1, u2
max     ( n1 n2 -- n3 )                 n3 als grere Zahl von n1, n2
umax    ( u1 u2 -- u3                   u3 als absolut grere Zahl von u1, u2
0max    ( n1 -- 0 | +n1 )
* bitweise Operatoren
and     ( n1 n2 -- n3 )
and!    ( n1 ptr -- )                   AND-Operation mit n1 am Ort ptr
not     ( n1 -- n2 )                    n2 Einercomplement von n1
or      ( n1 n2 -- n3 )
or!     ( n1 ptr -- )                   OR-Operation am Ort ptr
xor     ( n1 n2 -- n3 )
xor!    ( n1 ptr -- )                   XOR-Operation am Ort ptr
* Stack- und Speicheroperatoren
dup     drop    over    swap    ndrop
sdup    sdrop   sover   pick    roll    rdrop   >r      >rr     r>      r
!       !l      @       @l      @!      c!      c!l     c@      c@l
@!      m>r     r>m

* 2. Doppeltgenaue Zahlen
d+      ( d1 d2 -- d3 )                 d3=d1+d2
2+!     ( d1 ptr -- )                           Addition d1 in den Speicher
2+!l    ( d1 dadr -- )                          dto. an wirklicher Adresse
d-      ( d1 d2 -- d3 )                 d3=d1-d2
#       ( d1 -- d2 )                    d2=d1/base@     Rest als Ziffer => hld
d*      ( d1 d2 -- d3 )                 d3=d1*d2
ud*     ( ud1 ud2 -- ud3                ud3=ud1*ud2     vorzeichenlos
d1+     ( d1 -- d2 )                    d2=d1+1
d2+     d4+                                             entsprechend d1+
d1-     ( d1 -- d2 )                    d2=d1-1
d2-     d4-                                             entsprechend d1-
d2*     ( d1 -- d2 )                    d2=d1*2
d4*     ( d1 -- d2 )                    d2=d1*4
d2/     ( d1 -- d2 )                    d2=d1/2
d4/     ( d1 -- d2 )                    d2=d1/4
d/      ( d1 d2 -- d3 )                 d3=d1/d2
ud*/mod ( ud1 ud2 ud3 -- ud4 ud5 )      ud5=ud1*ud2/ud3 ud4 32-Bit Divisionsrest
dabs    ( +d1 | -d1 -- +d1 )
2and    ( d1 d2 -- d3 )                 d3 = bitweise d1 AND d2
* Stack- und Speicheroperatoren
2dup    2drop   2over   2swap
        2sdrop          2pick   2roll   2>r     2>rr    2r>
2!      2!l     2@      2@l             2@!

* 3. Vierfachgenaue Zahlen
q+      ( q1 q2 -- q3 )                 q3=q1+q2
q-      ( q1 q2 -- q3 )                 q3=q1-q2
q2/     ( q1 -- q2 )                    q2=q1/2
q4/     ( q1 -- q2 )                    q2=q1/4
4+!     ( q1 ptr -- )                           Addition in den Speicher
4+!l    ( q1 dadr -- )                          dto. an wirklicher Adresse
qabs    ( +q1 | -q1 -- +q1 )
* Stack- und Speicheroperatoren
4dup    4drop           4swap
                        4pick   4roll
4!      4!l     4@      4@l             4@!

* 4. FP-Zahlen, Funktion entsprechend einfachen Integer, Rest s. FP-Vocabular.
+       -       *       */      2*      /       2/

* 5. Mischoperatoren mit Einfachgenauen Zahlen
m+      ( d1 n2 -- d3 )                 d3=d1+n2        n2 vorzeichenerweitert
m*      ( n1 n2 -- d3 )                 d3=n1*n2        16 nach 32 Bit
u*      ( u1 u2 -- ud3 )                ud3=u1*u2       dto. vorzeichenlos
s*      ( d1 n2 -- d3 )                 d3=d1*n2
m/      ( d1 n2 -- n3 n4 )              n4=d1/n2        n3 16-Bit Divisionsrest
m/mod   ( d1 n2 -- n3 d4 )              d4=d1/n2        n3 dto.
um/mod  ( ud1 u2 -- u3 u4 )             u4=ud1/ud2      u3 dto. vorzeichenlos
+-      ( n1 n2 -- n3 )                 n3=n1 oder n3=-n1 wenn n2 < 0
d+-     ( d1 n2 -- d3 )                 wie {+-}
q+-     ( q1 n2 -- q3 )                 wie {+-}

* 6. Mischoperatoren mit Vierfachgenauen Zahlen
qm+     ( q1 n2 -- q3 )                 q3=q1+n2        n2 vorzeichenerweitert
q#      ( q1 -- q2 )                    q2=q1/base@     Rest als Ziffer => hld
qs*     ( q1 n2 -- q3 )                 q2=q1*n2        64Bit-Produkt (accu)
dm*     ( d1 d2 -- q3 )                 d3=d1*d2        32 nach 64 Bit
udm*    ( ud1 ud2 -- q3 )               q3=ud1*ud2      63-Bit positives Produkt
qm/mod  ( +q1 d2 -- q3 d4 )             d4=q1/d2        q3 64-Bit Divisionsrest
uqm/mod ( +q1 +d2 -- +d3 +q4 )          q4=q1/d2        d3 32-Bit Divisionsrest
uq/mod  ( +q1 d2 -- d3 d4 )             d4=q1/d2        d3 32-Bit Divisionsrest

* 7. Vergleichsoperatoren; stets einfache Integer als Ergebisflag
* Byte
                                                uc<
* einfach
=       <       >       0=      0<      0>      u<      sgn
=/=                     0=/=
                        -0=
* doppelt
d=      d<              d0=     d0<             du<     2sgn
* vierfach
q=      q<              q0=     q0<             qu<
* FP
=       <       >       0=      0<      0>              sgn     cmp


* Verwaltung der QDOS-Kanle

* Kanalnamen
file            i/o             in-cons         out-cons        prt
screen          work

* ffnen/Schlieen
close           fdelete         fopen           fop-in          fop-link
fop-new         fop-over        format          open            open-link
using

* Kanaltabellen
>chan<          cdt             ch-id           chp             is-chan
is-open         new-chan        set-chan        set-work        to-chan
to-work

* Vernderungen der Kanaldaten
>fount          pushfile        popfile         window          wmov

* Abfragen
-window         ch-num          edif            is-his          is-ochan
wd-size         work-id         work-num


* Liste der USER-Variablen
>>> as found by { selected wtyp base } in different vocabularies
#TIB     (PROMPT)  (R)       BASE      BLK       CC4TH     CONTEXT
CSP      CURRENT   DP        DPL       FENCE     FLD       FORGET-LK 
HLD      IN        IO-TIME   L-MRG     LAST      OFFSET    OS 
OUT      R#        R0        ROW       S0        SCR       SPAN 
STATE    TIB       U0        UP        VOC-LINK  WARNING   WIDTH 


* Liste der immediate-Worte
>>> as found by { selected imed words } in different vocabularies
 (die null)    "               '               (               +
+loop           -->             -forget         -loc            ."
.(              ;               ;cdoes>         ;code           ;does>
>r              <with           abort"          again           also
asm68           assembler       associative:    begin           case:
case?           cmc             default-is      dliteral        do
editor          else            end-loc         endif           fdelete
fop-dir         fop-in          fop-link        fop-new         fop-over
fopen           format          forth           fp              ftest
h,              h]              hidden          i               if
if-found        if-nfound       if-true         ini-loc         is
literal         local           loop            minerva         name
no-search       only            pif             previous        qdos
r               r>              range:          recurse         repeat
root            rvoc            seal            search          s-load
stack           stack:          text            until           using
while           [               [compile]       [debug]         \
|

Als {} erscheint hier die ASCII-<nul>, die als besonderes f.i.g.-Forth-Wort
beim Interpretieren des Eingabestroms fr Nachschub oder ggf. Abbruch sorgt.

* Liste der deferred-Worte
>>> as found by { selected wtyp cr words } in different vocabularies
               (abort)         (abort")        (debug)         (exper)
-->             -find           ;does>          ?key            ?numerr
?terminal       assembler       block           bs              buffer
clone-jdt       cls             cr              del             doforget
echo            edit            emit            error           expect
key             l-load          load            number          pemit
prompt          ptype           query           sltext          type
type-l          w-find          [convert]       [cpl]           [find]
[fop]           [interpret]

* Liste der Primitives lt sich nur unvollstndig anlegen mit:
        { selected prim words }
>>> will find the standard and long jump primitives.

* Fehlercodierung
Das System liefert Fehlercodes zum Stack sowie in verschiedene Pseudo-Con-
stante, welche jeweils unmittelbar nach dem Lesen auf Null gesetzt werden:
Name            Bezug
4th-err         In {[error]}, bei Aufruf der Forth-Fehlerbehandlung,
                fehlgeschlagener Umwandlung von Zahlen in Strings,
                berlauf bei quad-Division.
ernum           Alle Operationen des {qdos}-Vocabulars.
                Fehlschlag bei {w-save}, {wmov}, und den open-Varianten.
fp-err          Arithmetik-Operationen im Fliekommavocabular.
io-err          Operationen an den Standardkanlen und
                in {w-save} bei Platzmangel im Zielmedium.

>>> system messages
* Meldungstexte
Mit negativem Index entsprechend ERNUM werden die QDOS-Meldungen adressiert,
im F6 werden einige QDOS-Texte auch bei positiver Fehlernummer ausgegeben.
Nicht mit Texten belegte Nummern werden mit ihrem Wert und vorangestelltem
"msg #" hingeschrieben. Das F6-System definiert folgende Meldungstexte:
1       empty stack                     Stack leer
3       adressing mode                  Adressierungsart
5       digit storage ovf               Ziffernspeicher voll
7       stack overflow                  Stackberlauf
9       fatal error - don't retry!      irreparabler Fehler, nicht wiederholen!
15      M68LR6                          (Systemkennung)
16      {version} F6 (C) .hpr'{datum}   (Versions- & Urheber-Vermerk)
17      compilation only                nur beim Compilieren verwenden
18      executing only                  nur zur direkten Ausfhrung
20      definition not finished         Definition unvollstndig
21      protected dictionary            geschtzter Wortebereich
22      use only when loading           nur beim Laden verwenden
23      off editting screen             auerhalb editierter Seite
24      ? vocabulary                    falsches Vocabular
25      - mpu effective timing          (bei Anzeige der gemessenen Taktung)
26      execution vector undef'd        vectorisierter Aufruf nicht definiert
27      system address error            reparabler Adressierungsfehler im System

Zum Ansehen aller Meldungen gibt man beispielsweise ein:
        | 30 -30 DO i 1- 0> -cr i i . message key 27 = -leave LOOP |  <enter>


* Verzeichnis der - versuchsweise - fr {l<i} prparierten Worte.

Diese Aufrufe liefern durch {l<i} lesbare Werte, die zum Multitasking einzelner
Forth-Worte anstelle der fr die Referenz unzureichenden 16-Bit-Werte verwandt
werden knnen. {l<i} bergibt das Processor-Register D0 vom Ende des jeweiligen
Aufrufs und erlaubt darum nur unmittelbar danach und nur im compilierten Zustand
die sinnvolle Deutung. Die Rckgabewerte sind folgendermaen zu interpretieren:

* berlauf-Flag -1. als doppelte Integer, sonst beliebig positiv
f>d     f>q
+!      m+!     2+!     4+!     +!l     2+!l    4+!l
+       ++      -       over-   +-      minus   not     bounds
d+      m+      d-      2over-  d+-     dminus          d2*     d4*     2base+
q+      qm+     q-              q+-     qminus

* DO..LOOP Laufindex (was dem Wort den Namen gab)
loop            der zweite Integerposten (nach drop) liefert den Index, mit
+loop           dem die Schleife beendet wurde, auch nach LEAVE oder -LEAVE.

* 32-Bit-Ptr
<#              ptr auf den Beginn (das sptere Ende) der Ziffernablage
#>              anfang des Ziffernstring
#s              anfang des Ziffernstring
,       c,      Dictionary-ptr nach der Zuweisung
d>date          String-ptr
d>day           String-ptr
f>$             String-ptr
hld?            Abstand-3 der Ziffernablage zum Dictionary-Ptr
hold            Anfang des Ziffernstring
local buchst.   ptr auf den Ort der local-Daten
pad             Anfang des Ablagebereichs

Die folgenden Worte beeinflussen das Resultat von {l<i} nicht:
i/o in-cons out-cons work screen file prt dr0 dr1
1+  und  d1+                    (in allen Varianten mit je derselben CFA)
int+ 2/ 4/ 2* 4* h>a
-off 1off 1on toggle and! or! xor! count count-l count-w
! und @ und @!                  (alle varianten, auch fp)
skip scan cmove cmove-l <cmove
sr! sr@ trap0 trap0r trap0s
sp!a1 d1l@                      (alle Varianten der qdos-Registerbergabe)
><  >|< c->s s->d
hex decimal base@ base! state@ tib@ dpl@ source sp@ rp@ depth #case
drop 2drop 4drop ndrop dup ddup 2dup 4dup ndup over 2over pick (ggf. auch fp)
rot 2rot swap 2swap 4swap sover sdrop 2sdrop
>r r> >rr r i j 2>r 2>rr 2r 2r> r+                (ggf auch fp)
previous also only vocabulary constant 2constant  (alle runtimes, ggf. auch FP)
definitions unsmudge latest execute perform ] [ -exit branch (alle Varianten)
bset bclr btst shift align even
qsys+ sysflg 4th-id +origin code+ base+ ti-cal q0<


* 32-Bit-Variablenwerte (user-Vari)
csp 2-          gespeicherter Stackptr
dds 2-          ;does> hi-level-Einsprung, aktuell nach jedem {;does>}
hld 2-          Laufpointer in die Ablage bei der Ziffernumwandlung
hld 2+          Anfangsptr der Zifferndarstellung (Strig-Ende)
dp 2-           dictionary ptr
s0 2-           stackptr
r0 2-           returnstackptr
u0 2-           uservari Datenbereich


* Die wichtigsten ergnzenden Definitionen aus "forth_scr" und "f6xco_scr"

Die hier aufgefhrten Worte knnen mit L-LOAD {name} geladen werden.
Sie werden bersprungen, wenn sie bereits vorhanden sind.

Besonders hingewiesen sei vor allem auf die Gruppen

array           frei dimensionierbare Variablenfelder nach Vorbild des SBasic
                mit Datenablage auerhalb des Forth-Speichers.
chain           beliebig stapelbares Laden von gewhnlichen Files.
debugger        der aktive Teil zum Einzelschrittbetrieb, Mini-Decompiler.
dump            Varianten fr Speicherauszge, desgl. auch {ldump}
heapmem         uerst sichere Zuweisung im QDOS-Systemspeicher.
msg"            Textsystem mit Datenablage in "heapmem"-Blcke. Als lo-level-
                Worte auch in "f6xco_scr", und fr {c-load} in "f6xco_4th".
printer         Sammlung zum Drucken, auch simultan mit der Bildschirmausgabe.
sort & sort-l   schnelles und effizientes Sortierverfahren nach Zech, Forth 83.
turtle          vollstndiger Satz Aufrufe zur incrementellen (Vector-)Graphik.
view            als wirkungsvolles Anwendungsbeispiel fr vectorisierte Worte.
>s s> u.a.      Externe Stacks, Definition und Operatoren, der Effizienz halber
                nur in "f6xco_scr" rsp "f6xco_4th" als lo-level-Worte angegeben.

Die Anordnung in diesem Verzeichnis ist alphabetisch und bercksichtigt
allein die Buchstabenfolge. Das betroffene Vocabular ist jeweils angegeben:
        (f) fp          (r) root        (h) hidden
Worte ohne Kennzeichnung sind im aufrufenden oder im Forth-Vocabular zu finden.

2^              ( n1 -- n2 )
                liefert die n1-te Potenz von Zwei - und ist zugleich Beispiel
                einer eigenstndigen {case}-Liste.
4th-heap        ( dadr -- flg )
                tf wenn dadr einen "heapmem"-Block des aufrufenden F6 bezeichnet.
ans             ( -- )
                Vocabular mit den (experimentellen!) ANSI-Definitionen.
array           ( n1 n2 ARRAY name )                            F6(!)
                Errichtet ein im Rahmen der Speichergrenze beliebig dimen-
                sioniertes Variablenfeld auerhalb des 4th-Adressenbereich.
                Anzahl Dimensionen n1, Produkt aller spter festzulegenden
                Dimensionen und die Einzelpostengre n2 drfen je bis unter
                64K Bytes gro sein, das Produkt aus Postengre und Dimen-
                sionen mu kleiner als 256K sein. Mehr s. "forth_scr".
ascii           ( -- c1 ) (C) ( ASCII char -- )                 F83
                Im F6 entbehrlich, da "{" als Textprfix mehr leistet.
a-close         ( -- )
                Alle in der F6-Kanaltabelle verzeichneten Kanle schlieen,
                wobei {in-cons} und {out-cons} geschtzt sind. Auch die
                QDOS-Kanle 0 bis 2, sollte einer von ihnen versehentlich in
                die F6-Tabellen gelangt sein, knnen nicht geschlossen werden.
backup          ( -- ) (C) ( BACKUP quellenfile zielfile -- ) (I)
                Filecopie mit den Namen aus dem Standard-Eingabestrom oder
                ggf. den in ein aufrufendes Wort hineincompilierten Namen:
                        : wort ... BACKUP quelle ziel ... ; \ fest eingebaut
                        : wort ... [compile] BACKUP ... ;   \ vom eingabestrom
                Beide Files drfen auch einen im F6 offenen Kanal haben. Die
                Filenamen mssen vollstndig angegeben werden; das mag lstig
                sein, wurde aber der Sicherheit halber bewut so eingerichtet.
?backup         ( -- )
                Wie {backup}, jedoch mit Eingabeanforderung fr beide Namen.
-bpt            ( flg -- flg )
                "breakpoint" fr den Debugger. Ist er aktiv, d.h. {db-on} =/= 0,
                aber im nichtanzeigenden Betrieb, signalisiert durch {db-on} <0,
                wird bei flg =/= 0 der Anzeigemodus wiederhergestellt.
basicv"         Basic-Variable holen; im Forth-Vocabular bereits beschrieben.
bdump           ( -- )
                Speicherauszug in 16-Bytes-Gruppen der Lnge aus dem vorigen
                {dump}-Aufruf des nchst niedrigeren Anschlubereichs.
case            Installation der Eaker-CASEs mit OF, ENDOF etc.
chain           ( CHAIN filename -- loc: did )                  F6 LR
                Zum Laden von Forth-Quelltexten aus "normalen" Textfiles, die
                aus bis zu 168 Zeichen langen mit <lf>, <cr><lf> o.dgl. abge-
                schlossenen Zeilen bestehen, deren letzte ein {end} enthlt.
                Der Aufruf hinterlegt zwei Local-Posten, die durch {end} frei-
                gegeben werden und kann im Rahmen des verfgbaren Speichers be-
                liebig tief geschachtelt werden. Da die Files nur zum Lesen ge-
                ffnet werden, knnen mehrere F6-Jobs zugleich auf dasselbe File
                zugreifen. Datenbewegungen auch zwischen den Aufrufebenen sind
                mglich, solange der {local}-Bereich in Ordnung gehalten wird.
                Vorsicht: Systemzusammenbruch mglich, wenn das {end} fehlt!
chans           ( -- )
                QDOS-IDs und Nummern aller offenen Kanle des F6 hinschreiben.
clchp           ( -- )                                          F6
                Alle mit {heapmem} reservierten Speicherblcke auflsen. Die
                zugehrigen Definitionen bleiben weiter aktiv, soda mit ihrem
                Aufruf wieder eine gltige Speicheradresse zur Verfgung steht,
                nun aber in Form eines neu zugewiesenen und gelschten Blocks.
clm             ( dadr -- )
                Wie HEAP-RMV, jedoch mit Markierung der Definitionsparameter
                durch Null-setzen der gespeicherten Adresse (4 Bytes ab PFA).
                Die PFA der Wortdefinition wird hier durch HEAP-PFA ermittelt,
                soda sie auch in einem deferred Wort als indirekte Adresse
                stehen kann. Nachteil dieser Art Adressenermittlung ist, da
                der Speicherbereich erst einmal eingerichtet wird (oder bereits
                vorhanden sein mu), bevor der Aufruf aktiv wird, er also u.U.
                bei Speicherberlauf scheitert. Notfalls ist dann Abhilfe mit
                direkter Manipulation der "heapmem"-Definitionsdaten mglich:
                        ' heapname 2@ heap-rmv
                        ' heapname 2off
c-load & c-save zum Laden und Sichern codierter Passagen wurden oben im Forth-
                Vocabular bereits ausfhrlich beschrieben.
console         ( -- )                                         (C1)
                Nimmt die evtl. mit {printer} aktivierte Druckerfreigabe zurck.
.dcm            ( .DCM name -- ptr ) oder ( pfa #DCM -- ptr )
                Ein Minimal-Decompiler, der, weil er nur wenige Bytes bentigt
                und recht hilfreich sein kann, mit dem Debugger geladen wird.
debugger        (h)( -- )                                       F6
                Hilfswort fr l-load zum Laden der aktiven Teile des Debuggers
                mit Einzelschrittbetrieb, der danach z.B. mit
                        4 is db-on
                geschaltet werden kann und neue Worte dafr prpariert. Diese
                werden dann beim Aufruf mit Anzeige des Stackinhalts und des
                gerade bevorstehenden Aufrufs Wort fr Wort abgearbeitet.
                Fehler:
                Vorsicht ist geboten, wenn die zu untersuchenden Worte {case:}-
                Listen (und ihre Varianten) oder Returnstackmanipulationen ent-
                halten, die zu Vernderungen in der Wortreihenfolge fhren, wie
                {r+} oder {lit+}. Auch Vernderungen der Interpreter-Ptr knnen
                empfindliche Fehler verursachen. Zur Abhilfe gengt es, die
                betroffenen Bereiche von der Debugger-Behandlung auszunehmen,
                indem man dort {db-on} auf Null setzt:
                 4 is db-on
                 : name ..worte.. [ db-on 0 is db-on ] ..worte.. [ is db-on ]
dim             ( nn nn-1 .. n2 n1 DIM name -- )                F6
                Initiierung eines mit {array} eingerichteten Variablenfeldes.
                Bereits bestehende Zuweisungen werden vorher zurckgenommen.
dir             ( -- )(I) ( DIR dirname ) oder ( DIR dirname_ )
                Wie der SBasic-Befehl, mit dem Unterschied, da bei einem "_"
                am Namensende nur die danach folgenden Teile der Filenamen hin-
                geschrieben werden. Auerdem erscheinen Filelnge (einschl. der
                Headerlnge!), Zugriffscode und Filetyp in der Ausgabe.
drk             ( -- ptr )
                Variable mit dem Namen des {printer}-Ausgabegerts in bis zu
                36 Zeichen Lnge. Hier kann ein beliebiger Gerte- oder Datei-
                name angegeben werden, die Bildschirmausgabe lt sich damit
                durch den {printer}-Aufruf berallhin simultan weiterleiten.
dump            ( ptr1 n2 -- )
                Speicherauszug in 16-Bytes-Gruppen n2 Bytes ab ptr anzeigen.
                Varianten davon s. {bdump}, {ndump} und {rdump}.
dvlist          ( -- )
                Als Beispiel fr den Einzelschrittbetrieb der Aufruf {vlist}
                vollstndig als hi-level-Aufruf (Colon-Definition).
                        l-load dvlist
                ldt bei Bedarf den Debugger, compiliert {dvlist} und fhrt
                es sofort im Einzelschrittbetrieb aus.
end             ( loc: did -- )                                 F6 (LR)
                Mu ein jedes mit {chain} aufgerufene File abschlieen.
ew              Einen qdos-Job..                                QDOS
ex                          ..installieren (hnlich dem SBasic-Kommando),
ex-p text     EX-Variante mit von "" (char 159) begrenztem Parameterstring.
enter .. entry  hi-level-Code fr bedingte Schleifen, beide Worte im Kern ent-
                halten und oben bereits beschrieben.
exit            ( -- )(I)                                       F79+
                Im f.i.g.-Forth identisch mit {;s}. Fr F79-Texte z.B.:
                        : EXIT -compile ;s ;
f-name          ( -- ptr ) (C) ( F-NAME name )
                Eine Stringvariable fr Filenamen definieren. Sie wird als
                qdos-String angelegt und auf maximal {f/n} Bytes Lnge justiert.
fname"          ( ptr FNAME" filename" -- ) (I)
                Textstck mit count-word bis zur maximalen Lnge {f/n} nach
                ptr bringen.
ftest           ( -- flg ) (C) ( FTEST filename ) (I)
                prft filename auf Zugnglichkeit fr einen Lesezugriff.
h]  h,          ( ... ) (I) im {root}-Vocabular                 F6
                Die Worte zum Anlegen rsp. Compiliern headerloser Definitionen
                sind im Kern vorhanden; in "forth_scr" ist ihr Aufbau so ange-
                geben, da sie auch anderen 4th-Systemen zugefgt werden knnen.
heap?           ( -- )
                Zeigt alle dem F6-Job gerade zugewiesenen {heapmem}-Blcke an.
heapmem         ( -- dadr ) (C) ( n1 HEAPMEM name )             F6
                Verwaltet auf besonders abgesicherte Weise einen Speicherblock
                mit der vierfachen Lnge der bei der Namensdefinition bergebe-
                nen Zahl n1 - was die Blockgre auf 256K begrenzt. Die Reser-
                vierung erfolgt mit dem ersten Aufruf {name} und immer dann,
                wenn dieser Speicherblock, egal aus welchem Grunde, dem System
                verlorengegangen ist oder er aufgegeben wurde. Das hiermit de-
                finierte Wort kann wie eine {2constant} eingesetzt werden, und
                bietet zugleich die Sicherheit, da immer ein ordnungsgem dem
                F6-Job zugeeigneter Speicherbereich adressiert wird.
heap-len        ( dadr -- dn )
                Gibt die nutzbare Lnge einer {heapmem}-Reservierung zurck.
heap-new        (I)( use: nn HEAP-NEW name )
                Neudefinition der Blockgre, ggf. zuvor implizit {heap-rmv}.
                Kann mit festem Wert in ein Wort eigebaut werden
                        : name ... zahl heap-new {heapname} ... ;
                und stellt die Blocklnge beim Aufruf dieses Wortes ein, oder
                zur Angabe des Namen erst bei Ausfhrung
                        : name .. zahl [compile] heap-new ... ;
                wobei die Zahl auch vorher als Parameter bergeben werden kann.
heap-pfa        ( dadr -- ptr | 0 )                             F6
                Gibt die pfa der zugehrigen {heapmem}-Definition zurck, wenn
                dadr die Anfangsadresse eines damit reservierten Bereichs ist.
heap-rmv        ( dadr -- )                                     F6
                Gibt den bei dadr beginnenden Speicherblock an das Betriebssys-
                tem zurck. Prfungen sorgen dafr, da nur ein vom selben F6-
                Job reservierter Block aufgelst wird, und da die Adresse auch
                im QDOS keinen Fehler auslsen kann (z.B. ungerade oder nicht
                zu einem "heap"-Block gehrend). Die definierten Worte bleiben
                aktiv, soda mit ihrem nchsten Aufruf jeweils wieder ein leerer
                Speicherbereich gleicher Gre zur Verfgung steht. Nebenbei ist
                HEAP-RMV daher auch zum Null-Setzen eines Blocks geeignet.
history         ( +n1 c2 -- )                                   F6 & Oktagon
                Anzahl zu sichernder Zeilen und F6-Kanal, dem eine "Commandline
                History" zugewiesen werden soll. Voraussetzung ist, da die Er-
                weiterung dazu im Systen vorhanden ist ("history" von Oktagon).
is-his          ( c1 -- flg )                           (in Kern bernommen)
                flg =/= 0, wenn c1 einen Fensterkanal mit "history" bezeichnet.
.jobs           ( -- )
                hnlich dem JOBS aus dem TK2, jedoch ausfhrlicher.
l               ( -- )                                          FIG-Editor
                Aktuelle Screen des gerade benutzten Screenfile anzeigen.
ldump           ( dadr n1 -- )
                Wie {dump}, jedoch von wirklicher Speicheradresse dadr.
lbdump          ( -- )
                Wie {bdump}, entsprechend {ldump}
list            ( n1 -- )                                       FIG-Editor
                Screen Nr. n1 des gerade benutzten Screenfile anzeigen
l-load          ( L-LOAD name ) etc.                            F6
                "Library-Load", oben beim Forth-Vocabular bereits beschrieben.
                Diese Ergnzung kann stets mit z.B. { 1 s-load flp1_forth_scr }
                compiliert werden. Ihre wirkliche Lage im Screenfile ist dann
                belanglos, da diese in scr 1 angegeben ist. Es werden nur die
                Worte geladen, die hierfr erforderlich sind.
lndump          ( -- )
                Wie {ndump}, entsprechend {ldump}
lrdump          ( -- )
                Wie {rdump}, entsprechend {ldump}
msg"            (I)( use: MSG" text" )                          F6
                Ablage eines Textes im "heapmem"-Block {msgmem}, der, sofern
                er nicht bereits existiert, beim Compilieren aus "forth_scr"
                mit 2K Bytes angelegt wird.
msg@            ( nn -- dadr cnt )                              F6
                nn-ten Text (ab 1 zhlend) aus dem "msgmem"-Block ermitteln.
msg!            ( ptr -- )                                      F6
                Den Text aus dem qdos-String bei ptr mach "msgmem" bertragen.
.msg            ( nn -- )                                       F6
                {type-l} des mit {msg@} ermittelten nn-ten Textes.
msgmem          ( -- dadr )(D)                                  F6
                deferred zur Revectorisierung auf andere "heapmem"-Blcke,
                initial mit dem 2K groen Block {msm} besetzt. Direkte Daten-
                eintragungen in den Definitionsbereich drfen darum nur nach
                Ermittlung der wirklichen "heapmem"-definierten PFA durch das
                Wort {heap-pfa} vorgenommen werden - wenn es denn sein mu.
!name           ( ptr1 n1 ptr2 )
                den String mit countword bei ptr2 in der maximalen Lnge n1
                nach ptr1 bertragen
ndump           ( -- )
                Speicherauszug in 16-Bytes-Gruppen der Lnge aus dem vorigen
                {dump}-Aufruf des nchst hheren Anschlubereichs.
pdir            ( ptr -- )
                Wie {dir}, mit ptr auf einen Directory-Namen als qdos-String.
postpone        ( POSTPONE name -- ) (I)                        F83+
                        .. postpone postpone postpone IS ...
                schreibt man im f.i.g.-Stil des F6 z.B.:
                        .. compile [compile] IS ..
                Es wird strikt unterschieden zwischen dem Auftrag an eine neue
                Definition, ihrerseits ein Wort zu compilieren, selbst also als
                (spezialisierter) Compiler zu fungieren, und dem Einbau eines
                immediate-Wortes in ein Wort, das jenes dann beim Aufruf ebenso
                ausfhren soll, wie ein 'normales' Wort. Dies sind zwei grund-
                stzlich und derart unterschiedliche Vorgnge, da der Autor die
                identische Benennung fr vllig verfehlt hlt und sie deshalb
                nicht bernommen hat - "postpone" ist leicht nachzusetzen, ein
                Beispiel gibt {[_]} weiter unten.
ptext"          ( ptr n1 PTEXT" textpartie" ) (I)
                Mit " oder <enter> begrenzten Text bis zur maximalen Lnge n1
                einschlielich count-word bei ptr ablegen.
printer         ( -- ) (I)
                Ein Vocabular mit Definitionen zur Druckerbedienung, Einrichtung
                zur ausschlielichen, gleichzeitigen oder unterbundenen Ausgabe
                all dessen, was in die Ein- o. Ausgabefenster geschrieben wird.
                Bis hin zur Ausgabe-Umsetzung hnlich TRA des SBasic werden hier
                die Worte definiert, deren aus dem Forth-Vocabular zugnglicher
                Teil im Anhang von "ed_gls" nher beschrieben ist.
                Leider ist im Laufe der Zeit bei den endlosen Anpassereien an
                stndig variierende SMSQ-Versionen etliches an Funktionalitt
                der {printer}- Aktionen verlorengegengen. - Nach bedingungslo-
                ser Kapitulation seitens des F6-Autors mag der geehrte Anwen-
                der sich mit dem Rest zufriedengeben...
printer         ( -- )                                          F6 (C1)
                ist zugleich der Aufruf zur Aktivierung der Druckerausgabe. Das
                Wort "berdeckt" das Vocabular und sichert es gegen versehent-
                lichen zugriff - dessen besondere Worte sind ein wenig heikel.
                Vorsicht bei QXL und SMSQ(/E): Das System kann steckenbleiben!
                Zur Umleitung an beliebige Ausgabeziele s.o. bei {drk}.
prt-abt         ( -- )
                Ruft je nach Vorhandensein den SBasic-Befehl PRT_ABT oder
                PRT_ABORT auf.
9pin    24pin   zur Umstellung auf verschiedene Druckertypen, insbes. Star
                LC-10 und LC-240. Fr andere Drucker ist evtl. Modifikation
                der zugehrigen Worte erforderlich.
q.              ( qn -- )
                Eine vierfachgenaue Zahl hinschreiben.
<q# q# q#s q#>  quad-Entsprechung der Standardaufrufe zur Zifferndarstellung.
q#              als laufzeitbestimmender elementarer Aufruf im Kern definiert,
                wie auch die Umwandlung von Ziffernstrings in Zahlen/Festwerte.
rdump           ( -- )
                {dump} mit den Angaben des vorangegangenen Aufrufs wiederholen.
.s              ( n1 ... nnn -- n1 .. nn 9
                Zeigt mit bis zu 32 Posten den Stackinhalt an, sowie die besetz-
                te Stacktiefe und die aktuelle Zahlenbasis.
precedes        ( n1 n2 -- flg )(D)                             Zech, Forth 83
                Wgefunktion zu {sorted}, s. dort.
sort            ( ptr n1 -- )
                Ausfhrender Aufruf zu {sorted}, s. dort.
sorted          ( use: ptr n1 SORTED precedesname )(I)  nach Zech, "Forth 83"
                Ein universell verwendbarer Rahmen zum Sortieren von max. 65535
                beliebigen Datenposten oder sonstigen statischen Erscheinungen.
                Sie werden mittels einer n1 Posten umfassenden Pointerliste nach
                einer im Wort {precedes} definierten Unterscheidungsfunktion in
                binrem Sortierverfahren ("quick-sort") geordnet.
                Im einfachsten Falle erzeugt man eine n1 Posten groe Tabelle
                und trgt dort von Null an fortlaufende Zahlen ein. Die Basis-
                adresse dieser Tabelle wird an {sorted} rsp {sort} bergeben.
                Fr {precedes} gibt man dann ein Wort an, das mit diesen Nummern
                indiziert die zu untersuchenden Ereignisse vergleicht. Deren Art
                und Lage ist von der sortierenden Rahmenprocedur vllig unabhn-
                gig, nur das {precedes}-Wort mu diese bercksichtigen. Das
                Ergebnis ist eine Nummernliste, die in aufsteigender Reihenfolge
                den jeweils nchst greren (oder kleineren) Posten indiziert.
                Da nur die Indices selbst im Speicher verlagert werden, nicht
                aber die untersuchten Daten, arbeitet {sort} recht schnell.
                Ein Beispiel, das zeigt, wie auerordentlich einfach der Umgang
                mit diesem Sortierverfahren ist, findet sich unter dem Namen
                {refsort} in "f6z80_scr".
sorted-l        ( dadr n1 -- )(I)
                Wie {sort}, jedoch mit wirklichen Adressen adressierte Liste.
                Auerdem mit vectorisierte Lese- und Ablageoperatoren fr den
                virtuellen Speicherzugriff. Anwendung u.a. in "bh_scr".
qsqrt           ( q1 -- d2 flg )                                F6
                Quadratwurzel einer positiven vierfachgenauen Integer, war q1
                negativ, geht flg mit 1 zurck, sonst mit 0.
+text           ( ptr1 ptr2 -- )                                f.i.g.-Editor
                den qdos-String bei ptr2 an den qdos-String bei ptr1 anhngen.
then                                                            F79
                funktional identisch ENDIF.
turtle          ( -- ) (I)                                      F6
                Vocabular zur Turtle-Graphik fr bis zu 16 voneinander unabhn-
                gige Linienzge mit folgenden Aufrufen, die im Screenfile (auch
                anhand zweier Beispiele) nher beschrieben sind:
                        deg             rad             Winkelumrechnung
                        turn            turnto          hnlich den gleichlau-
                        penup           pendown         tenden SBasic-Kommmandos
                        pen             angle           Status, Turtle-Winkel
                        x-cor           y-cor           Ort der Turtle
                        move            moveto          hnlich SBasic
                        arc-t                           Bogen-"Bewegung"
.view           ( .VIEW name -- )                              (F83)
                Eine Wortdefinition im zugehrigen Quelltext anzeigen. Dafr
                werden die Wortheader entsprechend prpariert, weshalb nur
                nach dem Laden neu compilierte Worte damit aufzufinden sind.
                Diese konventionelle Definition kann mit weitaus weniger Auf-
                wand durch das ebenfalls angebotene {view} ersetzt werden:
view            ( VIEW wortname -- )                            F6S
                ( VIEW wortname quelltextfile )
                Dient als Hilfe-Aufruf zum Ansehen einer Wortdefinition aus
                dem {l-load}-Vorgabefile oder einem anzugebenden Screenfile.
                In seiner Wirkung kommt es mit verschwindend geringem Aufwand
                den mit dem Wort "hypertext" belegten Hilfstext-Systemen nahe,
                und kann zustzlich zu {l-load} und dem Editor geladen werden.
                Fhrt einen {l-load}-Aufruf aus, bei dem das darin enthaltene
                {load} so re-vectorisiert ist, da es die Seite, wo das Wort
                gefunden wurde, schreibgeschtzt in den Editor holt. Beim Ver-
                lassen wird {load} automatisch wieder auf die eigene Funktion
                zurckgestellt. Der evtl. mitbergebene Filename ersetzt den
                bis dahin als Screenfile fr {l-load} gltigen Namen. In der
                vorliegenden Form lassen sich die {view}-Aufrufe nicht schach-
                teln, dazu mte ggf. {l-load} berarbeitet werden.
                Anders als bei {.view} erfordert diese Form keine gegenber dem
                "normalen" Compilieren unterschiedlichen Daten, die Worte werden
                allein mit den Hilfsmitteln des in beiden Fllen ohnehin ben-
                tigten Editors aufgesprt und angezeigt. Darum wird diese (mit
                126 Bytes extrem) kurze Variante im meist zu bevorzugen sein.
vwords          ( -- )
                hnlich {vlist}, durch alle Vocabulare gehend. Der Aufbau zeigt
                beispielhaft die Vocabular-Einordnung, und wie sie bei neuen
                Definitionen in die Bearbeitung eingeschlossen werden knnen.
.vocs        (r)( -- )                                         (F83)
                Anzeige der aktuellen Suchordnung, des Definitionsvocabulars
                und der Namen smtlicher im System vorhandener Vocabulare.
where           ( n1 n2 -- )                                    FIG-Editor
                Nach einem Interpreter-Fehler aufgerufen schreibt dieses Wort
                die Zeile hin, in der der Fehler auftrat und markiert dessen
                Position. Ermittelt diese Angaben aus Nummer n2 des gerade ge-
                lesenen Blocks und der aktuellen Interpreterposition n1 darin,
                welche das System stets bei einem Fehler zum Stack bringt.
                Ein Screenfile bleibt geffnet und kann durch {edit} sofort
                in den Editor geholt werden - wenn jener bereits geladen ist.
                Bei direkter Eingabe wird der t.i.b.-Inhalt anfangs durch das
                "where" berschrieben, gibt aber sonst dieselbe Information.
wherr           ( -- n1 n2 )
                kann mit { ' wherr IS error } weitergegeben werden, wodurch dann
                bei jedem Fehler automatisch auch {where} ausgefhrt wird.
[_]             ( [_] name -- pfa ) (C) ( [_] name -- )        (H4)
                hnlich {postpone} - s. dort, liefert im interpretierenden
                Zustand wie "tick" die pfa von {name}.


* Gegenberstellung einiger Varianten in ungeordneter Folge
* F83 u.a.                      f.i.g.-Forth rsp. F6    ( hinweis F6-variante

* Stacks
r@                      r                       ( t.o.r. lesen
rp0                     r0                      ( u.vari t.o.r. initial
sp0                     s0                      ( u.vari t.o.s. initial
sp0 @ sp!               sp!                     ( Stackptr direkt nicht nderbar
nn sp!                  nn csp ! csp!           ( behelfsweise im F6
nn sp!                  nn sp@ 2- - 2/ ndrop    ( andere Mglichkeit
?dup                    -dup                    ( dup IF dup ENDIF
flip                    ><                    ( dup 256 * swap 256 / 256 and or
r>drop                  rdrop                   ( r> drop
nip                     sdrop                   ( swap drop
tuck                    sover                   ( n1 n2 -- n2 n1 n2 ( swap over
under                   sover                   ( dasselbe oder - uneinheitlich
                        over swap               ( n1 n2 -- n1 n1 n2
                        dup rot                 ( n1 n2 -- n2 n2 n1 ( plausibel
( nn ) -roll            ( -nn ) roll            ( roll "rckw-rts"

* Flags und Vergleichsoperationen
true                    -1
1                       1                       ( f.i.g.-4th true flag
0 0 = constant true                             ( umgeht alle..
1 0 = constant false                            (   ..Miverstndnisse
not                     0=                      ( Flag-Umkehr
        ( Ein Minimal-System braucht z.B. nur die Logikoperatoren < u< und 0=,
        ( sowie die Subtraktion. Damit knnen dann alle anderen Operationen er-
        ( zeugt werden, etwa:
        (       : minus 0 swap - ;      : + minus - ;   : not minus 1 - ;
        (       : > swap < ;            : 0< 0 < ;
        (       : 0> 1 - 0< 0= ;        : = - 0= ;
        ( Dies sind natrlich Extrem-Beispiele, deren Operatoren gewhnlich
        ( zur Standardausstattung gehren sollten. Jedoch werden etliche der
        ( speziellen Logikoperatoren oft bereits durch berlegte Anordnung ent-
        ( behrlich, andere nur selten bentigt. Darum sind im F6 undefiniert:
0<=                     1- 0<
<=                      1- <
0>=                     1+ 0>
>=                      1+ >
u<=                     1- u<
u>                      swap u<
u>=                     u< 0=
        ( Dasselbe gilt zusammen mit {m+} fr doppeltgenaue Operatoren:
d0<=                    -1 m+ d0<       oder    d1-  d0<
d0>                     -1 m+ d0< 0=            d0<= 0=
d0= 0=   IF ...               or IF
2dup d0< IF ...         dup   0< IF
d= IF ...               d- or 0= IF

* Zahlenoperationen
?negate                 +-                      ( Vorzeichen anwenden
negate                  minus                   ( Negation
negate 1-               not                     ( Einer-Complement
not                     not                     ( bitweise
invert                  not                     ( ANS bitweise
s>d                     s->d                    ( Vorzeichenerweiterung
rot min max             within                  ( auf Grenzen justieren
within                  within?                 ( flg ohne obere Grenze

* System (Standard-Referenz im f.i.g.-4th ist die pfa, in F83+ Systemen die cfa)
' execute               ' cfa execute           ( tick liefert PFA
[']                     [compile] ' cfa [compile] literal
'                       [compile] ' cfa         ( tick ist immediate

* Anordnung der Wort-ptr s. auch header-Beschreibung im Einfhrungstext;
* ein anderer blicher Header-Aufbau, der gewisse Vorteile bietet, ist z.B.
        [ lfa ] [ name ] [ cfa ] [ pfa ... ]
* Umwandlung mit der universellen Hilfsdefinition:
*               : c>pfa [ ' task dup cfa - ] literal + ;
>body                   c>pfa                   ( cfa  =>  pfa = cfa+2
body>                   cfa                     ( pfa  =>  cfa = pfa-2
>link                   c>pfa lfa               ( cfa  =>  lfa = cfa-2
l>body                  ' here dup lfa - +      ( lfa  =>  pfa = lfa+4
>name                   c>pfa nfa               ( cfa  =>  nfa

* Ein-/Ausgabe, Compiler
sliteral                "                       ( compilierend: ansi-aequivalent
find                    -find IF $c0 < 2* 1- ELSE here 0 ENDIF
find                                            ( und das gegenstck
 IF dup >name c@ 1 ELSE drop 0 THEN             ( von F83 nach f.i.g.
create                  0 variable -2 allot
does>                   ;does>                  ( identisch, fr F83+
create .. does>         create .. ;does>        ( die F83-paarung
0 constant              <builds                 ( Definitionswartanfang
unsmudge                unsmudge                ( aus C1 bernommen
reveal                  unsmudge                ( identisch
r> dup 2+ >r            r+                      ( F6-kurzform
>in                     in
state @                 literal                 ( ist "state sensitiv"
  IF postpone literal THEN
postpone standardname   compile                 ( Compilerwort erzeugen
postpone immediatename  [compile]               ( Ausfhrung bei Aufruf
postpone                [_]                     ( nachbildung im F6
word    ( von tib )     word here               ( von Eingabequelle
end?                    blk@ -dup IF block ELSE tib@ ENDIF in @ + c@ 0=
        ( end? ist in der Aktion des <nul>-Wortes enthalten, darum im F6 unntig
nuf?    ( soll wohl sowas wie "enough?" heien, dann:
( nn ) nuf?             ( nn ) depth <
tib     ( ist Eingabequelle )   tib @           ( ist nur der t.i.b.
'tib                    tib                     ( die User-Vari
#tib                    span                    ( aus F79 bernommen
variable                0 variable              ( f.i.g.-vari werden
2variable               0. 2variable            (     initiiert
?branch                 0branch
exit                    ;s                      ( im F6 stets ohne Risiko
then                    endif                   ( f.i.g.-4th hat nur ENDIF
                : then [compile] endif ; immediate ( mag als Ersatz dienen

* div. Operationen
ascii                   bl word here c@ literal ( im F6 als "{"-Praefix
alias                   defer                   ( der einfachste Ersatz, oder
                : newname -compile oldname ; immediate ( ohne Laufzeitverlust
aligned                 1 and allot             ( dp auf Adressenposten
align                   -2 swap and!            ( zelle geradzahlig
ctoggle                 swap toggle             ( xor im speicher
                        1- $ffff.00ff 2and xor! (    gleichwertig
perform                 perform         ( @ execute -- : cfa ausfhren
leave   ( bewirkt in einigen 4th-Varianten sofortiges Verlassen der Schleife
        ( ist im f.i.g.-4th das quivalent von  { r> drop r> dup >r >r }
?leave                  -leave                  ( entspricht { IF leave ENDIF }
        ( das sofort beendende {?leave} kann nachgebildet werden:
?leave                  IF leave ELSE ... ENDIF LOOP
words                   vlist

* Eine hi-level-Definition von ENTER/ENTRY lautet
    : ENTER compile branch here 0 , 5 ;                             immediate
    : ENTRY ?comp depth 4 < 1 ?error 2swap 5 ?pairs here over - ! ; immediate
* und mit Einsprung z.B. bei nicht erfllter IF-Bedingung
    : -ENTER [compile] IF drop 5 ;                                  immediate
Weitere hi-level-quivalente im F6 definierter oder allgemein gebruchlicher
Worte finden sich an verschiedenen Stellen in "forth_scr" in einer Form, die
sie zumeist auch fr andere Forth-Systeme nutzbar macht.

* Das ANS-"Forth", ein paar Beispiele
Die Paarung {get-order}/{set-order} kann ganz allgemein zusammen mit einem neu
eingefhrten {def-order} lt. "forth_scr" gelegentlich ganz praktisch sein. Neben
dem Versuch in "ansext_scr", vollstndige Standard-bereinstimmung herzustellen,
sind u.a. folgende Worte probehalber in "forth_scr" definiert:
additions               definitions             ( identisch
get-current             current @               (
get-order               ( z.B. im wort {.vocs} enthalten. Kann aufgebaut werden:
                    context 0 #vocs 0
                    DO drop count-w dup IF swap ELSE 2drop leave ENDIF i LOOP
search-wordlist         (find)                  ( mix aus f.i.g. & F83
set-current         ' vocabularname 4+ current !
set-order               ( umkehrprocedur von {get-order}, wird im F6 durch
                        ( nennung der vocabularnamen und {also} ausgefhrt.
wordlist                ( inaktive vocabulardefinition, nennung des namen gibt
                        ( eine adresse zurck, die dann erst an context oder
                        ( current etc. bergeben werden mu.
def-order               ( F6-Nachtrag, definiert Worte, die beim Aufruf die zum
                        ( Definitionszeitpunkt gltige Vocabularordnung passend
                        ( fr {set-order} zum Stack liefern.


* Die hi-level-Definitionsworte <BUILDS und DOES> rsp. CREATE und ;DOES>

* <BUILDS .. DOES> des f.i.g.-Forth
Zum Anlegen definierender Worte bedient man sich im f.i.g.-Forth der Paarung
<BUILDS mit DOES>, deren Namen recht genau beschreiben, wozu die jeweiligen
Teile eines solchen Wortes dienen. Die mit diesen gebauten neuen Worte weisen
zwar eine mit dem Programmiermodell konfliktfreie Datenstruktur auf, jedoch
stimmt diese in einem wesentlichen Teil nicht mit den sonstigen Colon-Defini-
tionen berein. Sie erhalten nmlich eine doppelte CFA, die erste enthlt den
blichen Sprung in ausfhrbaren Code, nur ist die "Gebrauchsanweisung" hier
sehr allgemein gehalten, denn sie besagt allein, da der nchste Posten auf die
Adresse zeigt, an der das (;CODE) als Einleitung des beim Aufruf auszufhrenden
hi-level-Teils steht. Somit liegt die PFA, und damit die sonst z.b. mit "tick"
adressierbaren Daten eines Wortes, um zwei Bytes "hher": Die Daten z.B. einer
mit <BUILDS..DOES> gebildeten Constanten-Struktur drfen dann keineswegs mehr
mit "tick" verndert werden. Das quivalent der gewohnten PFA erhlt man mit
        ' name 2+

Diese vernderte Adressenlage hat gewisse Nachteile, fordert sie doch hufig
Zusatzabfragen, da ja die Bauart nicht vorhergesagt werden kann. Was nebenbei
auch die bertragung von Programmen in andere 4th-Systeme ungemein erschwert
und zumindest im ersten Anlauf dabei Fehler nahezu unvermeidbar macht.

* CREATE .. DOES> der spteren Standards - im F6 mit ;DOES>
So lag die berlegung nahe, zur Vereinheitlichung die Zusatzinformation in den
DOES>-Part zu verlegen, und fr den Wort-Header das ohnehin bereits vorhandene
CREATE zu benutzen. Die CFA eines neuen Wortes zeigt dann direkt in den Ausfh-
rungsteil der dieses bildenden Definition. Folge ist, da die CREATE..;DOES>-
Paarung Worte aufbaut, deren Kopfteil sich in nichts mehr von den Standard-Wor-
ten unterscheidet, insbes. also mit dem Parameterfeld an gewohnter Stelle.
Bezglich der Ausfhrungszeit halten sich die beiden Varianten etwa die Waage,
die CREATE..;DOES>-Konstruktion bentigt im Definitionswort zwei zustzliche
Speicherzellen, spart jedoch bei den damit gebildeten Worten jeweils eine ein.

Da das vom f.i.g.-DOES> benutzte (;CODE) nur fr den Abschlu eines hi-level-
Wortes im Processorcode sorgt, mu eine Ergnzung angegeben werden, die irgend-
wie den "instruction pointer" (den 4th-Programmzhler) fr die Rckkehr sichert
und ihn auf den Ausfhrungsteil einstellt. Dies wird im F79 und den folgenden
Standards durch das Wort DOES> erledigt, welches im F6 aber bereits besetzt ist.
Darum wurde ;DOES> definiert, das dem DOES> der F79+ entspricht, und als Beson-
derheit im F6 auch die Vererbung der Ausfhrungsanweisung erlaubt.
Wie dieses ;DOES> aussieht, ist oben bei dem Assembler-Worten beschrieben.


* Systembedingte Fehler

In den Original-QL-Systemen gibt es Fehler bei gewissen Winkelfunktionen, die
neben den F6-Bereichen auch sonst im Speicher groen Schaden anrichten knnen.
Ab Version 8.03 ist das F6-System hiergegen abgesichert (aber nicht das QDOS).

Beim SMSQ und SMSQ/E (im PeZe mit QXL-Karte) traten weitere Fehler auf:

Vom configurierten Monitortypen VGA oder EGA abhngig zeigten sich signifikante
Unterschiede im Ablauf der Bildschirm-Ein-/Ausgabe, selbst die Dateienbehandlung
war unter sonst identischen Bedingungen mitunter nicht gleich. Ursachenforschung
wurde hier nicht betrieben, aber aus diesem Grunde der Hinweis, da der Autor
das System (vor allem wegen der unverzerrten Graphik-Wiedergabe) auschlielich
im EGA-Modus betreibt und da in den anderen Modi keinerlei weitere Prfungen
bezglich des F6 unternommen wurden.

Es kann vorkommen, da nach einer WIN-Operation die Meldung "fehlerhafter Da-
tentrger" erscheint, obwohl aus anderen Programmen heraus das betr. Laufwerk
noch zugnglich ist. Vor allem bei {l-load} trat dieser Fehler hufig auf. Er
war nie genau nachvollziehbar und lie sich nicht gezielt reproduzieren, obwohl
der Zusammenhang recht deutlich ist: Mehrere OPEN_IN-Kanle zum selben File,
nur Lesevorgnge und Verstellen des Filepointers. Da er aber mit identischen
Dateien und Codes bei FLP-Zugriffen nie zu beobachten war, scheint die Ursache
eindeutig nicht im F6 zu suchen. Abhilfe war nur durch Umbau des Forth-Wortes
mglich, wo nun in den SMSQ-Varianten von einem F6-Job nicht mehr mehrere Ka-
nle auf dieselbe Datei zugleich geffnet werden.

PAR mit fixem Puffer ist SMSQ/E versionsabhngig extrem fehleranfllig, die
Fehler kommen insbes. bei der Druckerausgabe durch den F6-Editor zum tragen.

MODE ist futsch, sobald das CON-/SCR-Device durch eine Systemerweiterung ver-
ndert wird; ein Beispiel gibt die sonst hervorragend bewhrte Command-Line-
History von Oktagon. Weitere Fehler ergeben sich in diesem Zusammenhang nicht.
Abhilfe zumindest fr den Basic-Befehl schafft PEX ab Version 18.


        Dennoch, f.f. wnscht Ha-peh!
        Berlin, 14.9.1995 - 19.12.1995 - 18.1.1996 - 20.8.1996  .hpr


* nderungen seit 8.00, ltere Versionen s. "F6CHG_txt"

* F6-Kern

Einige Fehler bei den Aufrufen aus dem Pointer-Environment, die im Zusammenhang
mit den SMSQ/E-Varianten auftraten, wurden korrigiert.

Gegen den Fehler der QL-Systeme, der wegen Fehladressierung in einer Arithme-
tikroutine den Speicher verderben kann, wurden Vorkehrungen getroffen. Dies
zeigt sich im Original z.B. oft durch Steckenbleiben im Aufruf einer Winkel-
funktion oder verdorbenen Speicher, was nun aufgrund einer Schutzmanahme im
F6 nicht mehr vorkommen kann.

Das DOES> der F79+ Standards hat Vorteile, wegen derer das F6-System um die
Definitionen-Ausfhrung durch {;does>} erweitert wurde. Insbes. in "bh_scr"
sind mit Sicherheit noch nicht alle anzupassenden Stellen erfat (die PFA
liegt 2 Bytes niedriger). Dort ergeben sich vom Wortaufbau abhngige Fehler.

SEARCH und NO-SEARCH wurden in Ordnung gebracht.

Bei CASE:-Listen werden negative Indices auch bei Werten < -16383 von ersten
Wort bernommen, positive entsprechend vom letzten.

In der Schluoptimierung werden zu groe Sprungdistanzen automatisch berck-
sichtigt, soda keine unkontrollierten Vorwrtssprnge mehr entstehen knnen.

BASIC wurde in das Forth-Vocabular bernommen und ist vom IO2 unabhngig.

EDLINE korrigiert, hat nach Eingabe am Stringende 2 Bytes zuviel gelscht.

FSCHECK aus dem qdos-Vocabular korrigiert.

L-LOAD holt nun auch Worte mit Namen, die mit dem Anfang anderer Namen ber-
einstimmen, und die in der Reihenfolge nach jenen im durchsuchten Screenfile
stehen. In der alten Form wurde z.B. ein {: ms} nach dem {: msg} nicht mehr
erreicht. Der Aufruf hat das zuerst mit dem Suchbegriff ab dessen Anfang iden-
tische Wort als gefunden bewertet, ungeachtet der Lnge des gesuchten Wortes.
Dies wurde in Ordnung gebracht.

{XX - Das Zahlen-Praefix fr ein Schriftzeichen eignet sich auch zum Holen
zweier Zeichen, die in den beiden Bytes einer Integer zurckgegeben werden.
Bei Strings mit anderer Lnge als 2(+1 fr die Klammer) kommt weiterhin nur
das erste Zeichen mit seinem Code als Integer zurck.

SEAL schliet das CURRENT-Vocabular ab, das danach leer erscheint.
Alle anderen Vocabulare und die Suchordnung bleiben unberhrt.

* Schutzfunktion des Secundr-Jobs - s. {break}
Die {find}-Varianten wurden wieder in den berwachten Bereich gelegt, auerdem
ein paar weitere Aufrufe aus der Ziffern-Umwandlung. Fngt sich das System bei
der Wortsuche einmal in einer endlosen Schleife, ist auch dort Abbruch mglich.
Aufgrund von Systemeigenheiten des SMSQ/E darin jedoch gelegentlich wirkungslos.
Falls das PIF aktiv ist, kann nach einer Bewegung des Cursor-Sprite die in den
Systemvariablen vorhandene Referenz auf den gerade aktiven Job verlorengehen.
Sie wird dann durch Daten des PIF berschrieben und es gibt keine sichere
oder in irgendeiner Form dokumentierte Mglichkeit mehr, unter den besonderen
Gegebenheiten des berwachungsjobs den auslsenden F6-Job zu ermitteln.
Darum wurde eine Variante eingefhrt, die durch die rechte Maustaste ausgelst
wird, whrend der Mauscursor ber dem Fenster des abzubrechenden F6-Jobs steht.
Wenn das PIF aktiv ist, und vor einem Abbruchversuch Maus oder Cursor bettigt
wurden, ist dies im allgemeinen die einzige Abbruchmglichkeit.

* NEU
Als neue (teils noch ungeprfte) Worte im Kern wurden eingerichtet:
d1+     d2+     d4+     d1-     d2-     d4-     In-/Decrement an doubles
d2/     d4/     q2/     q4/                     schnelle Division
q<      qu<     qs*                             quad-Operatoren
qlit    quad    no-quad                         zum Compilieren von quad-Zahlen
roll                                            in FP auch -ve wie in FORTH
is-his                                          Prfung auf "history"
                                                (Erweiterungscode von 'Oktagon')
nopdf                                           leeres {defer}red Wort
[cprim] [cdefer]                                asm68: Subroutinen-Hilfspointer
[jdt]                                           qdos: ptr auf Systemdaten
* bei +origin eingefgt:
        56      Abstand cdt (A0 in extop) zur i/o-queue
        60      Adresse der PIF dummy-queue
Die Positionen ab th-entry erhhen sich entsprechend.
        78      Mauscode fr {break}.

* C-SAVE
CS-TYP als Cons zur freien Wahl der Filetyp-Codierung eingefhrt.
Die Standardvorgabe mit dem Wert 3 wurde unverndert beibehalten.

* DEBUGGER
Der Zahlendarstellung bei {.s}/{.rs} wurde zur Zifferngewinnung eine locale
Speicherpartie zugewiesen. Damit knnen nun auch Worte untersucht werden, die
mit {hld} arbeiten. Selbst das zur Zifferndarstellung der Zahlen eingesetzte
Wort wurde auf diese Weise tauglich fr den Einzelschrittbetrieb.

* MODE
Der {mode}-Aufruf aus dem qdos-Vocabular bleibt im SMSQ/E systembedingt ohne
Wirkung, falls die i/o-Aufrufadresse im CON-Handler gendert wurde, wie z.B.
durch PEX oder die HISTORY von Oktagon (s.o.).
Im F6 (und im Basic) gibt es einen Ausweg, sofern als erste CON-Ergnzung
PEX19 (oder jnger) geladen wird. MODE steht als erneuerter SBasic-Befehl mit
PEX zur Verfgung. Anderen Programmen wird er mit Hilfe eines Vectors aus dem
mit "dvs_byt" nachladbaren MEM-Device zugnglich. Der Mode-Aufruf des F6 nutzt
diese Mglichkeit, sofern der zustzliche Code geladen wurde, soda er dann
wieder einwandfreie Ergebnisse liefert. Auerdem wurde die Parameterbergabe
(mit den Vorgngerversionen konfliktfrei) gendert; dies ist oben an entspre-
chender Stelle im qdos-Vocabular angegeben.

* EDITOR
Der F6-Editor startet stets im schreibgeschtzten Modus, um versehentliche
nderungen an den Screenfiles mglichst ganz auszuschlieen. Dies wird durch
die Variable {(update)} gesteuert, { (update) on } gibt das Schreiben frei.
SH/F5 (F10) schaltet im Editor zwischen Schreibfreigabe und -Sperrung um,
   F4       zeigt den jeweiligen Zustand an, ohne ihn zu ndern.
Zeilenmarkierung:
   F2       setzt eine Marke in der aktuellen Cursorzeile. 16 Marken je
            File rsp Editor-Teilbereich sind mglich.
   SH/F2    zum Aufsuchen der nchsten Markirungsposition
   SH/F"
   CTR/SH/F2 lschen aller Marken im aktuellen Editorteil.

* FTEST
Variante in "forth_scr" mit eigener und TK2-definierter Devicevorgabe
in Ordnung gebracht. Der gefundene Name ist unmittelbar nach dem Aufruf
als qdos-String in {here} lesbar - {here} ist ggf. geradzahlig justiert.
Als direkt eingebener Aufruf mu FTEST darum in "|" eingefat werden.
Die Vorgabe ist zunchst stillgelegt, man gibt sie mit { ddir on } frei.
Gesucht wird dann in der Reihenfolge:
        ohne Devicezusatz
        mit eigener Vorgabe aus der {f-name}-Definition {drv}
        mit progd$ des TK2 o. der ggf. automatisch nachgesetzten F6-Erweiterung
        mit datad$ dto.

* MSG
Die Wortgruppe zur externen Textspeicherung wurde dahingehend gendert, da
sie auch mit Speicherblcken ab 32K fehlerfrei arbeitet. In "f6xco_scr" sind
die ausfhrenden Worte als lo-level-Definitionen angegeben, die wesentlich
schneller ausgefhrt werden, als die hi-level-Vorlage aus "forth_scr".

* "bh_scr"
Die versionsbedingten Verwirrungen stecken so tief, da es bisher noch nicht
gelungen ist, ein fehlerfrei arbeitendes Programm zu compilieren. Das Inter-
esse des Autors hlt sich insofern auch in sehr bescheidenen Grenzen, als es
lngst in brauchbarer Form vorliegt, und eine neue Version um ihrer selbst
willen zu erzeugen ganz und gar berflssig erscheint, zumal die Original-
version sich schon einige Jahre bestens bewhrt hat. Um dies zu belegen, ist
sie in ungeschmlerter Form beigefgt; sie mag bei Interesse als Referenz fr
eigene Versuche mit dem neuen F6-Kern dienen. Verwendung fr den Eigenbedarf
ist freigestellt.

* SOFTWARE-STACKS
Fr die nahezu unbegrenzte in Stackform verwaltete Datenspeicherung stehen in
"f6xco_scr" einige Operatoren zur Verfgung, die auch in vorcompilierter Form
mit {c-load} aus "f6xco_4th" geladen werden knnen, und dann ohne den Assembler
(aber zustzlich zu den "heapmem"-Worten) lediglich 400 Bytes Platz bentigen:
>s      ( zahl dadr -- )
        Zahl ablegen.
">s     ( dadr1 count dadr2 --)(n.i.)
        Anzahl count Bytes von dadr1 auf den Stack dadr2 bringen.
&>s     ( dadr1 count1 count2 dadr2 --)(n.i.)
        Anzahl count1 Bytes von dadr1 an den String der Lnge count2 in Stack
        dadr2 anfgen und ggf. auf gerade Anfangsadresse justieren.
?>s     ( zahl dadr -- )
        Zahl ablegen, sofern sie noch nicht im Stack vorhanden ist.
=s      ( zahl dadr -- dnum|0 )
        Vorhandensein einer Zahl prfen und deren Postennummer ermitteln,
        dnum zhlt ab dem ltesten Posten.
=s+     ( zahl dnum dadr -- dnum|0 )
        Zahl im Stack dadr suchen, beginnend nach dem Posten dnum (ab dnum+1).
s>      ( dadr -- zahl )
        jngste Zahl entnehmen
"s>     ( dadr1 count dadr2 -- )(n.i.)
        Anzahl count Bytes vom Stack dadr2 nach dadr1 bringen.
@s      ( dn dadr -- zahl )
        ab ltester Position zhlenden Posten Nr. dn lesen; eine dem 4th-Wort
        {pick} entsprechende Funktion, zhlend ab Null, erhlt man z.B. mit
                : pick-s 2dup ?s 2rot d- 2swap @s ;
"s@     ( dadr1 nn dadr2 -- )(n.i.)
        Mit vorangestelltem count.w gezhlten Stringposten nn aus dem Stack
        dadr2 ohne count.w nach dadr1 bringen.
?s      ( dadr -- dn )
        benutzte Stacktiefe ermitteln, entspricht dem Forth-Wort {depth}.
s-err   ( -- er )
        Fehlercode bei berlauf oder leerem Stack

Die Art der Zahlenposten ist FP oder Integer, abhngig vom Vocabular, das zum
Zeitpunkt der Ausfhrung {context} ist.
Postennummern und Stacktiefe sind stets doppelte Integer, da fr maximal 255K
Bytes Stackge 16-Bit-Werte zur Numerierung bei Integer-Posten nicht gengen.
Sie zhlen ab 1; 0 fr leeren Stack oder bei {=s} fr nicht vorhandenen Posten.

Bei berlauf wird der lteste Posten verworfen und die bergebene Zahl gelangt
wie sonst auch an die obere Stelle im Stack. Bei leerem Stack geht Null zurck.
Als Fehlercode bei berlauf steht 7 in {s-err}, bei leerem Stack 1, sonst 0.

Referenz auf diese Stacks erfolgt durch die stets gleichbleibende Basisadresse,
wie sie von einer "heapmem"-Definition zurckgegeben wird, und nach Bedarf mit
Angabe einer double-Postennummer sowie der abzulegenden Daten.

Ein hiermit verwalteter Softwarestack von z.B. 41K Gre wird eingerichtet:
        41 1024 4 */ heapmem stackmem
wonach der Aufruf {stackmem} nun immer die erforderliche Basisadresse liefert.
Die weitere Datenverwaltung erfolgt selbsttig durch die o.a. Worte.

Da an erster Position der Stackpointer in Gestalt der Anzahl durch Daten beleg-
ter Bytes steht, kann ein Stack "leer" gesetzt werden, indem man dort Null ein-
trgt: { 0. stackmem 2!l }; ebenso lt sich der Laufpointer willkrlich vern-
dern (geradzahlig!), berschieende Werte werden automatisch abgefangen.


* nderungen nach 8.03 - 8.07 (25.8.96) - aktuell: 8.13 (20.3.97)
* (Nheres hierzu im obigen Haupttext)

* F6-Kern

* Schreibweise          (v808), z.B. bei CREATE
Forth-Namen auf Groschreibung umgestellt, um den Freunden des ANS-Standards
Genge zu tun. Das System arbeitet weiterhin unabhngig von der Schreibweise.
Wortnamen werden von der Eingabe unabhngig in Groschreibung angelegt.
Zeichen ab Code 128 bleiben in der bisherigen Schreibweise erhalten.
Diese nderung geht geringfgig zulasten der Compilezeit.

* ( nn ) >LOC           (v805)
* ( nn ) LOC>
Die den Localen Variablen zugrundeliegende Speicherverwaltung ist hiermit direkt
zugnglich und erlaubt die "dynamische" Zuweisung und Freigabe localer Speicher-
bereiche. Damit knnen in einem Wort whrend dessen Ausfhrung in ihrer Gre
vom Programmverlauf abhngige Bereiche fr locale Daten angelegt werden.

* +ORIGIN               (v805)
Falsche Abstandsangabe ab Position 74, richtig sind
        74      {ert}-Aktivierung/-Sperrung
        76      Maus-Code fr {break} bei bernahme durch PIF
        78      Abbruchcode von {break} - (neu v805)

* BREAK                 (v806)
Da die HOTEKEY-Routinen je nach Version (insbes. im SMSQ/E) die Funktion der
Abbruchtaste vllig zunichte machen knnen, wurde ein Programmteil eingefgt,
der jene berlagert. Im F6 mit dem genderten Aufruf { zahl BREAK } bergebe-
ne Codes einer Abbruch-Taste wirken nun zuverlssig und gegenber einer evtl.
mit demselben Code definierten Hotkey-Taste vorrangig, dies jedoch nur in der
Variante ALT/Tastencode. Die Funktionsweise im F6 ist unverndert geblieben,
d.h. auch die nicht zusammen mit ALT bettigte Taste wirkt - sofern Hotkey-Job
oder das PIF dies nicht verhindern - zum PIF s.o. bei {break}. Wird ein F6-Job
aufgegeben, verliert zugleich auch seine Tastencodierung ihre Wirkung und die
vorher darauf gelegten Hot- oder Altkeys erhalten ihre alte Funktion zurck.

* CONS+                 (v813)
definiert ein CONSTATen-hnliches Wort, das beim Aufruf den bei Defininition
zugewiesenen Wert zu einem bereits vorhandenen Posten im Stack addiert.
Das Wort bildet u.a. die Grudlage zu den Increment-Operatoren {1+} etc.

* CONSM+                (v813)
Wie CONS+, jedoch wird die Zahl vorzeichenerweitert zum doppeltgenauen Posten
im Stack addiert.
Das Wort bildet u.a. die Grudlage zu den Increment-Operatoren {D1+} etc.

* DU>                   (v807)

* FOPEN-Varianten
waren nur in direkter Eingabe oder nach {[compile]} verwendbar, da ein
{literal} in der compilerenden Funktion fehlte. Dies ist nachgetragen.

* FSSAVE                (v814)
wird mittels io.sstrg simuliert, um Fehler durch vorzeitigen Abbruch beim
Senden ber NETzwerk zu umgehen (BACKUP in forth_scr hnlich gendert).

* HLD                   (v808)
unmittelbar auf {hld} folgend steht ein weiterer Posten, der ab { hld 2+ }
als vorzeichenerweiterter doppeltgenauer 4th-Ptr den bei der Umwandlung von
Zahlen in Ziffern benutzten Anfangswert enthlt. Damit und mit dem gleichar-
tigen Lauf-Ptr von { hld 2- } kann der Ziffern-Puffer an beliebige Stelle
umgesetzt werden, insbes. z.B. auf locale Speicherbereiche, wodurch dann
jegliche Konflikte zwischen ziffernausgebenden Worten zuverlssig ausgeschlos-
sen werden knnen.

* LOC> und END-LOC      (v808)
wurden gegen Freigabe zu groer Bereiche soweit abgesichert, da Schden am
System (durch berlauf von S0 in den T.I.B. oder Returnstack) auszuschlieen
sind. Die regulren Daten im Stack bleiben im allgemeinen erhalten, sind aber
je nach Situation nicht immer sicher. Gleiches gilt in hherem Mae fr evtl.
existierende ltere locale Felder. Dieser Schutz ist keinesfalls als Wort-
eigenschaft zu nutzen, er soll einzig sicherstellen, da insbes. durch ber-
schreiben des Returnstack das umgebende System des QL nicht in Mitleidenschaft
gezogen wird. Besondere Fehlermeldung ist nicht vorgesehen.

* LOC>STK               (v813)
Ein besonders schneller Operator zur bergabe smtlicher aktueller Locals
in unvernderter Reihenfolge zum Stack. Ggf. vorher dorthingebrachte Posten
bleiben unverndert adressierbar, die Locals gelangen an das zu hheren
Adressen hin gelegene Ende in den Bereich ab dem ursprnglichen Pointer aus
der User-Vari S0 bis zur nun dort verzeichneten Stack-Grenze.
Das "Geheimnis" dieser Variante liegt darin, da hierzu nur der Inhalt von S0
so gendert werden mu, da er ber den hchsten ehemaligen Local-Posten zeigt.
Es findet sonst keinerlei Datentransport statt. - Entsprechend s. STK>LOC.

* LOCAL                 (808)
Als Grundlage zur ANS-vertrglichen Systemerweiterung wurde die LOCAL-Dekla-
ration so abgendert, da eine beliebige Anzahl Leerzeichen zwischen den Buch-
staben und vor dem abschschlieenden Strich "|" stehen darf. Z.B. ist statt
        ..  LOCAL ABCD|  ..
nun auch folgende Schreibweise zulssig:
        ..  LOCAL   A B   C  D | ..

* M>S ( ..nn cm -- ..nn n1..nm )        (816)
Anzahl cm Bytes vom Speicher zum Stack holen.

* QUAD
Am Ende des von [number] durchlaufenen Aufrufs wurde bei gesetztem {quad}-
Flag statt {dpl} der zurckgegebene Flagwert mit $ff00 verknpft. Dies ist
korrigiert, ebenso die Bearbeitung negativer Zahlen.

* S==
wurde mit verdrehter Parameteranordnung beschrieben. Richtig gilt dadr1
fr den zu suchenden String und dadr2 fr den betr. Speicherbereichsanfang.

* S>M ( ..nn n1..nm cm -- ..nn )        (816)
Anzahl cm Bytes vom Stack in den Speicher bertragen.

* SPAN
wird beim Jobstart mit der Parameterstring-Lnge besetzt.

* STK>LOC               (v813)
bergibt den gesamten Stack-Inhalt in den Local-Bereich.
Da hierfr lediglich S0 auf den Wert von SP@ zu setzen ist, wird dieser
Aufruf auerordentlich schnell ausgefhrt. - Entsprechend s. LOC>STK.

* SUSJB
Die Wartezeit wird als einfache Integer angegeben.

* USER
Automatische Indexzuweisung bei Angabe -1 in Ordnung gebracht.
Hinweis: {#user} gibt Anzahl Bytes der gesamten User-Area zurck.

* WD-SIZE
Der bei Erfolg zurckgegebene 'true' Flagwert gibt zugleich die Cursorbrei-
te an. Compiliert kann anschlieend mit L<I auch die Hhe gelesen werden.
Fehler bei Rckgabe Null, wenn angegebener Kanal nicht existiert, korrigiert.


* "forth_scr"

* ANS-Standard          (v807) => "ansext_scr" (v813)
Bis auf wenige Ausnahmen in den Erweiterungsvocabularen sind alle Worte des
ANS-Standards vorhanden. Mit "L-LOAD" und dem Suchbegriff "ANS-VOC" werden
die fehlenden Definitionen nachgesetzt, abweichende Eigenschaften angepat
und das Ganze im FORTH nachgeordneten Vocabular ANS-VOC zusammengefat.

* DEBUGGER
"Breakpoint" eingefhrt, Erluterung s.o.

* FTEST
erneut in Ordnung gebracht, alte Korrektur hatte ein {rdrop} briggelassen.

* L-LOAD                (v807)
berarbeitet soda nun auch Suchworte gefunden werden, die sich mit dem
Anfang davor angeordneter lngerer Begriffe decken.

* T.
Zahlenausgabe in {.s} und {.rs} zum Debugger spielte nur bei {here} > 0.
Mit Hilfe localer Speicherung gendert & oke.

* QDOS-Jobs
EX und EW compilierende Form in Ordnung gebracht, ergnzt um EX-P und EW-P
mit Parameterstring. Die Varianten sind 'immediate'. Sie knnen in dersel-
ben Art, wie z.B. {fopen} compiliert, compilierend oder direkt aufgerufen
werden und geben die ID des neuen Jobs und den (double) Fehlercode zurck:
        EX-P jobfilename  parametertext 
Das Zeichen {} hat den Code 159 und liegt bei der deutschen QL-Tastatur
auf CTR/SH/- und bei QXL/SMSQ auf SH/'.
Der allen zugrundeliegende allgemeine Aufruf steht im hidden-Vocabular:
-exec           ( ex/ew ptr d.ernum -- d.jobid d.ernum )
        ex/ew   ist 0 fr freilaufende Jobs, -1 zur Verriegelung des initi-
                ierenden Jobs bis der neue Job beendet ist.
        ptr     zeigt auf den Parameterstring (qdos- oder 4th-Typ), den Ptr
                auf eine leere Zelle, z.B. {+nul}, bergibt man, wenn der
                Aufruf ohne Parameterstring ausgefhrt werden soll.
                Kanalparameter sind nicht vorgesehen.
        d.ernum ist der Fehlercode aus dem OPEN-Aufruf fr das File, aus dem
                der Job installiert werden soll. Hat es nicht den Filetypen 1,
                oder konnten die typbestimmenden Daten nicht gelesen werden,
                bricht der Aufruf mit err.bp (-15) ab. Der zugehrige Kanal
                wird in {work} erwartet, wo ihn die {fopen}-Varianten des F6
                stets eintragen, am Ende des Aufrufs wird {work} geschlossen.
                Fehlermglichkeiten aufgrund ungerader Filelnge oder Daten-
                speicher-Zuweisung werden in {-exec} durch Justage auf den
                jeweils nchsthheren geradzahligen Wert abgefangen.
        d.jobid ist die Identifikation des neuen Jobs. Wurde d.ernum =/= 0
                zurckgegeben, ist deren Verwendbarkeit von der Art des Feh-
                lers abhngig. {frjob} zur Freigabe des ggf. fr den Job re-
                servierten Speichers ist aber stets riskolos und ohne Fehler-
                abbruch sofort mit den zurckgegebenen Daten ausfhrbar.

* "f6asm_scr"
Nach Korrekturen zum Assemblieren in Dateien haben einige Beipiele fehlerfreie
Codepassagen erzeugt, wieweit der ganze File-Assembler spielt, ist ungeprft:
{f-f}      hat von {posab} hinterlassene flag nicht bercksichtigt,
{e?fer}    Fehlermeldung daraus wird nun hiermit abgefangen.
{segment}  und
{codefile} ganz umgebaut und in's Forth-Vocabular bernommen.
Das Assemblieren mu nun stets mit irgendeiner Form der Zielzuweisung begin-
nen, im einfachsten Falle z.B. fr den Forth-Speicher
        0. SEGMENT 4th
        4th
code: ...


* "forth_asm"
Zugunsten von {>loc} und {loc>} entfernt:
baud            ( -- n1 )                               F6
                Cons, hilfsweise fr die Baudrate reserviert.
h;              ( -- ) oder ( ptr 9 -- ) (C)            F6S
                Abschlu einer headerlosen Colon-Definition.
{h;} kanm in den verschiedenen Screenfiles ohne sonstige Anpassungen
durch {;} ersetzt werden.


*  eof 
