PS/2-Maus — Änderungen 2241 → 2242

Zeile 353: Zeile 353:
 
| ''Byte 3'' || colspan=8 | Y Movement seit dem letztem Daten-Paket
 
| ''Byte 3'' || colspan=8 | Y Movement seit dem letztem Daten-Paket
 
|}
 
|}
 +
 +
Die Overflow-Bits geben an, ob die Maus auf der jeweiligen Achse zu schnell bewegt wurden. Die Sign-Bits geben an, ob die jeweiligen Movements negativ sind. Und die Button-Bits geben an, ob die jeweilige Taste gedrückt ist. Der Beispiel-Code, der das Daten-Paket der Maus abholt ist beim Code für den [[#Handler-Code|IRQ12-Handler]] in der Rubrik Anwendung zu finden.
  
 
<pre>
 
<pre>
−
   141 ;***************************************************************************************************************
+
   147 irq12-handler:
−
  142 ;dies ist der IRQ12, der immer angesprungen wird, wenn sich die Daten der Maus verändert habe (sofern der Stream-Mode benutzt wird)
+
  . zum Anschauend des Codes gehe bitte zum IRQ12-Handler in der Rubrik Anwendung (Link in Text oben)
−
  143 ;da der IRQ12 immer nur aufgerufen wird, wenn ein Byte im Mouse-Buffer liegt, holen wie auch immer nur ein Byte ab, zählen jedoch mit,
+
  .
−
  144 ;welches Byte des Mouse-data-packets das ist. Unter VirtualBox ging es zwar auch, wenn man alle 3 Byte hintereinander beim Aufrufen
 
−
  145 ;abgeholt hat, doch bei meinem alten PC kam es dabei zu disinformation, sodass ich das so ändern musste.
 
−
  146 ;***************************************************************************************************************
 
−
  147 irq12:
 
 
   .
 
   .
−
  . zum Anschauend des Codes gehe bitte zum <wiki>[[#Handler-Code|IRQ12-Handler]]</wiki> in der Rubrik Anwendung
 
 
   .
 
   .
−
   234     iret           ;und verlasse den Interrupt</pre>
+
   286 .read.mouse:
 +
  287     push cx            ;cx sichern
 +
  288    mov cx,0FFFFh      ;auf cx die Höchstmögliche Zahl schieben, damit getmb nicht alles aufhält, nur da es auf ein Byte wartet
 +
  289    .waitforbytes:      ;und da loop zuerst dekremntiert und dann vergleicht, obs 0 ist, ist 0 die höchste Zahl für cx
 +
  290        in al,64h          ;nach al das Statusregister vom Keyboard-Contoller holen
 +
  291        test al,20h        ;und schauen, ob Bit5 gesetzt ist, ob im Mouse-Output-Buffer Daten warten
 +
  292        jnz .byte_ready    ;wenn ja, dann springe aus dem loop heruas
 +
  293    loop .waitforbytes  ;ansonsten führe loop-schleife fort, spätestens bis cx 0 ist
 +
  294        pop cx              ;stelle cx wieder her
 +
  295        mov ah,1            ;zeroflag löschen, indem 1 auf ah gemoved wird, damit dies dem anwender gegeben werden kann
 +
  296        or ah,ah           ;und setze ggf. das zeroflag, damit der user gleich danach jz o.ä. schreiben kann
 +
  297        ret                ;und springe zum Aufrufsort zurück
 +
  298    .byte_ready:        ;wenn IP hier ist, dann wartet ein Byte darauf abgeholt zu werden
 +
  299    in al,60h          ;jetzt holen wir vom Mouse-Output-Buffer das lang ersehnte Byte :)
 +
  300    pop cx              ;und cx wiederherstellen
 +
  301    xor ah,ah          ;und lösche ah, da bei fehler auf ah der errorcode ist; setze ggf. zeroflag (macht xor...)
 +
  302    ret                ;zum Abschluss springen wir zum Aufrufsort zurück; das Byte liegt dabei in al und ZF zeigt Erfolg bei 1 an
 +
  303 ;************************* wartet eine Weile ob Daten kommen und speichert diese ggf. in al ab *************************
 
</pre>
 
</pre>
  
Zeile 828: Zeile 842:
 
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:57, 11. Nov 2007 (CET)
+
--[[Benutzer:Maxinator|Maxinator]] 22:02, 11. Nov 2007 (CET)