* 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 enth€lt als Steuerzeichen nur <lf> - Code 10 - am Zeilenende und um-
faœt 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 - EINF§HRUNG
                              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 ge€ndert haben):
        ftp://ftp.taygeta.com/pub/forth/68000/misc
Stets auf j‡ngstem 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 Identit€tskrise zu geraten, sowie eigenes Handeln auch selber zu verant-
worten, f‡r den ist der ganze Rechtskram, der hier vorangestellt ist, ziemlich
‡berfl‡ssig.
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 unerm‡dlich an Versuchen beteiligt sind, sich kostenlos
in Besitz von G‡tern anderer zu versetzen, wobei ihnen offenbar kein noch so
perfider Dreh zu schmutzig oder zu dumm ist, sie sich nicht einmal entbl„den,
eine rein fiktive Handelstauglichkeit solch kostenlos verteilter Programme
einzuklagen, und sie anscheinend damit sogar noch "Recht" bekommen k„nnen, 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 heiœt das, daœ die G‡ltigkeit
der vom Autor in deutscher Sprache formulierten und in "GNU-G_txt" beigef‡gten
GNU-Bedingungen vereinbart ist, erg€nzt um die §bereinkunft, daœ, insbesondere
f‡r den Urheberschutz, ausschlieœlich das Recht der Europ€ischen Gemeinschaft
anwendbar ist, mit Gerichtsstand Berlin, und jede rechtsverbindliche Korres-
pondenz oder Auseinandersetzung in deutscher Sprache erfolgt. Mehr dazu s.u.

Ausdr‡cklich wird f‡r keinen Teil der F6-Sammlung irgendeine Eigenschaft zu-
gesagt. Das zum F6 Geschriebene stellt unverbindliche Hinweise dar, die aus
beil€ufigen Beobachtungen an dem experimentellen Systemaufbau des Verfassers
gewonnen wurden und darum nicht allgemein maœgeblich sind; dementsprechend
kommt KEINE GEW HRLEISTUNG in Betracht.

Die Nutzungserlaubnis in Gestalt der GNU-Lizenz wird auœerdem nur unter der
Voraussetzung gegeben, daœ die Systembeschreibung gelesen und verstanden wurde,
welche Einschr€nkung einzig der weiteren rechtlichen Sicherheit im Verh€ltnis
zwischen Nutzer und Autor dient.

Die Lizenz gilt f‡r die Weitergabe nur, sofern stets auch die vollst€ndigen
und originalgetreuen Quellen mitgegeben rsp gleichzeitig wahlfrei und kostenlos
zum Abruf bereitgehalten werden - Bereitstellung "auf Anfrage" gen‡gt nicht!
"Originalgetreu" in diesem Sinne heiœt, daœ es nach Ver€nderungen wenigstens
durch geeignete Kennzeichnung jeder in der deutschen oder englischen Sprache
durchschnittlich sach- und schriftkundigen Person ohne fremde Hilfe m„glich
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 m„gen Markenzeichen darstellen oder sonstwie gesch‡tzt 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 M„glichkeit, 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.


* EINF§HRUNG

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

* Dieser Text
soll im wesentlichen alle im F6 definierten Worte mehr oder weniger kurzge-
faœt auff‡hren und erkl€ren. Weiter wird hier in groben Z‡gen das zugrunde-
liegende Programm(ier)modell erl€utert, und zu einigen wenigen Themen finden
sich Beispiele, die insbes. die ‡ber die Standardausstattung hinausgehenden
Eigenheiten n€her darstellen. Schlieœlich gibt es noch ein paar Tabellen als
Hilfestellung zum Umgang mit diesem und zur §bertragung in andere Systeme.

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


* GNU - wozu?
Mit dem F6 sollte ein verl€œlich dokumentierter und vollst€ndig durchschauba-
rer Forth-Kern speziell zum QL geschaffen werden, der auœerdem auch die g€ngi-
ge Systemsoftware und seine Firm-/Hardware uneingeschr€nkt zug€nglich macht.
Dies wurde erreicht.
Um weitestgehenden Nutzen bei Wahrung eigener Rechte sicherzustellen, wurde
die GNU-Lizensierung gew€hlt, 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 zug€nglich zu machen und (begr‡ndet durch weniger gute
Erfahrungen) die Urheberschaft klarzustellen.

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

In seinem Originalzustand enth€lt das F6-System keine Teile, die durch Rechte
anderer in der lizensierten Form der Verwendung eingeschr€nkt w€ren, beliebige
Varianten des F6 sind demzufolge in derselben Weise frei verwendbar, Empf€nger
von F6-Teilen brauchen sich ‡ber wom„glich unbeabsichtigte Urheberrechtsverlet-
zungen darum keine Gedanken zu machen, und k„nnen sie bedenkenlos weitergeben.

Da im Sinne der GNU-Lizenz jedes compilierte und unabh€ngig als Job ausf‡hrba-
re F6-Programm ein auf dem F6 basierendes Erzeugnis ist, wird die Lizenz inso-
fern erg€nzt, als Programme, die, auch mit Worten aus den beigef‡gten Dateien,
in den F6-Kern compiliert wurden, und damit NEUE EIGENST NDIGE ANWENDUNGEN
bilden, vollst€ndig der VERF§GUNG DURCH IHRE AUTOREN unterstellt sind, sofern
durch das betr. Programm auf diese Tatsache DEUTLICH HINGEWIESEN wird.

Solche eigenst€ndigen F6-Programme fallen demnach nicht automatisch unter die
GNU-lizensierte generelle Freigabe! Hier gelten ggf. die Vorbehalte ihrer Au-
toren. Kriterium f‡r "eigenst€ndige Programme" ist die Ausf‡hrbarkeit als ei-
genst€ndiger Job bei Unzug€nglichkeit von Compiler wie auch Interpreter, beide
m‡ssen dann gegen wahlfreien f‡r nicht durch das Programm selbst und zu seinem
Ablauf erforderlichen Zugriff gesperrt sein.

Die genannte Sperrung kann z.B. durch Pr€paration zum automatischen Start mit
auch im Fehlerfalle R‡ckkehr zum Programm(beginn) geschehen durch:
        ' anwendungswort cfa also hidden (quit) !
Hier ist es noch leicht m„glich, den Schutz zu brechen. Um dies zu erschweren,
f‡hrt man weiter aus:
        definitions seal
wonach der automatische Programmstart nicht mehr ge€ndert werden kann. Setzt
man weitere Vocabulare {current} und ruft dann {seal} auf, werden auch diese
leer erscheinen, und der Schutz gestaltet sich auœerordentlich best€ndig.
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
"eigenst€ndiges Programm" ist, zeigt sich letztlich von selbst. In Grenzf€llen
ist die o.g. Einschr€nkung jedoch unbedingt entscheidend und strikt.
Ein Beispiel ist z.B. in "bh_scr" gegeben, wo zwar die interpretierte Eingabe
f‡r Berechnungen in der Buchungszeile vorgesehen ist, sowie f‡r einige andere
Servicefunktionen, und der Compiler dem automatischen Nachtragen nicht defi-
nierter Konten dient, das System aber stets in das Programm zur‡ckkehrt.

* Warum Forth?
Forth hat die einzige(?) "lebende" Computersprache, und kennt keinerlei Ein-
schr€nkungen. Was das Lernen vielleicht ein wenig erschwert, und im Umgang
damit dieselbe Sorgfalt erfordert, wie eine "richtige" Sprache eben auch,
dann aber M„glichkeiten er„ffnet, die sonst nur mit allergr„œtem Aufwand zu
realisieren scheinen - wie etwa selbst€tig "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 Einschr€nkungen alle (QL-)ASCII-Zeichen enthalten k„nnen,
geschw€tzige Umschreibungen oder kryptische Abk‡rzungen darum unn„tig sind.
Beispiele dazu geben etwa die ‡blichen Forth-Assembler (s.dort). Der nat‡rliche
und ausnahmslos einheitliche Aufbau in aufrufbaren Worten und daraus zusammen-
gef‡gten S€tzen, die ihrerseits wieder je zu einem solchen Wort werden, f‡hrt
von selbst zu ‡berschaubar strukturierten modularen Programmen, deren einzelne
Teile sich leicht testen lassen und so schnell zuverl€ssige Programme ergeben.
Wer von angeblich "schlecht lesbaren" 4th-Programmen spricht, braucht sich nur
auf seine eigene Gestaltungsm„glichkeit zu besinnen, denn hier gibt es nichts,
was nicht ge€ndert werden k„nnte.
Die in geh€ufter Anordnung gelegentlich verwirrenden Stackoperatoren k„nnen mit
{stack} durch Listen ersetzt werden, deren Posten sich ‡bersichtlich hinschrei-
ben lassen, und bei {stack:} als Wortdefinition mit erkl€renden Namen versehen.

* OOP und Forth
Objektorientiertes Programmieren ist einerseits ein stark formalisiertes
Verfahren, urspr‡nglich aber ein aus dem nat‡rlichen Vorgehen abgeleiteter
Begriff, der auf nahezu jede Lebenssituation ‡bertragen werden kann. Es wird
damit eine Betrachtungs- und, daraus folgend, Programmierweise beschrieben,
die in ihren Grundz‡gen bereits urspr‡nglicher 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 f‡r einfache M„glichkeit der Kapselung gesorgt. Diese kann durch
abschlieœende Wahl eines Wortnamen gleichlautend mit dem Vocabularnamen absolut
dicht gemacht werden. Da es keine Begrenzung f‡r die Vocabularanzahl gibt, und
weil unabh€ngig von der nur 16 Posten umfassenden Stackanordnung jedem Vocabular
selbst noch ein bevorrechtigter Nachfolger (in der Such-Ordnung) eingepr€gt
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 M„glichkeit der
Vererbung auch der Ausf‡hrungsvorschriften 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 m„glich auf den QL
mit seinen vielen besonderen Eigenheiten ausgerichtet, nutzt sie umfassend und
macht sie der Programmierung vollst€ndig und auf einfache Weise zug€nglich.

* 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 Anf€nger erleichtern sollen, sich mit Forth anzufreunden.
Auœerdem werden hierin einige Neuerungen(?) vorgestellt, wie z.B. die "Vererb-
barkeit" auch der Ausf‡hrungsvorschrift von Definitionsworten, u.v.m.

* Warum h„rt man so wenig von Forth?
Oft stehen Geschw€tzigkeit und Qualifikation in entgegengesetztem Verh€ltnis...

* 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 M„glichkeiten 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 R‡cksicht auf Versionen
genommen werden muœ, es also problemlos transportable Programme erm„glicht,
und deren M„glichkeiten nicht nur die des SBasic weit ‡bertreffen.
Dem Autor dient das F6 seit langem in Form eines Programms zur Kontokorrent-
Buchf‡hrung. Damit ist vom einwandfreien Zustand des F6-Systems auszugehen.

Pr‡fung 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 allgemeing‡ltige Aussagen nicht m„glich 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 m„glich, ist der Speicherbedarf auf ca. 35K reduzierbar.

Alle Beschreibungen beziehen sich auf den Zustand des Systems, wie es beim Autor
in Betrieb ist und bestm„glich hierdurch weitergegeben wurde. Zusagen werden
dadurch nicht gemacht, womit eine eventuelle Garantieleistung sich von selbst
ausschlieœt, ebenso wie die Haftung f‡r Sch€den 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 vollst€ndiges Entfernen aus dem Speicher
ge€ndert werden k„nnen, und durch einen "€uœeren Interpreter" aus Textquellen
zur Ausf‡hrung 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 vollst€ndiges System darstellt,
wo nicht erst alles m„gliche Zeugs aus "libraries" dazugeladen werden muœ.
F‡r groœe Datenmengen l€œt sich das System um Definitionen erg€nzen, durch die
Daten, Texte und weitere Stacks im umgebenden Speicher angelegt werden k„nnen,
sodaœ nur f‡r Programme der 4th-Bereich benutzt werden muœ, was den tats€chlich
verf‡gbaren Speicherbereich und die m„gliche Programmgr„œe stark erweitert.
Auf volle 32-Bit-"Breite" wurde verzichtet, und damit auch auf das Compilie-
ren in Form direkt ausf‡hrbaren Codes: Insbes. bei "modernen" Processoren
n‡tzt es wenig, wenn dann heftig optimiert wird, aber die Adressierung weit
auseinanderliegender Teile notwendig dazu f‡hrt, daœ deren innere Verfahren
der Optimierung (in "caches") erheblich behindert werden ("localit€t" eng
zusammenliegender Datenbl„cke 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 Sondermaœnahmen selbst die Geschwindigkeit Pro-
cessorcode-compilierender Systeme erreicht werden kann. Unabh€ngig vom verf‡g-
baren Speicher, "den man ja hat", und mit welcher Ausstattung sich vielleicht
auch pr€chtig renommieren l€œt, wird nat‡rlich auch die Gesamtbelastung des
Systems durch die extrem kompakten Programme geringer und die solchermaœen
freigehaltenen Bereiche stehen f‡r andere Aktionen zur Verf‡gung. 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 erg€nzt; der ANS-Standard ist hier nur insofern
ber‡cksichtigt, als die zur Erweiterung dahin n„tigen Grundlagen gelegt
und die ANS-4TH Standard-Erg€nzung zum nachtr€glichen Compilieren vorbereitet
sind. Dagegen finden sich im F6 z.B. die erweiterte und mit (soweit bekannt)
allen Standards vertr€gliche 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
erw€hnte M„glichkeit der Weitergabe der Definitionsvorschrift eines Wortes.
Ein rudiment€res 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. Auœerdem sind die QL-
spezifischen Trap-Aufrufe f‡r Ein-/Ausgabe, Files, die Bildausgabe und zum
Rechnen mit FLIESZKOMMAZAHLEN vollst€ndig und in (wie zu hoffen) leicht be-
dienbarer Form vorhanden. Auch das POINTER INTERFACE (PIF) wird, sofern vor-
handen, problemlos zug€nglich. Zugriff auf WINDOW MANAGER und HOTKEY SYSTEM
sind vorbereitet, teils auch bereits definiert. Daneben sei auch auf den Satz
Operatoren f‡r VIERFACHGENAUE (64/63-Bit-)INTEGER-Zahlen hingewiesen, und die
gesonderte §bersichtsliste aller Rechenoperatoren gegen Ende dieses Textes.
Jeder F6-Job enth€lt einen zu 20ms unabh€ngig Interrupt-getakteten TIMER.

Auch eine Form der direkten EINGABE und AUSF§HRUNG 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 ausgef‡hrt werden, sie muœ compiliert sein und
steht erst mit einer Wortdefinition zur Verf‡gung. Da f‡r die Ausf‡hrung in
einem gef€delten Forth-System immer ein Aufrufkopf vorhanden sein muœ, der
‡ber die Verwendung der ihm folgenden Daten entscheidet, ist es recht aufwen-
dig, die sofortige Ausf‡hrbarkeit zu installieren. Processorcode compilierende
Systeme haben dagegen diese Variante bereits in sich, dort stellt sie sogar
das einfachere Verfahren dar, ist dennoch aber in ausgef‡hrten Systemen kaum
zu finden. Im F6 gibt es nun einen Kompromiœ, der besonders beim Ausprobieren
einzelner Passagen immerhin einige L€stigkeit erspart:
        | 100 BEGIN 1- dup WHILE dup . REPEAT |
Eingeschlossen in die "|" Striche wird die Eingabe compiliert und sofort ausge-
f‡hrt, ohne Unterschied zum Aufruf eines standardm€œigen 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 m„glich ist, ausnahmslos jede standardm€œige Wortfolge unter realen
Bedingungen zu pr‡fen - insbes. Worte, die mit {word} oder {hld} arbeiten, lie-
fern im gew„hnlichen 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-
f‡hrungsgeschwindigkeit s€mtliche laufzeitbestimmenden Aufrufe direkt im Pro-
cessorcode ausgef‡hrt und liegen auœerhalb des 4th-adressierbaren Bereichs.
Dazu geh„ren 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 groœe 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
Einschr€nkungen bei der Erstellung v„llig standardgetreuer Programme.
Weiter war es Ziel dieser Installation, die sp€teren Standards m„glichst um-
fassend zu ber‡cksichtigen, zumindest aber deren Nachbildung zu erlauben.


Noch ein Wort zum Copyright:
Der Autor ist wahrlich nicht eifers‡chtig 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œ, gen‡gt ein ".hpr". Es wird aber dringend darum
gebeten, bei §bernahme wenigstens nicht die eigene Urheberschaft zu behaupten.


* F‡r den Anfang
.. der m„glichst 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 f‡r 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 Ausf‡hrungszeit-Optimierung
        Zusammenstellung aller Operatoren der Ganzzahlen-Arithmetik
        Liste der Worte f‡r QDOS-Kan€le
        Liste der "user"-Variablen
        Liste der "immediate"-Worte
        Liste der "deferred" Worte
        Fehlercodierung und Systemmeldungen
        Als doppelte Integer adressierbare Systemdaten (zum Multitasking)
        Beschreibung ausgew€hlter erg€nzender Worte aus "forth_scr"
        Gegen‡berstellung €hnlicher Worte verschiedener Forth-Varianten
                und einige Ersatzdefinitionen f‡r im F6 fehlende Operatoren
        Gegen‡berstellung f.i.g. <BUILDS und DOES> mit F79+ CREATE und DOES>
        Betriebssystemabh€ngige Fehler
         nderungen durch neue Versionen.


* Start
Vorteilhaft aber nicht erforderlich sind:
        LRESPR "ptr_gen"        ( das "pointer interface" ist sehr n‡tzlich
        LRESPR "hot_rext"       ( Hotkey-System, u.a. f‡r den Hotkey-Puffer
        LRESPR "history"        ( Command-Line-History zur bequemeren Eingabe
        LRESPR "pex32_byt"      ( PEX f‡r MODE und aktive Hintergrund-Fenster
        LRESPR "dvs_byt"        ( SBasic-Zugriff f‡r F6, f‡nf Zeichens€tze
        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') d‡rfen unver€ndert copiert und weitergegeben
werden, sofern dies kostenlos, vollst€ndig und ohne Ver€nderungen geschieht.

Dann:
        EX qf;".( 1000 Zeichen Forth-Text als Parameterstring zul€ssig )"
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 enth€lt, die direkte Pro-
grammierung durch einen ‡bergebenen Parameterstring. Man schreibt dort genau
den Text hin, der mit dem Job-Start ausgef‡hrt werden soll, so, wie er auch in
direkter Eingabe aussehen w‡rde. Einschr€nkungen gibt es auœer der Begrenzung
auf gut 1000 Zeichen L€nge nicht, selbst Wortdefinitionen sind zul€ssig.

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 Gr„œe des
verf‡gbaren Stack- und Dictionary-Speichers.

Auœerdem erscheint eine Frequenzangabe, die die in einer Interrupt-kontrollier-
ten Z€hlschleife 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 systemunabh€ngige Zeit-
steuerung entsprechender Programme unterst‡tzen soll. Er wird anhand der f‡r
die 68008, 68000 rsp. 680x0-Processoren angegebenen Taktzeiten ermittelt.
Hierzu gibt es mit {set-cal} und {ti-cal} die M„glichkeit 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-Standardmaœen
oder in den w€hrend eines {w-save}-Aufrufs eingestellten Abmessungen ge„ffnet.
Die fensterbezogenen Worte arbeiten standardm€œig mit dem {in-cons}-Kanal f‡r
Eingabe und Echo ("prompt"), mit {out-cons} f‡r die Ausgabe und {work} f‡r alle
Aufrufe des {qdos}-Vocabulars.
{out-cons} ist initial gleich {in-cons}, w€hrend {work} noch nicht ge„ffnet ist.
{in-cons} ist gegen (versehentliches) Schlieœen gesch‡tzt.


* F6-Programmtexte
Wenngleich auch die (wom„glich ja nicht ganz ohne Grund) bew€hrten Screenfiles,
oder "Blockfiles", die Grundlage f‡r F6-Programmtexte darstellen, wo keiner-
lei Steuerzeichen enthalten sind, und die darum in jeder nur denkbaren Umgebung
verarbeitet werden k„nnen, sind auch zum Laden aus gew„hnlichen Textfiles Vor-
kehrungen getroffen worden. Hierzu gibt es das Wortepaar {chain} und {end}.
Auch diese Ladevorg€nge lassen sich in kaum begrenzter Tiefe schachteln (eini-
ge Hundert). Gegen‡ber dem Standardverfahren wird hier ‡blicherweise f‡r jeden
einzelnen Aufruf eine eigene Quelle gew€hlt, sodaœ auch dem Laden ganzer Bib-
liotheken-Stapel oder, da es im Forth keinen Unterschied zwischen Programm- und
Kommandodateien gibt, der Ausf‡hrung verwickelter "Batch"-Dateien kaum Grenzen
gesetzt sind.

* Programme
Zur Nutzung unter denselben Bedingungen wie das F6-System sind die folgenden
Quelltexte beigef‡gt rsp. beim Autor erh€ltlich:
        "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 f‡r Forth,
>>>     "as_gls" & "as_gls_e"   Kurzbeschreibung dazu (assembler glossary).
        "ansext_scr"            Erg€nzung 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 f‡r Software-Stacks mit bis
        "f6stak_4th"            zu 256K Gr„œe im auœenliegenden Systemspeicher.
        "f6task_scr"            Einrichtung und Beispiele zum Multitasking
                                einzelner Worte innerhalb eines F6-Systems.
        "f6task_4th"            weiteres Beispiel f‡r {c-load}
        "f6hnoi_scr"            die "T‡rme von Hanoi" einmal mehr strapaziert.
        "f6bh"                  Kontokorrent-Buchf‡hrung mit
        "bh_scr"                Quelltext und
        "bh_gls"                Kurzanleitung dazu (KEIN Buchhaltungskurs!).

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

In einigen F€llen m‡ssen hilfsweise weitere Screenfiles vorhanden sein:
        forth_scr               wird von allen o.g. Files ben„tigt, und
        f6asm_scr               zus€tzlich auch f‡r f6task_scr, falls das
                                aufrufende F6 den Assembler nicht schon enth€lt.

Z.T. befinden sich die Quelltexte in einem experimentellen Entwicklungszustand,
insbesondere bei "bh_scr" bez‡gl. der zus€tzlichen Optimierungsvorg€nge und der
Umstellung von DOES> auf ;DOES>, wo wegen noch anzupassender Stellen Fehler
m„glich sind, deren Korrektur mangels akuten Bedarfs (das Programm selbst liegt
in bew€hrter Form vor) weder durchgef‡hrt wurde noch in absehbarer Zukunft
(seitens des Autors) zu erwarten ist. Sie sollen vor allem als Beispiele dienen,
da sie s€mtlich Grundlage vom Autor benutzter Programme sind - insofern steht
ihre Einsatztauglichkeit auœer 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 zus€tzlichen
Speicherbedarf die Bearbeitung von Files mit knapp 1M Bytes L€nge erlaubt, und
daœ dies auch ‡ber das QDOS-Netzwerk selbst mit dem nicht erweiterten Standard-
Ger€t m„glich ist. Die Arbeit kann auch bei groben "Unf€llen" 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
enth€lt 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.
F‡r einen ersten Versuch gibt man z.B. ein:
        EX "flp1_f6ed";"using flp1_ed_gls_g 1 scr ! edit"
und erh€lt dann alle weiteren Erkl€rungen. 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 M„glichkeit, beliebige Passagen als Macro zu definieren, sind na-
t‡rliche Eigenschaften eines jeden Forth-Assemblers, ebenso die aus dem unver-
z‡glichen Codieren aller Assemblerpassagen bei einem Ein-Pass-Assembler folgende
sofortige Ausf‡hrbarkeit z.B. als Forth-Wort. Typbedingt k„nnen Vorw€rtsreferen-
zen gew„hnlich nicht aufgel„st werden. Diese Einschr€nkung wird weitgehend auf-
gehoben, da eine Vielzahl Strukturworte zum Codieren von Schleifen und Spr‡ngen
innerhalb einer Assembler-Passage vorhanden sind, dazu locale und globale Labels
und die M„glichkeit, Referenzen durch Ausf‡hrung von {defer}ed Worten zu erset-
zen, oder sie ‡ber Variable zu beliebig sp€terem Zeitpunkt aufzul„sen.
Der gesamte Befehlssatz der 6800x-Processoren steht zur Verf‡gung, dazu einige
der erst ab 68020 verf‡gbaren Befehle. Ziele sind entweder 4th-Adressenbereich,
auœenliegende Speicherbl„cke, 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 m‡ssen - was ca 11K Speicherplatz spart.
N€here Beschreibung im Glossar "as_gls", im F6-Editor lesbar.


* "FORTH_txt"
enth€lt 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 n‡tzlich sein k„nnen, und enth€lt die im Laufe
der Zeit hinzugewachsenen Erg€nzungen in chronologischer Folge bis zur Version
8.08; alles sp€tere ist den jeweils zugeh„rigen GF6UP..-Texten zu entnehmen.
Auœerdem ist dort ein Abriœ der Definitionen aus "forth_scr" gegeben.


* "forth_asm"
f‡r 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 Kapazit€t angelangt.
Infolgedessen kann es bei ungen‡gendem Speicherplatz zu v„llig 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 m„glichst wenigen Zusatzprogrammen
zu starten. Im SMSQ/E bleiben die Versuche beim Speicherausbau mit "nur" 2M
selbst bei gut 1M freiem Platz mitunter jedoch v„llig aussichtslos, dagegen
reichten beim Minerva-QL mit GC ca 600K freien Speichers stets aus.
Sollten irgendwelche  nderungen an nur wenigen derart begr‡ndbaren Fehler-
meldungen scheitern, bleibt als letzte Maœnahme das Entfernen einiger der
mit dem "create"-Macro angelegten Forth-Worte, die f‡r den eigenen Bedarf
nicht n„tig sind, oder die ggf. als Hi-Level-Definitionen nachtr€glich com-
piliert werden k„nnen. Ein guter - und ergiebiger - Kandidat hierf‡r ist
z.B. {vlist}, das ‡berfl‡ssig ist, falls ohnehin das komfortablere {words}
geladen werden soll.
Als endg‡ltige L„sung dieses Problems ist eine F6-Version in Arbeit, die
mit dem F6-Assembler erzeugt werden kann. Mehr dar‡ber zu gegebener Zeit.


* Quellen?
Das F6-System ist Resultat jahrelangen Umgangs mit den verschiedensten Forth-
Systemen. So m‡ssen auch die ‡ber die Standardbeschreibung hinausreichenden
Einrichtungen nicht unbedingt vollkommen eigenst€ndige Entwicklungen des Autors
sein, und es ist auch unwahrscheinlich, daœ hier l‡ckenlos 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 k„nnen, und in die gesamte Arbeit eingingen, sind
insbes. der 6502-Forth-Computer der "Wireless World", das "GRAphik FORTH" zum
(Ur-)"Apple", das ‡beraus leistungsf€hige Multitasking-Forth der (leider nicht
mehr aufsp‡rbaren) "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.

Bez‡glich 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 unabh€ngig stets
zug€nglich, und es wird sp€testens nach erfolgloser Suche als letztes
Vocabular durchsucht, bevor das System den Zahleninterpreter aufruft.
Der Vocabularstack unterteilt sich in einen sicheren und einen fl‡ch-
tigen Bereich. Letzterem sind die beiden j‡ngsten Posten zugeordnet,
der Rest wird nur durch {only}, {also} oder {previous} beeinfluœt.

Die ersten beiden Posten bilden einen Stack f‡r sich, aus dem mit Nen-
nung eines Vocabulars der zweite Posten hinausf€llt, der erste weiter-
geschoben und der neue Vocabularpointer an dessen Stelle gelangt.
Jedes {also} schiebt die Vocabulareintragungen im ganzen Stackbereich
eins h„her, die €lteste f€llt 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 Ver€nde-
rungen gesichert werden, ist dazu ein zus€tzliches {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 fl‡chtige Posten wurden vor
allem dazu eingerichtet, die f.i.g.-typische §bertragung von CONTEXT
nach CURRENT bei Colondefinitionen zu erm„glichen, ohne daœ dadurch die
eingestellte Suchfolge im Stack St‡ck f‡r St‡ck weitergeschoben wird
und schlieœlich ganz verschwindet.
Oft ist es auch recht hilfreich, wenn neben der festen Suchfolge f‡r
einzelne Worte das Vocabular gewechselt werden kann, ohne immer gleich
den ganzen Stack zu ver€ndern.
Gegen‡ber dem F83-Stil ist hier nur zu beachten, daœ immer die beiden
j‡ngstgenannten Vocabulare zug€nglich sind, und daœ das Sichern einer
Suchfolge im F6 als letztes ein zus€tzliches {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 l€œt 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} l€œt sich mittels seiner Grunddefinition auf eine Wortkette
        begrenzen, deren j‡ngste 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, w€hrend die "wirkliche" Adresse 0 in der
Bereichsmitte liegt. Gew„hnlich ist dies f‡r den Umgang mit dem System
v„llig belanglos, da die direkte Adressierung durch eine Zahl normaler-
weise nicht vorkommt. Die relative Adressenlage wird bei Forth-Worten
ohnehin stets ber‡cksichtigt. 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-tabellenpl€tze
           limit          obergrenze blockpuffer, anfang kanal-id-tabelle
                         16 bl„cke 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. 'abw€rts' bauend,
                         170 bytes 'aufw€rts' f‡r den terminal input buffer
           (tib)¾
           .............  ggf. platz der localen variablen
           (s0)¿
           .............
                          datenstack und freier dictionary-bereich;
                          im "leeren" F6 stehen ca 45K bytes zur verf‡gung
           .............
           pad            fl‡chtiger 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 'aufw€rts' 64K 4th-adressenbereich
           codebereich    ca. 17K processorcode-routinen, die aus dem system
                          direkt angesprungen werden, von neuen forth-worten
                          gew„hnlich nicht umittelbar adressierbar.
           .............
 jobanfang - qdos-header mit sprung in das 4th-system
 -----------------------


* F‡r den ersten Versuch

Die im Text benutzten besonderen Bezeichnungen wurden bereits erl€utert. Es
ist unbedingt sinnvoll, sie sich gut einzupr€gen, da sie immer wieder auftau-
chen. Deren wiederholte deutschsprachige Um- oder Beschreibung w€re allzu
aufwendig - und ist g€nzlich ungebr€uchlich, sodaœ fremde Texte ohne dieses
Wissen weitgehend unverst€ndlich blieben.

Vor dem - problemlosen und einfachen - Start eines F6-Jobs empfiehlt sich
als erstes, einen F6-Editor einzurichten, beigef‡gt 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 beigef‡gten ".._gls"-Files enthalten erkl€rende
Texte, die f‡r 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 gew‡nschte Wort namentlich bekannt sein, und der Name des
die betr. Definition enthaltenden Screenfile. Damit enf€llt die Notwendigkeit,
sich f‡r alle m„glichen Teilbereiche die betr. Seitennummern zu merken, oder
bei Aufteilung auf mehrere Dateien die vielen dazu n„tigen 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 ber‡ck-
sichtigen hat. Zus€tzlich 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 gr„œeren 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 rudiment€r definierte
L-LOAD ‡bernommen wird. Nebenbei: Es ist immer der ganze Filename anzugeben,
einschlieœlich Laufwerk und Directory.

Soll nun etwa das Wort zur Einrichtung einer Commandline History aktiv gemacht
werden, mit Namen "history" beigef‡gt 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 auœerdem f‡r 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 sp€ter nachgesetzten Device aus dem SMSQ/E, das nichts weiter ist,
als ein simples Device f‡r String-Stacks, gemein hat!) erkannt und beim Start
dem in-cons-Kanal mit 40 Zeilen Gr„œe zugeteilt. Sie kann mit dem 4th-Wort
{history} aus "forth_scr" auch anderen K€len 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-
h€ngig 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 h„herwertigen Anteil an niedrigerer Adresse.
Grunds€tzlich sind formatunabh€ngig
      ALLE SPEICHEROPERATIONEN AN BELIEBIGER, gerader oder ungerader, ADRESSE
zul€ssig; wo sie ausnahmsweise geradzahlig sein m‡ssen, wird darauf hingewiesen.

Arithmetisch werden die Daten als vorzeichenbehaftete Ganzzahlen mit dem Vor-
zeichen im h„chstwertigen Bit und der Darstellung negativer Werte im Zweier-
complement behandelt. Vorzeichenbit = 0 steht f‡r 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 k‡mmern, 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 gel€ufig sein wird, und das zeigt, wie wenig
Ungew„hnliches 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 zusammengeh„render 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 l„sen 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 aufgef‡hrten Zwischenergebnisse gelangen bei dieser Anordnung ohne
besondere Maœnahmen automatisch anstelle der jeweiligen Operanden in den Stack,
sodaœ am Schluœ sofort das endg‡ltige Ergebnis zur Verf‡gung 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 auff€llt, daœ keinerlei Zwischenspeicherung erforderlich ist, es sei denn,
man bewertet {2dup} und {-rot} derart. Daœ daf‡r beim Aufruf die Reihenfolge der
‡bergebenen Parameter eingehalten werden muœ, ist eine allen Programmiersprachen
gemeinsame Eigenschaft, bedarf also keiner besonderen Ber‡cksichtigung.
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 Flieœkomma-Vocabular ohnehin vorhanden ist. Unter dem Namen {qsqrt}
findet sich eine Definition dazu (nach Newton, damit leicht auch f‡r h„here
Wurzeln modifizierbar) f‡r vierfachgenaue Integer in "forth_scr".

Dabei wird eine weitere St€rke von Forth mit seinen Vocabularen offenbar.
Gibt man den Flieœkomma-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 Flieœkomma-
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
gr„œeren Wertebereich zur Folge. Das Rechnen mit den auch im F6 verf‡gbaren
Flieœkommazahlen weicht auœer 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 s€mtlich 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 Ausf‡hrungsgeschwindigkeit

Die beste Optimierung ist witzlos, wenn die Grundlage nicht m„glichst optimal
gestaltet ist, und darum war diese vor allem Gegenstand der Bem‡hungen: Im Kern
sind von den etwa 1000 Worten nur ca. 100 als "colon"-Definitionen eingerichtet.
Dar‡ber hinaus sind im F6 als "threaded interpretive" Compiler, der "gef€delten
Code" interpretiert, und so hinsichtlich geringsten Speicherbedarfs bereits ein
optimiertes Verfahren darstellt, der Optimierung enge Grenzen gesetzt. Sie wird
im F6 haupts€chlich durch zum Wortanfang hin gerichtete Zusammenfassung einzel-
ner Worte zu besonderen Operationen durchgef‡hrt, 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 s€mtlich mit eigenen Namen installiert werden muœ-
ten, zumal sie in jedem Forth-System unterschiedlich (wenn ‡berhaupt) vorhanden
sein k„nnen. - Varianten wie {?DUP-0=-IF}, die sich in manchen (angeblich ANS-
Standard-)Forth-Systemen tats€chlich finden lassen, sind einfach nur grotesk.

Die f‡r das F6 gew€hlte Methode f‡hrt bei einerseits der Schreibweise nach
einfachster Standardausstattung anderseits automatisch zu umfassender Nutzung
der verk‡rzenden zus€tzlichen Operationen. Ganz, ohne daœ ein Benutzer sich
l€stige bis alberne "optimierte" Zusatzdefinitionen merken muss...
Vornehmlich als Debug-Information existieren aber auch im F6 f‡r die besonderen
Sprungbedingungen eigene, mit der fig-Bennung m„glichst konsistente Wortnamen.

        .. (hi-level-worte) .. ;
End-Recursion rsp. §bergang in andere Hi-Level-Worte:
F‡hrt der letzte Aufruf innerhalb eines Wortes in eine "Colon-Definiton", und
liegt die Distanz innerhalb 32766 Bytes, so wird statt des abschlieœenden {;}
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 Ausf‡hrung 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.

F‡r 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 daf‡r sorgt, daœ die Zahl bei Ausf‡hrung 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+ erfaœt werden k„nnen.

Und schlieœlich werden
        drop ;    2drop ;    
* Mehr?
Wer immer auf Unzul€nglichkeiten in Programmen oder Texten stoœen sollte, oder
sonst Fragen hat, wird gebeten, sich an den Autor zu wenden, der sich alle M‡he
geben wird, weiterzuhelfen.
        H.-Peter Recktenwald, D-12159 Bln, Albestr, 21
        tel. +46 (0)30 8520413, inet: phpr@mail.geocities.com


» einf‡hrung ende, folgt glossar "F6GLS_txt" »


* "F6GLS_txt" - Glossar

* Bezeichnungen, Angaben zur Notation:

4th             abgek‡rzt 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 Vorschl€ge des Autors.
             >> F6 special.
F6S             f‡r zus€tzlich 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
                f‡r den QL, insbes. die qdos-Kanal-Tabellen betreffend.

* Wort-Typen
integer         jeder 16-Bit-Wert, als Zahl im bin€ren 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-Flieœkommazahl,
                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 f‡hrendem Z€hler-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 f‡hrendem Z€hler-Byte, dem "countbyte".
             >> byte counted string

   Notierung f‡r 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 w€hrend
                dessen Ausf‡hrung zum Stack gelangt - s. auch "literal".
Wert            Bestand einer beliebigen Dateneinheit.
String          l‡ckenlose Gruppe als Schriftzeichen interpretierbarer Bytes.
                Die meist vorzufindende Umschreibung "Zeichenkette" trifft nicht
                zu, da die Zeichen in keinerlei Zusammenhang miteinander stehen,
                "Zeichen-Strang" w€re akzeptabel, ist aber ungebr€uchlich.
                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 heiœt 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 unn„tige Speicheroperationen.
                Der Klarheit halber wird in diesem Text zwischen "Pointern" als
                "4th-Adressen" und "wirklichen (32-Bit-)Adressen" unterschieden.
+ve             f‡r einen Wert ab Null,
-ve             f‡r einen Wert unter Null.
negative Null   Zahl, bei der nur das (h„chstwertige) 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) zul€ssiger 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 sp€teren 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 ausf‡hrbarer Processorcodes.
primitive       Wort, das sofort in direkt ausf‡hrbaren Processorcode m‡ndet.
runtime      1. Zeitpunkt der Ausf‡hrung eines Wortes, rsp.
             2. Kurz f‡r "runtime executive", die beim Aufruf eines Wortes aus-
                gef‡hrte 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 abh€ngig vom in {state} notierten Systemzu-
                stand (compilierend/interpretierend) unterschiedlich arbeitet.
AQ              Hinweis auf den Atari-QL, es gilt dasselbe wie bei QX.
QX              speziell f‡r QXL/SMSQ. Anwendung im SMSQ/E wegen immer wieder
                neuer und nicht st€ndig ‡berpr‡fbarer Versionen u.U. unsicher.
                Gewissenhafte Pr‡fung bei zumutbarem Aufwand war nur in der
                Version 2.76 des mit der QXL gelieferten SMSQ m„glich.
             >> 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" - Programmz€hler, 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 f‡r MINERVA (und SMSQ) eingerichtete Erg€nzung
                dazu f‡r 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 f‡hren, gilt zugleich f‡r Trump-/Gold-Card u. QXL/SMSQ.

* Systematische Begriffe
t.o.s.          "top of stack" - zuerst errreichbarer Stackposten.
sys             Compiler-Kontrolldaten, vor‡bergehend 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
                fl‡chtigen 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 Seitengr„œe
                (c/l * b/scr) teilbarer L€nge - Standardm€œig 1024 Bytes/Seite;
                der Name deutet auf die Darstellungsweise in Bildschirmseiten.
block           Die "screen" besteht aus Bl„cken mit einer systemabh€ngigen
                Anzahl Bytes, die einer Zweierpotenz entspricht.
                Im F6 hat eine "screen" 16 "block"s zu 64 Bytes L€nge.
             >> One screen is 16 blocks of 64 bytes - re below.

* Wortgestalt
{name}          Forth-Worte erscheinen im Text zwischen geringelten Klammern.
                Die Namen d‡rfen 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 sp€ter auch erkannt, jedoch k„nnen mehrdeutige
                Namen entstehen: Das System pr€pariert sie so, daœ die g‡ltigen
                Schriftzeichen mit gel„schtem 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 g‡ltigen Codes ab 33 zur
                Deckung und k„nnen nicht als ver€ndert erkannt werden, sodaœ die
                damit gebildeten Namen sp€ter verf€lscht 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 unzug€nglich 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 f‡hrender rsp abschlieœender Zeichen bei 4th-Namen {...}
- ...           f‡hrendes "-" deutet an, daœ das Wort eine Aktion Flag-abh€ngig
                ausf‡hrt, oder selber eine Flag liefert.
" ...           Variante der Operation {ccc} f‡r eine Folge von Schriftzeichen.
? ...           zumeist eine Pr‡foperation mit {abort} im Fehlerfalle.
2 ...           Stackoperation an allgemeinen doppelt-groœen Posten
4 ...           dto., vierfache Postengr„œe.
d ...           vorwiegend f‡r vorzeichenbehaftete 32-Bit-Zahlen; Arithmetik.
q ...           dto., vierfachgenaue Zahlen.
 ... "          Wort erwartet oder holt eine Folge von Schriftzeichen.
 ... .          Schreibt eine Zahl rsp ein Textst‡ck (auch bei f‡hrendem ".").
 ... :          Definitionswort.
 ... ?          Liest Daten und schreibt davon abgeleitete Zahl oder Text.
 ... ]          Wort mit §bergang in den Compile-Zustand.
   Diese Namensmarkierungen sind standardm€œig nicht immer konsequent benutzt,
   geben aber meist zuverl€ssige Hinweise auf die Funktionen der betr Worte.

   Begrenzungszeichen zwischen Worten ist das Leerzeichen, auœerdem gilt die
   ascii-<nul> (chr$ 0) als unbedingte Begrenzung, die dazu noch eigene Akti-
   vit€ten ausl„st, da sie zugleich Name eines (wichtigen!) Forth-Wortes ist.
   Gleiche Bedeutung hat das Zeilenende, unabh€ngig von der Eingabequelle.

   Zahlenangabe ist in verschiedener Form unabh€ngig von {base} m„glich:
        %101    bin€r           !123    quatern€r
        &123    oktal           #123    dezimal
        ¶123    duodezimal      $123    sedezimal
        {A      ein Zeichen-Code (ersetzt z.B. das ASCII des F83-Forth),
                gilt mit Ausnahme der L€nge 2 f‡r 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 h„chstwertigem Bit (7),
  p     precedence-Bit (6), das den "immediate"-Status bestimmt,
  s     smudge-Bit (5), das den Wortheader f‡r {-find} sperrt oder freigibt
  c     und den f‡nf niederwertigen Bits als Z€hler f‡r die L€nge des Namen.
name    bis zu 31 Schriftzeichen, gesetztes Bit 7 markiert das Ende.
        Die h„chstwertigen Bits der Codes von 128 bis 160 werden vor Eintragen
        der Grenzenmarken gel„scht und durch {id.} restauriert.
        Die nfa kann an ungerader Adresse liegen  - s. {create} - der Compiler
        justiert sie so, daœ die lfa geradzahlig unmittelbar anschlieœt.
lfa     "linkfield address"
        mit einem ptr, der auf den Vorg€nger im selben Vocabular zeigt.
cfa     "codefield address" (auch: compilefield)
        weist auf direkt ausf‡hrbaren 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 f‡r cfa, bezeichnet eine Eintragung in der Parameterliste.

* frei definierte Worte

Die Standardform entsteht mittels <BUILDS .. .. DOES> und erzeugt den Aufbau
wie anschlieœend am Beispiel der Vocabulare dargestellt. Alternativ kann auch
die in den sp€teren Forth-Typen eingef‡hrte 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. bez‡glich
ihrer PFA nicht mehr von den Colon-Definitionen:

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

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

* Vocabulare

Die Definition ist Standard-vertr€glich (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" h€lt die nfa des j‡ngsten Wortes des Vocabulars.
        Der Ptr auf diese Position gelangt beim Aufruf in den Vocabularstack.
voclink sein "codefield" verkettet ein Vocabular mit dem bis dahin j‡ngsten,
        indem es auf dessen [voclink]-Position gerichtet wird und die eigene
        Adresse bei der Vocabulardefinition in die User-Vari {voc-link} gelangt.
    zus€tzlich:
search  die eingepr€gte secund€re Suchfolge, initial mit {current} besetzt.
ff      das niederwertige Byte dient als Flag f‡r fp-compilierende Vocabulare,
        das h„herwertige Byte sperrt bei den {-find}-Varianten ein bereits
        durchsuchtes Vocabular f‡r die erneute Suche, sodaœ mehrmaliges Vor-
        kommen in der Suchfolge keinen Einfluœ auf die Compilezeit hat, und
        Endlosschleifen durch das Secund€rvocabular ausgeschlossen werden.

        Dank dieser Struktur ist es recht einfach, wie z.B. in {forget}, die
        gesamte Vocabularkette Wort f‡r 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 zun€chst aus der Vocabulardefinition die
        nfa des j‡ngsten Wortes, von wo ausgehend mit denselben Aufrufen
        die Kette dann zur‡ck bis nach [vocnfa] f‡hrt. Gleichheit mit dem
        dort hilfsweise eingetragenen Ur-Namen ist Abbruchkriterium f‡r die
        Wortkette, w€hrend die Vocabularverkettung im F6 mit $8000 endet.
        $8000 ist auœerdem Inhalt der ersten lfa des Systems im Wort {root}
        und muœ darum in die Abfrage der inneren Schleife einbezogen werden.

        Das eingepr€gte Secund€rvocabular entspringt dem Versuch, ohne einen
        seiner Natur nach notwendig begrenzten Vocabularstack auszukommen, und
        die m„gliche Suchfolge auf eine beliebig groœe Anzahl Vocabulare auszu-
        dehnen. Obwohl das auch genau so der Fall ist, wurde die Stackstruktur
        zus€tzlich ‡bernommen, da sie sich als sehr handlich erwiesen hat.
        N‡tzlicher Nebeneffekt ist die f‡r die OOP erforderliche und hierdurch
        leicht m„gliche fix eingepr€gte Aufruf-Hierarchie.

        Mit beispielsweise nur CURRENT und beiden CONTEXT-Posten besetzt, etwa
                only forth definitions
                2nd-voc on
                hidden minerva
        sieht die eingepr€gte Suchfolge mit den Vorgabedaten folgendermaœen aus:
                hidden forth minerva fp qdos pif forth
        denn {hidden} hat das Secund€rvocabular {forth}, das seinerseits kein
        weiteres Vocabular angibt, und {minerva} weist nach {fp}, dieses nach
        {qdos}, welches {pif} zum Secund€rvocabular 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 f‡r den Processor benutzt wird, ist der Umgang
        mit der "Null" ein wenig heikel. In allen F€llen, die die Suche in
        Vocabularen betreffen, wird die wertm€œige 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 fr‡heren Versionen auftretenden Probleme bei Worten nahe der
        4th-Adresse Null konnten damit nun auch restlos gel„st 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 k„nnen 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 zug€nglich, 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 Flieœkommaposten 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 f‡r andere Zwecke eingesetzt werden.
             >> save the current stackptr
!name           ( ptr1 n2 ptr3 -- )
                max. n2 Bytes Text mit 16-Bit-Z€hler 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 bel€œt den Divisionsrest d2 im Stack.
                Anwendung zwischen <# und #>. Mit {#} lassen sich beliebig
                formatierte Ziffernstrings definierter L€nge 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#} ausgef‡hrt, 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 zuverl€ssigen Werte. Es
                wird der unver€nderte Index angegeben, auch, wenn er ‡ber eine
                der Grenzen hinausweist. Das erste oder letzte Wort einer Liste
                kann auf diese Weise ‡berlaufende Werte geb‡ndelt ‡bernehmen
                und sie dann einzeln weiterbearbeiten. Innerhalb einer Worte
                ausf‡hrenden {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
                l€œt den Rest unver€ndert.
             >> 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
                gr„œtm„gliche 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 R‡ck-
                gabe der L€nge und des Ortes, wo der String zu finden ist. Der
                Ablagebereich wird durch jede Form der Zifferndarstellung (auœer
                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 f‡r 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 vollst€ndig in Ziffern umwandeln und die Zeichen an ggf.
                bereits ermittelte Zeichen anh€ngen - zwischen {<#} und {#>}.
                Immer wird mindestens eine Ziffer geschrieben, so lassen sich
                z.B. auch Zahlen einer gewissen Mindestl€nge erzeugen:
                        ( dn ) <# # # # #s #> type
                schreibt eine wenigstens vierstellige Zahl hin, l€ngere Zahlen
                werden vollst€ndig ausgegeben, k‡rzere auf vier Stellen mit
                f‡hrenden Nullen aufgef‡llt.
$>f             ( ptr1 -- f2 )                          F6 QDOS
                qdos-String von 4th-Adresse ptr1 als Flieœkommazahl zum Stack.
                Setzt als fp-Signal {dpl} auf -2 und sichert den h„chstwertigen
                Stackposten f‡r 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 bin€r 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 zus€tzlich angegeben wurde.
             >> ptr to a filename used by {s-load}
(d#)            ( dn1 n2 -- ptr3 n4 )                   F6      8.16 => hidden
                Zahl dn1 abh€ngig vom Vorzeichenflag n2 in String der L€nge 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. f‡r {chain} u.€. Worte.
(file)          ( -- ptr )                              F6
             >> filename used by the editor and when {dr1} active.
(joker)         ( -- n1 )                               F6
                Constante, deren Wert einen Zeichencode repr€sentiert, 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 L€nge n4 der Zeile n1 in Seite n2
                des gerade g‡ltigen 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 F‡llzeichens f‡r {.r} u. dgl.
(screen)        ( -- ptr )                              F6
                filename used by the editor, and when {dr0} active.
(update)        ( -- ptr )
                Schreibfreigabe f‡r {r/w}
(upper)         ( -- n1 )                               F6
                Maskierung f‡r die Aufrufe mit Zeichenvergleich bestimmt die
                Abh€ngigkeit von der Schreibweise: -33 nicht -1 beachten.
                Fehler, die durch diese einfache Maskierung entstehen k„nnen,
                betreffen (fast) nur Codes auœerhalb des f‡r Schriftzeichen
                g‡ltigen bereichs, welche darum zugunsten h„herer Ausf‡hrungs-
                geschwindigkeit in Kauf genommen wurden.
(wcard)         ( -- n1 )                               F6 (vorl€ufig)
                Code f‡r ein "wildcard"-Zeichen, das bei {t=} und {tl=} eine
                Gruppe von Zeichen beliebiger L€nge 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 Verf‡gung, wobei aber beide Einsatz-
                zeichen nicht auf die ‡blichen "?" und "*" festgelgt sind, son-
                dern je nach Erfordernis beliebig codiert werden k„nnen.
             >> 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 } geringf‡gig schneller ausgef‡hrt.
*/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 n€chsten n1 Zeilen beim Lesen eines Screenfile,
                Bei negativem n1 z€hlt die Zeile des {+continue} mit.
+loop           ( n1 -- )(C)
                Abschluœ einer Z€hlschleife mit Angabe der Z€hlstufung n1.
                Endlosschleifen z.B. durch 0 +LOOP werden abgefangen.
+nul            ( -- ptr )                              F6
                Adresse einer Speicherstelle, die den Wert 0 enth€lt.
+origin         ( n1 -- ptr )
                liefert mit einem Index lt. f.i.g.-Modell einige Initiierungs-
                Daten f‡r den Systemstart und die Wiederherstellung bei {cold}
                und {warm}. Zun€chst die Verwendungsdefinition f‡r F6-Kan€le:
                        -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 ausf‡hrbarer 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 n€chsten Posten von der f.i.g.-Vorgabe
                ab. Die ‡blichen User-Vari k„nnen in gewohnter Weise verwandt
                werden, sie m‡ssen jedoch bei Ver€nderungen, 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-}
                Standardm€œige 16-Bit Initiierungswerte
                        28      {tib}
                        30      {width}
                        32      {warning}
                        34      {fence}
                        36 32-Bit {dp 2-}
                        40      {voc-link}
                        42      {up} User-Vari Laufptr
                Zus€tzlich schlieœen 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, br‡cksichtigt 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 f‡r das "hotkey-thing"
                und als 16-Bit-Variablenwerte:
                        72      (quit) erste cfa f‡r den Systemstart
                        74      {ert}-Aktivierung/-Sperrung
                        76      Maus-Code f‡r {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 anh€ngen,
                beide Strings k„nnen auch an ungeraden Adressen stehen.
-               ( n1 n2 -- n3 ) ( f1 f2 -- f3 )
-->             ( -- ) (I)
                Beim Laden n€chste Seite im Screenfile aufsuchen. Dies wird bei
                zug€nglichem {in-cons}-Fenster dort mit einem Punkt angezeigt.
                Auch innerhalb von Worten oder Listen ohne besondere Maœnahmen
                im Compilezustand zur Fortsetzung einer Definition verwendbar.
                Falls beim Seitenwechsel der Stack eine andere Anzahl Posten
                enth€lt, als beim Eintritt, werden zur Kontrolle und ggf. leich-
                teren Fehleranalyse Seitennummer und Differenz hingeschrieben.
                Darf nicht am Schluœ eines Screenfile stehen, denn dann w‡rde
                der Ladevorgang endlos fortgesetzt, weil EOF bei Screenfiles
                nicht als Fehler gilt, also auch nicht zum Abbruch f‡hrt. Das
                Signal zum Beenden des Ladevorganges ist bei diesem Filetyp mit
                {;s} immer explizite anzugeben - f‡r {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"-abh€ngig Compilieren rsp. Ausf‡hren 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,
                unabh€ngig vom Typen als 4th- oder qdos-String, wobei beide
                max. 255 Zeichen lang sein d‡rfen. 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 sp€terer Standards.
-exit           ( flg --) (C)                           F6
                Bedingtes Verlassen eines Wortes, steht f‡r
                        ... IF ;s ENDIF ...
                Optimiert zu {0=exit}, wenn {0=} vorangestellt ist; darf ohne
                zus€tzliche 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 einschlieœlich der Flags zum Worttypen. Ist dem {find}
                sp€terer Standards insofern ‡berlegen, als es neben dem Prece-
                dence-Bit (f‡r den "immediate"-Status) auch die anderen Kopf-
                daten verf‡gbar macht:
                        -find {name}    0= 0 ?error     \ pr‡ft Vorhandensein
                                        dup $40 and .   \ Precedence-Bit
                                        dup $20 and .   \ Smudge-Bit (Null)
                                            $1f and .   \ L€nge des Namen
                Bei geeignetem Header-Aufbau und entsprechendem Verfahren zur
                Wortsuche ist auch das h„chstwertige 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 n€chstem 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 L€nge n2 vom Ende her nach demm Byte c3
                suchen, n4 als Bytenummer des gefundenen Zeichens zur‡ckgeben:
                n4 z€hlt ab 1, ist 0, wenn c3 nicht gefunden wurde.
-trailing       ( ptr count1 -- ptr count2 )
                <bl>s des String der L€nge count1 bei ptr vom Ende her kappen.
                Hierdurch wird nur der Z€hler im Stack ver€ndert - was f‡r die
                Ausgabe gen‡gt; die Ursprungsdaten bleiben unber‡hrt.
-window         ( c1 -- flg )                           F6
                flg = 1 bei eigenem Fensterkanal ohne PIF, flg = 49 mit PIF.
-0              ( -- $8000 )                            F6
                Cons, "negative Null", f‡r alle vocabularbezogenen Aktionen,
                oder wo sonst der niedrigst m„gliche Forth-Ptr ben„tigt 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 L€nge count1
                rechtsb‡ndig in einem Feld der L€nge MAX( count1,count2 ),
                gez€hlt ab der aktuellen Ausgabe-Position. Der Code f‡r das
                ggf. zum Auff‡llen benutzte Zeichen steht in {(r)}, kann also
                frei gew€hlt werden - er gilt auch f‡r {.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 l€nge 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 f‡r 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 w€hrend des Compilierens.
.r              ( n1 n2 -- )
                n1 rechtsb‡ndig in ein Feld mindestens der Gr„œe 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 zur‡ck, 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 Pr‡fung 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 ( -- )
                l€œt er sich unabh€ngig 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 l„schen
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 hochr‡cken.
                ( d1.. dm .. dn -nm -- d1 .. dn dm .. dn-1 dm )
                Posten dn abheben und an Position nm einf‡gen.
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 z€hlt 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, tr€gt ihn in das {current}-Vocabular
                ein und sperrt ihn zun€chst f‡r die Wortsuche. {context} wird
                auf das {current}-Vocabular gesetzt, das bisherige zweite Voca-
                bular f€llt 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 anschlieœender Freigabe des Wortes f‡r 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: Zus€tzlich 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 Ausf‡hrungsteil. Beendet
                den Compilezustand, gibt den Wortheader f‡r {-find} frei und
                stellt {context} auf das Assemblervocabular ein. Einsetzbar
                wie {;does>} mit dem einzigen Unterschied, daœ die Ausf‡hrungs-
                vorschrift in lo-level-Code folgen muœ. Da es keine weiteren
                Schutzmaœnahmen 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 ausgef‡hrt und um
                eine Speicherzelle k‡rzer angelegt. Jene wird vom DOES> des F83
                nicht mehr ben„tigt, 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 k„nnen. Man konstruiert mit {;does>} also allgemein
                        : eigenerName
                                CREATE Bildungsanweisung
                                ;DOES> ausf‡hrungsanweisung ;
                Wie auch bei der Konstruktion aus <BUILDS .. DOES> l€œt 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 f‡r die sp€tere Wortanalyse bestimmbar:
                        0 constant n-cfa
                        : name CREATE ... ;DOES> [ here 4- is n-cfa ] ... ;
                Eine Besonderheit im F6 - die aber auch anderen Systemen nach-
                tr€glich mitgegeben werden kann - ist die "Vererbbarkeit" auch
                der Ausf‡hrungsanweisung. Dazu bedarf es zus€tzlicher Maœnahmen
                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 ver€ndert werden.
                Worte, die mit {;does>} gebildet wurden, k„nnen von {c-load} nur
                wie 'normale' 4th-Worte behandelt werden, die Anpassung innerer
                Aufrufe an ver€nderte Adressenlage ist im Gegensatz zu den Defi-
                nitionen mit dem standardm€œigen {does>} dort nicht m„glich.
                {;does} enth€lt 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 zus€tzliche 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 erkl€rt:
                        LET cons% = 123
                Das Bildungsgesetz legt hier fest, daœ ein Name eingerichtet
                und irgendwie auffindbar gespeichert wird, sodaœ daraus sp€ter
                die ebenfalls eingerichtete Speicherstelle eindeutig auffind-
                bar wird. Die Ausf‡hrungsvorschrift legt fest, was mit dem
                Inhalt der identifizierten Speicherstelle geschehen soll, hier
                in einer Form, die die dort liegende Zahl verf‡gbar 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 tr€gt den Wert ein; sp€ter 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 doppeltgroœen Posten {hld 2+} auf denselben Wert,
                so ergibt sich eine M„glichkeit, 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 ben„tigt, gen‡gt das etwas schnellere {-}.
>               ( n1 n2 -- flg ) ( f1 f2 -- flg )
>chan<          ( c1 c2 -- )                            F6
                Vertauschen der Tabellenpl€tze zweier offener(!) Kan€le
>fount          ( n1 c2 -- )                            F6 ben„tigt dvs/IO2
                F6-Fensterkanal c1 den mit n1 codierten Zeichensatz zuweisen.
                Codie f‡r n1 s. {atne}, {bblu}, {hisc}, {losc}, u. -23: latin-1.
>loc            ( n1 -- )                               F6 (vorl€ufig)
                n1 Zellen "dynamische" Zuweisung eines localen Speicherblocks;
                richtet einen localen Speicherbereich von n1 Zellen ein, dessen
                Gr„œe auch erst w€hrend der Programmausf‡hrung 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 Postengr„œe weitergez€hlt gelten. Zum Compilieren
                der Local-Constanten-Adressierung muœ w€hrend des Compilevor-
                ganges wenigstens irgendein Datenposten in den Stack gebracht
                und am Wortende wieder fortgenommen werden. Eigene oder Locale
                Variable ‡bergeordneter Worte bleiben unver€ndert adressierbar,
                allein die Indices sind daf‡r entsprechend weiterzuz€hlen:
                    \ 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} n€her beschrieben.
>resolve        ( sys1 -- )                             C1
                Aufl„sen einer Vorw€rtsreferenz 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> bet€tigt wurde, wartet nach Bet€tigen der
                <space>-Taste auf erneuten Tastendruck, sonst ohne Wartezeit.
?exec           ( -- )
                abort, wenn im Compilezustand.
?key            ( -- 0 | $8000 | +code | -code )        (F6)
                Wird standardgem€œ ausgef‡hrt, liefert jedoch zus€tzlich 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 Bl„cke Localer Speicherbereiche.
?pairs          ( n1 n2 -- )
                abort, wenn n1 =/= n2.
?stack          ( -- )
                abort bei Grenzen‡berlauf 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 Datentr€ger
a/fre           ( -- d1 )                               F6
                2Cons, Anzahl freie Zuweisungseinheiten
a>h             ( c1 -- c2 )                            H4
                Einen Buchstaben als Ziffer interpretiert, sofern m„glich,
                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 zur‡ck.
accept          ( ptr n1 -- n2 )                        8.18 ANS
                Wie EXPECT, jedoch mit R‡ckgbe der empfangenen Anzahl Zeichen
                einschlieœlich der abschlieœenden <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 l„schen.
             >> 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-Verkn‡pfung 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-Zahlenpr€fix "{" ausgef‡hrt; im Screen-
                file angegeben, um Compatibilit€tsprobeleme mit F83 zu umgehen.
associative:    (I)                                     F6 (F83)
                Verwendung eigenst€ndig 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 ausgef‡hrt.
                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 zweckm€œig mit Basis-Praefix
                hingeschrieben. Es werden stets einfache Integer eingetragen,
                auch, wenn gerade das fp-Vocabular {context} sein sollte, darauf
                muœ also keine R‡cksicht genommen werden. In die derzeitige De-
                finition lassen sich Werte von auœen ‡bergeben durch:
                        : I, 3 roll , ; immediate
                        ( zahl )
                        associative: name erstezahl .. I, .. letztezahl ;
                Ausf‡hrung:
                        (nn -- associtative:-liste -- index)
                wo index die ab Null z€hlende Nummer des Posten ist, der mit
                dem ‡bergebenen Wert nn ‡bereinstimmt, andernfalls geht die
                Anzahl Posten zur‡ck, dem h„chsten Index + 1 entsprechend.
                 ndern einer Eintragung:
                        ( index nn ) IS asssociativename
atne            ( -- n1 )                               F6 & IO2
                Cons, Index f‡r 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-Zeichens€tze
                sind wegen ihrer 8-Bit-Breite nur in den Minerva-Systemen v„llig
                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 L€nge der Fileheader
b/scr           ( -- n1 )
                Cons, Bl„cke 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 f‡r die Zahlenbasis im Forth-System
basic           ( ptr -- flg )                          F6
                ptr zeigt auf das count-Wort eines im SBasic (Job 0) bekannten
                Namen. Repr€sentiert der eine residente Procedur, die ohne
                Parameter benutzt werden kann, so wird diese ausgef‡hrt. In
                allen anderen F€llen kann mit {a1l@} der Wertepointer, falls
                ein Variablenname angegeben war, sonst die Ausf‡hrungsadresse
                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
                erh€lt 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 n„tige Vorsicht vorausgesetzt, k„nnen die SBasic-Variablen
                vom F6 auch ver€ndert werden - bei Strings muœ die L€nge im
                SBasic erhalten bleiben!:
                        basicv" e$" dup ?error
                                1 m+ count-l
                                " .hpr l€œt gr‡œen" count-w
                                rot min swap base+ rot cmove-l
bblu            ( -- n1 )                               F6
                Cons, Codierung f‡r einen Zeichensatz - s. {>fount}.
bclr            ( dn1 n2 -- dn3 )                       F6
                Mit n2 angegebene Bitnummer in dn1 l„schen.
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 l„schen.
                {L<I} liefert ggf. den bis dahin dort g‡ltigen Bitwert.
bfset           ( dadr1 ud2 -- dn3 )
                Mit ud2 angegebene Bitnummer im Bitfeld ab dadr setzen.
                {L<I} liefert ggf. den bis dahin dort g‡ltigen 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 Durchg€nge z€hlt, entspricht der Sequenz
                        over + swap
break           ( c1 -- )                               H4
                Erwartet den Tastencode zum bedingungslosen Programm-Abbruch.
                Dieselbe Taste zusammen mit ALT l„st den Kaltstart aus - {cold}.
buffer          ( n1 -- ptr )
                Puffer f‡r den Block n1 zur Verf‡gung stellen.
bl              ( -- c1 )
                Cons, Zeichencode f‡r Leerzeichen
bs              ( -- )
                Position im Ausgabefenster um ein Zeichen zur‡cksetzen.
* 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 j‡ngste
                nfa an der Stelle ptr1 eingetragen ist.
c/scr           ( -- n1 )
                Cons, Bytes pro (Editor-)Screen
c/l             ( -- n1 )
                Cons, L€nge 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:} eigenst€ndig 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 Ausf‡hrung von Steuer-Codes.
cc4th           ( -- ptr j)                             (F83)   8.16 => hidden
                User-Vari mit ptr zur aktuellen case:-Liste f‡r die Ausf‡hrung
                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 h„chste F6-Kanalnummer, in der der im F6 offene
                QDOS-Kanal did verzeichnet ist, sonst -1.
chp             ( c1 -- ptr )                           LR
                Speicherplatz der zu c1 geh„rigen Kanalnummer, c1 von 0 bis 15,
clone-4th       ( -- )
                Aktive eigenst€ndige Copie des aufrufenden-F6-Jobs erzeugen.
close           ( c1 -- )                               LR
                Kanal c1 schlieœen, keine Fehleraktion.
cls             ( -- )
                Mit {out-cons} bezeichnetes Bildschirmfenster l„schen.
cmove-l         ( dadr1 dadr2 n3 -- )                   C1
cmove           ( ptr1 ptr2 n3 -- )
                Speicherbereich der Gr„œe +n3 von Forth-ptr1 nach ptr2 nicht-
                ‡berschreibend ‡bertragen.
cmc             ( -- ptr )
                Cons, als Wort-Z€hler 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 m„glich 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 weitergez€hlte
                Adresse adr2.
count-w         ( ptr1 -- ptr2 n3 )
                z.b. 16-Bit-Z€hler eines QDOS-String, ersetzt die Folge
                        2+ dup 2- @
count           ( ptr1 -- ptr2 c3 )
                liefert z.B. das Z€hlerbyte von Forth-Strings; steht f‡r
                        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
                Ausf‡hrung eines Steuercodes mit unterschiedlichen Parametern.
current         ( -- ptr )
                User-Vari, enth€lt 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)
                N€chsten 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 l€nge n2 rechtsb‡ndig hinschreiben.
d->s            ( d1 -- n1 | abort )                   (F6S)
                l€œt sich einschlieœlich §berlaufkontrolle z.B. nachbilden:
                        : d->s 1abs -18 ?error ;
                sonst gen‡gt 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, f‡r =/= 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 k„nnen 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 zur‡ck.
date$           ( -- ptr count )                        F6 QDOS
                Legt den Datumsstring zur weiteren Bearbeitung rsp. f‡r die
                Ausgabe mit {type} bereit.
             >> SBasic's DATE$ ready to {type}
day$            ( -- ptr count )                        F6 QDOS
db-on           ( -- n1 )                               F6
                Cons, Flag f‡r 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 f‡r neue Worte oder den fl‡chtigen Compilezustand vorbe-
                reitet. Nachdem die erg€nzenden Debugger-Worte geladen wurden,
                k„nnen mit Werten von 1 bis 4 in {db-on} die pr€parierten Worte
                entsprechend abgearbeitet werden. Man ruft sie wie gewohnt auf
                und hat folgende zus€tzliche 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>
                        l„st den n€chsten Schritt aus.
                Negative Werte in {db-on} suspendieren den Debug-Betrieb, nicht
                aber das entsprechende Compilieren, und belassen die Tastatur-
                abfrage aktiv. F‡r 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, f‡hrt dies u.a. auch {name1} aus, in
                dessen Rahmen die n€chste WA ausgef‡hrt wird. Dies ist oft recht
                n‡tzlich, wenn ein allgemeiner Aufruf f‡r verschiedene Zwecke
                eingesetzt werden soll. Dem Debugger bleibt dies jedoch verbor-
                gen, und er f‡gt nach {name1} seine Arbeits-WA ein, die dann
                von {r+} f€lschlich gelesen wird, was zu Sch€den f‡hren kann.
                        : name2 ... [ db-on 0 is db-on ] name1 bell [ is db-on ]
                vermeidet solche Irrl€ufer. Mehr in "F6CHG_txt" u. "FORTH_txt".
dds             ( -- ptr )                              F6
                User-Vari, ptr zum hi-level-Einsprung in den Ausf‡hrungsteil des
                j‡ngsten mit {;does>} gebauten Definitionswortes. Dient der
                Weitergabe der Ausf‡hrungsvorschrift neuer Definitionsworte.
ddup            ( n1 -- n1 n1 n1 )                      F6
decimal         ( -- )
default-is      ( name | -- )                           F6
                Einen Vector auf die Vorgabe-Aktion zur‡ckstellen; ist auf
                weitere Worte anwendbar, die mit IS besetzt werden k„nnen
                und einen 16-Bit Datenposten beliebiger Art verarbeiten.
                N‡tzlich auch, wenn ein Wort innerhalb eines Programms nur
                beim ersten Aufruf ausgef‡hrt werden soll, wie z.B. f‡r 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 unver€ndert bleibt.
             >> Re-assign a vector to it's default action.
defer           ( exec ) (C) ( DEFER name -- )          F83
                Vorw€rtsreferenz einrichten, {name} kann sp€ter mit {is} die
                gew‡nschte Aktion zugewiesen werden. Bis dahin, im Urzustand,
                f‡hrt {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 ausgef‡hrt, deren cfa auf ' name 2+ eingetragen ist.
                Liegt auch diese auœerhalb 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 urspr‡ngliche Aktion leicht
                zur‡ckgewonnen werden kann, sondern auch, weil sie selbst
                gegen‡ber dem sehr schnellen {noop} noch einen deutlichen
                Zeitgewinn bringt. Im Vergleich wurden in einer Schleife mit
                1.000.000 Durchg€ngen 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 zur‡ckgehen und es l„schen.
del-defb        ( --er )                                IO2/dvs_byt 8.18
                Aufruf der SBasic-Procedur aus TK2/GC/SMSQ.
digit           ( n1 -- n1 tf | ff )
                Liefert zus€tzlich den Flagwert 1, wenn n1 als Ziffer zur
                aktuellen Basis aus {base} g‡ltig ist, ersetzt sonst n1 durch
                den Flagwert 0.
dliteral        ( -- dn )  (C)( dn -- )         - "state sensitive" -
                doppeltgenauer Festwert. N€heres 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 ausgef‡hrt 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 auzuf‡hrenden Teil ein. Darf nur bei Worten ein-
                gesetzt werden, die mit {<builds} aufgebaut werden. F‡r die im
                F83 mit {create} ‡bliche Paarung ist {;does>} zu verwenden.
                Nach {does>} ist das im Aufbau begriffene Wort f‡r {-find} noch
                nicht erkennbar.
dp              ( -- ptr ) User-Vari
                Dictionary-Pointer, wird beim Compilieren weitergez€hlt.
                Die niedrigste 4th-Adresse ist $-8000, die h„chste $7fff.
                Vorsicht:
                Wird der Inhalt von {dp} direkt durch ein Programm ver€ndert,
                und besteht dabei die M„glichkeit der Vorzeichen€nderung, muœ
                dem Dictionary-Ptr auf der Langwortadresse { dp 2- } die vor-
                zeichenerweiterte doppeltgenaue 4th-Adresse zugewiesen werden.
                Widrigenfalls verkehren sich die Maœnahmen zur Adressierungs-
                sicherheit in ihr Gegenteil, und das System bricht zusammen.
dpl@            ( -- n1 )                               F6
                Liefert den Inhalt der User-Variablen {dpl}
dpl             ( -- ptr )                              ( F6 f‡r fp-Zahlen )
                User-Vari, nach der Umwandlung eines Ziffernstring in eine Zahl
                wird hier die Position des (letzten) Dezimal-Kommas (-Punktes)
                verzeichent, gez€hlt von der letzten Ziffer an. Steht das Zei-
                chen an letzter Position, enth€lt {dpl} Null, fehlt es, steht
                dort -1. Flieœkommazahlen 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 auœerordentlichen Verlassen eines Wortes.
dr0             ( -- )                                  LR
                Erstes Massenspeicherger€t aktivieren, i/o durch {screen}.
                Setzt {offset} auf Null. G‡ltige Screens von 0 bis 16383;
                Screen Null kann nicht in den Interpreter geladen werden!
dr1             ( -- )                                  LR
                Zweites Massenspeicherger€t 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 g‡ltige 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 - Erl€uterungen 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 l„schen.
empty           ( -- )                                  F6 F83
                Alle Definitionen jenseits der Grenze aus {fence} l„schen.
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
                Textst‡ck holen. Anfangs ist c1 nicht erforderlich, es m‡ssen
                ab der Stelle ptr jedoch wenigstens zwei unterschiedliche Zei-
                chen vorhanden sein, deren letztes mit dem Code c1. F‡hrende
                Begrenzungszeichen werden ‡bersprungen, erst nach einem davon
                unterschiedlichen Zeichen gilt es als Begrenzung. Leerstrings
                kommen also nicht vor. Vielfach als st„rend empfunden ist das
                zum einen f‡r {word} erforderlich, zum andern aber auch zur
                optisch g‡nstigeren 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 umfaœt alle Zeichen"
                was sehr viel plausibler aussieht, als die (eigentlich korrekte)
                Schreibweise f‡r denselben Text:
                        string {name} die Begrenzung umfaœt alle Zeichen"
                Zur‡ckgegeben wird der unver€nderte 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 L€nge 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 f‡r den unbedingten Einsprung in eine
                BEGIN-Schleifenstruktur an den mit {entry} bezeichneten Ort.
                Dies macht den unbedingten R‡cksprung der Strukturen der Art
                BEGIN..WHILE..REPEAT ‡berfl‡ssig und erlaubt bei schnellerer
                Ausf‡hrung 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 zus€tz-
                liche Operator ohne Wirkung auf die Ausf‡hrungszeit 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 verr‡ckt:
                        cc IF n1 n2 2>r ENTER [ 2swap ] ENDIF
                                 n3 n4 DO ... [ 2swap ] ENTRY ... LOOP
                Es ist also lediglich darauf zu achten, daœ f‡r {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 zur‡ckgestellt.
                Zerst„rungsfreies Lesen ist m„glich mit:
                        ' ernum cfa @ 2+ base+ @l 2+ 2@
error           ( n1 -- )
                Schreibt die Fehlermeldung zum Code n1 und f‡hrt {warm} aus.
                Im Verlauf der Fehlerbehandlung wird vor dem Erreichen von
                {quit} eine Kette teils revectorisierbarer Worte ausgef‡hrt,
                die bedarfsweise auch auf andere Worte eingestellt werden
                k„nnen. Insbes. {(quit)} dient dabei dem automatischen Start
                und sp€teren stetigen Wiedereintritt in z.B. ein Programm.
                error (D)       f‡hrt [error] aus,
                [error]         bei warning > oder = 0 endet es
                                        in der Ausf‡hrung der cfa aus (quit).
                        (quit)          f‡hrt in den  uœeren Interpreter.
                                bei warning < 0 wird abort ausgef‡hrt
                        abort           ruft (abort) und (quit) auf:
                        (abort) (D)     ist initial mit einem headerlosen Wort
                                        zur Teil-Initiierung besetzt,
                        (quit)          schlieœt mit Ausf‡hrung der cfa ab,
                        quit            ist der  uœere 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 zur‡ck.
             >> 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 n€chsten <enter>
                oder der maximalen L€nge n1 und bringt sie nach ptr.
                Die empfangene L€nge ist unmittelbar danach in {span} lesbar.
                Fehler werden durch {(exper)} so abgefangen, daœ bei Verlust
                des Eingabekanals die Fenstervorgabe vom Systemstart sowohl
                f‡r in-cons als auch f‡r out-cons eingetragen wird. Eingabe
                ist sowohl aus Dateien als auch aus Fensterkan€len m„glich.
* F
f/n             ( -- n1 )                               F6
                Cons, Maximall€nge f‡r einen Filenamen.
f>$             ( f1 -- ptr count )                     F6 QDOS
                fp-Zahl in Zifferntext umwandeln und zur weiteren Bearbeitung
                rsp f‡r {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
                L„scht 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, enth€lt die absolute Untergrenze f‡r {forget}, die
                zur einwandfreien Funktion von {empty} und {cold} unbedingt
                eine lfa sein sollte, z.B.:
                        ' task lfa fence !
                Wurde {empty} mit ge€ndertem {fence} oder {forget} unterhalb
                der zuvor g‡ltigen Grenze aufgerufen, sind danach mit {safe!}
                die Initiierungsdaten f‡r {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 L€nge aus
                {f/n} mit Z€hler-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 Verkn‡pfung 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 M„glichkeit, damit eine automatisch verwaltete Teilung
                von Prompt-/Eingabe- und Ausgabe-Fenster einzurichten:
                        " con_448x40a20x200" 0 ch-id 0 open-link
                er„ffnet ein nur f‡r die Eingabe zust€ndiges Fenster, das
                zugleich als "prompt"-Kanal dient, und lenkt die Standard-
                Ausgabe in den f6-Kanal 0, der nun nur die Ausgabe aufnimmt.
                F‡r 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 schlieœlich 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
                L„scht ggf. das File name und f‡hrt dann {fop-new} aus,
                ist darum von TK2 oder Minerva unabh€ngig ‡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.
                F‡r alle {fop..}-Varianten gilt:
                Falls {work} vor dem open-Versuch einen offenen Kanal repr€sen-
                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-
                sch€dlich, 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 enth€lt, 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 l„schen und
                den betr. Bereich freigeben. {abort} wenn name nicht existiert.
                {forget} ist von der Vocabularordnung beim Aufruf unabh€ngig
                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 zur‡ck; Vocabulare
                k„nnen problemlos mit {forget} ebenfalls entfernt werden.
                        fence @ top-nfa id.
                zeigt den Namen des letzten vor {forget} gesch‡tzten Wortes an.
                In {forget} liegt die einzige Stelle des F6-Systems, an der die
                Caches der Processoren ab 68020 geschaltet werden. Dies dient
                f‡r sp€tere z.B. {defer}red oder lo-level-Aufrufe der sicheren
                Erkennung der Ver€nderungen durch den Processor. Nach auœen hin
                tritt die vor‡bergehende Abschaltung nur mehr oder weniger zu-
                f€llig in Erscheinung, wenn der mit {break} erzwungene Abbruch
                gerade in die Ausf‡hrung der entsprechenden {forget}-Passage
                f€llt. Sch€dliche 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 zur‡ck,
                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
                Pr‡ft, ob mit name ein lesbarer Kanal eingerichtet werden kann.
fp              ( -- ) (I)                              F6
                Vocabular f‡r Flieœkomma-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 f‡r die eher heiklen Operationen zum Schutz gegen
                versehentlichen Aufruf, und f‡r Hilfsdefinitionen, die kaum
                allgemeine Anwendung haben, um die Wortsuche in den anderen
                Vocabularen nicht unn„tig zu verlangsamen.
hld?            ( -- flg )                               F6
                flg = 1 bei Erreichen der Bereichsgrenze zur Zifferndarstellung.
                Insbes. zur Kontrolle bei der quad-Umwandlung. Es bleibt stets
                noch gen‡gend Platz, um ggf. durch einen voranzustellenden L€n-
                genz€hler 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
                f‡r Einhaltung der Grenzen zu sorgen. Es wird Platz f‡r maximal
                66 Zeichen einschlieœlich evtl. des L€ngenwortes ben„tigt.
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- } enth€lt den vorzeichenerweiterten Wert.
                Bei Ver€nderung des Ptr von auœen, 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 "abw€rts" aufge-
                baut wird. Wird ein mit {>loc} reservierter Localer Speicherbe-
                reich hierzu benutzt, lassen dadurch sich jegliche Konflikte bei
                der Zahlenausgabe vollst€ndig ausschlieœen.
hold            ( c1 -- )
                F‡gt 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 j‡ngsten Operation benutzten i/o-Kanals.
id.             ( nfa -- )
                Schreibt den zur angegebenen nfa geh„renden 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 auœerdem
                die Definition einer Unzahl spezieller Operatoren f‡r jeden
                der m„glichen Vergleichszust€nde 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 k‡rzeres  quivalent, wird
                aber als besondere IF-Variante ebenfalls optimierend compiliert.
if-found        ( IF-FOUND name -- ) (I)                F6 (F83)
                Hilfe z.B. f‡r 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 j‡ngste current-Wort zum Compiler-Wort, d.h. es
                wird "immediate" erkl€rt und damit stets sofort ausgef‡hrt.
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 l€œt 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 f‡r 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 gew„hnlichen Fenstern, flg=-1 bei untauglichem Kanal.
is-ochan        ( c1 -- flg )                           F6
                flg = 1 wenn c1 einen eigenen Kanal des F6-Jobs repr€sentiert.
is-open         ( c1 -- flg )                           F6
                flg = 1 wenn c1 einen offenen Kanal repr€sentiert.
in              ( -- ptr ) User-Vari
                Enth€lt 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 repr€sentiert.
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 zugeh„rigen Adresse und einem {!}-Operator sehr
                viel schneller, IS dagegen ist transportabel in andere Forth-
                Systeme, da dessen Definition dort leicht erg€nzt 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 (geringf‡gig 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 zur‡ck.
key             ( -- n1 )                               ( F6 erweitert )
                Wartet auf Tastenbet€tigung und gibt den zugeh„rigen Zeichen-
                code zur‡ck. Zusammen mit ALT ist der Wert negativ, war kein
                Tatstaturkanal zug€nglich, kommt $8000 ( 32768 ).
                Die Wartezeit wird von {io-time} bestimmt und kann damit ge€n-
                dert werden, ist sp€ter aber unbedingt wieder zur‡ckzustellen.
* L
lit+            ( -- ) (C)                              F6
                Mit gr„œter Vorsicht zu verwenden, da v„llig ungesch‡tzt:
                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 f‡r den Aufruf,
                wenn ungewiss ist, ob die Initiierung schon vorher erfolgte.
                Da relativ aufwendig, und f‡r 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 f‡hrendem und
                abschlieœendem Leerzeichen bei vorangestelltem Doppelpunkt ste-
                hen, ggf. auch als Kommentar:
                        ( : name1 : name2 und ggf. weiterer text )
                Bleibt er unver€ndert, kann der Filename fortgelassen werden.
                Bedingtes Compilieren wird zus€tzlich dadurch unterst‡tzt,
                daœ {-lword} den gesuchten mit einem angegebenen Namen ver-
                gleicht und bei Erfolg als Flag 1 zur‡ckgibt, 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 ge„ffnet, sodaœ auch Aufrufe im
                selben Quellenfile mit {l-load} m„glich sind, oder mehrere F6-
                Jobs zur selben Zeit auf dieselbe Quelle zugreifen k„nnen.
                L-LOAD kann in ca. 30 Stufen geschachtelt aufgerufen werden:
                Es belegt im Returnstack die der Namensl€nge des Aufruf-File
                zuz‡glich 11 entsprechende Anzahl Bytes, geradzahlig abgerundet.
           FEHLER: Regul€re Fehlermeldung bei nicht gefundenem Wort ist err.ro,
                "Schreibschutz", weil intern ein Versuch zum normalen OPEN am
                bereits OPEN_IN-ge„ffneten File scheitert, der standardm€œig
                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 Fehlerm„glichkeit unvollst€ndiger 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 durchzuf‡hren,
                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 m‡ssen.
l-mrg           ( -- ptr ) User-Vari                    F6
                Linker Rand bei der Bildausgabe, z.B. im Debugger.
l<i             ( -- dn1 )                              F6
                Gibt den j‡ngsten Wert des Processor-Registers D0 zur‡ck.
                Liefert nur compiliert sinnvolle Werte, die benutzt werden
                k„nnen, um z.B. das regul€re Ende einer DO..LOOP vom Ende
                durch Verlassen mit LEAVE zu unterscheiden. Dieses Wort ist
                ganz und garnicht standardgem€œ und d‡rfte kaum ‡bertragbar
                sein. Es sollte darum nur in Ausnahmef€llen benutzt werden.
                N€heres hierzu in "FORTH_txt" rsp. hier am Schluœ.
last            ( -- ptr )                              F79+
                User-Vari, enth€lt die nfa der j‡ngsten Definition im Sytem.
                Gegen‡ber {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 w€hrend der Definitionsphase ein h„chst unkonventionel-
                les (und sinnloses!) Vorgehen ist, so wird {latest} dann auf ein
                anderes Wort zeigen und die Referenz kann zu Fehlern f‡hren.
                        : name ... IF [ last @ pfa cfa , ] ENDIF ... ;
                beispielsweise f‡r eine "handgefertigte" Recursion.
latest          ( -- nfa )
                ist nfa des j‡ngsten 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 auœerdem noch k‡rzer, als
                        : dr? offset c@ $40 and $40 = ;
                F‡r alle {literal}-Varianten gilt:
                Beim Compilieren wird die zugeh„rige Zahl sofort vom Stack
                genommen und in das gerade zu definierende Wort compiliert.
                Kam sie also von "auœen" 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 ausgef‡hrt, als die
                entsprechenden {constant}-Definitionen. Das Compilieren dauert
                etwas l€nger, da Zahlen immer erst nach erfolgloser Wortsuche
                ermittelt werden. Sie bieten sich dort an, wo eine Zahl nach dem
                Compilieren nicht mehr ge€ndert 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 zur‡ck, 0 im Erfolgsfalle. Fehler-
                code 0 kann auch als zuverl€ssiger Hinweis auf Vorhandensein
                der "lightning"-Erweiterung ausgewertet werden.
l-ro            ( -- n1 )                               F6
                Cons, 1 f‡r {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 zug€nglich - angezeigt.
                LOAD belegt jeweils drei Posten im Returnstack, womit mehr als
                250 Stufen geschachtelter Ladevorg€nge sicher aufrufbar sind.
                F‡r aufeinander folgende Aufrufe oder Anzahl unterschiedlicher
                Files gibt es bei keiner der Lade-Varianten eine Begrenzung.
                Durch Re-Vectorisierung von {load} l€œt 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} ausdr‡cklich been-
                det, bricht aber auch selbst€tig ab, sofern in der zuletzt gele-
                senen Seite weder {-->} steht, noch ein neues {load}-Kommando.
loc>            ( n1 -- )                                       F6
                Gibt den n1 Zellen groœen 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 umfaœt. Einziger Schaden besteht u.U. darin, daœ der
                "vergessene" Bereich nur dann zuverl€ssig zur‡ckzugewinnen ist,
                wenn die Anzahl verbliebener Local-Bytes bekannt ist. Gegen die
                Freigbe zu groœer Bereiche sind Maœnahmen getroffen, die jedoch
                nur als letzte Rettung zum Schutz des Systems wirksam werden.
                 ltere locale Bereiche und evtl. auch regul€r im Datenstack ab-
                gelegte Posten k„nnen in solchen F€llen verlorengehen.
loc>stk         ( n1 ... nn -- {a|A} {b|B} ... {z|Z} n1 .. nn )
                Auœerordentlich 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
                unver€nderter 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 v„llig 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| ...
                f‡r einfache Integer, oder
                        : name .. LOCAL ABCD| ...
                f‡r Doppelte. Gemischte Schreibweise gilt als Kleinschreibung.
                Bei der Deklaration muœ die Buchstaben-Liste mit einem "|" abge-
                schlossen werden, widrigenfalls k„nnen unkontrollierbare Fehler
                auftreten. Mehrere Listen im selben Wort sind nicht zul€ssig.
                Zwischen den Buchstaben und vor dem "|" k„nnen Leerzeichen ste-
                hen, sofern nur die Definition in derselben Zeile endet.
                Die Deklaration kann an beliebigem Ort erfolgen, es ist v„llig
                belanglos, welche Operationen m„glicherweise davor in den Stacks
                oder sonstwo im System vorgenommen wurden. Allein zum ordnungs-
                gem€œen Compilieren d‡rfen 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 hinterl€œt. 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 Beschr€nkung (weitgehend) unterbunden.
                In gewisser Weise bedingt ist es jedoch problemlos nach dem
                hier beschriebenen Muster m„glich, 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 aufgel„st, da
                dann das {;} am Schluœ stets regul€r 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 zul€ssig; d.h. sie muœ auœerhalb jeglicher
                in Forth-Worten abgefaœter Sprungstruktur stehen.
        Ausf‡hrung:
                F‡r die Ausf‡hrung gibt es weder Einschr€nkungen noch Abweichun-
                gen gegen‡ber gew„hnlichen Constanten und bei Adressierung mit
                Hilfe des Wortes {-loc} auch nicht gegen‡ber Variablen. So wer-
                den insbes. weder DO-LOOP-Konstruktionen noch irgendwelche Ope-
                rationen in beiden(!) Stacks beeinfluœt. Gerade diese Eigenheit
                kann innerhalb von Schleifen zu enormem Zeitgewinn f‡hren, der
                die weiter unten beschriebene und zun€chst eher umst€ndlich 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 erh„ht adressiert, wodurch sich mit u.U. groœem
                Laufzeitgewinn locale Parameterbl„cke an untergeordnete Aufrufe
                weitergeben lassen. Stehen beim Compilieren nicht schon irgend-
                welche Compilerdaten im Stack, muœ das betr. Wort wenigstens
                durch eine leere Deklaration pr€pariert werden:
                        : name ... IF ... local A ...
                        : name [ 0 ] ... local A ... ... [ drop ] ;
                erzeugen Leseaufrufe. Stets sicher, aber weniger schnell in der
                Ausf‡hrung, 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 Speicherbl„cke.
                Die Localen Variablen sind lediglich eine spezialisierte Form
                dieser Zuweisung, erg€nzt um besondere Hilfsfunktionen. Darum,
                und wegen der Lage in einem Bereich, wo sie mit anderen System-
                erfordernissen nicht kollidieren, k„nnen s€mtliche Operationen,
                die etwa an einem mit {allot} reservierten Ort zul€ssig sind,
                auch 'local' vorgenommen werden. Alleinige Einschr€nkung ist
                deren Localit€t. 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 vertr€glichen 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 f‡r den Stackanfang und bleibt
                damit weiterhin Ptr f‡r 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 k„nnen 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 zus€tzlich ord-
                nenden Daten n„tig sind; dies erm„glicht die Geschlossenheit des
                {local}-Bereichs und formatfreie mit z.B. den {user}-Variablen
                consistente durchgehende Adressierbarkeit aller {local}-Posten.
                Damit er„ffnet sich die sonst in Forth-Systemen unbekannte und
                nur mit hohem Aufwand nachzusetzende M„glichkeit der §bergabe
                von (localen) Parametern unabh€ngig 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 tempor€re Forth-Worte angelegt werden k„nnen.
        Anwendung:
                Zum Reservieren rsp. Freigeben localen Speichers sind die Worte
                {ini-loc} und {end-loc} im hidden-Vocabular vorhanden - s.dort.
                Diese m‡ssen 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
                €uœerst vielf€ltigen 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 Gr„œe gelesen werden k„nnen, 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
                daf‡r 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
                Flieœkommazahlen gearbeitet werden. Entsprechende Platzreser-
                vierung ist erforderlich und auch ohne Parameter u.a. dadurch
                m„glich, daœ das Wort selbst vor der Deklaration die n„tigen
                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 Ausf‡hrungsphase sind Aufl„sen 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 ben„tigte Zeit ist mit {constant}en vergleichbar.
                Zugegebenermaœen hat der Autor Locale Variable im 4th schlicht
                f‡r Quatsch gehalten (mit all den "standardgem€œen" Einschr€n-
                kungen sind sie das in der Tat), doch zeigte sich, daœ neben
                dem bequemen Umgang damit die hier eingerichtete Form auœerdem
                zu erheblichem Zeitgewinn f‡hren kann. Damit wird der Einsatz
                Localer Variabler unabh€ngig von allen grunds€tzlichen Erw€gun-
                gen durchaus sinnvoll, besonders, wenn wiederholt umfangreiche
                Stackoperationen erforderlich w€ren, 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
                zus€tzliche Datenposten im Stack vorhanden sind.
                §bergeordnete Locale Variable indiziert man mit ihrem Index der
                Deklaration, erh„ht um dem gr„œten 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 einschlieœlich evtl. eigener Local-Posten.
                F‡r eine nur mit ‡bergeordnetet Localen Werten arbeitende Defi-
                nition wie {name1} ist die zeitraubende Verwaltung des eigenen
                Speicherbereichs (der Gr„œe Null) unn„tig. Mit einem Eingriff
                in den Compiler l€œt sich deren Einbau unterdr‡cken:
                        : 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 anschlieœend verworfen. Auf diese Weise
                kann die Local-Deklaration mit einer {drop}-Funktion vereinigt
                werden - was aus Laufzeitgr‡nden wohl weniger zu empfehlen ist.
                Sollte aufgrund eines Fehlers einmal die selbst€tige Freigabe
                versagt haben, l€œt sich der Local-Bereich durch Reinitiierung
                radikal freigeben, entweder mit {cold}
                                safe!           ( ggf. bisherige Worte sch‡tzen
                                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 f‡r 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 entf€llt 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
                Bl„cke der L€nge n4, gibt die weitergez€hlten Adressen zur‡ck.
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 zur‡ck.
* 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-Z€hler 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 zuf‡gen.
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, f‡hrt {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 anschlieœender Ver-
                minderung um Eins und kann oftmals auch zeitsparend eine solche
                Folge ersetzen. F‡r 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)
                F‡hrt {[number]} aus, bei Fehler anschlieœend {?numerr}.
ni              ( n1 -- n2 )                            H4
                Holt den Schleifenindex der n1-ten n€chst€uœeren 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. F‡r den open-Typ gelten die Codes der Qdos-Trap:
                        0       zum Lesen und Schreiben
                        1       nur Lesen, mehrfache Nutzung m„glich
                        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 repr€sen-
                tiert, so wird dieser vor der neuen Zuweisung geschlossen.
                Hinweis: {fop-over} ben„tigt die erweiterte open-Codierung des
                TK2 o.dgl. nicht, da es das File durch die Verbindung {delet}
                mit folgendem {fop-new} erst nach L„schen desselben „ffnet.
opt             ( -- ptr )                              F6
                Vari f‡r globale Freigabe und Sperrung der hi-level-Optimierung,
                jeder von Null verschiedene Wert bewirkt Freigabe.
os              ( -- ptr )                              F6
                User-Vari, vorbereitet f‡r die Code-Segmentierung
out-cons        ( -- c1 )                               F6
                F6-Kanalnummer des Standard-Ausgabekanals.
out             ( -- ptr ) User-Vari
                ptr auf Z€hler der in den Standard-Ausgabekanal geschriebenen
                Zeichen, wird durch {cr} auf Null gesetzt, durch {bs} und {del}
                zur‡ckgez€hlt.
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-Verkn‡pfung n1 mit dem Speicherinhalt bei ptr.
* P
pad             ( -- ptr )
perform         ( ptr -- exec )                         F6/F79+
                ptr zeigt auf eine cfa, die durch {perform} ausf‡hrt 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 z€hlend.
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 standardm€œigen "sharp", als zeit-
                bestimmender elementarer Aufruf zur Bildung eines Zahlenstring
                im Kern definiert; die restlichen Worte k„nnen 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 zur‡ck.
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 f‡r 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 f‡r den Rest gegen‡ber 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
                Veranlaœt, daœ die n€chste Zahl im quad-Typen geholt rsp. com-
                piliert wird. Dies ist unabh€ngig von einer Dezimalmarke und
                gilt nur f‡r die n€chste 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 Ausf‡hrung 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 f‡r {dpl} in keinem Falle gr„œer als 64 werden
                kann, wurden neben der Angabe der (Dezimal-)Bruchmarkierung in
                den niederwertigen 8 Bits s€mtlich gesetzte Bits des h„herwerti-
                gen Byte bei stets ungesetztem Bit 7 als quad-Signal gew€hlt.
                {dpl@} kann daf‡r dann Werte von $ff00 bis $ff40 annehmen, die
                von den anderen M„glichkeiten 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  ." M‡ll "    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 f‡r {expect}, s.dort.
quit            ( -- )
                Der €uœere Interpreter - sicherer R‡ckkehrpunkt 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 j‡ngsten 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 n€chste
                Zahl der Liste wenigstens um eins gr„œer ist als jene, oder
                kein weiterer Listenposten folgt. Liegt die Zahl unterhalb des
                niedrigsten Listenposten, geht Null zur‡ck, regul€re Indices
                z€hlen 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 unver€ndert.
                VORSICHT bei FP: Der Posten m1 muœ stets als Integer angegeben
                werden, im FP-Format kann es wegen Interpretation des Exponenten
                als Z€hler durch Bereichs‡berschreitung zu ‡blen Fehlern kommen.
root            ( -- )                                  F83
                Vocabular, enth€lt nur das Minimum an Worten, das vorhanden
                sein muœ, um das System in Betrieb zu nehmen. Neue Definitionen
                sollten hier nur sparsam und ‡berlegt eingef‡gt werden. Zum ei-
                nen ist {root} quasi der Schl‡ssel zum System, zum andern wird
                es bei erfolgloser Wortsuche zum Schluœ unabh€ngig 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 erh„hen.
rot             ( n1 n2 n3 -- n2 n3 n1 ) ( f1 f2 f3 -- f2 f3 f1 )
row             ( -- ptr )                              F6
                User-Vari, Zeilenz€hler 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 z€hlt 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 erm„glicht.
                Einige Anwendungen finden sich z.B. bei PRINTER in "forth_scr".
                Aufrufe eines ein {r+} enthaltenden Wortes d‡rfen d‡rfen NICHT
                mit aktiviertem DEBUGGER compiliert werden. Zumindest f‡r 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 f‡r 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 ge„ffnet 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 Maœnahmen.
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, anschlieœend
                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 L€nge n2 zur‡ckgeben,
                an der das Zeichen c1 gefunden wurde. Das n€chste Vorkommen
                desselben Zeichens findet mann dann z.B. mit
                        $ffff.0001 d+ ( c1 ) scan
                worin die double-Addition eine verk‡rtzte Form der Sequenz zum
                Weiterr‡cken auf das n€chste 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 f‡r (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 g‡ltigen
                Wert in n2 zur‡ck, oder nur letzteres bei n1 = -1.
set-cal         ( -- )                                  F6
                Systemeigenen Zeit-Z€hler (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 unabh€ngig 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 f‡r 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 L€nge n2 zur‡ckgeben,
                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 f‡r S-LOAD - und damit auch L-LOAD, um die Re-
                Vectorisierung f‡r letztgenannten Aufruf zu erm„glichen.
                Initial mit {\name} besetzt.
smudge          ( -- )
                Freigabezustand der j‡ngsten Definition im current-Vocabular
                umschalten. Nach {create} erforderlich, wenn das Wort auffind-
                bar (und ausf‡hrbar) gemacht werden soll, oder z.B. bei Fehler-
                abbruch w€hrend des Compilierens, um {forget} auf das j‡ngste,
                wegen des Fehlers unvollst€ndige Wort anwenden zu k„nnen.
source          ( -- ptr n1 )                           F83 & 8.18
                Ort und verf‡gbare L€nge 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 L€nge des j‡ngsten 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" ausf‡hrlich beschrieben, hier kurz:
                Universeller Stackoperator f‡r mit kleinen Buchstaben bezeich-
                nete einfache oder mit Groœbuchstaben 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 k„nnen benannt werden, die Listen
                d‡rfen 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 } ausf‡hrt, 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 auœerdem den fl‡chtigen compilieren-
                den Zustand zwischen "|"-Zeichen bei der direkten Eingabe.
stk>loc         ( n1 ... nn -- ) ( sys: -- ptr 9 )      F6S
                Auœerordentlich schnell ausgef‡hrte Altternative zum Einrichten
                Localer Variabler bei §bergabe s€mtlicher 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      Nationalit€ten-Kennbuchstabe des QDOS
                    lsbyte      -1 Minerva-System, 0 sonst
                Auœerdem lassen sich mit Hilfe von {qsys+} einige Eigenheiten
                j‡ngerer qdos-Abk„mmlinge 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 f‡r 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 zur‡ck. In direkter
                Eingabe wird daf‡r {pad} benutzt, sonst der Bereich ab {here}.
ti-cal          ( -- d1 )                               F6
                gibt den Kalibrierungswert des F6-Zeitz€hlers zur‡ck. Dieser
                entspricht der Anzahl Durchg€nge einer im F6-System verankerten
                Z€hlroutine innerhalb 50 20ms-Intervallen. Sie ist so aufgebaut,
                daœ der Processor ggf. nicht in den "loop"-Modus geht, l€œt aber
                die evtl. vorhandene Cache-Speicherung unber‡hrt und unbeachtet.
                Die unterschiedliche Ausf‡hrungstaktung der 68008- gegen‡ber den
                anderen Processorvarianten ist bereits ber‡cksichtigt, die beim
                Atari-QL m„glichen besonderen Interruptintervalle jedoch nicht.
                Das Ergebnis ist die effektive Rechnertaktung/sec/10, die Zahl
                dient der Synchronisierung zeitabh€ngiger Vorg€nge; wieweit die
                Taktung tats€chlich damit ‡bereinstimmt, hat demgegen‡ber keine
                sonderliche Bedeutung, dieser Wert soll lediglich einen qualita-
                tiven §berblick geben. Wegen der Vorg€nge beim Jobaufbau des
                SMSQ/E wird die Startmeldung um eine Sekunde verz„gert, damit
                sofort der wirkliche Wert zur Verf‡gung 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 erg€be.
                3.      10.     Gold-Card-QL
                                bei Werten ab 8 MHz bis < 23 MHz.
tib             ( -- ptr )
                User-Vari, enth€lt 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 Eingabel€nge. Wird nach der ersten
                Eingabe auf 171 reduziert, kann bei Beachtung der Grenze von
                1080 Bytes f‡r den gemeinsamen Bereich von Returnstack und
                t.i.b. erh„ht werden durch
                        ( zahl ) ' tib-max 2+ !
                Oder einmalig f‡r 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 erm„glicht.
tib@            ( -- ptr )                              F6
                Inhalt von {tib}, Anfang des t.i.b.
tick            ( -- d1 )                               F6
                Augenblicklicher Stand des F6-Zeitz€hlers in 20ms-Einheiten.
                Mit einem einfachen allgemeinen Aufrufrahmen l€œt {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 f‡r die leere Schleife eintragen:
                   ' noop is test       \ Wort f‡r 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 f‡r {4dup}
                    ' t1 is test
                    ti-test
                    ' 4dup is test
                    ti-test
                Nach dem Durchgang erscheint die Zeit in Mikrosekunden f‡r den
                einzelnen Aufruf und es verbleibt die Anzahl 20ms-Einheiten
                f‡r den gesamten Test im Stack, z.B. f‡r die Ermittlung der
                Zeitdifferenz zweier Tests oder zur Ausgabe mit {time$}. Als
                Ged€chtnisst‡tze wird auœerdem 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-verkn‡pft. Da die so
                m„glichen Fehler auœerhalb der 7-Bit-Schriftzeichenbereiche
                liegen, wurde dieses einfache aber schnelle Verfahren gew€hlt.
                Ein Code in {(joker)} gilt f‡r ein Zeichen im Vergleichsstring,
                das immer als gefunden z€hlt, also f‡r den Vergleich nicht von
                Belang ist. Der ggf. in {(wcard)} eingetragene Code repr€sen-
                tiert in gleicher Weise ein Zeichen, das eine ab 1 beliebig
                groœe Gruppe beliebiger Zeichen repr€sentiert (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 f‡r Gleichheit beider Strings zur‡ck.
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 ausf‡hren.
top-nfa         ( ptr -- nfa | 0 )                      F6
                Hilfswort zur Ermittlung der j‡ngsten nfa, die ungeachtet der
                Suchordnung noch im Dictionary-Bereich bis ptr liegt. Liefert
                z.B. in {forget} den Wert f‡r {last}, und wird neben {safe!}
                u.a. auch in {c-save} und {c-load} ben„tigt.
                        fence @ top-nfa id.
                zeigt den Namen des letzten vor {forget} gesch‡tzten Wortes an.
traverse        ( ptr1 n1 -- ptr2 )
                Tastet den Speicher ab ptr1 bis zu einem Byte mit gesetztem
                h„chstwertigem 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 rechtsb‡ndig in Feld der L€nge 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 l„schen.
update          ( -- )
                aktuellen Block markieren, sodaœ er vor dem §berschreiben durch
                einen neuen Block, oder bei {flush}, zur‡ckgeschrieben 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 f‡r 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} enth€lt den
                Laufptr in diesen Bereich, und {u0} zeigt auf den Anfang. Neue
                Datenposten werden dort mit {user} reserviert und erhalten Platz
                f‡r eine einfache Integer zugewiesen. Bei gr„œeren Posten z€hlt
                man anschlieœend {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 n€chsten freien Index zu.
                        ' dp @ 2- user dp-l
                macht den Langwort-DP zug€nglich. 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 ge„ffnet
                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    schlieœt "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 f‡r den Anfang des aktuellen User-Bereichs.
u<              ( un1 un2 -- flg )
up              ( -- ptr )
                User-Vari, h€lt 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 gel„scht wird, oder es nach einer
                Anzahl {#vocs} Aufrufen von {also} auch dort hinausf€llt.
                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
                k„nnen, die nur aus ihrem unmittelbar ‡bergeordneten Vocabular
                heraus zug€nglich 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 eingepr€gte secund€re Suchfolge wird unabh€ngig von ihrem
                Freigabemodus initial auf das CURRENT-Vocabular eingestellt.
                Wird ein Vocabular mit {forget} o.€. entfernt, ist anschlieœend
                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 zus€tzlich
                eine Sicherheitsfunktion der Untervocabulareigenschaft aus:
                {turtle} als {fp}-Vocabular kann nur danach aufgerufen werden,
                was un‡bersehbar darauf aufmerksam macht, daœ die Graphikaufrufe
                fp-Zahlen in der Stack‡bergabe erfordern, und womit automatisch
                daf‡r Sorge getragen ist, daœ dieses Vocabular auch wirklich ak-
                tiviert wurde.
* W
<with           ( -- ) (C) ( <WITH name -- )            F6(!)
                Eine Erg€nzung, die es erlaubt, gemeinsam mit seiner Bildungs-
                auch die Ausf‡hrungsvorschrift eines Definitionswortes weiter-
                zugeben. Die hierzu notwendigen Systemerg€nzungen k„nnen 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 Ausf‡hrungsteil mit ;DOES> oder ;CDOES> eingelei-
                tet werden - das standardm€œige f.i.g.-DOES> kann eine solche
                "vollst€ndige Erbfolge" nicht weiterreichen.
                        ' task dds !
                Nach Festlegen des Ur-Zustandes
                        : name0 <WITH <BUILDS ... ;DOES> ... ;
                gleichermaœen 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 Ausf‡hrungsteile zuerst von name0 und dann von name1
                durchlaufen. Um die Folge zu sichern, muœ vor Bildung eines De-
                finitionswortes die Vorg€ngerdefinition 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 durchgef‡hrt zu werden. Was
                u.U. auch dann notwendig wird, wenn ein "fremdes" fortpflanzugs-
                f€higes {;does>} aufgerufen oder in ein Wort eingebaut wurde.
                Den definierten Ausgangszustend ohne Vorg€nger schafft man mit
                        ' task dds !
                {<with} revectorisiert {;does>}. Solange der Vorgabeposten auf
                der pfa+2 unver€ndert bleibt, stellt {;does>} sich automatisch
                mit dem Aufruf sofort wieder auf die Standarddefinition zur‡ck.
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 enth€lt, gehen pfa,
                count- u. Typenbyte mit flg = 1 zur‡ck, sonst nur Null.
                {w-find} arbeitet identisch {-find}, es erm„glicht 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œ.
                Auœerdem dient es innerhalb eines {c-save}-Blocks dem Aufruf von
                dort definierten Worten durch andere Worte in diesem Block, was
                sonst wegen der fehlenden Relocationsm„glichkeit unzul€ssig 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 einschlieœlich
                der €uœeren 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} zur‡ckkehrt. Der Datenstack bleibt erhalten.
wd-size         ( c1 -- ny nx nh nw tf | ff )           F6
                ff wenn c1 keinen Fensterkanal repr€sentiert, sonst Fensterdaten
                Ursprung ny oben, nx links, Maœe nw breit, nh hoch, tf gibt die
                Cursorbreite an; alles in Pixelmaœen. In compilierter Form kann
                anschlieœend mit {l<i} auch die Zeichenh„he gelesen werden.
while           ( n1 -- ) (C) ( sys: ptr 1 -- sys: ptr 4 )
                Bedingungen werden in derselben Weise optimiert, wie bei {if}.
                        BEGIN .. .. cc WHILE .. .. REPEAT
                Zul€ssige Variante im F6 auch
                        BEGIN .. .. cc WHILE .. .. cc UNTIL
width           ( -- ptr )
                User-Vari zur L€ngenbegrenzung beim Compilieren von Wortnamen.
                Im F6 m„glichst nicht kleiner als die gr„œte benutzte L€nge zu
                setzen, dies w‡rde das Compilieren wesentlich verlangsamen, und
                als Preis f‡r die durch etwas ge€nderten Namensvergleich enorm
                beschleunigte Wortsuche leider auch mitunter zu Fehlern f‡hren.
window          ( ny nx nh nw -- )                      F6
                Das mit {work} identifizierte Fenster mit den angegebenen Maœen
                versehen, ohne border; Maœe 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 einschlieœlich) begrenzten
                Bereich und liefert das Resultat als n4 zum Stack
wmov            ( c1 -- )                               F6
                Durch Bet€tigung der Cursortasten Verlagerung und  nderung
                der Abmessungen des mit c1 identifizierten Fensters. Ist c1
                das Hauptfenster, und sind weitere Fenster offen, werden diese
                soweit m„glich mitgenommen und ggf. in den Maœen angepasst.
work-id         ( -- did )                              F6
                QDOS-ID des {work}-Kanals.
work-num        ( -- c1 )                               F6
                H„chste F6-Kanalnummer mit der QDOS-ID des {work}-Kanals.
word            ( c1 -- )
                mit dem Zeichen c1 begrenzten String aus dem Eingabestrom
                isolieren und mit f‡hrendem Countbyte nach {here} bringen.
                Bei c1 =<bl> gilt zum Ende hin auœer 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 f‡r alle QDOS-Operationen, durch {to-work} k„nnen
                ihm beliebige andere Kan€le zugewiesen werden (s. {set-work}).
                Standardkanal f‡r ausnahmslos alle i/o-Operationen des {qdos}-
                Vocabulars mit den Untervocabularen {pif} u. {minerva}.
                Auœerdem Ziel f‡r 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 f‡r {selected} zu WORDS aus "forth_scr"
wtyp            ( -- )                                  F6S
                Operator f‡r {selected} zu WORDS, der f‡r 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 L€nge 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-Verkn‡pfung n1 mit dem Speicherinhalt bei ptr.
* [ etc.
[compile]       ( -- ) (C) ( [COMPILE] name )
                "immediate" Worte werden durch Voranstellen von {[compile]}
                mit ihrer cfa compiliert wie gew„hnliche 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 zur‡ckgeben.
                Als "open-Code" gelten die D3-Werte f‡r die Qdos-Trap:
                        0       zum Lesen und Schreiben
                        1       nur Lesen, mehrfache Nutzung m„glich
                        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 erm„glicht damit etwa die
                automatische Ger€tevorgabe, durch die z.B. beim TK2 die fehlende
                Laufwerksbezeichnung ggf. nachgetragen wird. Gerade das fehlt im
                F6, um z.B. Irrl€ufer der Art "flp1_mdv2_.." zu vermeiden. Die
                Devicevorgabe nach TK2-Manier ist in "forth_scr" so beschrieben,
                daœ sie unabh€ngig vom TK2 nachgetragen und benutzt werden kann.
                F‡r 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 Z€hler
                wird darum einfach die Position vor dem Anfang als ptr angege-
                ben. Auœer den ggf. durch {base} eingegrenzten g‡ltigen Ziffern
                darf der String die Zeichen "," oder "." und am Anfang auch ein
                Zahlen-Affix enthalten. Bei fp-Zahlen sind zus€tzlich das "%"
                am Ende und ein "E" ggf. vor dem Exponenten zul€ssig und das
                abschlieœende Leerzeichen ist nicht erforderlich.
                Werden diese Bedingungen nicht eingehalten, gibt der Aufruf
                den Flagwert 1 zur‡ck, 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 unabh€ngig 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 zur‡ckgegeben.
                " 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 sp€teren 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 sp€ter eine pfa holen, ist [compile] voran-
                zustellen. Interpretierend liefert es die pfa in den Stack.
                HINWEIS: Das "tick" sp€terer Standards ist nicht immediate und
                holt mit der CFA die 4th-Adresse, die den ptr auf den den Wort-
                typ bestimmenden direkt ausf‡hrbaren Codeteil enth€lt.
(               ( -- ) (I)
                Kommentar-Klammer, der folgende Text bleibt bis zum Zeilenende,
                einem <enter> oder der n€chsten 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 weiterz€hlen.
,,              ( 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.
                F‡r die weiteren Ebenen s. {ni}.
[               ( -- ) (I)
                Interpret-Klammer, §bergang in den interpretierenden Zustand.
                Mit abschlieœender Compile-Klammer {]} auch innerhalb einer
                Wort-Definition anwendbar, z.B. f‡r 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 auœerhalb einer Wort-Definition.
|               ( -- ) (I)                              F6
                Dieses Hilfsmittel zum Ausprobieren beliebiger Wortfolgen
                leitet den fl‡chtigen Compile-Zustand ein rsp. schlieœt ihn ab.
                Eine im interpretierenden Zustand in "|" eingefaœte Sequenz
                wird compiliert, sofort ausgef‡hrt und unmittelbar danach wie-
                der freigegeben. Damit sind neben durch die Compilezeit unbe-
                lasteten genauen Zeitmessungen vor allem auch Strukturworte in
                direkter Eingabe ausf‡hrbar:
                        | tick 2>r 1000. DO 1000. DO LOOP LOOP tick 2r> d- d. |
                w€re sonst nur als Wortdefinition m„glich.
                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 durchf‡hrbar wird.
                {here} und damit auch {pad} liegen f‡r die Dauer der Ausf‡hrung
                einer solchen Wortfolge entsprechend h„her, vorher nach {pad}
                ‡bertragene Daten m‡ssen also ggf. mit der zu jenem Zeitpunkt
                g‡ltigen Adresse in diese Aufrufe ‡bergeben werden.
                Auch Einzelschrittbetrieb ist mit diesen Sequenzen m„glich.
                Die Compile- & Interpret-Klammern haben gegen‡ber {|} Vorrang
                und d‡rfen nicht gemeinsam damit verwandt werden.
\               ( -- )                                  F83
                Text nach dem "\" bleibt bis zum Ende der Zeile unbeachtet.
                Dient nur der Compatibilit€t, da "(" aufgrund der Tatsache,
                daœ im F6 Block- und Zeilenl€nge gleich sind, dasselbe leistet.
]               ( -- )
                Compile-Klammer, zum §bergang in den compilierenden Zustand.


* FP-Vocabular
Flieœkommazahlen sind im Forth zumeist ‡berfl‡ssig, 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 auœerordentlich leicht
zug€nglich sind, wurden ihre Operationen in einem eigenen Vocabular angegeben.
Die Genauigkeit ist allerdings mit nur neun Dezimalstellen recht gering, und so
werden in vielen F€llen die vierfachgenauen Integer vorzuziehen sein, die trotz
(dezimal) 18-stelliger Genauigkeit noch deutlich schneller verarbeitet werden.

Ist dieses Vocabular oder eines seiner Abk„mmlinge CONTEXT, so werden Zahlen im
QDOS-Flieœkommaformat erzeugt, f‡r 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 f‡r alle Vocabulare gilt.

Die Operationen mit bereits in FORTH-Vocabular aufgef‡hrten Namen haben auœer
der Tatsache, daœ sie mit Flieœkommazahlen 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 vollst€ndig in m„glichst optimaler Form im F6 codiert. Die Operatoren
zur Umwandlung von FP nach Integer und umgekehrt geh„ren zum Forth-Vocabular und
sind hier nur der §bersicht halber mit aufgef‡hrt. 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
k„nnen, wird in einigen F€llen das h„herwertige Exponentenbyte (entsprechend dem
h„chstwertigen Stack- oder Speicherbyte) mit %00001111 AND-verkn‡pft und grenzt
den Exponenten damit auf zul€ssige Werte ein. Allgemeine Datenposten werden dann
u.U. verf€lscht. 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 enth€lt, und auch {dpl} unber‡hrt
l€œt, zuverl€ssig 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; auœerdem 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 )            nat‡rlicher logarithmus Q
neg             ( f1 -- f2 )            Negation                Q
nint            ( f1 -- n1 )            fp zur n€chsten Integer gerundet  Q
nlint           ( f1 -- d1 )            fp zur n€chsten 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 ausf‡hrt, zugleich muœ dann auch variptr
                f‡r den in diesem Vectoraufruf verwalteten Variablenbereich an-
                gegeben sein. Die Codierung ist den einschl€gigen QDOS-Dokumen-
                ten zu entnehmen (z.B. PiQ).
roll            {pick} und aufr‡cken in die copierte Position,
                negative Postennummer f‡r 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 vollst€ndige 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-verkn‡pft werden.
Bei -1 hat (upper) keinen Einfluœ, bei 127 wird das h„chstwertige 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 unabh€ngigen Vergleich.

flush           ( -- )
                Augenblicklich alle {update}-markierten Bl„cke sichern.
match           ( ptr1 n1 ptr2 n2 -- flg n3 )           f.i.g.-Editor
                Suche des Strings der L€nge n2 ab ptr2 im Bereich der L€nge n1
                ab ptr1. Bei Erfolg R‡ckgabe 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 zur‡ck.
                Entsprechendes an wirklichen Speicheradressen s.u. {s==}.
s=              ( n1 dadr1 n2 dadr2 -- flg )            F6
                Vergleich, flg = 1 wenn der String der L€nge 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 L€nge n2 ab dadr2 nach dem String auf
                dadr1 der L€nge 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 verf‡gbar sein m‡ssen, rsp. deren von der ‡brigen Voca-
bular-Konstellation unabh€ngiges Vorhandensein zweckm€œig ist.

2nd-voc         ( -- ptr )                              F6
                Vari, =/= 0 gibt Vocabular-spezifische Folge-Vocabulare frei.
                Im Vorgabezustand ist die secund€re Suchfolge gesperrt.
also            ( -- ) (I)                              F83 modifiziert
                Schiebt die Suchfolge eins "hoch", d.h., der Vorg€nger-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 umfaœt zwei Bereiche, von denen der erste mit
                den j‡ngsten zwei Posten vom zweiten miterfaœt 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 j‡ngst aufgerufenen Vocabulare verf‡gbar. Der jeweis
                zweite Vorg€nger f€llt aus der Suchordnung hinaus.
                {also} schiebt s€mtliche Vocabulare eine Position 'h„her', so-
                daœ dann das zweite Vocabular an dritte Position gelangt, wo es
                nicht mehr durch einen neuen Vocabularaufruf verschwinden kann.
                Die j‡ngste Vocabulareintragung wird dupliziert, sodaœ nun Platz
                f‡r ein danach genanntes Vocabular frei wird, um welches sich
                die Suchordnung dann erweitert.
                Mehrere {also} nacheinander bewirken gew„hnlich nichts anderes,
                als daœ das j‡ngste Vocabular von den {find}-Varianten entspre-
                chend oft durchsucht wird und sich die Compilezeit dadurch ohne
                jeden Nutzeffekt ganz enorm erh„ht. Im F6 wird dergleichen durch
                eine Markierung unterbunden, die w€hrend der Worsuche besetzt
                und verarbeitet wird. Gleichg‡ltig, wie oft ein Vocabular in der
                Suchfolge erscheint, wird es nur einmal durchsucht, sodaœ die
                Compilezeit von Mehrfacheintragungen unbeeinfluœt bleibt.
                Der erste, fl‡chtige, Teilstack erlaubt es, die im f.i.g.-Forth
                ‡bliche §bertragung des Definitionsvocabulars in die Suchordnung
                zu ‡bernehmen und gleichzeitig den vorher eingestellten Posten
                verf‡gbar zu halten, ohne daœ sie dadurch peu a peu am Ende
                ganz aus solchen Eintragungen besteht, da der Bereich oberhalb
                der beiden j‡ngsten Posten unver€ndert bleibt.
                Das w€re z.B. auch durch die {state}-abh€ngige Miterfassung des
                Current-Vocabulars (und bei der gew€hlten Datenanordnung im 4th-
                Speicher eher besser) m„glich; die Verfahrensweise resultiert
                aus anf€nglichen Versuchen und, den m„glichen 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 w€re.
                Ausf‡hrliche Beschreibung in "F6CHG_txt" rsp. "FORTH_txt".
asm68           ( -- )                                  F6
                Vocabular, initial dem Aufruf {assembler} zugewiesen
assembler       ( -- ) (D)(I)
                Deferred, vorgesehen f‡r unterschiedliche Assembler-Vocabulare.
blk+            ( -- n1 )                               F6
                n1 = -1 bei direkter Eingabe in t.i.b., 0 bei neuem Screenfile
                oder eine Zahl > 0 f‡r die n€chste 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 auœen(!) 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 auœen ‡bergeben wurde, und macht dann zus€tzliche Maœ-
                nahmen zum Einhalten der Stackbilanz ‡berfl‡ssig:
                        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 zur‡ckgegebene
                ptr ist von den aufrufenden Worten sp€ter als cfa zu verwenden.
                Die Platzeinsparung entspricht der ungeradzahlig aufgerundeten
                L€nge eines Namen + 3; auœerdem belasten diese Worte die Suche
                beim Compilieren nicht, da sie f‡r {-find} nicht existieren.
                Ausf‡hrungszeitvorteile 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 sp€ter 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
                zug€nglich, {current} wird nicht ver€ndert.
prevdef         ( -- ) (I)                              F6
                voriges Definitionsvocabular wieder einsetzen. Benutzt eine ein-
                fache Variable, kann daher nur das unmittelbar vor dem j‡ngsten
                {definitions} vohandene {current}-Vocabular wiederherstellen.
previous        ( -- ) (I)
                Die gesamte Suchfolge um das j‡ngste Vocabular verk‡rzen.
rvoc            ( -- ) (I)                              F6
                Das zweite Vocabular an erste Stelle setzen, keine weiteren
                 nderungen, der eigentliche Vocabularstack bleibt unber‡hrt.
search          ( SEARCH name ) (I)                     F6
                dem CONTEXT-Vocabular ein neues Secund€rvocabular einpr€gen.
selected        ( SELECTED xxxx )                       F6S
                Modifiziert den n€chsten Aufruf von {words} und beschr€nkt die
                Ausgabe auf bestimmte Wortgruppen. Grunds€tzlich gelten die
                nach {selected} folgenden max. 7 Zeichen bis zum n€chsten Leer-
                zeichen als alphabetisches Auswahlkriterium f‡r den Wortanfang
                der Ausgabe. Die Kriterien beim Textvergleich entprechen {t=}.
                Daneben gibt es Sondergruppen mit:
                selected imed           f‡r die "immediate"-Worte;
                selected prim           die Standard- und die mit Langwort-Ptr
                                        aufgerufenen Primitives;
                selected defn {name}    faœt 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, veranlaœt hier jeder Text selbst das System,
                an seinem Ende f‡r Nachschub zu sorgen oder nach {quit} zur‡ck-
                zukehren, dem €uœeren Interpreter, wo weitere Eingaben erwartet
                werden. So wird es, indem es die laufende Kontrolle selbst ‡ber-
                nimmt, v„llig unabh€ngig 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 Umst€nde sofort erm„glicht.


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

#user           ( -- n1 )                              (F6) F83
                Cons, Gr„œe des gesamten User-Bereichs
(")             Runtime f‡r {"}
(+loop)         Runtime f‡r {+loop}
(.")            Runtime f‡r {."}
(;)             Runtime des optimierenden {;}           F6 8.16
(;code)         Runtime f‡r {;code}
(abort")        ( -- ) (D)                              F6
                Von {abort}-Varianten aufgerufen, f‡hrt initial nach {quit},
                auf entsprechende Anwendungs-Worte vectorisierbar.
(abort)         ( -- ) (D)                              F6
                Wird nach L„schen des Datenstacks von {abort} aufgerufen und
                f‡hrt die weitere Re-Initiierung durch: Stellt {dr0} ein,
                Zahlen dezimal, und nach evtl. n„tigem §bergang in den user-
                Modus des 680xx-Processors Hinschreiben der Systemkennung.
(bs)            ( -- c1 )                               F6
                Definiert den Zeichencode f‡r {bs}
(ctl)           ( -- ptr )                              F6
                Vari, 0 unterbindet die Aktionen von {ctrl}.
(debug)         ( -- ) inaktiv ( pfa -- ) mit debugger (D) F6
                Ausf‡hrender Debugger-Aufruf, wird ggf. vor jede cfa compiliert.
                In der Vorgabe mit $8001 besetzt und damit f‡r schnellstm„gliche
                Abarbeitung de-aktiviert. Wird beim Compilieren des Debuggers
                auf ein Wort mit Pr‡fung und Ausf‡hrung 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 j‡ngste 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 f‡r 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 g‡ltigen Zeichen und gibt den
                Accu d2 samt der Adresse des Abbruchs ptr2 zur‡ck.
(quit)          ( -- ptr )                              F6
                Ausf‡hrungs-cfa von {quit} und Hilfe zur Erzeugung selbsstarten-
                der F6-Programme. Die hier eingetragene cfa wird beim Start des
                F6-Jobs ausgef‡hrt und kann auf jedes Wort gestellt werden, das
                ein geschlossenes Programm ausf‡hrt - die "turnkey"-Anwendung.
                Automatisches Nachladen fehlender Definitionen:
                Beim Antreffen eines nicht vorhandenen Wortes wird die gew„hn-
                liche Fehlerbehandlung durchlaufen, die normalerweise nach der
                Ausgabe eines Hinweistextes und Teil-Initiierung nach {quit}
                f‡hrt. 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 k„nnen, 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
                f‡r nachzusetzende Definitonen, l€œt sich der Compiler soweit
                ausbauen, daœ er v„llig selbst€ndig die fehlenden Definitionen
                einsammelt und nachtr€gt.
+branch         ( flg -- )                              F6
                Runtime f‡r 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 F€llen
                ist nur der standardm€œige Forth-Aufruf zul€ssig - was bei der
                automatischen Schluœoptimierung selbst€tig ber‡cksichtigt wird.
-branch         ( flg -- )                              F6
                Runtime f‡r die Optimierung z.B. aus:  0= IF
0-branch        ( flg -- )                              F6
                Runtime f‡r die Optimierung z.B. aus: 0> IF
0<branch        ( flg -- )                              F6
                Runtime f‡r die Optimierung z.B. aus: 0< 0= IF
0>branch        ( flg -- )                              F6
                Runtime f‡r die Optimierung z.B. aus: 0> 0= IF
0branch         ( flg -- )                              F6
                Runtime f‡r 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 f‡r die Optimierung, entspricht
                        -dup IF
?1branch        ( flg -- flg | )                        F6
                Runtime f‡r z.B. {case?}, entspricht
                        over = IF drop
?numerr         ( flg -- flg 0 )                        F6
                Zusammenfassung von
                        ( flg ) 0 ?error
back            ( ptr -- )
                Compiliert eine r‡ckw€rtsgerichtete Sprungdistanz in {here}.
branch          Runtime f‡r {else} und andere unbedingte Spr‡nge
clone-jdt       ( did -- did )(D)                       F6
                Letzte Aktion in {(exec)} unmittelbar vor der Job-Activierung.
                Vectorisiert auf {noop}, vorgesehen f‡r anwendungsbezogene
                Besonderheiten. Die Adresse der zugeh„rigen 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 f‡r Stacks, Puffer und Dictionary
                zugewiesen wird. Bei -1 ermittelt das System den gr„œtm„glichen
                Wert, mit anderen Zahlen ist die Zuweisung zur Verringerung des
                k‡nftigen 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. Erh€lt
                in n1 den Wert MAX( db-on,0 ), und eine pfa, die die ausf‡hren-
                den Worte vom Stack nehmen m‡ssen. Davor wird db-on=0 ausgefil-
                tert, sodaœ n1=0 nur bei negativen Werten von db-on vorkommt.
dlit            ( -- d1 )
                Runtime f‡r doppeltgenaue Festwerte.
doforget        ( cflg xflg nfa1 nfa2 -- cflg xflg nfa1 n3 ) (D) F6  8.18
                Anwender-definierbarer Vorspann in {forget}. Darf nfa1 mit der
                j‡ngsten nfa des j‡ngsten Vocabulars nicht €ndern, und muœ
                zumindest irgendeine Zahl n3 anstelle der nfa2 des Wortes, bis
                zu dem das Dictionary freigegeben werden soll, zur‡ckgeben.
                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
                auœerordentliche Freigabe des {local}-Bereichs, z.B. vor {;s},
                ben„tigt die Anzahl freizugebender Bytes, z.B.
                   : name local AB| .. IF .. [ 8 ] end-loc ;s ENDIF .. ;
                Der Eingriff "von Hand" in den Compiler wurde gew€hlt, 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 f‡r 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 f‡r einfache Festwerte
memvec          ( n1 -- dadr | -dn )                    F6
                n1 ist die Nummer eines Vectors im MEM-device der IO2-Sammlung,
                dessen Adresse zur‡ckgegeben wird, negative Werte und Null sind
                nicht brauchbar, sie signalisieren einen Fehler.
                F‡r 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 f‡r 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 f‡r 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 zusammengefaœt, 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 f‡r 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 unver€ndert 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 ausgef‡hrt.
[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 F€llen genaue Gegenst‡cke 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 g€ngigen 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 gew€hlten Bezeichnungen.
Die Namen stimmen mit den dort genannten QDOS-Bezeichnungen ‡berein, womit
sie leicht auffindbar sind und sich hier detaillierte Angeben er‡brigen.

* Trap #0 Processorzustand
N‡tzlich f‡r alle Vorg€nge, die ohne Unterbrechung - z.B. durch das Multi-
tasking des QDOS - en bloc ablaufen m‡ssen, etwa die ser1/ser2-Bedienung bei
Minerva oder auch sonst in den h„heren Baudraten. Ausnahmsweise auch, wenn
ein (m„glichst kleiner) Programmteil besonders schnell ausgef‡hrt werden soll.

Der Aufruf wird durch die "chk"-exception mit Hilfe der QDOS-Trap-Umleitung
in einer f‡r alle 680xx-Processoren zul€ssigen Weise so dargestellt, daœ
Aufrufe zu beliebigem Zeitpunkt m„glich sind, unabh€ngig vom Processortypen
und dem aktuellen Systemzustand. "Exception-handler" sind darum nicht erfor-
derlich, rsp. werden nicht aktiv - vor allem f‡r die Laufzeit vorteilhaft.
F‡r die Paarung der Worte zur Status-Umschaltung gilt dieselbe Regel, wie
f‡r >R und R>, und muœ strikt eingehalten werden. Die F6-Worte der Fehler-
Aktionen sorgen zwar f‡r gefahrlose R‡ckkehr, wird aber bei sonst einwand-
freiem Verlauf der Status nicht richtig geschaltet, geraten F6-Returnstack
und der QDOS-Systemstack durcheinander, was zu ‡belsten Fehlern f‡hrt.

Einfache Regel:
Der Processorzustand muœ am Ende eines Wortes derselbe sein, wie zu Anfang,
was im Wortinnern auœerdem f‡r jede einzelne DO..LOOP gilt. Da Systemstack
und Return-Stack dieselben sind, d‡rfen 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.
Ladevorg€ngen 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, R‡ckgabe 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            ( aufl„sung 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 auœerdem mit den weiter unten notierten Register-
Operatoren ver€ndert werden. Fehlercode 0 steht f‡r ordnungsgem€œen Verlauf.
Kennzeichnung (G):
Die Graphik-Aufrufe belassen abweichend von der sonst strikt befolgten Regel
ihre Parameter im Stack. Grund ist die Ausf‡hrungsgeschwindigkeit. Da zumeist
mehrere solcher Aufrufe aufeinander folgen, und sie h€ufig die Vorg€ngerdaten
weiterverwenden, werden sie auf diese Weise wesentlich schneller abgearbeitet.
Sie arbeiten s€mtlich mit Flieœkommazahlen.

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. L€nge.
                Zur‡ck gehen ptr2 und len passend f‡r 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 g‡ltig 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 - auœer bei
                Minerva arbeitet die Trap nur an eigens dazu ge„ffneten Kan€len.
fssave          ( d.adr d.len -- )
fstrunc         ( -- )                  nur mit Minerva oder TK2
                L€œt sich mit der Kombination {headr} & {heads} nachbilden, wenn
                der Header mit der verk‡rzten Filel€nge zur‡ckgeschrieben 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-L€nge 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           ( fmaœstab 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 f‡r die Ablage zur
                Sicherheit 100 Bytes freigehalten werden. Der F6-Aufruf
                arbeitet auch mit MDV-Laufwerken und unabh€ngig 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, Nationalit€ten-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 R‡ckgabewerten ist es leicht, ohne besondere Vorkeh-
                rungen bei automatischer Ber‡cksichtigung 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. m„glich 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
                      schlieœt 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 ausgef‡hrt.

* 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.maœe 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.maœe 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 Verf‡gung, da in standardm€œigen QDOS-Jobs,
wie dem F6, der Wert des Registers A6 nur durch das Programm selbst ver€ndert
werden kann und darum die f‡r die Trapaufrufe ben„tigten relativen oder wirk-
lichen Werte gefahrlos zusammengesetzt werden d‡rfen.

* Trap 5 bis 15
Sind s€mtlich unbenutzt, werden aber von der Trap-Umleitung des F6 miterfaœt
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; systemabh€ngig.
Wie im einzelnen dies durchgef‡hrt 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 vollst€ndiger 6800x-Macro-Assembler steht
in "f6asm_scr" zur Verf‡gung. Er nimmt ca. 10K in Anspruch, einschlieœlich
umfangreicher Hilfsaufrufe und Strukturworte werden daraus rund 16K. F‡r
Anwendungen, die einzelne Assembler-codierte Passagen enthalten sollen, kann
mit Hilfe von {c-save} und {c-load} der Assembler sp€ter fortgelassen werden,
sodaœ dann nur der Platzbedarf f‡r die assemblierten Forth-Worte entsteht.
F‡r den Anfang stehen hier die Ptr auf einige wichtige Stellen im System.
Sie sind etwas ausf‡hrlicher erl€utert, um die Verbindung mit nachtr€glichen
erg€nzenden 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 H€nde des Autors
gelangtes Derivat des 68000-Assemblers von Laxen & Perry, das f‡r das F6
vervollst€ndigt, stark erweitert und auch von Fehlern befreit wurde.

Als 4th-Register m‡ssen bei neuen Processorcode-Aufrufen gesch‡tzt werden:
Im F6 mit besonderer Verwendung:
                D2      bei Deferred-Aufrufen zur inneren Daten‡bergabe
        OS      D6      Segment Offset (reserviert)
        NX      A3      Einsprung in den Inneren Interpreter
        BP      A6      Basis-Ptr, Bezugspunkt f‡r 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-Programmz€hler
        SP      A5      Datenstack
        RP      A7      Returnstack
Alle anderen Register k„nnen ver€ndert werden, werden aber ‡berschrieben.
Solange die folgenden erhalten bleiben, liefern sie die Informationen:
                D0      allgemeine Flag f‡r {l<i} - s. dort.
                D1      Case-Index f‡r {#case}
Der Innere Interpreter bei <next> ver€ndert 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 (Programmz€hler des Forth).
A1 und A2 k„nnen davor beliebig verwandt werden, A4 muœ unber‡hrt 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 auœerhalb des 4th-adressierbaren Bereichs
                liegendem Programmcode.
[do;does]       Einsprung des Runtime-Aufrufs von {;does>} dosemidoes
                {;does>} f‡hrt das standardm€œige {(;code)} aus und compiliert
                vor den hi-level-Ausf‡hrungsteil 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 f‡r Primitive-4th-
                Worte, die damit als gew„hnliche Subroutine ausgef‡hrt werden.
                Beschreibung s.u., Hinweise zum F6 Assembler-Quelltext.
[cdefer]        entsprechend f‡r {defer}ed angelegte Worte.
* im Forth-Vocabular:
nopdf           ist eine {defer}red Definition im F6-Kern und kann als Referenz
                f‡r 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 Einf‡gen eines Codeblocks mit {c-load} der
                Aufruf auf den wirklichen Vector justieren l€œt.
+nul            als Variable mit dem Inhalt 0 l€œt sich €hnlich nutzen.


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


* F6 Assembler-Quelltext
Alle n„tigen Kommentare sind in "forth_asm" angegeben. Zum Aufbau von lo-level-
Routinen gibt es ein paar Hilfsmittel f‡r 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 ver€ndert werden d‡rfen. Innerhalb der Pr‡fgren-
zen (s. Assemblertext) d‡rfen die Adressregister ab A3 auch nicht ungerade sein.

Forth: 2constant [cdefer] im Assembler-Voc.
Bei {defer}red Definitionen soll die Ausf‡hrungsroutine 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 erm„glichen. Die Ausf‡hrungszeit entspricht in etwa der Standard-Aufrufform.
Da bei gleichbleibenden Versionsnummern der auœerhalb 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 unabh€n-
gig von Ver€nderungen 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 grunds€tzlich auf s€mtliche 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 'auœen'
                0 BP D0 .l d(Xi,PC     jsr,   \ deferred wort ausf‡hren & 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 k„nnen, muœ ihnen dies
f‡r den einen Aufruf "abgew„hnt" 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 ausf‡hrenden 4th-Wortes
sind nur bedingt brauchbar, deren Aufruf f‡hrt je nach Worttyp evtl. zu Fehlern.


Constante und Variable unterscheiden sich nur in der Ausf‡hrungsvorschrift,
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;
erh„ht dann unabh€ngig vom Typen den Wert einer Constanten oder den Inhalt einer
Variablen um Eins. - Dieses Beispiel darf NUR COMPILIERT eingesetzt werden!


* Betrachtungen zur Ausf‡hrungszeit:
Zum Vergleich mit Assemblercode dient das Beispiel <next> und <semis>, das der
Paarung JSR und RTS entspricht, und als halbwegs repr€sentativ angesehen werden
kann. Maœgeblich f‡r 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 Verh€ltnis 4:1 f‡r Forth gegen‡ber
optimiertem Assemblercode als verl€œliche "worst case"-Sch€tzung anzusehen ist.
Den mitunter genannten Faktor 1:3 bis 1:5 gegen‡ber ausf‡hrbaren Code erzeugen-
den Compilern wird man nur beim Vergleich mit h„chst ungeschickt aufgebauten
Systemen erzielen k„nnen, im F6 sicherlich nicht: Der Umbau des gr„œten 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 anschlieœender Ausf‡hrung 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 ausgef‡hrt.
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
{&} f‡hrt in Infix-Notation die Verkettung zweier Bytewerte als gepackte Integer
aus, in der das erste Byte der Eingabe an h„herwertiger Stelle angeordnet wird.
War die erste Zahl als {literal} compiliert, wird diese bereits w€rend des Com-
pilevorganges mit der zweiten Verkn‡pft und in der ge€nderten Form fixiert, so-
daœ w€hrend der Ausf‡hrung des hiermit gebildeten Wortes keine Rechenoperationen
mehr anfallen. Der Code wird dadurch um 6 Bytes k‡rzer, d.h. es wird kein zu-
s€tzliches Wort compiliert, und die Ausf‡hrungszeit reduziert sich auf weniger
als ein Viertel gegen‡ber z.B. einer f‡hrenden 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 pr‡fen
  IF here 4- @ >< or here 4- ! -2 allot ;s ENDIF ENDIF  \ ggf. optimierung
  [compile] literal -compile or ;          immediate    \ oder standardform
Dieses Wort wurde f‡r einen speziellen Anwendungszweck geschaffen und dient
hier nur als Beispiel. Seine Verwendung ist dadurch eingeschr€nkt, daœ die
zweite Zahl nur eine Constante oder ein Festwert sein darf, Parameter oder
(Locale) Variable k„nnen 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 gr„œere Zahl von n1, n2
umax    ( u1 u2 -- u3                   u3 als absolut gr„œere 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-Kan€le

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

* ¤ffnen/Schlieœen
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

* Ver€nderungen 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 f‡r 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 l€œt sich nur unvollst€ndig 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 Flieœkommavocabular.
io-err          Operationen an den Standardkan€len 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                  Stack‡berlauf
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 Ausf‡hrung
20      definition not finished         Definition unvollst€ndig
21      protected dictionary            gesch‡tzter Wortebereich
22      use only when loading           nur beim Laden verwenden
23      off editting screen             auœerhalb 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 - f‡r {l<i} pr€parierten Worte.

Diese Aufrufe liefern durch {l<i} lesbare Werte, die zum Multitasking einzelner
Forth-Worte anstelle der f‡r die Referenz unzureichenden 16-Bit-Werte verwandt
werden k„nnen. {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 R‡ckgabewerte sind folgendermaœen 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 sp€tere 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-Register‡bergabe)
><  >|< 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 erg€nzenden Definitionen aus "forth_scr" und "f6xco_scr"

Die hier aufgef‡hrten Worte k„nnen 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 auœerhalb des Forth-Speichers.
chain           beliebig stapelbares Laden von gew„hnlichen Files.
debugger        der aktive Teil zum Einzelschrittbetrieb, Mini-Decompiler.
dump            Varianten f‡r Speicherausz‡ge, desgl. auch {ldump}
heapmem         €uœerst sichere Zuweisung im QDOS-Systemspeicher.
msg"            Textsystem mit Datenablage in "heapmem"-Bl„cke. Als lo-level-
                Worte auch in "f6xco_scr", und f‡r {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          vollst€ndiger Satz Aufrufe zur incrementellen (Vector-)Graphik.
view            als wirkungsvolles Anwendungsbeispiel f‡r 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 ber‡cksichtigt
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 eigenst€ndigen {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 auœerhalb des 4th-Adressenbereich.
                Anzahl Dimensionen n1, Produkt aller sp€ter festzulegenden
                Dimensionen und die Einzelpostengr„œe n2 d‡rfen je bis unter
                64K Bytes groœ sein, das Produkt aus Postengr„œe und Dimen-
                sionen muœ kleiner als 256K sein. Mehr s. "forth_scr".
ascii           ( -- c1 ) (C) ( ASCII char -- )                 F83
                Im F6 entbehrlich, da "{" als Textpr€fix mehr leistet.
a-close         ( -- )
                Alle in der F6-Kanaltabelle verzeichneten Kan€le schlieœen,
                wobei {in-cons} und {out-cons} gesch‡tzt sind. Auch die
                QDOS-Kan€le 0 bis 2, sollte einer von ihnen versehentlich in
                die F6-Tabellen gelangt sein, k„nnen 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 d‡rfen auch einen im F6 offenen Kanal haben. Die
                Filenamen m‡ssen vollst€ndig angegeben werden; das mag l€stig
                sein, wurde aber der Sicherheit halber bewuœt so eingerichtet.
?backup         ( -- )
                Wie {backup}, jedoch mit Eingabeanforderung f‡r beide Namen.
-bpt            ( flg -- flg )
                "breakpoint" f‡r 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 L€nge aus dem vorigen
                {dump}-Aufruf des n€chst niedrigeren Anschluœbereichs.
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} enth€lt.
                Der Aufruf hinterlegt zwei Local-Posten, die durch {end} frei-
                gegeben werden und kann im Rahmen des verf‡gbaren Speichers be-
                liebig tief geschachtelt werden. Da die Files nur zum Lesen ge-
                „ffnet werden, k„nnen mehrere F6-Jobs zugleich auf dasselbe File
                zugreifen. Datenbewegungen auch zwischen den Aufrufebenen sind
                m„glich, solange der {local}-Bereich in Ordnung gehalten wird.
                Vorsicht: Systemzusammenbruch m„glich, wenn das {end} fehlt!
chans           ( -- )
                QDOS-IDs und Nummern aller offenen Kan€le des F6 hinschreiben.
clchp           ( -- )                                          F6
                Alle mit {heapmem} reservierten Speicherbl„cke aufl„sen. Die
                zugeh„rigen Definitionen bleiben weiter aktiv, sodaœ mit ihrem
                Aufruf wieder eine g‡ltige Speicheradresse zur Verf‡gung steht,
                nun aber in Form eines neu zugewiesenen und gel„schten 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 Speicher‡berlauf scheitert. Notfalls ist dann Abhilfe mit
                direkter Manipulation der "heapmem"-Definitionsdaten m„glich:
                        ' heapname 2@ heap-rmv
                        ' heapname 2off
c-load & c-save zum Laden und Sichern codierter Passagen wurden oben im Forth-
                Vocabular bereits ausf‡hrlich beschrieben.
console         ( -- )                                         (C1)
                Nimmt die evtl. mit {printer} aktivierte Druckerfreigabe zur‡ck.
.dcm            ( .DCM name -- ptr ) oder ( pfa #DCM -- ptr )
                Ein Minimal-Decompiler, der, weil er nur wenige Bytes ben„tigt
                und recht hilfreich sein kann, mit dem Debugger geladen wird.
debugger        (h)( -- )                                       F6
                Hilfswort f‡r 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 daf‡r pr€pariert. Diese
                werden dann beim Aufruf mit Anzeige des Stackinhalts und des
                gerade bevorstehenden Aufrufs Wort f‡r Wort abgearbeitet.
                Fehler:
                Vorsicht ist geboten, wenn die zu untersuchenden Worte {case:}-
                Listen (und ihre Varianten) oder Returnstackmanipulationen ent-
                halten, die zu Ver€nderungen in der Wortreihenfolge f‡hren, wie
                {r+} oder {lit+}. Auch Ver€nderungen der Interpreter-Ptr k„nnen
                empfindliche Fehler verursachen. Zur Abhilfe gen‡gt 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 zur‡ckgenommen.
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. Auœerdem erscheinen Filel€nge (einschl. der
                Headerl€nge!), Zugriffscode und Filetyp in der Ausgabe.
drk             ( -- ptr )
                Variable mit dem Namen des {printer}-Ausgabeger€ts in bis zu
                36 Zeichen L€nge. Hier kann ein beliebiger Ger€te- oder Datei-
                name angegeben werden, die Bildschirmausgabe l€œt 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 f‡r den Einzelschrittbetrieb der Aufruf {vlist}
                vollst€ndig als hi-level-Aufruf (Colon-Definition).
                        l-load dvlist
                l€dt bei Bedarf den Debugger, compiliert {dvlist} und f‡hrt
                es sofort im Einzelschrittbetrieb aus.
end             ( loc: did -- )                                 F6 (LR)
                Muœ ein jedes mit {chain} aufgerufene File abschlieœen.
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 f‡r bedingte Schleifen, beide Worte im Kern ent-
                halten und oben bereits beschrieben.
exit            ( -- )(I)                                       F79+
                Im f.i.g.-Forth identisch mit {;s}. F‡r F79-Texte z.B.:
                        : EXIT -compile ;s ;
f-name          ( -- ptr ) (C) ( F-NAME name )
                Eine Stringvariable f‡r Filenamen definieren. Sie wird als
                qdos-String angelegt und auf maximal {f/n} Bytes L€nge justiert.
fname"          ( ptr FNAME" filename" -- ) (I)
                Textst‡ck mit count-word bis zur maximalen L€nge {f/n} nach
                ptr bringen.
ftest           ( -- flg ) (C) ( FTEST filename ) (I)
                pr‡ft filename auf Zug€nglichkeit f‡r 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 zugef‡gt werden k„nnen.
heap?           ( -- )
                Zeigt alle dem F6-Job gerade zugewiesenen {heapmem}-Bl„cke an.
heapmem         ( -- dadr ) (C) ( n1 HEAPMEM name )             F6
                Verwaltet auf besonders abgesicherte Weise einen Speicherblock
                mit der vierfachen L€nge der bei der Namensdefinition ‡bergebe-
                nen Zahl n1 - was die Blockgr„œe 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 L€nge einer {heapmem}-Reservierung zur‡ck.
heap-new        (I)( use: nn HEAP-NEW name )
                Neudefinition der Blockgr„œe, ggf. zuvor implizit {heap-rmv}.
                Kann mit festem Wert in ein Wort eigebaut werden
                        : name ... zahl heap-new {heapname} ... ;
                und stellt die Blockl€nge beim Aufruf dieses Wortes ein, oder
                zur Angabe des Namen erst bei Ausf‡hrung
                        : 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 zugeh„rigen {heapmem}-Definition zur‡ck, wenn
                dadr die Anfangsadresse eines damit reservierten Bereichs ist.
heap-rmv        ( dadr -- )                                     F6
                Gibt den bei dadr beginnenden Speicherblock an das Betriebssys-
                tem zur‡ck. Pr‡fungen sorgen daf‡r, daœ nur ein vom selben F6-
                Job reservierter Block aufgel„st wird, und daœ die Adresse auch
                im QDOS keinen Fehler ausl„sen kann (z.B. ungerade oder nicht
                zu einem "heap"-Block geh„rend). Die definierten Worte bleiben
                aktiv, sodaœ mit ihrem n€chsten Aufruf jeweils wieder ein leerer
                Speicherbereich gleicher Gr„œe zur Verf‡gung 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 ausf‡hrlicher.
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 Erg€nzung 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 hierf‡r 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 z€hlend) 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"-Bl„cke,
                initial mit dem 2K groœen Block {msm} besetzt. Direkte Daten-
                eintragungen in den Definitionsbereich d‡rfen 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 L€nge n1
                nach ptr1 ‡bertragen
ndump           ( -- )
                Speicherauszug in 16-Bytes-Gruppen der L€nge aus dem vorigen
                {dump}-Aufruf des n€chst h„heren Anschluœbereichs.
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
                ausf‡hren soll, wie ein 'normales' Wort. Dies sind zwei grund-
                s€tzlich und derart unterschiedliche Vorg€nge, daœ der Autor die
                identische Benennung f‡r v„llig verfehlt h€lt 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 L€nge n1
                einschlieœlich count-word bei ptr ablegen.
printer         ( -- ) (I)
                Ein Vocabular mit Definitionen zur Druckerbedienung, Einrichtung
                zur ausschlieœlichen, 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 zug€nglicher
                Teil im Anhang von "ed_gls" n€her beschrieben ist.
                Leider ist im Laufe der Zeit bei den endlosen Anpassereien an
                st€ndig variierende SMSQ-Versionen etliches an Funktionalit€t
                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. F‡r andere Drucker ist evtl. Modifikation
                der zugeh„rigen 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
                W€gefunktion zu {sorted}, s. dort.
sort            ( ptr n1 -- )
                Ausf‡hrender 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
                bin€rem Sortierverfahren ("quick-sort") geordnet.
                Im einfachsten Falle erzeugt man eine n1 Posten groœe Tabelle
                und tr€gt dort von Null an fortlaufende Zahlen ein. Die Basis-
                adresse dieser Tabelle wird an {sorted} rsp {sort} ‡bergeben.
                F‡r {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 v„llig unabh€n-
                gig, nur das {precedes}-Wort muœ diese ber‡cksichtigen. Das
                Ergebnis ist eine Nummernliste, die in aufsteigender Reihenfolge
                den jeweils n€chst gr„œeren (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 auœerordentlich 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.
                Auœerdem mit vectorisierte Lese- und Ablageoperatoren f‡r 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 zur‡ck, sonst mit 0.
+text           ( ptr1 ptr2 -- )                                f.i.g.-Editor
                den qdos-String bei ptr2 an den qdos-String bei ptr1 anh€ngen.
then                                                            F79
                funktional identisch ENDIF.
turtle          ( -- ) (I)                                      F6
                Vocabular zur Turtle-Graphik f‡r bis zu 16 voneinander unabh€n-
                gige Linienz‡ge mit folgenden Aufrufen, die im Screenfile (auch
                anhand zweier Beispiele) n€her 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 zugeh„rigen Quelltext anzeigen. Daf‡r
                werden die Wortheader entsprechend pr€pariert, 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 zus€tzlich zu {l-load} und dem Editor geladen werden.
                F‡hrt einen {l-load}-Aufruf aus, bei dem das darin enthaltene
                {load} so re-vectorisiert ist, daœ es die Seite, wo das Wort
                gefunden wurde, schreibgesch‡tzt in den Editor holt. Beim Ver-
                lassen wird {load} automatisch wieder auf die eigene Funktion
                zur‡ckgestellt. Der evtl. mit‡bergebene Filename ersetzt den
                bis dahin als Screenfile f‡r {l-load} g‡ltigen Namen. In der
                vorliegenden Form lassen sich die {view}-Aufrufe nicht schach-
                teln, dazu m‡œte ggf. {l-load} ‡berarbeitet werden.
                Anders als bei {.view} erfordert diese Form keine gegen‡ber dem
                "normalen" Compilieren unterschiedlichen Daten, die Worte werden
                allein mit den Hilfsmitteln des in beiden F€llen ohnehin ben„-
                tigten Editors aufgesp‡rt 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 k„nnen.
.vocs        (r)( -- )                                         (F83)
                Anzeige der aktuellen Suchordnung, des Definitionsvocabulars
                und der Namen s€mtlicher 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 ge„ffnet 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} ausgef‡hrt wird.
[_]             ( [_] name -- pfa ) (C) ( [_] name -- )        (H4)
                €hnlich {postpone} - s. dort, liefert im interpretierenden
                Zustand wie "tick" die pfa von {name}.


* Gegen‡berstellung 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 M„glichkeit
?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 "r‡ckw-€rts"

* Flags und Vergleichsoperationen
true                    -1
1                       1                       ( f.i.g.-4th true flag
0 0 = constant true                             ( umgeht alle..
1 0 = constant false                            (   ..Miœverst€ndnisse
not                     0=                      ( Flag-Umkehr
        ( Ein Minimal-System braucht z.B. nur die Logikoperatoren < u< und 0=,
        ( sowie die Subtraktion. Damit k„nnen 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 nat‡rlich Extrem-Beispiele, deren Operatoren gew„hnlich
        ( zur Standardausstattung geh„ren sollten. Jedoch werden etliche der
        ( speziellen Logikoperatoren oft bereits durch ‡berlegte Anordnung ent-
        ( behrlich, andere nur selten ben„tigt. 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+} f‡r 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 Einf‡hrungstext;
* 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 gegenst‡ck
 IF dup >name c@ 1 ELSE drop 0 THEN             ( von F83 nach f.i.g.
create                  0 variable -2 allot
does>                   ;does>                  ( identisch, f‡r 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]               ( Ausf‡hrung 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 unn„tig
nuf?    ( soll wohl sowas wie "enough?" heiœen, 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 ausf‡hren
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 erf‡llter IF-Bedingung
    : -ENTER [compile] IF drop 5 ;                                  immediate
Weitere hi-level- quivalente im F6 definierter oder allgemein gebr€uchlicher
Worte finden sich an verschiedenen Stellen in "forth_scr" in einer Form, die
sie zumeist auch f‡r andere Forth-Systeme nutzbar macht.

* Das ANS-"Forth", ein paar Beispiele
Die Paarung {get-order}/{set-order} kann ganz allgemein zusammen mit einem neu
eingef‡hrten {def-order} lt. "forth_scr" gelegentlich ganz praktisch sein. Neben
dem Versuch in "ansext_scr", vollst€ndige 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} ausgef‡hrt.
wordlist                ( inaktive vocabulardefinition, nennung des namen gibt
                        ( eine adresse zur‡ck, die dann erst an context oder
                        ( current etc. ‡bergeben werden muœ.
def-order               ( F6-Nachtrag, definiert Worte, die beim Aufruf die zum
                        ( Definitionszeitpunkt g‡ltige Vocabularordnung passend
                        ( f‡r {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 n€mlich eine doppelte CFA, die erste enth€lt den
‡blichen Sprung in ausf‡hrbaren Code, nur ist die "Gebrauchsanweisung" hier
sehr allgemein gehalten, denn sie besagt allein, daœ der n€chste Posten auf die
Adresse zeigt, an der das (;CODE) als Einleitung des beim Aufruf auszuf‡hrenden
hi-level-Teils steht. Somit liegt die PFA, und damit die sonst z.b. mit "tick"
adressierbaren Daten eines Wortes, um zwei Bytes "h„her": Die Daten z.B. einer
mit <BUILDS..DOES> gebildeten Constanten-Struktur d‡rfen dann keineswegs mehr
mit "tick" ver€ndert werden. Das  quivalent der gewohnten PFA erh€lt man mit
        ' name 2+

Diese ver€nderte Adressenlage hat gewisse Nachteile, fordert sie doch h€ufig
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 sp€teren Standards - im F6 mit ;DOES>
So lag die §berlegung nahe, zur Vereinheitlichung die Zusatzinformation in den
DOES>-Part zu verlegen, und f‡r den Wort-Header das ohnehin bereits vorhandene
CREATE zu benutzen. Die CFA eines neuen Wortes zeigt dann direkt in den Ausf‡h-
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.
Bez‡glich der Ausf‡hrungszeit halten sich die beiden Varianten etwa die Waage,
die CREATE..;DOES>-Konstruktion ben„tigt im Definitionswort zwei zus€tzliche
Speicherzellen, spart jedoch bei den damit gebildeten Worten jeweils eine ein.

Da das vom f.i.g.-DOES> benutzte (;CODE) nur f‡r den Abschluœ eines hi-level-
Wortes im Processorcode sorgt, muœ eine Erg€nzung angegeben werden, die irgend-
wie den "instruction pointer" (den 4th-Programmz€hler) f‡r die R‡ckkehr sichert
und ihn auf den Ausf‡hrungsteil 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 Ausf‡hrungsanweisung 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 groœen Schaden anrichten k„nnen.
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 abh€ngig 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) auschlieœlich
im EGA-Modus betreibt und daœ in den anderen Modi keinerlei weitere Pr‡fungen
bez‡glich des F6 unternommen wurden.

Es kann vorkommen, daœ nach einer WIN-Operation die Meldung "fehlerhafter Da-
tentr€ger" erscheint, obwohl aus anderen Programmen heraus das betr. Laufwerk
noch zug€nglich ist. Vor allem bei {l-load} trat dieser Fehler h€ufig auf. Er
war nie genau nachvollziehbar und lieœ sich nicht gezielt reproduzieren, obwohl
der Zusammenhang recht deutlich ist: Mehrere OPEN_IN-Kan€le zum selben File,
nur Lesevorg€nge 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
m„glich, wo nun in den SMSQ-Varianten von einem F6-Job nicht mehr mehrere Ka-
n€le auf dieselbe Datei zugleich ge„ffnet werden.

PAR mit fixem Puffer ist SMSQ/E versionsabh€ngig extrem fehleranf€llig, 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 bew€hrte Command-Line-
History von Oktagon. Weitere Fehler ergeben sich in diesem Zusammenhang nicht.
Abhilfe zumindest f‡r den Basic-Befehl schafft PEX ab Version 18.


        Dennoch, f.f. w‡nscht 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 Schutzmaœnahme im
F6 nicht mehr vorkommen kann.

Das DOES> der F79+ Standards hat Vorteile, wegen derer das F6-System um die
Definitionen-Ausf‡hrung durch {;does>} erweitert wurde. Insbes. in "bh_scr"
sind mit Sicherheit noch nicht alle anzupassenden Stellen erfaœt (die PFA
liegt 2 Bytes niedriger). Dort ergeben sich vom Wortaufbau abh€ngige 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 Schluœoptimierung werden zu groœe Sprungdistanzen automatisch ber‡ck-
sichtigt, sodaœ keine unkontrollierten Vorw€rtsspr‡nge mehr entstehen k„nnen.

BASIC wurde in das Forth-Vocabular ‡bernommen und ist vom IO2 unabh€ngig.

EDLINE korrigiert, hat nach Eingabe am Stringende 2 Bytes zuviel gel„scht.

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 L€nge des gesuchten Wortes.
Dies wurde in Ordnung gebracht.

{XX - Das Zahlen-Praefix f‡r ein Schriftzeichen eignet sich auch zum Holen
zweier Zeichen, die in den beiden Bytes einer Integer zur‡ckgegeben werden.
Bei Strings mit anderer L€nge als 2(+1 f‡r die Klammer) kommt weiterhin nur
das erste Zeichen mit seinem Code als Integer zur‡ck.

SEAL schlieœt das CURRENT-Vocabular ab, das danach leer erscheint.
Alle anderen Vocabulare und die Suchordnung bleiben unber‡hrt.

* Schutzfunktion des Secund€r-Jobs - s. {break}
Die {find}-Varianten wurden wieder in den ‡berwachten Bereich gelegt, auœerdem
ein paar weitere Aufrufe aus der Ziffern-Umwandlung. F€ngt sich das System bei
der Wortsuche einmal in einer endlosen Schleife, ist auch dort Abbruch m„glich.
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 M„glichkeit mehr, unter den besonderen
Gegebenheiten des §berwachungsjobs den ausl„senden F6-Job zu ermitteln.
Darum wurde eine Variante eingef‡hrt, die durch die rechte Maustaste ausgel„st
wird, w€hrend der Mauscursor ‡ber dem Fenster des abzubrechenden F6-Jobs steht.
Wenn das PIF aktiv ist, und vor einem Abbruchversuch Maus oder Cursor bet€tigt
wurden, ist dies im allgemeinen die einzige Abbruchm„glichkeit.

* NEU
Als neue (teils noch ungepr‡fte) 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                                          Pr‡fung auf "history"
                                                (Erweiterungscode von 'Oktagon')
nopdf                                           leeres {defer}red Wort
[cprim] [cdefer]                                asm68: Subroutinen-Hilfspointer
[jdt]                                           qdos: ptr auf Systemdaten
* bei +origin eingef‡gt:
        56      Abstand cdt (A0 in extop) zur i/o-queue
        60      Adresse der PIF dummy-queue
Die Positionen ab th-entry erh„hen sich entsprechend.
        78      Mauscode f‡r {break}.

* C-SAVE
CS-TYP als Cons zur freien Wahl der Filetyp-Codierung eingef‡hrt.
Die Standardvorgabe mit dem Wert 3 wurde unver€ndert beibehalten.

* DEBUGGER
Der Zahlendarstellung bei {.s}/{.rs} wurde zur Zifferngewinnung eine locale
Speicherpartie zugewiesen. Damit k„nnen nun auch Worte untersucht werden, die
mit {hld} arbeiten. Selbst das zur Zifferndarstellung der Zahlen eingesetzte
Wort wurde auf diese Weise tauglich f‡r 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 ge€ndert 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-Erg€nzung
PEX19 (oder j‡nger) geladen wird. MODE steht als erneuerter SBasic-Befehl mit
PEX zur Verf‡gung. Anderen Programmen wird er mit Hilfe eines Vectors aus dem
mit "dvs_byt" nachladbaren MEM-Device zug€nglich. Der Mode-Aufruf des F6 nutzt
diese M„glichkeit, sofern der zus€tzliche Code geladen wurde, sodaœ er dann
wieder einwandfreie Ergebnisse liefert. Auœerdem wurde die Parameter‡bergabe
(mit den Vorg€ngerversionen konfliktfrei) ge€ndert; dies ist oben an entspre-
chender Stelle im qdos-Vocabular angegeben.

* EDITOR
Der F6-Editor startet stets im schreibgesch‡tzten Modus, um versehentliche
 nderungen an den Screenfiles m„glichst ganz auszuschlieœen. 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 m„glich.
   SH/F2    zum Aufsuchen der n€chsten Markirungsposition
   SH/F"
   CTR/SH/F2 l„schen 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 "|" eingefaœt werden.
Die Vorgabe ist zun€chst 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 ge€ndert, daœ
sie auch mit Speicherbl„cken ab 32K fehlerfrei arbeitet. In "f6xco_scr" sind
die ausf‡hrenden Worte als lo-level-Definitionen angegeben, die wesentlich
schneller ausgef‡hrt 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 h€lt sich insofern auch in sehr bescheidenen Grenzen, als es
l€ngst in brauchbarer Form vorliegt, und eine neue Version um ihrer selbst
willen zu erzeugen ganz und gar ‡berfl‡ssig erscheint, zumal die Original-
version sich schon einige Jahre bestens bew€hrt hat. Um dies zu belegen, ist
sie in ungeschm€lerter Form beigef‡gt; sie mag bei Interesse als Referenz f‡r
eigene Versuche mit dem neuen F6-Kern dienen. Verwendung f‡r den Eigenbedarf
ist freigestellt.

* SOFTWARE-STACKS
F‡r die nahezu unbegrenzte in Stackform verwaltete Datenspeicherung stehen in
"f6xco_scr" einige Operatoren zur Verf‡gung, die auch in vorcompilierter Form
mit {c-load} aus "f6xco_4th" geladen werden k„nnen, und dann ohne den Assembler
(aber zus€tzlich zu den "heapmem"-Worten) lediglich 400 Bytes Platz ben„tigen:
>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 L€nge count2 in Stack
        dadr2 anf‡gen 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 pr‡fen und deren Postennummer ermitteln,
        dnum z€hlt 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 )
        j‡ngste Zahl entnehmen
"s>     ( dadr1 count dadr2 -- )(n.i.)
        Anzahl count Bytes vom Stack dadr2 nach dadr1 bringen.
@s      ( dn dadr -- zahl )
        ab €ltester Position z€hlenden Posten Nr. dn lesen; eine dem 4th-Wort
        {pick} entsprechende Funktion, z€hlend ab Null, erh€lt man z.B. mit
                : pick-s 2dup ?s 2rot d- 2swap @s ;
"s@     ( dadr1 nn dadr2 -- )(n.i.)
        Mit vorangestelltem count.w gez€hlten 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, abh€ngig vom Vocabular, das zum
Zeitpunkt der Ausf‡hrung {context} ist.
Postennummern und Stacktiefe sind stets doppelte Integer, da f‡r maximal 255K
Bytes Stackg„œe 16-Bit-Werte zur Numerierung bei Integer-Posten nicht gen‡gen.
Sie z€hlen ab 1; 0 f‡r leeren Stack oder bei {=s} f‡r 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 zur‡ck.
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 zur‡ckgegeben wird, und nach Bedarf mit
Angabe einer double-Postennummer sowie der abzulegenden Daten.

Ein hiermit verwalteter Softwarestack von z.B. 41K Gr„œe wird eingerichtet:
        41 1024 4 */ heapmem stackmem
wonach der Aufruf {stackmem} nun immer die erforderliche Basisadresse liefert.
Die weitere Datenverwaltung erfolgt selbst€tig 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-
tr€gt: { 0. stackmem 2!l }; ebenso l€œt sich der Laufpointer willk‡rlich ver€n-
dern (geradzahlig!), ‡berschieœende Werte werden automatisch abgefangen.


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

* F6-Kern

* Schreibweise          (v808), z.B. bei CREATE
Forth-Namen auf Groœschreibung umgestellt, um den Freunden des ANS-Standards
Gen‡ge zu tun. Das System arbeitet weiterhin unabh€ngig von der Schreibweise.
Wortnamen werden von der Eingabe unabh€ngig in Groœschreibung angelegt.
Zeichen ab Code 128 bleiben in der bisherigen Schreibweise erhalten.
Diese  nderung geht geringf‡gig zulasten der Compilezeit.

* ( nn ) >LOC           (v805)
* ( nn ) LOC>
Die den Localen Variablen zugrundeliegende Speicherverwaltung ist hiermit direkt
zug€nglich und erlaubt die "dynamische" Zuweisung und Freigabe localer Speicher-
bereiche. Damit k„nnen in einem Wort w€hrend dessen Ausf‡hrung in ihrer Gr„œe
vom Programmverlauf abh€ngige Bereiche f‡r locale Daten angelegt werden.

* +ORIGIN               (v805)
Falsche Abstandsangabe ab Position 74, richtig sind
        74      {ert}-Aktivierung/-Sperrung
        76      Maus-Code f‡r {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 v„llig zunichte machen k„nnen, wurde ein Programmteil eingef‡gt,
der jene ‡berlagert. Im F6 mit dem ge€nderten Aufruf { zahl BREAK } ‡bergebe-
ne Codes einer Abbruch-Taste wirken nun zuverl€ssig und gegen‡ber einer evtl.
mit demselben Code definierten Hotkey-Taste vorrangig, dies jedoch nur in der
Variante ALT/Tastencode. Die Funktionsweise im F6 ist unver€ndert geblieben,
d.h. auch die nicht zusammen mit ALT bet€tigte 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 zur‡ck.

* 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 ge€ndert).

* 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 enth€lt. 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 zuverl€ssig ausgeschlos-
sen werden k„nnen.

* LOC> und END-LOC      (v808)
wurden gegen Freigabe zu groœer Bereiche soweit abgesichert, daœ Sch€den am
System (durch §berlauf von S0 in den T.I.B. oder Returnstack) auszuschlieœen
sind. Die regul€ren Daten im Stack bleiben im allgemeinen erhalten, sind aber
je nach Situation nicht immer sicher. Gleiches gilt in h„herem Maœe f‡r 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 s€mtlicher aktueller Locals
in unver€nderter Reihenfolge zum Stack. Ggf. vorher dorthingebrachte Posten
bleiben unver€ndert adressierbar, die Locals gelangen an das zu h„heren
Adressen hin gelegene Ende in den Bereich ab dem urspr‡nglichen 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 ge€ndert werden muœ, daœ er ‡ber den h„chsten ehemaligen Local-Posten zeigt.
Es findet sonst keinerlei Datentransport statt. - Entsprechend s. STK>LOC.

* LOCAL                 (808)
Als Grundlage zur ANS-vertr€glichen Systemerweiterung wurde die LOCAL-Dekla-
ration so abge€ndert, daœ eine beliebige Anzahl Leerzeichen zwischen den Buch-
staben und vor dem abschschlieœenden Strich "|" stehen darf. Z.B. ist statt
        ..  LOCAL ABCD|  ..
nun auch folgende Schreibweise zul€ssig:
        ..  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 zur‡ckgegebene Flagwert mit $ff00 verkn‡pft. Dies ist
korrigiert, ebenso die Bearbeitung negativer Zahlen.

* S==
wurde mit verdrehter Parameteranordnung beschrieben. Richtig gilt dadr1
f‡r den zu suchenden String und dadr2 f‡r 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-L€nge besetzt.

* STK>LOC               (v813)
§bergibt den gesamten Stack-Inhalt in den Local-Bereich.
Da hierf‡r lediglich S0 auf den Wert von SP@ zu setzen ist, wird dieser
Aufruf auœerordentlich schnell ausgef‡hrt. - 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 zur‡ck.

* WD-SIZE
Der bei Erfolg zur‡ckgegebene 'true' Flagwert gibt zugleich die Cursorbrei-
te an. Compiliert kann anschlieœend mit L<I auch die H„he gelesen werden.
Fehler bei R‡ckgabe 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 angepaœt
und das Ganze im FORTH nachgeordneten Vocabular ANS-VOC zusammengefaœt.

* DEBUGGER
"Breakpoint" eingef‡hrt, Erl€uterung 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 l€ngerer Begriffe decken.

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

* QDOS-Jobs
EX und EW compilierende Form in Ordnung gebracht, erg€nzt um EX-P und EW-P
mit Parameterstring. Die Varianten sind 'immediate'. Sie k„nnen 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 zur‡ck:
        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 f‡r 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 ausgef‡hrt werden soll.
                Kanalparameter sind nicht vorgesehen.
        d.ernum ist der Fehlercode aus dem OPEN-Aufruf f‡r 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 zugeh„rige Kanal
                wird in {work} erwartet, wo ihn die {fopen}-Varianten des F6
                stets eintragen, am Ende des Aufrufs wird {work} geschlossen.
                Fehlerm„glichkeiten aufgrund ungerader Filel€nge oder Daten-
                speicher-Zuweisung werden in {-exec} durch Justage auf den
                jeweils n€chsth„heren geradzahligen Wert abgefangen.
        d.jobid ist die Identifikation des neuen Jobs. Wurde d.ernum =/= 0
                zur‡ckgegeben, ist deren Verwendbarkeit von der Art des Feh-
                lers abh€ngig. {frjob} zur Freigabe des ggf. f‡r den Job re-
                servierten Speichers ist aber stets riskolos und ohne Fehler-
                abbruch sofort mit den zur‡ckgegebenen Daten ausf‡hrbar.

* "f6asm_scr"
Nach Korrekturen zum Assemblieren in Dateien haben einige Beipiele fehlerfreie
Codepassagen erzeugt, wieweit der ganze File-Assembler spielt, ist ungepr‡ft:
{f-f}      hat von {posab} hinterlassene flag nicht ber‡cksichtigt,
{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. f‡r den Forth-Speicher
        0. SEGMENT 4th
        4th
code: ...


* "forth_asm"
Zugunsten von {>loc} und {loc>} entfernt:
baud            ( -- n1 )                               F6
                Cons, hilfsweise f‡r 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 »
