Deutsches Tastaturlayout


  • Mod

    AltGr wurde nun auch implementiert.

    keyboard_GER.h

    static unsigned char asciiAltGr[] = {
    0, 0, 0, 0xB2, 0xB3, 0, 0, 0, 0x7B, 0x5B, 0x5D, 0x7D, 0x5C, 0, 0, /*   ²³  {[]}\   */
    0, 0x40, 0, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0x7E, 0, 0,             /*   @ €      ~  */
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0xB5, 0, 0, 0, 0, 0, 0, 0, 0,                   /*         µ     */
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7C, 0, 0 };        /*   |           */
    

    keyboard.c

    uint8_t FetchAndAnalyzeScancode()
    {
    	if( inportb(0x64)&1 )
    	    curScan = inportb(0x60);   // 0x60: get scan code from the keyboard
    
        // ACK: toggle bit 7 at port 0x61
        uint8_t port_value = inportb(0x61);
        outportb(0x61,port_value |  0x80); // 0->1
        outportb(0x61,port_value &~ 0x80); // 1->0
    
    	if( curScan & 0x80 ) // Key released? Check bit 7 (10000000b = 0x80) of scan code for this
    	{
            KeyPressed = 0;
            curScan &= 0x7F; // Key was released, compare only low seven bits: 01111111b = 0x7F
            if( curScan == KRLEFT_SHIFT || curScan == KRRIGHT_SHIFT ) // A key was released, shift key up?
            {
                ShiftKeyDown = 0;	// yes, it is up --> NonShift
            }
            if( (curScan == 0x38) && (prevScan == 0x60) )
    		{
                AltGrKeyDown = 0;
    		}
    	}
    	else // Key was pressed
    	{
    	    KeyPressed = 1;
    		if( curScan == KRLEFT_SHIFT || curScan == KRRIGHT_SHIFT )
    		{
    		    ShiftKeyDown = 1; // It is down, use asciiShift characters
    		}
    		if( (curScan == 0x38) && (prevScan == 0x60) )
    		{
                AltGrKeyDown = 1;
    		}
    	}
    	prevScan = curScan;
    	return curScan;
    }
    
    uint8_t ScanToASCII()
    {
    	uint8_t retchar = 0;                  // The character that returns the scan code to ASCII code
    	curScan = FetchAndAnalyzeScancode();  // Grab scancode, and get the position of the shift key
    
        /// TEST
        //  printformat(" scan:%d ",scan);
        /// TEST
    
        if( ShiftKeyDown )
    	{
    	    if( AltGrKeyDown)
            {
                /* no reaction */
            }
            else
            {
                retchar = asciiShift[curScan];
            }
    	}
    	else
    	{
    	    if( AltGrKeyDown)
            {
                #ifdef KEYMAP_GER
                retchar = asciiAltGr[curScan];
                #endif
    
                #ifdef KEYMAP_US
                /// not yet implemented
                #endif
            }
            else
            {
    		    retchar = asciiNonShift[curScan]; // (Lower) Non-Shift Codes
            }
    	}
    
        //filter Shift Key and Key Release
    	if( ( !(curScan == KRLEFT_SHIFT || curScan == KRRIGHT_SHIFT) ) && ( KeyPressed == 1 ) )
    	{
    	    /// TEST
    	    //  printformat("ascii:%x ", retchar);
    	    /// TEST
    
    	    return retchar; // ASCII version
    	}
    	else
    	{
    	    return 0;
    	}
    }
    

    Die hochgestellte 3 geht nicht in codepage437. Für das Euro-Zeichen wurde einfach das griechische Epsilon verwendet. Alles andere funktioniert bei der deutschen Tastatur nun problemlos. Die AltGr bei der US-Tastatur ist noch nicht eingebaut.

    Der Transfer von ASCII nach codepage437 wurde nun erweitert:

    video.c

    static uint8_t transferFromAsciiToCodepage437(uint8_t ascii)
    {
        uint8_t c;
    
        if      ( ascii == 0xE4 ) c = 0x84; // ä
        else if ( ascii == 0xF6 ) c = 0x94; // ö
        else if ( ascii == 0xFC ) c = 0x81; // ü
        else if ( ascii == 0xDF ) c = 0xE1; // ß
        else if ( ascii == 0xA7 ) c = 0x15; // §
        else if ( ascii == 0xB0 ) c = 0xF8; // °
        else if ( ascii == 0xC4 ) c = 0x8E; // Ä
        else if ( ascii == 0xD6 ) c = 0x99; // Ö
        else if ( ascii == 0xDC ) c = 0x9A; // Ü
    
        else if ( ascii == 0xB2 ) c = 0xFD; // ²
        else if ( ascii == 0xB3 ) c = 0x00; // ³ <-- not available
        else if ( ascii == 0x80 ) c = 0xEE; // € <-- Greek epsilon used
        else if ( ascii == 0xB5 ) c = 0xE6; // µ
    
        else    { c = ascii;  } // to be checked for more deviations
    
        return c;
    }
    

    Neueste Version wurde ins SVN überspielt: http://prettyos.svn.sourceforge.net/viewvc/prettyos.tar.gz?view=tar


  • Mod

    Man könnte noch ein paar geheime AltGr als PrettyOS Feature unterbringen. Ideen? 💡
    Die Kombination Shift+AltGr ist auch noch völlig ungenutzt. 🕶

    Das ist darstellbar (Codepage 437): http://lowlevel.brainsware.org/wiki/index.php/Codepage_437 🙂


  • Mod

    In der Emulation mit qemu auf MS Windows funktioniert die AltGr-Taste übrigens nicht, daher bitte in "echt" oder mit qemu auf Linux testen.


  • Mod

    Weiterführende Links zum Thema Keyboard:
    http://www.brokenthorn.com/Resources/OSDev19.html (Operating Systems Development - Keyboard)
    http://wiki.osdev.org/PS2_Keyboard (PS2 Keyboard)
    http://wiki.osdev.org/PS2_Keyboard#Protected_Mode_Keyboard_Driver (PM Keyboard Driver)



  • Wie wär's denn, das Format auf Unicode umzustellen? Irgendwas mit fixer Breite, UCS-2 oder so. Dann fiele die Limitierung auf den Zeichensatz weg und man könnte per "Alt + Ziffern" beliebige Zeichen eingeben.
    Plus, dass nur jeweils das Scancode-Mapping angepasst werden muss und nicht zusätzlich die Codepage geändert werden muss (z.B. beim japanischen PrettyOS) 🙂



  • Im Textmodus kannst du maximal 256 verschiedene Zeichen darstellen. Außerdem ist korrekter Unicode-Support sicherlich ein Projekt für sich (falls jetzt jemand mit Grafikmodus kommt).


  • Mod

    Außerdem ist korrekter Unicode-Support sicherlich ein Projekt für sich (falls jetzt jemand mit Grafikmodus kommt).

    Der aktuelle Tastaturtreiber unter Nutzung der Codepage 437 ist schon ziemlich brauchbar, fehlt aber noch ein Array für Strg + Taste.


  • Mod

    Gibt es die Möglichkeit, im BIOS beim Starten eine andere Codepage als 437 einzuschalten? Beispielsweise 850 oder 852?

    Das gesamte Thema "Tastaturtreiber und Zeichendarstellung" ist nirgends umfassend mit Blick auf OSDEV praktisch beschrieben, soweit ich das sehe.



  • Wie gesagt, ihr müsstet eben einen eigenen Zeichensatz laden. Wie genau das geht, weiß ich nicht, weil mir C437 immer gereicht hat. 😉



  • Stich ins Wespennest: INT 10h, AX = 1100h oder 1110h (Beispiel, einfach nur "DOS" ignorieren). 🙂


  • Mod

    Stich ins Wespennest: INT 10h, AX = 1100h oder 1110h (Beispiel, einfach nur "DOS" ignorieren). 🙂

    Was bewirken diese Instruktionen genau? Kann man dort eine Codepage umsetzen? Wir verwenden ja bereits:
    VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x8 DBL-DOT PATTERNS (PS,EGA,VGA)

    ;;;;; set 80x50 text mode and 8x8 font 	
    mov ax, 0x1112 	
    xor bl, bl 	
    int 0x10
    


  • Nein, diese Funktionen laden eine neue Schriftart. Das BIOS hat nur Schriftarten für Codepage 437. Eure eigenen Schriftarten können natürlich eine beliebige Kodierung haben.


Anmelden zum Antworten