Autor Thema: Problem mit KeyBoard Handler  (Gelesen 6944 mal)

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« am: 10. September 2005, 14:06 »
hi!
ich hab folgendes problem:
ich habe mir einen Keybhandler geschrieben und
warte auf einen tastendruck...( code folgt noch )

Wenn ich eine Taste drücke gibt bochs folgende
fehlermeldung aus:

"[KBD  ] internal keyboard buffer full (imm)"

Hier der Code... Bitte helft mir!!!

char _keyb_buf;
BOOL _key_in_buf = FALSE;
__keymap km = US;
int shift, caps=FALSE;

void update_keyb_leds() {
     if(caps)
     {
             while( ( inportb( KEY_REG_STATUS )  & 0x2 ) != 0 ) ;
             outportb( KEY_REG_DATA, 0xed );
             while( ( inportb( KEY_REG_STATUS )  & 0x2 ) != 0 ) ;
             outportb( KEY_REG_DATA, 0x4 );
     }
     else
     {
             while( ( inportb( KEY_REG_STATUS )  & 0x2 ) != 0 ) ;
             outportb( KEY_REG_DATA, 0xed );
             while( ( inportb( KEY_REG_STATUS )  & 0x2 ) != 0 ) ;
             outportb( KEY_REG_DATA, 0x0 );
     }
}

/* ======================== */

void keyboard_handler(struct _int_stack_regs *r) {
     int scancode;
     
     while ( ( inportb( KEY_REG_STATUS ) & 1 ) == FALSE ) ;
     while( ( inportb( KEY_REG_STATUS )  & 0x2 ) != 0 ) ;
     scancode = inportb( KEY_REG_DATA );
     
     if(scancode & KEY_RELEASE)
     {
         scancode&=0x7f;  
                       
         if( scancode == SC_LEFT_SHIFT || scancode == SC_RIGHT_SHIFT )
         {
             if(caps)
             shift = TRUE;
             else
             shift = FALSE;
         }
         update_keyb_leds();
         return;
     }
     if( scancode == SC_LEFT_SHIFT || scancode == SC_RIGHT_SHIFT )
     {
          if(caps)
          shift = FALSE;
          else
          shift = TRUE;
          update_keyb_leds();
          return;
     }
     if( scancode == SC_CAPS_LOCK )
     {
          shift = !shift;
          caps = !caps;
          update_keyb_leds();
          return;
     }

     if( !_key_in_buf ) {
       if( shift && km == US ) {
       _keyb_buf = kmUS_Shift[scancode];
       }
       else if ( !shift && km == US ) {
       _keyb_buf = kmUS_NonSh[scancode];
       }
       else if ( shift && km == GE ) {
       _keyb_buf = kmGE_Shift[scancode];
       }
       else if ( !shift && km == GE ) {
       _keyb_buf = kmGE_NonSh[scancode];
       }
       
       _key_in_buf=TRUE;
       
     }      
         
     update_keyb_leds();
}

/* ======================== */

void keyb_init() {
     irq_install_handler(1, keyboard_handler, "keyb_drv");
}

/* ======================== */

int getch(void) {
    int rv;
   
    while( !_key_in_buf ) ;
   
    rv = _keyb_buf;
    _key_in_buf = FALSE;
   
    return rv;
}

/* ======================== */


Ich initialisiere den Handler mit keyb_init();
und dann warte ich mit getch() auf einen taste..

wo liegt den bloß der fehler??

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 14. September 2005, 15:11 »
Warum helft ihr mir nich??
Hat einer schonmal den selben Fehler gehabt??
Weiß einer wie man den beheben kann??

Bitte Helft Mir Doch!!!!!! :o

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. September 2005, 15:28 »
Mal kurz nachgefragt: Kommt der Fehler, nachdem du nur eine Taste gedrückt hast?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. September 2005, 14:21 »
Zitat von: WhiteDragon
Mal kurz nachgefragt: Kommt der Fehler, nachdem du nur eine Taste gedrückt hast?

Er hat folgendes geschrieben:
Zitat

Wenn ich eine Taste drücke gibt bochs folgende
fehlermeldung aus:

Also muss er wohl erst ne Taste drücken.

@OS_Coder:
Du kannst ja mal nach googlen oder in der Bochs-Doku nachsehen, woher genau der Fehler kommen könnte. Evtl stimmt auch etwas mit dem Config-File für Bochs nicht.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 15. September 2005, 15:27 »
Falls du die Möglichkeit hast:

Gib uns doch mal ein Disk-Image und das Config-File von Bochs, vielleicht kann ich den Fehler dann ja debuggen und so rausfinden.

Oder aber gib mir mal die Assembler-Übersetzung von dem obigen Code, das ist für mich einfacher nachzuvollziehen.

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 17. September 2005, 10:22 »
Hier mal die bochssrc-file:

romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
megs:32
vgaromimage: $BXSHARE/VGABIOS-elpin-2.40
floppya: 1_44=A:, status=inserted
floppyb: 360k="D:\Downloads\floppy images\Win95 Starting Disk.img", status=inserted


floppy_bootsig_check: disabled=1
log: bochsout.txt
vga_update_interval: 300000
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
floppy_command_delay: 500

ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15

ata0-master: type=disk, mode=flat, path="G:\g.img", cylinders=615, heads=6, spt=17
ata1-master: type=cdrom, path="E:", status=inserted
ata1-slave: type=cdrom, path="F:", status=inserted

clock: sync=realtime, time0=local

mouse: enabled=0

private_colormap: enabled=0

fullscreen: enabled=0
#screenmode: name="sample"

keyboard_mapping: enabled=0, map=x11-pc-de.map
boot: a


Vielleicht hilft das ja...

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. September 2005, 11:44 »
so, ich hab nun mal ein bissl rumgegooglet und
gemerkt, dass ich vllt mal den internen(?) Keyboard
Buffer flushen sollte...

Hat da jemand ein stückchen code für mich??
Oder irgendwas anderes??

Danke an alle die mir schon geholfen haben...

 

Einloggen