| Zeile 34: | Zeile 34: | ||
|} | |} | ||
| − | <span id=" | + | <span id="60hcmds"></span> |
{| colspan=3 | Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können. | {| colspan=3 | Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können. | ||
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''' | | '''Befehl''' || '''Größe''' || '''Beschreibung''' | ||
| + | |- | ||
| + | | ''EEh'' || 1 Byte || Dieser Befehl sendet zur Diagnostik EEh an den Port 60h. | ||
| + | |- | ||
| + | | ''F0h'' || 2 Bytes || Mit diesem Befehl kann abhängig vom zweiten Byte das Scancode Set entweder gesetzt oder abgerufen werden | ||
| + | Das Format des zweiten Byte: | ||
| + | 00h - holt den aktuellen Scancode Set ab, sodass dieser an den Port 60h gesendet wird | ||
| + | 01h - scancode set 1 (PCs and PS/2 mod 30, except Type 2 ctrlr) | ||
| + | 02h - scancode set 2 (ATs, PS/2, default) | ||
| + | 03h - scancode set 3 | ||
| + | |- | ||
| + | | ''F2h'' || 1 Byte || Keyboard ID auslesen -> AT Keyboards liefern als Wert FAh (ACK) zurück | ||
| + | -> MF2 Keyboards liefern ABh + 41h oder aber auch ABh 83h an den Port 60h | ||
| + | |- | ||
| + | | ''F3h'' || 2 Bytes || Setze die typematic rate/delay. Der Typematic-Delay gibt an, ab wann der Scancode der gedrückten Taste wiederholt an 60h gesendet wird, | ||
| + | die Typematic-Rate dagegen gibt an, wie oft dann der Scancode pro Sekunde gesendet wird. | ||
| + | Das Format des zweiten Byte: | ||
| + | Bit 7 : 0 (reserved) | ||
| + | Bit 6-5 : geben die Typematic Delay an | ||
| + | 00 = 250ms 01 = 500ms | ||
| + | 10 = 750ms 11 = 1000ms | ||
| + | Bit 4-0 : diese beiden geben die Typematic-Rate an, die sich wie folgt zusammen stellt: | ||
| + | 1/( (8+A) * 2^B * 0,00417 ) pro Sekunde A->Bits 2-0 B->Bits 4-3 | ||
| + | die Formel ein wenig umgestellt: | ||
| + | 240/( (8+A) * 2^B ) pro Sekunde -> denn ~0,00417 = 1/240 | ||
| + | |||
| + | Bei 00000b würde das dann so aussehen: | ||
| + | 1/ ( (8+0) * 2^0 * 0,00417 ) -> 1/(8*0.00417) -> ~30 Widerholungen pro Sekunde | ||
| + | Bei 11111b würde es dagegen so aussehen: | ||
| + | 1/ ( (8+7) * 2^3 * 0,00417 ) -> 1/(120*0,00417) -> ~2 Wiederholungen pro Sekunde | ||
| + | |- | ||
| + | | ''F4h'' || 1 Byte || Aktivieren des Keyboards | ||
| + | |- | ||
| + | | ''F5h'' || 1 Byte || Deaktivieren des Keyboards. Wird auch genutzt, wenn etwas aus dem Maus-Output-Buffer gelesen werden soll | ||
| + | |- | ||
| + | | ''F6h'' || 1 Byte || set default parameters | ||
| + | |- | ||
| + | | ''F7h'' || 1 Byte || set all keys to typematic (scancode set 3) | ||
| + | |- | ||
| + | | ''F8h'' || 1 Byte || set all keys to make/release | ||
| + | |- | ||
| + | | ''F9h'' || 1 Byte || set all keys to make only | ||
| + | |- | ||
| + | | ''FAh'' || 1 Byte || set all keys to typematic/make/release | ||
| + | |- | ||
| + | | ''FBh'' || 1 Byte || set all keys to typematic | ||
| + | |- | ||
| + | | ''FCh'' || 2 Bytes || set specific key to make/release | ||
| + | |- | ||
| + | | ''FDh'' || 2 Bytes || set specific key to make only | ||
| + | |- | ||
| + | | ''FEh'' || 1 Byte || resend last scancode | ||
| + | |- | ||
| + | | ''FFh'' || 1 Byte || perform internal power-on reset function | ||
| + | |- | ||
| + | | colspan=3 | 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 | ||
|} | |} | ||
<<span id="60hmouse"></span> | <<span id="60hmouse"></span> | ||
| − | {| colspan=3 | Dies ist die Liste der Befehle, die an den | + | {| colspan=3 | 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. | ||
|- | |- | ||
| '''Befehl''' || '''Größe''' || '''Beschreibung''' | | '''Befehl''' || '''Größe''' || '''Beschreibung''' | ||
| + | |- | ||
| + | | ''E6h'' || 1 Byte || Setze Maus-Scaling auf 1:1 | ||
| + | |- | ||
| + | | ''E7h'' || 1 Byte || Setze Maus-Scaling auf 2:1 | ||
| + | |- | ||
| + | | ''E8h'' || 2 Bytes || Setze Maus-Auflösung. Das zweite Byte sieht dabei wie folgt aus: | ||
| + | : 00h=1/mm | ||
| + | : 01h=2/mm | ||
| + | : 02h=4/mm | ||
| + | : 03h=8/mm | ||
| + | |- | ||
| + | | ''E9h'' || 1 Byte || Hole Status-Information -> liest 2 Bytes aus, die wie folgt aufgebaut sind | ||
| + | : Byte 0 - Bitmaske (Beschreibung gilt, wenn Bit=1 ist, ansonsten gilt das logische ander): | ||
| + | :: 7 = Reserved (0) | ||
| + | :: 6 = Remote rather than Stream mode | ||
| + | :: 5 = Maus ist aktiviert | ||
| + | :: 4 = Scaling auf 2:1 gesetzt | ||
| + | :: 3 = Reserved (0) | ||
| + | :: 2 = Linke Maustaste ist gedrückt | ||
| + | :: 1 = Reserved (0) | ||
| + | :: 0 = Rechte Maustaste ist gedrückt | ||
| + | : Byte 1 = Auflösung (siehe Befehl E8h) | ||
| + | |- | ||
| + | | ''EAh'' || 1 Byte || Versetze Maus in den Stream-Modus. In diesem aktiviert die Maus bei jeder Änderung den IRQ12, sodass dieser die Daten auslesen kann | ||
| + | |- | ||
| + | | ''EBh'' || 1 Byte || Hole Maus-Data-Paket. sollte nur genutzt werden, wenn der Remote-Modus gesetzt ist. Für eine Beschreibung des Pakets, siehe [[#Das_Maus-Daten-Packet|hier]] | ||
| + | |- | ||
| + | | ''ECh'' || 1 Byte || Versetze Maus aus den Wrap-Modus wieder in den normlen. Der Wrap-Modus ist zur Fehleranalyse gedacht und echoet jeden Befehl, statt | ||
| + | ihn mit FAh zu bestätigen. | ||
| + | |- | ||
| + | | ''EEh'' || 1 Byte || Betrete Wrap-Mouds | ||
| + | |- | ||
| + | | ''F0h'' || 1 Byte || Versetze Maus in den Remote-Modus statt ihn den Stream-Modus. In diesem Modus sendet die Maus die Daten nur beim Befehl EBh | ||
| + | |- | ||
| + | | ''F2h'' || 1 Byte || Lese MausID. Returns 00h (siehe auch bei den [[#spcs|SpecialCodes]]) | ||
| + | |- | ||
| + | | ''F3h'' || 2 Bytes || Setze die Maus-Sample-Rate, also wie oft die Maus Daten abfragen soll. Das zweite Byte kann dann so aussehen: | ||
| + | : 0Ah=10/s 50h= 80/s | ||
| + | : 14h=20/s 64h=100/s | ||
| + | : 28h=40/s C8h=200/s | ||
| + | : 3Ch=60/s | ||
| + | |- | ||
| + | | ''F4h'' || 1 Byte || Aktiviere die Maus und setze den Modus auf Stream. (in diesem Modus wird bei jeder Veränderung der IRQ12 aufgerufen) | ||
| + | |- | ||
| + | | ''F5h'' || 1 Byte || Deaktivier die Maus im Stream-Modus und setze die vorgegebenen Parameter | ||
| + | |- | ||
| + | | ''F6h'' || 1 Byte || Stelle alles auf die Vorgaben zurück -> StramMode, 4/mm-Maus-Resolution, Scaling 1:1, 100/s-Sample-Rate | ||
| + | |- | ||
| + | | ''FEh'' || 1 Byte || Sende nocheinmal das letzte Maus-Data-Paket (für Beschreibung des Pakets siehe [[#Das_Maus-Daten-Packet|hier]]) | ||
| + | |- | ||
| + | | ''FFh'' || 1 Byte || Reset Maus | ||
| + | |- | ||
| + | | colspan=3 | 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 | ||
| + | list), denn bei mir hat F2h erst FAh und dann EXTRA noch 00h gesendet! | ||
|} | |} | ||
| Zeile 51: | Zeile 164: | ||
{| colspan=3 | SpecialCode Liste - SpecialCodes werden an den Port 60h nach Befehlen geschickt | {| colspan=3 | SpecialCode Liste - SpecialCodes werden an den Port 60h nach Befehlen geschickt | ||
|- | |- | ||
| − | | '''Befehl''' || ''' | + | | '''Code''' || '''Beschreibung''' |
| + | |- | ||
| + | | ''00h'' || (Maus) ID | ||
| + | |- | ||
| + | | ''9Ch'' || Dieser Code wurde MIR geschickt, als ich die maus in den Streaminig-Mode geschickt habe, bevor ich den IRQ12-INT-Vektor | ||
| + | auf meinen IntHandler gesetzt hatte. ich schlussfolgere daraus mal, dass dieser Code gesendet wird, wenn am IRQ12-Interrupt ein | ||
| + | ungültiger Vektor angegeben ist, den die Maus anpingen könnte(im streaming Modus sendet die Maus ja bei jeder veränderung die | ||
| + | Veränderung an den IRQ12, wenn dies im Command Byte aktiviert ist) | ||
| + | |- | ||
| + | | ''AAh'' || BAT completion code (sent after errorfree Basic Assurance Test) | ||
| + | |- | ||
| + | | ''ABh'' || das ist das erste der zwei Bytes, die bei MF2-Keyboards als ID geliefert werden (siehe Befehl |- | ||
| + | | ''F2h) | ||
| + | |- | ||
| + | | ''EEh'' || Wird als Echo bei der Selbstdiagnostik zurückgegeben (siehe Befehl EEh) | ||
| + | |- | ||
| + | | ''F0h'' || Keyboard Break Code | ||
| + | |- | ||
| + | | ''FAh'' || Acknowledge (ACK) - wird nach jedem Befehl an den Port 60 außer dem Resend und Echo bei der Tastatur und ECh, F2h, FFh | ||
| + | bei der Maus gesendet | ||
| + | |- | ||
| + | | ''FCh'' || bei MF2-Keyboards wird dies bei einen BAT-Fehler, also einem Fehler in der zweiten Hälfte des Power on self test, geliefert | ||
| + | |- | ||
| + | | ''FDh'' || das selbe wie FCh nur bei AT-Keyboards (AT ist der derzeitige Standard) | ||
| + | |- | ||
| + | | ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll | ||
| + | |- | ||
| + | | colspan=2 | Notiz: Bei den SpecialCodes FCh und FDh hört das Keayboard erstneinmal mit dem selftest auf und wartet auf den nächsten Befehl | ||
|} | |} | ||
| Zeile 57: | Zeile 197: | ||
{| colspan=3 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird | {| colspan=3 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird | ||
|- | |- | ||
| − | | ''' | + | | colspan=8 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird |
| + | |- | ||
| + | | '''7''' || '''6''' || '''5''' || '''4''' || '''3''' || '''2''' || '''1''' || '''0''' | ||
| + | |- | ||
| + | | 1 = Parity-Error bei der letzten Übertragung vom Keyboard | ||
| + | |- | ||
| + | | || 1 = Ein Time-Out-Error ist aufgetreten, das heißt, dass die Maus oder die Tastatur nicht reagiert hat. Sollte dieser Fehler auftreten sollte mann den Resend-Befehl nutzen. | ||
| + | |- | ||
| + | | || || 1 = Die Maus hat Daten für uns im Maus-Output-Buffer bereit leigen und sollten nun abgeholt werden<br> | ||
| + | 0 = es liegen keine Daten für uns bereit | ||
| + | |- | ||
| + | | || || || 1 = Keyboard gesperrt<br> | ||
| + | 0 = Keyboard verfügbar | ||
| + | |- | ||
| + | | || || || || 1 = Das letzte geschrieben Byte war ein Befehl und ging somit an den Port 64h<br> | ||
| + | 0 = Das letzte geschriebene Byte waren Daten und gingnen an den Port 60h | ||
| + | |- | ||
| + | | || || || || || 1 = Selftest OK<br> | ||
| + | 0 = power up or reset | ||
| + | |- | ||
| + | | || || || || || || 1 = Der Input-Buffer hat noch Daten, also es liegt noch der zuletzt gesendete Befehl in 60h/64h und wartet auf seine Verarbeitung<br> | ||
| + | 0 = Der Input-Buffer ist leer und alle Befehle sind verarbeitet, nun können wir einen Befehl senden | ||
| + | |- | ||
| + | | || || || || || || || 1 = Im OutputBuffer befinden sich Daten für den User. Im Sourcecode wird dies genutzt um auf das Ergebnis einer Operation zu warten<br> | ||
| + | 0 = Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden | ||
|} | |} | ||