★ APPLICATIONS ★ DISQUE ★ Disc-Utility ★ |
RSX Disk-Utility (Computer Partner) | Applications Disque |
Dieses Programm wurde auf einem CPC 464 mit Diskettenlaufwerk DDI-1 geschrieben. Auch auf dem CPC 6128 läuft es fehlerfrei. Es benutzt direkt über OUT-Befehle die Kommandos des PD765 und ist somit vollkommen unabhängig vom Disketten-RAM und -ROM. Aus dem Betriebssystem werden nur die Routinen SCR SET MODE, TXT OUTPUT, KL LOG EXT sowie einige Befehle für die Interrupt-Behandlung benötigt. Die Namen der RSX-Kommandos ähneln denen der PD765-Anweisungen, sind also in Englisch gehalten. Die HELP-Page liegt dagegen in Deutsch vor. Zunächst sollen nun die Befehle dieser Erweiterung erklärt werden. |HELP Bringt alle zur Verfügung stehenden Befehle auf den Bildschirm. Deren Parameter sind durch Abkürzungen dargestellt, die auf der HELP-Page erklärt werden. Sie sind im folgenden aufgelistet.
Die HELP-Page dient zum kurzen Nachschlagen, wenn man die Syntax nicht im Kopf hat. Achtung: Der Befehl |HELP bewirkt immer ein Löschen des Bildschirms sowie einen Wechsel nach MODE 2. Der alte Bildschirminhalt geht somit verloren! |MESSAGE.ON Dieser Befehl bewirkt, daß sämtliche Fehlermeldungen, die von der Erweiterung erzeugt werden, auch auf dem Bildschirm zur Anzeige kommen. |MESSAGE.OFF Die Fehlermeldungen werden unterdrückt. Unabhängig vom Resultat der Bearbeitung des Befehls meldet sich die CPU mit dem unter Basic üblichen "Ready”. |GET.STATUS,adr Dieser Befehl gibt den derzeitigen Programmstatus an die Adresse adr aus. Der Status wird jeweils nach der Bearbeitung eines Kommandos beeinflußt und kann folgende Werte annehmen:
Dieser Befehl gibt dem Anwender also die Möglichkeit, den Status auch bei abgeschalteten Fehlermeldungen zu ermitteln. Über das Basic-Kommando PEEK kann man ihn somit aus der Adresse adr erhalten. Achtung: Der Status wird in der Adresse adr nicht aktualisiert! |READ.DATA,T,T(ID),K(ID),S(ID),G(ID ),AUS,B,< G3 > Dieser Befehl ermöglicht das Lesen eines Sektors von der Diskette in den Buffer, der an Adresse B beginnt. Die Übergabeparameter 2 bis 5 beziehen sich (wie bei |WRITE.DATA und |WRITE.DEL.DATA) auf die Informationen, die im ID-Feld des entsprechenden Sektors stehen. So muß beispielsweise die Track-Nummer des ID nicht unbedingt mit der des Tracks übereinstimmen, in dem sich der Sektor befindet. Die Ausführung sieht folgendermaßen aus. Das Programm sucht den Track, den man mit dem ersten Parameter angibt, und liest in diesem den ersten Sektor, dessen ID mit den Parametern 2 bis 5 übereinstimmt. Das G AP#3 ist beim Lesen nicht relevant. Eine Erklärung der Zeichen finden Sie beim Befehl |HELP. Nun noch eine Anmerkung: Das Programm liest auch deleted Sektoren. |WRITE. DATA,T,T(ID),K(ID),S(ID),G(ID),AUS,B,< G3 > Dieser Befehl sorgt dafür, daß Daten ab Adresse B, also dem Daten-Buffer, im gewünschten Sektor gespeichert werden. Die Parameterübergabe ist identisch mit der bei |READ.DATA. Wenn man nicht das normale Format verwendet, spielt der Parameter G3 eine nicht unwichtige Rolle: Das GAP#3, eine Lücke zwischen zwei Sektoren, wird bei jedem Schreiben von Daten an den betreffenden Sektor angehängt. Nimmt man also ein größeres GAP#3 als beim Formatieren, kann es Vorkommen, daß die ID-Bytes des folgenden Sektors überschrieben werden. Fehlt die GAP#3-An-gabe, so benutzt das Programm eine GAP#3-Länge von &2A (42) Bytes, die auch bei AMSDOS zum Einsatz kommt. |WRITE.DEL.DATA,T,T(ID),K(ID),S(ID),G(ID),AUS,B,< G3 > Dieser Befehl ist in seiner Ausführung identisch mit |WRITE.DATA. Allerdings wird hier der geschriebene Sektor als deleted gekennzeichnet; er kann also von einfachen Sektorleseroutinen nicht mehr gelesen werden. |READ.DATA, |WRITE.DATA und |WRITE.DEL.DATA bilden den wichtigsten Teil dieser Erweiterung. Ich habe aber zusätzlich noch vier weitere Befehle zum Formatieren und Analysieren von Disketten eingebunden. Sie sollen die Arbeit mit dem Laufwerk vereinfachen. |READ.ID,T,IDB Dieser Befehl liest sämtliche IDs des Tracks T aus und trägt sie in der unter |HELP beschriebenen Art und Weise ab Adresse IDB in das RAM ein. Der Anwender kann diese Informationen beliebig weiterverarbeiten . Zusätzlich erhält er eine Auswertung der IDs auf dem Bildschirm, soweit die Ausgabe durch I MESSAGE. ON ermöglicht wurde. Die Aufzählung der angegebenen Sektoren erfolgt durchnumeriert, und zwar in der Reihenfolge, wie sie beim Formatieren im Track eingetragen wurden, ln der Klammer kommen sämtliche (4) ID-Bytes zur Darstellung, die man als Parameter 2 bis 5 bei den Schreib- und Lesebefehlen mitteilen muß. Ferner können folgende Abkürzungen hinter den einzelnen Sektoren auftauchen: /DI: Data Error in ID (meist ein Fehler in der Prüfsumme, die über das ID gebildet wird) Diese Angaben sollen dem User helfen, die Eigenarten eines bestimmten Tracks zu analysieren. |FORMAT.ID,IDB,FB.< G3 > Der Befehl IRE AD. ID fertigt einen Datenblock im RAM an, der die Sektorinformationen enthält. Mit deren Hilfe kann der Anwender nun einen Track formatieren. Er muß lediglich die Adresse IDB mitteilen, an der die Daten von |READ.ID stehen, sowie die Adresse FB, ab welcher der Formatblock erstellt wird. Die Angabe von GAP#3 erfolgt wahlweise. Fehlt sie, so setzt das Programm den Wert &52 (82) ein. Sollte der erstellte Track nicht mit dem Ausgangs-Track übereinstimmen, so war das gewählte GAP#3 zu groß oder zu klein. |FORMAT.NORM,T,S,FB Dieser Befehl formatiert einen Track T im normalen Format. Gibt man z.B. für S den Wert &C1 ein, so geschieht dies folgendermaßen: C1 C6 C2 C7 C3 C8 C4 C9 C5Es werden immer neun Sektoren formatiert, und zwar nach dem angegebenen Muster, beginnend mit Sektor S. Mit einer einfachen Schleife lassen sich so Disketten schnell formatieren (&C1: Datenformat, &41: CP/M-Format, &00: IBM-Format). |FORMAT.PARA,T,A,G,F,FB,< G3 > Dies ist der leistungsstärkste Formatbefehl. Hierfür muß man den Formatblock selbst erstellen, und zwar für jeden Sektor die vier ID-Bytes. Wer sechs Sektoren möchte, benötigt also 6x4 Bytes, die Sektor für Sektor ab Adresse FB eingetragen werden müssen. A gibt die Anzahl der gewünschten Sektoren an, in diesem Fall also sechs. G steht für den Sektorabstand beim Formatieren; die Zahlenwerte für G sind unter |HELP erklärt. Wird GAP#3 nicht angegeben, nimmt das Programm &52 (82) als Ausgangswert. Nun möchte ich noch vor einem falschen Einsatz dieser Erweiterung warnen. Sie akzeptiert sämtliche Eingaben. So ist es beispielsweise möglich, daß zu hohe Track-Nummern das Laufwerk beschädigen! Falsche Buffer-Adressen können das Programm oder das Betriebssystem überschreiben und somit den Rechner zum Absturz bringen. Wer sich mit dem Aufbau seines Computers nicht auskennt, sollte keine Buffer-Adressen benutzen, die außerhalb des Bereichs von &0040 bis &9BFF liegen. Natürlich läßt sich auch der Bildschirmspeicher als Daten-Buffer benutzen. Wer Maschinensprache beherrscht, wird keine großen Probleme haben, die Befehle von eigenen MC-Routinen aus anzuspringen. Zum Schluß noch ein Hinweis. Der Laufwerkmotor ist interruptgesteuert; Hoch- und Nachlaufzeit entfallen also nicht. Eintipphilfe Tippen Sie das Listing sorgfältig ab, und starten Sie es mit RUN. Der Rechner überprüft nun die Datenzeilen. Im Falle eines Fehlers wird eine entsprechende Meldung ausgegeben und das Programm beendet. Kontrollieren Sie dann die betreffende Zeile, und verbessern Sie diese gegebenenfalls. Dann starten Sie erneut mit RUN. .Läuft das Programm einwandfrei durch, speichern Sie das Maschinenprogramm mit SAVE ”DISCUTL.RSX”,b,&9C00,&A50 ab. Zur späteren Benutzung der RSX-Befehle sollten Sie Ihr Programm mit folgender Kommandofolge beginnen lassen: MEMORY &9BFF |
|
|