2000 3bba 0000 I ... HEADERSAVE 5.9
*****************************************************************
                     HEADER-SAVE V 5.9              (C) by RB
*****************************************************************

-Programmstandort: E000H-E3FFH Start: E3EEH 
                   eigentliche SAVE-LOAD-Routine E000H - E3EDH
                   fuer Grundversion Standort 3C00-3FFF, St:3FEE
-benutzte Zellen:
 DATA:  13H  Blockadresse des gelesenen Blocks
 ZILAD: 25H  zu lesende Blockadresse
 SOIL:  16H  Start of Input-Line
 ARG1:  1BH  Anfangsadresse File
 ARG2:  1DH  End   -"-
 ARG3:  23H  Start -"-
 DATA+2:15H  Zeichenzaehler bei Nameneingabe
 Pufferbereich Kopf: 0E0H-0FFH

-Die orig. SAVE/LOAD-Routine aus dem Monitor wird nicht benutzt.
-Beim Start wird die Kommandoschleife auf B0H geladen (B0H-B5H).
-Alle weiteren Aufrufe erfolgen mit @ ... .

SAVE: @S anfadr. endadr. startadr. ENTER
        danach Abfrage TYP und FILENAME
        TYP: C-COM-File selbststartend
             T-TEXT-File
             B-BASIC-Programm
             M-Maschinenprogramm, nicht selbststartend
             S-SOURCE-Assemblerquelle (Quelltext)
             P-PASCAL-Proramm
             D-DATA-Datenfelder
             I-Introduction, Informationen
             E-EPROM-Inhalte
             SPACE-ohne Typ
   FILENAME: max. 16 Zeichen (alles zugelassen, auch Space)

-Beim Abspeichern wird in jeden Blockkopf die physische Anfangs-
 adresse eingetragen, welche beim Einlesen ausgewertet werden kann.
-Das File bleibt trotzdem unter Weglassen des Kopfblocks mit 
 dem originalen Monitor-Load lesbar!
-Die Einfuehrung eines Memorypointers erleichtert die Kontrolle
 ueber den Abarbeitungsstand.
-Nach dem SAVE-Vorgang kann eine Verify-Funktion genutzt werden,
 die nur die Blockchecksummen ueberprueft. Der Memorypointer zeigt
 dabei wieder den Abarbeitungsstand und im Fehlerfall die Adresse
 des fehlerhaften Blocks an. Die Kontrolle erfolgt erst nach dem
 Lesen eines Kopfblocks und endet nach dem Lesen der zu dem File 
 gehoerenden letzten Kopfadresse. Alles, was gelesen wird, er-
 scheint als ASCII-Interpretation auf der obersten Bildschirmzeile.
-externer Aufruf: CALL SARUF (E003H) moeglichst ueber Sprungver-
 teiler (FFF4H). Der 1.Registersatz und AF' werden zerstoert!

  Parameteruebergabe: Zellen 1BH - Anfangsadresse
                             1DH - Endadresse
                             23H - Startadresse
                       Akku  3AH - Wiederholen der SAVE-Funktion 
                             mit gleichem Kopf (gilt auch fuer 
                             den Kopf eines vorangegangenen LOAD)
                            -Typuebergabe in H(IY), sonst H(IY)=0

-Bei Eingabe von @S:: wird die SAVE-Funktion mit den alten
 Kopf-Parametern ausgefuehrt. Diese koennen auch von der LOAD-Fkt.
 stammen (Nutzung zum schnellen Kopieren von Files).


LOAD :   @L  - Laden das naechstfolgenden Files ohne Namen-
               und Typkontrolle
         @LN - Laden eines Files mit Namen- und Typkontrolle 
               Es gilt, dass alles signifikant ist, was eingege-
               ben wird, das heisst, wird nur mit Enter quit-
               tiert, erfolgt fuer den Typ oder den Namen keine 
               Kontrolle. Es muessen nur so viele Zeichen einge-
               geben werden, wie fuer eindeutige Signifikanz 
               notwendig sind.

    Achtung:   Es muss darauf geachtet werden, dass der ge-
               waehlte Name auf dem Bildschirm stehen bleibt, da 
               kein Nameneingabepuffer existiert.

-Erfolgt der Aufruf mit X, z.B. @LNX oder @LXX, wird nach
 dem Laden auf einen Autostart bei COM-FILE's verzichtet 
 (X=alle Zeichen ausser SPACE).
-Der Rechner befindet sich so lange in einer Warteschleife, bis
 ein gueltiger Kopf gelesen oder mit BREAK (S4-K, CTRL-C) 
 abgebrochen wird. Der Abruch gelingt nur bei anliegendem Signal,
 ansonsten mit RESET. Ungueltige Koepfe werden angezeigt. Nach
 sieben Koepfen ist der gewaehlte Name aus dem Bildschirmbereich
 gelaufen und es ist kein Laden mehr moeglich.
 Man sollte also wenigstens in die Naehe des gesuchten Files spulen.
-Soll ein File auf eine andere Adresse geladen werden, als die 
 im Kopf angegebene geladen werden, ist es moeglich, eine neue 
 Anfangsadresse anzugeben: @L XXXX.
 Es werden dabei automatisch der Autostart gesperrt und die neue
 Anfangs- und Endadresse errechnet sowie angezeigt.
 Diese Funktion ist nur ohne Namensignifikanz nutzbar! (bei exter-
 nem Aufruf auch mit)
-Sollte bei einem File, welches mit Blockadressen aufgezeichnet 
 wurde, ein Lesefehler auftreten oder ein Block ueberlesen worden
 sein, so wird das Einlesen unterbrochen und eine Fehlermeldung
 ausgegeben. Durch kurzes Zurueckspulen und Druecken von ENTER kann
 versucht werden, den fehlerhaften Block noch einmal zu lesen
 (analog KC 85/1). Der Memorypointer erscheint, wenn der
 Ladevorgang fortgesetzt wird.
-Files ohne Kopfblocknummern (Versionen unter 5.0) koennen ab
 Version 5.8 nicht mehr gelesen werden. Es wird nur der Kopf 
 angezeigt und das Einlesen wird mit "bad record" unterbrochen.
-Wird ein Blockkopf mit Inhalt 0FFFFH gelesen, wird der Ladevor-
 gang mit "bad record" abgebrochen.
-externer Aufruf: CALL LORUF (E000H) moeglichst ueber Sprungver-
 teiler (FFF1H). Der 1.Registersatz und AF' werden zerstoert.

  Parameteruebergabe:

   * H(IY)=0 - Typ wird abgefragt
     H(IY)=Typkennzeichen -> Typvorgabe -> keine Abfrage Typ
   * A=0     - ohne signifikante Kopfkontrolle
     A=4EH   - mit signifik. Kopfkontrolle, Typ- &> Namenabfrage
     A=41H   - ohne Kopfkontrolle
   * L(IY)=20H  - Freigabe des Autostarts bei COM-FILE's

-Beim Laden auf eine neue Anfangsadresse muss auf Zelle 1BH die
 neue Anfangsadresse uebergeben werden ( > 0FFH), ansonsten muss 
 die Zelle mit 0 initialisiert werden.
-Fuer den externen Aufruf wurden noch weitere Unterprogramme zu-
 gaenglich gemacht:

 CALL BLMK (E00CH; SPV: FFC7H) - Lesen eines Blocks
           Parameteruebergabe:
           Zellen 25H/26H * Kopfinhalt des zu lesenden Blocks
           HL             * Ladeadresse des Blocks
           Return:
           Zellen 25H/26H * Kopfinhalt + 20H
           HL             * HL:=HL+20H

 CALL BSMK (E00FH; SPV: FFC4H) - Schreiben eines Blocks
           Parameteruebergabe:
           HL  * Quelladresse Block
           IX  * Kopfinhalt
           DE  * Anzahl der Sync.-Bits
           Return:
           HL  * HL:=HL+20H

CALL SUCHK (E012H; SPV: FFC1H) - Suchen eines Kopfblocks und 
           Uebergabe des Inhalts im Kopfpuffer (E0-FFH), wo er 
           vom aufrufenden Programm ausgewertet werden kann.

CALL AKP   (E015H; SPV: FFBEH) - Aufbereitung Kopfpuffer
           Parameteruebergabe wie bei SARUF


Kopfaufbau: Byte 0 - 1  Anf.adr.
                 2 - 3  Endadr.
                 4 - 5  Startadr.
                 6 -0BH frei fuer Zusatzinformationen
                    0CH Typkennzeichen
                0DH-0FH 3 x 0D3H = Kopfkennzeichen
                10H-1FH 16 Byte Namensblock

Hinweise, Fehler bitte an R. Brosig, W.Florin 2c, COSWIG, 8270.