•  Back 
  •  GDPS: Gerti's Driver Piping System 
  •  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-File15.6.2  Definition der Treiberverkettung                           TOS

Basis des GDPS ist der vom Betriebssystem nicht genutzte Vektor 0x41C. 
Dieser Vektor enthält normalerweise OL. Im GDPS zeigt der Vektor auf 
den Header des ersten Devicetreibers in der Kette. Dieser Header hat 
folgenden Aufbau (rAdr=relative Adresse, S=Size):

     rAdr S  Bedeutung

      OH  L  Pointer auf nächsten Treiberheader oder 0 im letzten Treiber
             der Kette
      4H  L  'GDPS' = 0x47445053 Magic als Kennung für das GDPS

Daraus folgt die Methode des Ein- und Ausketten eines Treibers.

  1. Einketten eines Treibers

     Der Treiber kopiert den in 0x41C stehenden Vektor in seinen 
     Header. Anschließend trägt er die Adresse seines Headers in 0x41C 
     ein.

     Assemblerbeispiel (ist im Supervisormodus auszuführen):

         len     header(pe),a0  * Adresse des GDPS-Headers
         clr.l   (a0)           * NEXT auf 0 initialisieren
         cmp.l   0x41C,a0       * = alter Wert
         beq     unten          * ja keine Endlosverkettung!
         move.l  0x41C,(a0)     * sonst NEXT eintragen
         move.l  a0,0x41C       * und Header in die Kette hängen

  2. Ausketten eines Treibers

     Der Treiber sucht in der Kette den Pointer auf seinen Header. 
     Diesen ersetzt er durch den in seinem Header befindlichen 
     Pointer.

     Assemblerbeispiel (ist im Supervisormodus auszuführen):

                    move.l  #0x41C,a0
                    lea     header(pe),a1
        searchen:   cmp.l   (a0),a1
                    beq     found
                    move.l  (a0),a0
                    bra     searchen
        found:      move.l  (a1),(a0)

  3. Suchen eines Treibers

     Das Suchen nach einem Treiber sollte ebenfalls im Supervisormode 
     erfolgen. Da das Betriebssystem die Variable 0x41C beim Warmstrat 
     nicht auf 0 setzt, muß zu jedem gefunden Vektor MAGIC überprüft 
     werden.

     Es folgt eine Beispielsroutine in GFA-Basic Notation, die die 
     gefundenen und gültigen Vektoren in ein Integerarray schreibt:

        DIM vektor%(31)                   ! Dahin kommen die Adressen der Treiber
        index%=0                          ! Zähler auf 0 initialisieren
        adr%=SLPEEK($41C)                 ! Adresse des ersten Treibers
        WHILE adr%<>0 AND SLPEEK(adr%+4)=$47445053
                                          ! Test: Adresse gültig und Magic OK?
           vektor%(index%)=adr%           ! wenn ja Adresse merken
           inc index%                     ! Zähler um eins erhöhen
        WEND
        PRINT index%;" Treiber gefunden!"