* GF6 * GNU-FORTH zum QL * 4.9.1993 ... 1.5.1998 * .hpr * F6 - Vers. 818 *
                     Hinweise zu den Versionen ab 809
            Look at ">>" for some short english explanation

     Version 8.18 is the, sort of, "Final Beta" of the GF6 Forth System.
  Copyright (C) 1998 und Urheberrecht beim Autor, H.-P. Recktenwald, Berlin


  Die GF6-Sammlung unterliegt den Bedingungen der in deutscher §bersetzung
  als "GNU-G_txt" beigef‡gten GNU-Lizenz f‡r freie Software.
  Es sei jedoch darauf hingewiesen, daœ beim Versand, auch in Gestalt einer
  nur schm‡ckenden Beigabe, auf beliebige profitable Gegenleistung stets u.a.
  Vertrags- und Produkthafung, sowie AGBG zulasten des Versenders Rechtskraft
  bekommen, und daœ es keine M„glichkeit gibt, dies auszuschlieœen.


Die Sammlung besteht im Urzustand aus den Bl„cken (Directories):
        t1      Systembeschreibung, Glossar, F6-Assemblertext
        t2      Hilfstexte f‡r den F6-Editor
        gf      F6 Code, Screenfiles, Programme
        ap      Anwendungsprogramme
        lr      32K-Ur-System von L.Reeves


"Benchmarks"
        m„gen andere unternehmen. Zur Beurteilung der Geschwindigkeit im F6
        dienen mir die Zeiten zum Compilieren von Assembler und Editor, und
        einige Bilschirm-bezogene Worte, wie z.B. VLIST. Dabei fallen Unter-
        schiede zu Behauptungen auf, wie sie gelegentlich immer wieder in der
        einschl€gigen Inet-Newsgroup (comp.lang.forth) aufzutauchen pflegen:
        1.      Ein "native"-Code-Compiler sei um etwa das drei- bis f‡nffache
                schneller, als ein traditionell gef€deltes System, wie das F6:
                Das muœ sich auf extrem ineffiziente Varianten beziehen, mir
                ist dergleichen nie vorgekommen, bei Vergleichen mit dem F6
                waren nur in Details gelegentlich Werte von ca 1:3 erzielbar,
                insgesammt kam mit viel Gl‡ck etwa eine Verdopplung zustande.
                Ein Faktor 1:4 trifft in etwa auf optimalen Assemblercode zu,
                nicht aber auf - auch aufwendig optimierte - Hi-Level-Worte.
        2.      Processor-Caches w‡rden von gef€delten Forth-Systemen nicht
                nennenswwert genutzt:
                Das ist Unsinn, wie Messungen der Compile-Zeiten in der QXL
                am F6 zeigen. Dort ergeben sich Verh€ltnisse nicht unter 1:3,
                meist besser, und maximal bis 1:7.

        Nebenbei:
        Die Ausf‡hrungszeit von F6-Programmen erreicht in g‡nstigen F€llen ein
        Verh€ltnis von ca. 1:90 gegen‡ber gleichartigen S*Basic-Programmen.
        Die St€rke des F6 liegt bei der allgemeinen Datenverarbeitung, w€hrend
        in Verbindung mit Ein-Ausgabe-Operationen der Laufzeitvorteil weitgehend
        schwindet. Beim Senden eines String z.B. an einen NUL-Kanal lag er nur
        bei etwa 1:4 (QL mit MGG/GC). Wobei aber auch f‡r reinen Assemblercode
        das Verh€ltnis dann nicht sonderlich g‡nstig ausf€llt, wie etwa anhand
        der Procedur CH_CHS aus "IO2" leicht veranschaulicht werden kann.
        Um den Preis geringerer Flexibilit€t (welche vielfach garnicht ben„tigt
        wird), aber auch geringerer(!) Fehlertoleranz, kann durch feste Defini-
        tionen die Geschwindigkeit wesentlich gesteigert werden. Das k„nnte mit
        geringem Aufwand durch  nderungen in der Assemblerquelle geschehen,
        indem man die betr. {dodefer}-Eintragung streicht, die dort angegebene
        Ausf‡hrungs-Definition mit deren Namensheader versieht, und dann das
        System neu assembliert. Ohne solche  nderungen k€me evtl. Compilieren
        der im deferred-Wort gespeicherten CFA infrage.
        Ein Beispiel:
                type create TYPE dodefer
                  dc.w dtype-Z,dtype-Z
                dtype dc.w dojump-Z
                  dc.l Xtype-Z
        w‡rde dann in der Assemblerquelle ersetzt durch:
                type create TYPE dojump
                 dc.l Xtype-Z
        oder vom Forth aus in ein Wort compiliert als:
                : name .. .. [ ' type @ , ] .. .. ;


Pr‡fung in SMSQ-Varianten:
        F6 ist ein QDOS-spezifisches versionsunabh€ngiges Forth-System. Vom
        SMSQ/E gibt es aber derart viele Varianten, etliche auch mit Fehlern,
        die von l€cherlichen Peinlichkeiten (2.82/3 f‡r GC) bis zu gef€hrlichen
        Sch€den (s.u.) reichen, sodaœ diese Aussage eingeschr€nkt werden muœ:
        Referenz ist die mit der QXL gelieferte Version SMSQ 2.76. Das hat
        immerhin den Vorteil, daœ nicht auch noch neue und meist einzeln nicht
        verf‡gbare PIF-Versionen die Ergebnisse zus€tzlich verf€lschen k„nnen,
        und daœ die Fehler soweit bekannt sind, daœ sie sich b€ndigen lassen.
        Der Erprobung in der GC dient das SMSQ/E 2.84. In solchen Systemen ist
        es beim F6 aber der MINERVA in jeder Hinsicht hoffnungslos unterlegen;
        die Tests mit den diversen SMSQ/E sind darum dort nur oberf€chlich.

    Bedauerlich, doch dieser Hinweis ist noch immer unerl€œlich:
        Das WIN-Filesystem von SMSQ und SMSQ/E zur QXL weist grobe Fehler auf,
        die schwere Sch€den verursachen k„nnen! Diese treten bei mehrfach im
        r/o-Modus ge„ffneten Kan€len auf dieselbe Dateie auf, und in besonders
        schwerer Form noch h€ufiger, wenn w€hrend QXL-interner Filezugriffe
        zugleich das NETzwerk in Betrieb ist. Dann werden die Slave-Bl„cke
        (Datenpuffer des System f‡r den File-Transport) oft so weitgehend ver-
        dorben, daœ die betr. Datei unwiederbringlich verlorengehen kann!
        Sollten z.B. in F6-Editor pl„tzlich verdorbene Seiten erscheinen, so
        hilft es in den meisten F€llen, OHNE JEDE WEITERE AKTION die QXL sofort
        zu verlassen und das System neu zu starten. Versuche, zuvor irgend-
        welche Dateien zu sichern, w‡rde jene mit groœer Sicherheit zerst„ren!

   >>   F6 was designed as a QDOS-specific any versions portable Forth system.
        It was tested (and is currently being run) in many QL systems, as MGG,
        JM, JS, and (preferably) MINERVA (1.93), and in the QXL/SMSQ 2.76.
        Only a few tests were carried out, occasionally, with one of the many
        SMSQ/E versions. Those systems in the GC/QL seem not be worth testing
        at all, because the MINERVAe are much superior, and thus there were
        only a few (and no current!) checks with SMSQ/E (2.84) in the GC/QL.

   Pse, be warned of some significant bugs in the SMSQ and SMSQ/E systems,
        which relate to the WIN drives of the QXL and recursively multiply
        r/o-opened channels to the same file. This most certainly after some
        time can corrupt some slave blocks (internal storage for file-i/o).
        Even more often the same was encountered if some file action in the QXL
        was in progress while simultaneuosly transferring data via the NETwork
        fileserver. There is no means to overcome that bug, except, mostly, by
        then IMMEDIATELY QUITTING the QXL, and restarting. Otherwise, saveing
        any files data most certainly can destroy the files concerned, and
        even might corrupt any others which were currently open!


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 815 => 816 => 817 => 818 , 1. Mai 1998:

Neue/ge€nderte Files:

        F6WORDS_txt  ->  F6INTRO_txt, F6GLS_txt, F6REF_txt
        forth_asm
        forth_scr
        f6asm_scr
        fig_scr
        f6task_scr
        f6xco_scr
        f6xco_4th
        QF
        F6ED
        F6AS

Neues Programm
        RecoverX        Files aus QXL.WIN-Drives/-Files extrahieren/restaurieren
        RecoverX_txt    Beschreibung dazu
    >>  RecoverX_doc    QXL.WIN files recovery/extraction; description.
        qxlwin_scr      f6-source
        qxlsec_dat      empty sector template


Hinweise:
        Der Kern wurde nochmals auf geringsten Speicherbedarf im Forth-
        Bereich und auf Ausf‡hrungsgeschwindigkeit hin ‡berarbeitet. Eine
        Steigerung scheint unter den gegebenen Voraussetzungen kaum mehr
        m„glich, und so wird dies die letzte durchgreifende  nderung am F6
        sein. Mit seiner Hilfe soll nun ein neues 32-Bit-System im ANS-
        Standard entstehen, das zugleich Grundlage einer Java-VM bildet...

     1. Wegen  nderungen im Hi-Level-Bereich m‡ssen C-SAVE-Files vor dem
        Laden in den Kern 8.18 neu compiliert werden.
    >>  Because of the new words (re below) any previously C-SAVEd files
        can only be C-LOADed after being re-compiled.

     2. Der Kern ist an entscheidenden Stellen grundlegend umgebaut. F‡r
        eigene Varianten sollten darum insbes. alle von €uœeren INTERPRETer
        rsp QUIT abh€ngigen Teile genau ‡berpr‡ft werden (mehr s. unten).
        Aus DEFERRED-Worten kann nicht mehr auf den Instruction-Pointer
        zugegriffen werden, Worte wie {R+} sind dort nicht mehr verwendbar.
    >>  The kernel was re-made to an extent that any own modifications,
        mainly those relying on the inner INTERPRETer, or QUIT, should
        thoroughly be verified (re below).
        DEFERRED words no longer reliably can access the IP, e.g. with {R+}.
        The PRINTER words ("forth_scr") have been modified, acccordingly,
        and any user defined routines should be re-done, if applicable.

     3. UQLX wurde mit Vers. vom Feb. 1998 korrigiert, das F6 spielt:
        CMPM (neben anderen ‡berarbeiteten Details) ist nun in Ordnung.
        Das Filesystem weist dagegen noch entscheidende Fehler auf, die
        innerhalb des F6 nur teilweise umgangen werden konnten (z.b. HEADR).

     4. Assemblieren des F6 in der QXL mit SMSQ 2.76 war bei 2M Speicherausbau
        nicht mehr m„glich, in der GC mit Minerva sind ca. 1300K erforderlich.
        -> Nach Umbau des STRING-Macro f‡r den Assembler reichen nun doch
           wieder "nur" etwa 800K aus...

     5. Der F6-Assembler wurde f‡r gleichzeitiges Assemblieren in verschiedene
        Ziel-Files erweitert. Einzelheiten sind "f6asm_scr" zu entnehmen.

     6. Ein Mini-Decompiler zur Kontrolle des j‡ngsten Hi-Level-Wortes:
        : dcm here latest pfa 2dup - 2/ . {: emit
          BEGIN count-w 2+ nfa id. 2dup > 0= UNTIL 2drop ;


* In "forth_scr":


GETENV  etc.
        Zugriff auf die Environment-Variablen der ENV-Erweiterung zum C68.
        Die SBasic-Erweiterung selber ist NICHT MULTITASK-sicher, darum sind
        hier nur lesende Worte definiert.
    >>  r/o access to the C68 environment variables, as supplied by ENV_BIN.
        Those variables, by their definition are NOT safely multitasking!
        Accessing them twice, consecutively, can reduce the risk of reading
        false data, while writing would always amount to some uncertainty.

.KWORDS ( use: .KWORDS filename )
KWORDS  (erwartet den auf die betr. Assembler-Quelle g„ffneten work-Kanal)
        Anzeige der im Quelltext enthaltenen Forth-Worte.
        (expecting open work-channel to the appropriate assembler file)
        Displaying the kernel words from the assembler source.

L-DROP  ( n1 n2 -- )
        Locals bis auf die mit n1 n2 gegebene Anzahl Ebenen und Bytes entfernen,
        Das Wertepaar n1 n2 entspricht der R‡ckgabe von ?LOCALS.
    >>  discard as many locals as allocated after the level/bytes pair of n1 n2
        was returned by ?LOCALS, or equivalent.

NO-LOCALS
        Alle Locals entfernen, notfalls Local-Basis und S0 auf TIB justieren.
    >>  discard any locals, re-set locals base and S0 to tib if necessary.

T.      ( nn -- )
        Zur Ausgabe von durch {.S} unverf€lschten Zahlenwerten -> Verwendung
        des Local-Speichers in Ordnung gebracht: Da "<#" die Variable HLD auf
        PAD einstellt, wirkt die LOCAL-Zuweisung nur, wenn sie _danach_ steht.
    >>  used in {.S} and while debugging to _not_ corrupt the correct numbers
        display -> bug fixed.


* ge€ndert/neu bei den PRINTER-Worten - scr 58 ff -

CS-CSEQ ( .. n(1) n(2) .. n(n) nn -- )
        erwartet als ersten Posten im Stack die Anzahl Steuercodes, z.B.
                DEPTH >R 27 {@ 27 {t 1 27 {6 DEPTH R> - CS-CSEQ
   >>   parameter passing changed, now with leading count, as shown above.

PRINTER / CONSOLE
        l€œt den ggf. existierenden Kanal nach SER/PAR (etc) offen, weil
        die v„llig verfehlte kanal(!)bezogene Ausgabepufferung des SMSQ/E
        sonst binnen k‡rzester Frist den gesamten Speicher zustopfen kann.
        Bei Versuchen kam es dann auœerdem zu gravierenden Systemfehlern
        (Systemvariable SV.FREE := -1 mit den entsprechenden Folgen!).

TAB     ( n1 -- )
        Position n1 anfahren, neue Zeile falls n1 > Fensterbreite.
   >>   Printing posn to column n1, new line if n1 > window with.

DEFAULT-IS TAB
        Aufruf als QDOS-Trap wiederherstellen.
   >>   Restore to QDOS-trap operating mode.


* Korrekturen in "f6xco_scr":  \
* Korrekturen in "f6a80_scr":   ) D6-Verwendung an neuen F6-Kern angepaœt
* Korrekturen in "f6task_scr": /  >> usage of D6 adjusted to new kernel


* Korrekturen in "f6asm_scr":


CODEFILE        ASMFILE
        f‡r abwechselndes Assemblieren in verschiedene Zielfiles ‡berarbeitet.
    >>  re-done to enabling multiple concurrent destination files. Not tested.

#)      Fehler bei .l absolute data { ( dn ) 32bit .l #) ... } korrigiert.
    HINWEIS (aus eigener Erfahrung..):
        Die unsinnige Adressierung
                ' c-find 2@ 32bit    #  a2 ) lea,
        wird strukturbedingt vom Assembler nicht als Fehler erkannt! Es muœ
                ' c-find 2@ 32bit .l #) a2   lea,
        geschrieben werden: F‡r die "absolute data" Adressierung steht "#)".
    >>  address mode bugfix when optimzing a 32-bit absolute data address.

PUSH,   POP,
        Fehler in der Auswertung von MOVEM-Listen korrigiert.

{ d2..d4 d6 a3..6 }
        neben der vom C1-Forth ‡bernommenen etwas ungew„hnlichen Schreibweise
        f‡r MOVEM-Listen gilt auch die sonst eher gebr€uchliche Darstellung
{ d2-d4/d6/a3-a6 }
        sowie alle Varianten von beiden in gemischter Form.


*  nderungen/Erg€nzungen im Kern, zugleich "forth_asm":


DOFORGET (D) ( cacheflg exitflg voclfa nfa -- cacheflg exitflg voclfa nn )
        F‡r EMPTY, FORGET etc. ge€nderte Datenanordnung:
        Das deferred-Wort DOFORGET liegt nun in einer Lo-Level Subroutine, sodaœ
        weder Returnstack noch darin liegende Daten ver€ndert werden d‡rfen.
        Deshalb wurde die Flag zum Restaurieren des CACHE-Zustandes zus€tzlich
        an vierte Stelle in den Datenstack ‡bernommen.
        Weiter wurde "exitflg" eingef‡gt; Werte ungleich Null darin veranlassen
        ohne die Notwendigkeit von Ver€nderungen am Returnstack den vorzeitigen
        Abbruch von FORGET bei Erhalt des bisherigen Dictionary-Zustandes.
        BEISPIELE in "f6asm_scr"; die Sonderbehandlung darin f‡r das Vocabular
        der Localen Wortdefinitionen wurde angepaœt, andere  nderungen sind im
        F6-Original nicht erforderlich.
   >>   Any words re-defining the leading FORGET vector, DOFORGET, executing
        NOOP by default, should be checked and probably re-done, because they
        cannot rely on returnstack data any more. Though never documented those
        data might have been used, e.g. for an early return as in the Local
        words vocabulary of "f6asm_scr".
        The other newly introduced item is "exitflg" which when set to non-zero
        will be leading to early return, in an orderly manner, before actually
        FORGETting, thus leaving the dictionary unchanged.
        In the F6 sources there is just one place concerned, in the temporary
        Local Words vocabulary of "f6asm_scr" which was modified accordingly
        (and where some more examples for the usage of DOFORGET can be found).

,,      ( dn -- )
        Reserviert Platz und compiliert double nach {here}.

(ERT)   4th-Wort entfernt, Datenposten adressierbar mit { $4a +origin }.
   >>   eliminated, data addressable by { $4a +origin }.

'XECUTE ( pfa -- )
        Ersetzt die Sequenz { cfa execute }.
        { ' 'xecute } im F6 entspricht damit in der Wirkung der Folge
        { ' execute } bei den sp€teren Forth-Standards (F-83, ANS, etc.).

ACP     ACL     ( -- ptr )      hidden
        USER-Vari, reserviert.

ANEW    use: ANEW name
        ANEW ruft -FORGET des angegebenen Namen auf und setzt eine Marke in
        Gestalt eines neu gebildeten NOOP-Wortes {name} - was die k‡rzest
        m„gliche Wortdefinition im F6 ist; das Wort hat kein Parameterfeld.
        Alles, was danach compiliert wurde, wird bei erneuten Aufruf von ANEW
        mit demselben Namen aus dem Speicher entfernt. Wirkt also wie
                { -FORGET name }
        und setzt anschlieœend die Marke erneut.
        Die FORGET-Funktion des Aufrufs wirkt nur auf das CURRENT-Vocabular,
        €ltere Marken gleichen Namens in anderen Vocabularen bleiben unber‡hrt.
        Sie ist von Worttyp unabh€ngig, d.h. jedes beliebige j‡ngste Wort mit
        dem angegebenen Namen wird von diesem ANEW-eigenen -FORGET erfaœt.
   >>   -FORGET and redefine {name} in the CURRENT vocabulary.

B/DIR   ( -- nn )       Constante mit Vorgabewert 64
        L€ge einer Directory-Eintragung.
        Nicht zu verwechseln mit B/HED, welche die mit fs.xinf ermittelte
        Anzahl Bytes Header-Vorspann in Massenspeichermedien aufnimmt, und
        z.B. bei DOS-Typ Disketten Null ist.
   >>   bytes per directory entry; 64 by default.

C-FIND  entfernt, kann ersetzt werden durch:
                BL WORD HERE CURRENT @ @ (FIND)
   >>   eliminated, can be substituted by the above sequence.

[CPL]   (D) ( cfa -- cfa )
        wird als letzte Operation vor dem Eintragen der im Stack liegenden
        cfa in das Dictionary (dem eigentlichen Compile-Vorgang) durchlaufen.
        Hier k„nnen ggf. noch zus€tzliche Optimierungen eingef‡gt werden.
        Weil [CPL] als deferred-Wort definiert ist, kann das mit IS in Form
        gew„hnlicher Hi-Level Forth-Worte geschehen.
CMC     Die mit IS €nderbare Constante CMC h€lt einen Freigabez€hler bereit.
        Jener kann um die Anzahl zugef‡gter 16-Bit-Posten (cfa, literal, etc)
        hoch- rsp. muœ(!) um die Anzahl entfernter Posten abw€rtsgez€hlt werden.
        Um weitere Einfluœnahme zu unterbinden, stellt man ihn ggf. auf Null.
        Sein positiver Wert entspricht der zul€ssigen Anzahl Posten, um die der
        Code vom Ende her maximal verk‡rzt werden darf, bei negativen Werten
        oder Null darf keine  nderung mehr vorgenommen werden.
        Mit jeder Ver€nderung ist auœerdem der Dictionary-Pointer als 32-Bit-
        Posten (relative 4th-Adresse) zu justieren:
                ( nn ) DP 2- M+!  oder ( nn ) MINUS DP 2- M+!
        nn z€hlt in Bytes und muœ geradzahlig sein.
        Weitere Maœnahmen sind nicht erforderlich.

!CHNAME ( ptr chan -- )
        Von "forth_scr" in den Kern ‡bernommen, damit auch ohne "L-LOAD" sofort
        verf‡gbar, sowie zur Umgehung gewisser M€ngel beim Direkzugriff (TK2)
        und des UQLX erg€nzt.
        Ermittelt den Namen eines offenen F6-Kanals (nur Fenster oder File).
        L€nge des Devicenamen liegt durch fs.xinf fest bei max. 4 Zeichen; der
        Anteil von Directory+Filenamen wird ggf. auf {F/N} Zeichen begrenzt,
        und die des daf‡r zu lesenden Fileheaders auf {B/DIR}. Beides sind
        4th-Constante, die mit IS ge€ndert werden k„nnen, also f‡r den Fall,
        daœ ein fs.headr ‡ber den QDOS-Standard hinaus l€ngere Namen liefern
        sollte (z.B. "QVFS"), auf jeden zu erwartenden Wert einstellbar sind.
   >>   Finds the name of an open F6-channel; from "forth_scr".
        Any channel other than a window or a file (i.e. any channel the device
        of which does serve the fs.headr trap) will produce an empty string.
        File+directory names length limited by F/N, which can be adjusted to
        any (reasonable) value, in case some new fs.headr - for which then the
        constant B/DIR should be adjusted accordingly - might return names
        longer than set up by the QDOS standards ("QVFS", etc.).
        Extended to also find the names of direct device access channels (TK2)
        and of any f.s.-channels in the UQLX (where fs.headr is bugged).

2CONS+  defn: ( dn 2CONS+ name )  exec: ( dn1 -- dn2 ) -> dn2:=dn1+2cons
        Beim Aufruf dn zur im Stack vorhandenen double addieren.
   >>   defn of fast de-/incrementing double constants, executing the same
        way as the pre-defined 1+, 1-, D2+, D1-, etc.
D2+ 1+  Ausf‡hrung von CONS2+ & CONS+ ist identisch der von D1+, 2-, etc.

CONS+   CONSM+  2CONS+
        k„nnen ebenfalls mit IS ge€ndert werden.
    >>  Values redefinable with IS.

CONS+   CONSM+
        k„nnen auœerdem mit DEFAULT-IS auf den jeweils unmittelbar danach
        in den Speicher eingetragenen Wert (zur‡ck-)gestellt werden.
    >>  Values re-settable with DEFAULT-IS if compiled as:
                ( nn ) CONSM+ name ( default ) ,

DEL-DEFB ( -- 0 | err )
    >>  requires IO2/"dvs_byt" erforderlich.
        Das TK2-Kommando (auch in GC, S-GC und SMSQ enthalten) kann in der
        QXL nach Benutzung verschiedener WIN-Laufwerke u.U. groœe Bereiche
        an Speicher freigeben und hilft manchmal auch bei u.g. SMSQ-Fehler.

ERNUM   wird mit dem Lesen automatisch auf Null gestellt, liefert also nur
        das erste Mal einen brauchbaren Wert. Solange ERNUM noch nicht benutzt
        wurde, kann der Fehlercode an der Forth-Adresse $8012 gelesen werden.
                $8012 2@        \ wie ERNUM

FSTRG-L FSLOAD  SSTRG-L FSSAVE
        erneut ‡berarbeitet, Fehler bei FSSAVE korrigiert;
        "timeout"-Bearbeitung f‡r NETzwerk- und SER-Transport eingerichtet.
        In den Aufrufen werden nur die String-Traps verwandt, bei welchen je
        nach Ger€t und Speicherausbau sich gegen‡ber den QDOS-Traps fs.load
        rsp. fs.save durch die Slave-Block-Verwaltung des Systems ohne jede
        weitere Zwischenspeicherung zumeist ein hoher Zeitvorteil ergibt.
        fs.load/save sind nicht in allen QL-/SMSQ-Systemen fehlerfrei.
        Solche Fehler auszuschlieœen ist weiterer Zweck dieser F6-Worte.

INI-LOC & LOCAL
        modifiziert f‡r IS und die  nderungen in der Schreibweise.
    >>  modified to enable the new operational modes (re below).

IS      use: ( nn ) IS name
        §bergabe neuer Werte an Variable und Constante mit IS ist nun etwa
        im Verh€ltnis 1:3 schneller als die entsprechende Variante mit {!};
        es werden besondere Operatoren mit folgenden Hilfsnamen compiliert:
          is  (deferred)        il  (any locals)        v!  (cons, vari)
          u! (user)             dv! (2cons, vari)       fv! (fp-cons)
          ar! (associative: range:)                     cs! (case:)
        UND:
                .. LOCAL ab..| .. .. IS A ..
        IS kann auch auf Locale Variable angewandt werden. Dazu wird intern
        gepr‡ft, ob solche im betr. Wort ‡berhaupt initiiert wurden (INI-LOC
        oder LOCAL ..|), und ob der angegebene Name ein einzelner Buchstabe
        a..z oder A..Z ist, der NOCH NICHT als regul€res Forth-Wort definiert
        wurde. Die Local-Posten i, j und r k„nnen z.B. hiermit nicht ver€ndert
        werden, da sie als 4th-Worte bereits existieren, und zum anderen kann
        es Laufzeit-Fehler geben, wenn etwa LOCAL AB| definiert, aber ..IS D..
        hingeschrieben wurde. Auf diese Weise kann auch mit IS auf die Locals
        eines ‡bergeordneten Wortes zugegriffen werden. Gibt es solche nicht,
        kann die Ausf‡hrung Fehler durch z.B. §berschreiben des TIB erzeugen.
        Bei Schreibweise ohne vorangestelltes LOCAL dauert das Compilieren
        verfahrensbedingt u.U. erheblich l€nger, die Form IS ... wird danach
        aber entschieden schneller ausgef‡hrt, als { -LOC ... ! }.
   >>   IS if used to re-define the value of any kind of 4th-constants or
        variables is now much faster (1:3) than the usual {!} operations,
        compiled by several new, headerless words (re above).
        IS can also be used to modify any Locals values, if the word currently
        being defined includes LOCALs (or local memory initiated by INI-LOC),
        and if the name after IS is a single character in the range of a..z or
        A..Z, which was NOT defined as a 4th-word (as, for instance, i, j, and
        r already are), regardless of the actual range being used.

L<I     mit -LOC ge€ndert:
                -loc A l<i      ( -- ptr n1 n2 ) n1:=ptr n2:-ve
                -loc a l<i      ( -- ptr n1 n2 ) n1:=ptr n2:+ve

LOCAL   (Speicherschutz, vereinfachte Schreibweise f‡r Locale Variable)
      1. Der 4th-Speicher bis 128 Bytes ‡ber HERE, entspr 48 Bytes ‡ber PAD,
        wird gegen §berschreiben durch Locale variable gesch‡tzt. Entsprechende
        Zuweisungsversuche werden mit der Meldung 10 abgewiesen:
                "too many Locals"
      2. Bevor der  uœere Interpreter den Zahlen-Compiler aktiviert, nachdem
        die Wort-Suche erfolglos war, wird nun erst noch gepr‡ft, ob der gerade
        gelesene Text als LOCALe Variable auswertbar sein k„nnte. Sofern LOCALs
        initiiert wurden, werden einzelne Buchstaben als Local-Leseoperationen
        gedeutet. Mit wenigen Ausnahmen, z.B. {i}, {j} oder {r}, gen‡gt es dann,
        statt LOCAL {buchstabe} nur den Buchstaben hinzuschreiben:
                : name .. LOCAL abc| ...  A c s* d$.  ... ;
        oder, z.B. f‡r den Zugriff auf ‡bergeordnete Local-Posten:
                : name .. [ 0 dup ] INI-LOC .. .. END-LOC ;
        ABER
                : name .. LOCAL abcdefghij| .. A i s* ..     .. ;
        w‡rde das existierende Forth-Wort {i} compilieren, in diesem Falle also
        den Index einer DO-LOOP rsp. den entsprechenden Posten vom Returnstack.
        Der betr. LOCALe Posten ist NUR mit vorangestelltem {LOCAL} erreichbar.
        Bedingt durch das Verfahren wird die Schreibweise mit LOCAL u.U. sehr
        viel schneller compiliert.
      3. Ein (alter) Nebeneffekt:
                1 2 3 4 5 6  ->  local abccef|  -> a:6 b:5 c:4 d:4 e:2 f:1
        oder    1 2 3 4 5 6  ->  local abccce|  -> a:6 b:5 c:4 d:4 e:4 f:2
        Stets werden soviele Posten von Stack genommen, wie LOCALs zu besetzen
        sind, auch bei gleichnamigen ("‡berschreibend duplizierenden") Indices.
   >> 1. Locals allocations ranging down to 128 bytes above HERE, i.e. 48 bytes
        above PAD, or further will be rejected with the message #10:
                "too many Locals"
      2. LOCALs reading operations can now be written by just the indexing
        character, dispensing with the leading {LOCAL} keyword, if the LOCALs
        already have been initiated and if the character concerned does not
        represent another already defined Forth word - i.e {i}, {j} or {r}
        cannot be addressed this way:
                : name .. LOCAL abcdefghij| .. A i s* ..     .. ;
        will NOT work as expected if the LOCAL item {i} was meant, while
                : name .. LOCAL abcdefghij| .. A local i s* ..   .. ;
        would do the job.

MD/     ( dn1 un2 -- dn3 )              - floored quotient -
        Division double durch vorzeichenlose single in double Quotienten.
    >>  signed quotient from division of signed double by unsigned single.

PTYPE   (D) ( ptr count -- )            - type printable chars -
        Wesentlich schneller, Stringl€nge aber zus€tzlich auf den freien 4th-
        Speicher zwischen SP@ und HERE, wie mit { MEM . } angegeben, begrenzt.
    >>  Is now much faster, but cannot output strings longer than availiable
        4th-memory - as displayed by { MEM . }.

RDROP   =>> (I)
        compiles: RDROP         as      rdrop   (dummy header)
                  RDROP RDROP           2rdrop  (  "  )
        RDROP ist nun optimierendes Compiler-Wort (immediate).
   >>   RDROP is now an immediate and optimizing compiler word.

;       (I)                             - Optimierung -
;S      erg€nzt:
        compiles: RDROP ;       as      r;      (dummy header)
                  RDROP RDROP ;         rr;     (  "  )
                  2DROP ;               dd;     (  "  )
        werden je zu einer einzigen Operation zusammengefaœt compiliert. Der
        durch geeignete Wortanordnung m„glichen Optimierung durch Umbau zum
        Sprung in eine abschlieœende Colon-Definition sollte jedoch weiterhin
        Vorrang gegeben werden, da jene meist den gr„œeren Zeitgewinn bietet.
   >>   semis { ; } modified to optimize {{ RDROP } RDROP ; } and { 2DROP ; }.

S>M     ( ..nn n1..nx ptr mx -- ..nn )
M>S     ( ptr mx -- n1..nx )
        Datentransfer in Anzahl mx Bytes zwischen Stack und ptr im Speicher
        analog R>M und M>R. Vorsichtshalber begrenzt auf 510 Bytes je Aufruf.

-SCAN   ( ptr1 maxlen byte -- ptr1 disp )
        Sucht nach dem Wert byte im Speicherbereich maxlen bei ptr1,
        ausgehend von dessen Ende, gibt neben der Anfangsposition ptr1 den
        Abstand disp zum gefundenen Byte zur‡ck, rsp 0 wenn das Zeichen nicht
        gefunden wirde. - Beispiel:
                " 1 s-load win6_gf_fig_scr " -count
                2dup {_ -scan 1- {_ -scan
                dup -rot {{ emit type {} emit cr
                2swap + -rot + swap over - {{ emit type {} emit
        schreibt
                {1 s-load win6_gf_}
                {fig_scr }
   >>   scanning backwards the 4th memory area at ptr1 of length maxlen,
        returning ptr1 and the displacement disp to where byte was found.

SOURCE  umgebaut:
        Liefert bei -1 in BLK die Werte aus ACP und ACL.

TRAP1   =>> dummy-header, TRAP1A can be used instead.

[USING] ( ptr -- )
        Ausf‡hrungsteil von USING.
        Erwartet ptr zu einem Filenamen und „ffnet damit den SCREEN-Kanal.
   >>   Executing part of USING, with ptr to the screenfile name.

QXL     (D) ( -- flg )                  - versuchshalber -
        {QXL} wird, wenn das F6 in QXL/SMSQ betrieben wird, und immer, wenn
        in einem {R/W}-Aufruf der "Fehler" -16 (bad medium) auftritt, eine
        Aktion zugewiesen, die "true" (1) zur‡ckgibt, sodaœ Maœnahmen zur
        (vorsichtigen!) Umgehung gewisser "St„rungen" im SMSQ m„glich sind.
        Sollten L-LOAD oder S-LOAD dennoch abbrechen und QXL nicht 1 liefern,
        kann vor einem erneuten Versuch folgende Eingabe helfen:
                screen close empty ' 1 is QXL

        ...weil jenes heillos vermurkste SMSQ bei WIN-Dateien in der QXL, auf
        die aus jeweils neuen OPEN-IN ge„ffneten Kan€len recursiv zugegriffen
        wird, nach einer gewissen Zeit nur noch "bad medium" - "FEHLERHAFTER
        DATENTR GER" meldet, auch, wenn ein wirklicher Fehler nicht vorliegt,
        muœte f‡r ordentliche Funktion von z.B. L-LOAD eine Sonderbehandlung
        installiert werden, die nun in den Kern verlagert ist.
        Der Fehler wirkt auch beim Zugriff ‡ber Netz aus dem wirklichen QL!
        Dar‡berhinaus:
     EINE EINDRINGLICHE WARNUNG...
        ...betr. des SMSQ (oder ../E) in der QXL bez‡glich der WIN-Laufwerke:
        Wieder einmal sind mir diverse Dateien verdorben worden (gerade eben,
        22.4.98). Das geschieht im Zusammenhang mit dem Datentransport ‡ber
        Netz, und wenn h€ufig relative File-Positionierungen stattgefunden
        haben. Ausl„ser scheint demnach die QDOS-Trap fs.posre zu sein, bei
        der sich Fehler einstellen, und wo dann fs.posab beim selben Kanal oft
        noch einwandfreie Ergebnisse liefert. Danach werden gerade offene Files
        mit Schlieœen der betr. Kan€le mit groœer Sicherheit v„llig verdorben.
        Als einziges Gegenmittel bietet sich sofortiger Reset des Rechners an,
        oder wenigstens Aufgabe des QXL-Systems bei R‡ckkehr ins DOS.
        Ein Bild des Jammers! Und:
        Mr.T. sind die Ph€nomene bekannt (reproduzierbare Beispiele wurden ihm
        wiederholt ‡bermittelt), doch, obwohl Untersuchung der Systemdaten und
        der Ergebisse verschiedener relevanter QDOS-Operationen (FPOS, etc) in
        solchen F€llen sehr deutliche Hinweise liefern, scheint er, wie die
        mangelhafte Reaktion zeigt, mit dieser Problematik restlos ‡berfordert
        (und ich bin es leid, ihm wieder und wieder detaillierte  nderungs-
        (Anweisungen auszuarbeiten...

   >>   Flag when in a QXL/SMSQ system, will also be set to returning true (1)
        if an error -16 ("bad medium") occurred, which is specific to SMSQ in
        the QXL with recursively multiply OPEN-IN-type opened channels to the
        same file on a WIN device, thus preventing, for instance, L-LOAD from
        orderly operating. I'd then also frequently find the slave blocks of
        other files badly corrupted, which would result to a loss of data after
        closeing the files concerned if they were opened with write permission.
        (those bugs were reported to Mr.T., who seems to prefer to just denying
        (them and to ignoring any related evidence.
     IMPORTANT NOTE:
        Do not trust the fs.posre QDOS-trap when in an SMSQ-ish system, and in
        the QXL, with regard to the msdos-files dummy WIN drives! I've lost
        several files after some network traffic and files repositioning with
        fs.posre - fs.posab seems to working error free, but fs.posre apparently
        worked out really destructive...
        The phenomenon can be reproduced by
                ' 0 IS QXL
        and then loading and compiling, e.g., "fig_scr" from a WIN drive,
        which soon will be interrupted by the "bad medium" error message.
        This is not dangerous as long as nothing will be written to a file,
        thus such a test can safely be used to verify that malfunction.


*  >>   where applicable, adjust your screenfiles to the changed properties:

L-LOAD  +CONTINUE       (I)
        -->> IMMEDIATE ausgef‡hrt.

(;) (D#) (PROMPT) CC4TH CC-4TH
        -->> HIDDEN-Vocabular. Insbes. durch (PROMPT) und (ERT) sind in
        den Screenfiles im _gf_-Directory Anpassungen erforderlich, z.B:
                .. also hidden (prompt) previous ..

(EXPER) [;C]
        -->> ASSEMBLER-Vocabular.

(EXPER) ( -- ) (D)
        Wird bei einem Fehler in EXPECT daraus aufgerufen und stellt den
        minimal erforderlichen i/o-Kontext wieder her, indem TIB und die
        i/o-Kan€le auf die Vorgabewerte zur‡ckgestellt und die Bereitschafts-
        Meldung der Eingabe aktiviert werden.
   >>   The routine executed by (EXPER), which will be executed by EXPECT if
        an error occurred, was made to recover TIB, the i/o channels, and
        re-activating the keyboard prompt. A redefinition should at least do
        that, and may be used to execute any other i/o re-initiating stuff.


* wegen geringen Nutzens (und o.g. Speicherprobleme) entfernt

!A, @A  und alle anderen "aligned" store/fetch-Operatoren. Die entsprechenden
        byteweise arbeitenden Operatoren sind nur unwesentlich langsamer.
   >>   the aligned store/fetch operators have been cancelled because of
        their little use and the above mentioned memory related problems.


*  nderungen intern, Korrekturen:


-FORGET f‡r compilierte Variante in Ordnung gebracht.

TOP-NFA Fehler im Returnstack korrigiert.
        (Gutes Beispiel, daœ auch zuviel "Sicherheit" m„glich ist: Weil beim
        (Ausprobieren in direkter Eingabe R‡ckkehr immer nach QUIT erfolgt,
        (wo der Returnstack zur‡ckgesetzt wird, und weil "oberhalb" dieser
        (Position sicherheitshalber noch die cfa von QUIT abgelegt ist, ein
        (Irrl€ufer auch deshalb meist dorhin verzweigt, ist der fehlende Posten
        (mir bislang nie aufgefallen...

UM/MOD  ( ud1 u2 -- ur uq )
        gibt bei Divisions-§berlauf das passend justierte Ergebis aus QM/MOD
        zur‡ck, wodurch dann immerhin der Divisionsrest noch richtig abgelie-
        fert wird. Pr‡fung darauf anhand des Quotienten, der diesen F€llen
        gleich dem h„herwertigen Teil des Dividenden ist.
   >>   modified to always return the correct remainder. An overflow of the
        quotient can be detected by comparing the m.s. word of the dividend
        with the quotient which then will be equal.

-0  SP@  RP@ TICK
        Adressen von Timer, 4th-Basis und Stacks initial auf Vielfache von 4
        Bytes justiert, woraus f‡r Processoren ab 68020 deutlich verbesserte
        Ausf‡hrungsgeschwindigkeit bei 32-Bit-Speicheroperationen resultiert.
        Sie werden dann in derselben Zeit ausgef‡hrt, wie 16-Bit-Operationen.

?LOCALS Fehler in der Z€hlerbearbeitung korrigiert und Fehlervorgabe ingef‡gt.
        Kann nun z.B. bei irregul€rem Abbruch zur Freigabe des Local-Speichers
        benutzt werden, bei gleichzeitiger Re-Initiierung von S0 auf TIB:
                -1 LOCC ! ?LOCALS 2DROP
        oder, nicht immer ganz so radikal:
                | ?LOCALS -DUP IF 2/ LOC> ENDIF DROP
                  ?LOCALS OR IF -1 LOCC ! ?LOCALS 2DROP ENDIF |
   >>   can now be used to de-allocate Locals memory if the program flow was
        interrupted irregularly.

Verschiedene Code-Teile
        zur Gewinnung von freiem Platz im 4th-Bereich weitere Hi-Level-Teile
        in Lo-Level-Code ‡bertragen. Sofern darin nicht auf den Returnstack
        zugegriffen wird, k„nnen nun Primitives, Deferred-Worte und(!) Colon-
        Definitionen (Hi-Level..) von beliebigem Ort aus dem Assembly aufge-
        rufen werden, ohne daœ der Schutz-Job einen Fehler meldet. Nach dem-
        selben Muster (s. "forth_asm", <Cprim> etc) lassen sich solche Aufrufe
        auch mit dem F6-Assembler in's Dictionary oder in Files assemblieren.
        Das Compilieren von Screenfiles ist gegen‡ber v.8.14 um bis zu 20%
        schneller, auch einige compilierte Aufrufe wurden beschleunigt.

mkchp   F€lschlich wurde jede Kanal-Id mit negativer Tag-Nummer als ung‡ltig
        bewertet - z.B. im MGG-System sind solche Kan€le aber in Ordnung.
        Nur $ff00.0000 oder $ffff.ffff sind Signal f‡r nicht vorhandene rsp
        geschlossene Kan€le. Der F6-Code wurde korrigiert. Es d‡rften aber
        €hnliche Stellen auch in den Screenfiles vorhanden sein, die ggf.
        noch anzupassen sind.
    >>  found -ve channel tags in MGG being ok, only $ff00.0000 in the QDOS
        tables, or $ffff.ffff, signalling a closed or not present channel. In
        F6 any other -ve number was falsely also interpreted as "not open".

d6.l    im Text auch mit [os] bezeichnet, dient nun als ptr auf die Basis
        der localen Variablen und ist zugleich auch ptr auf den leeren
        Datenstack, wie er als Langwort in {s0 2-} gespeichert ist, wodurch
        insbes. die Localen Variablen deutlich schneller verarbeitet werden.
   HINWEIS: Es ist nun nicht mehr m„glich, mit {s0} auch den Local-Pointer
        direkt zu beeinflussen. Solche Versuche f‡hren zu Fehlern.
        Dazu sind nur noch die regul€ren Operatoren-Paare zu verwenden:
                >LOC            LOC>
                INI-LOC         END-LOC
    NDERUNG:    STK>LOC         LOC>STK
        F‡r letzteres Paar wird der Returnstack zur Ablage der Bereichsgr„œe
        benutzt, sie sind darum nur entsprechend >R und R> geordnet paarweise
        einsetzbar. Re-Initiierung (auch des TIB) notfalls mit:
                -1 LOCC ! ?LOCALS
    >>  d6 = [os] now used as the local area pointer, which is identical to
        the empty-stack-pointer, as fetched with { s0 2- 2@ }, leading to
        the LOCALs and most error checking operations execute much faster.
        BUT: {s0} cannot be used to directly manipulate the locals memory!
        The regular operator pairs should be used instead, as noted above.
   CHANGED:
        STK>LOC stores internal data to, and LOC>STK fetches them from, the
        returnstack, thus must be used in a balanced manner, like >R and R>.

Xilocal  nderung der Codierung mit [ip]: Byteweises lesen f‡hrt zum Abbruch
        durch den F6-Schutzjob, der im betr. Codebereich die Register des
        virtuellen Forth-Processors auf geradzahligen Inhalt ‡berwacht.
        - Alter Fehler, war l€ngst in Ordnung gebracht, ist offenbar durch
          Verwechslung der Arbeitsdateien erneut in den Quelltext geraten.
    >>  Bug at <Xilocal> fixed, again...

locmin  in Ordnung gebracht.

Assembly Registers
        Reg d4/d5/d6/d7/a3/a4/a5/a6/a7 - D4, D5, OS, UP, NX, IP, SP, BP, RP
        Diese und zur Zwischenspeicherung _jedes_ der verbleibenden Register
        werden im Kern benutzt. Die o.g. d‡rfen nicht, rsp nur systemkonform,
        ver€ndert werden, die anderen sind ggf. zu sichern.
   >>   User code should preserve the above registers, and/or maintain them
        in a system comformant manner, when calling a 4th word on kernel
        level, and also care for _any_ other registers, because they might
        not be preserved by the kernel primitives!


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 814 => 815, 19. M€rz 1998:

Neue/ge€nderte Files:

        as_gls
        forth_asm
        forth_scr
        fig_scr
        f6asm_scr
        keirsey_scr     (Spielerchen zur "Psycho-Analyse")
        QF
        F6ED
        F6AS


Hinweis:

     1. Alle .._4th-Files (und dandere mit C-SAVE erzeugte) m‡ssen
        neu compiliert werden!

     2. Derzeitige Fehlfunktion im QL-Emulator "UQLX" ist auf falsche
        Emulation des CMPM Processorbefehls zur‡ckzuf‡hren. Vorl€ufig
        Korrektur nur durch Ersatz der entspechenden Passagen im
        Assemblertext m„glich - oder Warten auf UQLX-Korrektur.


 nderungen in den Texten

F6WORDS_txt
        weiter ‡berarbeitet, durch §bertragungsfehler verdorbene Textpartien
        ausgebessert, inhaltlich ohne wesentliche  nderungen.


"f6asm_scr"

        Einige zus€tzliche Mnemonics f‡r (nicht immer alle! s.u.) Processoren ab
        68020; bis auf wenige Ausnahmen fehlen die erweiterten Adressierungsmodi.
        Auœer CHK2, (das im F6 eine trap #0 ausl„sen w‡rde) sind die f‡r 68EC040-
        Processoren tauglichen Mnemonics in der (alten) QXL gepr‡ft und ok.
    >>  Some more mnemonics in the F6-assembler:

BFTEST, BFSET,  BFCLR,  BFCHG,  BFINS,  BFEXTU, BFEXTS, BFFFO,
CHK2,   CMP2,   EXTB,
MULU,   MULS,   DIVU,   DIVS,   in den einfachen .L-Varianten
        ab 68020,

CALLM,  RTD,    RTM,
        nur 68020

*2 *4 *8
        Scalierung bei Register-indizierter Adressierung, ab 68020.


LABEL:  T2VAR:  H:   T:
        Locale Definitionen und solche mit nur tempor€rem Namens-Header
        in Ordnung gebracht. Zu beachten: Diese Namen k„nnen nicht in
        Listenkonstruktionen {case:}, {range:} etc. eingebaut werden.
    >>  Items set up with those definitions can't be used in any of the
        list constructs, {case:}, {range:}, nor {associative:}.

LOCK, UNLOCK,
        Hilfs-Macros f‡r im Supervisor-Modus auszuf‡hrende Passagen.


"forth_scr"

        Durch, ‡berwiegend optisch wirksame,  nderungen hat sich die unter
        SCR-Nummer zu adressierende Lage der Seiten ab 12 um +3 ver€ndert.
        L-LOAD-Aufrufe sind davon unabh€ngig, der initiale Einsprung ist
        angepasst. Nur die Kontrolle eventuell eigener direkter Seiten-
        Angaben aus anderen Quellen ist ggf. erforderlich,  nderungen in
        der eigentlichen F6-Sammlung fallen weiter _nicht_ an.


 nderungen in "forth_asm"

PUSHFILE  POPFILE  INTERPRET  (LINE)
        als Primitives in den auœenliegenden Codebereich ‡bertragen.
     >> now primitives.

.. -dup IF ..   =>  .. ?0BRANCH ..
        Zusammenfassung der Fallentscheidung durch Codierung als ?0BRANCH
        in die BRANCH-Optimierung eingereiht.
     >> additionally included in the braches optimisation.
        Saves another bit of execution time and mamory space.

.. -dup 0= IF .. => .. ?1BRANCH ..
        analog, ?1BRANCH neu, altes Wort mit diesem Namen umbenannt (s.u.).
     >> new optimisation as with ?0BRANCH, old word re-named - re below.

.. over = IF drop ..  =>  .. ?=BRANCH ..
        Alt, umbenannt, war ?1BRANCH, s.o.
     >> formerly {?1BRANCH}


RCLCK, RECHP, BAUD
        <dot11d> korrigiert: "vagabundierendes" branch-Z entfernt - weiœ
        der Geier, wie der Code da reingekommen ist; alter Fehler, lange
        gesucht... Fiel u.a. durch Systemzusammenbruch nach BACKUP auf,
        immer zum Schluœ ausgel„st durch die fehlgeleitete Heapfreigabe.
     >> Erroneous {branch-Z} in <dot11d> found, bug fixed.

.BYE    ( -- ptr )
        Gibt den mit ptr adressierten QDOS-Typ-String als Meldungstext
        an das den F6-Job mit EXEC_W o.dgl. aufrufende SBasic zur‡ck.
        Beim Aufruf aus anderen Jobs hat D0 mit gesetztem Bit #31 die
        Adresse des Textes. Auswertung muœ dann umnittelbar nach R‡ckkehr
        aus dem Jobaufruf erfolgen, da nach einer neuen Speicherzuweisung
        auch durch beliebige andere Jobs der Text verdorben werden kann.
     >> When called with EXEC_W etc., for exlusive execution, the return
        code in D0 will be set to the address (and bit #31 set) of the
        QDOS-type string where ptr points to.

?LOCALS ( -- bytes levels )
        Gibt Anzahl LOCAL-Zuweisungsebenen und Anzahl der insgesamt daf‡r
        reservierten Bytes zur‡ck. Bei Fehlern wird S0 re-initiiert und
        die USER-Vari LOCC, die die o.a. Werte h€lt, auf Null zur‡ckgestellt.
     >> Returns current levels of LOCAL assignations and the number of
        currently reserved local bytes.


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 813 => 814, 9. Aug 1997:

Neue/ge€nderte Files:

        forth_asm
        forth_scr
        fig_scr
        QF
        F6ED
        F6AS


 nderungen in den Texten

F6WORDS_txt
        §berarbeitet, durch §bertragungsfehler verdorbene Textpartien
        ausgebessert, inhaltlich ohne wesentliche  nderungen.


 nderungen in "forth_asm"

FSSAVE  und andere File-i/o-Sequenzen netzwerktauglich gemacht.
        Z.B. bricht die qdos-Trap fs.save beim Senden ‡ber Netzwerk meist
        schon nach einer geringen Anzahl Bytes ab, auch io.sstrg liefert
        bei gr„œeren Datenbl„cken selten den String vollst€ndig ab.
        FSSAVE benutzt im F6 nun die Trap io.sstrg in Bl„cken zu max. 1K
        und wiederholt die Aufrufe solange, bis s€mtliche Daten gesendet
        wurden.
     >> using io.sstrg internelly to safely send all data via NET or to MDV,
        where fs.save mostly returned incomplete.


 nderung in "forth_scr"

BACKUP  der innere Aufruf {-bup} und das Wort {bcy}, das den Datentransport
        erledigt, sind f‡r NETzwerktauglichkeit korrigiert.
     >> {-bup} and {bcy} modified to reliably NETworking.


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 812 => 813, 1. Juni 1997:

        Die Aufzeichnungen hierzu sind durch vollst€ndigen Datenverlust
        zweier Festplatten restlos verlorengegangen. Aus dem Ged€chtnis
        nur soviel (vollst€ndige Beschreibung in "F6WORDS_txt"):

        Systemstart erneut an SMSQ-Eigenheiten & -Fehler (z.B. CN_-Vectoren)
        angepaœt. Ein paar eigene Fehler korrigiert (wird wohl so sein...).

LOC>    Bei LOCal-Bereichszuweisung wird der betr. Speicher mit 0 initiiert.
     >> uninitiated Local memory cleared to zeroes.

>FOUNT  ( selector chan -- )
        Selector = -23 f‡r den Latin1-Zeichensatz; ein weiterer Zeichensatz
        mit einigen speziellen Graphikzeichen ist mit -19 codiert.

HISTORY Die Commandline-History von B.Jakubith wird erkannt und ggf. beim
        Systemstart mit 80 Zeilen f‡r {in-cons} automatisch installiert.
     >> At system startup an 80 lines commandline history will be initiated
        automatcally if the device (by B.Jakubith, "oktagon") was found.

MOVE-MEM wird blockweise im Supervisor-Modus ausgef‡hrt.

        Neu:

CONS+   def: ( nn CONS+ name -- ) exec: ( n1 -- n2 )
        einfache Constante, bei Aufruf in den Stack addiert.
    >>> single which will be added to the value already on t.o.s.

CONSM+  def: ( nn CONSM+ name -- ) exec: ( dn1 -- dn2 )
        einfache Constante, bei Aufruf vorzeichenerweitert zum doppelten
        Posten im Stack addiert.
    >>> sign extended single which will be added to double on t.o.s.

IS-HIS  ( chan -- flag )
        flag = 1 wenn der Kanal chan eine Commandline-History besitzt.


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 809 => 810, 18. Sept 1996:

        Codebl„cke zum Einbau durch C-LOAD in diese Version m‡ssen
        neu compiliert werden.
>>>     Codeblocks for C-LOAD need to be re-compiled.

Betroffen sind:
"QF" und "forth_asm"

Korrektur:

0>      lieferte beim Vergleich mit $8000 den falschen Flagwert 1.
    >>> wrong result with $8000 corrected.


Neu:

BFTST                   ( udadr ud -- flg )
        Test Bit#(ud) im Feld ab Adresse udadr. flg ist der Bit-Wert 0 oder 1.
    >>> Test bit#(ud) in the bit field beginning in memory at l.s.b. of dadr.

BFCLR BFSET BFCHG       ( udadr ud -- )
        Bit#(ud) im Feld ab Adresse udadr l„schen, setzen, kippen.
    >>> clear, set, invert bit#(ud) in bit field beginning at udadr.

 nderungen:

BTST BSET BCLR
    >>> deleted, may be compiled from "forth_scr".
        aus dem Kern genommen, da die neuen Bitfeld-Operationen mehr leisten;
        einzeln unter ihrem Namen rsp. alle drei unter dem Suchwort BITS z.B.
        mit L-LOAD aus "forth_scr" nachladbar.

TEXT " NAME \NAME W@ S@ S#,
>CHAN< TO-WORK SET-WORK IS-CHAN SET-CHAN
        Ganz als lo-level-Worte verfasst und Ausf‡hrungsroutinen in den Code-
        teil verlagert. Neben dem Laufzeitvorteil wurden damit weitere 180+
        Bytes im Forth-Adressenbereich frei (s.o., Bitfeld-Operationen).

+       ist immediate und wirkt bei einzeln vorangestelltem Festwert optimie-
        rend, indem es das compilierte LIT durch LIT+ ersetzt, was beide Worte
        zusammenfaœt:
                .. HERE 30 + ..
        wird umgeformt zu
                .. HERE LIT+ 30 ..
        Verhindern l€œt sich das mit {0 is CMC}, oder auch durch:
                .. HERE -30 - ..
    >>> The "+" operator is now an optimizing immediate compiling word.

LIT+    wurde sicherheitshalber in das HIDDEN-Vocabular eingereiht. Bereits in
        den Screenfiles benutzte Aufrufe stellt man am besten auf {+} um und
        ‡berl€œt dem Compiler die Optimierung. Anderfalls muœ ggf. HIDDEN in
        die Suchfolge aufgenommen werden.
    >>> this word for safety was moved to the HIDDEN vocabulary.
        Some words in the screenfiles need to be modified, compiling with the
        HIDDEN-voc. included to the search order or, preferably, by rearranging
        to using {+} instead of {LIT+}.

>LOC    ( nn -- )
        Die Anzahl nn Zellen wird mit 0 initiiert.

"forth_asm"
        Neben den  nderungen zu o.a. Punkten wurde das create-Macro etwas
        gestrafft, was durch Wegfall einer Variablen wieder ein paar Labels
        mehr erm„glicht.
    >>> The "create" macro was slightly modified and now seems to leave some
        more label space to the assembler wich might enable a few more future
        modifications/extensions of the kernel.


* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

F6 Vers. 808 => 809, 4. Sept 1996:

Betroffen sind:
"QF" und "forth_asm", {SORT-L} in "forth_scr", "f6asm_scr", "f6task_scr"
 und "bh_scr". Alle anderen Bestandteile der Sammlung unver€ndert.

Ge€ndert:

Innere Namens-Schreibweise auf alten Zustand gebracht, stattdessen {ID.} so
ge€ndert, daœ die Namen groœgeschrieben erscheinen. Wortnamen k„nnen, wie
z.B. in "bh_scr" gezeigt, in unver€nderter Ausgabe nun zugleich wieder als
beschreibender Text des jeweiligen Aufrufs benutzt werden. Dazu ist ledig-
lich eine zweite Form der Namensausgabe erforderlich, {.ID} im Beispiel, wo
keine Umwandlung in Groœschreibung vorgenommen wird.
>>>
Old storage mode of forth names restored, while {ID.} "ANSIfied" to display
uppercase names.

Korrigiert:

WARNING
        wurde in CREATE als Variablenpointer ausgewertet, nicht als deren Wert,
        sodaœ die Meldung ‡berdefinierter Namen stets ausblieb.
    >>> WARNING again correctly evaluated by CREATE.

"forth_scr"
SORT-L in Ordnung gebracht (falsche Datenmanipulation beim Pointeraustausch).
   >>> item order bug fixed.

"f6asm_scr"
   >>> SR/CCR/imed related bugs concerning the ADD/AND group fixed.

Beim Immediate-Adressierungsz€hler fehlte der Leseoprator (scr 41).
Fehler hierdurch waren allerdings bisher nicht feststellbar, weder bei den
Pr‡fseiten am Ende von "as_gls", noch beim Assemblieren von "f6task_scr".

Bei XOR, und verwandten Mnemonics war die Fehlerabfrage verdreht, sodaœ
Speicher als Ziel nicht assemblierbar war und in Verbindung mit dem Status-
register Fehler auftraten (scr 55, 56).

Wenn der Assembler auch m„glichst viele Fehler abfangen soll, erfaœt er
jedoch l€ngst nicht jede m„gliche Fehlersituation, und es sind, wie das
Beispiel zeigt, auch die ‡berwachten M„glichkeiten nicht vollst€ndig
ausgetestet. - Wer solche Fehler findet, wird um Nachricht gebeten.

* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *

» eof »
