3000 6117 0000 I ... HEADERSAVE
**************************************************************
*              HEADER-SAVE V 5.95               (C) by RB    *
**************************************************************

Ausfuerliche Beschreibung des Programm HEADER-SAVE mit einigen
Anmerkungen fuer Neueinsteiger:

-Programmstandort:
      E000H-E3FFH Start: E3EEH  >CRC=8008<
      eigentliche SAVE-LOAD-Routine  E000H-E3EDH
      Der Rest ist die Umladeroutine der Kommandoschleife

fuer Grundversion des Z-1013:
      3C00-3FFFH Start: 3FEEH   >CRC=50DF<

Es gibt noch andere Generierungsvarianten des Headersaves z.B. 
die im RB-Monitor, womit gleich nach Einschalten des Rechners
das Headersave verfuegbar ist.

Zuerst einige Erleuterungen fuer Neueinsteiger:
Das Headersave-Programm schreibt vor dem auszuladenden Pro-
gramm einen Kopf auf die Kassette, welche die Angaben:

-Anfangadresse - Endadresse - Startadresse
-Typ und Name des Programms

enthalten.

Diese Angaben werden beim Einladen auf den Bildschirm geschrie-
ben. Das Programm wird in den richtigen Speicherbereich geladen.
Der Typ C (COM-File) kann auch selbst gestartet werden. Es kann
auch 

-ein bestimmtes Programm gesucht werden, 
-im direkten Modus, auch mehrfach, wieder ausgeladen werden,
-ein File verschoben geladen werden,
-das Notieren der Daten (Adressen, usw.) entfaellt.

Ausserdem kann die Original-LOAD-Routine des Riesaer Moni-
tors des Z1013 weiter zum Laden von Headersave-Programmen genutzt
werden (natuerlich ohne Nutzung der Vorteile des HEADERSAVE's).
Wenn im L-Modus des Monitors ein mit HEADERSAVE ausgeladenes
File geladen werden soll, ist >ENTER< erst bei dem Ertoenen
des zweiten KENNTON-Signals zu druecken !!! 
 - Letzteres ist wichtig, wenn HEADERSAVE nicht im Monitor-EPROM
   steht und geladen werden muss, denn das Headersave selbst
   ist ja zu diesem Zeitpunkt noch nicht verfuegbar.

- von Headersave benutzte Zellen:

     DATA:  13H Blockadresse des gelesenen Blocks
     ZILAD: 25H zu lesende Blockadresse
     SOIL:  16H Start of Input-Line
     ARG 1: 1BH Anfangsadresse File
     ARG 2: 1DH Endadresse File
     ARG 3: 23H Startadresse File
     DATA+2:15H Zeichenzaehler bei Nameneingabe

Pufferbereich Kopf!!:

       0E0H-0FFH

-Die Original-SAVE-LOAD-Routine aus dem Monitor wird nicht be-
 nutzt.
-Beim Start auf der Startadresse mit J ... wird die Kommando-
 schleife auf B0H geladen (B0H-B5H). Danach wird wieder in den
 Monitor mit ? # zurueckgekehrt. Der Start ist also nur eine Ini-
 tialisierung des Headersaves und noch nicht der eigentliche
 Start.
-Die Nutzung des Headersaves wird durch ein @... Kommando
 eingeleitet.


1. Das Ausgeben von Programmen
------------------------------

@S aadr eadr sadr >ENTER<

        Das Programm meldet sich mit der Typ-Abfrage:
        typ: (Hier wird ein Typ nach nachstehender Vorgabe er-
              wartet)
        filename: (Max. 16-stelliger Name, bei CP/M-Files sollte
                   das Atr. wie im Original angegeben werden
                   z.B: POWER.COM)
                     
   TYP: C-COM-File (Maschinenprogramm), selbststartend
        T-allgemeines Text-File
        B-BASIC-Programm fuer 10K-Basic vom KC 85/1,87
          und KC-BASIC+ 
        K-BASIC-Programm fuer 10K-Basic vom KC 85/2,3
        L-BASIC-Programm fuer TDL-Basic
        b-3-K-BASIC
        M-Maschinenprogramm, nicht selbststartend
        S-SOURCE-Assemblerquelle in ASCII (Quelltext)
        s-SOURCE-Assemblerquelle vom EDAS 1.01 (IDAS)
        P-PASCAL-Programm
        F-FORTH-Programm
        D-DATA-Datenfelder, RAM-Diskinhalte
        G-Grafik-Files
        I-Instruktion, Informationen, Programmbeschreibung
        E-EPROM-Inhalte
        Q-mit NSWEEP gequetschte Files
    Space-ohne Typ
        X,Y,Z vorgesehen fuer Urlader-Files(CC Halle)

andere Typkennzeichen muessen beim Autor R. Brosig angemeldet
werden, um Doppelvergaben zu verhindern.

    FILENAME: max. 16 Zeichen (alle, auch Space, zugelassen)


-Beim Abspeichern wird in jeden Blockkopf die physische An-
 fangsadresse eingetragen, welche beim Einlesen ausgewertet 
 werden kann.
-Das File bleibt trotzdem unter weglassen des Kopfblocks mit
 dem originalen Monitor-LOAD lesbar! (2.Kennton)
-Die Einfuehrung des MEMORY-POINTERS (laeuft als Adress-Zaeh-
 ler in HEX  mit) erleichtert die Kontrolle ueber den Abarbei-
 tungsstand.
-Nach dem SAVE-Vorgang kann eine Verify-Funktion genutzt wer-
 den,die nur die Blockchecksummen ueberprueft. Bei Abfrage 
 "Verify?" mit "Y" bejahen, jede andere Taste fuehrt in das 
 Monitorprogramm (oder aufrufendes Programm) zurueck. Es er-
 scheint bei "Y" der Auftrag "rewind": Kassette an den Programm-
 anfang zurueckspulen und >ENTER< druecken.
 Der Memory-Pointer zeigt dabei wieder den Abarbeitungsstand
 und, im Fehlerfall, die Adresse des fehlerhaften Blocks an.
 Die Kontrolle erfolgt erst nach dem Lesen eines beliebigen 
 Kopfblocks  und endet nach dem Lesen der zu dem File gehoeren-
 den letzten Kopfadresse. Alles, was gelesen wird, erscheint als
 ASCII-Interpretation auf der obersten Bildschirmzeile.

-externer Aufruf: CALL SARUF (E003H), moeglichst ueber Sprung-
 verteiler (FFF4H). Der 1. Registersatz und AF' werden zer-
 stoert!

Parameteruebergabe:

Zellen 1BH - Anfangadresse
       1DH - Endadresse
       23H - Startadresse
Akku   3AH - Wiederholen der SAVE-Funktion mit gleichen
             Kopf (gilt auch fuer den Kopf eines vorangegan-
             genen 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-
 Funktion stammen (Nutzung zum schnellen Kopieren von Files).


2. Laden von Programmen
-----------------------

@L  -Laden das naechstfolgenden Files ohne Namen- und
     Typkontrolle.
@LN -Laden eines Files mit Namen- und Typkontrolle.
     Es gilt, dass alles signifikant ist, was einge-
     geben 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 gewaehlte Name
auf dem Bildschirm stehen bleibt, da kein Nameneinga-
bepuffer existiert. Die LOAD-Routine nutzt dazu den 
Bildschirm als Puffer.

-Erfolgt der Aufruf mit X, z.B.: @LNX oder @LXX, wird nach dem
 Laden auf einen Autostart bei COM-FILE's verzichtet.(X=alle Zei-
 chen ausser Space; kann auch  "L" oder "N" sein; 
 z.B.: @LLL oder @LAB, bei Namenkontrolle - @LNN oder @LNZ 
 o.ae.). Dieses ist von Vorteil, wenn der File nach dem Laden
 sofort auf Kassette kopiert werden soll, oder wenn z.B. im 
 M(odify)-Modus Zellen des Files angesehen, geaendert oder ander-
 weitig bearbeitet werden sollen.  
-Der Rechner befindet sich so lange in einer Warteschleife, bis
 ein gueltiger Kopf gelesen oder mit >CTRL-C< (S4-K/>BREAK<)
 abgebrochen wird. Der Abbruch gelingt nur bei anliegenden Sig-
 nal, ansonsten mit >RESET<. Ungueltige Koepfe werden ange-
 zeigt. Nach sieben Koepfen ist der gewaehlte  Name aus dem
 Bildschirmbereich gelaufen und es ist kein Laden mehr moeg-
 lich. Es muss erneut das Ladekommando eingegeben werden.
 Man sollte also wenigstens in die Naehe des gesuchten Files
 spulen.
-Soll ein File auf eine andere Adresse geladen werden, als die
 im Kopf angegeben, ist es moeglich, eine neue Anfangsadresse
 anzugeben: 
            '@L XXXX'
 
 Es werden dabei automatisch der Selbststart gesperrt und die
 neue Anfangs- und Endadresse errechnet und angezeigt.
 Diese Funktion ist aber nur ohne Namensignifikation nutzbar!
 (bei externen Aufruf auch mit).
-Sollte bei einem File, welches mit Blockadressen aufgezeich-
 net wurde, ein Lesefehler auftreten, oder ein Block ueberle-
 sen 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 Memorypoin-
 ter erscheint, wenn der Lesevorgang fortgesetzt wird.
-File ohne Kopfblocknummern (HEADERSAVE-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" un-
 terbrochen. Man kann dieses File im Monitor-LOAD-Modus in den
 Rechner holen, und dann mit dem neuen HEADERSAVE wieder aus-
 laden. (in der RB-Monitorversion gibt es dazu das Kommando @LA)
-Wird ein Blockkopf mit Inhalt 0FFFFH gelesen, wird der Ladevor-
 gang mit "bad record" abgebrochen.

-externer Aufruf : CALL LORUF (E000H), moeglichst ueber Sprung-
 verteiler (FFF1H). Der 1. Registersatz und AF' werden zer-
 stoert.

Parameteruebergabe:

* H(IY)=0   -Typ wird abgefragt
  H(IY)=Typkennzeichen  -Typvorgabe und keine Abfrage Typ
* A=0       -ohne signifikante Kopfkontrolle
  A=4EH     -mit signifik. Kopfkontrolle,
             Typ und Namensabfrage
* L(IY)=20H -Freigabe des Selbststart bei COM-Files
* Zellen 1B/1CH=0 oder neue Ladeadresse 

-Beim Laden auf eine neue Anfangsadresse muss auf Zelle 1B/1CH
 die neue Adresse uebergeben werden (>0FFH), ansonsten m u s s 
 die Zelle mit 0 initialisiert werden.


3. Externer Aufruf von Untrprogrammen
-------------------------------------

-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

Achtung!   Das Argument 2 (1D/1EH) muss eine Adresse enthalten,
           die groesser als die Ladeadresse ist. Das Laden wird
           bei Erreichen der Gleichheit von Arg.2 und Ladeadr.
           (HL) abgebrochen!

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 
           Uebergabe des Inhalts im Kopfpuffer (E0-FFH), wo er 
           vom aufrufenden Programm ausgewertet werden kann.

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


4. Fehlerhinweise + Besonderheiten
-----------------------------------

-Durch die Interpretation einer Startadresse, die im Bereich
 von 3A00H-3AFFH liegt, als Doppelpunkt, koennen Files mit einer
 solchen Startadresse nicht ausgegeben werden.

-Wird der Kopf beim Laden des Files nicht angezeigt, so ist
 der Kopf fehlerhaft gelesen worden, oder er entspricht nicht
 dem Headersave-Standard.

-Wird der allerletzte Fileblock falsch bzw. nicht gelesen, so
 erfolgt keine Fehlerausschrift -> entweder durch nochmaliges
 kurzes Zurueckspulen und >ENTER< versuchen den Block doch noch
 zu lesen, oder mit RESET abbrechen. 

-Kann ein Block trotz mehrmaligen Versuchen nicht gelesen wer-
 den (z.B. Knick im Bandmaterial), so besteht die Moeglichkeit,
 diesen Block aus einem Duplikat zu lesen, welches auch Fehler
 aufweisen kann (allerdings an einer anderen Stelle). Man spult
 dazu das Band beim Auftreten eines solch hartnaeckigen Fehlers
 an den Anfang des Duplikats, drueckt ENTER und wartet, bis
 das Einlesen, erkennbar am Memorypointer, weiter laeuft.

-Der Kopfpuffer liegt auf den Adressen E0H-FFH. Manche Programme
 beginnen entgegen den Software-Richtlinien zum Z1013 schon auf
 Adressen unterhalb 100H. Es kommt zu Ueberlagerungen mit dem
 Kopfpuffer. In solchen Faellen ist es guenstig, das File auf
 100H zu verschieben und so auszulagen. Durch das Anfuegen einer
 kleinen Umladeroutine am Ende des Programms kann durch das An-
 springen der Umladeroutine ein Herunterladen auf die Original-
 adressen vor dem Start des eigentlichen Programms erreicht
 werden.


5. Kopfaufbau eines Headersavefiles
-----------------------------------

KOPFAUFBAU: Byte 0-1   Anfangsadresse
                 2-3   Endadresse
                 4-5   Startadresse
                 6-0BH frei fuer Zusatzinformationen
                   0CH Typkennzeichen
               0DH-0FH 3 x 0D3H = Kopfkenzeichen
                       (An diesem D3 erkennt jedes Kopfsuchpro-
                        gramm einen Kopf !!)
               10H-1FH 16 Byte Namensblock.

Bitte nur Original-Versionen des HEADERSAVE mit Beschreibung 
weitergeben, keine geaenderten Versionen.