Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

berechnen der Skalierung und Resolution einer PS2 Maus im Textmodus

3 views
Skip to first unread message

Jens Kallup

unread,
Sep 23, 2017, 1:53:37 PM9/23/17
to
Hallo,

wie der Titel schon sagt: Wie kann man ...

Jens

Bernhard Schornak

unread,
Sep 27, 2017, 4:06:39 PM9/27/17
to
Hallo!


Diese Seite

http://www.computer-engineering.org/ps2mouse/

Sektion "Inputs, Resolution and Scaling" gibt erschöpfend Auskunft
zu Deinen Fragen. Dieses GIThub-Projekt bietet Code für PS/2-Mäuse

https://github.com/tatimmer/tatOS/tree/master/boot

("mouse.s" und "ps2mouseinit.s").

Warum PS/2, das auf aktuellen Boards bestenfalls emuliert wird? In
fünf Jahren dürfte es keine entsprechende Hardware mehr geben, auf
der Dein Code noch laufen könnte. USB hat seit langem die serielle
Schnittstelle, respektive PS/2, als Standard für Tastatur und Maus
abgelöst. Es ist wenig sinnvoll, für veraltete Hardware, die nicht
mehr produziert wird, Treiber zu schreiben - wesentlich sinnvoller
wäre es, sich mit USB auseinanderzusetzen, da das der einzige noch
existierende Standard ist, der für absehbare Zukunft weiterhin ge-
pflegt, verbessert und erweitert werden wird.


Grüsse aus Augsburg

Bernhard Schornak

Jens Kallup

unread,
Sep 28, 2017, 3:30:47 PM9/28/17
to
Hallo Bernhard,

irgendwie was vergessen?

Gruß
Jens

; in C source:
;
; initPS2();
; for (;;) {
; mouse_handler();
; }
;
; the result of the code:
; http://i.imgur.com/0eYXPYf.png

section .data

MOUSEX: dw 0
MOUSEY: dw 0
mousepacket: db 0

section .text

keyboard_status:
in al, 0x64
and eax, 0xff
ret

wait_write:
push ecx
mov ecx, 0xa0000
.1:
in al, 0x64
test al, 10b
jz .2
dec ecx
jnz .1
.2:
pop ecx
ret

wait_read:
push ecx
mov ecx, 0xa0000
.1:
in al, 0x64
test al, 1
jnz .2
dec ecx
jnz .1
.2:
pop ecx
ret

global _initPS2
_initPS2:
call keyboard_status
call wait_write

mov al, 0xae
out 0x64, al
call wait_read
in al, 0x64
and eax, 0xff

call keyboard_status
call wait_write

mov al, 0xfa
out 0x60, al
call wait_read
in al, 0x60
and eax, 0xff

call keyboard_status
call wait_write

mov al, 0xee
out 0x60, al
call wait_read
in al, 0x60
and eax, 0xff

call keyboard_status
.srate: call wait_write

mov al, 0xf3
out 0x60, al
call wait_read
in al, 0x60
and eax, 0xff

call wait_write
mov al, 00100000b
out 0x60, al
call wait_read
in al, 0x60
and eax, 0xff

cmp al, 0xfe
jz .srate

call keyboard_status

init_mouse:
call wait_write
call mouse_pause

mov al, 0xa8
out 0x64, al

.mousereset:
mov bl, 0xff
call sendack
jnz near .ps2mouse_error
and eax, 0xff

call wait_read
call mouse_pause

in al, 0x60
and eax, 0xff

call wait_read
call mouse_pause

in al, 0x60
and eax, 0xff

mov bl, 0xf3
call sendack
and eax, 0xff

mov bl, 0xc8
call sendack

mov bl, 0xf3
call sendack

mov bl, 0x64
call sendack

mov bl, 0xf3
call sendack

mov bl, 0x50
call sendack

mov bl, 0xf2
call sendack

call wait_read
call mouse_pause

mov ecx, 1000
.check_id:
in al, 0x60
and eax, 0xff
cmp al, 0x03
jz near .savemouse_id
loop .check_id

.savemouse_id:
mov [0x54c], al

.1: call wait_write
call mouse_pause

mov al, 0x20
out 0x64, al

call wait_read
call mouse_pause

in al, 0x60
or al, 2
mov bl, al

call wait_write
call mouse_pause

mov al, 0x60
out 0x64, al

call wait_write
call mouse_pause

mov al, bl
out 0x60, al

mov bl, 0xf6
call sendack

mov bl, 0xf4
call sendack

jmp .ps2done

.ps2mouse_error:
.ps2done:
mov [MOUSEX], dword 750
mov [MOUSEY], dword 550
ret

sendack:
mov ecx, 10
.1:
call wait_write
mov al, 0xd4
out 0x64, al

call wait_write
mov al, bl
out 0x60, al

call wait_read
call mouse_pause

in al, 0x60
cmp al, 0xfa
jz .done
loop .1

or byte [0x54d], 100b
.done:
ret

mouse_pause:
push ecx
mov ecx, 0xa0000
.1: loop .1
pop ecx
ret

global _mouse_handler
_mouse_handler:
;cli
pushad

call wait_read
in al, 0x60

cmp byte [mousepacket], 0
jnz .1
inc byte [mousepacket]
mov [0x550], al
jmp .eoi

.1:
cmp byte [mousepacket], 1
jnz .2
inc byte [mousepacket]
mov [0x551], al
jmp .eoi

.2:
cmp byte [mousepacket], 2
jnz .3
inc byte [mousepacket]
mov [0x552], al
jmp .eoi

.3:
mov byte [mousepacket], 0
mov [0x553], al

.eoi:
mov al, 0x20
out 0xa0, al
out 0x20, al

popad
;sti
ret

Bernhard Schornak

unread,
Sep 28, 2017, 5:50:34 PM9/28/17
to
Jens Kallup schrieb:


> Hallo Bernhard,


Hallo Jens!


> irgendwie was vergessen?


Nicht dass ich wüsste. Hilf mir auf die Sprünge... ;)


> ; in C source:
> ;
> ; initPS2();
> ; for (;;) {
> ; mouse_handler();
> ; }
> ;
> ; the result of the code:
> ; http://i.imgur.com/0eYXPYf.png


Jo. Um zu wissen, was den Fehler in Zeile 187 auslöst, müsste man die
Textdatei mouse.asm im Editor sehen... Häng das Teil bitte an, da ich
nicht weiss, ob Zeile eins im Posting auch Zeile eins in der Quellda-
tei ist.

"Relocation" verwendet der Compiler, wenn Funktionen einer DLL in den
aktuellen Quellcode eingebunden werden müssen. Scheinbar wurde in den
bemängelten Zeilen versucht, ein ungültiges Offset zu CS:IP zu laden.

Ich habe seit 2009 nur noch Windows 7 am Laufen (Win 10 werde ich mir
nicht antun). Von daher ist es schwer, Deinen Code zu testen, solange
es keine Versionen gibt, die man auf CD, DVD oder USB-Stick schreiben
kann. Mit virtuellen Maschinen stehe ich auf Kriegsfuss - sonst würde
bei mir weiterhin OS/2 als Arbeitssystem laufen.

Das "QEMU"-Fenster mit dem bayerischen Folkloremuster ist die Ausgabe
des Maustreibers?

Ein Tipp meinerseits: Ich habe Assemblerprogrammierung gelernt, indem
ich C-Dateien mit der GCC-Option "-s" in Assemblerdateien umgewandelt
habe. Der Compiler setzt den Quellcode in korrekten Assemblercode um,
den man dann den Bedürftnissen entsprechend verändern oder verbessern
kann (Compiler erzeugen teilweise schreckliche Konstrukte...).

Jens Kallup

unread,
Sep 29, 2017, 5:34:52 AM9/29/17
to
Sodele,

der Code wird ausgeführt, nachdem das System paar
Optionen des BIOS gesetzt bzw. ausgelesen hat und
an die Bootroutine übergibt, die den Screen mit
den gepunkteten Muster anzeigt.

Wenn ich die Sachen mit cli/sti/iret mit reinnehme,
dann wird ständig gebootet.

Mit DLL und Windows hat das erstmal nichts zu tun.
Es soll erstmal soweit funktionieren, das man
kurz nach dem Boot eine Maus und Tastatur bedienen
kann ...
Als Mauszeiger wollte ich ein farblich gekennzeichnetes
Char nehmen.

Gruß, Jens
mouse.asm

Bernhard Schornak

unread,
Sep 29, 2017, 10:29:03 AM9/29/17
to
Jens Kallup schrieb:


> Sodele,
>
> der Code wird ausgeführt, nachdem das System paar
> Optionen des BIOS gesetzt bzw. ausgelesen hat und
> an die Bootroutine übergibt, die den Screen mit
> den gepunkteten Muster anzeigt.
>
> Wenn ich die Sachen mit cli/sti/iret mit reinnehme,
> dann wird ständig gebootet.


CLI/STI/IRET sind nur für Interrupt-Handler sinnvoll. Da Du ja
Polling (ständiges Abfragen) verwendest, können CLI/STI durch-
aus einen GPF (Absturz + Reboot) auslösen, wenn der Code nicht
in einem entsprechend privilegierten (=> IOPL) Speicherbereich
des OS ausgeführt wird, den Du für Interrupt-Handler im OS re-
serviert und angemeldet hast.


> Mit DLL und Windows hat das erstmal nichts zu tun.


Dein Code sicher nicht. Das COFF-Format aber schon, in welches
Dein Compiler die mouse.asm zu kompilieren versucht...


> Es soll erstmal soweit funktionieren, das man
> kurz nach dem Boot eine Maus und Tastatur bedienen
> kann ...
> Als Mauszeiger wollte ich ein farblich gekennzeichnetes
> Char nehmen.


Momentan habe ich mal gecheckt, dass in der angehängten mouse.
asm Zeile 11 im Bildschirmfoto Zeile 13 in meinem Browser ent-
spricht. Einige der Fehlermeldungen weisen nach Korrektur! auf
Leerzeilen, einige auf Funktionsdeklarationen des Typs global.
Die Fehlermeldungen kann ich also weiterhin nicht zuordnen...

Da Wolfgang in C.L.A.X86 Deinen Code schon zerlegt und kommen-
tiert hat, würde ich vorschlagen, dass Du seine Anmerkungen in
Deinen Code einfliessen lässt. Wolfgang ist in den einschlägi-
gen NGs der einzige Programmierer, der ein kommerzielles OS am
Laufen hält, also die erste Adresse in Fragen OS. Ich bin eher
Anwendungsprogrammierer, meine letzten OS-Ambitionen liegen 23
Jahre zurück:

https://drive.google.com/drive/folders/0B1OgMlxNnSNELTZSTDFzb2RWbmM?usp=sharing

Das "Pseudo-OS" läuft mit A86 auf DOS, hat aber vollen Zugriff
auf die vorhandene Hardware - die Tastatur-Routinen beinhalten
auch einen funktionierenden Maus-Support (ohne Scrollrad - das
gab es damals noch nicht...), allerdings über Interupts. Viel-
leicht hilft's Dir irgendwie weiter?


Ein schönes Wochenende wünscht

Bernhard Schornak

Jens Kallup

unread,
Sep 29, 2017, 10:59:49 AM9/29/17
to
Danke schonmal ...
Jens

Jens Kallup

unread,
Sep 29, 2017, 11:17:03 AM9/29/17
to
Hallo Bernhard,

vielleicht kann es ja sein, dass Du weisst,
wie/wo MOUSE x/y gesetzt oder / gelesen werden kann?

Jens

Bernhard Schornak

unread,
Sep 29, 2017, 1:10:19 PM9/29/17
to
Jens Kallup schrieb:


> Hallo Bernhard,
>
> vielleicht kann es ja sein, dass Du weisst,
> wie/wo MOUSE x/y gesetzt oder / gelesen werden kann?


Schau mal hier:

http://forum.osdev.org/viewtopic.php?t=24277

Das ist ein kompletter PS/2-Maustreiber auf OS-DEV.org...


Schönes Wochenende!

Bernhard

Jens Kallup

unread,
Sep 29, 2017, 3:00:36 PM9/29/17
to
Am 29.09.2017 um 19:10 schrieb Bernhard Schornak:

> Schau mal hier:
>
> http://forum.osdev.org/viewtopic.php?t=24277
>
> Das ist ein kompletter PS/2-Maustreiber auf OS-DEV.org...

woops, des ja nen Ding.
Es wird sogar ein Zeichenattribut angezeigt.
Allerdings, wenn ich die Maus bewege, rückt der Cursor
ein wenig umher und dann scheint die app zu freezen.

https://pastebin.com/w3MmyNnh

Bernhard Schornak

unread,
Sep 29, 2017, 6:19:29 PM9/29/17
to
Jens Kallup schrieb:
Solche Konstrukte (Zeile 149...153)

...
xor ecx, ecx
mov cx, 1000
xor eax, eax
in al, 0x64
dec cl
...

verbrauchen unnötig Resourcen.

...
mov cl, 0xE8
in al, 0x64
dec cl
...

ist kürzer und vermeidet einen unnötigen Wartezyklus (wenn der Prozessor
das erste xor nicht automatisch ignoriert...). So lange nur AL abgefragt
wird, braucht man nur AL auswerten, und das laufende Löschen der höheren
24 Bit ist damit überflüssig. Ebenso kann ein 8-Bit-Register keine zwölf
Bit breiten Werte dekrementieren (1000 = 0x03E8). Es genügt demnach, die
unteren acht Bit von CL zu laden, das spart einige Byte im Quellcode.

Wie Wolfgang schrieb, solltest Du den Inhalt des Videopuffers (das unter
der neuen Cursorposition befindliche Wort) zwischenspeichern, und vorher
den Inhalt des aktuellen Worts unter dem Cursor wiederherstellen. Könnte
einen Teil des erratischen Verhaltens Deines Cursors verursachen.

Bezüglich der Mausbewegung: Die zurückgegebenen x/y-Werte sind keine Ko-
ordinaten, sondern *relative* Bewegungen der Maus bezogen auf die letzte
Position - sie werden zu den aktuellen x/y-Werten addiert. Anschliessend
empfiehlt es sich, die Ergebnisse auf gültige Werte zu prüfen - entweder
hart (Cursor bleibt am Rand stehen) oder weich (Cursor erscheint auf der
gegenüberliegenden Seite wieder).


Schönes Wochenende

Bernhard
0 new messages