Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File11.21.3.6.9 dev_stat TOS Name: »dev_stat« Parameter: a0 = FD *file a1 = MAGX_UNSEL *unselect oder NULL d0 = int rwflag d1 = long apcode -> d0 = long status Beschreibung: Gibt den Lese-/Schreibstatus der Datei an. Wird z.B. bei Fselect() aufgerufen (oder bei Cconos()/Cconis() usw.). Im Gegensatz zu MiNT wird hier dem Treiber überlassen, ob er interruptfähig ist oder nicht, d.h. ob er in der Lage ist, eine wartende Applikation im Interrupt wieder aufzurufen oder nicht. rwflag gibt an, ob Schreib- oder Lesestatus abgefragt wird. <unselect> ist entweder NULL oder ein Zeiger auf folgende Struktur: typedef struct { union { void (*unsel) (MAGX_UNSEL *un); long status; } long param; } MAGX_UNSEL; Vorgehensweise: Allgemein gilt: Wenn <unselect> ungleich Null ist, muß der Rückgabewert nicht nur als Funktionsergebnis (in d0.l), sondern auch in unselect->status zurückgegeben werden. Das gilt für alle Arten von Rückgabewerten. In unsel->param kann optional ein Parameter abgelegt werden. Wenn <apcode> == NULL ist, wird gepollt, d.h. die Applikation wird nicht schlafengelegt. Also Rückgabe: 0 = nicht bereit, 1 = bereit, <0 = Fehler. Wenn <apcode> != NULL ist (dann ist auch <unselect> != NULL) wird zurückgegeben: <0 Fehler 0 nicht bereit, Gerät kann nur polling 1 bereit >0 etwa Zeiger auf eine Funktion, die den Aufweckinterrupt wieder deinstalliert (entspricht in etwa dem unselect in MiNT). Falls das Gerät nicht bereit ist und interruptfähig ist, geht man folgendermaßen vor: 1. unselect mit der Adresse der Aufräumroutine und einem optionalen Parameter initialisieren, Prototyp etwa: void unselect( a0 = MAGX_UNSEL *un,a1 = void *ap_code ); 2. Interrupt zum Aufwecken installieren, diesem unselect (und damit auch den optionalen Parameter) und appl mitteilen. 3. Zeiger auf Aufräumroutine in d0 zurückgeben. Die Interruptroutine macht folgendes: 1. Der Interrupt trifft ein. 2. unselect->status wird mit 1 (ok) oder < 0 (nicht ok) beschrieben und der Interrupt deaktiviert! Die Applikation wird aufgeweckt mit kernel->appl_IOcomplete( a0 = APPL *ap ); Die Aufräumroutine macht folgendes: 1. Der Interrupt wird deaktiviert. 2. in unsel->status wird, falls noch nicht geschehen, eine 1 (eingetroffen) oder 0 (nicht eingetroffen) oder < 0 (Fehler) eingetragen. Es muß sichergestellt werden, daß kein IOcomplete und kein Schreibzugriff auf unsel anschließend noch erfolgen kann. Ein Wert ungleich 1, aber größer als Null wird immer als Adresse der Aufräumroutine interpretiert, diese muß noch aufgerufen werden, wenn der Interrupt nicht eingetroffen ist. Falls der Interrupt z.B. einen Wert von 2L eintrüge, ginge der Kernel davon aus, daß der Interrupt nicht eingetreten ist und immer noch die Adresse der Aufräumroutine in der MAGX_UNSEL-Struktur steht. Ein Sprung nach Adresse 2 ist dann aber schnell ziemlich tödlich. Die DOS-Funktionen Finstat() und Foutstat() versuchen zunächst, den Aufruf auf Fcntl (FIONREAD bzw. FIONWRITE) zurückzuführen. Wenn diese Subfunktion von dev_ioctl nicht existiert (der Dateitreiber muß EINVFN liefern!), wird dev_stat aufgerufen. In diesem Fall kann die Aussage getroffen werden "Zeichen liegt an" (Wert == 1) bzw. "kein Zeichen liegt an" (Wert == 0). Der vom DOS_XFS installierte Dateitreiber leitet den Aufruf direkt an den MX_DDEV-Untertreiber weiter. Gruppe: Gerätetreiber Querverweis: -