# Maustreiber schreiben



## billgatesm (28. September 2005)

Hallo
Ich versuche seit einiger Zeit einen PS/2 Maustreiber zu schreiben. Für mein eigenes OS, deswegen kann ich keine vorhandenen Treiber nutzen. Ich weis zu diesem Thema gibt es schon ein Forum. Aber daraus wurde ich nicht schlauer. Ich habe schon einen Tastaturtreiber der sich im irq1 befindet (muss). Also an Adresse int 9. Sobald ich eine Taste drücke wird diese Routine im int 9 ausgeführt. Bei der PS/2 Maus ist das ja der irq12. Und das wiederum ist soweit ich weis der int 74h. Aber wenn ich jetzt eine Routine an den int 74h schicke und dann die Maus bewege oder die Tasten der Maus drücke wird diese Routine nicht ausgeführt. Warum? Muss ich vorher die Maus aktivieren? Wenn ja wie? Mache ich bis jetzt alles richtig mit irq12 bzw. int 74h? Könnt Ihr mir weiter helfen?

Danke

Ach ja, alles Real-Mode natürlich


----------



## Dennis Wronka (26. November 2005)

Ich weiss, dass der Thread was aelter ist, aber beim durchgucken ist mir eingefallen, dass ich evtl. was passendes haben koennte.
Ich hab vor langer, langer Zeit mal eine Mouse-Unit fuer Turbo Pascal geschrieben, zum groessten Teil in Assembler. Dort musste ich auch die Mouse erst initialisieren.
Ich poste einfach mal die ganze Unit, vielleicht bringt sie Dir ja was.

```
{$O+,F+,G+}
UNIT Mouse;

INTERFACE
CONST lb= 1;
      rb= 2;
      mb= 4;
PROCEDURE InitMouse;
FUNCTION Button: BYTE;
FUNCTION ButtonPressed(button: BYTE): BOOLEAN;
FUNCTION ButtonReleased(button: BYTE): BOOLEAN;
PROCEDURE ShowMouse;
PROCEDURE HideMouse;
PROCEDURE SetTextPosition(x,y: BYTE);
PROCEDURE GetTextPosition(VAR x,y: BYTE);
PROCEDURE SetTextLimits(xmin,ymin,xmax,ymax: BYTE);
FUNCTION InText(xmin,ymin,xmax,ymax: BYTE): BOOLEAN;
PROCEDURE SetGraphPosition(x,y: WORD);
PROCEDURE GetGraphPosition(VAR x,y: WORD);
PROCEDURE SetGraphLimits(xmin,ymin,xmax,ymax: WORD);
FUNCTION InGraph(xmin,ymin,xmax,ymax: WORD): BOOLEAN;
PROCEDURE SetLightPen(pen: BOOLEAN);

IMPLEMENTATION
VAR shown: BOOLEAN;
PROCEDURE InitMouse; ASSEMBLER;
ASM
 mov ax,0
 int 33h
 mov shown,false
END;

FUNCTION Button: BYTE; ASSEMBLER;
ASM
 mov ax,3
 int 33h
 mov al,bl
END;

FUNCTION ButtonPressed(button: BYTE): BOOLEAN; ASSEMBLER;
ASM
 mov ax,3
 int 33h
 cmp bl,button
 jz @1
 mov al,false
 jmp @2
 @1:
 mov al,true
 @2:
END;

FUNCTION ButtonReleased(button: BYTE): BOOLEAN; ASSEMBLER;
ASM
 mov ax,3
 int 33h
 and bl,button
 jz @1
 mov al,false
 jmp @2
 @1:
 mov al,true
 @2:
END;

PROCEDURE ShowMouse; ASSEMBLER;
ASM
 cmp shown,true
 je @1
 mov ax,1
 int 33h
 mov shown,true
 @1:
END;

PROCEDURE HideMouse; ASSEMBLER;
ASM
 cmp shown,false
 je @1
 mov ax,2
 int 33h
 mov shown,false
 @1:
END;

PROCEDURE SetTextPosition(x,y: BYTE);
BEGIN
 SetGraphPosition((x-1)*8,(y-1)*8);
END;

PROCEDURE GetTextPosition(VAR x,y: BYTE);
VAR gx,gy: WORD;
BEGIN
 GetGraphPosition(gx,gy);
 ASM
  shr gx,3
  add gx,1
  shr gy,3
  add gy,1
  les di,x
  mov ax,gx
  mov es:[di],al
  les di,y
  mov ax,gy
  mov es:[di],al
 END;
END;

PROCEDURE SetTextLimits(xmin,ymin,xmax,ymax: BYTE);
BEGIN
 SetGraphLimits((xmin-1)*8,(ymin-1)*8,(xmax-1)*8,(ymax-1)*8);
END;

FUNCTION InText(xmin,ymin,xmax,ymax: BYTE): BOOLEAN;
VAR x,y: BYTE;
BEGIN
 GetTextPosition(x,y);
 IF (x IN [xmin..xmax]) AND (y IN [ymin..ymax]) THEN InText:=true
 ELSE InText:=false;
END;

PROCEDURE SetGraphPosition(x,y: WORD); ASSEMBLER;
ASM
 mov ax,4
 mov cx,x
 mov dx,y
 int 33h
END;

PROCEDURE GetGraphPosition(VAR x,y: WORD); ASSEMBLER;
ASM
 mov ax,3
 int 33h
 les di,x
 mov es:[di],cx
 les di,y
 mov es:[di],dx
END;

PROCEDURE SetGraphLimits(xmin,ymin,xmax,ymax: WORD);
BEGIN
 IF (xmax>xmin) THEN ASM
                      mov ax,7
                      mov cx,xmin
                      mov dx,xmax
                      int 33h
                     END;
 IF (ymax>ymin) THEN ASM
                      mov ax,8
                      mov cx,ymin
                      mov dx,ymax
                      int 33h
                     END;
END;

FUNCTION InGraph(xmin,ymin,xmax,ymax: WORD): BOOLEAN;
VAR x,y: WORD;
BEGIN
 GetGraphPosition(x,y);
 IF (x IN [xmin..xmax]) AND (y IN [ymin..ymax]) THEN InGraph:=true
 ELSE InGraph:=false;
END;

PROCEDURE SetLightPen(pen: BOOLEAN); ASSEMBLER;
ASM
 cmp pen,true
 jz @1
 cmp pen,false
 jz @2
 @1:
 mov ax,13
 int 33h
 jmp @3
 @2:
 mov ax,14
 int 33h
 jmp @3
 @3:
END;
END.
```


----------

