Ergebnis 1 bis 11 von 11

Thema: [C] Console-entwickeln

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    jap, sollte es -.-".

    Leider kommt hierdurch das nächste Problem.

    Nun lautet die Ausgabe schlicht "$" .Egal was ich drück, es rührt nix.

    2.Edit:
    Hab das mit der 1 und der 0 übersehen was du sagtest. Das heißt er zeigt gar nichts an. Auch nicht bei Tastendruck.

    Edit:
    BTW: Der Keyboard-Treiber würde mich interessieren..
    Im Grunde ist es recht einfach. Es gibt einen Interrupt Detection (?) Table kurz IDT. Ich kann den *alten* aus dem Real-Mode nicht mitnehmen (und will es auch nicht) und kann so keine Standart BIOS-Ints mehr im Protected Mode nutzen. Also lege ich mir selbst einen an. Nun trage ich da ein das beim Tastendruck die Funktion IRQ_1 ausgeführt wird (IRQ 1 ist der Keyboard-Int ^^)

    Mein Treiber ist zwar nicht alzu besonders, aber hier ist mal ne Version:

    Code:
    void irq_1(void) // Keyboard
    { 
      int key = 0;
      int i = 0;
      out(0x20,0x20);
      out(0xA0,0x20);
      key = in(0x60);
      
      if (key == 0x10) // Taste q
        i=1;
    
      if (key == 0x39)
        i=27; // Leertaste
      if (key == 0x3A)
        i=28; // Groß-Schreib
      if (key == 0x2A)
        i=29; // Klein-Schreib links
      if (key == 0x0E)
        i=30; // Backspace
      
      keycode = i;
    };
    
    int getkeycode()
    {
      return keycode;
      keycode = 0;
    };
    Das anlegen des IDT ist hier etwas komplizierter. Wenn dich das interressiert, dann kannst du ja mal den Code von mir ansehen. Zum kompilen brauchst du djgpp (nicht die System-Varis vergessen) und nasm (beides kostenlos). Auserdem rawwrite ums auf eine Diskette zu schreiben und evt. Bochs ums zu Emulieren. Allerdings funktioniert das Teil noch nicht besonders auf manchen PC's (z.B. i686er Architekturen)
    warum weiß ich nicht, wird sich noch ändern -.-!

    Wem das zuviel ist kanns ja unter Linux kompilen. GCC ist unter Linux schon bald standart. Nasm (zumindest bei Fedora nicht, aber man kannst ja downloaden).

    Unter Linux müsst ihr euch halt die Befehle aus der Compile.bat ziehen und dann in ne Make schreiben.



    Allerding muss ich sagen es liegt nicht am "Treiber". Wenn amn statt den

    case x: console[pos] = 'x'; break;

    ein case x: printf("x"); break;

    einfügt klappt es.

    Edit 3:
    Mhm... wenn ich statt dem \0 bei der Schleife einfach nur 0 eingebe und dann hallo eingebe bekomme ich das angezeigt:

    00h0a0l0l0o0000[...]00 4xwirres Zeichen(verschiedene)

    Edit4 *seuftz*:

    Jetzt läuft es

    Code:
      char console[80];
      int pos = 0;
      int last;
      int now;
      int i = 0;
      while (i < 80)
      {
        console[i] = '\0';
        i++;
      }
      pos=-1;
      while (1==1)
      {
        now = getkeycode();
        if (now != last)
        {
          switch (now)
          {
            case 1:  pos++; console[pos] = 'q'; break;
            case 2:  pos++; console[pos] = 'w'; break;
            case 3:  pos++; console[pos] = 'e'; break;
            case 4:  pos++; console[pos] = 'r'; break;
            case 5:  pos++; console[pos] = 't'; break;
            case 6:  pos++; console[pos] = 'y'; break;
            case 7:  pos++; console[pos] = 'u'; break;
            case 8:  pos++; console[pos] = 'i'; break;
            case 9:  pos++; console[pos] = 'o'; break;
            case 10: pos++; console[pos] = 'p'; break;
            case 11: pos++; console[pos] = 'a'; break;
            case 12: pos++; console[pos] = 's'; break;
            case 13: pos++; console[pos] = 'd'; break;
            case 14: pos++; console[pos] = 'f'; break;
            case 15: pos++; console[pos] = 'g'; break;
            case 16: pos++; console[pos] = 'h'; break;
            case 17: pos++; console[pos] = 'j'; break;
            case 18: pos++; console[pos] = 'k'; break;
            case 19: pos++; console[pos] = 'l'; break;
            case 20: pos++; console[pos] = 'z'; break;
            case 21: pos++; console[pos] = 'x'; break;
            case 22: pos++; console[pos] = 'c'; break;
            case 23: pos++; console[pos] = 'v'; break;
            case 24: pos++; console[pos] = 'b'; break;
            case 25: pos++; console[pos] = 'n'; break;
            case 26: pos++; console[pos] = 'm'; break;
            case 27: pos++;console[pos] = ' '; break;
          };
          last = now;
        }
        
        printf(console);
        printf("\r");
      	asm volatile ("nop");
      };
    };
    Der Fehler war 1. Das das 1. Zeichen ein \0 war und deshalb nix ausgegeben wurde. Das mit dem h0a ist so zu erklären. Wenn kein Zeichen kommt wird pos +1 gemacht, aber in Console wird nix geändert. Das heißt in Console steht dann
    h\0a was natürlich keine Ausgabe erzeugt

    Edit x [sind schon zu viele...]:

    Hab das ganze nun mal in ner billig-Konsole umgesetzt:
    [Bild]

    Neuster Source-Code:
    [HIER]

    Die Codes sind so benannt:

    [Tag]-[Monat]-[Jahr]-[Stunde]-[Minute].rar

    also neustes ist im Moment:
    19-04-05-18-03.rar

    Geändert von Crash-Override (19.04.2005 um 17:07 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •