Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cool-Andy am 10. October 2009, 08:42
-
Hi,
tut mir leid, dass ich schon wieder posten muss, aber ich bin grad echt am verzweifeln.
Naja aus meinem im vorherigen Thema gefragten Tastendruck wurde ein Tastaturtreiber :wink:.
Ich frage den KBC über 0x60 ab, speichere den Scancode in einer Variablen und schreibe mittels "if" und "else if" das ganze in eine globale Variable.
Nun wollte ich aber mit dem Schreiben abwarten, bis Enter gedrückt wurde.
Um die Zeichen zu speichern, dachte ich könnte ich in so etwas: "char *text" schreiben, um die Position zu erhöhen wird "z" (Int) bei jedem Durchlauf um 1 erhöht.
Mein Code:
int scancode;
int z=0;
classstart:
z++;
// ... hier Scancode ermitteln
if (scancode == 0x02)
{
string [z] = "1";
}
else if (scancode == 0x03)
{
string [z] = "2";
}
// ...
else if (scancode == 0x1c) // Enter
{
string[z] = "\n";
goto classend;
}
//...
goto classstart;
classend:
scancode = 0;
}
gcc meckert jetzt immer so was: warning: assigment makes integer from pointer without a cast.
Ich bin echt ratlos.
Kann mir bitte jemand helfen!?
Danke schon mal im Vorraus.
-
Was in " steht ist nen String (und wird mit \0 abgeschlossen), was du an string[z] zuweisen willst dürfte ein einzelnes Zeichen sein. Das wird in ' geschrieben. Also z.B. '1' und '\n'.
-
ich würde das so in der art machen
char string[80]; //ein string mit 80 zeichen
int scancode;
static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; // eine, natürlich unvollständige, scancodetable
while(scancode != 0x1C)
{
*string = scantable[scancode];
string++;
}
string++;
*string = '\0'; // den string abschließen
das ist nur ein vorschlag ich übernehme keine verantwortung ob der code so laufähig wäre, aber auf dauer sind if/else keine lösung
-
Danke erstmal für die Antworten,
aber was das hier static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' };
bewirkt verteh ich nicht.
Kann mir das bitte jemand erklären?
-
ich würde das so in der art machen
Und perfekt ist der Buffer Overflow. Ein bisschen Sorgfalt beim Programmieren wäre manchmal ganz nett.
aber was das hier static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' };
bewirkt verteh ich nicht.
Kann mir das bitte jemand erklären?
Es legt ein char-Array an, das mit den entsprechenden Zeichen initialisiert wird. Also scantable[0] = ' ', scantable[2] = '1' usw. Die Idee ist, dass du da einfach jeweils das richtige Zeichen für den Scancode einträgst.
-
Aaah, mir geht ein Lichtlein auf!
Danke, werd ich gleich mal ausprobieren :lol:
-
nagut dann nochmal überarbeitet:
int z = 0;
char string[80]; //ein string mit 80 zeichen
int scancode;
static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; // eine, natürlich unvollständige, scancodetable
while(scancode != 0x1C && z <= 79)
{
string[z] = scantable[scancode];
z++;
}
z++;
string[z] = '\0'; // den string abschließen
-
string[z] statt *string, und kein string++
-
Ich wäre ja für
int z;
char string[80];
volatile int scancode;
static unsigned char scantable[256];
scantable[0x02] = '2';
scantable[0x03] = '3';
scantable[0x1C] = '\n';
//Zu vervollständigen...
for (z = 0; z < 79; z++)
{
string[z] = scantable[scancode];
if (string[z] == '\n')
{
z++;
break;
}
}
//z ist hier höchstens 79. Die 0 passt also auch noch rein.
string[z] = '\0';
-
Ich wäre für sizeof(string) - 1 statt der hartkodierten 79. Und die Tabelle kann man auch schöner initialisieren:
static unsigned char scantable[256] = {
[0x02] = '2',
[0x03] = '3',
[0x1C] = '\n',
};
-
Danke nochmal für die Antworten.
Aber es klappt net. Erklärt mich für dumm! :?
Habs jetzt mal mit der for-Schleife und der while-Schleife ausprobiert: krieg beides mal kein Zeichen.
Hättet ihr mal ein konkretes Beispiel?
Danke!
-
Ich häng mal noch meinen aktuellen Code an:
void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];
static unsigned scantable[1024] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
string[z] = scantable[scancode];
if(string[z] == '\n')
{
z++;
break;
}
}
string[z] = '\0'; // String abschließen
i = 1;
while(string[i] != '\0') // Byteweises kopieren (string --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
i++;
}
}
-
Hi,
Die Kopier-Schleife muss mit i = 0 starten, nicht 1.
Ansonsten: Was sollte deiner Meinung nach passieren? Gibst du key aus? Was passiert tatsächlich?
-
Und das abschließende Nullbyte mitzukopieren, wäre auch eine Idee, sonst wird key unter Umständen etwas zu lang. ;)
-
Ok, hab das mal jetzt so gelöst:
//...
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
string[z] = scantable[scancode];
if(string[z] == '\n')
{
z++;
break;
}
scancode = 0;
}
string[z] = '\0'; // String abschließen
for(i=0;i<80;i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
//...
und im main-file:
//...
loop:
scanf();
printf(key);
goto loop;
//...
Leider wird immer nur das erste Zeichen eingelsen und angezeigt.
Danach ist mein Kernel wie "gelähmt".
Oh je, ob ich das nochmal hinkrieg!? :|
-
ich weiß nicht genau ob das möglich ist, aber ich denke mal ja ...
return doch einfach den eingelesenen string.
also statt
for(i=0;i<80;i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
einfach
return string;
-
Der String liegt auf dem Stack, der ist nicht mehr gültig, nachdem die Funktion beendet ist.
-
Und was heißt das jetzt konkret?
-
Dass du das lassen sollst wie es ist. ;)
Kannst du mal den aktuellen kompletten Code irgendwo hochladen? Mir fehlt gerade der Überblick, wie die einzelnen Codefragmente am Ende tatsächlich benutzt werden.
-
Kannst du mal den aktuellen kompletten Code irgendwo hochladen? Mir fehlt gerade der Überblick, wie die einzelnen Codefragmente am Ende tatsächlich benutzt werden.
OK.
main.c:
#include "video.h"
#include "kb.h"
#include "global.h"
void kernel()
{
// Bildschirm leeren und eine Meldung anzeigen
cls();
cls();
printf ("ready\n");
loop:
scanf();
printf(key);
goto loop;
// Endlosschleife
while (1);
}
kb.c:
//...
void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];
static unsigned scantable[256] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
string[z] = scantable[scancode];
if(string[z] == '\n')
{
z++;
break;
}
}
string[z] = '\0'; // String abschließen
i = 1;
for (i=0; i<80; i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
}
-
Ich meinte eigentlich wirklich den kompletten Code, als .zip oder so irgendwo hochladen, damit ich den auch selber kompilieren und mir den Fehler anschauen kann. Und natürlich, falls der Fehler doch woanders liegt: Bist du dir denn z.B. komplett sicher, dass es nicht an deinem printf liegt? Hast du mal geschaut, an welcher Stelle dein Kernel hängt? (In qemu z.B. mit info registers im Monitor anschauen, wo eip steht)
-
Hier is der komplette Code (ich hoffe der Link funzt): http://www.12see.de/userdaten/000200/71/download/os.zip
Als Bootloader benutz ich Grub.
-
Zum einen kannst du das mit key so nicht machen. Zum einen deklarierst du die Variable in einer Headerdatei und dort deklariert man nie Variablen. Das heißt, du hast am Ende in jeder .c-Datei, die diesen Header einbindet, eine Deklaration dieser Variablen. Das klappt nur, weil der Linker dir die Doppelten wieder zusammensucht... Richtig wäre es, die Variable als extern char key[]; in der Headerdatei zu deklarieren und z.B. in der kb.c nochmal die eigentliche Definition char key[80]; hinzuschreiben.
Das andere, was an deiner Deklaration böse war, ist, dass du einen Pointer deklariert und ihn auch benutzt hast, aber ihn nie initialisiert hast. Das heißt, er hat halt zufällig auf irgendwelchen Speicher gezeigt. Keine gute Idee.
Was aber die entscheidende Sache ist, ist dass du die Breakcodes nicht berücksichtigst, die beim Loslassen einer Taste erzeugt werden. An diesen Stellen ist die Scancodetabelle leer und deswegen wird eine 0 in den String geschrieben. Womit er dann beendet wäre, welche Tasten auch immer hinterher noch kommen mögen. Ich hab noch das hier rein, damit hat es dann funktioniert:
if (scancode & 0x80) {
z--;
continue;
}
-
Danke für deine Mühe,
habs grade ausprobiert, mir sind aber ein paar Dinge noch unklar.
Könntest du vielleicht die veränderten Datein irgendwie uploaden oder als Code posten?
Wäre dir wirklich sehr dankbar.
-
Hm, ich glaube, ich hatte das in /tmp gemacht... ;)
Ich kann die paar Änderungen heute abend nochmal machen und dann den Patch reinkopieren. Sind ja nur ein paar Zeilen.
-
ja, danke, das wäre wirklich sehr nett. :-D
-
wie sieht`s denn aus, kannst du den code bald posten?
-
Der Code von scanf sieht nicht unbedingt sehr schön aus...
Wäre es nicht sinnvoller, die Funktion wie im Standard deklariert zu schreiben?
int scanf ( const char * format, ... );
Den "String" format könnte man mit den Builtin-Funktionen aufdröseln. Ich kann ja mal eine einfache Version als Anregung basteln, falls bedarf besteht. :)
-
Der Code von scanf sieht nicht unbedingt sehr schön aus...
Geb ich dir recht, aber mein ganzes OS soll eigentlich nur dazu dienen, das ganze Zeugs zu lernen. :wink:
Ich kann ja mal eine einfache Version als Anregung basteln, falls bedarf besteht.
Ja gerne, nur her damit und vielen Dank für deine/eure Mühe.
-
Gut.
Ich werde mich heute Nachmittag daran machen.
Dafür werde ich dann auch teile deines Codes umstricken, was ich denke, dass sinnvoller ist...
Was mir aber schon aufgefallen ist, ist dass die Scancode- bzw. ASCII-Tabelle nur lokal in der Funktion vorhanden ist. Ich würde so etwas global machen... :)
-
Wie schon gesagt, ich bin Anfänger der blutigsten Art :-D und lerne gern, also nur zu!
-
wie sieht`s denn aus, kannst du den code bald posten?
Ups, vergessen... Hier ist der Patch:
diff --git a/global.h b/global.h
index 6b5e026..d744792 100644
--- a/global.h
+++ b/global.h
@@ -4,7 +4,7 @@
#define _GLOBAL_H_
/// Aktuell entgegengenommene Taste
-char *key;
+extern char key[];
-#endif // ifndef _GLOBAL_H_
\ No newline at end of file
+#endif // ifndef _GLOBAL_H_
diff --git a/kb.c b/kb.c
index 816599c..e77d446 100644
--- a/kb.c
+++ b/kb.c
@@ -3,6 +3,8 @@
#include "kb.h"
#include "global.h"
+char key[80];
+
static inline unsigned char inb(unsigned short port)
{
unsigned char val;
@@ -113,6 +115,11 @@ void scanf () // Aufruf durch "scanf();"
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
+
+ if (scancode & 0x80) {
+ z--;
+ continue;
+ }
string[z] = scantable[scancode];
@ChristianF: scanf ist hochgradig nichttrivial, aber versuch's mal. Ich suche dann auch Fehler. ;)
-
hähhhh? :? :? :?
hab jetzt mal den code den ich als C-Code identifiziert habe (was soll --- und +++) agetippt und durch den compiler gejagt. Bis jetzt klappt alles, aber es funzt nett?
Ich stell den Code gleich nochmal online, aber bei mir läufts net.
EDIT: hier ist der Link: http://www.12see.de/userdaten/000200/71/download/updated.zip
-
Das ist ein Patch, den dir taljeth gegeben hat.
- Sind die zu ersetzenden Zeilen
+ Die neuen Zeilen
Per diff und patch kannst du den Patch auf deine Dateien anwenden.
-
Das ist ein Patch, Zeilen mit - müssen gelöscht werden, Zeilen mit + kommen neu rein, Codezeilen ohne was vorne dran dienen deiner Orientierung, wo sich der entsprechende Code befindet. Du hast nicht wirklich gemacht, was dieser Patch sagt.
Wie kommst du auf die Idee, es könnte funktionieren, wenn du in scanf() eine lokale Variable key definierst und in main() eine andere lokale Variable key?
-
ah, Denkfehler von mir (bin Windowsnutzer) werds glei mal ausprobieren.
-
@ChristianF: scanf ist hochgradig nichttrivial, aber versuch's mal. Ich suche dann auch Fehler. ;)
Nun ja, man kann ja fürs erste nur Ganzzahlen und einzelne chars, sowie strings einlesen. Das ganze dann aber ohne den Krempel voran also nur "%d" und nicht "%010d" oder so. :-D
-
Dann ist es aber kein richtiges scanf. Aber viel mehr braucht es auch nicht, damit es wirklich spaßig wird, %i oder %x reichen schon. ;)
-
Dann ist es aber kein richtiges scanf. Aber viel mehr braucht es auch nicht, damit es wirklich spaßig wird, %i oder %x reichen schon. ;)
Über sowas mach ich mir später gedanken (sollte Es mal laufen). Folgendes: Hab`s gepatcht (code für "kb.c" steht unten) aber: es läuft immer noch nicht. Solangsam zweifel ich, ob es nicht an mir liegt.
kb.c:
char key[80];
static inline unsigned char inb(unsigned short port)
{
unsigned char val;
__asm__ __volatile__("inb %1, %0" : "=a" (val) : "Nd" (port));
return val;
}
void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];
static unsigned scantable[1024] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
if (scancode & 0x80)
{
z--;
continue;
}
if(string[z] == '\n')
{
z++;
break;
}
string[z] = scantable[scancode];
}
string[z] = '\0'; // String abschließen
i = 1;
for (i=0; i<80; i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
}
und global.h:
// --- Globale Variablen ---
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
/// Aktuell entgegengenommene Taste
extern char key[];
#endif // ifndef _GLOBAL_H_
Hab ich mich im Code vertippt oder was ist da los? :?
-
Ich seh hier keinen offensichtlichen Fehler. Wie sieht es in der main.c aus, hast du dort auch die lokale Definition von key entfernt?
-
main.c:
/* --- KERNEL --- */
#include "video.h"
#include "kb.h"
#include "global.h"
void kernel()
{
cls();
cls();
printf("Welcome\n");
printf("root> ");
loop:
scanf();
printf(key);
goto loop;
}
-
Juhu, ich hab die Lösung gefunden:
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
if (scancode & 0x80)
{
z--;
continue;
}
if(string[z] == '\n') // <-- fragt Enter ab
{
z++;
break;
}
string[z] = scantable[scancode]; // <- Enter wird aber erst hier eingetragen
}
Die Lösung:
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
if (scancode & 0x80)
{
z--;
continue;
}
if(string[z] == 0x1c) //<-- Enter abfragen
{
z++;
break;
}
string[z] = scantable[scancode];
}
-
Vielen Dank, an alle die, die mir geholfen haben. :-D
-
Das sieht aber so ehrlich gesagt nicht ganz richtig aus, da du string[z] ja noch gar nicht gesetzt hast.
Ich würde es also folgendermaßen machen:
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}
// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);
if (scancode & 0x80)
{
z--;
continue;
}
string[z] = scantable[scancode];
if(string[z] == '\n') //<-- Enter abfragen
{
z++;
break;
}
}