Maus-Tutorial?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Brueggi

Maus-Tutorial?

Beitrag von Brueggi »

Hallo.

Ich mal wieder :-)
Ich suche einige Tutorials, wie man eigene Maus-Treiber schreibt. Ich google schon wie wild, aber z. B. finde ich keine genaue Beschreibung der PS/2-Funktionen im INT 15h. Nur fertige Codes :-(

Erstmal würd es mir reichen, eine Maus im Textmodus zu betreiben - denn bisher fehlt meinem Betriebssystem eben eine Maus. Das würde mir schon weitere Möglichkeiten bieten. Und vorerst würde eine PS/2-Maus auch reichen. Ach ja.. gibt es diese PS/2-routinen im BIOS erst mit neueren Boards und bei PS/2-Rechner, oder hat sowas eigentlich jeder Rechner mit PS/2-Port (z.B. mein 486) ?
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Maus-Tutorial?

Beitrag von freecrac »

Brueggi hat geschrieben:Hallo.

Ich mal wieder :-)
Ich suche einige Tutorials, wie man eigene Maus-Treiber schreibt. Ich google schon wie wild, aber z. B. finde ich keine genaue Beschreibung der PS/2-Funktionen im INT 15h. Nur fertige Codes :-(

Erstmal würd es mir reichen, eine Maus im Textmodus zu betreiben - denn bisher fehlt meinem Betriebssystem eben eine Maus. Das würde mir schon weitere Möglichkeiten bieten. Und vorerst würde eine PS/2-Maus auch reichen. Ach ja.. gibt es diese PS/2-routinen im BIOS erst mit neueren Boards und bei PS/2-Rechner, oder hat sowas eigentlich jeder Rechner mit PS/2-Port (z.B. mein 486) ?
In meinen Beitrag(vom Do 22. Apr 2010, 18:03) zur PS2-Mouseabfrage über INT 15h benutze ich keinen Treiber, sondern nur den PS2-Mousehandler innerhalb meiner Anwendungen.
http://www.dosforum.de/viewtopic.php?f= ... 163#p15163

Im Quellcode der Cutemouse findet man daneben auch die Möglichkeit damit einen Treiber zu erstellen.
http://cutemouse.sourceforge.net/

Folgende Subroutinen zeigen wie man es in etwa macht um den PS2-Mouse-Handler zu initialisieren:

Code: Alles auswählen

checkPS2:
int 11h		  ; get equipment list
test al, 3
jz noPS2		 ; jump if PS/2-Mouse not indicated
mov  bh,3
mov  ax, 0C205h
int 15h		  ; initialize mouse, bh=datasize
jc noPS2
mov  bh,3
mov  ax, 0C203h
int 15h		  ; set mouse resolution bh
jc noPS2
mov  ax, cs
mov  es, ax
mov  bx, OFFSET PS2dummy
mov  ax, 0C207h
int 15h		   ; mouse, es:bx=ptr to handler
jc noPS2
xor   bx, bx
mov  es, bx	  ; mouse, es:bx=ptr to handler
mov  ax, 0C207h
int 15h
ret

noPS2:
stc
ret

PS2dummy:
retf
;---------------------------------------------------------
enablePS2:
call disablePS2
mov    ax, cs
mov    es, ax
mov    bx, OFFSET IRQhandler
mov    ax, 0C207h	; es:bx=ptr to handler
int 15h
mov	bh,1		; set mouse on
mov     ax, 0C200h
int 15h
ret
;-------------------------------
disablePS2:
xor	bx, bx		; set mouse off
mov	ax, 0C200h
int 15h
xor     bx, bx
mov    es, bx
mov     ax, 0C207h	; es:bx=ptr to handler
int 15h
ret
;---------------------------------------------------------------------------
IRQhandler:
		assume	ds:nothing,es:nothing
cld
push   ds
push   es
pusha
mov    ax, cs
mov    ds, ax
mov    bp,sp
mov    al,[bp+24+6]	; buttons
mov    bl,al
shl	 al,3		     ; CF=Y sign bit
sbb    ch,ch		    ; signed extension 9->16 bit
cbw			          ; extend X sign bit
mov    al,[bp+24+4]	; AX=X movement
mov    cl,[bp+24+2]   ; CX=Y movement
xchg   bx,ax
neg	 cx             ; reverse Y movement
popa
pop	es
pop   ds
retf
Ich "vermute" das alle Bretter mit PS2-Mouseanschluss auch in ihrem Bios den Int 15h und die dortige Funktionen für PS2 mitbringen.
Im anderen Fall gibt es noch die Möglichkeit eine PS2-Mouse über den Tastaturkontroller nur über Portzugriffe zu initialisieren und abzufragen.
Aus Faulheit habe ich das jedoch immer noch nicht selber realisiert, ich habe darüber aber schon eine Diskussion geführt,
die ich im Moment aber auf die Schnelle nicht wiederfinde(grrrrr). Ich werde später weitersuchen.

Angehängt:
So das habe ich jetzt dann auch getan, aber das gesuchte mal wieder nicht gefunden. Dafür aber andere Beiträge (leider wie oft in englisch) u.A von Alexei A. Frounze:
"Here's a source for incomplete PS/2 mouse driver which actually works (A386assembler is required):"
https://groups.google.com/group/comp.la ... PS2+Mouse+
https://groups.google.com/group/comp.la ... 245365fefd
(Auf diese Weise über Ports habe ich es selber aber noch nicht ausprobiert.)

Dirk
Brueggi

Re: Maus-Tutorial?

Beitrag von Brueggi »

Hallo.

Danke für die Antwort :-) Ich habe auch mal einen Beispiel-Code aus dem Internet probiert. Der greift direkt auf die PS/2-Maus über den Tastatur-Controller zu.
Soweit so gut - wäre genau ausreichend für meine Zwecke. Aber... Auf meinem Dell Laptop geht der Treiber, sogar mit dem Touchpad - auf dem 486er (und da muss er eigentlich laufen) schaltet sich irgendwie die Tastatur ab. Der Computer selbst läuft weiter... Ich hab die Stelle auch schon lokalisiert - sobald die Tastatur das Kommando $D4 (was ja signalisiert, das der folgende Befehl für die Maus ist) erhält, schaltet sie sich ab und das wars (die Maus rührt sich auch nicht). Weiss jemand Rat?
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Maus-Tutorial?

Beitrag von DOSferatu »

Ich hab schonmal eine Maus am COM-Port hardwaremäßig abgefragt. Das ist gar nicht so schwer und dabei könnt ich auch helfen (war allerdings sowieso nur als Test gedacht.)
PS/2-Maus (über INT 15h) hab ich noch nicht selbst gemacht.
Für die Maus-Dinge in meinen Programmen gehe ich immer davon aus, daß schon ein Maustreiber an INT 33h geladen ist.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Maus-Tutorial?

Beitrag von freecrac »

Brueggi hat geschrieben:Hallo.

Danke für die Antwort :-) Ich habe auch mal einen Beispiel-Code aus dem Internet probiert. Der greift direkt auf die PS/2-Maus über den Tastatur-Controller zu.
Soweit so gut - wäre genau ausreichend für meine Zwecke. Aber... Auf meinem Dell Laptop geht der Treiber, sogar mit dem Touchpad - auf dem 486er (und da muss er eigentlich laufen) schaltet sich irgendwie die Tastatur ab. Der Computer selbst läuft weiter... Ich hab die Stelle auch schon lokalisiert - sobald die Tastatur das Kommando $D4 (was ja signalisiert, das der folgende Befehl für die Maus ist) erhält, schaltet sie sich ab und das wars (die Maus rührt sich auch nicht). Weiss jemand Rat?
Muss danach die Tastatur nicht wieder mit einem anderen Befehl eingeschaltet werden?

Dirk
Brueggi

Re: Maus-Tutorial?

Beitrag von Brueggi »

Gute Frage. Hab noch Dokument für die Maus-Befehle und Infos über den PS/2-Port gefunden. Da steht nichts davon, das die Tastatur wieder eingeschaltet werden muss. Ach ja, die BIOS-Variante hab ich probiert - sowas kennt der 486 nicht... Offenbar war das zu der Zeit wirklich nur PS/2-Systemem vorbehalten (oder nur bestimmten Herstellern). Ich hab mal den Code etwas variiert und statt $F4 (Enable Packets) den befehl $F2 (GetID) an die Maus geschickt und siehe da - die ID wird geschickt, und die Tastatur läuft weiter... Ich bleib dran. :-)

@DOSferatu: Hast Du da noch irgendwelche Codes? Das wäre auch sehr interessant, da ich so mit einem Treiber COM-Port und PS/2-Port abdecken könnte :-) Ich schreib auch einen entsprechenden (C)-Vermerk mit in die Init-Meldung des Treibers :-)
Antworten