Change selection logic another time

Automatic selection was to unflexible.

Updated documentation

Updated language files to new logic and documentation.

Updated bdf2u8g.exe
This commit is contained in:
AnHardt
2015-03-13 14:26:58 +01:00
parent 5bafb1fe1f
commit 96f8d20f2f
24 changed files with 194 additions and 117 deletions

View File

@ -567,10 +567,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Define your display language below. Replace (en) with your language code and uncomment.
// en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, kanji, test
// See also language.h
//#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en)
#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en)
// Chose ONE of the next three charsets. This has to match your hardware. In case of a full graphic display chose that one best fitting to your language.
// to find out what type you have - compile with language_test.h - upload - click to get the menu. You'll see two typical lines from the upper half of the charset.
// Chose ONE of the next three charsets. This has to match your hardware. In case of a full graphic display this information is not important.
// To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset.
// Se also documentation/LCDLanguageFont.md
#define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware
//#define DISPLAY_CHARSET_HD44780_WESTERN
//#define DISPLAY_CHARSET_HD44780_CYRILIC

View File

@ -35,10 +35,10 @@
#include "ultralcd.h"
#include "ultralcd_st7920_u8glib_rrd.h"
#include "configuration.h"
#include "utf_mapper.h"
#include <utility/u8g.h>
#include "dogm_font_data_6x9_marlin.h" // Height of 'A' is only 5 pixel.
#include "dogm_font_data_6x9_marlin.h" // Height of 'A' is only 6 pixel.
#include "dogm_font_data_Marlin_symbols.h" // The Marlin special symbols
#define FONT_STATUSMENU_NAME u8g_font_6x9 // we don't have a small font for Cyrillic, Kana or Kanji
@ -50,38 +50,38 @@
#define USE_BIG_EDIT_FONT
#endif
#if defined( MAPPER_C2C3 )
#include <utility/u8g.h> // System font. This is ISO10646-1
#define FONT_MENU_NAME u8g_font_6x10
#elif defined( MAPPER_D0D1 )
#include "dogm_font_data_ISO10646_5_Cyrillic.h"
#define FONT_MENU_NAME ISO10646_5_Cyrillic_5x7
#elif defined( MAPPER_E382E383 )
#include "dogm_font_data_ISO10646_Kana.h"
#define FONT_MENU_NAME ISO10646_Kana_5x7
#elif defined( DISPLAY_CHARSET_KANJI ) && defined( MAPPER_NON )
#include "dogm_font_data_6x10_marlin_Kanji.h"
#define FONT_MENU_NAME u8g_font_6x10_marlin
#elif defined( DISPLAY_CHARSET_HD44780_JAPAN )
#include "dogm_font_data_HD44780_J.h"
#define FONT_MENU_NAME HD44780_J_5x7
#elif defined( DISPLAY_CHARSET_HD44780_WESTERN )
#include "dogm_font_data_HD44780_W.h"
#define FONT_MENU_NAME HD44780_W_5x7
#elif defined( DISPLAY_CHARSET_HD44780_CYRILIC )
#include "dogm_font_data_HD44780_C.h"
#define FONT_MENU_NAME HD44780_C_5x7
#else // #if defined( MAPPER_C2C3 ) // fall-back
#include <utility/u8g.h> // system font
#define FONT_MENU_NAME u8g_font_6x10
#endif
#ifndef SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_ISO10646_1 )
#include <utility/u8g.h> // System font.
#define FONT_MENU_NAME u8g_font_6x10
#elif defined( DISPLAY_CHARSET_ISO10646_5 )
#include "dogm_font_data_ISO10646_5_Cyrillic.h"
#define FONT_MENU_NAME ISO10646_5_Cyrillic_5x7
#elif defined( DISPLAY_CHARSET_ISO10646_KANA )
#include "dogm_font_data_ISO10646_Kana.h"
#define FONT_MENU_NAME ISO10646_Kana_5x7
#elif defined( DISPLAY_CHARSET_KANJI )
#include "dogm_font_data_6x10_marlin_Kanji.h"
#define FONT_MENU_NAME u8g_font_6x10_marlin
#else // fall-back
#include <utility/u8g.h> // system font
#define FONT_MENU_NAME u8g_font_6x10
#endif
#else // SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_HD44780_JAPAN )
#include "dogm_font_data_HD44780_J.h"
#define FONT_MENU_NAME HD44780_J_5x7
#elif defined( DISPLAY_CHARSET_HD44780_WESTERN )
#include "dogm_font_data_HD44780_W.h"
#define FONT_MENU_NAME HD44780_W_5x7
#elif defined( DISPLAY_CHARSET_HD44780_CYRILIC )
#include "dogm_font_data_HD44780_C.h"
#define FONT_MENU_NAME HD44780_C_5x7
#else // fall-back
#include <utility/u8g.h> // system font
#define FONT_MENU_NAME u8g_font_6x10
#endif
#endif // SIMULATE_ROMFONT
#define FONT_STATUSMENU 1
#define FONT_SPECIAL 2
@ -138,6 +138,8 @@ U8GLIB_NHD_C12864 u8g(DOGLCD_CS, DOGLCD_A0);
U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0
#endif
#include "utf_mapper.h"
char currentfont = 0;
static void lcd_setFont(char font_nr) {

View File

@ -11,6 +11,7 @@
//
// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h"
// ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS
// Se also documentation/LCDLanguageFont.md
// Languages
// en English
@ -201,6 +202,11 @@
#define MSG_MAXTEMP_BED_OFF "Heated bed" MSG_SWITCHED_OFF_MAX
// LCD Menu Messages
#if !(defined( DISPLAY_CHARSET_HD44780_JAPAN ) || defined( DISPLAY_CHARSET_HD44780_WESTERN ) || defined( DISPLAY_CHARSET_HD44780_CYRILIC ))
#define DISPLAY_CHARSET_HD44780_JAPAN
#endif
#include LANGUAGE_INCLUDE
#include "language_en.h"

View File

@ -2,13 +2,16 @@
* Aragonese
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_AN_H
#define LANGUAGE_AN_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " parada."
#define MSG_SD_INSERTED "Tarcheta colocada"

View File

@ -2,7 +2,7 @@
* Catalan
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_CA_H
@ -10,6 +10,9 @@
//#define MAPPER_NON
#define MAPPER_C2C3 // because of "ó"
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " preparada."
#define MSG_SD_INSERTED "SD detectada."

View File

@ -2,13 +2,16 @@
* German
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_DE_H
#define LANGUAGE_DE_H
#define MAPPER_C2C3
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " Bereit."
#define MSG_SD_INSERTED "SDKarte erkannt."

View File

@ -2,16 +2,22 @@
* English
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_EN_H
#define LANGUAGE_EN_H
#if !(defined(MAPPER_NON) || defined(MAPPER_C2C3) || defined(MAPPER_D0D1_MOD) || defined(MAPPER_E382E383))
#if !( defined(MAPPER_NON)|| defined(MAPPER_C2C3)|| defined(MAPPER_D0D1)|| defined(MAPPER_D0D1_MOD)|| defined(MAPPER_E382E383) )
#define MAPPER_NON // For direct asci codes
#endif
//#define SIMULATE_ROMFONT //Comment in to see what is seen on the character based displays
#if !( defined(SIMULATE_ROMFONT)|| defined(DISPLAY_CHARSET_ISO10646_1)|| defined(DISPLAY_CHARSET_ISO10646_5)|| defined(DISPLAY_CHARSET_ISO10646_KANA)|| defined(DISPLAY_CHARSET_KANJI) )
#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
#endif
#ifndef WELCOME_MSG
#define WELCOME_MSG MACHINE_NAME " ready."
#endif

View File

@ -2,13 +2,16 @@
* Spanish
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_ES_H
#define LANGUAGE_ES_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " lista."
#define MSG_SD_INSERTED "Tarjeta colocada"

View File

@ -2,13 +2,16 @@
* Basque-Euskera
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_EU_H
#define LANGUAGE_EU_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " prest."
#define MSG_SD_INSERTED "Txartela sartuta"

View File

@ -2,13 +2,16 @@
* Finnish
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_FI_H
#define LANGUAGE_FI_H
#define MAPPER_C2C3
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " valmis."
#define MSG_SD_INSERTED "Kortti asetettu"

View File

@ -2,13 +2,17 @@
* French
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_FR_H
#define LANGUAGE_FR_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " prete."
#define MSG_SD_INSERTED "Carte inseree"

View File

@ -2,13 +2,16 @@
* Italian
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_IT_H
#define LANGUAGE_IT_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "SD Card inserita"

View File

@ -2,7 +2,7 @@
* Japanese (Kana)
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
@ -10,6 +10,9 @@
#define LANGUAGE_KANA_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_KANA
// 片仮名表示定義
#define WELCOME_MSG MACHINE_NAME " ready."

View File

@ -2,7 +2,7 @@
* Japanese (Kana UTF8 version)
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
@ -10,6 +10,9 @@
#define LANGUAGE_KANA_UTF_H
#define MAPPER_E382E383
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_KANA
// This is very crude replacement of the codes used in language_kana.h from somebody who really does not know what he is doing.
// Just to show the potential benefit of unicode.

View File

@ -2,7 +2,7 @@
* Japanese (Kanji)
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#include "Configuration.h"

View File

@ -2,13 +2,16 @@
* Dutch
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_NL_H
#define LANGUAGE_NL_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " gereed."
#define MSG_SD_INSERTED "Kaart ingestoken"

View File

@ -2,13 +2,16 @@
* Polish
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_PL_H
#define LANGUAGE_PL_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " gotowy."
#define MSG_SD_INSERTED "Karta wlozona"

View File

@ -2,13 +2,16 @@
* Portuguese (Brazil)
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_PT_BR_H
#define LANGUAGE_PT_BR_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "Cartao inserido"

View File

@ -2,13 +2,16 @@
* Portuguese
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_PT_H
#define LANGUAGE_PT_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "Cartao inserido"

View File

@ -2,13 +2,16 @@
* Russian
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_RU_H
#define LANGUAGE_RU_H
#define MAPPER_D0D1 // For Cyrillic
#define MAPPER_D0D1 // For Cyrillic
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_5
#define WELCOME_MSG MACHINE_NAME " Готов."
#define MSG_SD_INSERTED "Карта вставлена"

View File

@ -2,7 +2,7 @@
* TEST
*
* LCD Menu Messages
* Please note these are limited to 17 characters!
* Se also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_TEST_H
@ -10,12 +10,12 @@
// Select ONE of the following Mappers.
// They decide what to do with a symbol in the area of [0x80:0xFF]. They take a symbol of this language file and make them point
// into an array with 128 cells, where they find the place of the symbol in the font in use.
// into an array with 128 cells, where they'll find the place of the symbol of the font in use.
//
// a.)For ASCII coded Language_xx.h files like (en) there are no occurrences of symbols above 0x7F so no mapper is needed.
// If such a symbol appers it is mapped directly into the font. This is the case for the language files we used until now, with all the STR_XX or
// If such a symbol appears it is mapped directly into the font. This is the case for the language files we used until now, with all the STR_XX or
// "\xxx" symbols. All Symbols are only one byte long.
// b.) For Unicoded Language_xx.h files (currently ru and de) the non ASCII [0x00-0x7F] symbols are represented by more then one byte.
// b.) For Unicoded Language_xx.h files (currently ru, de and kana_utf8 ) the non ASCII [0x00-0x7F] symbols are represented by more then one byte.
// In the case of two bytes the first is pointing to a 'codepage' and the second to a place in the codepage. These codepages contain 64 symbols.
// So two of them can be mapped. For most of the European languages the necessary symbols are contained in the pages C2 and C3. Cyrillic uses D0
// and D1.
@ -25,14 +25,22 @@
// impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system).
// d.) So for Kanji we use a very special and selected subset of symbols and the direct mapping like in a).
#define MAPPER_NON // For direct asci codes ( until now all languages except ru, de, ... )
#define MAPPER_NON // For direct asci codes ( until now all languages except ru, de, fi, kana_utf8, ... )
//#define MAPPER_C2C3 // For most European languages when language file is in utf8
//#define MAPPER_D0D1 // For Cyrillic
////#define MAPPER_D0D1_MOD // For Cyrillic on HD44780_CYRILIC (will save 32 byte in the mapper but adds some more decisions)
//#define MAPPER_E382E383 // For Katakana
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
// next 4 lines select variants in this file only
// Select the better font for full graphic displays.
//#define DISPLAY_CHARSET_ISO10646_1
//#define DISPLAY_CHARSET_ISO10646_5
//#define DISPLAY_CHARSET_ISO10646_KANA
//#define DISPLAY_CHARSET_KANJI
// next 5 lines select variants in this file only
#define DISPLAYTEST
//#define WEST
//#define CYRIL
@ -96,8 +104,8 @@
#define WELCOME_MSG "Language TEST"
#define MSG_WATCH "Display test"
#define MSG_PREPARE STRG_OKTAL_c
#define MSG_CONTROL STRG_OKTAL_d
#define MSG_PREPARE STRG_OKTAL_b
#define MSG_CONTROL STRG_OKTAL_c
#endif
#ifdef WEST

Binary file not shown.

View File

@ -9,14 +9,18 @@
#define HARDWAERE_CHAR_OUT lcd.write
#endif
#if !(defined( DISPLAY_CHARSET_HD44780_JAPAN ) || defined( DISPLAY_CHARSET_HD44780_WESTERN ) || defined( DISPLAY_CHARSET_HD44780_CYRILIC ))
#define DISPLAY_CHARSET_HD44780_JAPAN
#endif
#ifndef DOGLCD
#ifdef DISPLAY_CHARSET_KANJI
#error("Kanji does not work on character based displays!");
#elif defined( DISPLAY_CHARSET_HD44780_JAPAN )
#ifndef SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_ISO10646_1 ) && defined( DOGLCD )
#define MAPPER_ONE_TO_ONE
#elif defined( DISPLAY_CHARSET_ISO10646_5 ) && defined( DOGLCD )
#define MAPPER_ONE_TO_ONE
#elif defined( DISPLAY_CHARSET_ISO10646_KANA ) && defined( DOGLCD )
#define MAPPER_ONE_TO_ONE
#elif defined( DISPLAY_CHARSET_KANJI ) && defined( DOGLCD )
#define MAPPER_NON
#endif
#else // SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_HD44780_JAPAN )
#if defined( MAPPER_C2C3 )
const PROGMEM uint8_t utf_recode[] =
{ // 0 1 2 3 4 5 6 7 8 9 a b c d e f This is fair for symbols
@ -27,11 +31,11 @@
0x3f,0x3f,0x3f,0x3f,0xe1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, // c38
// ä
0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xef,0x78,0x3f,0x3f,0x3f,0x3f,0xf5,0x3f,0x3f,0xe2, // c39 missing characters display as '?'
// ö x ü ä
// ö x ü ß
0x3f,0x3f,0x3f,0x3f,0xe1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, // c3a
// ä
0x3f,0xee,0x3f,0x3f,0x3f,0x3f,0xef,0xed,0x3f,0x3f,0x3f,0x3f,0xf5,0x3f,0x3f,0x3f // c3b
// n ö ü
0x3f,0xee,0x3f,0x3f,0x3f,0x3f,0xef,0xfd,0x3f,0x3f,0x3f,0x3f,0xf5,0x3f,0x3f,0x3f // c3b
// n ö ÷ ü
};
#elif defined( MAPPER_E382E383 )
const PROGMEM uint8_t utf_recode[] =
@ -115,14 +119,8 @@
#elif defined( MAPPER_E382E383 )
#error( "Katakana on a cyrillic display makes no sense. There are no matching symbols." );
#endif
#endif
#else //DOGLCD
#if defined( DISPLAY_CHARSET_KANJI )
#define MAPPER_NON
#else
#define MAPPER_ONE_TO_ONE
#endif
#endif //DOGLCD
#endif // DISPLAY_CHARSET_HD44780_CYRILIC
#endif // SIMULATE_ROMFONT
#if defined( MAPPER_NON )
char charset_mapper(char c){
@ -193,20 +191,18 @@
uint8_t utf_hi_char; // UTF-8 high part
bool seen_d5 = false;
char charset_mapper(char c){
// it is a Russian alphabet translation
// except 0401 --> 0xa2 = Ё, 0451 --> 0xb5 = ё
uint8_t d = c;
if ( d >= 0x80 ) { // UTF-8 handling
if ((d >= 0xd0) && (!seen_d5)) {
utf_hi_char = d - 0xd0;
if ( d >= 0x80u ) { // UTF-8 handling
if ((d >= 0xd0u) && (!seen_d5)) {
utf_hi_char = d - 0xd0u;
seen_d5 = true;
return 0;
} else if (seen_d5) {
d &= 0x3f;
d &= 0x3fu;
#ifndef MAPPER_ONE_TO_ONE
HARDWAERE_CHAR_OUT( (char) pgm_read_byte_near( utf_recode + d + ( utf_hi_char << 6 ) - 0x20) );
#else
HARDWAERE_CHAR_OUT( (char) (0x80 + ( utf_hi_char << 6 ) + d) ) ;
HARDWAERE_CHAR_OUT( (char) (0xa0u + ( utf_hi_char << 6 ) + d) ) ;
#endif
} else {
HARDWAERE_CHAR_OUT('?');