* CDISK * COPIERPROGRAM fr GANZE DATENTRGER/DIRECTORIES * .hpr'2.2.1997 *

                        -= VERSION CD16 =-
                      (immernoch etwas beta)

          (C) 1996 by H-Peter Recktenwald, Berlin-Friedenau
          T.: ++49 30 8520413    Inet: phpr@berlin.snafu.de

(Wer diesen Text in eine andere Sprache bertrgt und der Dokumentation
(beifgt, sei meines Dankes gewi... - .hpr.

        Wer eine ltere CDISK-Version schon installiert hat, sollte
        wenigstens die HINWEISe zu den Korrekturen und Ergnzungen
        lesen. Sie finden sich am Schlu dieses Textes.

Rechtliches:
        Das Programm darf nur kostenlos und zusammen mit dieser
        Darstellung beilufiger Beobachtungen ber das zufllig
        dadurch Geleistete sowie der beigefgten Kurzfassung in
        englischer Sprache in unvernderter Form weitergegeben
        werden; Zusagen werden ber diese Erlaubnis hinaus nicht
        gemacht, Gewhrleistung ist ausgeschlossen.

Zweck:
        berschreibend Copieren oder Verlagern des Inhalts ganzer
        Datentrger oder ausgewhlter Directories mit oder ohne
        Unterverzeichnisse auf einen oder mehrere andere Datentrger
        oder in dort schon existierende Directories.

        Directories der Quelle werden im Ziel automatisch gleich-
        lautend angelegt. Das Datum der Quellen wird mitbertragen.

        Zustzliche Betriebsarten zum bertragen nur neuer und
        berschreibend Copieren nur jngerer Dateien sowie zum
        nur Lschen aller Files resp. Lschen nach bertragung.

        Beim Copieren zwischen unterschiedlichen Filesystemen wird
        "."&postfix von M.S.- oder Atari-DOS-Formaten automatisch
        in "_"&postfix bertragen, wenn das Ziel im QDOS-Format
        vorliegt, und umgekehrt, sofern das Betriebssystem selbst
        diese Formate bedient (z.B. SMSQ).

Beispiele:
        in der englischsprachigen Kurzbeschreibung sowie in Gestalt
        des mit zugehrigen Texten beigefgten Programms "CBACK".

Laden:
        Mit LRESPR; danach steht die Procedur CDISK zur Verfgung,
        sowie die fr ltere Systeme nachgesetzte Funktion ERNUM.
        Bei MGx-Roms sind sie u.U. erst nach NEW o.dgl. aufrufbar.
        Besondere Vorkehrungen kommen zum Tragen, sofern wenigstens
        der Codeblock DVS der IO2-Sammlung irgendwann vorher gela-
        den wurde. Dann sind die Kommandos stets sofort verwendbar.
        Fr RESPR/CALL: Die Codelnge liegt unter 3K Bytes.

Systemanforderungen:
        Keine speziellen Erfordernisse. Der Code ist ROM-tauglich.
        Fr den Aufruf mssen ca. 10K Speicher frei sein.

        Er wurde im Schwarzen QL mit Minerva und GC entwickelt und
        dort ausfhrlich sowie anhand einiger Beispiele in der QXL
        sowie im GC-erweiterten QL mit MGG, JS und JM erprobt. An
        Datentrgern wurden RAM-Disk, MDV (auch ber Netz), WIN und
        FLP in den Formaten DD, HD und ED bei unterschiedlichen
        Systemkonstellationen in den Versuchen mit Erfolg benutzt.

        Die Directory-Typencodierung wird aus der Quelle ermittelt,
        die Zielcodierung geschieht ohnhin immer durch das System.
        Damit sind diesbezglich keine Einschrnkungen bei vom QL
        abweichender Codierung gegeben. Der Transport zwischen
        unterschiedlichen File-Systemen, etwa THOR nach QL, ist
        mglich, sofern nur die benutzte bertragungsstrecke die
        bermittlung von Fileheadern und Directories erlaubt.

        Mit beliebigen (wirklich!) QDOS-compatiblen Systemen, auch
        ohne TK2, und mit den lteren Devicehandlern des Standard-
        gerts sind keine Schwierigkeiten zu erwarten - wenngleich
        anfangs ein paar Versuche sicher nicht schaden werden...

        Auch unkonventionelle Diskettenformate sind kein Hindernis.
        So knnen vllig problemlos etwa auf 1600K Bytes formatierte
        HD-Disketten mit 80 Spuren zu 20 Sectoren in Blcken mit je
        vier Sectoren benutzt werden (mein privates Standard-Format).

        Da fr den Transport die Slave-Block-Verwaltung des QL aus-
        genutzt wird, hngt die Arbeitsgeschwindigkeit entscheidend
        vom verfgbaren und gleichbleibend freien Speicher ab.
        Reicht der Platz fr den gesamten Datentrgerinhalt aus,
        und werden zwischendurch keine neuen Jobs (Programme) in
        Betrieb genommen, beschleunigt sich auch mehrfaches Copie-
        ren desselben Datentrgers. Der Umweg ber eine RAM-Disk
        ist dann kaum erforderlich und wirkt u.U. sogar verzgernd.

        Einstellungen wie "FLP_SEC 2" verzgern ebenfalls, da dann
        jede einzelne Datei unmittelbar nach Schlieen ihres Kanals
        auf das Ziel bertragen wird. Die erhhte Sicherheit dieser
        Einstellung ist fr CDISK jedoch vielfach entbehrlich, die
        schnellere Arbeit bei "FLP_SEC 0" wird darum vorzuziehen sein.
        Dann ist lediglich darauf zu achten, da die Datentrger
        nicht vor Stillstand der Laufwerke daraus entfernt werden.

Aufruf:
        CDISK [#Fehlerkanal,[#Anzeigekanal,]] Quelle$,Ziel$ [,Format$]

Parameter:
        Namen werden als Strings oder Namen von Fliekomma-Variablen
        angenommen. Die Schreibweise gro oder klein ist mit Ausnahme
        von Diskname$ beim Update (s.u.) gleichgltig.
        Zahlen sind Integer (wie die "%"-Variablen im Basic).
        Ist irgendeiner der ersten drei angegeben, sind bei lcken-
        loser Folge die weiteren Parameter optional.

        Trennzeichen
        zwischen den Parametern sind mit Ausnahme folgender zweier
        Sonderfunktionen gleichgltig:

        Trennzeichen "!"        - erstes Trennzeichen
        Zur Unterbindung jeglichen Fehler-Abbruchs kann als
        erstes Trennzeichen ein "!" eingetragen werden. Dann
        ist nach dem Aufruf nur ERNUM mit der entsprechenden
        Fehlernummer besetzt.

        Trennzeichen "!"        - zweites Trennzeichen
        Sollen keine Unterverzeichnisse bernommen werden,
        setzt man als zweites Trennzeichen ein "!", unabhngig
        davon, ob noch Parameter folgen.

        #Fehlerkanal            - Integer-Zahl, Vorgabe #1
        Die Procedur bricht bei beschdigten Dateien nicht ab.
        Diese werden ggf. als Fragmente bernommen, um fr den
        Notfall wenigstens den (noch?) lesbaren Teil zu retten.
        Meldung solcher Fehler gelangt in den Kanal #1, oder #0,
        falls #1 nicht vorhanden ist.
        #Fehlerkanal kann angegeben werden, um diese Meldungen
        in einen beliebigen anderen Kanal des aufrufenden Jobs
        von Basic-Struktur (Stamm-Basic, Minerva, Qlib, SMSQ)
        zu leiten. Eine negative Zahl unterdrckt die Ausgabe.

        #Anzeigekanal           - Integer-Zahl, Vorgabe -1
        Mit denselben Parametereigenschaften wie #Fehlerkanal.
        Ist dieser Kanal angegeben, wird dorthin der Name der
        jeweils erfolgreich bertragenen Datei geschrieben.
        Wirkt nur, wenn beide Kanalposten besetzt sind.
        Ein Doppelpunkt markiert das Ende eines jeden Namen,
        um evtl. daran anhngende Leerzeichen zu "entlarven".
        Zur Anzeige und Fehlerausgabe taugen alle Kanalarten,
        das Protokoll der bertragenen Dateien kann z.B. zum
        Drucker oder in eine Datei geleitet werden.

        Quelle$                 - Vorgabe "FLP1_"
        Gibt an, von wo copiert werden soll.
        Geeignet sind beliebige Datentrger- oder Directory-
        Namen, auch der Transport ber Netzwerk ist mglich.
        Fr Copien ganzer MDV-Laufwerke sind jedoch andere Ver-
        fahren oft besser geeignet (FORMAT"ram1_mdv1_" im TK2).
        Wird ein (Sub-)Directory angegeben, werden nur die darin
        enthaltenen Files bertragen, sein Name wird nicht auf
        das Ziel bertragen:
                CDISK flp1_t1_,flp2_
        bertrgt die Dateien "flp1_t1_xxxx" nach "flp2_xxxx".
        Der einfache Gertename kann um Directoryerweiterungen
        ergnzt werden, was den Copiervorgang dann darauf und
        die darin enthaltenen Verzeichnisse beschrnkt.

        Ziel$                   - Vorgabe "RAM1_"
        Mit denselben Erfordernissen wie fr Quelle$.
        Wird hier ein (Sub-)Directory angegeben, wird der
        Inhalt der Quelle dort eingeordnet:
                CDISK flp1_,flp2_t1_
        bertrgt die Dateien "flp1_xxxx" nach "flp2_t1_xxxx".

        Ist das Ziel ein bereits existierendes RAM-Laufwerk,
        das nicht von CDISK erzeugt wurde, sollte es zuvor mit
        FORMAT ganz freigegeben werden: Weil das Ziel erst nach
        Anlegen von ca. 7K Puffer erkennbar wird, es also erst
        danach gelscht werden kann, ergibt sich vorbergehende
        Speicherfragmentierung, wodurch selbst eine "dynamische"
        RAM-Disk sich u.U. nicht auf die ntige Gre ausdehenen
        lt (s.u. bei Format$).

        Format$                 - optional, Vorgabe leer
        Als voller Name, wie er zum Formatieren eines Daten-
        trgers geeignet ist; kann optional bergeben werden.

        Dann wird der Ziel-Datentrger zuerst formatiert.
        Die damit verbundene Prfung des Datentrgerzustandes
        ist gerade fr Sicherungscopien wertvoll.

        Ist das Ziel ein RAM-Laufwerk, wird stets zuerst eine
        leere "dynamische" RAM-Disk angelegt.
        Wurde Format$ angegeben, wird die RAM-Disk "statisch"
        auf etwas ber die Gre des besetzten Bereichs des
        Quellenlaufwerks formatiert.
        In letzterem Falle entstehen keine "echten" Directorys.

        Ziel und zu formatierendes Gert mssen nicht identisch
        sein, z.B.:
                CDISK flp2_,flp1_,win3_2

        Gleichlautende Gertenamen fr Quelle und Format$
        werden mit Fehler "err.ro" abgefangen ("nur Lesen").
        VORSICHT bei SMSQ/E und QXL (s.u.)!

Verlagern:
        Format$="MOVE"          - alternativ zu Format$
        veranlat, da nach dem Copieren die Quellen gelscht
        werden; zugehrige Unterverzeichnisse eingeschlossen,
        das bergeordnete Directory bleibt leer erhalten.
        Gleichzeitiges Formatieren des Ziels ist nicht mglich.

        Diese Option eignet sich auch zum Umbenennen von Files
        einschlielich Subdirectories im selben Datentrger.
        Da das ebenfalls durch bertragen mit neuem Namen und an-
        schlieendes Lschen der Quelle geschieht, mu wenigstens
        soviel Platz im Datentrger frei sein, wie die lngste
        Datei erfordert. Zweck dieser Vorgehensweise ist, auch
        hier die Sonderbearbeitung, z.B. zum Comprimieren, beim
        Aufruf aus Assembler-Progarmmen (oder in einer vielleicht
        folgenden erweiterten CDISK-Version) zu ermglichen.

Update:
        Format$:="UPDT"         - alternativ zu Format$
        Format$:=Diskname$      - dto. mit Medium-Kontrolle
        Format$:="NAME"         - dto.
        veranlat, da nur Dateien bertragen werden, die
        entweder im Ziel nicht vorhanden sind, oder die in
        der Quelle jnger sind, als im Ziel.

        Der Text "UPDT" gilt allgemein, zustzliche Kontrollen
        finden nicht statt. Wurde aber der Name angegeben, mit
        dem das Zielmedium formatiert ist, prft CDISK vor dem
        Copieren, ob es tatschlich diesen Namen trgt, und
        bricht widrigenfalls mit err.bn (-12) sofort ab. Wird
        der Text "NAME" eingesetzt, copiert der Aufruf nur,
        wenn Quellen- und Zielmedium denselben Namen tragen.

        In Diskname$ ist mit Ausnahme o.g. Sondertexte jeder
        Text ohne Unterstrich "_" an fnfter Position zulssig,
        beim Namensvergleich wird die Schreibweise beachtet.

        HINWEIS:
        Es ist klar, da diese Varianten nur dann zuverlssig
        spielen, wenn die System-Uhr richtig eingestellt ist.

Lschen:
        Format$:="MPTY"         - alternativ zu Format$
        Das Quellendirectory wird samt Subdirectories gelscht.
        Ein formales Ziel mit anderem Namen als die Quelle mu
        angegeben werden, Auswirkungen darauf gibt es nicht.

Monster-Backup (gilt fr jede Art CDISK-Aufruf):
        Wenn das Zielmedium voll ist, und ein gltiger Fehler-
        kanal (Vorgabe oder anderes Fenster) existiert, hlt die
        Procedur nach kurzem Tonsignal mit einer Meldung an. Dann
        ist es mglich, die bertragung auf einem neuen Datentrger
        im selben Laufwerk fortzusetzen, oder ganz abzubrechen.

        Dateien werden nicht geteilt. Das Fragment der letzten evtl.
        unvollstndig bernommenen Datei wird im ersten Zeichen des
        Namen nach Mglichkeit mit '#' markiert und bleibt erhalten.
        Die ganze Datei wird beim nchsten Versuch erneut bertragen.
        Smtliche Directories werden im ersten Datentrger angelegt.
        War ein Formatname angegeben, werden auch die Fortsetzungs-
        Datentrger damit formatiert.

        HINWEIS:
        Es ist unbedingt darauf zu achten, da der Datentrger
        erst nach Stillstand des Ziellaufwerks ausgetauscht wird.

Abbruch:
        Bei direktem Aufruf aus einem SBasic-Job ist Abbruch ohne
        Fehleraktion mit <break> mglich, der nach der gerade im
        Gange befindlichen bertragung wirksam wird. Auerdem wird
        nach jeder bertragung der Fehlerkanal auf Eingabe eines
        <ESC> abgefragt, wonach CDISK dann ebenfalls abbricht.

Fehler-Aktionen:
        Fehlt einer der erforderlichen Parameter, oder ist ein
        Parameter ungeeignet, bricht die Procedur mit Fehler-
        meldung ab; ebenso bei unbrauchbaren Datentrgern.

        err.bn (-12) entsteht z.B. durch zu lange Filenamen, wie
        sie etwa bei bertragung in eine zustzliche Direktory-
        Stufe entstehen knnen. CDISK bricht dann ab. Zweck-
        mig copiert man nun zuerst die Dateien mit zu langen
        Namen durch Verkrzen eines oder mehrerer Subdirectory-
        namen mit der 'MOVE'-Option in dafr passend angelegte
        (Sub-)Directories um, und ruft CDISK erneut auf.

        Abbruch mit err.ro ("nur Lesen") erfolgt, falls die Quelle
        auch als Gert zum Formatieren angegeben wurde (die ersten
        vier Zeichen der Gertenamen werden verglichen).

        Treten beim Copieren Fehler auf, wird neben dem Namen der
        verursachenden Datei die entsprechende Systemmeldung in
        den Fehlerkanal geschrieben. Die betr. Copie bleibt als
        Fragment erhalten und die Procedur fhrt mit der nchsten
        Datei fort. In MINERVA-Systemen, oder wo der TK2 vorhanden
        ist, wird das erste Zeichen im Namen der Copie schadhafter
        Dateien mit einem "#" berschrieben. Ansonsten lassen sich
        solche Fragmente an der Lnge und am Filedatum erkennen,
        das nur bei vollstndigen Dateien konserviert wird.

        Bei fehlerfreiem Verlauf, und sofern nicht ein Ausgabekanal
        gesondert benannt wurde, werden keine Meldungen ausgegeben.

        Soll jegliche Unterbrechung verhindert werden, was z.B.
        bei compilierten Programmen hilfreich sein kann, bergibt
        man den ersten Parameter mit "!" als anschlieendem Trenn-
        zeichen. Die Procedur kehrt dann immer ohne Abbruch zurck,
        die wirkliche Fehlercodierung wird in ERNUM (oder Q_ERR)
        notiert und ist in einem Programm entsprechend auszuwerten.
        Hierzu auch "THROW" aus der IO2-Sammlung (Vers. ab 11/1996).

Compilieren:
        Der fr die $$asmb-Direktive erforderliche Abstand vom Codeanfang
        zur bp.init-Tabelle wird am Ende der Startmeldung beim Laden der
        CDISK-Erweiterung angezeigt, z.B. 64 bei
                "CD16 .hpr'25/12/96 :64:"

ERNUM
        fehlt in JM und lteren Systemen. Die Funktion wurde mit in
        den Code aufgenommen, um das Programm "CBACK" zu untersttzen
        und, da dies der einzige sonst fehlende Aufruf ist, es von
        anderen SBasic-Erweiterungen unabhngig zu machen. Konflikte
        mit bestehenden Systemen gibt es nicht, im Gegenteil wurde
        so auch ein Fehler lterer TK2-Versionen unschdlich gemacht.
        Eine darin als Text frei definierte Fehlermeldung kann bei der
        ERNUM-Verarbeitung sonst das System zusammenbrechen lassen.
        In diesem Fall (err.df), und bei entsprechenden anderweitig
        eingebauten Fehlercodierungen derselben Art, liefert
                ERNUM = -19  (err.ni)

Systemfehler:
        CDISK arbeitet mit wirklich QDOS-compatiblen Systemen ohne
        Fehler, wobei die Originaldokumente von Karlin/Tebby und
        Dickens sowie die Verffentlichungen von Tebby zum Disketten-
        Standard (ergnzt um "level 2"), an denen die Deklaration
        "QDOS-compatibel" zu messen ist, zugrundegelegt werden.

        Formatieren ber Netzwerk ist aufgrund der Eigenheiten des
        File-Servers nicht mglich - nicht Fehler, eher Sicherheit.

        Die reichlich abenteuerliche Markierung von Directories durch
        die alleinige Tatsache der File-Lnge Null, wie in einem in
        Mailboxen kursierenden Text angegeben, bleibt unbercksichtigt.
        Es kommen schlielich auch leere Dateien regulr vor, und dies
        steht keineswegs im Widerspruch zu irgendeiner QDOS-Konvention
        oder sonstigen Gepflogenheit.
        Mit solcherlei Absurditten spielt CDISK vermutlich nicht, und
        es wird an dergleichen Unsinn gewi nicht angepat werden.
        Nebenbei fanden sich Fehlerberichte aus demselben Text im
        Zusammenhang mit der bertragung leerer Dateien ber Netz nicht
        besttigt, weder im QL mit Minerva noch bei der QXL mit SMSQ
        oder im "normalen" JS-QL mit Trumpcard.
        Die Beschreibungen genannter Phnomene drften wohl eher aus
        kenntnisloser Deutung anderer Fehler entstanden sein, nur zur
        Sicherheit sollte hier aber dennoch darauf hingewiesen werden.

        Es gibt fehlerhafte TK2-Versionen, insbes. aus der bergangs-
        zeit zum Level-2- und spter dem Level-3-Handler sowie manchen
        GC-Varianten. Damit knnen trotz aller Schutzmanahmen (nicht
        nur) bei Verwendung von CDISK irreparable Schden entstehen.

        Zur Directory-Tauglichkeit ist eine recht sichere Probe der
        Versuch, eine Datei "flp1_" zu ffnen. Wenn dann Fehler auf-
        treten, ist dort CDISK keinesfalls zusammen mit den "echten"
        Directories verwendbar. Auch "MAKE_DIR" kann Aufschlu geben.

        Vorsicht mit SMSQ/E!
        Zusammen mit den bei der Prfung verfgbaren Versionen traten
        u.a. untengenannte Fehler auf, die es angeraten sein lassen,
        sich dort immer erst der einwandfreien Funktion von CDISK zu
        versichern, bevor Dateien mit wertvollem Inhalt verlorengehen:

        "Level 3" (z.B. SMSQ) ist keineswegs immer konfliktfrei mit
        "Level 2" (z.B. QDOS mit GC oder SGC). Es gibt gravierende
        Unterschiede in der Disketten-Datenstruktur, die offenbar
        nicht immer vollstndig bewltigt wurden. Es traten bereits
        fatale Fehler auf, etwa bei dem Versuch, teilweise belegte
        Disketten aus dem GC-QL mit dem QXL-System weiterzubearbeiten.
        Was u.U. auch an dem mit Sicherheit fehlerbehafteten GC-Rom
        in Version 2.49 liegen mag. Treten solche Fehler auf, wende
        man sich also an die betr. Lieferanten.

        Beim Einsatz von CDISK im SMSQ/E mit QXL mit gleichzeitiger
        Formatierung gab es weitere merkwrdige Erscheinungen. Im QL
        vorher einwandfrei mit demselben System, aber auch mit den
        Standard-QL-Roms, formatierte HD-Disketten wurden auf ganze
        "72/72 Sectoren" formatiert, bei DD waren es "36/36 Sectoren".
        Es ist klar, da CDISK mit Formatier-Option dann scheitert.
        Formatieren der WIN-Dateien verlief dagegen einwandfrei.
        Stereotype Hinweise auf ein ..DOS sind unbefriedigend, denn
        weder im PC mit Win*ows oder "nur" ..DOS, noch im Linux auf
        demselben Gert, sind solche Fehler jemals aufgetreten.

        Die '#'-Markierung von Dateifragmenten kommt im SMSQ/E 2.77
        mit QXL nicht an, mit derselben(!) Version im GC-QL ist die
        Procedur aber in Ordnung - im wirklichen QL ohnehin.

        Auch vor allzu hektischer Handhabung kann nur gewarnt werden:
        Falls eine Diskette whrend eines Lesevorganges aus dem
        Laufwerk genommen wird, kann es vorkommen, da von da an
        kein Floppy-Laufwerk mehr erkannt wird. Evtl. erforderliche
        Datensicherung ist dann nur noch auf MDV mglich, im QL mit
        SMSQ gehen solche Daten demnach rettungslos verloren!

        Bei sehr groer Anzahl einander untergeordneter Sub-Directories
        - das System erlaubt aufgrund der maximalen Namenslnge bis zu
        16 davon - kann es zu Stackfehlern kommen, wenn das den Aufruf
        tragende SBasic noch "frisch", und darin nur der als Minimum
        garantierte Platz von 256 Bytes im Stack verfgbar ist (s.u.).
        Wirksamkeit der Sicherheitsmanahme in CDISK ist mangels Gele-
        genheit in den Extremfllen (noch) nicht geprft.
        Bei QLIB-Programmen setzt man hilfsweise die Standardzuweisung
        mit der $$stak-Direktive entsprechend hher (min. 328 Bytes fr
        CDISK), Anpassung beim Aufruf aus Assemblerprogrammen (s.u.).
        ist vllig problemlos.

Direkter Aufruf aus anderen (Assembler-)Programmen:
        - Bei Fragen hierzu bitte e-mail an 'phpr@berlin.snafu.de' -

        An Adresse 2 vom Codeanfang gezhlt steht in .W-Lnge der auf
        diesen Ort bezogene Abstand zum Einsprung in den Programmcode,
        dem die folgenden Daten zu bergeben sind:
                D3  =/= 0 wenn ein Formatname angegeben wurde
                A4      Adresse+8 des Pointers auf die zur Freigabe
                        mit mt.rechp zu verwendende Basisadresse eines
                        mit mt.alchp reservierten Arbeitspuffers, des-
                        sen Mindestgre als 16-Bit-Wert an Position 4
                        ab Codeanfang steht.
                A6      mu so justiert sein, da an der Stelle
                        $8f(a6) ein negatives Byte steht. Wird es
                        positiv gesetzt, bricht die Ausfhrung ab.
                A7      mu 360 Bytes Stack-Nutzung zulassen.

        Werden Einsprung und Puffergre stets und als vorzeichenlose
        Werte aus dem Code gelesen, bleiben damit arbeitende Programme
        versionsunabhngig. Die Daten-Positionen ab -12(A4) liegen fest.

        Im Puffer, auf den A4 zeigt, sind vorzuhalten:
                Posn    Inhalt
            - bis hier - frei fr Anwendungsdaten/-Programme.
                -12     Marke '%SB%', wenn der Aufruf aus dem Basic kam,
                        nur dann wird abschlieend $8f(a6) negativ gesetzt.
                 -8     Freigabeadresse fr diesen Speicherblock
                 -4     Null oder Sonder-Routine zur Datenbertragung (s.u.)
                        mit ihrer wirkichen Speicheradresse.
        -->      00     Adresse, auf die A4 zeigt
                 10 .b  Flag negativ unterdrckt Subdirectory-bertragung
                        Flag grer Null zum nur Lschen der Quelle.
                 11 .b  Flag negativ unterdrckt berschreiben jngerer Dateien
                        Flag grer Null zum Lschen der Quelle nach bertragung
                 12 .w  Lnge des ganzen Quellennamen mit abschlieendem
                        '_' Unterstrich ( z.B. 14 bei N1_FLP1_files_ ).
                 14 .w  Anteil des Gertenamen darin (8 im obigen Beispiel)
                 16 .w  Lnge des ganzen Zielnamen, wie oben
                 18 .w  Zieldevicename, wie oben
                 20 .l  -1 oder Kanal-ID zur Fehlerausgabe
                 24 .l  -1 oder Kanal-ID zur Anzeige
                 32 .b*128 count.w + max. 126 Zeichen ganzer Quellenname
                160     Zielname, dto.
                288     Formatname, dto., oder leer
                418 .l  Adresse des bertragungspuffers
              - hier -  setzen evtl. sptere CDISK-Ergnzungen an, danach
          bertragungspuffer  4*3*512 Bytes Puffer fr den Datentransport.

        Der Aufruf benutzt smtliche Register, nur
                A6 bleibt unverndert, und
                A7 wird mit dem ursprnglichen Inhalt zurckgegeben.
                D0 geht mit dem Fehlercode zurck.
        Der bergebene Puffer wird zum Schlu aufgelst.

        Bei der Speicher-Zuweisung fr den Returnstack ist zu beachten,
        da die Procedur recursiv je (Sub-)Directory durchlaufen wird.
        Dabei gelangen jeweils fnf Langwortposten in den Returnstack;
        mit der maximalen Schachtelungstiefe fr Subdirectories von 16
        summiert sich das zu 328 Bytes, die inneren(!) Proceduren-Rck-
        sprnge eingeschlossen.

        Durch die in -8(A4) abgelegte Basisadresse fr die Freigabe des
        Hilfsspeichers wird das Programm von einer fix vorgeschriebenen
        Speichergre unabhngig. In beliebig greren Speicherblcken
        knnen dadurch auf den niedrigeren Adressen anwendungsbezogene
        Daten oder Programmteile verwaltet werden.
        Zu hheren Adressen hin darf die Struktur nicht verndert werden.

        In -4(A4) kann die Adresse einer Routine bergeben werden, die
        den eigentlichen Datentransport erledigt. Damit ist es mglich,
        auch mit Filtern oder etwa einem Kompressionsprogramm zu arbeiten.
        Rckstellen auf Standardverarbeitung durch Nullsetzen des Vectors.
        Beim Einsprung stehen bereit:
                D2 .w   Freier Bereich im Puffer (s.u.)
                D7      Gre in Bytes einer Zuweisungseinheit im Ziel
                A0      Filekanal des Ziels
                A1      Beginn des Datenpuffers
                A3      Filekanal der Quelle
        Zurckzugeben sind
                D0      QDOS-Fehlercode des Schreibaufrufs zum Ziel
                D1 .w   Anzahl gesendeter Bytes
                D4/D5/D6/D7     unverndert
                A0              unverndert
                A2      QDOS-Fehlercode des Leseaufrufs aus der Quelle
                A3/A4/A5/A6     unverndert

        Der vectorisierte Programmteil empfngt und sendet die Daten
        eines File in mehreren Blcken.

        Nach jedem Einzel-Aufruf werden die Fehlercodes bewertet:
        EOF in A2 signalisiert das Ende der bertragung. Die Dateien
            werden geschlossen und die Zieldatei erhlt das Filedatum der
            Quelle. Der Code ist in diesem Falle Signal fr ordentlichen
            Abschlu der bertragung und gilt nicht als Fehler. Da nur
            der Abbruchcode aus A2 als End-Signal dient, knnen durch
            die Sonderroutine beliebig lange Dateien bertragen werden.
        NULL in A2 bedeutet, da weitere Daten zu bertragen sind, da
            das Dateiende der Quelle noch nicht erreicht wurde.
        A2  gibt ansonsten die Fehlercodierung vom Lesen an, bei Werten
            =/= 0 wird die bergabe der betr. Datei beendet.
        D0  enthlt den Fehlercode des Sendeaufrufs. Bei jedem Fehler
            hierin wird die gesamte bertragung abgebrochen, sofern nicht
            bei Abbruch wegen vollen Zielmediums durch Tastatureingabe die
            Fortsetzung auf einem anderen Datentrger akzeptiert wurde.

        Soll eine uere Routine das betr. File in einem einzigen Aufruf
        ganz bearbeiten, mssen EOF-Signal (-10) in A2 und Null in D0
        zurckgegeben werden. err.df (-11) darf nur zurckgegeben werden,
        wenn ein erneuter bertragungsversuch veranlat werden soll.
        D1 wird nicht ausgewertet.
        Die anderen Register sind mit den o.a. Werten zurckzugeben.
        Der nutzbare Datenpuffer ist um die in D5 enthaltene Zahl grer,
        als der Wert von D2 (nur!) beim ersten Aufruf.

Korrekturen, Ergnzungen:

Vers. CD15/CD16:
        1. "MPTY"-Option zum nur Lschen der Quelle zugefgt.
        2. Anzeige des Abstandes zur bp.init-Tabelle fr $$asmb bei QLib.
        3. Netzwerk-bertragung auch via SER-Net.
        4. '#'-Position bei Markierung der Namen verstmmelt ber
           Netz geholter Files korrigiert.
        5. Fehler bei '#'-Markierung nach err.df-Abbruch korrigiert.
        6. Ergnzte Directory-Bearbeitung und '.'/'_'-Erkennung.
          (Fr Filenamen der Art 'flp1_dir_file_1.a', aus denen
          (vorher z.B. bei QL->M.S. 'flp1_dir_file.1.a' wurde.
        7. Automatische Erkennung der Directory-Filetypencodierung.
        8. Aufrufkonvention fr bertragungsroutine gendert (s.o.)
        9. Tastatur-Abbruch auch durch Eingabe von <ESC> im Fehlerkanal.

Vers. CD14:
        1. Codelnge berschreitet 2K; fr RESPR sind nun 3K sicher.
        2. Automatische Anpassung von Postfix-Trennzeichen bei Atari-
           oder M.S.-Dos-Filenamen an den QDOS-Typen, oder umgekehrt.
        3. Vor Eingabeanforderung zur Fortsetzung auf einem weiteren
           Datentrger ertnt ein kurzes Signal.
        4. Fehler der OPEN_DIR-Trap durch Textvergleich umgangen,
           Auswahl nach Pseudo-Directories damit vervollstndigt.
        5. "MOVE"-Option fr Format$ zum Lschen der Quelldateien
           und -Directories nach erfolgreichem Copiervorgang.
        6. Format$ ohne Laufwerksnamen gilt als Update-Prfname,
           sofern nicht eine der Sonderoptionen zutrifft.
        7. "NAME"-Option; wie 6., wobei aber der Name der Quelle als
           Freigabekriterium gilt.
        8. Returnstack-Platz (versuchshalber) auch fr Basic-Aufrufe
           Recursions-sicher - hoffentlich, wird sich zeigen, Fehler
           traten bislang ohnehin nicht auf (wenige Subdirectories).
        9. Datentransfer je File und blockweise vectorisierbar.

Vers. CD13:
        1. reserviert richtige RAM-Disk-Gre auch bei Quellen, die
           "echte" Directories enthalten.
        2. Recursionsfehler nach verdorbenen Filenamen (ber 127
           Bytes Lnge im Header angegeben) beseitigt.
        3. "UPDT" statt eines Formatnamen sorgt fr bertragung nur
           neuer Dateien und solcher, die in der Quelle jnger sind,
           als im Ziel.
        4. Als Directorynamen werden auch Namen von Variablen im
           Fliekommatyp angenommen, unabhngig davon, ob ihnen ein
           Wert zugewiesen wurde oder nicht.

 .hpr'97  eof 
