•  Back 
  •  Der Gerätetreiber (MX_DEV) 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
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:  -