Autor Thema: Maustreiber schreiben.  (Gelesen 16424 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #20 am: 23. October 2005, 15:15 »
Also ich habe jetzt die maus so aktiviert:

;gebe IRQ12 also int 74h eine Adresse
;für einen Code der eine Meldung ausgibt
;und mit iret zurückspringt
call InitMouse ;rufe die Funktion auf
;beende

InitMouse proc near
call CheckPS2
mov al,0A8h
out 64h,al
call CheckPS2
mov al,0D4h
out 64h,al
call CheckPS2
mov al,0F4h
out 60h,al
call CheckPS2
ret
InitMouse endp

CheckPS2 proc near

mov dx,0FFFFh
next:
in al,64h
and al,03h
jz done
or dx,dx
jz done
in al,60h
dec dx
jmp next
done:
ret
CheckPS2 endp


Also ich übergebe dem IRQ12 (int 74h) die Adresse meines Codes der  folgenes macht:

Alle Register auf den Stack schreibt. Dann das ds zum cs macht und eine Meldung ausgiebt. Nun den EOI (end of interrupt) mit folgendem Code sendet:

mov al,20h
out 0A0h,al
out 20h,al


jetzt holt er alle Register vom Stack und springt mit iret zurück.

Dann aktiviere ich die Maus mit dem Code den ich gepostet habe und ende. Wenn ich jetzt unter einem Real-Mode OS (z.B. DOS oder meins) die Schose laufen lasse passiert erstmal nicht solange bis das Programm endet. Dann mache ich nicht und er gibt die meldung aus die er eigentlich erst ausgeben soll wenn ich etwas mit der Maus mache sie z.B. bewege. Und nun bleibt das OS hängen. Das verstehe ich nicht. Er führt also den IRQ12 aus und tut dann garnichts mehr. Warum? Normalerweise sollte er mir immer die Meldung ausgeben (also den IRQ12 ausführen) wenn ich die Maus bewege und drücke. Das soll  nämlich nur ein Test sein ob er auch den IRQ12 ausführt wenn ich es will. Später könnte ich dann ja immer noch den Code für die Meldung mit dem richtigen Code für die Maus (Daten lesen etc.) ersetzten. Aber wie ich sehe funktioniert nicht einmal dies. Könnt Ihr mir weiterhelfen?

Danke!!!
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #21 am: 24. October 2005, 22:35 »
Hat keiner von euch ne Ahnung? Dann poste ich mal meinen Code:

mouse.asm => mouse.filexor ah,ah
mov si,offset filename
int 60h
mov ah,05h
mov si,offset filename
mov bx,1000h
mov dx,2000h
int 60h
mov ax,2000h
mov ds,ax
mov es,ax
push 2000h
push 1000h
retf

filename db "mouse.sys",00h


mouse2.asm -> mouse.sys
org 1000h
xor ah,ah
mov si,offset msg
int 60h
mov ax,2174h
mov dx,cs
mov bx,offset MouseOffset
int 60h
call InitMouse
mov ah,04h
int 60h

InitMouse proc near
call CheckPS2
mov al,0A8h
out 64h,al
call CheckPS2
mov al,0D4h
out 64h,al
call CheckPS2
mov al,0F4h
out 60h,al
call CheckPS2
ret
InitMouse endp

CheckPS2 proc near

mov dx,0FFFFh
next:
in al,64h
and al,03h
jz done
or dx,dx
jz done
in al,60h
dec dx
jmp next
done:
ret
CheckPS2 endp

MouseOffset:
push ax
push si
push ds
mov ax,cs
mov ds,ax
xor ah,ah
mov si,offset msg
int 60h
mov al,20h
out 0A0h,al
out 20h,al
pop ds
pop si
pop ax
iret

msg db 0Dh,0Ah,"mouse",00h
Warum funst der Code nicht? Er soll bei jeder bewegung der Mouse die Meldung mouse ausgeben. Hilfe!!!

Danke!!!
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #22 am: 25. October 2005, 20:14 »
Also ich verstehe das nicht. Einige von euch haben doch ein OS mit Mausfunktion. Kann mir nicht jemand Helfen. Mein OS ist bereit für die Beta-Version abgesehen von dem Maustreiber. Ich würde meine Beta-Version gerne fertig bekommen aber mit Maustreiber. Kann denn keiner von euch mir helfen? Folgendes Dokument habe ich auf meiner Festplatte: http://www.prakinf.tu-ilmenau.de/~albrecht/alfred/f0157.htm Dort wird gesagt wenn ich A8h an den Port 64h sende wird die Zusatzeinheit (das müsste die Maus sein) aktiviert. Aber ich verstehe immer noch nicht wie ich die Maus dazu bringe den IRQ12 (int 74h) anzuspringen wenn ich sie gebrauche. Könnt ihr mir nicht helfen?

Danke!!!
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #23 am: 25. October 2005, 20:43 »
Ich habs ich habs ich haaaaabs. Es funst. Jetzt ruft er entlich den IRQ12 auf wenn ich die maus benutze. Ich hatte vergessen (und wusste nicht das ich das muss) in al,60h in der IRQ12 Routine zu schreiben. Erst dann kann er weiter machen. Ich bin so froh. Aber ich bin ja noch nicht am Ziel. Jetzt muss ich noch die meldung im IRQ12 mit den richtigen Funktionen ersetzten. Woher weis ich wann die linke/rechte/das Rad gedrückt wurde und die maus in welcher Richtung?

Danke!!!

PS: Ich bin so froh ;-)
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 25. October 2005, 21:18 »
hi,
wenn der IRQ12 aufgerufen wird, dann musst du mittels IN 3 mal ein Byte vom Port einlesen.
Das erste Byte enthält Informationen über die Maustasten (Bit 1 = linke Maustaste, Bit 2 = rechte, Bit 3 = mittlere, glaub ich, notfalls durch ausprobieren rauskriegen :), wenn Bit gesetzt, dann ist die Maustaste gedrückt )
Das zweite Byte gibt als signed int 8 die Veränderung auf der X-Achse
und das dritte die veränderung auf der y-Achse an.

(hab vor paar minuten selbst erst meinen Maustreiber vollendet :D)

mfg,
Stefan2005

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #25 am: 25. October 2005, 22:17 »
Zitat von: stefan2005
(hab vor paar minuten selbst erst meinen Maustreiber vollendet :D)
Das ist ja cool. Vielen dank ich werde das morgen ausprobieren, weil ich jetzt schlafen gehe.

PS: nochmals vielen dank
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #26 am: 26. October 2005, 07:30 »
Habe herrausgefunden das mein Programm nicht auf allen PCs funktioniert. Ich weis aber nicht warum. Ich habe gelesen das es im Kontroller-Register 2 Bits gibt die dafür zuständig sind IRQs aufzurufen. Meine Fragen sind: Sind die vielleicht bei der Maus nicht bei allen PCs standartmäßig gesetzt? Und wie setze ich diese? Folgendes habe ich nämlich im Internet gefunden:

Kontroll-Register:

- XLAT _EN2 _EN - SYS INT2 INT


INT
bei neuen Daten von der Tastatur wird Interrupt 1 ausgelöst
INT2
bei neuen Daten von der Maus wird Interrupt 12 ausgelöst


Schonmal danke!!!
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #27 am: 26. October 2005, 20:44 »
Also irgendwie funst die Schose nicht so richtig. Beim VMware läufts ganz gut, unter Bochs gar nicht, 1. PC läuft auch nicht und beim 2. PC läuft es aber nicht so wie bei vmware. Das heißt unter VMware läufts noch am besten. Aber was mache ich falsch? Hier mein Code:


call CheckPS2
;hiermit aktiviere ich die Maus, fehlt da was?
;dies befindet sich außerhalb der IRQ12 Routine
;wird also nur einmal aufgerufen, ist das richtig?
mov al,0A8h
out 64h,al
call CheckPS2
mov al,0D4h
out 64h,al
call CheckPS2
mov al,0F4h
out 60h,al
call CheckPS2
;ende
CheckPS2:
mov dx,0FFFFh
next:
in al,64h
and al,03h
jz done
or dx,dx
jz done
in al,60h
dec dx
jmp next
done:
ret
;folgender Code ist in der IRQ12 Routine
push ax ;Register sichern
push si
push ds
push es
mov ax,cs ;für meldung muss ds gleich cs sein
mov ds,ax
mov es,ax
in al,64h
test al,20h
jz exit ;wenn nicht für Maus dann ende
in al,60h
test al,00000001b ;linke taste gedrückt?
jz nicht_linke
xor ah,ah
mov si,offset linke
int 60h ;dies gibt einfach nur die meldung linke aus (int 60h von mein os)
jmp weiter
nicht_linke:
test al,00000010b ;rechte taste gedrückt?
jz nicht_rechte
xor ah,ah
mov si,offset rechte ;meldung rechte
int 60h
jmp weiter
nicht_rechte:
test al,00000100b ;mittlere taste gedrückt?
jz weiter
xor ah,ah
mov si,offset mitte ;meldung mitte
int 60h
weiter: ;der rest x und y bewegung der maus, für später
in al,60h
in al,60h
;
xor ah,ah
mov si,offset msg ;eine meldung ausgeben, wenn nur diese
int 60h ;ausgegeben wird dann wurde keine taste gedrückt
;
exit:
mov al,20h ;sende EOI (end of interrupt)
out 0A0h,al ;schalte slave frei
out 20h,al ;schalte master frei
pop es
pop ds
pop si
pop ax
iret ;zurück


Der Code soll folgendes bewirken. Er soll die PS/2-Maus aktivieren (nur einmal also außerhalb von der IRQ12-Routine). In der Routine soll er prüfen welche taste gedrückt wurde und dann die jeweilige Meldung ausgeben + msg-Meldung. Wenn keine Taste gedrückt wurde dann soll er nur die msg-Meldung ausgeben. Die letzten beiden Parameter für x und y Achse (Verschiebung der maus) werden erst einmal nicht berücksichtigt. Zum Schluss der EOI und zurück. Der Code soll einfach nur ausgeben welche Taste gedrückt wurde (stört euch nicht an den int 60h das ist einfach der int von meinem os und ah = Null bedeutet Meldung ausgeben. Das alles funktioniert unter VMware genau so. Aber und Bochs funst nichts und unter einem PC von mir auch nicht. Der andere PC funktioniert damit fast er gibt nur beim verschieben auch die Meldungen für recht, links, mittel aus obwohl ich keine Taste drücke. Was ist an diesem Code falsch? Ist das aktivieren der Maus richtig? Was muss ich ändern?

Danke!!!

PS: stefan2005 du sagtest du hast deinen Maustreiber fertig könntest du mir vielleicht sagen wie du die Maus aktiviert hast und was du im IRQ12 stehen hast? Danke!!!
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 27. October 2005, 16:39 »
hi,
klar, ist jedoch Delphi Code, sollte aber leicht zu verstehen sein, da viel Assembler drin vorkommt.


procedure InitMouse;
var InByte : Byte;
begin
  kbCmd($A8);
  kbRead;
  kbCmd($20);
  InByte := kbRead OR $3;
  kbCmd($60);
  If Inb($E9) = $E9 then kbWrite(InByte);   // Für Bochs
  kbCmd($D4);
  kbWrite($F4);
  kbRead;
end;

procedure kbWrite(Cmd: Byte);
asm
  @Init:
    pushad
    mov dl,al
    mov ecx,$ffff

  @kw_loop1:
    in al,$64
    test al,$20
    jz @kw_ok1
    loop @kw_loop1
    mov ah,1
    jmp @kw_exit
  @kw_ok1:
    in al,$60
    mov ecx,$ffff
  @kw_loop:
    in al,$64
    test al,2
    jz @kw_ok
    loop @kw_loop
    mov ah,1
    jmp @kw_exit
  @kw_ok:
    mov al,dl
    out $60,al
    mov ecx,$ffff
  @kw_loop3:
    in  al,$64
    test al,2
    jz  @kw_ok3
    loop @kw_loop3
    mov ah,1
    jmp @kw_exit
  @kw_ok3:
    mov ah,8
  @kw_loop4:
    mov ecx,$ffff
  @kw_loop5:
    in al,$64
    test al,1
    jnz @kw_ok4
    loop @kw_loop5
    dec ah
    jnz @kw_loop4
  @kw_ok4:
    xor ah,ah
  @kw_exit:
    popad
end;

function kbRead: Byte;
asm
  @Init:
    push ecx
    push edx
    mov ecx,$ffff
  @kr_loop:
    in al,$64
    test al,1
    jnz @kr_ready
    loop @kr_loop
    mov ah,1
    jmp @kr_exit
  @kr_ready:
    push ecx
    mov ecx,32
  @kr_delay:
    loop @kr_delay
    pop ecx
    in al,$60
    xor ah,ah
  @kr_exit:
    pop edx
    pop ecx
end;

procedure kbCmd(Cmd: Byte);
asm
  @Init:
    mov ecx,$ffff
    push eax
  @c_wait:
    in al,$64
    test al,2
    jz @c_send
    loop @c_wait
    jmp @c_error
  @c_send:
    pop eax
    out $64,al
    mov ecx,$ffff
  @c_accept:
    in al,$64
    test al,2
    jz @c_ok
    loop @c_accept
  @c_error:
    mov ah,1
    jmp @c_exit
  @c_ok:
    xor ah,ah
  @c_exit:
end;

procedure IRQ12_ASM; assembler;
asm
  pushad
  call IRQ12
  popad
  iretd
end;



mfg,
stefan

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #29 am: 27. October 2005, 17:09 »
Habe ich gerade unter Bochs und VMware getestet. Dort funktioniert es. Auch wenn ich den Code nicht ganz verstehe. Werde gleich mal meine PCs testen. Aber der Code kommt mir so bekannt vor. Der hat ziemlich viel änlichkeit mit folgendem Code:

kb_read:

        push    ecx edx

        mov     ecx,0xffff
      kr_loop:
        in      al,0x64
        test    al,1
        jnz     kr_ready
        loop    kr_loop
        mov     ah,1
        jmp     kr_exit
      kr_ready:
        push    ecx
        mov     ecx,32
      kr_delay:
        loop    kr_delay
        pop     ecx
        in      al,0x60
        xor     ah,ah
      kr_exit:

        pop     edx ecx

        ret


kb_write:

        push    ecx edx

        mov     dl,al
        mov     ecx,0xffff
      kw_loop1:
        in      al,0x64
        test    al,0x20
        jz      kw_ok1
        loop    kw_loop1
        mov     ah,1
        jmp     kw_exit
      kw_ok1:
        in      al,0x60
        mov     ecx,0xffff
      kw_loop:
        in      al,0x64
        test    al,2
        jz      kw_ok
        loop    kw_loop
        mov     ah,1
        jmp     kw_exit
      kw_ok:
        mov     al,dl
        out     0x60,al
        mov     ecx,0xffff
      kw_loop3:
        in      al,0x64
        test    al,2
        jz      kw_ok3
        loop    kw_loop3
        mov     ah,1
        jmp     kw_exit
      kw_ok3:
        mov     ah,8
      kw_loop4:
        mov     ecx,0xffff
      kw_loop5:
        in      al,0x64
        test    al,1
        jnz     kw_ok4
        loop    kw_loop5
        dec     ah
        jnz     kw_loop4
      kw_ok4:
        xor     ah,ah
      kw_exit:

        pop     edx ecx

        ret


kb_cmd:

        mov     ecx,0xffff
      c_wait:
        in      al,0x64
        test    al,2
        jz      c_send
        loop    c_wait
        jmp     c_error
      c_send:
        mov     al,bl
        out     0x64,al
        mov     ecx,0xffff
      c_accept:
        in      al,0x64
        test    al,2
        jz      c_ok
        loop    c_accept
      c_error:
        mov     ah,1
        jmp     c_exit
      c_ok:
        xor     ah,ah
      c_exit:
        ret


setmouse:  ; set mousepicture -pointer
           ; ps2 mouse enable

     mov     [0xf200],dword mousepointer

     cli
     mov     bl,0xa8                 ; enable mouse cmd
     call    kb_cmd
     call    kb_read                 ; read status

     mov     bl,0x20                 ; get command byte
     call    kb_cmd
     call    kb_read
     or      al,3                    ; enable interrupt
     mov     bl,0x60                 ; write command
     push    eax
     call    kb_cmd
     pop     eax
     call    kb_write

     mov     bl,0xd4                 ; for mouse
     call    kb_cmd
     mov     al,0xf4                 ; enable mouse device
     call    kb_write
     call    kb_read           ; read status return


Was soll die Zeile in der "für Bochs" steht bedeuten? Brauch Bochs eine extra Einladung?
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 27. October 2005, 18:42 »
hi,
in der Tat, ich hab mir das initialisieren der Maus ein wenig einfacher gemacht  :)

das für Bochs heißt, dass diese zeile nur ausgeführt wird, wenn das OS auf Bochs läuft -> bei meiner Bochs Version würde es ohne dieser zeile nicht laufen. Mit dieser Zeile würde es zwar in Bochs laufen, aber nicht mehr auf nem echten PC  :D

mfg,
stefan2005

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #31 am: 27. October 2005, 19:53 »
Also bei mir läuft es überall ohne diese Zeile, auch in Bochs. Ist Bochs 2.2.1, wie das bei anderen Versionen ist weis ich nicht. Aber ich lasse diese Zeile weck. Vielen dank noch. Ach ja wenn ich die drei in al,60h in der IRQ12 Routine laufen lasse muss ich etwas berücksichtigen? Vielleicht vorher irgendwie prüfen ob die Daten überhaupt schon da sind?

Danke!!!
In the Future everyone will need OS-64!!!

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 27. October 2005, 21:33 »
Ich kenn mich jetzt nich so mit der Maus aus, aber ich denke nicht, das du noch Abfragen musst, ob die Daten da sind, da der IRQ ja nur aufgerufen werden sollte, wenn welche da sind.

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 27. October 2005, 21:49 »
hi,
ja, wenn das erste Bit im Port $64 (KEYBOARD CONTROL) gesetzt ist, dann kann man vom port $60 das Byte einlesen.

mfg,
stefan

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #34 am: 27. October 2005, 21:55 »
Zitat von: SSJ7Gohan
Ich kenn mich jetzt nich so mit der Maus aus, aber ich denke nicht, das du noch Abfragen musst, ob die Daten da sind, da der IRQ ja nur aufgerufen werden sollte, wenn welche da sind.
Ja, aber ich meine wenn ich mit in al,60h den ersten Parameter lade und da die CPU viel schneller ist als die Peripherie ob direkt schon der zweite da ist oder ob ich erst warten (prüfen) muss bis er da ist und diesen dann laden und danach den letzten.
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #35 am: 27. October 2005, 21:56 »
Zitat von: stefan2005
hi,
ja, wenn das erste Bit im Port $64 (KEYBOARD CONTROL) gesetzt ist, dann kann man vom port $60 das Byte einlesen.

mfg,
stefan
OK.

Danke!!!

PS: Melde mich bald wieder. ;-)
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #36 am: 28. October 2005, 23:42 »
So da bin ich wieder. Ich habe den Code zum aktivieren der PS/2-Maus noch etwas optimiert und in meinem OS integriert. Alles funktioniert wunderbar. Der erste Parameter der Maus gibt ja an welche Taste gedrückt oder nicht gedrückt wurde. Das funktioniert auch wunderbar. Jetzt habe ich aber eine Frage wie das mit dem zweiten und dritten Parameter funktioniert. Die sollen ja die Bewegung der Maus beinhalten (zweiter = x-Achse und dritter = y-Achse). Aber was genau beinhalten sie dann? Die zahlen gehen doch von -128 bis +128 oder? Ich habe mir die mal ausgeben lassen. Wenn ich die Maus ein ganz kleines Stück nach rechts bewege bekommt der zweite Parameter eine 1 und der dritte eine Null. Wenn ich die Maus ein ganz kleines Stück nach links bewege bekommt der zweite Parameter eine 255 (das müssten dann eine -1 sein oder?) und der dritte eine Null. Aber was sagt die 1 mir dann? Muss ich diese an meinen Video-Modus anpassen? Wie mache ich das am besten?

Danke!!!
In the Future everyone will need OS-64!!!

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 29. October 2005, 13:10 »
Die beiden Parameter geben wohl an, wie weit/schnell die Maus bewegt wurde (und natürlich auch die Richtung). Du könntest erstmal die Werte direkt zu deiner Mauszeiger-Position addieren oder von ihr subtrahieren. Dann sollte man den Mauszeiger schon richtig bewegen können. Später kann man dann ja noch die Geschwindigkeit anpassen.

 

Einloggen