| Zeile 46: | Zeile 46: | ||
Hier der Code um abzufragen ob der Tastatur-Controller Input Buffer frei ist: | Hier der Code um abzufragen ob der Tastatur-Controller Input Buffer frei ist: | ||
| − | + | <asm> .1: | |
in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | ||
test al, 00000010b ;Ist das Bit1 gesetzt? | test al, 00000010b ;Ist das Bit1 gesetzt? | ||
| − | jnz .1 ;Wenn ja, dann wiederhole den Vorgang | + | jnz .1 ;Wenn ja, dann wiederhole den Vorgang</asm> |
Wenn die Schleife nun beendet wird, wenn also das Bit1 NICHT MEHR gesetzt ist, dann können wir dem Tastatur-Controller einen Befehl senden. Und zwar möchten wir das Statusbyte des Tastatur-Chips Output Ports lesen. | Wenn die Schleife nun beendet wird, wenn also das Bit1 NICHT MEHR gesetzt ist, dann können wir dem Tastatur-Controller einen Befehl senden. Und zwar möchten wir das Statusbyte des Tastatur-Chips Output Ports lesen. | ||
| Zeile 57: | Zeile 57: | ||
Das geschieht mit folgendem Code: | Das geschieht mit folgendem Code: | ||
| − | + | <asm> mov al, 0xD0 ;Befehl zum lesen des Output Port Statusbytes in AL speichern | |
| − | out 0x64, al ;Befehl an den Tastatur-Controller senden | + | out 0x64, al ;Befehl an den Tastatur-Controller senden</asm> |
| Zeile 65: | Zeile 65: | ||
Hier der Code zum warten auf das Byte: | Hier der Code zum warten auf das Byte: | ||
| − | + | <asm> .2: | |
in al, 0x64 ;Tastatur-Controller Statusbyte lesen | in al, 0x64 ;Tastatur-Controller Statusbyte lesen | ||
test al, 00000001b ;Bit0 testen ob es gesetzt ist | test al, 00000001b ;Bit0 testen ob es gesetzt ist | ||
| − | jz .2 ;Wenn es NOCH NICHT gesetzt ist, wiederhole den Vorgang | + | jz .2 ;Wenn es NOCH NICHT gesetzt ist, wiederhole den Vorgang</asm> |
| Zeile 75: | Zeile 75: | ||
Mit folgendem Code holen wir uns das Byte, setzen das Bit1 auf 1 und speichern das Byte (befindet sich nach dem lesen in AL bzw. EAX) auf dem Stack zwischen. Das müssen wir tun, da wir Al bzw. EAX noch für ein paar Zwischenschritte benötigen, bevor wir das Statusbyte wieder zurückschreiben können. Man könnte EAX auch in einem anderen Register zwischenspeichern. Das ist dann einfach Ansichtssache. | Mit folgendem Code holen wir uns das Byte, setzen das Bit1 auf 1 und speichern das Byte (befindet sich nach dem lesen in AL bzw. EAX) auf dem Stack zwischen. Das müssen wir tun, da wir Al bzw. EAX noch für ein paar Zwischenschritte benötigen, bevor wir das Statusbyte wieder zurückschreiben können. Man könnte EAX auch in einem anderen Register zwischenspeichern. Das ist dann einfach Ansichtssache. | ||
| − | + | <asm> in al, 0x60 ;Output Port Statusbyte von Tastatur-Chip lesen | |
or al, 00000010b ;Bit1 auf 1 setzen. A20Gate Enable Bit | or al, 00000010b ;Bit1 auf 1 setzen. A20Gate Enable Bit | ||
| − | push eax ;EAX zwischenspeichern | + | push eax ;EAX zwischenspeichern</asm> |
So nun geht das Spielchen nochmal von vorne los. Wir müssen nun erst wieder warten das wir einen Befehl an den Tastatur-Controller schicken können. Dazu der folgende Code, welcher identisch mit bereits oben genannten ist: | So nun geht das Spielchen nochmal von vorne los. Wir müssen nun erst wieder warten das wir einen Befehl an den Tastatur-Controller schicken können. Dazu der folgende Code, welcher identisch mit bereits oben genannten ist: | ||
| − | + | <asm> .3: | |
in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | ||
test al, 00000010b ;Ist das Bit1 gesetzt? | test al, 00000010b ;Ist das Bit1 gesetzt? | ||
| − | jnz .3 ;Wenn ja, dann wiederhole den Vorgang | + | jnz .3 ;Wenn ja, dann wiederhole den Vorgang</asm> |
Nun können wir wieder einen Befehl senden und tun dies auch gleich. Diesmal jedoch senden wir den Befehl der dem Tastatur-Controller mitteilt, das wir das Statusbyte des Output Ports wieder zurückschreiben möchten. | Nun können wir wieder einen Befehl senden und tun dies auch gleich. Diesmal jedoch senden wir den Befehl der dem Tastatur-Controller mitteilt, das wir das Statusbyte des Output Ports wieder zurückschreiben möchten. | ||
| Zeile 90: | Zeile 90: | ||
Dazu dient folgender Code: | Dazu dient folgender Code: | ||
| − | + | <asm> mov al, 0xD1 ;Befehl zum schreiben des Statusbytes des Output Ports in AL schreiben | |
| − | out 0x64, al ;Befehl an den Tastatur-Controller senden | + | out 0x64, al ;Befehl an den Tastatur-Controller senden</asm> |
Und wie so üblich müssen wir WIEDER warten das wir Daten senden können. Also nochmal: | Und wie so üblich müssen wir WIEDER warten das wir Daten senden können. Also nochmal: | ||
| − | + | <asm> .4: | |
in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | in al, 0x64 ;Tastatur-Controller-Statusbyte lesen | ||
test al, 00000010b ;Ist das Bit1 gesetzt? | test al, 00000010b ;Ist das Bit1 gesetzt? | ||
| − | jnz .4 ;Wenn ja, dann wiederhole den Vorgang | + | jnz .4 ;Wenn ja, dann wiederhole den Vorgang</asm> |
Und nun holen wir uns das Statusbyte wieder vom Stack und senden es an den Tastatur-Chip. | Und nun holen wir uns das Statusbyte wieder vom Stack und senden es an den Tastatur-Chip. | ||
| − | + | <asm> pop eax ;Statusbyte vom Stack holen | |
| − | out 0x60, al ;An Tastatur-Chip senden | + | out 0x60, al ;An Tastatur-Chip senden</asm> |
| Zeile 113: | Zeile 113: | ||
Der Prototyp der Funktion für C lautet wie folgt: | Der Prototyp der Funktion für C lautet wie folgt: | ||
| − | + | <c> unsigned int EnableA20Gate();</c> | |
Wer seinen C-Kernel nach meiner Methode (Siehe C-Kernel Tut) startet, der kann diese Funktion am besten in die kernel32.asm Datei packen. | Wer seinen C-Kernel nach meiner Methode (Siehe C-Kernel Tut) startet, der kann diese Funktion am besten in die kernel32.asm Datei packen. | ||