Zuviele Tastatureingaben == BEEP ??



  • Hi @ all
    ich hab in einem asm programm ne schleife, die in jedem durchlauf mit ah = 1 und int 21h prüft, ob eine/welche taste gedrückt wurde. Doch schon nach wenigen eingaben reagiert das programm nicht mehr aus tastatur eingaben. wie kann ich das vermeiden ? kennt jemand ne lösung. plx ^^.
    cu



  • Was fuer Tasten werden denn in deinem Programm am haeufigsten gedrueckt?
    Koennte es sich da zufaellig um Pfeiltasten oder andere extended keys handeln?
    Ansonsten konnte ich den Fehler nicht reproduzieren. 😕



  • Klingt als wenn der Tastaturpuffer abgefragt wird, aber nicht geleert 🙂



  • @Nobuo T: Nö. Ich frage nur normale Buchstaben wie 'w' oder 's' ab.

    @TriPhoenix: Hmm. Ich denken nicht, dass ich ihn leere. Könntest du (oder ein anderer) mir vielleicht sagen, wie man das macht. In meinem Buch steht das nicht. Bitte :). Denke mal, dass das per Interrupt funzt. Also plz Interrupt Nummer sagen und eventuell Parameter (oder besser, ob ich einem Register einen bestimmten Wert geben muss). Und was auch noch nett wäre, wenn du (ihr) mir sagt(st), ob ein Wert zurückgegeben wird, bzw in welchem Register. Hmm umständlicher hätte man es wohl kaum vormulieren können ;). cu



  • Den Tastatur-Puffer kannst Du mit ax=0000 int 16h leeren.
    Dieser Interrupt funktioniert ansonsten genauso, wie der int 21h, den Du vorher benutzt hast, ausser, dass er kein Echo auf dem Bildschirm ausgibt.
    In al wird der ASCII-Code der gedrueckten Taste, oder 00 zurueckgegeben, wenn ein Extended Key gedrueckt wurde. In ah steht der Keyboard Scan-code.



  • Hmm. Kann man den Puffer auf leeren, ohne dass das Programm dabei auf eine Tastatureingabe wartet? Ich muss nämlich nur überprüfen, ob die Taste gedrückt wurde, da es eine kleine Art des Spiels Pong werden soll. Sollte also nicht ihrgendwo im Programm warten, sondern andauernd durchlaufen werden, also die Hauptschleife. Geht das ?



  • Schau mal hier, da gabs die gleiche Frage.



  • Hi.
    @Nobuo T: THX ^^. Das hab ich gesucht.
    Bis bald.
    cu



  • soo. hi nochmal. hab nu ne andere frage. mein programm läuft zu schnell. ok. das vielleicht nicht, aber ein wert ändert sich viel´zu schnell, wie kann ich es schaffen, das sich eine variable z.b alle 100 ms um 1 erhöht ??? dabei soll der andere teil des codes normal weiter laufen, also nicht 100 ms warten. mir ist schon klar, man könnte einen zähler machen, die zeit seit der letzen erhöhung messen und gegebenfalls variable erhöhen. aber wie??? der komische timer rtc.. ihrgendwas funzt bei nicht. Kann mir einer vielleicht codebeispiel geben ? bis jetzt hatr das ja schön geklappt. plz plz pzl ;)).



  • Hi

    der komische timer rtc.. ihrgendwas funzt bei nicht.

    Was ist damit gemeint? Kannst Du das mit deinem timer-modul nicht ueber den int8 laufen lassen?



  • Ich meinte "rdtsc". Das funzt bei mir nicht. Um ehrlich zu bleiben: kenne int 8h eigentlich nicht, bzw kaum. Code beispiel wäre sehr sehr nützlich. aber eine gute erklärung ist mindestens genauso gut. plz help. 😃



  • Wenn ich das jetzt richtig verstanden habe, willst Du also einen kleineren Programmteil langsamer ablaufen lassen, der Rest soll aber normal weiterlaufen?
    Dann kannst Du den Teil, der langsamer laufen soll doch einfach in eine Interrupt-Prozedur packen und einen Pointer darauf in den int8-Vector setzen 🕶
    Der int8 wird dann Normalerweise 21x pro Sekunde aufgerufen.

    Also Bsp:

    mov ax,3508h
    int 21h ;get int8 vector
    mov [word ptr ds:OldIntVect],bx
    mov [word ptr ds:OldIntVect+02h],es
    ;ds muss hier =cs sein.
    mov dx,offset Int8Proc
    mov ah,25h
    int 21h ;set int8 vector
    ...usw...
    
    ...wenn fertig ist, alten handler wieder installieren:
    mov ax,2508h
    mov dx,[word ptr ds:OldIntVect]
    mov ds,[word ptr ds:OldIntVect+02h]
    int 21h
    
    ...noch irgendwelcher code hier...
    
    Proc Int8Proc
    
    ... was auch immer zu schnell lief... (nicht vergessen alle Register auf dem Stack zu sichern, die veraendert werden!)
    db 0eah
    OldIntVect dd 00000000h ;dieser Bytewert + zuerst das Offset und dann Segment ergibt einen FAR Jump zum alten int8 handler.
    
    ENDP Int8Proc
    

    Hoffe, das war jetzt auch halbwegs verstaendlich 😃



  • Hi.
    Ich hab den Code mal ausprobiert, aber es geht nicht. Ich bekomme immer eine allgemeine Schutzverletzung. Sicher das das auch im Konsolenfenster geht ??? Mein Rechner stürzt immer ab. Ich glaube aber, dein Tip könnt mir auch nicht helfen, ich möchte nämlich selbst bestimmen, in welchen Zeitintervallen der Code Teil aufgrufen wird.
    hoffe du kannst mir weiter helfen. oder auch die anderen 😉


Log in to reply