★ APPLICATIONS ★ DIVERS ★ DISKETTENZAUBER – DISKAMSMON PLUS und BASIC-765 ★![]() |
| Amsmon Plus v1.3 | Applications Divers |
Haben Sie uneingeschränkten Zugriff auf jeden Sektor Ihrer Disketten? Und, wenn ja, gilt das auch für Ihre kopiergeschützten Disketten? Nein? Dann sind Sie hier genau richtig. Wenn Ihnen vielleicht auch etwas daran liegt, fremde Diskettenformate zu untersuchen, dann sind Sie hier sogar goldrichtig. Was wir Ihnen anzubieten haben, ist einmal ein sehr leistungsfähiger Diskettenmonitor, zum anderen eine RSX-Erweiterung zur bequemen FDC-Programmierung. Beide Programme bedienen sich des direkten Eingriffs in den Floppy-Disc-Controller. Sie können damit jeden Sektor lesen, auch Sektoren mit gelöschter DAM, Sektoren mit einfacher Dichte, jede Sektorgröße, Sektoren mit unnormaler Sektor-ID etc. Wahrscheinlich kommt einigen Lesern der eine oder andere Begriff unbekannt vor, deshalb möchten wir hier einige Erklärungen voranstellen. Wie Sie vielleicht schon wissen, sind die Daten auf der Diskette sektorweise abgelegt. Dazu ist die Diskette in mehrere konzentrische Spuren aufgeteilt (unter AMSDOS werden 40 Spuren verwendet). Jede Spur ist in mehrere Sektoren unterteilt. Die Anzahl der Sektoren ist dabei abhängig von der Sektorgröße und dem Aufzeichungsmodus. Abb. 1: Mit AMSMON PLUS wissen Sie ge-nauestens über Ihre Disketten Bescheid. Der Inhalt wird in hexadezimaler Form ausgegeben. >> Im MFM-Modus passen ungefähr 6500 Bytes auf eine Spur. Allerdings benötigt der FDC auch einige Bytes für die Verwaltung. Hierin sind z.B. die Sektor-IDs sowie der Sektorabstand enthalten (der Sektorabstand dient zum Ausgleich unterschiedlicher Umdrehungs- Geschwindigkeiten der Laufwerke). Nach Abzug dieses Overheads bleiben z.B. bei 512 Byte-Sektoren 5kB für Daten über, das entspricht 10 Sektoren. Bei anderen Sektorgrößen muß beachtet werden, daß der Verwaltungsaufwand natürlich mit der Anzahl der Sektoren steigt. Damit nun der FDC einen Sektor findet, legt er für jeden Sektor eine Sektor-ID an. In dieser ID stehen die Tracknummer, die Diskettenseite, die Sektomum-mer sowie die Sektorgröße. Die Tracknummer muß dabei nicht unbedingt mit dem physikalischen Track, also dem Track, auf dem der Schreib-/ Lesekopf tatsächlich steht, übereinstimmen. Dies kann z.B. als Kopierschutz herangezogen werden. Mit den Routinen aus AMSDOS sind nämlich nur Sektoren lesbar, bei denen die Tracknummer in der ID mit der physikalischen übereinstimmt. Mit AMSMON PLUS oder BASIC-765 sind Sie von derartigen Beschränkungen nicht mehr abhängig. Ebenfalls muß die angegebene Diskettenseite nicht mit der tatsächlichen übereinstimmen. Dies liegt einfach daran, daß der Inhalt der ID beim Formatieren von der CPU an den FDC geliefert wird. Bei der Übertragung sind natürlich beliebige Angaben möglich. Um den Sektor später zu bearbeiten, muß der Kopf über der gewünschten Spur positioniert werden. Anschließend müssen beim Lesen oder Schreiben die Werte aus der ID angegeben werden. Das Ganze mag zwar auf den ersten Blick äußerst kompliziert aussehen, wenn Sie allerdings später mit BASIC-765 und/oder AMSMON PLUS die am Schluß folgenden Beispiele nach vollziehen, wird Ihnen vieles klarer erscheinen. Zum Schluß dieser Einleitung noch eine Bemerkung zu den gelöschten Sektoren; dies sind Sektoren mit gelöschter 'DATA-ADDRESS-MARK'. Um es gleich vorwegzunehmen: gelöschte Sektoren sind keine “leeren“ Sektoren oder vielleicht mit Nullen gefüllte Sektoren -sie enthalten genauso Daten wie “normale“ Sektoren. Der Unterschied besteht im Prinzip nur aus einem “Flag“, das den Zustand des Sektors beschreibt. Dieses Flag wird z.B. bei modernen Betriebssystemen dazu genutzt, um defekte Sektoren zu kennzeichnen. Einige Software-Firmen bauen mit Hilfe dieser Sektoren ihren Kopierschutz auf. Die Programme Kommen wir nun zu den beiden Programmen. Beide laufen auf allen Schneider CPCs unter AMSDOS. Für Besitzer von VDOS werde ich später für BASIC-765 eine Anpassung anführen. BASIC-765 ist eine RSX-Erweiterung zur einfachen Programmierung des Floppy-Controllers FDC 765. Es sind alle wesentlichen FDC-Kommandos als RSX-Befehle ausführbar. Diese Erweiterung ist in erster Linie für Programmierer gedacht sowie für VDOS-Besit-zer mit geringen Assembler-Kenntnissen, die die später beschriebene Anpassung vornehmen können. Dagegen ist AMSMON PLUS für die Anwender die bessere Wahl. Dieser Diskettenmonitor bietet u.a. einen Full-Screen Editor und äußerst intelligente Disk-Routinen. Zum Beispiel braucht sich der Anwender nicht mehr um die Sektorgröße und die in der ID angegebenen Daten zu kümmern. Nach der Positionierung des Kopfes reicht allein die Angabe der Sektomummer, den Rest der Arbeit übernimmt der Diskettenmonitor. Desweiteren besitzt AMSMON PLUS einige weitere interessante Features. Der Monitor greift teilweise sehr stark in das Betriebssystem ein. Eine Anpassung an VDOS ist daher praktisch unmöglich. Nun gut, sehen wir uns erst einmal BASIC-765 an. BASIC-765 -Floppy-Programmierung einfach gemacht. BASIC-765 ist auf zwei verschiedenen Wegen in das BASIC integrierbar. Einmal kann es auf dem “normalen“ Wege geschehen: MEMORY &9DFF: LOAD “BASIC765 : CALL &9E00Anschließend stehen alle RSX-Befehle zur Verfügung. Eine Initialisierung des Betriebssystems wird dabei nicht vorgenommen. Die zweite Möglichkeit ist radikaler und einfacher. Sie starten die Datei mit RUN “BASIC765Anschließend wird eine komplette Initialisierung des Betriebssystems vorgenommen. Es erscheint wieder die Einschaltmeldung. Nach Initialisierung aller ROMs wird die RSX-Erweiterung eingebunden. Anschließend wird das BASIC initialisiert. BASIC-765 ist nun voll ins Betriebssystem integriert. In beiden Fällen belegt die Erweiterung den Speicherbereich von &9E80 bis &A63F. Kommen wir nun zu den neuen Befehlen, die die Erweiterung bereitstellt. |ASCII Dieser Befehl gibt den aktuellen Pufferinhalt in reiner ASCII-Darstellung aus. Die Länge des Puffers ist abhängig von der aktuellen Sektorlänge. Die Ausgabe kann mit SPACE angehalten und mit ESC abgebrochen werden. |DREAD,sector Dieser Befehl dient zum Lesen eines gelöschten Sektors. Im Prinzip scheint er unnötig zu sein, da auch ein gelöschter Sektor mit dem READ- Befehl eingelesen werden kann. Der Befehl erwartet ein oder zwei Parameter. Falls nur ein Parameter angegeben wird, wird dieser als Sektornummer interpretiert. Als Tracknummer wird dann die Defaulttracknummer angenommen (die vom letzten SEEK oder HOME (=0) Befehl). Wenn zwei Parameter übergeben werden, gibt der erste den Track an, der zweite die Sektornummer. Sofern die Meldungen zugelassen sind (siehe MSGON, MSGOFF) wird anschließend die 'Result- Phase' des FDC hexadezimal ausgegeben. Der Sektor wird an die Anfangsadresse des aktuellen Puffers gelesen. Eine Kopfpositionierung wird nicht durchgefiihrt. Dies kann vorher mit dem SEEK-Befehl geschehen. |DUMP Der aktuelle Pufferinhalt wird als kombinierter Hex-/ASCII-Dump ausgegeben. Bezüglich der Pufferlänge und der Ausgabe gilt das Gleiche wie beim IAS-CII-Befehl. |DWRITE,seetorID Dieser Befehl schreibt einen Sektor mit gelöschter DAM auf die Diskette. Als Datenadresse dient die Anfangsadresse des Puffers. Bezüglich der Parameterübergabe gilt das gleiche wie beim |DREAD-Befehl. |ERROR,@integer% Dieser Befehl holt den aktuellen Fehlerstatus. Dafür muß die Adresse einer Integervariablen übergeben werden. Der Fehlerstatus entspricht dem Inhalt des Status-Registers 0. |FGAP,byte Wie oben schon erwähnt, fügt der FDC zwischen den Sektoren Abstände ein, um ein Überschreiben von Daten zu vermeiden. Diese Abstände werden GAPs genannt. Es existieren auch GAPs zwischen der ID und den Daten, zu Statusinformationen usw. Einer dieser GAPs ist die GAP3. Dieser kann beim Formatieren und beim Sektorschreiben angegeben werden. Um ein Überschreiben zu vermeiden, sollte natürlich die GAP beim Formatieren größer sein als beim normalen Schreiben. Die Größe dieser GAP für das Formatieren kann mit diesem Befehl eingestellt werden. Als Default hat sie die Länge &52. Falls Sie nun einen Track mit 10 Sektoren mit je 512 Byte formatieren wollen, ist diese GAP zu groß. Die Kapazität eines Tracks reicht dann nicht mehr aus. In gewissen Grenzen kann nun diese GAP3 verringert werden. Bei einem Wert von &20 lassen sich i.A. diese 10 Sektoren problemlos formatieren. Man darf natürlich im Sinne der Datensicherheit diese GAP nicht unbegrenzt verkleinern. Der Wert von &20 erweist sich in der Praxis aber noch als recht datensicher. |GAP3,byte Dieser Befehl ist analog dem gerade beschriebenen FGAP-Befehl. Allerdings bezieht sich der hier angegebene Wert auf die Lese- und Schreiboperationen. Dieser Wert muß kleiner sein als der, der beim Formatieren der Diskette benutzt wurde! Bei dem oben beschriebenen Zehn-Sektor-Format ist z.B. ein Wert von &18 angebracht. Der Defaultwert ist &2A. |GETDMA,@integer% Mit diesem Befehl kann die aktuelle Adresse des Sektorpuffers in eine Integervariable geschrieben werden. Die Variable muß dabei mit dem Klammeraffen übergeben werden. |HEAD,byte Dieser Befehl ist in erster Linie nur für Besitzer von Doppel köpf-Laufwerken interessant. Durch den Parameter (nurO oder 1) kann der gewünschte Schreib-/ Lesekopf ausgewählt werden. Die “normale“ Seite (das ist die untere !) wird mit 0 angewählt, die andere mit 1. |HOME Der HOME-Befehl ist ein relativ wichtiger Befehl. Dieser Befehl ist der einzige, der den Kopf auf einen definierten Track positionieren kann. Dazu ein kurzer Einblick in den FDC. In dem FDC ist ein “Speicher“ für die aktuelle Tracknummer. Jedesmal, wenn der FDC an das Laufwerk den Befehl Kopf einen Track weiter schieben' sendet, wird dieser Zähler erhöht. Wenn der Kopf in die andere Richtung bewegt wird, wird der Zähler erniedrigt. So weit, so gut - was ist allerdings, wenn nach dem Einschalten des Rechners der Kopf nicht auf Track 0 steht, oder falls gar durch Einschieben einer Diskette unglücklicherweise der Kopf ein Stück verschoben wird? Ganz einfach, dann wird die nächste Positionierung ein Ratespiel. Dieser Befehl ermöglicht es nun, den Kopf auf Track 0 zu positionieren. Wenn der Kopf nämlich Track 0 erreicht hat, dann wird dies durch eine Lichtschranke an den FDC übermittelt. Sofern dieser Befehl ausgeführt wurde, können Sie also ganz sicher sein, daß sich der Kopf auf Track 0 befindet. Hierzu noch eine Anmerkung für Besitzer von 80-Track-Laufwerken. Normalerweise bricht der FDC den HOME Befehl ab, wenn er nach 77 Step-Impulsen (d.h., jeweils eine Verschiebung um einen Track) kein Signal bekommt, daß der Track 0 erreicht ist. Der RSX-HOME berücksichtigt dies und führt eventuell zweimal dieses Kommando aus. So kann auch bei 80-Track- Laufwerken eine sichere Positionierung erreicht werden. |MF Oben wurde schon erwähnt, daß der FDC mit zwei verschiedenen Aufzei-chungsmodi arbeiten kann. Mit diesem Befehl kann nun die einfache Dichte (MF) ausgewählt werden. |MFM Dieser Befehl ist zu dem MF-RSX analog. Hier wird allerdings die doppelte Dichte ausgewählt. Dies ist die unter AMSDOS übliche Dichte. |MSGOFF Mit diesem Befehl werden alle Meldungen des BASIC-765 abgeschaltet. Dies kann zum Beispiel nützlich sein, wenn Sie auf der Basis dieser RSX-Erweite-rung ein Disketten-Utility programmieren wollen. Sie müssen dann den Erfolg der Befehlsausführung aus der 'Result Phase' interpretieren. Bei AMSDOS liegt diese bei &BE4C. Die Länge der 'Result Phase' steht in &BE4B. AMSDOS Besitzer, die auch die AMSDOS-Fehlermeldungen unterdrücken wollen, können dies mit POKE &BE78,&FF erreichen. Mit POKE &BE78,&00 werden die AMSDOS-Meldungen wieder zugelassen. |MSGON Dieser Befehl läßt die BASIC-765 Meldungen, die mit |MSGOFF abgeschaltet wurden, wieder zu. |READ,sector Mit dem READ-Befehl wird der angegebene Sektor an die aktuelle Pufferadresse gelesen. Bezüglich der Parameterangabe gilt das gleiche wie beim |DREAD-Befehl. |RESULT Nach jeder Kommandoausführung sendet der FDC ein oder mehrere Bytes, die über den Erfolg der Ausführung Aufschluß geben. Die Information ist bitorientiert. So gibt z.B. nach den Sektor-R/W- Befehlen der erste Wert den Inhalt von Statusregister 0 des FDC an. Wenn dort das Bit 3 gesetzt ist, war das Laufwerk zum Zeit des Zugriffes nicht bereit; z.B. keine Diskette eingelegt. |RSX765 Dieser Befehl dient zum Auflisten der kompletten Befehlsliste des BASIC-765. Bezüglich der Ausgabe Steuerung gilt das gleiche wie beim |ASCII-Befehl. |SECTORS Dies ist ein sehr hilfreicher Befehl. Es werden, sofern die Meldungen eingeschaltet sind, alle Sektornummern von dem Track ausgegeben. Gleichzeitig werden die Sektornummern an den Anfang des aktuellen Sektorpuffers geschrieben! In der ersten Speicherstelle wird die Anzahl der Sektoren auf dem Track vermerkt. Falls im Sektorpuffer noch Daten stehen, muß der Puffer vor der Ausführung des Befehles mit ISETDMA verlegt werden! |SEEK,track Dieser Befehl dient zum Positionieren des Kopfes über dem gewünschten Track. Die Trackangabe darf im Bereich 0.. .83 liegen, ansonsten wird eine Fehlermeldung ausgegeben. |SETDMA,adresse Mit diesem Befehl wird die Adresse des Sektorpuffers festgelegt. Nach der Initialisierung ist der Default &C000. Diese Adresse liegt im Bildschirmspeicher. Nach der Initialisierung ist daher mit dem MEMORY-Befehl die Speichergrenze tieferzusetzen und anschließend mit |SETDMA der Sektorpuffer anzugeben. |SINFO,sector Wenn Sie nähere Informationen über einen Sektor haben wollen, wird Ihnen dieser Befehl weiterhelfen. Es wird der Track, die Kopfnummer und die Sektorgröße aus der ID ausgegeben. Die Sektorgröße ist dabei verschlüsselt. &00 = 0...255 Byte (i.A. 128) Als Defaultwert nach der Initialisierung ist die unter AMSDOS übliche Sektorgröße von 512 Byte eingestellt. |SIZE,bytes Mit diesem Befehl wird die Sektorgröße festgelegt. Die Sektorgröße wird in Bytes angegeben. Sie kann zwischen 0 und 255 liegen, oder 256, 512, 1024 2048 oder 4096 Bytes betragen. Die Sektorgröße 4096 Bytes ist allerdings im MF-Modus nicht benutzbar. |STATUS Mit ISTATUS kann der Laufwerksstatus abgefragt werden. Es wird der Lauf-werks-Fehlerstatus ausgegeben (von den meisten Laufwerken wird dies nicht unterstützt - > 0), der Zustand der Schreib-schutz-Kontrolle, der Bereitschaftszustand, der Zustand der Track-Lichtschranke, das 'two side'-Signal sowie die aktuelle Kopf- und Laufwerksnummer. Das 'two side'-Signal gibt an, ob das Laufwerk ein Doppelkopflaufwerk ist oder nicht. Dies funktioniert allerdings nur, wenn keine schreibgeschützte Diskette eingelegt ist. Falls die Meldungen abgeschaltet sind, kann der Zustand mit dem |ERROR-Befehl abgefragt werden. |STEP Es kann dem FDC mitgeteilt werden, wie schnell die Kopfpositionierung am Laufwerk durchgeführt werden kann. Bei den 3“ Laufwerken von AMSTRAD ist ein Wert von 10 ms vorgegeben, das Schnellste (9 ms werden vom FDC auf 10 aufgerundet, da dieser die Steprate nur in 2 ms Schritten verändern kann). Die Steprate wird in Millisekunden angegeben und gilt bis zur nächsten Änderung für alle Laufwerke. Falls kein Parameter angegeben wird, wird die letzte Steprate neu gesetzt (dies kann notwendig sein, wenn andere Programme diese verändern). |TFORMAT,spt Mit diesem Befehl können Sie einen Track formatieren. Soweit der FDC mitspielt, gibt es für Sie keine Grenzen. Es gibt zwei Möglichkeiten der Ausführung. Wenn Sie nur einen Parameter angeben, wird dieser als SPT (Anzahl der Sektoren pro Track) angenommen. In diesem Fall müssen für jeden Sektor ab der aktuellen Sektorpufferadresse 4 Bytes stehen (Tracknr., Kopfnr., Sektomr., Sektorgröße). Wenn zwei oder mehr Parameter angegeben werden, wird der erste als Tracknummer angenommen, die nachfolgenden geben die Sektomum-mern an. Als Kopfnummer und Sektorgröße werden die aktuellen Werte eingesetzt. Hier wird der Anfang des Sektorpuffers für die Formatiertabelle benutzt. Falls im Puffer wichtige Daten stehen, muß der Sektorpuffer vorher auf einen freien Bereich gesetzt werden. |UNIT,drive Wenn Sie auf ein anderes Laufwerk zugreifen wollen, müssen Sie diesen Befehl benutzen. Als Parameter wird das neue Bezugslaufwerk erwartet. Die Übergabe erfolgt als Zahlenwert zwischen 0 und 3 (Drive A = 0, Drive B = 1, ...). Die Laufwerke C und D können allerdings ohne Hardwareänderung nicht angesprochen werden. Wenn Drive C (=2) angewählt wird, fühlt sich wieder Laufwerk A zuständig. Dies liegt an der unvollständigen Laufwerksdekodierung im Floppy-Controller. |VERIFY,sector Mit dem |VERIFY-Befehl können Sie feststellen, ob der Inhalt des Sektorpuffers mit dem angegebenen Sektor übereinstimmt. Der Vergleich wird direkt vom FDC durchgeführt. Nach der Ausführung erfolgt bei eingeschalteten Meldungen das Vergleichsergebnis. Ansonsten muß anhand des Statusregister 2 (&BE4E), Bit 3 geprüft werden, ob Gleichheit vorliegt (Bit gesetzt). Bezüglich der Parameterübergabe gilt das beim |DREAD-Befehl Gesagte. |WRITE,sector Dieser Befehl schreibt einen Sektor ganz normal (im Gegensatz zu |DWRITE) auf Diskette zurück. Für die Parameterübergabe gilt das gleiche wie beim |DREAD-Befehl. Beispiele zu Programmierung Soweit zur Befehlserklärung. Nun zwei konkrete Beispiele. Als erstes wollen wir den Konfigurationsektor von Laufwerk A (natürlich von einer Backup !!!) lesen und ansehen. Ich möchte erstmal davon ausgehen, daß die Erweiterung frisch initialisiert wurde. Als erstes wird das Laufwerk initialisiert (nicht unbedingt notwendig, da AMSDOS diese Arbeit schon übernommen hat, aber doppelt schadet nicht): 10 |HOMEMit dem IHOME-Befehl wurde der Kopf auf Track 0 positioniert. Dies können Sie einfach mit dem Befehl |STATUS abprüfen:20 |STATUSBei der Angabe “Track 0“ muß jetzt eine 1 stehen. Nun muß ein Datenpuffer reserviert werden. Dies kann z.B. so geschehen:30 MEM0RY &8FFF 'ohneRSX!Nun liegt der Sektorpuffer an Adresse &9000. Mit dem IREAD-Befehl wird nun der gewünschte Sektor eingelesen: |
| ![]() |
|
Page créée en 220 millisecondes et consultée 1756 fois L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |