| Zeile 1: | Zeile 1: | ||
{{TODO|Tutorial fertigschreiben}} | {{TODO|Tutorial fertigschreiben}} | ||
| − | '''Advanced Power Management''' ('''APM''') ist ein Standard für Power-Management, der von Intel und Microsoft entwickelt wurde. Um die [[Advanced Power Management#Real-Mode Schnittstelle | Real-Mode Schnittstelle]] zu nutzen, sollte bereits ein [[Real Mode]]-Betriebssystem oder ein Betriebssystem, das den [[Virtual 8086 Mode]] unterstützt, vorhanden sein. Für die [[Advanced Power Management#Protected-Mode Schnittstelle | Protected-Mode Schnittstelle]] | + | '''Advanced Power Management''' ('''APM''') ist ein Standard für Power-Management, der von Intel und Microsoft entwickelt wurde. Um die [[Advanced Power Management#Real-Mode Schnittstelle | Real-Mode Schnittstelle]] zu nutzen, sollte bereits ein [[Real Mode]]-Betriebssystem oder ein Betriebssystem, das den [[Virtual 8086 Mode]] unterstützt, vorhanden sein. Für die [[Advanced Power Management#Protected-Mode Schnittstelle | Protected-Mode Schnittstelle]] sollte ein lauffähiges [[Protected Mode]]-Betriebssystem, das zumindest Funktionen zum Verändern der [[GDT]] bereitstellt, vorhanden sein. |
==Allgemeines== | ==Allgemeines== | ||
| − | Der APM-Standard definiert | + | Der APM-Standard definiert drei Schnittstellen, mit denen das Betriebssystem arbeiten kann. |
Diese Schnittstellen sind: | Diese Schnittstellen sind: | ||
| − | #Das Real Mode Interface | + | #Das Real-Mode-Interface |
| − | #Das | + | #Das 16-Bit-Protected-Mode-Interface |
| − | #Das | + | #Das 32-Bit-Protected-Mode-Interface. |
Nur eine dieser Schnittstellen kann gleichzeitig genutzt werden. | Nur eine dieser Schnittstellen kann gleichzeitig genutzt werden. | ||
| − | <br>Bevor eine dieser Schnittstellen genutzt werden kann muss das Betriebssystem kontrollieren, ob APM vorhanden ist, denn einige neue Computer unterstützen APM nicht mehr. | + | <br />Bevor eine dieser Schnittstellen genutzt werden kann, muss das Betriebssystem kontrollieren, ob APM vorhanden ist, denn einige neue Computer unterstützen APM nicht mehr. |
| − | <br>Wenn APM unterstützt wird muss das Betriebssystem sich als nächstes mit einer Schnittstelle verbinden. Es ist eine gute Idee das Trennkommando zu senden bevor man sich mit einer Schnittstelle verbindet. | + | <br />Wenn APM unterstützt wird, muss das Betriebssystem sich als nächstes mit einer Schnittstelle verbinden. Es ist eine gute Idee das Trennkommando zu senden, bevor man sich mit einer Schnittstelle verbindet. |
| − | ==Real-Mode Schnittstelle== | + | ==Real-Mode-Schnittstelle== |
===Initialisierung=== | ===Initialisierung=== | ||
====Versionskontrolle==== | ====Versionskontrolle==== | ||
| − | Diese Funktion kontrolliert ob APM unterstützt wird: | + | Diese Funktion kontrolliert, ob APM unterstützt wird: |
| − | <asm>mov ah,53h ;Das APM- | + | <asm>mov ah,53h ;Das APM-Kommando |
| − | mov al,00h ; | + | mov al,00h ;Versionsanzeigebefehl |
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler (APM_error eigenes Label) | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler (APM_error ist eigenes Label) |
;Die Funktion war erfolgreich | ;Die Funktion war erfolgreich | ||
| − | ;AX = APM Versionsnummer | + | ;AX = APM-Versionsnummer |
| − | ;AH = Major revision number (im BCD Format) | + | ;AH = Major revision number (im BCD-Format) |
| − | ;AL = Minor revision number (auch BCD Format) | + | ;AL = Minor revision number (auch BCD-Format) |
| − | ;BX = ASCII Zeichen | + | ;BX = ASCII-Zeichen „P“ (in BH) und „M“ (in BL) |
| − | ;CX = APM Flags (Weiteres in der offiziellen Dokumentation) | + | ;CX = APM-Flags (Weiteres in der offiziellen Dokumentation) |
</asm> | </asm> | ||
| Zeile 41: | Zeile 41: | ||
Diese Funktion verbindet sich zu einer der Schnittstellen, basierend auf der Variable ''interface_number'', die folgende Werte haben kann: | Diese Funktion verbindet sich zu einer der Schnittstellen, basierend auf der Variable ''interface_number'', die folgende Werte haben kann: | ||
| − | 01h = Real Mode Interface | + | 01h = Real-Mode-Interface |
| − | 02h = | + | 02h = 16-Bit-Protected-Mode-Interface |
| − | 03h = | + | 03h = 32-Bit-Protected-Mode-Interface |
<asm>;Verbinden zu einer APM-Schnittstelle | <asm>;Verbinden zu einer APM-Schnittstelle | ||
| − | mov ah,53h ;Dies ist das APM | + | mov ah,53h ;Dies ist das APM-Kommando |
mov al,[interface_number];Siehe oben | mov al,[interface_number];Siehe oben | ||
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ; | int 15h ; | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler (APM_error eigenes Label) | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler (APM_error ist eigenes Label) |
;Die Funktion war erfolgreich | ;Die Funktion war erfolgreich | ||
;Die Rückgabewerte sind unterschiedlich für jede Schnittstelle | ;Die Rückgabewerte sind unterschiedlich für jede Schnittstelle | ||
| − | ;Die Real Mode Schnittstelle gibt nichts zurück. | + | ;Die Real-Mode-Schnittstelle gibt nichts zurück. |
| Zeile 63: | Zeile 63: | ||
<asm>;Jede Schnittstelle trennen | <asm>;Jede Schnittstelle trennen | ||
| − | mov ah,53h ;dies ist das APM | + | mov ah,53h ;dies ist das APM-Kommando |
| − | mov al,04h ; | + | mov al,04h ;Trennbefehl |
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc .disconnect_error ;Wenn das Carry-Flag gesetzt wird kontrollieren was für ein Fehler auftrat | + | jc .disconnect_error ;Wenn das Carry-Flag gesetzt wird, kontrollieren, was für ein Fehler auftrat |
jmp .no_error | jmp .no_error | ||
| − | .disconnect_error: ;Der Fehlercode ist in | + | .disconnect_error: ;Der Fehlercode ist in AH. |
| − | cmp ah,03h ;Wenn der Fehlercode nicht 03h ist gab es einen Fehler | + | cmp ah,03h ;Wenn der Fehlercode nicht 03h ist, gab es einen Fehler |
| − | jne APM_error ;Der Fehlercode 03h bedeutet, dass keine Schnittstelle vebunden war. | + | jne APM_error ;Der Fehlercode 03h bedeutet, dass keine Schnittstelle vebunden war. (APM_error ist eigenes Label) |
.no_error: | .no_error: | ||
| − | ;Die Funktion war | + | ;Die Funktion war erfolgreich |
;Nichts wurde zurückgegeben | ;Nichts wurde zurückgegeben | ||
</asm> | </asm> | ||
===Geräte kontrollieren=== | ===Geräte kontrollieren=== | ||
| − | Nachdem das Betriebssystem sich mit einer Schnittstelle verbunden hat kann es anfangen Geräte zu kontrollieren, aber als erstes muss es das Power Management aktivieren. | + | Nachdem das Betriebssystem sich mit einer Schnittstelle verbunden hat, kann es anfangen Geräte zu kontrollieren, aber als erstes muss es das Power Management aktivieren. |
====Power Management aktivieren==== | ====Power Management aktivieren==== | ||
| − | Diese Funktion aktiviert das Power Management für alle Geräte. Das ist schneller als es für jedes einzeln zu aktivieren | + | Diese Funktion aktiviert das Power Management für alle Geräte. Das ist schneller, als es für jedes einzeln zu aktivieren. |
<asm>;Power Management für alle Geräte aktivieren | <asm>;Power Management für alle Geräte aktivieren | ||
| − | mov ah,53h ;Dies ist das APM | + | mov ah,53h ;Dies ist das APM-Kommando |
| − | mov al,08h ;Den Status | + | mov al,08h ;Den Status des Power Managements wechseln... |
mov bx,0001h ;...bei allen Geräten zu... | mov bx,0001h ;...bei allen Geräten zu... | ||
mov cx,0001h ;...Power Management an. | mov cx,0001h ;...Power Management an. | ||
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler (APM_error eigenes Label) | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler (APM_error ist eigenes Label) |
;Keine Rückgabe | ;Keine Rückgabe | ||
</asm> | </asm> | ||
| − | Um das Power Management nur für ein bestimmtes Gerät zu aktivieren muss | + | Um das Power Management nur für ein bestimmtes Gerät zu aktivieren, muss die Geräte-ID in der Dokumentation nachgeschlagen und statt 0001h in BX eingetragen werden. |
====Gerätezustand setzen==== | ====Gerätezustand setzen==== | ||
| − | Diese Funktion setzt alle Geräte auf den Zustand | + | Diese Funktion setzt alle Geräte auf den Zustand, den die Variable ''power_state'' angibt. Gültige Werte für ''power_state'' sind: |
01h = Standby | 01h = Standby | ||
02h = Suspend | 02h = Suspend | ||
| Zeile 104: | Zeile 104: | ||
20h...7Fh = OEM-defined power states | 20h...7Fh = OEM-defined power states | ||
| − | Um nur den Status eines bestimmten Gerätes zu ändern | + | Um nur den Status eines bestimmten Gerätes zu ändern, muss die Geräte-ID in der Dokumentation nachgeschlagen und statt 0001h in BX eingetragen werden. |
| − | <asm>mov ah,53h ;Dies ist das APM | + | <asm>mov ah,53h ;Dies ist das APM-Kommando |
mov al,07h ;Setze den Status... | mov al,07h ;Setze den Status... | ||
mov bx,0001h ;...aller Geräte... | mov bx,0001h ;...aller Geräte... | ||
| − | mov cx,[power_state] ;...zu | + | mov cx,[power_state] ;...zu (siehe oben) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler (APM_error eigenes Label) | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler (APM_error ist eigenes Label) |
;Keine Rückgabe | ;Keine Rückgabe | ||
| Zeile 118: | Zeile 118: | ||
===Alles zusammen=== | ===Alles zusammen=== | ||
| − | + | Zum Abschluss des Real-Mode-Teils noch eine Funktion zum Herunterfahren des Computers: | |
<asm>shutdown: | <asm>shutdown: | ||
pusha | pusha | ||
mov ah,53h ;Das APM-Komando | mov ah,53h ;Das APM-Komando | ||
| − | mov al,00h ; | + | mov al,00h ;Versionsanzeigebefehl |
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler (APM_error eigenes Label) | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler (APM_error ist eigenes Label) |
| − | mov ah,53h ;dies ist das APM | + | mov ah,53h ;dies ist das APM-Kommando |
| − | mov al,04h ; | + | mov al,04h ;Trennbefehl |
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc .disconnect_error ;Wenn das Carry-Flag gesetzt wird kontrollieren was für ein Fehler auftrat | + | jc .disconnect_error ;Wenn das Carry-Flag gesetzt wird, kontrollieren, was für ein Fehler auftrat |
jmp .no_error | jmp .no_error | ||
| − | .disconnect_error: ;Der Fehlercode ist in | + | .disconnect_error: ;Der Fehlercode ist in AH. |
| − | cmp ah,03h ;Wenn der Fehlercode nicht 03h ist gab es einen Fehler | + | cmp ah,03h ;Wenn der Fehlercode nicht 03h ist, gab es einen Fehler |
| − | jne APM_error ;Der Fehlercode 03h bedeutet, dass keine Schnittstelle vebunden war. | + | jne APM_error ;Der Fehlercode 03h bedeutet, dass keine Schnittstelle vebunden war. (APM_error ist eigenes Label) |
.no_error: | .no_error: | ||
;Verbinden zu einer APM-Schnittstelle | ;Verbinden zu einer APM-Schnittstelle | ||
| − | mov ah,53h ;Dies ist das APM | + | mov ah,53h ;Dies ist das APM-Kommando |
mov al,[interface_number];Siehe oben | mov al,[interface_number];Siehe oben | ||
| − | xor bx,bx ;Geräte | + | xor bx,bx ;Geräte-ID (0 = APM BIOS) |
int 15h ; | int 15h ; | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler |
;Power Management für alle Geräte aktivieren | ;Power Management für alle Geräte aktivieren | ||
| − | mov ah,53h ;Dies ist das APM | + | mov ah,53h ;Dies ist das APM-Kommando |
| − | mov al,08h ;Den Status | + | mov al,08h ;Den Status des Power Managements wechseln... |
mov bx,0001h ;...bei allen Geräten zu... | mov bx,0001h ;...bei allen Geräten zu... | ||
mov cx,0001h ;...Power Management an. | mov cx,0001h ;...Power Management an. | ||
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde, gab es einen Fehler |
| − | mov ah,53h ;Dies ist das APM | + | mov ah,53h ;Dies ist das APM-Kommando |
mov al,07h ;Setze den Status... | mov al,07h ;Setze den Status... | ||
mov bx,0001h ;...aller Geräte... | mov bx,0001h ;...aller Geräte... | ||
| − | mov cx,[power_state] ;...zu | + | mov cx,[power_state] ;...zu (siehe oben) |
int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | int 15h ;Die BIOS-Funktion über Interrupt 15h aufrufen | ||
| − | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler | + | jc APM_error ;Wenn das Carry-Flag gesetzt wurde gab es einen Fehler |
;Keine Rückgabe | ;Keine Rückgabe | ||
| Zeile 169: | Zeile 169: | ||
ret | ret | ||
| − | interface_number db 01h ;Real Mode Schnittstelle | + | interface_number db 01h ;Real-Mode-Schnittstelle |
power_state db 03h ;Power off | power_state db 03h ;Power off | ||
</asm> | </asm> | ||