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!"