Also, ich muss dann wohl doch in den Kreis der abertausenden Leute eintreten, die es mal wieder nicht geschafft haben die PS2-Maus zu programmieren...
Eigentlich wollte ich ja ein Tutorial schreiben und das werde ich auch noch machen, da z.b. bei osdev.org 3 seiten mit beiträgen wie "Problem mit PS2-Maustreiber" kommen...
Und eigentlich geht auch alles insoweit... aber nur unter VirtualBox .. und evtl. auch unter anderen Emulatoren oder gar auf meinem Notebook, aber auf meinem alten PC (AMD K6-Prozessor und 4mb Videoram xD) gehts nicht, denn da streikt irgendwie die Tastatur, sobald ich mein Mausprogramm starte... und wenn ich aeh an den KC schicke, dann geht zwar die Tastatur wieder, doch sie schickt falsche codes, so schickt sie z.b. bei F9 den ascii-code von ESC...
Ich würde euch nun darum bitten mal mein Mausprogramm unter verschiedenen, besonders alten Computern zu testen und mir zu sagen, obs da geht oder nicht, außerdem wäre es einfach zu geil, wenn einer gleich eine Lösung weiß... naja.. ich werde jetzt einfach mal versuchen jede Zeile zu debuggen, also nach jeder Zeile oder Programmschritt zu testen, ob die Tastatur noch geht....
P.S.:
Mein Os gibts hier, ich empfehle die CD-ISO, da das Floppy-Image einen Kernel besitzt, der eher für mich zum debuggen geändert wurde, aber noch nicht zurückgeändert wurde... so gibt er viele Zahlen oder Strings aus, mit denen Leute, die den Source nicht kennen nichts anfangen werden können...
Das angefangene Tutorial mit schon einigen BeispielCode, den ich aber sicher noch einmal ändern werde, wenn ich den Fehler gefunden habe, der meine Tastatur deaktiviert, gibts hierAchja, wenn bei euch mein OS tatsächlich laufen sollte, dann müsst ihr um den PS2-Maus-Treiber zu starten in die "Shell" "ps2mouse" eingeben, damit die gleichnamige Datei in den Speicher geladen wird...
Genauso könnt ihr auch die anderen Programme, die bei dem OS dabei sind starten, aber da müsst ihr leider in die ISO schauen, wie die heißen, ich hatte noch keine Lust den "dir"-Befehl für das ISO9660-System zu schreiben
Wenns keinen stört(wegen Offtopic), wäre es auch erfreulich, wenn ihr z.b. kleine Verbesserungen zu dem Tutorial postet, aber ich werde es gewiss fertigstellen und dann kommt es eh in die Tutorial- und Ressourcen-Diskussion hier in diesem Board xD
Und nochwas, wems aufgefallen ist, dass ich erst wegen zwei anderen Sachen hier nachgefragt habe, und die aber noch nicht realisiert habe, dem sei gesagt, dass ich eingesehen habe, dass das erstmal zu schwierig ist, aber eure Atworten waren nicht umsonst, ich habe z.b. mit der DualCore antwort schon andere beglückt xD.. und außerdem werde ich die Arbeiten an den gefragten Dinge wieder Aufnehmen, sobald ich einen funktionierenden Maustreiber mit brauchbaren Tutorial geschrieben habe xD
lol, verdammt, ich bezweifle fast, dass sich noch einer den Beitrag zu Herzen nehmen wird
, aber ich hätte da nochmal ne Frage, und zwar, wieso funktioniert unter VirtualBox, vlt. auch unter anderen Emulatoren die Funktion 20h (get command byte nicht).. unter VB scheint kein Byte gesendet zu werden.. und mein alter ****-PC gibt 47h zurück....
Ich merke grade, dass das bedeuten würde, dass ein TimeOut aufgetreten ist... eigenartig, bei was denn, 20h ist doch der erste Befehl in meinm Programm, den ich an den Keyboard-Controller sende... ?
Naja.. ich hoffe ich habe nicht zu wenig geschrieben xD
...
Note: Verdammt, noch was... Der Sourcecode ist mit auf der ISO oder auf den IMG zum auslesen empfehlen sich Programm wie UltraISO und WinImage... oder einfach brennen und dann auslesen.. so, aber das wars jetzt xD
TUT MIR LEID; ABER HIER KOMMT NOCHWAS
Und zwar habe ich das Disketten-Image nocheinmal auf meinem alten PC getestet und es scheint, als läge es doch an dem TimeOut-Error, den das Command-Byte liefert, oder so... ICH KANN MIR EINFACH KEINEN REIM DARAUF MACHEN, aber es scheint, als würde sich mein alter PC an diesem Stück code verschlucken
(am ende seht ihr ja, dass ich den Tastendruck abhole und ausgebe, nur gibt er ab da an den falschen Tastencode aus, denn wenn ich "h" drücke erscheint "," und andere sind auch vertauscht....)
Ok, hier die Code-Stelle, ich glaub ich geb gleich auf und sage einfach, ihr mit alten PCs habt Pech...
mov al,20h
out 64h,al
call kb.checkcmd
call kb.read
xchg ah,al
mov ebx,16
call zahlausgabe
or al,al
jnz or_20h
mov al,60h ;schiebe den Befehl das Command-Byte einzulesen auf al
out 64h,al ;um es an den Keyboard-Controller zu senden
call kb.checkcmd ;und überprüfe auch, ob es angekommen ist, wenn nciht warte bis es da ist
mov al,00000011b ;Setze im Command-Byte Bit0+1, um die irqs 9 und 12 aktivieren, wenn im Output-Buffer Daten verfügbar sind
out 60h,al ;schicke an den Daten-Port das Command-Byte
call kb.checkcmd ;und warte auf dessen Annahme
jmp after_or_20h
or_20h:
mov al,60h ;schiebe den Befehl das Command-Byte einzulesen auf al
out 64h,al ;um es an den Keyboard-Controller zu senden
call kb.checkcmd ;und überprüfe auch, ob es angekommen ist, wenn nciht warte bis es da ist
or al,00000011b ;Setze im Command-Byte Bit0+1, um die irqs 9 und 12 aktivieren, wenn im Output-Buffer Daten verfügbar sind
out 60h,al ;schicke an den Daten-Port das Command-Byte
call kb.checkcmd ;und warte auf dessen Annahme
after_or_20h:
xor ax,ax
int 16h
mov ah,0eh
int 10h
nur um den Beitrag unnötig zu verlängern sind hier die Prozeduren, die in den obigen code zum einstaz kommen
;***************************************************************************************************************
;dies sind Prozeduren die speziell Befehle an das Keyboard schicken oder Daten entgegennehmen, da man immer warten muss, bis
;welche da sind. diese Prozeduren werden überwiegend für die Mausinitialisierung und für den IRQ12 benötigt, der die Pakete holt
;***************************************************************************************************************
kb:
.read: ;wartet, bis im Output-Buffer des Port60h Daten bereitliegen und holt diese dann ab
push ecx ;ecx sichern, da das für loop benötigt wird
xor ecx,ecx ;auf ecx, ffffh schieben, damit hier nicht unendlich lang auf Daten gewartet wird
.wait_for_output:
in al,64h ;liest das Statusregister vom Keyboard-Controller aus
test al,00000001b ;testen ob im Outputbuffer Daten sind
jnz .output_is_there ;wenn ja, dann springe aus der Schleife raus und lese die Daten ein
loop .wait_for_output ;wenn nicht, also Bit0 nicht gesetzt ist, wiederhole schleife und warte weiter auf Daten
mov ah,1 ;wenn loop durchgelaufen ist und noch immer keine Daten da sind, schiebe auf ah errorcode
or ah,ah ;und setze ggf. das zeroflag, damit der user gleich danach jz o.ä. schreiben kann
pop ecx ;stelle register wieder her
ret ;und springe zum aufrufsort zurück
.output_is_there:
in al,60h ;hole Daten aus dem Output-Buffer
xor ah,ah ;und lösche ah, da bei fehler auf ah der errorcode ist; setze ggf. zeroflag (macht xor...)
pop ecx ;stelle Register wieder her
ret ;und springe zum Aufrufsort zurück
;************************* Variablen des IRQ12 *************************
.checkcmd: ;prüft, ob der Befehl auch angenommen wurde, oder noch immer im Buffer auf seine Verarbeitung wartet
push ax ;ax sichern, da es beim einlesen des Statusbytes zerstört wird
.loop_chkcmd:
in al,64h ;nach al das Statusregister holen
test al,00000010b ;und dort prüfen, ob Bit2, dass anzeigt, das etwas im out-buffer, gesetzt ist
jnz .loop_chkcmd ;wenn nicht, wiederhole den vorgang, bis das byte verarbeitet ist
pop ax ;stelle ax nun wieder her
ret
;************************* wartet bis alle Befehle des KC verarbeitet sind *************************
EDIT: VERDAMMT; ICH HABE GERADE BEMERKT; DASS DURCH EINEN FEHLER IM KERNEL DER EIGENE KEYBOARD_TREIBER GARNICHT GELADEN WURDE UND HABE DIES SCHNELL GEÄNDERT; ES GEHT ZWAR IMMER NOCH UNTER VB; DOCH AUFN ALTEN; HÄNGT DER SICH TOTAL AUF (DIE UHR; ALSO DER TIMER; IRQ 0; BLEIBT STEHEN!!!! UND MAN KANN AUCH NCIHTS MEHR MACHEN; WIE TASTE DRÜCKEN ODER MAUS BEWEGEN!!!)
Achja, es passiert ein Tastendruck nach dem abholen des Commando-Bytes...
das heißt, alle Probleme, die hier entstanden, angesprochen wurden sind, kommen nur durch den Befehl 60h zustande... aber ich wei0 nicht, was ich falsch mache Theoretisch schicke ich 47h als Commando-Byte an den KC, also genau das selbe Byte, was ich mit 20h geliefert bekomme, da 47h or 11b = 47h ist...