| Zeile 15: | Zeile 15: | ||
=== Der PS/2-Port und der KBC === | === Der PS/2-Port und der KBC === | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | + | ! Port || Zugriff || Beschreibung | |
|- | |- | ||
|'''60h''' || ''Lesezugriff'' || Der Port 60h ist zweiseitig, er kann als Keyboard-Controller(64h)-Daten-Port oder als Keyboard-In-/Output-Buffer dienen. An diesen Port werden die Scancodes der gedrückten Tasten gesendet, die dann der Keyboard-Treiber per "in al,60h" auslesen kann. Deaktiviert man bevor man aus diesem Port etwas ausliest das Keybord per Befehl ADh, so erhält man die Daten aus dem Maus-Output-Buffer! | |'''60h''' || ''Lesezugriff'' || Der Port 60h ist zweiseitig, er kann als Keyboard-Controller(64h)-Daten-Port oder als Keyboard-In-/Output-Buffer dienen. An diesen Port werden die Scancodes der gedrückten Tasten gesendet, die dann der Keyboard-Treiber per "in al,60h" auslesen kann. Deaktiviert man bevor man aus diesem Port etwas ausliest das Keybord per Befehl ADh, so erhält man die Daten aus dem Maus-Output-Buffer! | ||
| Zeile 41: | Zeile 41: | ||
<span id="60hcmds"></span> | <span id="60hcmds"></span> | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | | | + | |+ Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können.<br>Werden 2 Bytes verlangt, wird das zweite auch an den Port 60h gesendet. |
| − | Werden 2 Bytes verlangt, wird das zweite auch an den Port 60h gesendet. | ||
|- | |- | ||
| − | + | ! Befehl || Größe || Beschreibung | |
|- | |- | ||
| ''EEh'' || 1 Byte || Dieser Befehl sendet zur Diagnostik EEh an den Port 60h. | | ''EEh'' || 1 Byte || Dieser Befehl sendet zur Diagnostik EEh an den Port 60h. | ||
| Zeile 102: | Zeile 101: | ||
| ''FFh'' || 1 Byte || perform internal power-on reset function | | ''FFh'' || 1 Byte || perform internal power-on reset function | ||
|- | |- | ||
| − | | | + | |+ Note: Jeder Befehl wird durch das senden von FAh (ACK) an den Port 60h bestätigt, und achtung, denn bei Befehlen, die aus 2 Bytes bestehen, wird jedes<br> |
Byte einzeln bestätigt, für andere SpecialCodes siehe hier | Byte einzeln bestätigt, für andere SpecialCodes siehe hier | ||
|} | |} | ||
| Zeile 110: | Zeile 109: | ||
<span id="60hmouse"></span> | <span id="60hmouse"></span> | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | | | + | |+ Dies ist die Liste der Befehle, die zur Adjustierung der Maus dienen. Bevor einer dieser Befehle an den Port 60h gesendet werden kann, muss zuerst per<br>"D4h" an den Port 64h, dem Controller gesagt werden, dass das nächste Byte, also eins aus dieser Liste, auch an die Maus gesendet wird. Wir "D4h" nicht<br>zuvor verwendet würde der Befehl an die Tastatur und nicht die Maus gehen.<br>ACHTUNG: Bei 2 Byte großen Befehlen muss auch vor dem senden des 2. Bytes dies mit "D4h" initiiert werden. |
| − | "D4h" an den Port 64h, dem Controller gesagt werden, dass das nächste Byte, also eins aus dieser Liste, auch an die Maus gesendet wird. Wir "D4h" nicht<br> | ||
| − | zuvor verwendet würde der Befehl an die Tastatur und nicht die Maus gehen.<br> | ||
| − | ACHTUNG: Bei 2 Byte großen Befehlen muss auch vor dem senden des 2. Bytes dies mit "D4h" initiiert werden. | ||
|- | |- | ||
| − | + | ! Befehl || Größe || Beschreibung | |
|- | |- | ||
| ''E6h'' || 1 Byte || Setze Maus-Scaling auf 1:1 | | ''E6h'' || 1 Byte || Setze Maus-Scaling auf 1:1 | ||
| Zeile 170: | Zeile 166: | ||
| ''FFh'' || 1 Byte || Reset Maus | | ''FFh'' || 1 Byte || Reset Maus | ||
|- | |- | ||
| − | | | + | |+ Notiz: Um es zur Sicherheit wiederholen, vor jeden diser Befehle muss "D4h" an den Port 64h geschickt werden. Alle Befehle werden entweder per FAh(ACK) |
oder FEh(Resend) aktzeptiert. Ausnahmen hierbei sind ECh, F2h, FFh. Obowhl das mit den Ausnahmen anscheinend nicht stimmt(entnommen ralf Browns interrupt | oder FEh(Resend) aktzeptiert. Ausnahmen hierbei sind ECh, F2h, FFh. Obowhl das mit den Ausnahmen anscheinend nicht stimmt(entnommen ralf Browns interrupt | ||
list), denn bei mir hat F2h erst FAh und dann EXTRA noch 00h gesendet! | list), denn bei mir hat F2h erst FAh und dann EXTRA noch 00h gesendet! | ||
| Zeile 179: | Zeile 175: | ||
<span id="spcs"></span> | <span id="spcs"></span> | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | | | + | |+ SpecialCode Liste - SpecialCodes werden an den Port 60h nach Befehlen geschickt |
|- | |- | ||
| − | + | ! '''Code''' || '''Beschreibung''' | |
|- | |- | ||
| ''00h'' || (Maus) ID | | ''00h'' || (Maus) ID | ||
| Zeile 209: | Zeile 205: | ||
| ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll | | ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll | ||
|- | |- | ||
| − | | | + | |+ Notiz: Bei den SpecialCodes FCh und FDh hört das Keayboard erstneinmal mit dem selftest auf und wartet auf den nächsten Befehl |
|} | |} | ||
| Zeile 216: | Zeile 212: | ||
<span id="64hread"></span> | <span id="64hread"></span> | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | | | + | |+ Bitfelder des Statusbytes, das beim Lesen des 64h's geliefert wird |
|- | |- | ||
| − | + | ! 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 | |
|- | |- | ||
| colspan=8 | 1 = Parity-Error bei der letzten Übertragung vom Keyboard | | colspan=8 | 1 = Parity-Error bei der letzten Übertragung vom Keyboard | ||
| Zeile 248: | Zeile 244: | ||
<span id="64hcmds"></span> | <span id="64hcmds"></span> | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | | | + | |+ Dies ist die Liste der Befehle, die an den Keyboard-Controller (64h) gesendet werden können.<br> |
Werden 2 Bytes verlangt, wird das zweite an den Port 60h gesendet! | Werden 2 Bytes verlangt, wird das zweite an den Port 60h gesendet! | ||
|- | |- | ||
| − | + | ! Befehl || Größe || Beschreibung | |
|- | |- | ||
| ''20h'' || 1 Byte || Dieser Befehl sendet das derzeitige Commando-Byte an den Port 60h, wo es vom User abgeholt werden muss. | | ''20h'' || 1 Byte || Dieser Befehl sendet das derzeitige Commando-Byte an den Port 60h, wo es vom User abgeholt werden muss. | ||
| Zeile 344: | Zeile 340: | ||
Die Sache mit dem Daten-Paket ist eigentlich recht einfach, immer wenn der IRQ12 angepingt wird, liegt ein Datenpaket im Maus-Output-Buffer, was Byteweise abgeholt werden sollte, wenn Bit5 im 64h-Status-Byte gesetzt ist. Das Daten-Paket ist dabei wie folgt aufgebaut: | Die Sache mit dem Daten-Paket ist eigentlich recht einfach, immer wenn der IRQ12 angepingt wird, liegt ein Datenpaket im Maus-Output-Buffer, was Byteweise abgeholt werden sollte, wenn Bit5 im 64h-Status-Byte gesetzt ist. Das Daten-Paket ist dabei wie folgt aufgebaut: | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | + | ! 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 || | |
|- | |- | ||
| ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | | ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | ||
| Zeile 395: | Zeile 391: | ||
Wenn dies erfolgreich gesendet wurde und gleich danach mit F2h die MausID abgefragt wird, senden normale/alte PS2-Mäuse 00h, wie in den Tabellen oben beschrieben. Neuere Mäuse jedoch, die ein Mausrad besitzen, senden als ID 03h. Diese ID sagt dann dem Maustreiber auch, dass ab jetzt die Daten-Pakete 4 Byte groß sind und wie folgt aussehen: | Wenn dies erfolgreich gesendet wurde und gleich danach mit F2h die MausID abgefragt wird, senden normale/alte PS2-Mäuse 00h, wie in den Tabellen oben beschrieben. Neuere Mäuse jedoch, die ein Mausrad besitzen, senden als ID 03h. Diese ID sagt dann dem Maustreiber auch, dass ab jetzt die Daten-Pakete 4 Byte groß sind und wie folgt aussehen: | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | + | ! 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 || | |
|- | |- | ||
| ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | | ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | ||
| Zeile 457: | Zeile 453: | ||
Der Code zum Aktivieren des Rades und der 5 Button sollte ganz einfach aus einer modifizierten Version des Sources zum Aktivieren des Wheel-Modus möglich sein. Wenn die Maus Taste 4+5 unterstützt, dann sendet sie nach dem GetDeviceID(F2h) 04h, statt 00h und sendet ab sofort folgendes Maus-Daten-Paket: | Der Code zum Aktivieren des Rades und der 5 Button sollte ganz einfach aus einer modifizierten Version des Sources zum Aktivieren des Wheel-Modus möglich sein. Wenn die Maus Taste 4+5 unterstützt, dann sendet sie nach dem GetDeviceID(F2h) 04h, statt 00h und sendet ab sofort folgendes Maus-Daten-Paket: | ||
| − | {| | + | {| {{prettytable}} |
|- | |- | ||
| − | + | ! 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 || | |
|- | |- | ||
| ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | | ''Byte 1'' || Y overflow || X overflow || Y sign bit || X sign bit || Reserved (1) || Middle Button pressed || Right Button pressed || Left Button pressed | ||