Maus Position ermitteln..



  • Hi,
    Ich weiss nicht obs hier reinpasst, wenn nicht einfach verschieben...

    Also ich habe folgendes Problem, ich weiss nicht wie ich die Speicherzellen auslesen kann in die mit dem inline-assembler von gcc (AT&T Syntax) geschrieben wurde. Ich denke mal mit einem Zeiger wuerde es doch sicher gehen, wenn ja wie?

    Fragt mich nicht warum ich fuer die position der Maus asm benutze, wollte das ganze einfach nur mal so ausprobieren...

    #include <iostream>
    
    using namespace std;
    
    int mouse_on();
    int mouse_off();
    int mouse_status();
    
    int main()
    {
        mouse_on();      //Wie
        mouse_status();  //denn
        mouse_off();     //nun?
    
        return 0;
    }
    
    int mouse_on()
    {
        asm("movw $0x01, %ax\n\t"
            "int $0x33\n\t");
    
        return 0;
    }
    
    int mouse_off()
    {
        asm("movw $0x02, %ax\n\t"
            "int $0x33\n\t");
    
        return 0;
    }
    
    int mouse_status()
    {   
        asm("movw $0x03, %ax\n\t"
            "int $0x33\n\t"
            "movw %cx, (0x500)\n\t"
            "movw %dx, (0x503)\n\t"
            "movb %bl, (0x506)\n\t");
    
        return 0;
    }
    

    Danke im voraus
    mfg enA



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Andere Compiler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • nur nebenbei:

    zu maus findest du zwei beiträge im dos konsolenfaq

    eine für dos
    eine für windows.

    vielleicht hilfts weiter.



  • Nunja das wuerde gehen allerdings seh ich da noch nicht so durch, von wegen DWORD usw. bin naemlich cpp anfaenger. Die FAQ Hilft mit sicherheit allerdings wuerde ich es lieber auf diesem wege loesen, sollte doch funktionieren oder ?

    Am einfachsten waers natuerlich wenn mir jmd. erklaeren koennte wie ich eine variable fuer asm mit AT&T Syntax definiere und dieser dann den Wert uebergebe oder eben einen zeiger darauf definiere. Denn ehrlich gesagt ist die AT&T Syntax nicht so mein ding.

    Also vielleicht kann mir ja noch jmd. helfen, aber bitte nicht solche seiten wie linuxassembly.org oder so, bei den anleitungen versteh ich nur bahnhof.



  • Hi,
    das Problem hat sich jetzt insofern geloest das ich in
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-101526.html gefunden habe wie man die werte in eine variable uebergibt und die Syntax auf INTEL umstellt 🙂

    #include <iostream>
    
    using namespace std;
    
          void mouse_on(void);
          void mouse_off(void);
          void mouse_status(void);
    
          signed short X;
          signed short Y;
          signed short button;
    
    int main()
        {
                  mouse_on();
                  mouse_status();              
                  cout << "X: " << X << "\tY: " << Y << "\n" << button;
                  mouse_off();
    
              return 0;
        }
    
    void mouse_on()
        {
                  asm("mov ax, 01");
                  asm("int 33");
    
        }
    
    void mouse_off()
        {
                   asm("mov ax, 02");
                   asm("int 0x33");
    
        }
    
    void mouse_status()
         {
                   asm("mov ax, 03");
                   asm("int 33");
                   asm("mov cx, _X");
                   asm("mov dx, _Y");
                   asm("mov bx, _button");
    
         }
    

    Das Programm laesst sich jetzt zwar compilieren allerdings bekomm ich keine Ausgabe!?!?

    Was nu? 😕



  • Hab das Programm jetzt mal in Turbo Pascal geschrieben der assembler code bleibt ja der gleich, komischerweise funzt das Teil in Turbo Pascal.

    Hat jmd. ne ahnung wieso? Liefert TP ne eigene Konsolen Anwendung mit oda wie is das....?

    mfg ena



  • hallo

    es sieht so aus als wären bei den 3 letzten asm-zeilen
    quelle und ziel vertauscht beim 2.code und wahrscheinlich
    auch beim 1.code.
    mein c++ test-compiler hat eine andere syntax deshalb die
    vorsichtige antwort.

    mfg f.-th.



  • hallo nachtrag

    hab gerade beim 2.quelltext noch entdeckt int 33 != int 0x33

    mfg f.-th.



  • hi f.-th.

    also recht haste du auf jedenfall mit den letzten drei asm befehlen weil ich da ja auf intel syntax bin 🙂 (Ziel, Quelle). Nunja funzt aber damit immer noch nicht, achso und ob 0x33 oder 33 macht auch irgendwie keinen unterschied und wenn ich n h dranklemm kommt n compile fehler.

    Ich versteh aber ehrlich gesagt absolut nicht, wieso die gleichen funktionen, also der gleiche asm code, in tp funzt -> ohne probleme.

    program maus_mit_assembler;
    
    (*Beispielprogramm zur Nutzung des Interrupts 33h zur Einbindung einer
     Mausunterstuetzung in Turbo Pascal Programm.
    
     Erstellt von Sebastian Stein am 05.05.1999*)
    
    uses crt; {nur um den Bildschirm zu loeschen}
    var status : record       {hier wird die Position und der Tastenstatus der}
                 x, y : word; {Maus gespeichert}
                 taste : byte;
                 end;
        str1 : string;
        x, y, i : integer;
    
    procedure maus_an; assembler; {Mauscursor-Darstellung aktivieren}
    asm
      mov ax, 01h
      int 33h
    end;
    
    procedure maus_aus; assembler; {Mauscursor-Darstellung deaktivieren}
    asm
      mov ax, 02h
      int 33h
    end;
    
    procedure maus_status; assembler; {Mausposition und Tastenstatus abfragen}
    asm
      mov ax, 03h
      int 33h
      mov status.x, cx
      mov status.y, dx
      mov status.taste, bl
    end;
    
    begin {Das omin”se Hauptprogramm}
      clrscr;
      maus_an;
      i := 0;
      repeat
        maus_status;
        gotoxy(1,1);
        writeln('X: ',status.x,'   ');
        writeln('Y: ',status.y,'   ');
        case status.taste of
        0 : str1 := 'keine';
        1 : str1 := 'linke';
        2 : str1 := 'rechte';
        else
        str1 := 'beide';
        end;
        write('Taste: ',str1,'    ');
        gotoxy(20,10);
        writeln('^');
        IF (status.x = 152) AND (status.y = 72) AND (status.taste = 1) THEN BEGIN
           gotoxy(30,10);
           i := i + 1;
           writeln(i);
        END;
      until keypressed;
      maus_aus;
    end.
    

    Das testen ob der Zeiger auf pos x, y und taste 1 gedrueckt ist hab ich selbst dazugeschrieben, nur so zum test ;).



  • Hi,

    Ich hab mir jetzt mal n1 Open Watcom zugelegt 🙂 is wirklich supa, zwar koennte in die IDE auch gleich der texteditor aber naja...

    Nun habe ich mein Programm mal mit Watcom compiliert und ausgefuert mit folgendem Ergebnis:

    The instruction at 0x0040102a referenced memory at 0xffffffff.
    The memory could not be read.
    Exception fielded by 0x00402600
    EAX=0x00000100 EBX=0x00000108 ECX=0x0006fea4 EDX=0x00000000
    ESI=0x00000000 EDI=0x00000010 EBP=0x0006fe58 ESP=0x0006fe58
    EIP=0x0040102a EFL=0x00010202 CS =0x0000001b SS =0x00000023
    DS =0x00000023 ES =0x00000023 FS =0x0000003b GS =0x00000000
    Stack dump (SS:ESP)
    0x0006fe7c 0x00000010 0x00000000 0x00000000 0x0006fea4 0x00000108
    0x00401132 0xfffffffc 0x00000108 0x0006fe98 0x00000010 0x00000000
    0x00000000 0x0006fea4 0x00000108 0x00403624 0x0006ffb4 0x00070000
    0x00401f41 0x00033000 0x00000000 0x00000000 0x00000001 0x00000000
    0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
    0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
    0x00000000 0x00000000 0x00000000 0x00000000 0x0006ffac 0x00000000
    0x00000000 0x00000002 0xffffffff 0x00000001 0xffffffff 0x00000002
    0xc000001d 0x00000002 0xc000013a 0x00000002 0xc0000005 0x00000002
    0xc000013a 0x00000002 0xc000013a 0x00000001 0xffffffff 0x00000001
    0xffffffff 0x00000001 0xffffffff 0x00000002 0xc0000094 0x00000001
    0xc0000095 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
    

    Hat das vielleicht etwas mit dem protected mode zutun? Dann versteh ich aber immer noch nicht wieso es unter Pascal laeuft?!
    Der debugger von Watcom bleibt bei "INT 33h" stehen und meint Access Violation! 😡

    Hat jmd. vielleicht ne idee worans liegen koennte oder eine andere loesung, bis auf die in der faq?



  • also nachtrag c-syntax : 0x33 = 063 = 51 (hex - oct - dec)
    ich hoffe ich hab mich nicht verrechnet.
    meine inline-assembler akzepzieren für hexadezimalzahlen 0x33 = 33h
    alternativ (entweder - oder).
    frage : warum rückgabewert (_X oder _Y) wenn anders declariert ( X oder Y) ?
    die _X -variante soll nach meinen info's nur bei projekten mit c++ und externem
    assembler erforderlich sein.

    zur fehlermeldung : hast du nach dem compilieren nur die fehlermeldung oder
    auch eine object-datei; wenn ja versuch diese seperat zu linken. dann ist
    der code vielleicht nicht optimal. aber manchmal funktioniert's trotzdem.

    viel spaß bei testen f.-th.



  • Nunja das mit den unterstrichen deshalb weil wenn diese nicht vorhanden sind compiler = error. (undefined reference to 'X' bei gcc [-masm=intel]) Also funktionieren tut beim gcc 0x33 und 33 beim 'h' meint er "junk 'h' after expression".

    void mouse_on()
        {
                  asm("mov ax, 0x01");
                  asm("int 0x33");
    
        }
    
    void mouse_off()
        {
                   asm("mov ax, 0x02");
                   asm("int 0x33");
    
        }
    
    void mouse_status()
         {
                   asm("mov ax, 0x03");
                   asm("int 0x33");
                   asm("mov cx, X");
                   asm("mov dx, _Y");
                   asm("mov bx, _button");
    
         }
    

    Mit diesen Funktionen wird das ganze ohne error compiliert und auch gelinkt blos ich bekomm keine ausgabe, das programm stuerzt sicha an der stelle 'INT 0x33' ab. Und ich glaube nicht das (inline)assembler die syntax von c interessiert bei hex zahlen.



  • hallo

    ich hab in einem anderen beitrag gesehen (assemblercode mit Dev-C++ in intel-
    syntax), daß es doch funktionieren soll, mit _X und so.
    ein "future" von moderneren betriebssystemen ist es, daß sie hardwarenahe
    programmierung, und dazu zählen interrupt-aufrufe, abfangen und deren aus-
    führung teilweise verhindern. diese funktionen können teilweise über entsprech-
    chende andere aufrufe realisiert werden. siehe dockumentation zu deinem com-
    piler zu entsprechenden funktionen zu deinem betriebssystem. bei windows war es
    durchaus auch so, das nicht alle vorhandenen funktionen dockumentiert waren.

    wenn du decimal- und hexadecimal-zahlen verwechselst rufst du zum beispiel
    ganz anderen interrupts ab. die zahlen-dialekte bei c- und c++-compilern sind
    weitgehend ähnlich aber nicht unbedingt indentisch. in zweifel in der doku
    zum jeweiligen compiler nachsehen oder die hoffentlich vorhandenen beispiele
    testen.

    mfg f.-th.



  • nachtrag

    die interrupts dürften auf den betriebssystemen win NT, win 2000, win Xp und
    OS2 entweder zu fehlerhaften oder gar keinen ausgaben führen.
    unter Dos, win 95, win98 und wahrscheinlich win ME könnte das programm laufen.
    hab ich nur teilweise überprüft.

    assembler in C oder C++ wird in den compilern unterschiedlich eingeben!
    deshalb ist es bei problemen damit sinnvoll die betriebssystemversion und
    die compilerversion anzugeben. beim versuch das problem nachzustellen brauchten
    meine testcompiler unterschiedlichen sourcen!

    mfg f.-th.



  • Hi,
    ich habe mal in meinem asm buch geschaut und festellen muessen das es speziell "DOS" - Interrupts sind was dazu fuehrt, wie du schon sagst, das es unter dos win95, -98 usw. funktionieren sollte. Es gibt aber leider kein "BIOS" (Maus) - Interrupt, welches dann eigendlich os unabhaengig waere. Werd mal schauen ob ich eine Interrupt tabelle fuer xp (nt) finde und nochmal die hife von gcc (DevCpp) nachlesen bezueglich der Interrupt-Aufrufe.
    Allerdings wundert mich immer noch eine sache, warum funzt das ganze unter TP mit den gleichen Interrupts?

    Danke fuer deine Muehe 🙂

    mfg enA


Anmelden zum Antworten