Floprate für Liebhaber: Elegante Routine auf allen TOS-Versionen

Mitte des letzten Jahres dokumentierte Atari eine neue XBIOS-Routine: »Floprate«, XBIOS 41 [1]. Mit dieser Funktion bestimmen Sie die Schrittrate eines Disketten-Laufwerks. Leider existiert diese Funktion erst seit den Rainbow-TOS-Versionen. Für TOS 1.0 und 1.2 veröffentlichte Atari dafür die Speicherzellen, in denen die betreffenden Werte zu finden sind. Bei Verwendung einer Routine, die auf allen Systemen laufen sollte, fällt also immer wieder der gleiche Rechenaufwand an. Das von Atari selbst mitgelieferte Programm kann höheren Programmieransprüchen nicht genügen, beispielsweise deshalb, weil sich der Programmkern nicht als Objektfile zum Hinzulinken eigener Programme eignet. Um nun alle Programmierer, vor allem die Assembler- und C-Liebhaber in den Genuß einer solchen Routine zu bringen, entwickelten wir »Floprate«. Dieses kurze Assemblerprogramm funktioniert auf allen TOS-Versionen und erzielt das gleiche wie die TOS-Routine. Der Aufruf in C gestaltet sich exakt wie der von »Floprate«:

oldrate = ffloprate (devno, oldrate);

In Assembler rufen Sie wie folgt auf:

movem #devno, d0
move.w #newrate, d1
bsr.s ffloprate

»oldrate« erhalten Sie nach Beendigung der Routine als Integer im Register d0 zurück. Wenn Sie die Routine in Assembler verwenden möchten, sollten Sie beachten, daß die Inhalte der Register d0-d2 und a0-a1 gelöscht werden. Atari schreibt zwar, daß auch a2 gelöscht werden könnte, dies entspricht aber nicht den Turbo-C-Konventionen. Trotzdem sollte man sich an Ataris Vorgaben halten und auch in a2 keine wichtigen Daten aufbewahren, wenn man TOS-Routinen aufruft.

Bei einer flüchtigen Analyse des TOS 1.4 liegt übrigens die Vermutung nahe, daß Atari/Sunnyvale als Entwicklungssystem Turbo-C verwendet, einige Programmstrukturen erinnern sehr an die von Turbo-C-Kompilaten. Weiterhin sollten Sie in Assemblerprogrammen die PC-relative Programmierung verwenden. Turbo-Ass oder der GFA-Assembler bieten Ihnen fertige Optimierungsstufen hierfür. Unsere Routine prüft zunächst, ob die Funktion »Floprate« bereits ins verwendete Betriebssystem integriert ist. Sofern dies der Fall ist, benutzt es diese Funktion, ansonsten schreibt es den angegebenen Wert in die TOS-spezifischen Speicherzelle und gibt den bisherigen Wert dieser Variablen zurück. In einem beiliegenden C-Listing verwenden wir die neue »Floprate«-Funktion bereits. Mit diesem Programm setzen Sie die Schrittrate des von Ihnen gewählten Laufwerkes nach Ihren Ansprüchen.

Timestamp

Die GEMDOS-Routine mit der Nummer 87 (»Fdatime«) bietet dem Programmierer die Fähigkeit, Erstellungsdaten von gespeicherten Dateien zu ermitteln. Mehr noch: Sie dürfen hiermit sogar nachträglich die Daten verändern. Dies kann vielfältigen Nutzen haben. Beispielsweise kann ein Programm damit bestimmen, wann der User es zuletzt verwendete oder wann der ST ein Archiv erstellt hat.

Feldvariable hält Werte verfügbar

Unser Basic-Programm ermöglicht es Ihnen, die Erstellungsdaten jeder Datei beliebig zu verändern (- >Bild 1). Der Aufruf von »Fdatime« gestaltet sich gewohnt einfach, ein Problem ergibt sich jedoch bei der Umrechnung der Daten. TOS legt den Datumsstempel nämlich nicht als ASCII-String im Inhaltsverzeichnis ab, sondern benutzt das MSDOS-spezifische DOSTIME-Format. Das spart ein paar Bytes im Directory und bietet volle Kompatibilität zum MSDOS-Format. Für genaue Informationen über das Daten-Format und allerhand Interna des Uhrenchips RP 5C15 im ST empfehlen wir die Einbauanleitung der GengTec Mega-Clock [2].

Im »Fdatime«-Aufruf geben Sie einen Zeiger auf einen Integer an, vor oder nach dem Funktionsaufruf die DOSTIME-Struktur enthält. Über den Aufbau dieser Struktur gibt Ihnen Bild 2 Aufschluß. Ein eigenes Basic-Programm muß die DOSTIME-Struktur zunächst in ein leichter verständliches Format umrechnen. In unserem Basic-Programm übernimmt dies eine kurze Entschlüsselungsroutine, die eine Feldvariable mit den errechneten Daten füllt. Dort sind sie bis zum Speichern der Werte jederzeit erreich- und veränderbar.

Das Rückrechnen des Feldes gestaltet sich schwieriger: Wir wollen die DOSTIME-Struktur wieder als 32-Bit-Zahl in einer 4-Byte-Variablen ablegen. GFABasic verwendet bei diesen Zahlen dummerweise immer das oberste Bit als Vorzeichenkennung. Alle Versuche, dieses Bit durch eine Addition von 231 zu setzen, provozieren eine Fehlermeldung. Wir können deshalb alle Bits mit normalen Additionsanweisungen setzen, müssen aber beim obersten Bit den Befehl BIT des GFA-Basics verwenden. Dieses Bit belegt nach Bild 2 die Anzeige der Stunden. Ist die Datei nach 16.00 Uhr entstanden, müssen wir eine Fallunterscheidung einleiten. Wir ziehen das oberste Bit ab, indem wir 8 subtrahieren und tragen den neuen Wert (in diesem Fall 8) in die Long-Variable ein. Danach setzen wir das oberste Bit des Variablenwertes und haben das Ziel erreicht.

Solche Probleme belasten uns in der Assemblerversion nicht. Nach Programmstart fordert sie zur Eingabe des Programmnamens mit Pfad auf. Eine Fileselector-Box wäre hier schöner gewesen, aber dann wäre das Programm durch die Einrichtung der AES-Felder unnötig gewachsen. Das Programm liest die DOSTIME-Struktur ein und teilt sie durch Bitverschiebung und AND-Verknüpfung auf.

Laurenz Prüßner/mb

Literatur:

[1] J. Reschke, »Eine Woche Atari«, ST-Magazin 11/1989, Seite 65, Markt & Technik Verlag AG.
[2] Gerald Geng, »Einbauanleitung MEGA-CLOCK«, Teichstraße 20, D-4020 Mettmann



Aus: ST-Magazin 05 / 1990, Seite 72

Links

Copyright-Bestimmungen: siehe Über diese Seite