Version 5.95, entwickelt Rainer Brosig.
Ausführliche Beschreibung des Programm HEADER-SAVE mit einigen Anmerkungen für Neueinsteiger:
Programmstandort:
E000H-E3FFH Start: E3EEH >CRC=8008<
eigentliche SAVE-LOAD-Routine E000H-E3EDH
Der Rest ist die Umladeroutine der Kommandoschleife
für 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 verfügbar ist.
Zuerst einige Erläuterungen für Neueinsteiger:
Das Headersave-Programm schreibt vor dem auszuladenden Programm einen Kopf auf die Kassette, welche die Angaben:
enthalten.
Diese Angaben werden beim Einladen auf den Bildschirm geschrieben. Das Programm wird in den richtigen Speicherbereich geladen. Der Typ C (COM-File) kann auch selbst gestartet werden. Es kann auch
Außerdem kann die Original-LOAD-Routine des Riesaer Monitors des Z1013 weiter zum Laden von Headersave-Programmen genutzt werden (natürlich 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 Ertönen des zweiten KENNTON-Signals zu drücken !!!
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 verfügbar.
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 Zeichenzähler bei Nameneingabe
Pufferbereich Kopf!!:
0E0H-0FFH
@S aadr eadr sadr >ENTER<
Das Programm meldet sich mit der Typ-Abfrage:
typ: (Hier wird ein Typ nach nachstehender Vorgabe erwartet)
filename: (Max. 16-stelliger Name, bei CP/M-Files sollte das Attr. wie im Original angegeben werden z.B: POWER.COM)
TYP:
C-COM-File (Maschinenprogramm), selbststartend T-allgemeines Text-File B-BASIC-Programm für 10K-Basic vom KC 85/1,87 und KC-BASIC+ K-BASIC-Programm für 10K-Basic vom KC 85/2,3 L-BASIC-Programm für 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 für Urlader-Files(CC Halle)
andere Typkennzeichen müssen beim Autor R. Brosig angemeldet werden, um Doppelvergaben zu verhindern.
FILENAME: max. 16 Zeichen (alle, auch Space, zugelassen)
Parameterübergabe:
Zellen 1BH - Anfangsadresse 1DH - Endadresse 23H - Startadresse Akku 3AH - Wiederholen der SAVE-Funktion mit gleichen Kopf (gilt auch für den Kopf eines vorangegangenen LOAD) - Typübergabe in H(IY), sonst H(IY)=0
-Bei Eingabe von „@S:“ wird die SAVE-Funktion mit den alten Kopf-Parametern ausgeführt. Diese können auch von der LOAD- Funktion stammen (Nutzung zum schnellen Kopieren von Files).
@L - Laden das nächstfolgenden Files ohne Namen- und Typkontrolle.
@LN - Laden eines Files mit Namen- und Typkontrolle.
Es gilt, dass alles signifikant ist, was eingegeben wird. Das heißt, wird nur mit >ENTER< quittiert, erfolgt für den Typ oder den Namen keine Kontrolle. Es müssen nur so viele Zeichen eingegeben werden, wie für eindeutige Signifikanz notwendig sind.
ACHTUNG:
Es muss darauf geachtet werden, dass der gewählte Name auf dem Bildschirm stehen bleibt, da kein Nameneingabepuffer 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 Zeichen außer 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, geändert oder anderweitig bearbeitet werden sollen.
Der Rechner befindet sich so lange in einer Warteschleife, bis ein gültiger Kopf gelesen oder mit >CTRL-C< (S4-K/>BREAK<) abgebrochen wird. Der Abbruch gelingt nur bei anliegenden Signal, ansonsten mit >RESET<. Ungültige Köpfe werden angezeigt. Nach sieben Köpfen ist der gewählte Name aus dem Bildschirmbereich gelaufen und es ist kein Laden mehr möglich. Es muss erneut das Ladekommando eingegeben werden. Man sollte also wenigstens in die Nähe des gesuchten Files spulen.
Soll ein File auf eine andere Adresse geladen werden, als die im Kopf angegeben, ist es möglich, 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 aufgezeichnet wurde, ein Lesefehler auftreten, oder ein Block ueberlesen worden sein, so wird das Einlesen unterbrochen und eine Fehlermeldung ausgegeben. Durch kurzes Zurückspulen und Drücken von >ENTER< kann versucht werden, den fehlerhaften Block noch einmal zu lesen (analog KC 85/1). Der Memorypointer erscheint, wenn der Lesevorgang fortgesetzt wird.
Files ohne Kopfblocknummern (HEADERSAVE-Versionen unter 5.0) können ab Version 5.8 nicht mehr gelesen werden. Es wird nur der Kopf angezeigt und das Einlesen wird mit „bad record“ unterbrochen. 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 Ladevorgang mit „bad record“ abgebrochen.
externer Aufruf : CALL LORUF (E000H), möglichst über Sprungverteiler (FFF1H). Der 1. Registersatz und AF' werden zerstört.
Parameterübergabe:
* 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 übergeben werden (>0FFH), ansonsten m u s s die Zelle mit 0 initialisiert werden.
-Für den externen Aufruf wurden noch weitere Unterprogramme zugänglich gemacht:
CALL BLMK (E00CH; SPV: FFC7H) -Lesen eines Blocks
Parameterübergabe: 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 größer 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
Parameterübergabe: HL *Quelladresse Block IX *Kopfinhalt DE *Anzahl der Sync.-Bits RETURN: HL *HL:=HL+20H
CALL SUCHK (E012H; SPV: FFC1H) -Suchen eines Kopfblocks
Übergabe des Inhalts im Kopfpuffer (E0-FFH), wo er vom aufrufenden Programm ausgewertet werden kann.
CALL AKP (E015H; SPV: FFBEH) -Aufbereitung des Kopfpuffer
Parameterübergabe wie bei SARUF
-Durch die Interpretation einer Startadresse, die im Bereich von 3A00H-3AFFH liegt, als Doppelpunkt, können 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 Zurückspulen 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 Möglichkeit, 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 hartnäckigen Fehlers an den Anfang des Duplikats, drückt ENTER und wartet, bis das Einlesen, erkennbar am Memorypointer, weiter läuft.
-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 Überlagerungen mit dem Kopfpuffer. In solchen Fällen ist es günstig, das File auf 100H zu verschieben und so auszulagern. Durch das Anfügen einer kleinen Umladeroutine am Ende des Programms kann durch das Anspringen der Umladeroutine ein Herunterladen auf die Originaladressen vor dem Start des eigentlichen Programms erreicht werden.
Byte | Bedeutung |
---|---|
0-1 | Anfangsadresse |
2-3 | Endadresse |
4-5 | Startadresse |
6-0BH | frei für Zusatzinformationen |
0CH | Typkennzeichen |
0DH-0FH | 3 x 0D3H = Kopfkenzeichen (An diesem D3 erkennt jedes Kopfsuchprogramm einen Kopf !!) |
10H-1FH | 16 Byte Namensblock |
entwickelt Martin Duchrow.
Der Autor schrieb mir 2014:
maintape ist eine Verbesserung gegenüber Headersave.
Mich störte von Anfang an, dass ich zum Finden von Programmen stets zum Kassettenanfang zurückspulen musste, um den Zählerstand auf 0000 zu stellen, damit ich anschließend bis zur markierten Stelle vorspulen konnte. Deshalb habe ich das originäre Z1013-Kasettenformat um eine Filefolgenummer ergänzt, die beim Abspeichern abgefragt und beim Laden des Z1013-Programms immer auf die aktuelle Position verweist. Meine Listen für die Programme enthielten danach nicht mehr den Stand des Kassettenlaufwerks, sondern die Filefolgenummer 1, 2, 3, …, A, B, C, …, a, b, c usw. Diese Filefolgenummer (und der Memory-Pointer zur Anzeige der Position innerhalb des Programms) werden immer angezeigt, wenn der L-Befehl ausgeführt und das Kassettengerät gestartet ist, unabhängig davon ob das Programm schon geladen wird oder nicht. Dadurch hat man die Möglichkeit, das Kassettengerät nach vorn oder hinten zu spulen, bis man das gesuchte File gefunden hat und benötigt den Zählerstand nicht mehr. Ist es das nicht Wert, maintape zu nutzen? Ich wollte es jedenfalls nicht mehr missen.
Maintape ergänzt demzufolge auch die Kassettenformate des Z1013. Um kompatibel zu bleiben, habe ich den eigentlichen Teil des originären Z1013-Formats beibehalten. Nur füge ich diesem noch 8 Bit hinzu, um meine File-Folgenummer einzubringen. Das originäre L-Kommando merkt davon nichts, da der Block an dieser Stelle schon zu Ende ist und es auf den nächsten Block wartet. Ich habe nur 8 Bit und kein ganzes Byte hinzugefügt - weil es reicht das Alphabet unterzubringen und damit kein unerwünschter Zeitverzug eintritt. Der Datenbereich enthält jetzt also 32,5 Bytes bzw 16,25 Datenwörter.
Um originäre Files mit nur 32 Datenbereichsbytes einlesen zu können, habe ich der Einfachheit halber ein zusätzliches LA-Kommando in meinen Monitor eingefügt.
Ich habe auch weitere Programme mit meinem maintape ergänzt, z.B. das Programm zum Füllen der RAM-Disk, was vorher mit dem Headersave ausgestattet war.