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.
 Der FDC 765 kann in zwei verschiedenen Modi arbeiten. Man nennt sie MF (einfache Dichte) und MFM (doppelte Dichte) . Der MFM-Modus bietet gegenüber dem MF-Modus die doppelte Spurkapazität bei ebenfalls doppelter Übertragungsgeschwindigkeit. Deshalb wird der MF-Modus heute praktisch nicht mehr angewandt. 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 |DREAD,track,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 |WRITE,track,sector 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 |READ,track,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) &01 = 256 Byte &02 = 512 Byte (AMSDOS !) &03 = 1024Byte &04= 2048 Byte &05 = 4096 Byte 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 |STEP,ms 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 |TFORMAT,track,s1,s2,.,. 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 |VERIFY,track,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 |WRITE,track,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! 40 |SETDMA,&9000 'mit RSX!Nun liegt der Sektorpuffer an Adresse &9000. Mit dem IREAD-Befehl wird nun der gewünschte Sektor eingelesen:50 |READ,&42Die Tracknummer braucht ja nicht angegeben zu werden; sie stimmt unter AMSDOS mit der physikalischen überein - die wurde aber gerade mit dem |HOME-Befehl gesetzt. Mit dem |DUMP-Befehl können Sie sich nun Ihren Sektor ansehen: 60 |DUMPFalls Sie vor diesem Beispiel bereits mehrere Kommandos ausgeführt haben, sollten Sie vor dem IHOME- Befehl folgende Kommandos eingeben:|UNIT,0 'Drive A anwählen |HEAD,0 'untererKopf |SIZE,512 '512 ByteDie SektorenNun zum zweiten Beispiel. Sie wollen eine komplette Diskette mit 10 Sektoren pro Track formatieren. Ich möchte jetzt nicht mehr jeden Befehl erläutern. Sie können sich den Ablauf anhand der Befehlsbeschreibung sicher selbst klarmachen. (Befehle des BASIC-765 müssen mit vorangestelltem RSX-Zeichen eingegeben werden!): 100 lUNIT,0:|HEAD,0:|HOME: |MFM: PRINT "Diskette in Laufwerk A einlegen!" 110 |FGAP, &20: |GAP3, &18: MEMORY &7FFF: |SETDMA, &8000: |MSGOFF 120 IF INKEY$ < > "" THEN GOTO 120 130 IF INKEY$="" THEN GOTO 130 140 FOR track=0 to 42 150 |SEEK,track 160 |TFORMAT,track,&41,&42,&43,&44,&45,&46,&47,&48,&49,&4A 170 NEXT track 180 PRINT “Formatierung fertig!“ 190 |HOMEDas Ganze ist natürlich noch äußerst un-komfortabel, aber Sie können sich ja nun Ihr persönliches Format-Programm zusammenstricken. Allerdings werden die zusätzlichen Sektoren nicht ohne weiteres von AMSDOS unterstützt. Dazu ist eine Änderung im DPB notwendig, auf die ich hier allerdings nicht näher einge-hen möchte.Für Freunde des YDOS... Nun noch die versprochene Anpassungsmöglichkeit für andere DOS-Versionen (Hallo VDOS-Freak...). Ich muß nun geringe Assembler-Kenntnisse voraussetzen — diese sind für die Anpassung sowieso notwendig. Wer sich die BASIC-Erweiterung mit einem Disassembler anschaut, wird feststellen, daß sie ziemlich seltsam anfangt — im Prinzip scheint dort Müll zu stehen. Was Sie dort sehen, ist die Patch-Area zur Anpassung an andere DOS-Versionen. Da BASIC-765 fast die komplette FDC-Programmierung selbst übernimmt, werden nur fünf Routinen aus dem DOS benutzt. Dies sind Routinen zur Synchronisation mit den interruptgesteuerten Motorroutinen, sowie zum Senden eines Bytes an den FDC und zum Auslesen der 'Result Phase'. Alle diese Routinen werden über den Restart &18 aufgerufen. Dieser erwartet eine Adresse auf einen drei Byte langen Parameterblock, in dem die Adresse der Routine und die ROM-Nummer steht. Genau diese drei Bytes finden Sie am Anfang der Erweiterung: - &9E80: Adr. Motoreinschalten
- &9E82: ROM Nummer
- &9E83: Adr. Motor aus (DE=delay)
- &9E85: ROM-Nummer
- &9E86: Adr. Motor Event aus
- &9E88: ROM-Nummer
- &9E89: Byte an FDC senden
- &9E8B: ROM-Nummer
- &9E8C: Result Phase nach &BE4C
- &9E8E: ROM-Nummer
Sofern Sie die entsprechenden Adressen im VDOS-ROM kennen, brauchen Sie diese nur in den entsprechenden Speicherstellen zu vermerken. Ansonsten müssen Sie eigene Routinen im RAM aufrufen (ROM Nummer = &FF!). Dazu möchte ich nun eine Primitiv-Lö-sung vorschlagen, die Sie natürlich entsprechend erweitern können. 1. Motor einschalten PUSH BC LD BC,&FA7F OUT (C),C POP BC PUSH AF LD A , &FF LD(&BE5F),A ;Motorflag POP AF RET2. Motor ausschaltenPUSH BC LD BC,&FA7E OUT (C),C W1: CALL &BD19 DJNZ W1 POP BC PUSH AF XOR A LD (&BE5F) ,A POP AF RET3. Motor Event ausschaltenRET4. Byte an FDC sendenPUSH AF PUSH AF L1: IN A,(C) ADD A,A JR NC,L1 ADD A, A JR NC,L2 POP AF POP AF RETL2: POP AF INC C OUT (C),A DEC C LD A,&05 L3: DEC A NOP JR NZ,L3 POP AF RET5. Result Phase auslesen PUSH HL PUSH DE LD D, &00 LD HL,&BE4C PUSH HL R1: IN A,(C) CP &C0 JR C,R1 INC C IN A,(C) DEC C LD (HL),A INC HL INC D LD A,&05
R2: DEC A JR NZ,R2 IN A,(C) AND &10 JR NZ,R1 POP HL LD A,(HL) AND &C0 DEC HL LD (HL),D POP DE POP HL BET NZ SCF RETDiese Routinen müssen Sie im RAM unterbringen und die entsprechenden Adressen in der Patch-Area eintragen. In dieser Primitiv-Lösung steckt allerdings ein Nachteil. Die Motorroutinen sind einmal nicht mehr interruptgesteuert (häufiges Motor Ein-/Ausschalten mit Wartezeit) und zum anderen nicht mit den VDOS Routinen synchronisiert. Sie müssen jeweils warten, bis VDOS den Motor abgeschaltet hat, damit er nicht während der Ausführungsphase über den VDOS Interrupt abgeschaltet wird.  Abb. 2: Aufder HELP -Seite von AMSMON (mit ESC an wählbar) haben Sie einen Überblick über alle Befehle.
Systemadressen Zu guter Letzt noch die wenigen Systemadressen, die BASIC-765 aus dem DOS-RAM-Bereich benutzt: - &BE46: Motor aus Verzögerung
- &BE4B: Anzahl Bytes aus ResultPh.
- &BE4C: Result Phase
- &BE5F: Motor Flag
Vielleicht gelingt einem VDOS-Freak ja eine optimale Anpassung... So, und nun kommen wir zu AMSMON PLUS. AMSMON PLUS - Mikroskop für Disketten Dieser Diskettenmonitor benutzt wie BASIC-765 eigene FDC-Routinen. Im Vergleich zu der RSX-Erweiterung sind die Routinen allerdings weitaus intelligenter. Sie nehmen Ihnen praktisch die meiste Arbeit ab. Von nun ab kann es Ihnen (fast) egal sein, wie groß ein Sektor ist. Nach Angabe der Sektornummer sucht der Monitor aus dem aktuellen Track nach dem Sektor und stellt sich automatisch auf die Sektorgröße und andere Parameter aus der ID ein! Allerdings kennt AMSMON PLUS keine Formatierroutinen. AMSMON PLUS wird in den Rechner “gebootet“, d.h., es findet eine komplette Initialisierung des Betriebssystems statt. Dies ist wegen den zahlreichen Eingriffen in das Betriebssystem notwendig, damit der Monitor eine definierte Umgebung vorfindet. Eine Anpassung an die verschiedenen CPC-Versionen erfolgt automatisch. Das Programm belegt den Speicherplatz ab &9000. Um in den Monitor zu gelangen, brauchen Sie nur RUN “AMSMON einzugeben. Anschließend meldet sich der Diskettenmonitor - Sie befinden sich im Editor. Vielleicht ist Ihnen beim Bildschirmaufbau schon etwas aufgefallen, sofern Sie den Monitor schon lauffahig zur Verfügung haben. Die Bildschirmausgabe im Monitor erfolgt nämlich mit einer eigenen FASTPRINT-Routine, die mehr als doppelt so schnell wie die Original-Routine ist. Doch nun zum Aufbau des Bildschirmes. Der Disk-Monitor und seine Möglichkeiten Ganz unten befindet sich die Statuszeile. In dieser werden die aktuellen Daten für Drive, User, Track, Sektor, Kopf und Aufzeichnungsmodus angegeben. Direkt über dieser Zeile befindet sich die Kommandozeile. In dieser werden weitere Eingaben erwartet, sowie wichtige Meldungen ausgegeben. Der größte Teil des Bildschirmes ist dem Editor gewidmet. Dieser stellt ein 16 =1= 16 Byte großes Hex- und ASCII Feld zum Editieren zur Verfügung. Nach der Initialisierung steht der Cursor links oben im Hexfeld. Mit der TAB-Taste können Sie zwischen dem Hex- und dem ASCII-Feld wechseln. Den Cursor selbst bewegen Sie mit den Cursortasten. Wenn diese zusammen mit Shift betätigt werden, wird der Cursor an den jeweiligen Rand des Feldes gesetzt. Die Kombination der Ctrl-Taste mit Cursor-links oder Cursorrechts ermöglicht es Ihnen, an den Anfang (links) oder an das Ende (rechts) des Pufferbereiches zu wandern, den Ihnen AMSMON PLUS zur Verfügung stellt. Mit der Kombination Ctrl-Taste und Cursor-auf oder Cursor-ab blättern Sie jeweils eine Seite im Speicher zurück oder hoch. Die am Rand angegebenen Adressen sind die absoluten Adressen im Speicher. Der Pufferbereich reicht von &0200 bis &87FF. Dahinter liegt ein 2048 Byte großer Bereich, den der Monitor für Dateioperationen benötigt. Der Pufferbereich von AMSDOS liegt nun im Bereich von &8000 bis &8FFF. Aufgrund der Tatsache, daß Sie den Monitor verlassen und später mit dem RSX-Befehl AMSMON wieder aufrufen können, müssen Sie Folgendes beachten: Nach Aufruf des Monitors ist der Pufferbereich nicht mit dem MEMORY-Befehl reserviert. Falls Sie also zeitweise im BASIC arbeiten, müssen Sie den benutzten Pufferbereich mit dem MEMORY-Befehl schützen. Solange Sie sich allerdings im Monitor befinden, übernimmt AMSMON PLUS die Speicherverwaltung. Noch eine Bemerkung zum Editor. Teilweise ist es störend, daß der Editor immer aktiv ist. Dies ist z.B. der Fall, wenn gerade wichtige Daten im Puffer sind und man nicht durch einen versehentlichen Tastendruck diese ungewollt verändern möchte. Deshalb läßt sich der Editor mit CAPS LOCK sperren. Als Kennzeichen dieser Sperre ist die Randfarbe nun dunkel. Mit einem erneuten Drücken der CAPS LOCK-Taste läßt sich die Sperre wieder aufheben. Die Befehle Kommen wir nun zu den Befehlen, die Ihnen AMSMON PLUS bietet. Eine Befehlsübersicht erhalten Sie durch Drücken der ESC-Taste. Alle Befehle werden durch eine Ctrl-Funktion ausgeführt, d.h., Sie müssen die entsprechende Taste zusammen mit der Ctrl-Taste drücken. Durch erneutes Drücken der ESC-Taste verlassen Sie die Hilfsseite. Bei allen Befehlen erfolgt eine Überprüfung der Eingaben. Die Befehle können nur auf den Pufferbereich angewendet werden! Ctrl-A: Laufwerk A anwählen Mit diesem Kommando wird Laufwerk A zum aktiven Laufwerk. Gleichzeitig wird ein HOME ausgeführt, um den Kopf in eine definierte Position zu bringen (siehe auch Beschreibung des HOME Befehls bei BASIC-765). Im übrigen wird auch AMSDOS über das neue Laufwerk informiert. Ctrl-B: Laufwerk B an wählen Hier wird die beim Ctrl-A Kommando beschriebene Funktion für Laufwerk B ausgeführt. Ctrl-C: Pufferbereich kopieren Diese Routine dient zum Kopieren eines Pufferbereiches an eine andere Stelle im Puffer. Es wird die erste und die letzte Adresse des Quellblockes abgefragt, anschließend die Zieladresse. Nach der Ausführung wird das Editierfeld neu aufgebaut. Die Routine arbeitet intelligent, d.h., auch sich überlappende Bereiche werden richtig kopiert. Ctrl-D: Aufzeichnungsdichte ändern Wie in der Einleitung erwähnt, kann der FDC in zwei verschiedenen Aufzeichnungsmodi arbeiten. Mit diesem Befehl wird zwischen den beiden Modi umgeschaltet. Der aktuelle Modus wird in der Statuszeile angezeigt. Ctrl-E: Neue Editadresse Wenn Sie zu einer bestimmten Stelle im Puffer wollen, können Sie diese Adresse hier angeben. Das Editierfeld wird ab dieser Adresse neu aufgebaut. Die Adresse muß im Bereich &0200... &8700 liegen. Ctrl-F: Speicherbereich füllen Wie beim Ctrl-C-Kommando wird zuerst die Anfangs- und Endadresse des Blockes abgefragt. Anschließend muß das Füllbyte angegeben werden. Ctrl-G: Folge von Sektoren lesen Dieses Kommando (und Ctrl-N) benutzt ausnahmsweise noch die DOS-Routinen für den Sektor Transfer. Mit beiden Kommandos kann eine Folge von Sektoren bearbeitet werden. Mit Ctrl-G werden Sektoren in den Puffer gelesen. Beide Befehle können nur auf die Standardformate System,Data und IBM angewendet werden! Es wird zuerst der Track abgefragt, auf dem der erste Sektor liegt. Danach wird nach dem ersten logischen Sektor gefragt. Dieser logische Sektor liegt zwischen 1 und 8 bei dem IBM-Format, bei den anderen zwischen 1 und 9. Der Sektoroffset wird vom Monitor verarbeitet. Zum Schluß wird nach der Anzahl der Sektoren gefragt, die gelesen (bei Ctrl-N geschrieben) werden sollen. Wenn der letzte Sektor auf dem Track verarbeitet ist, wird mit dem ersten Sektor auf dem nächsten Track fortgefahren. Dies geschieht solange, bis die gewünschte Anzahl von Sektoren gelesen (geschrieben) wurde, ein Fehler auftrat oder das Ende des Puffers erreicht wurde. In der Statuszeile wird nach Ausführung des Kommandos der Sektor angegeben, der dem zuletzt Gelesenen folgt. Sie können sich mit diesem Befehl sehr einfach die Systemspuren einiesen, bearbeiten und zurückschreiben (Track 0, log. Sektor 1,18 Sektoren). CtrI-H: Kopfnummer wählen Besitzer von Zweikopflaufwerken können mit diesem Befehl auf den zweiten Kopf umschalten. Eine Anzeige des aktuellen Kopfes erfolgt in der Statuszeile. Ctrl-I: Wechsel Hex-/ASCII-Modus Dieser Tastencode entspricht TAB. Es kann im Editor zwischen dem Hex- und dem ASCII-Feld umgeschaltet werden. Ctrl-J: Result Phase ausgeben Dieser Befehl ist dann sehr nützlich, wenn Sie z.B. nähere Informationen über den zuletzt gelesenen Sektor haben wollen. Nach dem Lesen rufen Sie diesen Befehl auf. Es werden Ihnen sieben Bytes hexadezimal angezeigt. Die ersten drei geben den Inhalt der FDC Statusregister an und sind für Sie im allgemeinen uninteressant, was danach kommt ist viel wichtiger. Das vierte Byte gibt die Tracknummer an, die in der Sektor-ID des gerade gelesenen Sektors steht (AMSMON PLUS verarbeitet auch Sektoren, bei denen diese Tracknummer von der physikalischen verschieden ist, s.o.), dahinter folgen die Kopfnummer und die Sektornummer. Das letzte Byte gibt die Sektorgröße an. Diese Angabe ist verschlüsselt. Die Umrechnungstabelle ist beim SINFO-Befehl des BASIC-765 angegeben. Ctrl-K: Gelöschten Sektor schreiben Nach Angabe der Sektornummer sucht AMSMON PLUS einen existierenden Sektor auf dem aktuellen Track. Wenn er ihn findet, wird der Sektor mit gelöschter DAM (s.o.) auf Diskette geschrieben. Die Daten werden ab der aktuellen Editieradresse (Adresse links oben im Feld) geschrieben. Ctrl-L: Datei laden Sie können mit dem Monitor auch Dateien verarbeiten. Diese Routine ermöglicht es Ihnen sogar, aus einer Datei einen beliebigen Ausschnitt zu laden! Nach Eingabe des Dateinamens versucht AMSMON PLUS die Datei zu öffnen. Wenn dies glückt (es werden nur Binärdateien angenommen), fragt der Monitor nach einem Offset. Hier können Sie eine Anzahl von Bytes angeben, die beim Laden übergangen werden sollen. Der Offset muß natürlich kleiner als die Dateilänge sein. Anschließend fragt der Monitor die Anzahl der Bytes ab, die in den Puffer geladen werden sollen. Zum Schluß können Sie noch die Ladeadresse wählen. Wenn Sie keinen Offset (also 0) angeben und die komplette Datei laden, verwendet AMSMON PLUS die schnelle DOS Routine, ansonsten wird die Datei byteweise geladen, was natürlich bedeutend länger dauert. Ctrl-N: Folge v. Sektoren schreiben siehe Ctrl-G Kommando Ctrl-O: Track Info Diese Routine gibt alle Sektornummem aus, die auf dem aktuellen Track vorhanden sind. Ctrl-P: Druckerausgabe Mit diesem Kommando können Sie einen Pufferbereich auf dem Drucker ausgeben. Es werden die Bereichsgrenzen abgefragt. Die Druckroutine ist jederzeit, auch bei nicht angeschlossenem Drucker, unterbrechbar. Ctrl-Q: AMSMON PLUS verlassen Mit diesem Befehl gelangen Sie in das BASIC zurück. Mit dem RSX Kommando AMSMON können Sie später wieder in den Monitor zurückkehren. Bitte denken Sie daran, evtl. Daten im Puffer mit dem MEMORY-Befehl zu sichern (s.o.). Ctrl-R: Sektor lesen Der Ablauf ist der gleiche wie beim Ctrl-K Kommando. Hier wird der gewünschte Sektor gelesen. Es können auch Sektoren mit gelöschter DAM (s.o.) eingelesen werden, in diesem Fall erfolgt in der Statuszeile eine entsprechende Meldung. Ctrl-S: Datei speichern Hiermit können Sie einen Pufferbereich auf Diskette sichern. Es wird der Bereich und der Dateiname abgefragt. Ctrl-T: Track anfahren Mit diesem Kommando können Sie den Kopf über einem beliebigen Track positionieren (0...83). Ctrl-U: User aus wählen Die Funktion dürfte klar sein: es kann ein neuer User angegeben werden. Alle folgenden Dateioperationen beziehen sich dann auf den neuen User. Anmerkung: Da AMSMON PLUS die AMSDOS Systemadressen benutzt, bleibt der User-Bereich auch nach Verlassen des Monitors aktiv. Ctrl-V: Sektor vergleichen Der Funktionsablauf ist wie beim Ctrl-R-Kommando. Nur wird hier der Sektor nicht gelesen, sondern der FDC vergleicht die Daten im Puffer mit dem angegebenen Sektor. Wie bei allen sektororientierten Befehlen wird die aktuelle Editieradresse als erste Datenadresse benutzt. Ctri-W: Sektor schreiben Wie Ctrl-K, allerdings ganz normal, ohne gelöschte DAM. CtrI-X: Directory anzeigen Es wird eine DIR-Maske abgefragt. Wenn keine Maske angegeben wird, erfolgt die Ausgabe sortiert mit Größenangabe, ansonsten werden nur die Dateien ausgegeben, die der Maske entsprechen. Ctrl-Y: Datei löschen Nach Angabe des Dateinamens (auch Wildcards zulässig) wird die entsprechende Datei gelöscht. Ctrl-Z: Datei umbenennen Auch dieser Befehl dürfte klar sein, er dient dazu, einer Datei einen neuen Namen zu geben. WICHTIG: Eine allgemeine Anmerkung! Durch den großen Pufferbereich ist es möglich, mehrere Sektoren und/oder Dateien im Puffer zu halten. Die sektororientierten Befehle arbeiten nun immer bezüglich der aktuellen Editieradresse. Wenn Sie also einen bearbeiteten Sektor auf Diskette zurückschreiben wollen, müssen Sie, sofern Sie nicht schon dort sind, erst wieder auf die ursprüngliche Ladeadresse zurückkehren! Es empfiehlt sich deshalb, einen Sektor entweder auf den Pufferanfang &0200 zu laden oder auf eine gerade Adresse wie &1000, &2000,... So kann man sich die Adresse problemlos merken. Zu den Programmen So, nun sind Sie an der Reihe. Wenn Sie nun mit BASIC-765 oder/und AMSMON PLUS arbeiten wollen, müssen Sie nur noch den jeweiligen DATA-La-der eintippen. Beide Lader arbeiten mit einer aufwendigen Prüfsumme, die sich auch von vertauschten oder vergessenen Zeilen nicht täuschen läßt. Auch Vertauschungen innerhalb einer Zeile werden erkannt. Sie können so sicher sein, daß bei fehlerfreiem Durchlauf des BASIC-Laders das jeweilige Programm auch einwandfrei läuft. Die Lader speichern das Programm anschließend auf Diskette ab. Zum Schluß noch eine Bitte. Wenn Sie die Programme ausprobieren - tun Sie dies bitte mit einer Backup-Diskette und nicht mit Ihrer wichtigsten Daten-Diskette, Sie wissen schon... (Michael Siebke/jb), CPCAI
| ★ AMSTRAD CPC ★ DOWNLOAD ★ |
CPCrulez[Content Management System] v8.732-desktop/c Page créée en 025 millisecondes et consultée 1440 foisL'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. |
|
|
|