/* ------------------------------------------------------------- utf8textmode.c Funktionen aus https://www.mikrocontroller.net/topic/586049#8070539 von Ralph S. / jjflash extrahiert von Horst Schlindwein ------------------------------------------------------------- */ #include #include #include #include #include // UTF-8-Darstellung von Zeichen 128..255 der DOS-Codepage 437 #include "cp850.lookup" // ------------------------------------------------------------------------------------ // Prototypen und extern Variable // ------------------------------------------------------------------------------------ // Variable extern uint8_t textattr; extern const uint8_t ega_colors[8]; extern const uint8_t UTF_chars[384]; // Farben und Cursorposition void settextattr(uint8_t attr); void settextcolor(uint8_t col); void setbkcolor(uint8_t col);; void gotoxy(uint8_t x, uint8_t y); void clrscr(void); // UTF-8 Zeichen void utfputchar(uint8_t ch); void uprintf(const char *fmt, ...); // ganz ganz "boeser Hack": originales printf wird "abgeschaltet" und durch // das uprintf von hier ersetzt !!! #define printf uprintf // ------------------------------------------------------------------------------------ // Farben // ------------------------------------------------------------------------------------ // Farbreihenfolge der EGA-Standardfarben enum { black, blue, green, cyan, red, magenta, brown, grey, darkgrey, lightblue, lightgreen, lightcyan, lightred, lightmagenta, yellow, white }; // Array mit der Zuordnung der EGA-Farben zu den Codes der ESC-Sequenzen const uint8_t ega_colors[8] = { // sw bl gn cy rt mg br gr 30, 34, 32, 36, 31, 35, 33, 37 }; uint8_t textattr = 0x07; // -------------------------------------------------- // settextattr // // setzt die Text UND die Hintergrundfarbe mit der // in ATTR angegebenen Farbe. Die hoeherwertigen // 4 Bits bestimmen die Hintergrundfarbe, die // niederen 4 Bits die Vordergrundfarbe. // -------------------------------------------------- void settextattr(uint8_t attr) { uint8_t bk, vg; uint8_t bright = 0; uint8_t fg_code, bg_code; textattr = attr; vg = attr & 0x0F; // Textfarbe bk = (attr >> 4) & 0x0F; // Hintergrundfarbe if (vg > 7) { bright = 1; vg &= 7; } fg_code = ega_colors[vg]; bg_code = ega_colors[bk & 7] + 10; if (bk > 7) { bg_code += 0x3c; // 0x3c .. 0x43 => intensive Hintergrundfarben } printf("\033[%d;%d;%dm", bright, fg_code, bg_code); } // -------------------------------------------------- // gotoxy // // positioniert den Textcursor an die mit x/y // angegebene Textkoordinate. // -------------------------------------------------- void gotoxy(uint8_t x, uint8_t y) { printf("\033[%d;%dH",y,x); } // -------------------------------------------------- // settextcolor // Setzt die Textvordergrundfarbe mit der // in angegebenen Textfarbe (EGA - // kompatibel) // -------------------------------------------------- void settextcolor(uint8_t col) { settextattr( (textattr & 0xf0) | col); } // -------------------------------------------------- // setbkcolor // Setzt die Texthintergrundfarbe mit der // in angegebenen Textfarbe (EGA - // kompatibel) // -------------------------------------------------- void setbkcolor(uint8_t col) { settextattr( (textattr & 0x0f) | (col << 4) ); } // -------------------------------------------------- // clrscr // // loescht den Bildschrim mit der mit // angegebenen Farbe // -------------------------------------------------- void clrscr(void) { printf("\033[2J\033[H"); gotoxy(1,1); } // Ende Farben // ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------ // UTF-8 // ------------------------------------------------------------------------------------ // -------------------------------------------------------- // utfputchar // // gibt ein durch einen Index > 127 (Pseudo-Ascii) // addressiertes UTF-8 Zeichen aus // -------------------------------------------------------- void utfputchar(uint8_t ch) { int i; if (ch< 128) { putchar(ch); } else { i= (ch-128) * 3; putchar(UTF_chars[i]); if ((UTF_chars[i] & 0xE0) == 0xC0) { putchar(UTF_chars[i+1]); } else if ((UTF_chars[i] & 0xF0) == 0xE0) { putchar(UTF_chars[i+1]); putchar(UTF_chars[i+2]); } } } /* -------------------------------------------------------- uprintf printf-Version, die die Ausgabe einer Codepage 437 mittels UTF-8 emuliert und somit die Ausgabe eines einzelnen Asciicodezeichens 128..255 ermoeglicht. Usage: // 248 ist Zeichen fuer hochgestelltes o = Celcius temp= 22.8; uprintf("Die Temperatur ist: %.2f %cC",temp, 248); -------------------------------------------------------- */ void uprintf(const char *fmt, ...) { char txtbuf[2000]; char *s; va_list args; va_start(args, fmt); vsnprintf(txtbuf, sizeof(txtbuf), fmt, args); va_end(args); s= &txtbuf[0]; while (*s) { utfputchar(*s); s++; } } // Ende UTF8 // ------------------------------------------------------------------------------------ /* -------------------------------------------------------- utf8_asciitable Demo: zeigt die Zeichen der Codepage 437 ueber UTF-8 an -------------------------------------------------------- */ void utf8_asciitable(void) { int i; uint8_t asciirow = 0; const uint8_t charperrow = 12; settextattr(0x07); clrscr(); printf("\n\r"); settextattr(0x1e); printf(" ------------------------------------------------------------------------ \n\r"); printf(" Ascii-Zeichen der Codepage 437 mittels UTF8 angezeigt \n\r"); printf(" ------------------------------------------------------------------------ "); settextattr(0x07); gotoxy(3,7); for (i= 32; i< 256; i++) { if (i< 100) utfputchar(' '); printf("%d: ",i); utfputchar(i); printf(" "); asciirow++; if (asciirow== charperrow) { printf("\n\r "); asciirow= 0; } } printf("\n\n\r"); }