| Zeile 32: | Zeile 32: | ||
|- | |- | ||
| || ''Schreibzugriff'' || Beim Schreibzugriff an diesen Port fungiert dieser als Keyboard-Controller-Input-Buffe, sodass eine Reihe von Byte-großen Befehlen gesendet werden können, die zumeist das System des Keyboards beeinflussen, so muss man auch an diese Port den Befehl "D4h" senden, um den nächsten Befehl, der zum Keyboard-Port(60h) geht, an die Maus senden zu lassen. | | || ''Schreibzugriff'' || Beim Schreibzugriff an diesen Port fungiert dieser als Keyboard-Controller-Input-Buffe, sodass eine Reihe von Byte-großen Befehlen gesendet werden können, die zumeist das System des Keyboards beeinflussen, so muss man auch an diese Port den Befehl "D4h" senden, um den nächsten Befehl, der zum Keyboard-Port(60h) geht, an die Maus senden zu lassen. | ||
| + | Eine Reihe von Befehlen ist [[#64hcmds|hier]] aufgelistet. | ||
| + | |} | ||
| + | |||
=== Tastatur-Befehle (60h) === | === Tastatur-Befehle (60h) === | ||
| − | |||
| − | |||
| − | |||
<span id="60hcmds"></span> | <span id="60hcmds"></span> | ||
| Zeile 103: | Zeile 103: | ||
Byte einzeln bestätigt, für andere SpecialCodes siehe hier | Byte einzeln bestätigt, für andere SpecialCodes siehe hier | ||
|} | |} | ||
| + | |||
=== Maus-Befehle (60h) === | === Maus-Befehle (60h) === | ||
| Zeile 171: | Zeile 172: | ||
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! | ||
|} | |} | ||
| + | |||
==== SpecialCodes als Rückgabe von Befehlen (60h) ==== | ==== SpecialCodes als Rückgabe von Befehlen (60h) ==== | ||
| Zeile 207: | Zeile 209: | ||
| 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 | | 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 | ||
|} | |} | ||
| + | |||
=== KBC-Status-Byte (64h) === | === KBC-Status-Byte (64h) === | ||
| Zeile 239: | Zeile 242: | ||
0 = Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden | 0 = Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden | ||
|} | |} | ||
| + | |||
=== Keyboard-Controller-Befehle (64h) === | === Keyboard-Controller-Befehle (64h) === | ||
| Zeile 332: | Zeile 336: | ||
: Bit 4 : 0 = Scroll Lock LED off -> 1 = on | : Bit 4 : 0 = Scroll Lock LED off -> 1 = on | ||
|} | |} | ||
| − | |||
| − | |||
== Das Maus-Daten-Packet == | == Das Maus-Daten-Packet == | ||
| Zeile 360: | Zeile 362: | ||
146 ;*************************************************************************************************************** | 146 ;*************************************************************************************************************** | ||
147 irq12: | 147 irq12: | ||
| − | + | . | |
| − | + | . zum Anschauend des Codes gehe bitte zum [[#Handler-Code|IRQ12-Handler]] in der Rubrik Anwendung | |
| − | + | . | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
234 iret ;und verlasse den Interrupt</pre> | 234 iret ;und verlasse den Interrupt</pre> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre> | </pre> | ||
| Zeile 744: | Zeile 643: | ||
: Programm beenden | : Programm beenden | ||
| − | === IRQ12-Handler | + | === IRQ12-Handler === |
| + | |||
| + | ==== Konzept ==== | ||
Doch wie sieht nun unser Herz der IRQ12-Handler aus? Der Handler wird aufgerufen, sobald Daten in der Maus vorhanden sind, wird der IRQ12 angesprungen, an dem unser Handler gehakt ist. Dieser holt zuerst das vorhandene Byte ab und schaut dann nach, welches Byte im Daten-Paket das nun ist (1,2,3 oder 4). Dieses Nachschauen geschieht, indem der Handler bei jedem erhaltenen Byte einen Counter incrementiert, je nachdem, wie hoch der Counter ist, weiß der Handler welches Byte er momentan abgeholt hat. Ist der Handler dann bei dem Bearbeiten und Interpretieren von Byte 3, prüft dieser per der bei der Aktivierungsequenz gespeicherten MausID, ob ein 4.Byte folgen wird, oder nicht, wenn nicht, setzt er den Byte-Counter auf 0, sodass beim nächsten Erhalten von Daten der IRQ12-Handler das Byte als erstes Byte des Maus-Data-Packets interpretiert. Je nachdem, was für Daten gesendet werden, wird auch die momentan virtuelle x-Position, z-Position(Mausrad), sowie die y-Postion ausgerichtet und in jeweiligen Variablen gespeichert. Hierfür würde das Konzept wie folgt aussehen: | Doch wie sieht nun unser Herz der IRQ12-Handler aus? Der Handler wird aufgerufen, sobald Daten in der Maus vorhanden sind, wird der IRQ12 angesprungen, an dem unser Handler gehakt ist. Dieser holt zuerst das vorhandene Byte ab und schaut dann nach, welches Byte im Daten-Paket das nun ist (1,2,3 oder 4). Dieses Nachschauen geschieht, indem der Handler bei jedem erhaltenen Byte einen Counter incrementiert, je nachdem, wie hoch der Counter ist, weiß der Handler welches Byte er momentan abgeholt hat. Ist der Handler dann bei dem Bearbeiten und Interpretieren von Byte 3, prüft dieser per der bei der Aktivierungsequenz gespeicherten MausID, ob ein 4.Byte folgen wird, oder nicht, wenn nicht, setzt er den Byte-Counter auf 0, sodass beim nächsten Erhalten von Daten der IRQ12-Handler das Byte als erstes Byte des Maus-Data-Packets interpretiert. Je nachdem, was für Daten gesendet werden, wird auch die momentan virtuelle x-Position, z-Position(Mausrad), sowie die y-Postion ausgerichtet und in jeweiligen Variablen gespeichert. Hierfür würde das Konzept wie folgt aussehen: | ||
| Zeile 769: | Zeile 670: | ||
: Beende Handler mit iret | : Beende Handler mit iret | ||
| − | Joa und in Assembler würde das wie folgt aussehen | + | ==== Handler-Code ==== |
| + | |||
| + | Joa und in Assembler würde das wie folgt aussehen: | ||
<pre> | <pre> | ||
| Zeile 789: | Zeile 692: | ||
156 call kb.read.mouse ;Byte #1,#2,#3 oder #4 nach al holen | 156 call kb.read.mouse ;Byte #1,#2,#3 oder #4 nach al holen | ||
157 jnz .end ;wenn dabei was schief ging, beende den irq | 157 jnz .end ;wenn dabei was schief ging, beende den irq | ||
| − | + | 158 | |
| − | + | 159 cmp byte[actualb],0 ;überprüfe, ob der Counter 0 ist (Zähler beginnt mit 0!) | |
| − | + | 160 jne .not_first_byte ;wenn nicht, hole schoneinmal Byte 1 nicht ab und springe somit darüber | |
| − | . | + | 161 |
| + | 162 mov [status],al ;das Byte in Status speichern, damit es die Prozeduren von int33h nutzen können | ||
| + | 163 jmp short .end_part_packet ;beende den Interrupt, da beim nächsten Byte dieser IRQ sowieso nocheinmal aufgerufen wird | ||
| + | 164 | ||
| + | 165 .not_first_byte: | ||
| + | 166 cmp byte[actualb],1 ;teste ob der Counter 1 ist (Zähler beginnt mit 0!) | ||
| + | 167 jne .not_second_byte ;wenn nicht, dann ist es auch nicht das zweite Byte, was wir jetzt holen müssen | ||
| + | 168 | ||
| + | 169 mov [xcoord],al ;ansonsten zwischenspeichere den x-movement | ||
| + | 170 test byte[status],00010000b ;dann teste ob das SignBit von x gesetzt ist, wenn ja, ist das movement negativ | ||
| + | 171 jnz .sign_bit_x ;und springe zu dem Teil, der subtrahiert statt addiert | ||
| + | 172 add [x],ax ;ansonsten addiere zur aktuellen Position die Bewegung -> da ah ja 0 sein muss, wenn der | ||
| + | 173 ;Programmzeiger hierhergekommen ist, ist das möglich | ||
| + | 174 jmp short .sign_x ;und überspringe das Abziehen | ||
| + | 175 .sign_bit_x: | ||
| + | 176 not al ;negiere x-coord, damit der overflow aufgehoben wird, der ensteht, wenn man 0-1 rechnet | ||
| + | 177 inc al ;da aber -1 = FFh was genoted 0 wäre, addiere nocheinmal 1 | ||
| + | 178 sub [x],ax ;und ziehe den Betrag des Movements der aktuellen Position ab -> da ah ja 0 sein muss, wenn | ||
| + | 179 ;der Programmzeiger hierhergekommen ist, ist das möglich | ||
| + | 180 .sign_x: | ||
| + | 181 jmp short .end_part_packet ;beende den Interrupt, da beim nächsten Byte dieser IRQ sowieso nocheinmal aufgerufen wird | ||
| + | 182 | ||
| + | 183 .not_second_byte: | ||
| + | 184 cmp byte[actualb],2 ;teste ob der Byte-Counter 2 ist (Zähler beginnt mit 0!) | ||
| + | 185 jne .not_third_byte ;wenn nicht, dann muss es das 4. Byte sein, was wir abholen müssen also springe dahin | ||
| + | 186 | ||
| + | 187 mov [ycoord],al ;ansonsten zwischenspeichere den y-movement | ||
| + | 188 test byte[status],00100000b ;dann teste ob das SignBit von y gesetzt ist, wenn ja, ist das movement negativ | ||
| + | 189 jnz .sign_bit_y ;und springe zu dem Teil, der subtrahiert statt addiert | ||
| + | 190 add [y],ax ;ansonsten addiere zur aktuellen Position die Bewegung -> da ah ja 0 sein muss, wenn der | ||
| + | 191 ;Programmzeiger hierhergekommen ist, ist das möglich | ||
| + | 192 jmp short .sign_y ;und überspringe das Abziehen | ||
| + | 193 .sign_bit_y: | ||
| + | 194 not al ;negiere y-coord, damit der overflow aufgehoben wird, der ensteht, wenn man 0-1 rechnet | ||
| + | 195 inc al ;da aber -1 = FFh was genoted 0 wäre, addiere nocheinmal 1 | ||
| + | 196 sub [y],ax ;und ziehe den Betrag des Movements der aktuellen Position ab -> da ah ja 0 sein muss, wenn | ||
| + | 197 ;der Programmzeiger hierhergekommen ist, ist das möglich | ||
| + | 198 .sign_y: | ||
| + | 199 | ||
| + | 200 cmp byte[mouseid],0 ;prüfe ob die MouseID 0 ist, falls nicht, werden 4 Bytes gesendet, egal ob mouseid 3 oder 4 ist | ||
| + | 201 jz short .end_packet ;beende nun den Interrupt, code setzt actualb auf 0 und gibt paket aus | ||
| + | 202 jmp short .end_part_packet ;beende den Interrupt, da beim nächsten Byte dieser IRQ sowieso nocheinmal aufgerufen wird | ||
| + | 203 | ||
| + | 204 .not_third_byte: | ||
| + | 205 | ||
| + | 206 mov [zbtn45],al ;sonst speichere es für spätere Benutzung | ||
| + | 207 test al,00000001b ;teste ob überhaupt ein z-movement vorliegt, da es nur 1111b und 0001b gibt und dabei bit1 immer 1 ist | ||
| + | 208 jz .end_packet ;falls kein z-movment vorhanden sit, überspringe das berechnen eines diesen | ||
| + | 209 test al,00000010b ;ansonsten teste, ob es 1111b ist und somit z incrementiert wird, oder es 0001b ist und z dec wird | ||
| + | 210 jnz .z_mov_plus_1 ;wenn 1111b, dann springe zu code, der [z] incrementiert | ||
| + | 211 dec byte[z] ;ansonsten decrementiere [z] | ||
| + | 212 jmp short .end_packet ;überspringe den code, der [z] inkrementieren würde | ||
| + | 213 .z_mov_plus_1: | ||
| + | 214 inc byte[z] ;incrementiere [z] | ||
| + | 215 | ||
| + | 216 .end_packet: | ||
| + | 217 mov byte[actualb],-1;setze Byte-Counter auf -1(da es bei .end_.. um 1 incrementiert wird), da Paketbytes abgeholt worden | ||
| + | 218 call display_mouse ;dies ist eine sehr umfangreiche Prozedur zur Veranschaulichung der Daten | ||
| + | 219 .end_part_packet: | ||
| + | 220 inc byte[actualb] ;incrementiere den Byte counter um 1, damit beim der irq12-handler weiß, welches byte er bearbeitet | ||
| + | 221 | ||
222 .end: | 222 .end: | ||
223 mov al,20h ;schiebe das OCW1/EOI auf al | 223 mov al,20h ;schiebe das OCW1/EOI auf al | ||
| Zeile 865: | Zeile 828: | ||
Das Original dieses Dokuments ist auch [http://maxinator.meugster.net/index2.php?site=http://maxinator.meugster.net/programming/ps2mouse/00600064mouse.html hier] zu finde und stammt von mir. | Das Original dieses Dokuments ist auch [http://maxinator.meugster.net/index2.php?site=http://maxinator.meugster.net/programming/ps2mouse/00600064mouse.html hier] zu finde und stammt von mir. | ||
| − | --[[Benutzer:Maxinator|Maxinator]] 21: | + | --[[Benutzer:Maxinator|Maxinator]] 21:55, 11. Nov 2007 (CET) |