1
Lowlevel-Coding / Re: scancode AltGr
« am: 18. September 2009, 16:36 »
Danke erstmal für die Antworten. Aber kaum hat man es implementiert, gibt es schon neue Probleme. Zwei Stück genau genommen:
1.:
Die AltGr Taste funktioniert unter qemu - aber wenn ich es richtig Teste, geht sie nicht. Hab keine Ahnung woran des liegt. Im Tastaturtreiber sieht es wie folgt aus:
Und zweitens:
Ich habe in der Screen-Ausgabe-Funktion, auch '\b' implementiert, soll heißen die Backspace Taste sollte auch funktionieren. Tut sie auch aber leider nicht richtig... Drückt man Backspace so wird das letzte Zeichen gelöscht, und der Cursor eine position zurück gesetzt, d.h. so wie es sein sollte. Ist der Cursor aber am Anfang der zeile, und man drückt dann BS so springt der Cursor nicht eine Zeile höher, sondern bleibt einfach stehen. Das bringt mich echt noch um den Verstand Hier der Code:
mfg energetic
1.:
Die AltGr Taste funktioniert unter qemu - aber wenn ich es richtig Teste, geht sie nicht. Hab keine Ahnung woran des liegt. Im Tastaturtreiber sieht es wie folgt aus:
Code: [Auswählen]
//scancode-Array vorher deklariert und mit Werten belegt
BYTE sca = inb(0x60);
if(sca != 0 && sca < 0x56 && (sca == 0x2A || sca == 0x36))
{
shift = 1;
}
/*!!!*/ else if(sca != 0 && sca == 0xE0)
/*!!!*/ {
/*!!!*/ BYTE next = inb(0x60);
/*!!!*/ if(next != 0 && next == 0x38)
/*!!!*/ {
/*!!!*/ altGr = 1;
/*!!!*/ }
/*!!!*/ else if(next != 0 && next == 0xB8)
/*!!!*/ {
/*!!!*/ altGr = 0;
/*!!!*/ }
/*!!!*/ }
else if(sca != 0 && sca < 0x56 && shift == 0 && altGr != 1)
{
//putnum(scancode[sca][0][0], 16);
//putstr(" | ");
putchar(scancode[sca][0][0]);
//putchar(' ');
}
else if(sca != 0 && sca < 0x56 && shift == 1 && altGr != 1)
{
//putnum(scancode[sca][1][0], 16);
//putstr(" | ");
putchar(scancode[sca][1][0]);
//putchar(' ');
}
else if(sca != 0 && (sca == (0x2A + 0x80) || sca == (0x36 + 0x80)))
{
shift = 0;
}
else if(sca != 0 && sca == (0xE0 + 0x80))
{
altGr = 0;
}
else if(sca != 0 && shift != 1 && altGr == 1)
{
//putnum(scancode[sca][0][1], 16);
//putstr(" | ");
putchar(scancode[sca][0][1]);
//putchar(' ');
Und zweitens:
Ich habe in der Screen-Ausgabe-Funktion, auch '\b' implementiert, soll heißen die Backspace Taste sollte auch funktionieren. Tut sie auch aber leider nicht richtig... Drückt man Backspace so wird das letzte Zeichen gelöscht, und der Cursor eine position zurück gesetzt, d.h. so wie es sein sollte. Ist der Cursor aber am Anfang der zeile, und man drückt dann BS so springt der Cursor nicht eine Zeile höher, sondern bleibt einfach stehen. Das bringt mich echt noch um den Verstand Hier der Code:
Code: [Auswählen]
void putchar(char c)
{
BYTE backColour = 0;
BYTE foreColour = 15;
BYTE attributeByte = (backColour << 4) | (foreColour & 0x0F);
WORD attribute = attributeByte << 8;
WORD *location;
//Backspace
/*!!!*/ if (c == '\b')
/*!!!*/ {
/*!!!*/ //Cursor_x und cursor_y sind global
/*!!!*/ if(cursor_x != 0)
/*!!!*/ {
/*!!!*/ location = (video + (cursor_y*80 + cursor_x)) - 1;
/*!!!*/ *location = 0x0 | attribute;
/*!!!*/ cursor_x--;
/*!!!*/ }
/*!!!*/ else if(cursor_x == 0)
/*!!!*/ {
/*!!!*/ cursor_y--;
/*!!!*/ cursor_x = 80;
/*!!!*/ }
/*!!!*/ }
//Tabs
else if (c == '\t')
{
cursor_x = (cursor_x+4) & ~(4-1);
}
//Wagenrücklauf
else if (c == '\r')
{
cursor_x = 0;
}
//Zeilenumbruch
else if (c == '\n')
{
while(cursor_x < 80)
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x0 | attribute;
cursor_x++;
}
cursor_x = 0;
cursor_y++;
}
//doppelte Anführungszeichen
else if(c == '\"')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x22 | attribute;
cursor_x++;
}
//einfache Anführungszeichen
else if(c == '\'')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x27 | attribute;
cursor_x++;
}
//Backslash
else if(c == '\\')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x5C | attribute;
cursor_x++;
}
//Zeichen Ausgeben
else if(c >= ' ')
{
location = video + (cursor_y*80 + cursor_x);
*location = c | attribute;
cursor_x++;
}
//Am Zeilenende,Zeilenumbruch
if (cursor_x >= 80)
{
cursor_x = 0;
cursor_y ++;
}
//Scrollen, wenn nötig
scroll();
//cursor setzen
move_cursor();
}
Hoffe jemand weiß Rat... mfg energetic