Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 30. January 2006, 18:01
-
Hallo,
ich bin gerade dabei einen seriellen Maustreiber zu schreiben (PS/2 habe ich schon). Das aktivieren der Maus, Bautrate einstellen etc. habe ich schon. Es wird auch der IRQ4(COM1) oder IRQ3(COM2) aufgerufen. Der Code des IRQ muss den Port 3F8h(COM1) oder 2F8h(COM2) einlesen. Das erste ist für die Tasten, das zweite für die XPosition und das dritte für die YPosition. Für jeden wird der IRQ erneut aufgerufen. Das mit den Tasten habe ich auch schon. Wenn bit 16 oder 32 gesetzt ist, wurde die rechte oder linke Taste gedrückt. Aber bei der X und Y Position verstehe ich das nicht. Welche Zahl steht dann da drin? Muss ich die Zahl umwandeln? Ich verstehe das nicht so ganz. Gefunden habe ich leider auch nichts darüber. Vielleicht wisst ihr ja mehr. Danke!!!
bitmaster
-
Bei dem Standardprotokol (Ich glaube das hieß Microsoft Protokol :/ ) wird von der Maus bei jeder änderung ein 3 Byte Code gesendet. Für jedes Byte wird ein IRQ ausgelöst.
Der Aufbau ist folgendermaßen:
Byte1 Byte2 Byte3
1LRYYXX 0xxxxxx 0yyyyyy
L = linke Maustast
R = rechte Maustaste
YYyyyyyy = Bewegung der Y-Achse
XXxxxxxx = Bewegung der X-Achse
-
Bei dem Standardprotokol (Ich glaube das hieß Microsoft Protokol :/ ) wird von der Maus bei jeder änderung ein 3 Byte Code gesendet. Für jedes Byte wird ein IRQ ausgelöst.
Der Aufbau ist folgendermaßen:
Byte1 Byte2 Byte3
1LRYYXX 0xxxxxx 0yyyyyy
L = linke Maustast
R = rechte Maustaste
YYyyyyyy = Bewegung der Y-Achse
XXxxxxxx = Bewegung der X-Achse
Vielen dank. Aber das weiß ich ja schon. Wie sind die Bewegungs Bytes denn aufgebaut? Ich meine woher weiß man ob es nach rechts/links bzw. oben unten geht? Sind nur die ersten 6 Bits belegt?
bitmaster
-
Was ist hiermit (http://lowlevel.brainsware.org/forum/viewtopic.php?t=1018)?!?
Sieht so aus, als ob die Differenz in diesen Bytes steht. Du müsstest also Byte2 zu deiner X-Position und Byte3 zur Y-Position addieren.
-
Ohne mich mit der Maus beschäftigt zu haben, würde ich sagen, du addierst einfach die Bytes und interpretierst die höchstwertige Stelle als Vorzeichen.
-
Du Bildest aus XX und xxxxxx ganz einfach einen sign Byte (-128..127) !
-
Was ist hiermit (http://lowlevel.brainsware.org/forum/viewtopic.php?t=1018)?!?
Sieht so aus, als ob die Differenz in diesen Bytes steht. Du müsstest also Byte2 zu deiner X-Position und Byte3 zur Y-Position addieren.
Das ist aber das PS/2 Protokol! (PS/2 Mouse <> RS-232 Mouse)
Ohne mich mit der Maus beschäftigt zu haben, würde ich sagen, du addierst einfach die Bytes und interpretierst die höchstwertige Stelle als Vorzeichen.
Hää ?.?
Also um es nocheinmal ganz deutlich zu machen:
Die Bytes XX und xxxxxx werden so zusammengesetzt: XXxxxxxx
Bit 76543210
Das selbe gilt für YY mit yyyyyy!
Dieser Wert ist ein sign Byte siehe: http://de.wikipedia.org/wiki/Zweierkomplement
-
Was ist hiermit (http://lowlevel.brainsware.org/forum/viewtopic.php?t=1018)?!?
Sieht so aus, als ob die Differenz in diesen Bytes steht. Du müsstest also Byte2 zu deiner X-Position und Byte3 zur Y-Position addieren.
Das ist aber das PS/2 Protokol! (PS/2 Mouse <> RS-232 Mouse)
Kommt das nicht im Prinzip aufs selbe raus? Also, dass man so oder so die gleichen drei Bytes kriegt?
Ohne mich mit der Maus beschäftigt zu haben, würde ich sagen, du addierst einfach die Bytes und interpretierst die höchstwertige Stelle als Vorzeichen.
Hää ?.?
:shock: Was isn das für ein Satz!? Egal, gemeint war sicher sowas:
int mouse_xpos, mouse_xpos;
void change_pos(int byte0, int byte1, int byte2)
{
mouse_xpos += byte1;
mouse_ypos += byte2;
}
Alle Variablen sind natürlich signed ints!
EDIT: Wo steht dieser Satz?
-
@Osbios: Du scheinst das vor kurtzem gemacht zu haben ;). Danke es funktioniert. Nur ist es genau umgekerht mit dem Vorzeichenbit als bei der PS/2 Maus. Oben/unten und rechts/links sind vertauscht. Aber dazu muss man ja einfach nur das Vorzeichenbit ändern. Also wenn es auf Null ist, zu eins machen und wenn es auf eins ist, zu Null machen. Wie mache ich das am besten? Mir fällt gerade nur die test XX,10000000b variante ein. Gibt es eine bessere, das Bit zu not(ten)?
Danke!!!
-
jopp. :) xor al, 10000000b kehrt das hoechste bit von al um.
[/list]
-
jopp. :) xor al, 10000000b kehrt das hoechste bit von al um.
[/list]
Aua, misst ich hatte noch genau daran gedacht. Aber igendwie kam ich auf die blödsinnige Idde das, dass Bit nicht verändert wird, wenn beide eins sind. Ich war ein bisschen durcheinander.
Danke!!!
-
Ach, ich habe gerade gemerkt das link/rechts gar nicht vertauscht ist sondern nur oben/unten.
bitmaster
EDIT: Und außerdem muss ich nicht das Vorzeichenbit mit xor umdrehen. Es muss so gemacht werden:
not XX
inc XX
Jetzt ist mein Serieller Maustreiber fertig.
Danke an alle.