(freie) Übersetzung der original CS-Dokumentation durch eMSch in 3/'93

INHALTSVERZEICHNIS auf Seite 30

CS - DOS Dokumentation für DOS-Shell Version 1.42

CS-Dos ist Copyright 1987,1989 by Chris Smeets

CS-DOS ist Shareware. Die Lizenz sollte nach einer etwa 4 Wochen langen Testphase überwiesen werden an: (Achtung NEUE Adresse)

Chris Smeets

110 Brookland Drive

Bramalea, Ontario, Canada

L6T 2MS

Der Urheber bittet um Beträge, die man für angemessen hält, schlägt aber $20 vor.

Die Programme dürfen nur vollständig und kostenlos kopiert und weitergegeben werden.

---------------------------------------------------------------------------------------------

Einführung

CS-DOS für den Commodore 128 entstand aus dem C64 'ARC64'-Utility und arbeitet oft genau so.

Um dieses System flexibel zu gestalten und weitere Befehle leicht zufügen zu können, wurde es modular aufgebaut und alle Befehle sind 'transient' (müssen also extra in die RAM-Disk geladen werden).

Das größte und wichtigste Modul ist die DOS-Shell selbst, die den Command Line Interpreter (zur Erkennung und Abarbeitung von Befehlszeilen) zur Verfügung stellt.

Solltest Du noch eine übrige 1571 'rumfahren haben und es macht Dir nichts aus, vor Befehlen eine Laufwerkskennung einzugeben, bist Du schon auf dem richtigen Weg. Mit größerer Wahrscheinlichkeit willst Du zumindest ein paar der gebräuchlichsten Befehle auf einer RAM-Disk installieren und so kommt AUTOEXEC ins Spiel.

Nachdem die DOS-Shell geladen und gestartet ist, setzt sie sich in die rechten Speicherbereiche und sucht im Laufwerk 8, Drive 0 eine SEQ-Datei namens 'AUTOEXEC'. Diese ist eine normale Textdatei und alles was darin steht wird ausgeführt ('executed'), als würden die Befehle über die Tastatur eingegeben. Und hier hast Du die Möglichkeit, das System nach Deinen Wünschen anzupassen, wie Bildschirmfarben festlegen, Laufwerke konfigurieren, eine RAM-Disk installieren, Hintergrundmusik ertönen oder Deinen Namen 16-farbig über den Schirm gleiten zu lassen.

SETRAM wird Dir eine RAM-Disk installieren (entweder in Bank 1 oder Bank 0 oder wenn Du einen EPROM-Brenner hast, auch in einer der Bänke 4 bis 12); zum Anfang am besten in Bank 1. Die Details hierzu später unter SETRAM. Gib' für's erste direkt ein (oder füge es in Deine AUTOEXEC Datei ein):

A: SETRAM 1,49152

Dadurch wird Speicherplatz (RAM) in Bank 1 beginnend bei Speicherstelle 49152 ($C000) reserviert (bis zum BASIC-Speicher-Ende, normalerweise $FEFF) und für CS-Befehle zur Verfügung gestellt, immerhin 16K. Der erste Befehl, den Du benötigst, dürfte wohl INSTALL sein, um weitere Befehle zu installieren (aufzunehmen). Der Befehl dazu lautet:

A: INSTALL A: INSTALL

Das erste A: INSTALL sagt der Shell: suche Laufwerk A: und dort nach der Datei 'INSTALL' und lade diese in den Speicher des 128'er. Ist dies geschehen, wird die Kontrolle auf das geladene Programm übertragen und gleichzeitig der zweite Parameter (zweites A: INSTALL) übergeben, der besagt: Kopiere diese Datei von der Floppy in die interne RAM-Disk.

Dies ist Dein erster interner Befehl, der einem BASIC-Befehl sehr ähnlich reagiert. Das A: braucht nun nicht mehr mitangegeben werden.

ACHTUNG: die installierten Befehle arbeiten nur im Direktmodus und nicht in einem BASIC Programm!

Als nächstes möchtest Du vielleicht gebräuchlichere Befehle wie z.B. REMOVE, DIR, RDIR, REN oder ARC installieren, das könntest Du wie oben beschrieben machen, oder bei Ungeduld mit:

INSTALL A: *=P

Dieser Befehl installiert alles was vorhanden ist. Um zu sehen welche Befehle nun zur Verfügung stehen, gib' ein:

RDIR

Die Directory der RAM-Disk wird ausgegeben. Gefällt Dir irgendetwas dort nicht, (z.B. die Shell) wirst Du es mit

REMOVE "SHELL"

los. Soll der ('nutzlose') DIR Befehl gelöscht werden, benutze

REMOVE DIR

Hast Du nun ein bißchen 'rumgespielt und bist Dir mit Deiner Konfiguration einig, speichere den gesamten Inhalt der RAM-Disk als eine Datei mit beliebigem Namen:

PUTRAM NAMEN

Nach dem nächsten booten der Shell kann mit

GETRAM NAMEN

auf einen Satz alles wieder 'reingeholt werden.

Die Befehlszeile und I/O Umleitung

Wenn BASIC die READY. Meldung ('Prompt') ausgibt, ruht der 128'er und wartet cursorblinkend auf den nächsten Arbeitsauftrag, der aus einer Textzeile und anschließendem <RETURN> besteht. Alles was in der Zeile des blinkenden Cursors stand, wurde so zur 'Befehlszeile' und BASIC schiebt diese nun in den 'Eingabepuffer'. Hier greift CS-DOS ein.

Zuerst prüft CS, ob das erste Nicht-Leer-Zeichen der Befehlszeile ein '*' ist. Wenn 'Ja', wird es aus der Befehlszeile entfernt und gleichzeitig alles getan, daß jeder Bildschirmausdruck auch auf dem Drucker erscheint. Die Druckerumleitung bleibt solange aktiv, bis die nächste READY. Meldung zurückkehrt.

Da CS-Shell dem BASIC nicht ganz traut, macht es als nächstes eine Kopie der Befehlszeile zum Eigengebrauch und zählt die eingegeben Parameter (bzw. Befehlsbegrenzungen) durch. 'Befehlsbegrenzungen' sind Leerstellen ('SPACE') oder Kommas, 'Parameter' sind davon eingeschlossen, z.B.:

*ARC/L BIGFILE,HIGH, LOW,,,,,MEDIUM , SLOW

ergibt

'ARC/L' Parameter Nr. 0

'BIGFILE' Parameter Nr. 1

'HIGH' Parameter Nr. 2

'LOW' Parameter Nr. 3

'MEDIUM' Parameter Nr. 4 und

'SLOW' Parameter Nr. 5

Um auch Leerstellen in einem Filenamen zu akzeptieren, können Parameter von Anführungszeichen eingeschlossen werden.

Der nächste Arbeitsgang des CS-DOS prüft das Ende der Befehlszeile auf '>' oder '>>'. Dadurch wird die Ausgabe auf Disk umgeleitet und dieser letzte Parameter aus der Befehlszeile gelöscht.

Zu guter letzt wird die Befehlszeile auf 'Befehlszeilenschalter' untersucht. Schalter dürfen nur dem Parameter 0 folgen und mit '/' beginnen. Die Schalter belegen die Speicherstellen $1BFC und $1BFD, d.h. es gibt maximal 2 Stück; unbelegt beinhalten sie 0. Die Eingabe

LIST >PROGRAMM.BAS

verhält sich so, als hättest Du LIST eingegeben, aber alles was auf dem Bildschirm erscheint, wird auch auf Disk unter 'PROGRAMM.BAS' gespeichert.

Was als nächstes passiert, hängt vom Parameter 0 ab. Beginnt dieser mit einer Laufwerkskennung (z.B. 'D:'), versucht CS-DOS das Programm, das im Parameter angegeben wurde, zu laden und zu starten. Ist das Programm nicht zu laden oder zu starten, geht's zurück ins BASIC mit 'SYNTAX ERROR.'

Fängt der 0-Parameter nicht mit 'D:' an, sucht CS-DOS in der RAM-Disk nach dem Programm, um es zu laden/starten; bei Mißerfolg ebenfalls BASIC/Fehlermeldung.

Druckerausgabe

* leitet jede Ausgabe nicht nur auf den Bildschirm, sondern auch auf den Drucker. Allen (oder fast allen) Befehlen oder 'Einzeilern' kann das '*' vorangestellt werden, um eine Hardcopy zu erhalten.

Manchmal scheint * nicht mit BASIC-orientierten Befehlen zusammenzuarbeiten, z.B.:

*CATALOG D0,"*=P

arbeitet nicht korrekt, aber

*DIR *=P

kann's. Probiert halt 'n bißchen 'rum, verhunzt 'n paar Blatt Papier und macht Euch mit * vertraut. Noch 'n Tip, wenn's nicht funktioniert, nimm doch mal CMD. Wir werden versuchen die Probleme in zukünftigen Versionen zu beheben.

Es gibt ein Paar Pokes, die am besten in die AUTOEXEC eingebaut werden. Sie werden beim booten nur einmal gelesen und dann nicht mehr verändert. Es sind:

$1BEE (7150) Printeradresse (voreingestellt: 4)

$1BEF (7151) Printersekundäradresse (voreingestellt: 7)

* arbeitet gut mit einem IEEE (4022) und auch mit einem seriellen Drucker (1526) zusammen. Unglücklicherweise gibt es so viele verschiedene Drucker, daß nicht alle getestet werden konnten. Bei Problemen mußt Du mit der Sekundäradresse experimentieren. Sollte überhaupt nichts funktionieren, dann leite die Ausgabe auf Disk um und laß' Dein Lieblingstextprogramm den Drucker ansprechen.

Ausgabeumleitung auf Diskette

> und >> leiten den Bildschirmausdruck auch auf Diskette um, in eine SEQ-Datei. Diese Befehle arbeiten gerade so wie *, mit den gleichen Beschränkungen, nur eben auf Disk anstatt auf Drucker.

> legt eine neue Datei an, >> hängt Daten an eine schon bestehende Datei an. Es ergeben sich eine Menge interessanter Möglichkeiten in Kombination mit CHECK, GET, PUT und DIR Disketten zu katalogisieren. In Verbindung mit ARC/L kannst Du damit eine Liste dessen anlegen, was auf Deinem BBS on-line ist, oder mit CHANGE, VDUMP, MONITOR oder COMP kannst Du es bequem zur Fehlersuche ('debugging') einsetzen.

Die Ausgabeumleitung ist dem BASIC nicht ganz so transparent wie die Eingabeumleitung (EXEC). Wenn Dein laufendes Programm einen Befehlskanal auf das Ausgabelaufwerk öffnet (OPEN15,8,15) und dann den Kanal wieder schließt, schließt es auch die Datei, in die umgeleitet wurde. Hast Du mehr als ein Laufwerk, kannst Du das umgehen, indem Du die Ausgabe verschiedene Laufwerke ansprechen läßt.

Die umgeleitete Ausgabe (zu Drucker oder Disk) dauert nur bis zur Rückkehr zur READY. Meldung.

Beispiele:

VDUMP >TEST.EXEC die BASIC-Variablen werden in eine SEQ-Datei

namens TEST.EXEC geschrieben (dump)

CHECK A:* >GAMES01.CHK schickt eine reich kommentierte Directory zum

Default-Laufwerk, ebenfalls als SEQ-Datei

CHECK B:* >>GAMES01.CHK hängt an die Datei im vorigen Beispiel an

ARC/L RA >86NAV schickt die Directory 'RA.ARC' des Default-Laufwerk

in die SEQ-Datei '86NAV'

MONITOR >DEBUG.SESSION leitet die Ausgabe des Maschinensprache Monitors

auf die Diskette

LIST >MEINPROGRAMM legt ein ASCII-Listing des im BASIC-RAM befindlichen

Textes/Programmes an. Diese Datei könnte später

an andere im Speicher angehängt werden

PATTERN (MUSTER)

Viele der hier beschriebenen Befehle beziehen sich auf eine 'Patternliste', wie unten beschrieben. Die Befehlszeile kann maximal 20 Parameter aufnehmen, die Patternliste 19 Patterns. Z.B. im Befehl

CHECK A*.B* C:A??*.ASM D:NERD* D:ULTRA* C: >TEMP

reicht die Patternliste von A* bis >TEMP.

Die Dateinamenjoker ('wildcards') wurden für viele Befehle des CS-DOS etwas weiterentwickelt. Zusätzlich zum normalen Gebrauch der CBM-wildcards macht CS-Dos das Leben etwas leichter, indem das * leicht unterschiedlich interpretiert und ein eigenes Zeichen (&, oder NOT-Operator) zugefügt wird.

Ein & vor einem Dateinamen spricht alle Dateien an, außer dem angegebenen, z.B.:

ARC/A MISCDATA &*=P

nimmt in das Archiv im Default-Laufwerk alle Dateien auf, außer Programmen.

ARC/A MISC &C:*.ARC

nimmt alle Dateien von Laufwerk C: auf, ausgenommen jene mit der Endung ARC.

Der Asterisk wird gleitend interpretiert. Spiele ein wenig damit in Verbindung mit CHECK, um Dich vertraut zu machen. Z.B.:

*.* wählt alle Dateien mit einem '.' im Namen aus (wie z.B.:

HELLO.ARC, SUPER.COPY.ASM oder MEGAMON. )

*.*=P wirkt gleich,, wählt aber nur Programme aus

*.ARC wählt alle Dateien mit der Endung '.ARC' aus

*.?? wählt alle Dateien mit einem '.' an drittletzter Stelle aus

JJ*.PIK wählt alle Dateien mit 'JJ' am Anfang und 'PIK' am Ende

des Dateinamens aus

*NASE* sucht alle Dateinamen in denen irgendwo 'NASE' vorkommt

Bis jetzt kann diese Dateiauswahl noch nicht mit allen Befehlen zusammenarbeiten (z.B. DIR oder DEL), vielleicht wird's in späteren Versionen möglich sein. Aber die normalen CBM-DOS Joker sollten auf alle Fälle funktionieren.

Befehl: ASSIGN

Syntax: ASSIGN Buchstabe TO Buchstabe2 LAUFWERK, DRIVE

siehe auch: AUTOEXEC, INT06

Zweck: ordnet einem Laufwerk einen Kennbuchstaben als Adresse zu

Nach dem booten sind die Laufwerke wie folgt zugeordnet:

A: Laufwerk 8, Drive 0 B: Laufwerk 8, Drive 1

C: Laufwerk 9, Drive 0 D: Laufwerk 9, Drive 1

u.s.w. bis K: und L: für 13,0 bzw. 13,1

M: bis Y: sind alle dem Laufwerk 8, Drive 0 zugeordnet

Z: ist Drive 0 des Laufwerkes, von dem aus CS-DOS gebootet wurde

Gefällt Dir diese Voreinstellung nicht, ändere sie mit ASSIGN, elegant in der AUTOEXEC-Datei. Sollten ungültige Daten eingegeben werden, bricht ASSIGN mit einer Fehlermeldung ab, ansonsten passiert nichts. Gültige Werte sind:

Buchstabe A bis Z

Laufwerk 8 bis 30

Drive 0 bis 9

Zweifellos gibt es nur wenige 128'er Benutzer, die mehr als 26 Laufwerke ansprechen wollen, aber die Laufwerksbuchstaben eignen sich gut als Aliase (Pseudobefehle) und sind in Batchdateien hilfreich. Z.B. 'Z:' als Alias für das CS-Bootlaufwerk. Möchtest Du auf alle Routinen zugreifen, diese aber nicht ins RAM kopieren, kannst Du sie über Z: erreichen, egal von welchem Laufwerk gebootet wurde (wenn die Bootdisk dort belassen wurde).

Aliase vereinfachen u.U. den Aufwand Batchdateien zu ändern (anstatt der Assignbefehle der AUTOEXEC-Datei), wenn Dein System oder die Voreinstellung wechselt. Sie helfen auch Batchdateien von einem auf ein anderes System zu transportieren.

Beispiele:

ASSIGN A 9,0 'TO' kann ausgelassen werden. 'A:' spricht nun

Laufwerk 9, Drive 0 an.

ASSIGN "C" TO 8 1 macht Laufwerk 8, Drive 1 zu C:

ASSIGN A TO 8,9 macht Laufwerk 8, Drive 9 zu A:

Befehl: AUTOEXEC

siehe auch: BATCH, SHELL

Bei irgendeinem Diskzugriff auf dem 128'er (z.B. CS-DOS laden...) merkt sich das 128'er Kernal in $BA (186) die Laufwerksnummer. CS-DOS geht davon aus, die AUTOEXEC im Bootlaufwerk zu finden. So schaut die Shell in 186 nach und macht dieses Laufwerk, Drive 0 zum Defaultlaufwerk und zu Z: und führt Z:AUTOEXEC aus. Dadurch kannst Du CS-DOS von jedem beliebigen Laufwerk aus booten.

Auch Du hast die Möglichkeit Dinge ein wenig anzupassen, manches muß, manches kann. Zuerst das Notwendige:

1.) teile CSARC1750 und LHA mit, welchen Teil der 1750 sie benutzen dürfen.

Dazu dient der Befehl

POKE 7119, LOW*16+HIGH

'LOW' ist die niedrigste numerierte 1750-Bank, die diese Programme als Puffer

nutzen dürfen, 'HIGH' die Höchste plus eins. Soll z.B. nur Bank 0 benutzt

werden, lautet der Befehl:

POKE 7119, 0*16+1

2.) ähnlich muß für TERM ein Puffer festgelegt werden, der vom obigen nicht

unterschiedlich sein muß:

POKE 7120, LOW*16+HIGH

Nun die 'freiwilligen' Pokes:

1.) nimm Z:SETRAM um die RAM-Disk zu installieren

2.) nimm Z:GETRAM um eine früher angelegte RAM-Disk einzuladen

3.) wähle TEXT oder BASIC Modus

4.) mit ASSIGN wichtige Laufwerke, Drives festlegen (Lw-Buchstaben zuordnen)

5.) poke in folgende Stellen ein paar Zahlen:

7104 BAUD-Rate für TERM, LOW-Byte

7105 BAUD-Rate für TERM, HIGH-Byte

(einige Befehle, wie DIR und RDIR, arbeiten auch mit folgenden Farben)

7112 Farbe 1 (Voreinstellung weiß)

7113 Farbe 2 (Voreinstellung gelb)

7114 Farbe 3 (Voreinstellung grün)

7115 Farbe 4 (Voreinstellung cyan)

7116 Farbe 5 (Voreinstellung braun)

7117 Farbe 6 (Voreinstellung purpur)

7118 Farbe 7 (Voreinstellung gelb)

7122 Echo Status (Voreinstellung 0) 0=ON; $80=OFF

7150 Adresse Drucker (Voreinstellung 4)

7151 Sekundäradresse Drucker+96 (Voreinstellung 96)

5.) Voreinstellung der programmierbaren Funktionstasten

6.) UND SO WEITER . . . UND SO WEITER . . .

Schlüsselwort: BATCH DATEIEN

siehe auch: IF, GOTO, LOOP, BEGIN, GETKEY, EXEC, AUTOEXEC

Batch Dateien sind den MS-DOS "*.BAT"-Dateien sehr ähnlich, man braucht sie nicht extra zu starten ('execute'). Gib' nur den Dateinamen in der Befehlszeile ein -mit oder ohne Parameter- und ab geht's. Wenn CS-DOS beim Laden auf Progammdateien stößt (PRG), werden diese gestartet (RUN), sequentielle Dateien (SEQ) werden ausgeführt (EXEC).

Wie im MS-DOS können der Batchdatei Parameter übergeben werden. Enthält deine Batchdatei ('Test') z.B. die Zeile

ECHO %0 %1 %2 %2 %4 %5 %5 %6 %7 %8 %9

und Du gibst

TEST A B C D E F G H I J K L M N O P Q R S T U V

ein, wird das Ergebnis sein:

TEST A B C D E F G H I

Parameter höher als %9 werden ignoriert und %0 ist der Befehlsname selbst. Existiert in der Befehlszeile kein Parameter, wird ein SPACE ausgegeben. Wenn die Batchdatei

ECHO "%1"

wäre, würde

TEST

zu dem Ergebnis

" "

führen.

Eine Batchdatei kann eine andere (oder eine EXEC-Datei) aufrufen, aber die aufrufende wird dadurch beendet, evt. nachfolgende Befehle werden ignoriert.

Batchdateien sind von Floppy- oder RAM-Disk aufrufbar. Zweiteres ist vorzuziehen, da es weniger Probleme gibt und schneller geht.

Eine Batchdatei kannst Du stoppen durch

1.) POKE 7162,0 oder

2.) gleichzeitiges Drücken von C= und CTRL oder

3.) Aufruf einer anderen Batchdatei (die gar nichts tut).

Batchdateien und EXEC-Dateien sind nicht das gleiche; EXEC kann keine Parameter aus der Befehlszeile übernehmen ( %0, %1, ...). Enthielte Deine SEQ-Datei "TEST" die Zeile

ECHO %1 %2 %3

würde EXEC TEST

zu %1 %2 %3 führen,

aber A:TEST

würde TEST (+ 4mal SPACE) ausgeben.

Befehl: BEGIN LOOP

siehe auch: BATCH, GOTO, IF

BEGIN und LOOP kontrollieren den Ablauf einer Batch-Datei. BEGIN speichert die augenblickliche Position der Ausführung, LOOP springt zur durch BEGIN gespeicherten Position zurück. LOOP ohne BEGIN bleibt ohne Effekt.

BEGIN und LOOP arbeiten nur aus Batchdateien heraus, die in der RAM-Disk liegen und bleiben von der Floppy heraus ohne Wirkung.

Beispiel: Batchdatei um Disks auszutauschen ('swapping') unter Verwendung von ARC128

echo Lege Programmdiskette in Laufwerk Z: ein, dann drücke bitte <RETURN>

begin

getkey

if not errorlevel 13 loop

load "z.arc"

echo Lege Datendiskette in Laufwerk Z: ein, dann drücke bitte RETURN

begin

getkey

if not errorlevel 13 loop

z:

>i0

run:/ . . %1 %2 %3 %4 %5 %6 %7 %8 %9

run:/1 %1

;

Befehl: CHANGE

siehe auch: FIND, TEXT, BASIC, >, *

Syntax: change/vorher/nachher/, Zeilenbereich

change "vorher" "nachher", Zeilenbereich

Der Befehl change ändert Text oder Basicprogramme, die sich gerade im Speicher befinden. Jeder String "vorher" wird gegen "nachher" im angegebenen Zeilenbereich (Syntax wie im Basicbefehl LIST) ausgetauscht.

Change arbeitet abhängig vom Modus (TEXT/BASIC): kommen im ('vorher' oder/und 'nachher') String Basicschlüsselworte vor (wie 'if' in 'Gift'), werden diese vom Interpreter in die Basic-Tokens umgewandelt (nur im Basicmodus), es sei denn sie werden von Anführungszeichen umgeben ("Gift"). Darum wurde hier auch die alternative Syntax mit den Anführungszeichen aufgenommen.

Beispiele: (die folgenden sind äquivalent, bewirken das gleiche)

change/lda/ldy/

cange :lda:ldy:,0

change"lda""ldy"

change "lda" "ldy"

Im folgenden wird ein Protokoll der Austauschvorgänge in einer Diskdatei festgehalten (es sind nur die Zeilen 1000-2000 betroffen):

change/lda/ldy/, 1000-2000 >Dateiname

Befehl: CHECK

CRC

siehe auch: DIR, *, PATTERNLIST, >, INT16

Syntax: check patternlist

crc patternlist

Dieser Befehl listet wortreich Directories. Er glaubt nicht (wie der DIR-Befehl) das was in der Directoryspur steht, sondern verfolgt jede Datei von Anfang bis Ende und berechnet die exakte Dateigröße, sowohl in Bytes, als auch Blöcken. NUR: REL-Datei 'side sectors' werden ignoriert.

Außerdem erfolgt die Angabe der Start- und Endadressen und RECORD-Längen (REL).

CHECK und CRC sind gleich, bis auf den 'zyklischen Redundanzcheck' (CRC) einer jeden Datei in der Patternlist. CHECK arbeitet sich blockweise, CRC byteweise durch die Dateien, deshalb ist CHECK auch schneller.

Hast Du einen Text oder ein BASIC-Programm im Speicher, läßt CHECK das kalt, aber CRC wird es abklopfen.

Mit CRC kannst Du auch die Integrität eines Archivs testen. Der angezeigte CRC-Wert sollte gleich dem sein, den CRC durch ARC oder PKARC anzeigte, als ein MS-DOS Archiv-Directory angezeigt wurde. Vermutest Du einen Fehler, wird CRC ihn finden, oder Deine Bedenken zerstreuen.

Suchmuster sind hier besonders mächtig (siehe PATTERNLIST).

CHECK kann sehr nützlich sein, die Inhalte von Archiven (oder Disketten) zu katalogisieren. Da CHECK mit der selben Art Suchmuster arbeitet wie ARC, könntest Du CHECK benutzen, bevor ein Archiv eingerichtet und dessen Ausgabe in eine Disk-Datei (z.B.: "diesesarc.chk") umgeleitet wird. Dann hole (mit GET) "diesearc.chk" ins RAM, füge zu den links gelisteten Dateien am rechten Rand ein paar beschreibende Stichworte ein, über oder/und unter der Directory noch ein paar Kommentare und schreibe das ganze (PUT) auf Diskette zurück. Nimmst Du nun die '.chk'-Datei ins Archiv auf (oder benutzt sie als Titelbildschirm eines SDA), kann jeder glänzen sehen, worum es in Deinem Archiv geht.

Beispiele:

check a:*.mus b:*.pic checkt alle Dateien in Laufwerk a: , deren Namen

mit '.mus' endet oder auf Laufwerk b: mit '.pic'

crc &*=p Directory für alle Dateien auf Laufwerk c:, außer

Programmen

check b:r* >ch.hlp gab folgenden Ausdruck:

============================================================

d:filename type bytes blocks

============================================================

"b:ren.asm" seq 1,772 7

"b:ren" prg 191 1 $0b00-0bbd

"b:remove.asm" seq 2,788 11

"b:remove" prg 297 2 $0b00-0c27

"b:rdoff.asm" seq 1,574 7

"b:rdoff" prg 215 1 $0b00-0bd5

"b:rdir.asm" seq 2,090 9

"b:rdir" prg 298 2 $0b00-0c28

"b:relfile" rel 1,409 6 rl = 128

============================================================

9 file(s) 10,634 46

Befehl: CHANGEUNIT

Syntax: changeunit LaufwerkAlt to LaufwerkNeu

Dies ist Jim Butterfields Public Domain "drive address Change"-Programm, so angepaßt, daß auch die Befehlszeilen-Parameter abgearbeitet werden. (Dies ist auch ein Beispiel dafür, daß BASIC-Programme Befehlszeilen-Parameter übernehmen können!)

Da das ein BASIC-Programm ist, wird Text oder ein schon vorhandenes BASIC-Programm aus dem Speicher 'rausgeschmissen.

changeunit 8 to 9 ändert Laufwerk 8 auf Adresse 9

changeunit 9 8 ändert wieder zurück ('to' ist optional)

changeunit 8 14 I dieser 3-Zeiler könnte eine nützliche

changeunit 9 8 I EXEC-Datei sein, Laufwerksnummern

changeunit 14 9 I 8 und 9 gegeneinander zu tauschen

Bist Du ein Zeitschinder, kannst Du ein paar Millisekunden sparen:

changeunit 8 14

run: 9 8

run: 14 9

Befehl: COMP

Syntax: comp s:ErsteDatei d:ZweiteDatei

Comp vergleicht zwei Disk-Dateien und gibt nicht nur 'gleich' oder 'ungleich' aus, sondern zeigt genau die Bereiche an, die gleich und die die ungleich sind.

Da es viele verschiedene Möglichkeiten gibt, wie sich zwei Dateien unterscheiden können, wird jede Vergleichsfunktion ihre Grenzen haben; COMP deckt natürlich zahlreiche Fälle ab.

COMP wurde geschrieben, um ARC zu 'debuggen' (Fehler zu finden). Dateien wurden ge-ARC-t und anschließend ent-ARC-t, um sie mit dem Original zu vergleichen. Erst als es keine Unterschiede mehr gab, konnte ARC in Ordnung sein.

Auch wenn ein Programm eine Datei ausgibt, kannst Du erkennen, wie geänderte Eingaben sich auf die Ausgabedatei auswirken.

Beispiel: nimm an "Datei a" enthält folgendes Programm:

1000 dopen#1,"relDatei",l20

1010 for x=1 to 10: print#1,"recordNummer ";x:next

1020 dclose#1

und "Datei b" enthält:

1010 dopen#1,"relDatei",l15

1010 for x=1 to 99: print#1,"recordNummer ";x:next

1020 print#1, "Ende"

1030 dclose#1

so gibt COMP aus:

a:Datei a a:Datei b

-------------------------------------------------------------------

offset addr1 addr2 match? comments

-------------------------------------------------------------------

000000 001c01 001c01 yes files start out the same

000016 001c15 001c15 no two bytes are different

000018 001c17 001c17 yes a bunch more the same

000025 001c24 001c24 no two more different

000027 001c26 001c26 yes a bunch more the same

000040 001c3f 001c3f no remaining bytes are mostly

000041 001c40 001c40 yes not alike. (only short

000044 001c43 001c43 no "yes" intervals)

00004a eof 001c49 no file a ends. $4a bytes long

00005b eof eof no file b ends. $5b bytes long

übersetzt:

a:Datei a a:Datei b

-------------------------------------------------------------------

offset addr1 addr2 gleich? Kommentar

-------------------------------------------------------------------

000000 001c01 001c01 ja Dateien starten gleich

000016 001c15 001c15 nein zwei Bytes sind unterschiedlich

000018 001c17 001c17 ja eine handvoll Gleichheit

000025 001c24 001c24 nein zwei Bytes mehr unterschiedlich

000027 001c26 001c26 ja eine handvoll Gleichheit

000040 001c3f 001c3f nein verbleibende Bytes sind überwiegend

000041 001c40 001c40 yes ungleich (nur kurze Intervalle

000044 001c43 001c43 no der Übereinstimmung)

00004a eof 001c49 no Datei a zu Ende. $4a Bytes lang

00005b eof eof no Datei b zu Ende. $5b Bytes lang

Beachte, eof ist nie eine Übereinstimmung, da eof bedeudet 'es gibt keine Daten mehr' (und nicht: 'dies ist das letzte Byte der Datei').

Befehl: COPY

siehe auch: >

Syntax: copy s:Quelldateiname d:Zieldateiname

Copy verschiebt Dateien zwischen Laufwerken hin und her. Copy liest die Quelldatei in einen 32K Puffer in Bank 1 und schreibt sie dann ins Ziel. Dabei bleiben Programme im Speicher unberührt, aber definierte BASIC-Variablen gehen verloren.

Wird s: (Source,Quelle) oder d: (Destination,Ziel) ausgelassen, nimmt der Befehl das Default Laufwerk an, aber die Dateinamen sind beide anzugeben.

Copy ist bei weitem nicht das beste Filecopyprogramm; Du hast sicher 'n paar 'rumhängen, die Du anstatt Copy INSTALLieren kannst. Da aber Copy aktuelle Programme im Speicher nicht anrührt, ist es doch interessant, so zwischendurch -während BASIC- oder Textbearbeitung- eben 'mal 'ne Kopie zu fertigen.

Beispiele:

copy a:diese b:jene kopiert 'diese' Datei von a: als 'jene' auf b:

copy a:diese jene kopiert 'diese' Datei von a: als 'jene' in Default

copy a:diese b:jene das gleiche wie: '>c1:jene=0:diese'

unter der Annahme eines Doppellaufwerkes mit

a: als Drive 0 und b: als Drive 1

Befehl: DATE

siehe auch: ARC, INT14, INT15

Syntax: date tt,mm,jjjj

Stellt das Datum (Default ist 1. Januar 1980). tt = Tag (1 bis 31), mm = Monat (1 bis 12), jjjj = Jahr (1980 bis 2107). Für Jahre in diesem Jahrhundert kann das '19' entfallen (1.1.1987 = 1.1.87).

ARC ist der einzige Befehl der auf DATE zurückgreift.

Befehl: DCLEAR

siehe auch: EXEC, *, >

Syntax: dclear

Dieser Befehl schließt alle offenen Diskdateien, ist aber etwas unterschiedlich zum BASIC DCLEAR. Es wirkt wie:

close15: for dv= 8 to 30: open 15,dv,15: close15: next dv

Gelegentlich, bei Ausgabeumleitung über EXEC, * oder > kann eine Datei offen bleiben, wenn das READY. erscheint. dclear verhindert unkorrekt geschlossene Dateien.

Dclear wird die Ausführung einer EXEC Datei NICHT unter- oder abbrechen, Du kannst es dort also ohne weiteres einsetzen.

Befehl: DEL

siehe auch: VDEL, >

Syntax: del d: Muster1 d: Muster2 . . .

Del löscht bestimmte Dateien. Es ist eine Batchdatei und eine Sonderform des VDEL, welches weiter geht und annimmt, Du hättest alle Abfragen des VDEL mit 'Ja' beantwortet.

Eine DEL Batchdatei sieht etwa so aus:

vdel/a %1 %2 %3 %4 %5 %6 %7 %8 %9

DEL wird kein 1581 - Unterverzeichnis löschen können, auch keine offene oder nicht ordnungsgemäß geschlossene Datei (nimm dazu: >s0:Name )

Beispiele: del *.arc löscht alle Archive

del a:a b:b c:c löscht die drei Dateien 'a', 'b' und 'c'

Befehl: DIR

siehe auch: CHECK, CRC

Syntax: dir/w Muster

Wirft ein einfaches Directorylisting aus. Muster ist irgendein zulässiger Dateiname und kann die Joker * und ? beinhalten. Die '/w'-Option zeigt nur Dateinamen an, unter Ausnutzung der ganzen Bildschirmbreite.

Beispiele:

dir c:*=p gleich wie: CATALOG D0 ON U9,"*=P

dir/w c:*=p gleich wie oben, zeigt aber nur Dateinamen an

*dir sendet Defaultdirectory zum Drucker

dir/w c: >Namen sendet Directory des Laufwerks c: in eine SEQ-

Datei mit 'Namen' ins Defaultlaufwerk

Befehl: EXEC

siehe auch: *, >, >>, GET, PUT, INT20, BATCH FILES

Syntax: exec seqDateiname

Wenn Du die DOS-Shell bootest, sucht sie im Laufwerk a: eine SEQ-Datei namens 'autoexec' und führt aus, was immer darin steht und zwar so, als wären die Eingaben über die Tastatur erfolgt. Dies funktioniert, weil sich die DOS-Shell 'exec autoexec' selbst in die Befehlszeile schreibt.

Hast Du jemals SYSRES im 64'er Modus gebraucht, bist Du vielleicht mit EXEC-Dateien vertraut und weißt, wie nützlich sie sein können.

Wenn Du eine Datei 'EXEC' (ausführst) passiert folgendes:

Die Shell versucht die Datei zu öffnen. Existiert diese nicht, oder gibt es einen Diskfehler, passiert überhaupt nichts.

War bis hier alles in Ordnung, wird der Computer jedesmal wenn er ein Zeichen von der Tastatur (Geräteadresse 0) holen will, auf die EXEC-Datei umgeleitet. Dabei ist es egal, ob er sich im Direkt- oder Programm-Modus befindet, oder ob Du INPUT oder GET benutzt, -das KERNAL glaubt, mit der Tastatur zusammenzuarbeiten, tatsächlich ist's aber die EXEC Datei.

Am Ende der EXEC Datei wird die normale Tastaturfunktion wiederhergestellt.

EXEC versucht so unauffällig wie nur irgendmöglich zu sein, aber es gibt doch ein paar Einschränkungen: Da EXEC seine Daten von der Diskette holen muß (Sektor für Sektor), kann es passieren, daß eine Diskdatei göffnet werden soll, während EXEC arbeitet. Das geht nur, wenn EXEC mehr als einen Block lang ist.

Die andere Einschränkung: BASIC kann 'nur' maximal 10 Dateien gleichzeitig geöffnet halten (was aber im allgemeinen genügen sollte). Eher könnten Laufwerke ausgereizt sein, die mit weniger geöffneten Dateien gleichzeitig umgehen.

Es gibt ein Paar POKEs die vielleicht in EXEC hilfreich sein können:

$1bfa (7162) eine Null hier unterbricht EXEC, 255 fährt weiter

$1beb (7147) normalerweise wird EXEC jedes Zeichen aus der EXEC-Datei

auch auf den Bildschirm werfen. 255 schaltet das aus, Null

wieder ein.

Befehl: FIND

siehe auch: CHANGE, TEXT, BASIC, >, *

Syntax: find/string/,Zeilenbereich

find"string",Zeilenbereich

Find sucht alle Stellen (im Text oder Programm), an denen 'String' vorkommt und zeigt diese an; Zeilenbereich entspricht der Syntax des Basicbefehls 'LIST'.

FIND arbeitet im Text- etwas anderst als im Basic-Modus: Im Basicmodus wird der Suchstring durch den Interpreter 'TOKEN-isiert', was durch Anführungszeichen um den Suchstring zu verhindern geht.

Der Begrenzer um den Suchstring kann irgendein Zeichen sein, ohne angegebenenen Zeilenbereich ist der Schlußbegrenzer optional.

Die folgenden Beispiele sind äquivalent:

find/lda/

find :lda

find *lda*.0-

find"lda"

find restorelda (im BASIC-Modus)

Befehl: GET

siehe auch: PUT, TEXT, SCROLL

Syntax: get/a Dateiname,Startzeile

Der GET-Befehl lädt SEQuentielle Textdateien zum editieren in den Speicher. Der Schalter /a ist optional und wandelt dabei die Datei von Standard- in Commodore-ASCII um.

Ohne angegebene Startzeile wird die Textdatei alles überschreiben, was sich bereits im Speicher befindet. Mit einer Startzeile werden die Zeilen kleiner oder gleich der angegebenen erhalten, nur die höheren werden überschrieben.

Dateiname ist irgendein zulässiger, den das Laufwerk finden kann, aber SEQ-Typs sein muß.

GET kann natürlich keinen Text über den top-RAM-pointer (RAM-Endzeiger) hinaus laden, längere Texte werden einfach gekappt, ebenso werden Zeilen >160 Zeichen auf 160 Zeichen gestutzt.

GET prüft nicht, ob die angegebene Datei tatsächlich ein gültiges Textfile ist, weshalb u.U. Abstürze vorkommen (normalerweise harmlos). In diesem Fall RESET-Knopf drücken, SYS 6000 eingeben und Du bist zurück in der DOS-Shell.

Beispiele:

get helptext holt 'helptext' vom Default-Laufwerk

get b:helptext holt helptext von Laufwerk b:

get "helptext",5000 merge-t helptext ins RAM, Beginn nach Zeile 5000

get/a "capture buffer" holt Standard-ASCII-Datei vom Default-Laufwerk als

Commodore-ASCII ins RAM

Befehl: GETKEY

siehe auch: BATCH, IF, GOTO, LOOP, BEGIN

Syntax: getkey

Getkey wartet auf einen Tastendruck. Der ASCII-Wert der gedrückten Taste wird als 'errorlevel' ausgegeben. Getkey wird hauptsächlich in Batchdateien angewendet.

Befehl: GETRAM

siehe auch: PUTRAM, RAMDISK

Syntax: getram d:Dateiname

Hast Du einmal die Befehle INSTALLiert, die Du benutzen möchtest, kannst Du sie mit PUTRAM in einem Stück auf Disk speichern, dann brauchst Du die INSTALLation nicht jedesmal neu durchrackern.

GETRAM stellt die RAM-Disk (wie mit PUTRAM abgespeichert) wieder her und ist folgendem BASIC-Befehl gleich:

BLOAD "Dateiname", B(BankRAM-Disk), P(AdresseRAM-Disk), Dx on Uy

Es wird nicht geprüft, ob die Datei "Dateiname" auch in den angegebenen Speicherplatz hineinpaßt, so sei bitte umsichtig.

Beispiele:

getram c:Assemblerstoff holt 'Assemblerstoff' von Laufwerk c:

getram ARC-stoff holt 'ARC-stoff' vom Defaultlaufwerk

Befehl: GOTO

siehe auch: BATCH, IF, LOOP, BEGIN

Syntax: goto label

Springt in einer Batchdatei vorwärts bis zum angegebenen Label. 'Label' ist irgendeine Zeile, die in Position Null einen Doppelpunkt ':' hat. Der Batch

goto there

: there

echo hi

:there

echo bye

würde 'bye' auswerfen und nicht 'hi' (und 'bye'), das erste :there wird nicht als Label anerkannt.

Du kannst nur vorwärts (und nicht rückwärts) durch die Batchdatei suchen.

Befehl: IF

siehe auch: BATCH, BEGIN, LOOP, GOTO, GETKEY, ;

Syntax: if exist Muster Befehl

if String1 = String2 Befehl

if errorlevel N Befehl

If wird in Batchdateien zur Ablaufsteuerung eingesetzt.

'Befehl' kann ein BASIC- oder CS-DOS-Befehl sein.

Nur wenige CS-DOS-Befehle geben einen sinnvollen errorlevel zurück. Generell gilt, errorlevel 0: der Befehl tat was Du von ihm erwartet hast, irgendeine andere Zahl: aus irgendeinem Grund ist etwas schiefgelaufen.

'if exist Muster Befehl' führt den Befehl nur aus, wenn das Dateisuch-Muster existiert

'if String1 = String2 Befehl' führt den Befehl nur aus, wenn String1 = String2

'if errorlevel N Befehl' führt den Befehl nur aus, wenn der letzt vorhergehende Befehl

den Wert N als errorlevel rückgemeldet hat.

Z.B. eine Batchdatei, die auf dem DEL Befehl aufbaut, - laß' sie uns "lösche" nennen:

if "%1" = " " goto usage

if "%2" = "ifon" goto delif

del %1 %2 %3 %4 %5 %6 %7 %8 %9

goto done

:delif

if "%3" = " " goto usage

if exist %3%1 del %1

goto done

:usage

echo usage %0 Dateiname ifon d: ('ifon d:' ist optional)

:done

;

Der Aufruf mit 'lösche Name' wäre zwar der gleiche wie 'del Name', aber beim Aufruf mit 'lösche Name ifon b:' wird nur die Datei im Defaultlaufwerk löschen, wenn eine gleichnamige Datei in Laufwerk b: existiert.

Oder hier eine Batchdatei, die ein Programm assembliert und reinstalliert. Nimm an, wir nennen sie "assm" und wollen sie mit 'assm Name' aufrufen:

asm %1 , asm %1

if not errorlevel 0 goto error

remove %1

install %1

goto done

:error

echo Assembler-Fehler !!!

:done

;

Befehl: INSTALL

siehe auch: REMOVE, SETRAM

Syntax: install/bank d:Muster d:Muster . . . .

Installiert eine neue Datei von Diskette in die RAM-Disk.

Bank ist eine einstellige Hex-Zahl für die Bank (0 bis F entsprechend dez. 1 bis 15), in der das Programm ausgeführt werden soll. Voreingestellt ist F, solange nichts anderes angegeben wird.

Install versucht Fehler zu erkennen, es ignoriert Dateien, die nicht Programm sind und installiert nicht über das Ende der RAM-Disk hinaus (was auch immer das Ende des RAM's für BASIC war, als RAM-Disk installiert wurde).

INSTALL läßt Dich auch SEQ-Dateien in die RAM-Disk installieren. Als Voreinstellung geht INSTALL davon aus, daß eine SEQ-Datei ein Batch ist. SEQ-Dateien sind auch als TYPE-Dateien installierbar. TYPE-Dateien werden auf dem Bildschirm ausgedruckt, wenn Du ihren Namen nach dem READY.-Prompt eintippst. Das finde ich bequem, um Speicherbelegungen (memory maps), BBS Telefonnummern, I/O Register u.s.w. anzusehen. TYPE-Dateien können mit einem Argument versehen werden, dann kommen nur die Zeilen zum Ausdruck, die das Argument enthalten. Hast Du z.B. eine Type-Datei namens 'p', die folgende Zeilen enthält:

GEnie 793-1256 (jkl987,smedlap)

Dragon's Lair 956-1234 (password)

com1 458-0039 (hunk)

dann würde 'p com1' nur die dritte Zeile anzeigen, 'p' alleine, aber die ganze Datei.

Um eine SEQ-Datei als Batchdatei zu installieren, benutze 'install Name' ; als Typedatei nimm 'install/t Name' .

Beispiele:

install *=p installiert alle Programme auf dem Defaultlaufwerk

install &arc installiert alle Dateien auf dem Defaultlaufwerk, außer 'arc'

install a b c installiert 'a', 'b' und 'c'

install/t esc installiert SEQ-Datei "esc" als Type-Datei

Befehl: Merge

siehe auch: EXEC, >, *

Obwohl Du MERGE nicht siehst, wenn Du den Inhalt der RAM-Disk mit RDIR listest, ist es im EXEC-Befehl enthalten.

Programmierst Du in BASIC, kannst Du eine ganze Bibliothek von Unterroutinen aufbauen, die Du später, wie folgt, in Dein aktuelles Projekt MERGEn kannst:

Erst kodiere, prüfe (debug) und teste die Routinen, bis alles glatt läuft. Dann als ASCII-Datei auf Disk speichern mit

list Zeilenbereich >Dateiname

Zeilenbereich ist der Bereich der Subroutine, der gespeichert werden soll.

Später, wenn Du die Subroutinen in andere Programme aufnehmen willst ('Merge'), ist alles was zu tun ist: EXEC ('ausführen'). Dies wäre das selbe, als die Zeilen nochmals per Tastatur einzutippen.

COLD Computer Reset

FORTY schaltet in den 40-Zeichen RGB-Modus

EIGHTY schaltet in den 80-Zeichen RGB-Modus

PUSHDIR sichert das aktuelle Defaultlaufwerk (nützlich in Batchdateien)

POPDIR restauriert das Defaultlaufwerk auf das, das durch PUSHDIR gespeichert wurde

; tut nichts. Es ist nur dazu da, Kommentare in Batchdateien einzufügen

cd eine Batchdatei, um 1581-Partitions zu wechseln

# I Dies sind noch ein paar Batch- oder Type- Dateien,

rd I RSAVE sie auf die Floppy, TYPE

esc I und schaue dann nach,

cls I was sich jeweils darin/dahinter

colors I verbirgt.

Befehl: MOVE

siehe auch: COPY, PATTERN

Syntax: move s:pattern d:

MOVE kopiert Dateien von einem Laufwerk zu einem anderen. Dabei liest MOVE die Datei vom Quell-Laufwerk ('source', s:) in einen 32K-Puffer in Bank 1 und schreibt sie dann ins Ziellaufwerk ('destination', d:). Irgendwelche Programme im Speicher werden nicht beeinflußt, aber definierte BASIC-Variablen gehen verloren. Wird s: oder d: ausgelassen, setzt CS-DOS das Default-Laufwerk ein. Mit diesem Befehl sind erweiterte Suchmuster anwendbar.

Beispiele:

move c:*.arc kopiert alle Archive von Laufwerk c: aufs Default-Laufwerk

move jj* c: kopiert alle Dateien, deren Namen mit 'jj' beginnt, von Default nach c:

move c:* d:* b:* kopiert alle Dateien von Laufwerk c:, d: und b: aufs Default-Laufwerk

Befehl: OLD

Syntax: old

Nach einem 'NEW' oder Reset (mit Resetknopf) ist Dein Programm oder Text zwar noch im Speicher, läßt sich aber nicht mehr LISTen etc. OLD stellt die Programmzeiger wieder her, und alles ist wieder im Lot.

Befehl: PUT

siehe auch: GET, TEXT, SCROLL

Syntax: put/a d:Dateiname,Anfangszeile,Endzeile

Der PUT-Befehl speichert den RAM-Inhalt als SEQ-Datei auf Disk. Der /a -Schalter ist optional und wandelt die Datei ins Standard-ASCII-Format um (und fügt 'linefeeds', Zeilenvorschübe, ein), bevor sie auf Disk gesendet wird.

Bitte Start- und Endzeile angeben, oder beide auslassen (dann werden sie auf 0 bzw. 65535 gesetzt).

Beispiele:

put "DieseDatei" speichert RAM in eine Datei "DieseDatei" auf dem

Default-Laufwerk

put b:JeneDatei,5000 speichert ab Zeile 5000 als "JeneDatei" auf Lw. b:

put text - 5000 speichert bis Zeile 5000 auf das Default-Laufwerk

put range,3000,4000 speichert den Bereich Zeilen 3000-4000 als 'range'

put/a Kapitel9.txt speichert Speicherinhalt als ASCII-Datei 'Kapitel9.txt'

Befehl: PUTRAM

siehe auch: GETRAM, RAMDISK

Syntax: putram d:Dateiname

PUTRAM speichert den Inhalt der aktuell definierten RAMDISK als Diskdatei und entspricht dem BASIC-Befehl

BSAVE"Dateiname",B(Bank),P(Startadresse) TO P(Endadresse+1), Dx on Uy

Mit GETRAM, PUTRAM, INSTALL und REMOVE lassen sich Gruppen Deiner Lieblingsutilities zusammenstellen und etliche Deiner 'Entwicklungen' abspeichern. Z.B. Assemblerzubehör auf eine Disk, Filekopierer und ARC (Archivdateien) auf eine andere, BASIC Programmierhilfen auf eine weitere, u.s.w. Dadurch läßt sich viel 'swapping' (hin- und herkopieren) sparen, besonders, wenn nur ein Disklaufwerk zur Verfügung steht.

Es ist schlau , besonders mit der großen 1750-RAM-Disk, ab und an ein Backup der RAM-Disk zu machen. Obwohl die Daten dort relativ sicher sind, ist es doch möglich, daß irgendwelche harmlos aussehende Programme so den Speicher beschreiben, daß ohne vernünftigen Grund die RAM-Disk zerrissen wird. Das trifft oft auch dann zu, wenn Du irgendwas programmierst und von Zeit zu Zeit Abstürze fabrizierst.

Eine 'zerrissene' RAM-Disk kann man zwar abspeichern (PUTRAM), aber man hätte nichts davon, sie wieder zu laden. Deshalb ist es sinnvoller, auf eine frühere Sicherung zurückzugreifen.

Beispiele:

putram c:modemstuff speichert 'modemstuff' auf Laufwerk c:

putram spritestuff speichert 'spritestuff' auf Default-Laufwerk

Schlüsselwort:RAMDISK

siehe auch: GETRAM, PUTRAM, INSTALL, REMOVE, SETRAM, RDOFF, RDIR

Dateien werden in der RAM-Disk als 'linked list' gespeichert, ganz ähnlich wie BASIC die Zeilen eines BASIC-Programms speichert.

Kein Befehl wird tatsächlich dort ausgeführt, wo er in der RAM-Disk sitzt, - er wird erst dorthin verschoben, wo er ablaufen soll. Dadurch ist die RAM-Disk frei verschiebbar ('completely relocatable'); sie kann heute in Bank 1, morgen irgendwo in Bank 0 und übermorgen im ROM liegen.

Du kannst jedes Programm, das klein genug ist, um in die RAM-Disk zu passen, dadurch laden und starten, indem sein Name in die Befehlszeile eingegeben und RETURN gedrückt wird. Um die Namen leichter eingeben zu können, sind die Dateinamen rename-bar, bevor sie INSTALLiert werden.

Jeder RAM-Disk-Eintrag besteht aus einem kleinen Header, gefolgt von der Datei selbst. Das Format ist:

2 Bytes Offset zum nächsten RAM-Disk-Eintrag. Eine Null signalisiert: Ende der

RAM-Disk erreicht

? Bytes Dateiname, Null wird ausgelassen

1 Byte Ist Bit 7 wahr, handelt es sich um eine SEQ-Datei; Bit 6 wahr = Type-

Datei; anderenfalls: Batchdatei

? Bytes die Datei-Daten folgen

Befehl: RDIR

siehe auch: INSTALL, REMOVE, GETRAM, RDOFF

Syntax: rdir/w

Vielleicht brauchst Du diesen Befehl oft, er listet die Dateien (oder Befehle), die in der aktuellen RAM-Disk gerade vorhanden sind. Im ausgegebenen RAM-Disk Directory sind Dateiname, Start- und Endadresse, gesamt verbrauchter Speicherplatz (im RAM) und noch freier Platz enthalten.

Beispiele:

*rdir schickt RAM-Disk Directory (auch) zum Drucker

rdir >ram1.dir schickt RAM-Disk Directory in eine Textdatei namens 'ram1.dir'

rdir/w Ausgabe der RAM-Disk Directory fortlaufend, anstatt

untereinander (am Bildschirm)

Befehl: RDOFF

siehe auch: SETRAM

Syntax: rdoff

Die RAM-Disk wird gelöscht, der Speicher dem BASIC zur Verfügung gestellt. Dabei vollzieht rdoff verschiedenes:

Erstens: die Flag(s), für den Befehlszeilen-Interpreter werden zurückgesetzt und damit die automatische Suche nach den Befehlen in der RAM-Disk unterbunden. Befand sich die RAM-Disk in einer anderen Bank als 0 oder 1, ist jetzt schon alles zur Abschaltung getan.

Zweitens prüft rdoff, ob sich die RAM-Disk in Bank 0 oder 1 befindet. Wenn ja, wird versucht, den BASIC-Endzeiger wieder so herzustellen, wie er vor der Installation war. Wurde aber in der Zwischenzeit die BASIC-Endadresse durch Programme unterhalb die durch SETRAM gelegten Grenzen verschoben, tut RDOFF nichts (und teilt Dir das auch mit). Ist das nicht das, was Du willst, drücke RESET und gib' 'SYS 6000' ein, um die CS-DOS-Shell zu reaktivieren; so hast Du die RAM-Disk aufgelöst und Dein 'normales' RAM zurück.

RDOFF ist vergleichbar dem NEW (mit dem aber der RAM-Disk-Inhalt nicht beeinflußt wird), es gibt aber kein 'OLD' für RDOFF. Auch SETRAM nach RDOFF kann die RAM-Disk nicht restaurieren. (u.U. sind mit RESET oder COLD-Befehl und SYS 6000 ein paar Zeiger auf die RAM herstellbar).

Befehl: REMOVE

siehe auch: INSTALL, RDIR, SETRAM

Syntax: remove Datei1 Datei2 Datei3 . . .

Löscht Datei(en) von der RAM-Disk. Hier sind leider keine Joker erlaubt, jeder Dateiname ist voll auszuschreiben.

Befehl: REN

Syntax: ren d:DateinameAlt DateinameNeu

Ändert den Dateinamen von 'DateinameAlt' auf 'DateinameNeu' im Laufwerk d: . REN verhält sich wie der BASIC-Befehl RENAME und ist gleichwertig zu:

RENAME "DateinameAlt" TO "DateinameNeu", Dx ON Uy

Beispiele:

ren "a b c" abc um die Leerschritte im Dateinamen loszuwerden

(Anführungszeichen weil Leerschritte im Dateinamen)

ren "a?b?c?" abc ungültig. Keine Jokerzeichen zugelassen

Befehl: RSAVE

siehe auch: INSTALL, RDIR, SETRAM, GETRAM

Syntax: rsave Datei1 Datei2 Datei3 . . .

Kopiert ein Programm aus der internen RAM-Disk in eine Floppy PRG-Datei. Joker sind nicht erlaubt, Datenamen müssen korrekt ausgeschrieben werden.

Beispiele:

rsave a:arc speichert 'arc' von RAM-Disk nach Laufwerk a:

rsave dir put speichert 'dir' und 'put' aufs Defaultlaufwerk

Schlüsselwort:SCROLL

siehe auch: TEXT, BASIC, GET, PUT

Eine der besten Eigenschaften des Commodore BASIC, besonders im 128'er 80-Zeichenmodus ist der Bildschirmeditor; Commodore hat nicht nicht viel ausgelassen, . . . aber das Scrolling. Wenn Du einmal frei mit den Cursortasten durch ein Programm vor- und zurückgescrollt hast, wirst Du diesen Luxus wohl nicht mehr missen wollen. Darum haben wir ein Scroll-Tool mit eingebaut, bei dem auch Leerzeilen kein Problem sind.

Scroll blendet sich im RUN-Modus selbst aus, so daß Beeinflussungen der Programme nicht auftreten dürften.

Scroll braucht nicht viel Erklärung, es sucht sich, wenn der Cursor über den unteren (oberen) Bildschirmrand gesteuert wird, aus dem RAM die nächst-höhere (-niedere) Zeilennummer. Dabei ist es Scroll egal, wo die (erste) Zeilennummer herkommt: es könnte das Ergebnis eines FIND-Vorganges sein, oder schlicht eine eingetippte Zeilennummer.

Befehl: SETRAM

siehe auch: RDOFF, RDIR, GETRAM, RAMDISK, PUTRAM, INSTALL, REMOVE

Syntax: setram Bank, Adresse

setram 1750bank+1, 1750bankanzahl

SETRAM legt Teile des Speicherplatzes aus dem RAM (C128-intern, oder aus der 17xx Erweiterung) als RAM-Disk fest. Irgendwelche Programme, die in die RAM-Disk kopiert werden, verhalten sich wie eingebaute Befehle. In der MS-DOS-Sprache ausgedrückt, verhält sich die RAM-Disk so, als wäre 'RAM-Disk' die einzige Directory in deinem PATH.

Hast Du mehr als ein Laufwerk zur Verfügung und es macht Dir nichts aus, vor jedem Befehl einen Laufwerksbuchstaben einzutippen, kommst Du ganz gut auch ohne RAM-Disk aus. Alle Befehle können gleichwohl von Disk, wie von RAM-Disk gestartet werden.

Hast Du eine 1750, so installiere dort die RAM-Disk und ignoriere die nächsten paar Absätze.

Ohne Speichererweiterung ist es eine gute Idee, eine kleine 8 oder 12K RAM-Disk in Bank 1 zu installieren und dort kleinere vielbenutzte Befehle abzulegen, und die größeren Befehle (Programme) -wie z.B. ARC- von Diskette zu starten. Die 1571 ist doch ganz schön schnell, so daß sich eine RAM-Disk nicht unbedingt lohnt.

RAM-Disk ist in irgendeine der Bänke 0 bis 11 installierbar. Ich weiß nicht, wofür Commodore die Bänke 2 und 3 konzipiert hat, aber meide sie besser für's erste, da SETRAM für diese beiden die BASIC-Zeiger nicht richtig hinbekommt (Bank 2 ist in Wirklichkeit Bank 0 und Bank 3 die 'echte' Bank 1).

Die Bänke 4 bis 11 sind internes und externes ROM. Hast Du Zugriff auf einen EPROM-Brenner, so könntest Du die RAM-Disk in einer dieser Bänke installieren. Bezüglich des Befehlszeilen-Interpreters macht es keinen Unterschied ob es sich um eine RAM- oder ROM-Disk handelt. Deshalb, spiele ein bißchen 'rum, bis Dir gefällt, was Du im RAM hast, sichere das mit PUTRAM als Diskdatei und brenne die dann auf EPROM.

Wahrscheinlicher ist, daß Du die RAM-Disk in Bank 1 oder 0 installierst. Dabei sind ein paar Dinge zu beachten:

Manche Befehle (bis jetzt sind das ARC, MOVE und COPY) nutzen Bank 1 als Ein-/Ausgabepuffer, der dort beginnt, wo die DOS-Shell endet ($4000) und bis zum Ende des BASIC-RAM (d.h. falls in Bank 1 Deine RAM-Disk sitzt, bis zu deren Beginn) reicht. Gerät die RAM-Disk zu groß, wird der Puffer zu klein und der Schreib-/Lesekopf des Laufwerks muß Extraschichten einlegen (besonders wenn nur ein Laufwerk zur Verfügung steht).

Auch Bank 0 ist kein sonderlich gut geeigneter Ort für die RAM-Disk. Da es sehr einfach geht, eigene Programme für Bank 0 zu schreiben, kann es gut sein, daß die RAM-Disk durch dein Programm 'vernascht' wird. ARC benötigt RAM bis $C000 (49152) in Bank 0, deshalb ist dies die niedrigst mögliche Adresse, wenn ARC benutzt werden soll. Kein Befehl geht über $C000 hinaus, deshalb ist dieser Bereich ziemlich sicher (wenn er Dir reicht).

Ich werde versuchen, so gut es geht, den Bereich oberhalb $C000 in allen Bänken freizuhalten (mit LHA ist's nicht möglich).

In allen Bänken ist die absolut niederigste Adresse für die RAM-Disk $4000 (16384).

Für die 1750 lautet die Syntax:

setram ErsteBank,AnzahlBänke

wobei 16, 17 . . . 23 für 'ErsteBank' den 1750-Bänken 0, 1 . . . 7 entspricht. So reserviert

setram 16,8

die ganze 1750,

setram 22,2

nur die letzten beiden Bänke für die RAM-Disk. Es ist möglich, mehr als eine RAM-Disk zu installieren, aber es kann jeweils nur eine aktiv sein.

Da es recht lange dauert, eine große RAM-Disk in die 1750 einzuladen, initialisiert SETRAM die RAM-Disk nicht. Das bedeudet, was auch immer gerade in der RAM-Disk steht, wird als gültige RAM-Disk angesehen. Die AUTOEXEC-Datei, die mit dem CS-DOS kommt, prüft anhand des IF-Befehls, ob die RAM-Disk gültig ist. Ist der IF-Befehl vorhanden, wird eine intakte RAM-Disk angenommen und so die Zeit gespart, sie nochmals laden zu müssen.

Für die Initialisierung der RAM-Disk gibt es zwei Möglichkeiten. Erstens mit GETRAM eine früher ge-save-te RAM-Disk einladen. Zweitens mit dem BASIC-Befehl STASH zwei Nullen an den Anfang der RAM-Disk setzen. Letzteres ist auch notwendig, wenn nach einem SCRATCH eine neue RAM-Disk aufgebaut wird.

Beispiel: (Einrichtung einer RAM-Disk in 1750-Bank 0 und deren Initialisierung)

setram 16,1

poke4864,0:poke4865,0

stash 2,4864,bank,0 (bank=erste benutzte 1750-Bank, hier 0)

weitere Beispiele:

a:setram 1,$b000 installiert RAM-Disk in Bank 1 bei 45056

a:setram 0,49152 installiert RAM-Disk in Bank 0 bei $c000

a:setram 8 $4000 installiert RAM-Disk in die Cartridge. Ist irgendetwas

außer RAM-Disk dort, sind die Ergebnisse unvorher-

sehbar

a:setram 16,1 nutzt nur die erste Bank der REU 17xx

Befehl: TEXT

Befehl: BASIC

siehe auch: GET, PUT, FIND, CHANGE, SCROLL

Syntax: text

Syntax: basic

Wählt den Text- bzw. Basicmodus. Die Editorbefehle FIND, CHANGE und LIST, sowie das SCROLL-ing verhalten sich etwas unterschiedlich, abhängig vom gewählten Modus.

Wie wir alle wissen, spart BASIC ein wenig Platz und Zeit, indem Befehle token-isiert (in eine 'Abkürzung umgewandelt') werden. Diese Token sind nur ein Byte groß. Beim LIST-en eines BASIC-Programmes werden die Token entsprechend rückübersetzt. Hier liegt das Problem, wenn mit dem BASIC-Editor Textdateien bearbeitet werden. Viele übliche Zeichen einer Textdatei (in Verbindung mit Großbuchstaben) werden beim LIST-en 'rückübersetzt', oder von BASIC aus token-isiert. Dies ist durch die Wahl des Modus abschaltbar (Text-Modus) oder einschaltbar (BASIC-Modus).

Bist Du mit der Token-isierung nicht vertraut, probiere sie doch einfach aus, indem Du ein BASIC-Programm einmal im Text- und einmal im BASIC-Modus LIST-est. Dann gib ein paar Zeilen im Text-Modus ein (unter Verwendung von Großbuchstaben) und LIST-e sie in beiden Modi . . . und sehe, was ich meinte.

Bei Moduswechsel ändert sich die Bildschirm-Vordergrundfarbe (als Gedächtnisstütze).

Befehl: TIME

siehe auch: DATE

Syntax: time hhmmss

Setzt die Uhr (bei $dc08) auf die angegebene Zeit.

Da viele Programme in der Uhr 'rumfummeln, ist es müßig, 'was vernünftiges zu machen und es ist durchaus wahrscheinlich, daß die Zeit ab und an verloren geht.

Trotzdem kann die Zeit gut für eine Zeitmessung genutzt werden und bei Vermeidung 'verletzender' Programme, auch zur Anzeige der Tageszeit.

Beispiele:

time zeigt die aktuelle Zeit an

time 1:34 setzt die Zeit auf 1:34:00.0

time 024515 setzt die Zeit auf 2:45:15

time 0 setzt die Zeit auf 0:00:00.0

Ein Beispiel für eine Batch-Datei:

time 0

arc/.. %1 %2 %3 %4 %5 %6 %7 %8 %9

echo Vergangene Zeit:

time

Befehl: TYPE

siehe auch: *, >, >>

Syntax: type/x d:Dateiname

Type zeigt Dateiinhalte an.

/x ist optional, x kann sein:

a wandelt die Ausgabe von PETSCII in Standard-ASCII um

p wandelt die Ausgabe von Standard-ASCII in PETSCII um

s zeigt die Datei als Bildschirmcode

h zeigt die Datei als Hexadezimal-Bytes

Joker dürfen benutzt werden, zur Anzeige kommt aber nur die jeweils erst-gefundene Datei.

In Verbindung mit /s (Bildschirmcode) funktionert die parallele Ausgabe auf Diskette oder Drucker leider nicht.

Beispiele:

type read.me zeigt 'read.me' ohne Umwandlung an

*type/p read.me kopiert 'read.me' auf den Drucker, umgewandelt

von Standard-ASCII auf PETSCII

type/s *=p zeigt erste Programmdatei des Default-Laufwerks

als Bildschirmcode an.

type/a pet.txt >asc.txt kopiert 'pet.txt' als 'asc.txt' unter Konversion

(Umwandlung) von PETSCII- nach ASCII-Code

Befehl: VAL

siehe auch: COMMAND LINE, INT11

Syntax: val Zahl Zahl Zahl . . .

Val zeigt den Wert eines Ausdrucks (zwei Bytes) in verschiedener Form an.

'Zahl' kann sein:

%Binärzahl

(Klammeraffe)Oktalzahl

Dezimalzahl

$Hexadezimalzahl

Der 'Ausdruck' wird in jedem der Zahlensysteme angezeigt und auch in Bildschirmcode.

Beispiele:

Eingabe Ausgabe

val $4000 $4000 16384 %0100000000000000 -(Klammeraffe)

val %11 Kla11 11 $11 $0003 3 %0000000000000011 Kla c

$0009 9 %0000000000001001 Kla i

$000b 11 %0000000000001011 Kla k

$0011 17 %0000000000010001 Kla q

Befehl: VDEL

siehe auch: DEL

Syntax: vdel/a Suchmuster (. . .Suchmuster . . .)

Scratch-t (löscht) die angegebene(n) Datei(en). Bis zu 20 Suchmuster können unter Verwendung aller Joker eingesetzt werden. Bevor jede einzelne Datei tatsächlich gelöscht wird, erfolgt eine Sicherheitsabfrage; beantwortet mit 'n' oder <RETURN> wird nicht gelöscht, 'y' löscht. Als dritte Möglichkeit kann * eingegeben werden, es weist vdel an, ohne weitere Sicherheitsabfrage(n) fortzufahren.

Der optionale Schalter /a (wie 'always' = 'immer') übergeht von vornherein die Sicherheitsabfrage(n) (umsichtig handhaben!).

Mit vdel können keine 1581-Unterverzeichnisse und keine offenen oder nicht richtig geschlossenen Dateien gelöscht werden (aber mit ' >s0:Name' der Wedge geht's).

Beispiele:

vdel &*.arc löscht alle Dateien außer Archiven vom Default-Laufwerk

vdel a:* b:* löscht alle Dateien aus Laufwerken a: und b:

Befehl: >

siehe auch: COPY, REN, DEL, MOVE

Syntax: >Diskbefehl

> schickt einen Diskbefehl zum Default-Laufwerk. > alleine, holt den aktuellen Diskstatus vom Default-Laufwerk und zeigt ihn an. Dies ist einer der wenigen fest eingebauten Befehle.

Beispiele:

>i0 initialisiert Drive 0 des Default-Laufwerks

>n0:1571 disk,ss formatiert Diskette

>u0>m1 schaltet die 1571 in den 1571-Modus

>uj läßt eine 4040 rasseln und schnarren (A.d.Ü.: ???)

> entspricht 'PRINT DS$'

Schlüsselwort: ARC 2.41

ARC 2.41 ist im Grunde das gleiche wie die 64'er Version ARC 2.30, deshalb erstmal die Unterschiede.

Am wichtigsten: die 128'er Version ist zur 64'er 100%ig kompatibel, d.h. Archive, unter 128 erstellt, können vom 64'er aufgedröselt werden und umgekehrt.

ARC/C wurde 'rausgeschmissen. ARC/A erstellt nun sowohl neue Archive, als auch Erweiterungen ('append') bestehender Dateien. ARC prüft, ob ein Archiv bereits existiert, wenn ja, wird automatisch angefügt ('append'); wenn nein wird ein neues Archiv angelegt.

ARC/M ist aufgenommen. Es entspricht im wesentlichen dem ARC/A, nur daß eine neu ins Archiv aufgenommene Datei vom Source-(Quell-)Laufwerk automatisch gelöscht wird (deshalb umsichtig anwenden!).

Eine Kurzübersicht der ARC-Syntax bekommst Du mit

ARC/?

Der größte Unterschied zwischen den beiden Versionen offenbart sich, wenn Du stolzer Besitzer einer 1571 oder 1581 bist: die Geschwindigkeit. Infolge besseren Pufferns und der besseren 71'er Übertragungsrate, ist ARC nun etwa 3mal schneller, als in der Kombination 64/1541. Auch IEEE-Drives sind schneller (hauptsächlich durch die 2MHz Taktrate).

ARC wurde auf einem System mit je einer 1571, 1581, 4040, 8250 getestet.

Da ARC mit einem großen Puffer in Bank 1 arbeitet, gibt es viel weniger Disk-Aktivitäten sowohl beim anlegen, als auch beim aufdröseln von Archiven auf Single Drive Systemen (mit nur einem Laufwerk). Der Puffer ist Inputpuffer beim auflösen, Outputpuffer beim anlegen der Archive. Befehle, die keinen Nutzen aus dem Puffer ziehen, benutzen ihn auch nicht (z.B. ARC/P oder ARC/L).

Neu sind die erweiterten Suchmuster (an anderer Stelle beschrieben), die bei Errichtung der Archive benutzt werden können. Zur Extraktion aus Archiven gelten (immer noch) die Standard CBM-DOS Suchmuster (Joker).

Letztlich konnte ARC 2.30 keine relativen Dateien mit Ein-Laufwerk-Konfigurationen extrahieren, da ARC 2.30 sowohl das Archiv, als auch die relative Datei gleichzeitig offenhalten mußte ('das ging mit einer 1541 nicht so gut' und mündete in einen 'no channel error'). Das ist jetzt bereinigt.

Bist Du mit der 64'er Version bereits vertraut, ist das alles, was Du wissen mußt.

Hinzufügen von Dateien in ein Archiv

arc/a <d:ArcDatei.arc> <s:Suchmuster1> <s:Suchmuster2> . . .

arc/ax <d:ArcDatei.arc> <s:Suchmuster1> <s:Suchmuster2> . . .

arc/m <d:ArcDatei.arc> <s:Suchmuster1> <s:Suchmuster2> . . .

arc/mx <d:ArcDatei.arc> <s:Suchmuster1> <s:Suchmuster2> . . .

Diese Befehle erstellen ein Archiv auf Laufwerk d: namens 'ArcDatei.arc' oder erweitern dieses Archiv, sollte es schon vorhanden sein. Bis acht Suchmuster sind zulässig, x kann folgende Werte annehmen:

n ohne Datenkompression werden die Dateien einfach nur abgelegt

p alle Dateien werden gepackt

s alle Dateien werden ge-squeeze-t

q alle Dateien werden ge-squash-t

c alle Dateien werden ge-crunch-t (in zwei Durchgängen)

1 alle Dateien werden ge-crunch-t (in einem Durchgang)

z crunch abschalten. Entspricht ARC/A, außer daß crunching niemals als

Kompressor gewählt wird

ARC/M verhält sich genauso wie ARC/A, außer daß die ins Archiv bewegte ('moved') Datei vom Herkunfts-Laufwerk gelöscht ('scratched') wird.

Bei Auswahl der Option 1 werden Teile der Information, die zum 'auspacken' der Archive notwendig sind, am Ende der Datei gespeichert; dort steht die originale Dateilänge und die Prüfsumme. Und unglücklicherweise muß ARC die Dateilänge genau wissen, bevor's an die Arbeit geht, damit der Speicherplatz auf der Diskette genau zugeteilt werden kann. So sind REL-Dateien nicht in einem Durchgang zu crunchen. Sollte ARC in der Option 1 auf eine REL-Datei stoßen, wird diese (automatisch) mit der Option c behandelt.

Die z Option wurde schon in ARC 2.30 eingefügt und funktioniert gleich wie ARC/A, d.h. ARC wählt automatisch den jeweils besten Datenkompressor (aber niemals crunch). Die z Option stellt die Kompatibilität zum USQ-Utility her (das ge-crunch-te Dateien nicht unterstützt).

Beispiele:

arc/a a:sq b:sq.* b:usq.* erstellt Archiv 'sq.arc' auf Laufwerk a:, das dann

alle Dateien enthält, die mit 'sq.' oder 'usq' beginnen

arc/as a:test.arc f:*-* archiviert alle Dateien von Laufwerk f: mit einem '-'

im Namen als 'test.arc' auf Laufwerk a. und

squeez-t alle Einträge

arc/m seq b:*=s archiviert alle sequentiellen Dateien von Laufwerk b:

als 'seq.arc' im Default-Laufwerk und löscht sie

danach von b:

Manchmal stimmt die Anzahl der Blöcke im Directorylisting nach einem Append (anfügen) nicht mit ARC überein. Das ist ein harmloser Fehler (bug) im CBM-DOS. Seltsam genug, daß ein Validate zwar Deine Zeit verplembert, aber den Blockzähler nicht beeinflußt.

Wegen der Kompatibilität können ältere Archive mit dieser Version erweitert werden.

Bei der Erweiterung (Append) von Dateien solltest Du etwas vorsichtig sein, damit die Archivlänge ein ganzzahliges vielfaches von 254 Bytes wird. Überträgst Du Archive über Modem (mit XMODEM Protokoll), geschieht das 128-Byte-weise. Ist die Datei nicht ein vielfaches von 128 Bytes lang, wie die meisten, 'polstert' XMODEM die Datei bis zur passenden Länge auf. Konsequenterweise wird auch noch ein extra Diskblock ans Ende des Archives angefügt. Mit einem Disk-Doktor Programm ist das leicht zu lösen: ändere die Linkadresse des vorletzten Sektors im Archiv auf 0,255.

Mit der Extraktion von Dateien aus 'downloaded' XMODEM Archiven sollte es keine Probleme geben, da ARC die 'Aufpolsterung' des XMODEM ignoriert. Aber bevor Du ein Archiv erweiterst, solltest Du dieses Problem angehen, sonst kannst Du nicht mehr de-archivieren.

Zur Erkennung Dieser Art von Problem, hat ARC den Befehl

arc/f ArchivName

erhalten. ARC marschiert die Track/Sektor-Linkadressen des Archives ab und schmeißt den letzten Sektor raus. Ist das Archiv in Ordnung und die letzte Linkadresse ist -wie sie sein sollte- '0,255' unternimmt ARC nichts weiter, sondern gibt die Meldung aus

archive is ok.

Ist das Archiv nicht in Ordnung und die Linkadresse ist eine andere als 0,255 , geht ARC in den zweitletzten Sektor und ändert dort die Adresse auf 0,255 . So wird der Extrasektor des XMODEMs 'entfernt'. Arc wird aber weder den gelöschten (deleted) Sektor freigeben, noch den Directoryblockzähler aktualisieren. Brauchst Du diesem Block unbedingt, mache ein Validate.

Dateien aus einem Archiv herausholen (extract) mit:

arc/x d <d:Archivdatei> <Suchmuster1> <Suchmuster2> . . .

Ohne Suchmuster wird alles extrahiert, ansonsten nur die 'Treffer' der Suchmuster. Verschlüsselte Dateien (encrypted files) werden von ARC nicht mehr unterstützt, sie müssen mit der 64'er Version bearbeitet werden. (Das ist die einzige 'Inkopatibilität' der neuen zur alten Fassung.)

Beispiele:

arc/x a:sq holt alle Dateien aus 'sq.arc' von Laufwerk 8,0 und legt sie im

Default-Laufwerk ab

arc/x a:sq * gleich obigem Befehl

arc/xf b:temp.arc holt alle Dateien aus 'temp.arc' von Laufwerk 8,1 und legt sie

auf der Diskette in f: (10,1) ab

arc/e c:buch060893 kapitel9 holt nur die Datei 'kapitel9' aus dem Archiv

'buch060893' ins Laufwerk c:

ARC/X und ARC/E sind synonym (gleich)

arc/l <d:ArchivName> listet die Dateien eines Archives, was typischerweise etwa so

aussieht:

arc/l a:archelp

ARC version 2.41

03/86 . . . Ampere Metal

directory for archive: a:archelp.arc

======================================================================

filename type blks now v stowage date

======================================================================

xarc.type.me p 129 41 2 crunched 24aug86

samples s 22 9 2 crunched 24aug86

================ ==== ====

2 files 151 50

Die beiden ersten Spalten zeigen Dateinamen und -typ (p,s,u,r),

die nächsten beiden die Dateilänge vor bzw. nach Kompression

(bei Rel-Dateien stimmen die Blöcke nicht mit dem Directory

überein, da ARC die 'Sidesectors' nicht braucht). Spalte v ist die

Versionsnummer (derzeit drei möglich: '1' für Archive unter 1.xx

erstellt, '2' für 2.xx, oder 'I' für MS-DOS Archive). Desweiteren

erfolgt die Angabe der Kompressionsmethode und des Datums

(Datum nur in der 80-Zeichen-Version).

arc/px <d:ArchivName> <Suchmuster1> <Suchmuster2> . . .

druckt die angegebenen Dateien aus 'AchivName' auf den Bild-

schirm. Die Syntax ist gleich ARC/X, nur geht der Ausdruck auf

den Bildschirm anstatt auf Diskette.

Der optionale Schalter x kann folgende Werte annehmen:

p wandelt von Standard-ASCII ins Commodore-ASCII um

a wandelt von PET-SCII ins wahre ASCII um

arc/v <d:ArchivName> <Suchmuster1> <Suchmuster2> . . .

Verifiziert die Inhalte des Archives. ARC berechnet eine zwei-

Byte Prüfsumme aus der noch nicht komprimierten Originaldatei.

Beim Verify dekompressiert ARC die Dateien, berechnet die neue

Prüfsumme und vergleicht sie mit der gespeicherten und gibt

ggf. eine Fehlermeldung aus (Fehler können durch Disketten-

fehler oder Fehler beim 'upload' oder 'download' auftreten).

Die Syntax entspricht wieder der von ARC/X, d.h. es müßte Dir

aufgefallen sein, daß alle drei Befehle (/X, /P, /V) nur leichte

Variationen der gleichen Sache sind.

Befehl: CSARC

Syntax: CSARC/n d:Archivname <Suchmuster 1> <Suchmuster2> . . .

CSARC legt Archive im Standard-MS-DOS-Format an, das sowohl von IBM PC/XT/AT und kompatiblen, sowie von Atari st und Amiga benutzt wird.

Der /n Schalter (opt.) verhindert Datenkompression, alle Dateien werden 'nur gespeichert'.

In der vorliegenden Form kann CSARC nur direkt, oder ge-crunch-t in die Archive speichern (nicht ge-pack-t oder ge-squeeze-t). PKARCs squashing, obwohl leichter auszuführen als crunching, konnte durch die Begrenzung des Speicherplatzes nicht mit aufgenommen werden.

CSARC hat nur eine Einschränkung in Dateinamen, sie müssen kürzer als 12 Zeichen sein. CSARC wandelt den Dateinamen in Standard-ASCII um, bevor ge-arc-t wird, aber prüft nicht, ob es sich tatsächlich um einen (unter MS-DOS) gültigen Dateinamen handelt - das liegt in Deiner Verantwortung. (MS-DOS Dateinamen müssen die Form 'Name.ext' einhalten. 'Name' ist maximal 8 Zeichen lang, 'ext' (Extension,Erweiterung) maximal 3 Zeichen.

Weder in 'Name' noch 'ext' dürfen vorkommen:

Klammern (alle Arten), Punkt, Komma, ; , : , ?, *, /, Backslash, +, ", Space, >, <,

CBM-Grafik- und Steuerzeichen

Um sicher zu gehen, benutze nur a-z, 0-9.

CSARC bedient sich lediglich der Standard-I/O-Befehle (OPEN,CHRIN,CHROUT) und sollte deshalb mit jedem CBM-Laufwerk zusammenarbeiten.

Befehl: CSARC1750

Der CSARC1750-Befehl entspricht in Zweck und Syntax dem CSARC, hat aber ein paar Vorteile. Vor allen gibt es hier einen Schalter /p, mit dem CSARC eine Pause einlegt, wenn ein Archiv erstellt ist (um auf Systemen mit nur einem Laufwerk ggf. einen Diskwechsel vornehmen zu können).

Zweitens nutzt CSARC1750 Burstroutinen, um Dateien, die zu archivieren sind, zu lesen. Unter CSARC ist das nicht möglich, da eine Datei nicht zum schreiben (des Archives) geöffnet sein kann und gleichzeitig Burstload-Routinen anwendbar sind.

Das Archiv wird innerhalb der 1750 erstellt, die als Auffangpuffer (capture buffer) dient. Vergewissere Dich, vorab alles aus der 1750 gesichert zu haben, was Dir noch wichtig ist, bevor CSARC1750 aufgerufen wird. Beachte außerdem, daß der Auffangpuffer groß genug ist, das ganze Archiv zu fassen, weil Du keine Fehlermeldung bekommst, wenn der Puffer überläuft (dann mußt Du nochmal von vorne anfangen).

Da die Datei während der analyze-Phase ge-crunch-t wird, ist CSARC1750 deutlich schneller als CSARC (wenn überhaupt ge-crunch-t werden soll).

Befehl: CSXARC

Syntax: csxarc/p Dateiname

CSXARC löst (immer nur ganze) MS-DOS Archive auf. Die extrahierten Dateien kommen aufs Default-Laufwerk. Mit der /p Option erfolgt Bildschirmausgabe unter gleichzeitiger Umwandlung von ASCII in PETSCII.

Unglücklicherweise speichert MS-DOS am Archivende eine EOF-Marker ('end of File'). Um ein Archiv zu erweitern (append), ist es notwendig, jenes um zwei Bytes zu kürzen (und das ist im CBM-DOS äußerst umständlich). Konsequenterweise ist es nicht möglich, bestehende Archive mit CSARC zu erweitern. Der EOF-Marker würde bestehen bleiben, und obwohl beim erweitern augenscheinlich alles glatt lief, wäre kein Programm in der Lage, die angehängten Dateien zu extrahieren.

Die Speicherbelegung im C128 für CSARC:

Bank 0 $1c01 - $2fff CSARC/CSARC1750 Programmdaten

$7000 - $f000 crunch-Stringtabellen

Bank 1 (strend)-(fretop) Inputpuffer

dies bedeudet mit anderen Worten, irgendetwas in Bank 1 ist bei Start von CSARC dort sicher, in Bank 0 aber nicht.

Schaust Du in die AUTOEXEC-Datei findest Du eine Zeile etwa wie . . .

poke dec("1bd0"),3*16+8 (hex 1bd0 entspr.: dez 7120)

Damit werden für CSARC die 1750-Bänke 3 bis 7 als Input/Output Puffer reserviert. Aktualisiere unbedingt diese Zeile, wenn Deine RAM-Disk größer als die (Default-) 128K wird (Bank 0 und 1), sonst wird sie durch CSARC verpfuscht.

CSARC wurde gegen PKARC (Version 3.6) ausgetestet, welches wohl wiederum mit der SEA-ARC (Version 5.10) kompatibel sein soll, aber ich habe nicht weiterverfolgt, was SEA nach derm arcwars-Aufruhr ('ARC-Krieg') mit ARC angestellt hat.

Befehl: LHA

Syntax: LHA-s Archiv Datei(en)

LHA legt Archive im LHARC-Format an. Die '-s' Option teilt LHA mit, eine selbstauflösende SFX anzulegen (siehe die SFX-Dokumentation für nähere Details).

PRO: Das LHA hat Vorteile gegenüber ARC128 und MS-DOS-ARC-Formaten und wird immer populärer. zu den Vorteilen gehört . . .

1.) Einfachheit. Mit nur einem Datenkompressions-Algorithmus ist der Code weniger komplex und wir müssen uns nicht um altmodische Versionen des Kompressors oder die mögliche Art des Kompressors kümmern.

2.) Beweglichkeit. Seit der C Quellcode für Kompressor und Dekompressor in der Public Domain erhältlich ist, wird das Format auf zahlreichen Systemen eingesetzt (MS-DOS, Amiga-DOS, u.a.). So können Archive, auf dem C128 erstellt, mit anderen Sytemen bearbeitet werden und umgekehrt.

3.) Effektivität. Der 'sliding dictionary data compression' -Algorithmus des LHARC ist eine deutliche Weiterentwicklung der 'Lempel Zev'-Technik, angewandt von ARC, ZOO und anderen. Desweiteren arbeitet die Technik gut mit kleinen Dateien und solchen zusammen, die sonst nicht so gut zu verdichten gehen. Oft liegt der Gewinn gegenüber ARC128 oder CSARC bei 20-25% oder mehr. Das bedeudet, daß eine mit Archiven randvolle 800K Floppydisk nach Umwandlung ins LHARC-Format noch etwa 160K frei hat.

4.) lange Dateinamen. Das LHARC-Format tyrannisiert dich nicht auf die 8+3 Einschränkung der Dateinamen und ist so für das Commodore 8 Bit DOS oder AmigaDOS o.ä. komfortabler.

5.) SFX. Das SelF eXtract Modul kann vom 64'er oder 128'er gestartet werden.

KONTRA:

Das hängt hier vom Vergleich ab. Im Vergleich mit PKWARE ZIP oder DHESI ZOO bleiben für LHARC Wünsche offen, bezüglich der Unterstützung von Dateikommentaren, Wiederherstellung beschädigter Archive, u.s.w., aber dennoch schlägt sich LHARC im Vergleich zu vielen anderen ganz gut.

Hauptproblem ist die Geschwindigkeit. Lempel Zev ist schneller, aber in der vorliegenden Fassung ist LHA nur unbedeudend langsamer als ARC128.

So überwiegen die Datenverdichtung und die Austauschbarkeit die 'Mängel' bei weitem.

Voraussetzung: LHA erfordert eine 1750 und läuft nicht ohne.

Hast Du keine RAM-Erweiterung, kannst Du LHARChive anschauen und/oder auflösen, aber nicht anlegen.

Jede Datei im Archiv bekommt einen Vorspann ('header'), der u.a. die ursprüngliche Dateigröße, die komprimierte Größe und die dateiberechnete CRC enthält. Diese Informationen stehen nicht zur Verfügung, bevor die Datei gespeichert wird, da LHA die komprimierte Datei erst in die 1750 verschiebt, den Vorspann (header) schreibt und dann von dort auf die Disk (ins Archiv) 'spült'.

Zu diesem Ablauf gibt's Alternativen, aber die sind zu kompliziert oder zu langsam.

Da Du die 1750 wohl auch für andere Aufgaben benutzen magst, mußt Du dem LHA mitteilen, welche Bereiche des RAMs freigehalten sind. Dazu dient etwa folgende Zeile z.B. in der AUTOEXEC-Datei

poke 7119,x*16+y

in der bedeudet x die niederigste zu benutzende Bank, y die höchste plus eins.

poke 7119,4*16+7

teilt LHA mit: benutze die 1750-Bänke 4, 5 und 6; alle anderen Bänke werden nicht angerührt. Oft reichen ein oder zwei Bänke aus. Wird eine komprimierte Datei größer als der zur Verfügung stehende Speicherplatz, bricht LHA einfach ab.

LHA verbraucht auch ein gutes Stück vom C128-Speicher: fast alles von Bank 1 ($4000 bis $e100) (LHA läuft nicht, wenn da was anderes zwischenkommt), sowie von Bank 0 $1c00 bis $bfff ($c000 und darüber wird nicht angerührt).

Nur PRG- und SEQ-Dateien sind archivierbar, REL- und USR-Dateien werden abgewiesen. REL- Dateien sind umständlich handzuhaben und werden deshalb (noch) nicht unterstützt; USR- Dateien können Dateien sein, aber auch nicht.

LHA prüft immer, ob die Zieldatei bereits existiert. Wenn ja, hängt es die neuen Daten an ('append'); wenn nein, wird die Zieldatei angelegt.

Für bessere Kompatibilität wandelt LHA den Dateinamen erst ins Standard-ASCII-Format um, bevor er in den Archiv-Header geschrieben wird. Beim extrahieren der Datei aus dem Archiv wird der Namen automatisch wieder ins Commodore-ASCII zurückverwandelt. Deshalb mußt Du aufpassen, daß die verwendeten Namen nur aus jeweils gültigen Zeichen bestehen und ggf. auch von anderen Systemen akzeptiert werden.

Auf Systemen, die Unterverzeichnisse untersützen, läßt LHARC im Archiv die Speicherung des vollen Pfad- und Dateinamens zu. Da Commodore-DOS Unterverzeichnisse nicht unterstützt, ignoriert LHX den Pfad- und gebraucht nur den Dateinamen. Das führt zu folgenden Effekten:

1.) In Commodore-Dateinamen sind Schrägstriche ('slash') vor- und rückwärts erlaubte Zeichen, führen aber zu Mißdeutungen. Deshalb die entsprechende(n) Datei(en) vor der Bearbeitung umbenennen.

2.) Eine Datei gleichen Namens kann in verschiedenen Unterverzeichnissen stehen. Da der Pfad weggelassen wird, würde die die zweite Datei die erste überschreiben. Dies zu umgehen, gibt es die -r Option, mit der LHX schon bestehende Dateien umbenennt. Dazu legt LHX eine Batchdatei namens 'Duplicates' (Doppelgänger) an, die, wenn alles gesagt und getan ist, editiert und ausgeführt werden kann.

Eigentlich sollte LHA mit einem Null-Header das Ende eines Archives markierenen, aber es tut's nicht, weil sowohl Amiga- als auch MS-DOS-LHARC ohne dies das Dateiende richtig erkennen. Das bedeudet, daß Du zwei LHARChive zu einem gültigen neuen aneinanderreihen kannst, vorausgesetzt, beide wurden mit LHA erstellt und kein XMODEM oder so hat die Dateilänge verändert. Das ist auch ein Grund, warum eine Erweiterung bestehender Dateien überhaupt möglich ist. Wenn Du natürlich via XMODEM überspielte oder per Amiga oder MS-DOS erstellte LHARChive hast, solltest Du diese nicht erweitern, da die zusätzliche Information verloren gehen kann, wenn LHX den Null-Header findet und sich damit am Dateiende wähnt. Es gibt einen Ausweg, aber das ist harte Arbeit und den Aufwand oft nicht wert.

Ist LHA fertig, teilt es die Anzahl der von Disk gelesenen und auf Disk geschriebenen Bytes mit. Beim neuanlegen eines Archives, geben die Zahlen die Gesamtlänge (incl. ggf. SFX- Header) des Archives an, bei einer Erweiterung nur die Länge der hinzugefügten Information.

LHA speichert den Dateityp im Archiv mit ab, so daß SEQ und PRG bei der Extraktion wiedergewonnen werden (natürlich nur LHA-erstellte LHARChive!). Ist eine Dateityp Information aus dem Archiv erhältlich, überschreibt diese den voreingestellten ('default') Typ. Das Dateityp-Byte liegt so gut im Dateinamen vergraben, daß es von MS-DOS- oder Amiga-LHARC nicht gefunden wird.

Während das Archiv aufgebaut wird, versucht LHA Dich mit einer Balkengrafik der Dateigröße vor und nach der Kompression zu beeindrucken. Jeder senkrechte Balken ist ein Viertel Zeichen breit und steht für 256 Bytes, und die Breite eines Zeichens steht für 1K. Der Balken für die originale Dateigröße wird während des Kompressionsvorganges aufgebaut, für die komprimierte Datei während des 'spülens' von der 1750 auf Diskette.

Anstatt alle zu archivierende Dateinamen in die Befehlszeile einzugeben, können sie auch in einer Datei angegeben werden. Zum Beispiel der Befehl

LHA test Klammeraffea:Namen

könnte das LHA beauftragen, daß es die Dateien, die in der Dateinamensliste 'a:Namen' verzeichnet sind, dem Archiv hinzufügen soll. Dies wäre zum Beispiel nützlich, wenn man an einem größeren Projekt arbeitet und regelmäßig die Arbeitsdatei aktualisieren möchte. Das könnte etwas Tipparbeit sparen, stünde die Liste der zu archivierenden Dateien in einer Backup-Liste-Datei. Der Hauptgrund für diese Option ist natürlich, daß LHA mit anderen Programmen zusammenarbeiten kann. Solche Programme (eine Art menügesteuerte Dateiauswahl zum Beispiel) könnten die ausgewählten Dateinamen speichern, die ins Archiv aufgenommen werden sollen und dann LHA aktivieren.

Das Format einer KlammeraffeName -Datei ist wie folgt. (LHA ignoriert alle Zeilen, die nicht konform gehen, oder mit einem Strichpunkt (Semikolon) beginnen)

d:Name,t ; alles nach dem t wird ignoriert

Name darf maximal 16 Zeichen lang sein und keine Joker enthalten

,t muß angegeben werden. t (type) steht entweder für p (PRG) oder für

s (SEQ)

d: Laufwerksangabe (optional)

Um Dir eine Vorstellung zu geben, wie schnell (oder langsam) LHA und LHX sind, hier ein paar Beispiele. Alle Tests sind mit identischem Archiv durchgeführt worden; es war nach ARC128 112 CBM-Blöcke groß, nach LHA 82.

Archiv-Listing: 'TEST.LZH'

Name Original Packed Ratio Date Time Attr Type CRC

LHA 11580 7468 64.5% 90-01-11 9:22:56 a--w -lh1- 6322

LHARC5.ASM 11650 2718 23.3% 90-01-11 9:28:16 a--w -lh1- 82a5

LHX 10982 6977 63.5% 90-01-11 9:23:18 a--w -lh1- 503b

LZHUF.C 10021 3442 34.3% 89-11-26 7:28:10 a--w -lh1- 55d3

4 files 44233 20605 46.6% 90-01-11 9:28:36

Zeitbeispiele Zeitbedarf in Sek.

Computer Progr. Quell-Lw Ziel-Lw erst. auflösen

20 MHz 386 LHARC Floppy gl.Floppy 13.7 21.2

1.13c Festpl. Festpl. 6.2 5.0

4.77MHz XT LHARC Floppy gl.Floppy 90.7 89.0

1.13c Festpl. Festpl. 54.1 29.8

Amiga 500 LHARC1.0 Floppy gl.Floppy 110.5 56.8

Festpl. Festpl. 96.9 29.0

C128 LHA/LHX 1571 1581 175.4 105.5

1581 gl.1581 171.5 118.0

C128 ARC128 1571 1581 205.7 121.0

1581 gl.1581 149.3 103.2

Obwohl der 128'er kein Hexer in Sachen Tempo ist, liegt er doch im Bereich dessen, was man von einer 2 MHz - 8 Bit Maschine erwarten kann.

Befehl: LHD

Syntax: LHD ArchivName <Suchschlüssel>

LHD zeigt den Inhalt eines LHARC-erstellten Archives. LHD zeigt die spezifizierten Dateien oder alle (wenn kein Suchmuster angegeben) an. LHD gibt zu jeder Datei und zum Archiv Informationen an.

Die verschiedenen Spalten des Archiv-Listings sind:

1) Filename Disk-Dateiname nach Umwandlung von Commodore- nach Standard-ASCII und

mit Pfad (soweit vorhanden)

2) Original die originale Dateigröße

3) Packed die komprimierte Dateigröße

4) Ratio Größe komprimierte Datei in % von Originalgröße

5) Date Datum der Dateieinrichtung

6) Time Zeit der Dateieinrichtung

7) Ver Version, Datei nur gespeichert: -lh0- Datei komprimiert: -lh1-

8) CRC CRC für die Datei vor Kompression (PKARC-Stil)

Die 'total disks blocks' (gesamt-Diskettenblöcke) am Ende des Ausdrucks geben an, wieviele Diskblocks bei Extraktion der angezeigten Archivdateien belegt würden.

Beispiele:

LHD Name erstellt aus Archiv 'Name.lzh' ein Directory aller Dateien

LHD progs *.c erstellt aus Archiv 'progs.lzh' ein Directory der Dateien, deren

Namen mit .c enden

LHD e:e e* erstellt aus Archiv 'e:e.lzh' ein Directory der Dateien, deren

Namen mit e beginnen

belegter Speicherbereich:

Bank 0 $1c00 bis $bfff

Bank 1 keiner

Befehl: LHX

Syntax: LHX Optionen ArchivName <Suchschlüssel>

LHX extrahiert aus 'ArchivName' die in Suchschlüssel spezifizierten Dateien (oder alle, ohne Angabe des Suchschlüssels). Die Optionen können einzeln, kombiniert oder garnicht angewendet werden:

-a zur Umwandlg. der extrahierten Dateien von Standard- nach Commodore- ASCII

-c bestimmt die Dateien als Commodoredateien. Zum Gebrauch, wenn in

Dateinamen Schrägstriche ('slash' und 'backslash') vorkommen und diese nicht

als Unterverzeichniskennung dienen (sollen)

-l listet die vollen Dateinamen des LHARChives auf, einschließlich der bei

Extraktion notwendig werdenden CBM-Diskblöcke

-p gibt die extrahierte Datei auf Bildschirm anstatt auf Diskette aus

-r normalerweise werden Dateien, die schon bestehen, einfach überschrieben.

Willst Du das nicht, benutze diese Option, zur Umbenennung der Dateien. LHX

schreibt eine Batchdatei 'Duplicates' ins Default-Laufwerk, die sich editieren und

ausführen läßt, um alles wieder ins Lot zu bringen

-s macht SEQ zum Default-Dateityp (ist ansonsten PRG)

-u schaltet die Darstellung des Dateinamens in den Kleinschreibmodus (Archive,

unter MS-DOS erstellt, erscheinen im Großschreibmodus - nicht gerade leserlich)

-v zur Überprüfung, 'verify', ob das Archiv in Ordnung ist

Beispiele:

LHX Name extrahiert alle Dateien aus 'Name.lzh'

LHX -a Name *.txt extrahiert alle Dateien mit der Endung .txt aus 'Name.lzh' und

wandelt sie dabei von ASCII in PETSCII um

LHX -p -a Name *.txt wie oben, jedoch Bildschirmausgabe

LHX -pa Name *.txt wie oben

Speicherbelegung:

Bank 0: $1c00 bis $bfff

Bank 1: keine

Schlüsselwort: SFX (Self extracting LHARChive für C64 und C128)

Das LHARChiv self extracting (selbst extrahierendes) Modul (SFX) ist ein wenig größer, als die SDA-Module für ARC128. Es mißt etwa 3500 Bytes (oder 14 CBM-Blöcke) im Vergleich zu ungefähr 2000 Bytes (8 CBM-Blöcke) des SDA, hat aber etliche Vorteile.

LHARChive sind kleiner, so daß die etwa 1500 Bytes sich sicher in Archiven rechnen, die mehr als ein paar Kilobyte lang sind. LHARChive sind meistens um 20% kleiner, so daß der Gleichstand beider Verfahren bei 1500/0,2 = 7500 Bytes liegt. Ist das Archiv größer, wird das SFX deutlich kleiner als das SDA.

SFX zwingt Dich nicht, wie es das SDA tut, die extrahierten Dateien auf Laufwerk 8, Drive 0 zu schreiben (so steht auch die RAM- oder irgendeine andere Disk offen).

SFX läßt sich einfach bedienen. Du wirst nur nach dem Destination-(Ziel-)Laufwerk und der Drivenummer gefragt. Du kannst Deine Wünsche eingeben, oder mit <RETURN> die Vorgaben übernehmen. Gibst Du nur 'leer' ein (d.h. Vorgabe löschen, <RETURN>), wird SFX abgebrochen, ohne daß etwas passiert.

LHARC ist auch auf MS- und Amiga-DOS erhältlich, deshalb könnten auch auf diesen Maschinen selbstauflösende Archive erstellt werden. Bist Du ein SYSOP, der ein 'bulletin board' auf Amiga oder PC unterhält und Du betreust 8-Bit Commodore Kundschaft, könnte Dir das gelegen kommen. SFX Dateien sind in ('normale') LHARChive umwandelbar, indem der SFX Programmkopf (header) entfernt wird. Du mußt nur aufpassen, daß SFX davon ausgeht, daß alle beinhalteten Dateinamen im gültigen Commodoreformat vorliegen. In der Praxis: erstellst Du SFXe z.B. auf Amiga, nimm keine Dateinamen länger als 16 Zeichen und sage LHARC, es soll keine Pfadnamen ins Archiv aufnehmen.

Erstellst Du SFXe auf dem C128, wird der Dateityp ins LHARChiv aufgenommen und auch korrekt wiedergefunden (Achtung: nur SEQ und PRG erlaubt, REL und USR nicht!). Fehlt die Dateitypinformation, schreibt SFX immer PRG. Erstellst Du SFX auf Amiga, darf Komma in Dateinamen vorkommen und Du kannst die Dateiinformation als ',s', ',p' oder sogar als ',u' anhängen.

Willst Du auf einem nicht-Commodore 8 Bit Rechner ein SFX erstellen, mach' zuerst ein 'normales' LHARChiv und hänge das dann an den SFX Maschinensprache-Header an. Auf einem PC sähe das etwa so aus:

copy/b sfx.ml+Dateiname.lzh Dateiname.sfx

und in Amigasprache:

jion sfx.ml Dateiname.lzh as Dateiname.sfx

SFX ist so geschrieben, daß es sowohl auf C64 als auch C128 läuft; Du kannst es ohne Unterschied vom 128'er im 128'er Modus oder vom 64'er laden (LOAD". . .) und starten (RUN). Das ist doch 'was, denn wenn Du ein 64'er SDA auf dem 128'er starten willst, gibt's einen Absturz und umgekehrt. Darum wählte ich auch die Kennung '.SFX' anstatt 'SDA', um klar zu zeigen, daß beide Maschinen damit umgehen können. (Natürlich sind Dateinamen völlig bedeudungslos, aber sie sind bequeme Kennzeichen)

Für diesen Vorteil ist ein kleiner Preis zu zahlen, aber ich glaube, er ist es wert. Damit SFX auf beiden Maschinen läuft, muß SFX festellen, wo es in den Speicher geladen wurde und sich selbst dorthin verschieben ('relocate'). Scheitert das relocate, ist das Programm nicht ausführbar. Das eingesetzte relocate-Schema geht davon aus, daß der BASIC-Anfang bei $0801 (C64) oder $1c01 (C128) oder einem ganzzahligen mehrfachen von 256 Bytes über oder unter diesen Adressen liegt. Das wird wohl in der Regel auch der Fall sein; hast Du aber ein 'tool' das den BASIC-Start auf eine 'krumme' Adresse verlegt, stürzt SFX ab.

Wenn Du nicht weißt, worauf ich hinauswollte, umgehst Du Probleme, indem Du niemals

1) ein SFX nach einem RUN abspeicherst (SAVE).

2) den BASIC-Start veränderst.

Wenn Du willst, kannst Du das gleiche SFX wieder und wieder starten, ohne es von Disk neu zu laden und natürlich wird die folgende Befehlsreihe einen Absturz erzeugen:

GRAPHIC CLR C128 BASIC-Start = $1c01 (=dez 7169)

LOAD"EIN.SFX",8

RUN verschiebt (relocate) nach $1c01

RUN zweiter Lauf ist in Ordnung. Relocate-Offset ist Null

GRAPHIC 1: GRAPHIC 5 setzt BASIC-Start auf $4001

RUN ist in Ordnung, hochsetzen geht (aber nicht 'runter)

GRAPHIC CLR setzt BASIC-Start auf $1c01

RUN jetzt kommt der Absturz!!!

Das gleiche würde passieren, wenn ein SFX auf dem 128'er gestartet (RUN) wird, anschließend auf Disk gespeichert (SAVE) und dann auf dem 64'er ge-LOAD-et und gestartet (RUN) wird.

Speicherbelegung: C128 C64

SFX Header $1c01-$2a00 $0801-$1600 (ungefähr)

LHARChiv $2a00-$d800 $1600-$cfff

SFX Arbeitsspeicher $d800-$feff $d800-$feff

Daraus ergibt sich für SFX eine maximale Gesamtgröße:

C64 $0801-$cfff 51.200 Bytes

C128 $1c01-$d800 48.128 Bytes

Sollte es vorkommen, daß SFX groß genug ist, über $d800 hinauszuragen, wird der Rattenschwanz durch den Dekompressor überschrieben. Also halte das SFX (einschließlich Header) kleiner als 48K (oder 190 CBM Diskettenblöcke). Es gibt dann zwar noch'n bißchen 'Luft', aber wenn's eng wird, ist es das beste, SFX zu starten und zu prüfen, ob die Extraktion noch komplett abläuft.

Im Falle des 64'er wird SFX über $a000 hinaus richtig extrahieren, aber weil der BASIC-Bereich überschritten wird, bekommst Du ein 'out of memory error', wenn Du irgend etwas anderes machst, als nur eben SFX zu starten (RUN). In diesem Falle die Meldung mit NEW quittieren.

Und, natürlich hast Du weniger Platz für SFX, wenn dein BASIC-Anfang nach oben verschoben ist . . .

TITEL. Im ersten RUN prüft SFX, ob die erste Datei im LHARC 'TITLE' (engl. Title = dt. Titel) heißt. Wenn ja, wird diese Datei auf den Bildschirm ausgedruckt. Danach erst wirst Du nach dem Outputdevice (Ziellaufwerk) gefragt.

Um Pausen während des Titels zu ermöglichen, werden folgende Zeichen anderst gehandhabt:

chr$(0) bewirkt ein leeren des Tastaturspeichers und wartet dann auf einen

Tastendruck

chr$(1) bewirkt eine kurze (ca. 1 Sekunde lange) Pause

Umwandlung von SFX nach LZH:

Die Datei 'sfx2lzh.c' enthält den ANSI C Quellcode eines einfachen Programmes, das den SFX-Header aus dem SFX-Archiv herauslöscht. Es sollte nicht nur mit C128/C64 SFXen laufen, sondern genausogut auch mit MS-DOS selbstextrahierenden EXE- oder COM-Dateien.

Mit SDA für ARC64/ARC128 habe ich versucht, die Größe des SDA so zu halten, daß das eigentliche Archiv immer an einer Disksektorgrenze beginnt. Mit SFX habe ich solche Versuche nicht unternommen.

CS - 23.Januar 1990

I N H A L T S V E R Z E I C H N I S